diff --git a/api/v1/api.go b/api/v1/api.go index 3dc031f26f6b1ab38b5743fb4f74532ad65df914..6777d019eb0258511a7d24401cc25a486f0ff19d 100644 --- a/api/v1/api.go +++ b/api/v1/api.go @@ -88,15 +88,6 @@ func InstallHTTPHandler(r *gin.RouterGroup, st *store.Store, im *importer.Import imports.GET("", api.ListImportsOfShow) } - playlists := r.Group("playlists") - { - playlists.GET("", api.ListPlaylists) - playlists.POST("", api.CreatePlaylistForShow) - playlists.GET(":playlist-id", api.ReadPlaylist) - playlists.PUT(":playlist-id", api.UpdatePlaylistOfShow) - playlists.DELETE(":playlist-id", api.DeletePlaylistOfShow) - } - files := r.Group("files") { files.GET("", api.ListFilesOfShow) diff --git a/api/v1/playlists.go b/api/v1/playlists.go deleted file mode 100644 index d1b8937fc1d4ea6a1edec582241430033d0724d0..0000000000000000000000000000000000000000 --- a/api/v1/playlists.go +++ /dev/null @@ -1,247 +0,0 @@ -// -// tank, Import and Playlist Daemon for Aura project -// Copyright (C) 2017-2020 Christian Pointner <equinox@helsinki.at> -// -// This program is free software: you can redistribute it and/or modify -// it under the terms of the GNU Affero General Public License as -// published by the Free Software Foundation, either version 3 of the -// License, or (at your option) any later version. -// -// This program is distributed in the hope that it will be useful, -// but WITHOUT ANY WARRANTY; without even the implied warranty of -// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the -// GNU Affero General Public License for more details. -// -// You should have received a copy of the GNU Affero General Public License -// along with this program. If not, see <https://www.gnu.org/licenses/>. -// - -package v1 - -import ( - "encoding/json" - "github.com/gin-gonic/gin" - "gitlab.servus.at/autoradio/tank/store" - "net/http" -) - -// CreatePlaylistForShow creates a new playlist. -// -// @Summary Create playlist -// @Description Creates a new playlist for the show. -// @Accept json -// @Produce json -// @Param playlist body store.Playlist true "Playlist data" -// @Success 201 {object} store.Playlist -// @Failure 400 {object} ErrorResponse -// @Failure 403 {object} ErrorResponse -// @Failure 500 {object} ErrorResponse -// @Router /api/v1/playlists [post] -func (api *API) CreatePlaylistForShow(c *gin.Context) { - playlist := &store.Playlist{} - err := json.NewDecoder(c.Request.Body).Decode(playlist) - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "error decoding playlist: " + err.Error()}) - return - } - - if authorized, _ := authorizeRequestForShow(c, playlist.ShowID); !authorized { - return - } - - if playlist, err = api.store.CreatePlaylist(playlist.ShowID, *playlist); err != nil { - sendError(c, err) - return - } - c.JSON(http.StatusCreated, playlist) -} - -// UpdatePlaylistOfShow updates a playlist of a show. -// -// @Summary Update playlist -// @Description Updates a playlist of a show. -// @Accept json -// @Produce json -// @Param id path int true "ID of the playlist" -// @Param playlist body store.Playlist true "Playlist data" -// @Success 200 {object} store.Playlist -// @Failure 400 {object} ErrorResponse -// @Failure 403 {object} ErrorResponse -// @Failure 404 {object} ErrorResponse -// @Failure 500 {object} ErrorResponse -// @Router /api/v1/playlists/{id} [put] -func (api *API) UpdatePlaylistOfShow(c *gin.Context) { - playlistID, err := idFromString(c.Param("playlist-id")) - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "invalid playlist-id: " + err.Error()}) - return - } - - // with this we are actively subverting the checks performed in api.store.UpdatePlaylist - showID, err := api.store.GetPlaylistShowID(playlistID) - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "wrong playlist-id: " + err.Error()}) - return - } - - if authorized, _ := authorizeRequestForShow(c, showID); !authorized { - return - } - - playlist := &store.Playlist{} - if err := json.NewDecoder(c.Request.Body).Decode(playlist); err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "error decoding playlist: " + err.Error()}) - return - } - - if playlist, err = api.store.UpdatePlaylist(showID, playlistID, *playlist); err != nil { - sendError(c, err) - return - } - - c.JSON(http.StatusOK, playlist) -} - -// DeletePlaylistOfShow deletes a playlist of a show. -// -// @Summary Delete playlist -// @Description Deletes a playlist of a show. -// @Param id path int true "ID of the playlist" -// @Success 204 -// @Failure 400 {object} ErrorResponse -// @Failure 403 {object} ErrorResponse -// @Failure 404 {object} ErrorResponse -// @Failure 500 {object} ErrorResponse -// @Router /api/v1/playlists/{id} [delete] -func (api *API) DeletePlaylistOfShow(c *gin.Context) { - playlistID, err := idFromString(c.Param("playlist-id")) - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "invalid playlist-id: " + err.Error()}) - return - } - - // with this we are actively subverting the checks performed in api.store.DeletePlaylist - showID, err := api.store.GetPlaylistShowID(playlistID) - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "wrong playlist-id: " + err.Error()}) - return - } - - if authorized, _ := authorizeRequestForShow(c, showID); !authorized { - return - } - - if err = api.store.DeletePlaylist(showID, playlistID); err != nil { - sendError(c, err) - return - } - - c.JSON(http.StatusNoContent, nil) -} - -// global - -// ListPlaylists lists playlists. -// -// @Summary List playlists -// @Description Lists all playlists, the ones of a show or the ones that include a file -// @Produce json -// @Param showId query int false "ID of the show" -// @Param fileId query int false "ID of the file" -// @Param limit query int false "Limit number of results" -// @Param offset query int false "Start listing from offset" -// @Success 200 {object} PlaylistsListing -// @Failure 400 {object} ErrorResponse -// @Failure 403 {object} ErrorResponse -// @Failure 500 {object} ErrorResponse -// @Router /api/v1/playlists [get] -func (api *API) ListPlaylists(c *gin.Context) { - if authorized, _ := authorizeRequest(c, api); !authorized { - return - } - offset, limit, ok := getPaginationParameter(c) - if !ok { - return - } - - showID, _ := idFromString(c.Query("showId")) // we ignore error because showId is an optional query parameter - - if fileId := c.Query("fileId"); fileId != "" { - fileID, err := idFromString(fileId) - - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "invalid file-id: " + err.Error()}) - - return - } - - // filter the playlists that include the file - if fileID != 0 { - result := FileUsageListing{} - if result.Usage.Playlists, err = api.store.GetFileUsage(showID, fileID); err != nil { - sendError(c, err) - return - } - - c.JSON(http.StatusOK, result) - } - } - - if showID != 0 { - playlists, err := api.store.ListPlaylists(showID, offset, limit) - if err != nil { - sendError(c, err) - return - } - c.JSON(http.StatusOK, PlaylistsListing{playlists}) - } else { - playlists, err := api.store.ListPlaylistsAllShows(offset, limit) - if err != nil { - sendError(c, err) - return - } - c.JSON(http.StatusOK, PlaylistsListing{playlists}) - } -} - -// ReadPlaylist retrieves a playlist. -// -// @Summary Retrieve playlist -// @Description Retrieves a playlist. -// @Produce json -// @Param id path int true "ID of the playlist" -// @Success 200 {object} store.Playlist -// @Failure 400 {object} ErrorResponse -// @Failure 403 {object} ErrorResponse -// @Failure 404 {object} ErrorResponse -// @Failure 500 {object} ErrorResponse -// @Router /api/v1/playlists/{id} [get] -func (api *API) ReadPlaylist(c *gin.Context) { - if authorized, _ := authorizeRequest(c, api); !authorized { - return - } - - id, err := idFromString(c.Param("playlist-id")) - if err != nil { - c.JSON(http.StatusBadRequest, ErrorResponse{Error: "invalid playlist-id: " + err.Error()}) - return - } - - showID, _ := idFromString(c.Query("showId")) // we ignore error because the showId is an optional query parameter - - if showID != 0 { - playlist, err := api.store.GetPlaylist(showID, id) - if err != nil { - sendError(c, err) - return - } - c.JSON(http.StatusOK, playlist) - } else { - playlist, err := api.store.GetPlaylistAllShows(id) - if err != nil { - sendError(c, err) - return - } - c.JSON(http.StatusOK, playlist) - } -}