Skip to content
Snippets Groups Projects
files_import.go 4.23 KiB
Newer Older
  • Learn to ignore specific revisions
  • Christian Pointner's avatar
    Christian Pointner committed
    //  tank, Import and Playlist Daemon for Aura project
    //  Copyright (C) 2017-2020 Christian Pointner <equinox@helsinki.at>
    
    Christian Pointner's avatar
    Christian Pointner committed
    //  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.
    
    Christian Pointner's avatar
    Christian Pointner committed
    //  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
    
    Christian Pointner's avatar
    Christian Pointner committed
    //  GNU Affero General Public License for more details.
    
    Christian Pointner's avatar
    Christian Pointner committed
    //  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 (
    	"net/http"
    
    	"github.com/gin-gonic/gin"
    
    // ListImportsOfShow returns a list of all running and pending imports for files belonging to this show.
    
    //	@Summary		List imports
    //	@Description	Lists all running and pending imports
    //	@Produce		json
    
    //	@Param			showID	query		int	true	"ID of the show"
    //	@Param			limit	query		int	false	"Limit number of results"
    //	@Param			offset	query		int	false	"Start listing from offset"
    //	@Success		200		{object}	JobsListing
    //	@Failure		400		{object}	ErrorResponse
    //	@Failure		403		{object}	ErrorResponse
    //	@Failure		500		{object}	ErrorResponse
    
    //	@Router			/api/v1/imports [get]
    
    func (api *API) ListImportsOfShow(c *gin.Context) {
    
    	if authorized, _ := authorizeRequestForShow(c, showID); !authorized {
    
    	offset, limit, ok := getPaginationParameter(c)
    	if !ok {
    		return
    	}
    
    	jobs, err := api.importer.ListJobs(showID, offset, limit)
    
    	if err != nil {
    		sendError(c, err)
    		return
    
    	c.JSON(http.StatusOK, JobsListing{jobs})
    
    // ReadImportOfFile retrieves import status of the file.
    
    //	@Summary		Retrieve import status
    //	@Description	Retrieves import status of the file.
    //	@Produce		json
    
    //	@Param			showID	query		int		true	"ID of the show"
    //	@Param			id		path		int		true	"ID of the file"
    //	@Param			waitFor	query		string	false	"running|done - If given, return not before import has the given state"
    //	@Success		200		{object}	importer.Job
    //	@Failure		400		{object}	ErrorResponse
    //	@Failure		403		{object}	ErrorResponse
    //	@Failure		404		{object}	ErrorResponse	"No job for this file"
    //	@Failure		500		{object}	ErrorResponse
    
    //	@Router			/api/v1/import/{id} [get]
    
    func (api *API) ReadImportOfFile(c *gin.Context) {
    
    	showID, err := getShowID(c)
    	if err != nil {
    		return
    
    	if authorized, _ := authorizeRequestForShow(c, showID); !authorized {
    
    	id, err := idFromString(c.Param("file-id"))
    	if err != nil {
    		c.JSON(http.StatusBadRequest, ErrorResponse{Error: "invalid file-id: " + err.Error()})
    		return
    	}
    
    	waitFor := c.Query("waitFor")
    
    	switch waitFor {
    	case "running":
    	case "done":
    	case "":
    	default:
    		c.JSON(http.StatusBadRequest, ErrorResponse{Error: "unable to wait for unknown state: " + waitFor})
    		return
    	}
    
    	job, err := api.importer.GetJob(showID, id)
    	if err != nil {
    		// TODO: return import info from store if err == ErrNotFound
    		sendError(c, err)
    		return
    	}
    
    	switch waitFor {
    	case "running":
    		<-job.Running()
    	case "done":
    		<-job.Done()
    
    	c.JSON(http.StatusOK, job)
    
    // CancelImportOfFile cancels import of file.
    
    //	@Summary		Cancel file import
    //	@Description	Cancels import of file.
    
    //	@Param			showID	query	int	true	"ID of the show"
    //	@Param			id		path	int	true	"ID of the file"
    
    //	@Success		204
    //	@Failure		400	{object}	ErrorResponse
    //	@Failure		403	{object}	ErrorResponse
    //	@Failure		404	{object}	ErrorResponse	"No job for this file"
    //	@Failure		500	{object}	ErrorResponse
    //	@Router			/api/v1/import/{id} [delete]
    
    func (api *API) CancelImportOfFile(c *gin.Context) {
    
    	showID, err := getShowID(c)
    	if err != nil {
    		return
    
    	if authorized, _ := authorizeRequestForShow(c, showID); !authorized {
    
    	id, err := idFromString(c.Param("file-id"))
    	if err != nil {
    		c.JSON(http.StatusBadRequest, ErrorResponse{Error: "invalid file-id: " + err.Error()})
    		return
    	}
    	job, err := api.importer.GetJob(showID, id)
    	if err != nil {
    		sendError(c, err)
    		return
    
    	job.Cancel()
    	c.JSON(http.StatusNoContent, nil)