Skip to content
Snippets Groups Projects
api.go 2.91 KiB
Newer Older
  • Learn to ignore specific revisions
  • //
    //  tank
    //
    //  Import and Playlist Daemon for autoradio project
    //
    //
    
    //  Copyright (C) 2017-2019 Christian Pointner <equinox@helsinki.at>
    
    //
    //  This file is part of tank.
    //
    //  tank is free software: you can redistribute it and/or modify
    //  it under the terms of the GNU General Public License as published by
    //  the Free Software Foundation, either version 3 of the License, or
    //  any later version.
    //
    //  tank 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 General Public License for more details.
    //
    //  You should have received a copy of the GNU General Public License
    //  along with tank. If not, see <http://www.gnu.org/licenses/>.
    //
    
    package v1
    
    import (
    
    	"io/ioutil"
    	"log"
    
    	"github.com/gin-gonic/gin"
    
    	"gitlab.servus.at/autoradio/tank/auth"
    
    	"gitlab.servus.at/autoradio/tank/importer"
    	"gitlab.servus.at/autoradio/tank/store"
    
    type API struct {
    
    	store    *store.Store
    
    	importer *importer.Importer
    
    	infoLog  *log.Logger
    	errLog   *log.Logger
    	dbgLog   *log.Logger
    }
    
    
    func NewAPI(st *store.Store, im *importer.Importer, infoLog, errLog, dbgLog *log.Logger) (api *API) {
    
    	if infoLog == nil {
    		infoLog = log.New(ioutil.Discard, "", 0)
    	}
    	if errLog == nil {
    		errLog = log.New(ioutil.Discard, "", 0)
    	}
    	if dbgLog == nil {
    		dbgLog = log.New(ioutil.Discard, "", 0)
    	}
    
    	api = &API{}
    	api.store = st
    	api.importer = im
    	api.infoLog = infoLog
    	api.errLog = errLog
    	api.dbgLog = dbgLog
    	return
    }
    
    
    func InstallHTTPHandler(r *gin.RouterGroup, st *store.Store, im *importer.Importer, infoLog, errLog, dbgLog *log.Logger) {
    
    	r.Use(auth.Middleware())
    
    	api := NewAPI(st, im, infoLog, errLog, dbgLog)
    
    	shows := r.Group("shows")
    
    Christian Pointner's avatar
    Christian Pointner committed
    	{
    		shows.GET("", api.ListShows)
    		shows.POST(":show-id", api.CreateShow)
    		shows.GET(":show-id/imports", api.ListImportsOfShow)
    
    Christian Pointner's avatar
    Christian Pointner committed
    		// Show/Files
    		files := shows.Group(":show-id/files")
    		{
    			files.GET("", api.ListFilesOfShow)
    			files.POST("", api.CreateFileForShow)
    			files.GET(":file-id", api.ReadFileOfShow)
    			files.PATCH(":file-id", api.PatchFileOfShow)
    			files.DELETE(":file-id", api.DeleteFileOfShow)
    
    Christian Pointner's avatar
    Christian Pointner committed
    			files.GET(":file-id/usage", api.ReadUsageOfFile)
    			files.GET(":file-id/import", api.ReadImportOfFile)
    			files.DELETE(":file-id/import", api.CancelImportOfFile)
    
    Christian Pointner's avatar
    Christian Pointner committed
    			// TODO: distignuish between flow.js and simple upload using the content type?!?
    			files.PUT(":file-id/upload", api.UploadFileSimple)
    			files.POST(":file-id/upload", api.UploadFileFlowJS)
    			files.GET(":file-id/upload", api.TestFileFlowJS)
    		}
    
    Christian Pointner's avatar
    Christian Pointner committed
    		// Show/Playlists
    		playlists := shows.Group(":show-id/playlists")
    		{
    			playlists.GET("", api.ListPlaylistsOfShow)
    			playlists.POST("", api.CreatePlaylistForShow)
    			playlists.GET(":playlist-id", api.ReadPlaylistOfShow)
    			playlists.PUT(":playlist-id", api.UpdatePlaylistOfShow)
    			playlists.DELETE(":playlist-id", api.DeletePlaylistOfShow)
    		}
    	}