Skip to content
Snippets Groups Projects
Commit a3524e4c authored by Christian Pointner's avatar Christian Pointner
Browse files

add api endpoint to fetch file usage

parent 60c646a3
Branches
Tags
No related merge requests found
...@@ -98,6 +98,10 @@ func InstallHandler(r *mux.Router, st *store.Store, im *importer.Importer, infoL ...@@ -98,6 +98,10 @@ func InstallHandler(r *mux.Router, st *store.Store, im *importer.Importer, infoL
fileHandler["DELETE"] = api.DeleteFileOfGroup() fileHandler["DELETE"] = api.DeleteFileOfGroup()
r.Handle("/groups/{group-id}/files/{file-id}", fileHandler) r.Handle("/groups/{group-id}/files/{file-id}", fileHandler)
usageHandler := make(handlers.MethodHandler)
usageHandler["GET"] = api.ReadUsageOfFile()
r.Handle("/groups/{group-id}/files/{file-id}/usage", usageHandler)
importHandler := make(handlers.MethodHandler) importHandler := make(handlers.MethodHandler)
importHandler["GET"] = api.ReadImportOfFile() importHandler["GET"] = api.ReadImportOfFile()
importHandler["PUT"] = api.UploadFile() importHandler["PUT"] = api.UploadFile()
......
...@@ -121,3 +121,20 @@ func (api *API) DeleteFileOfGroup() http.Handler { ...@@ -121,3 +121,20 @@ func (api *API) DeleteFileOfGroup() http.Handler {
sendWebResponse(w, http.StatusNoContent, nil) sendWebResponse(w, http.StatusNoContent, nil)
}) })
} }
func (api *API) ReadUsageOfFile() http.Handler {
return http.HandlerFunc(func(w http.ResponseWriter, r *http.Request) {
vars := mux.Vars(r)
id, err := idFromString(vars["file-id"])
if err != nil {
sendWebResponse(w, http.StatusBadRequest, ErrorResponse{Error: "invalid file-id: " + err.Error()})
return
}
result := FileUsageListing{}
if result.Usage.Playlists, err = api.store.GetFileUsage(vars["group-id"], id); err != nil {
sendStoreError(w, err)
return
}
sendWebResponse(w, http.StatusOK, result)
})
}
...@@ -55,6 +55,12 @@ type FilesListing struct { ...@@ -55,6 +55,12 @@ type FilesListing struct {
Files store.Files `json:"results"` Files store.Files `json:"results"`
} }
type FileUsageListing struct {
Usage struct {
Playlists store.Playlists `json:"playlists"`
} `json:"results"`
}
type PlaylistsListing struct { type PlaylistsListing struct {
Playlists store.Playlists `json:"results"` Playlists store.Playlists `json:"results"`
} }
...@@ -74,9 +74,9 @@ func (st *Store) UpdateFile(group string, id uint64, file File) (*File, error) { ...@@ -74,9 +74,9 @@ func (st *Store) UpdateFile(group string, id uint64, file File) (*File, error) {
return &file, err return &file, err
} }
func (st *Store) getFileUsage(id uint64) (playlists Playlists, err error) { func (st *Store) getFileUsage(id uint64, playlists *Playlists) (err error) {
sub := st.db.Model(PlaylistEntry{}).Select("playlist_id").Where("file_id = ?", id).Group("playlist_id").SubQuery() sub := st.db.Model(PlaylistEntry{}).Select("playlist_id").Where("file_id = ?", id).Group("playlist_id").SubQuery()
err = st.db.Where("id in ?", sub).Find(&playlists).Error err = st.db.Where("id in ?", sub).Find(playlists).Error
return return
} }
...@@ -90,7 +90,7 @@ func (st *Store) GetFileUsage(group string, id uint64) (playlists Playlists, err ...@@ -90,7 +90,7 @@ func (st *Store) GetFileUsage(group string, id uint64) (playlists Playlists, err
if cnt == 0 { if cnt == 0 {
return nil, ErrNotFound return nil, ErrNotFound
} }
playlists, err = st.getFileUsage(id) err = st.getFileUsage(id, &playlists)
return return
} }
...@@ -100,11 +100,11 @@ func (st *Store) DeleteFile(group string, id uint64) (err error) { ...@@ -100,11 +100,11 @@ func (st *Store) DeleteFile(group string, id uint64) (err error) {
result := st.db.Where("group_name = ?", group).Delete(&File{ID: id}) result := st.db.Where("group_name = ?", group).Delete(&File{ID: id})
if err = result.Error; err != nil { if err = result.Error; err != nil {
// we assume this is due to a FK constraint -> file in use by playlist_entry // we assume this is due to a FK constraint -> file in use by playlist_entry
playlists, err := st.getFileUsage(id) usageErr := &ErrFileInUse{}
if err != nil { if err = st.getFileUsage(id, &(usageErr.Playlists)); err != nil {
return err return
} }
return &ErrFileInUse{Playlists: playlists} return usageErr
} }
if result.RowsAffected == 0 { if result.RowsAffected == 0 {
return ErrNotFound return ErrNotFound
......
...@@ -56,7 +56,7 @@ type ErrFileInUse struct { ...@@ -56,7 +56,7 @@ type ErrFileInUse struct {
} }
func (e *ErrFileInUse) Error() string { func (e *ErrFileInUse) Error() string {
return fmt.Sprintf("the file is in use by %d playlist", len(e.Playlists)) return fmt.Sprintf("the file is still in use by %d playlist(s)", len(e.Playlists))
} }
//******* Groups //******* Groups
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Please register or to comment