🏡 index : quine-global/quintodrome.git

package nativeapi

import (
	"context"
	"errors"
	"io"
	"net/http"
	"time"

	"github.com/deluan/rest"
	"github.com/go-chi/chi/v5"
	"github.com/navidrome/navidrome/consts"
	"github.com/navidrome/navidrome/model"
	"github.com/navidrome/navidrome/server"
)

func (api *Router) addArtistRoute(r chi.Router) {
	repo := api.ds.Artist()
	r.Route("/artist", func(r chi.Router) {
		r.Get("/", rest.GetAll(repo))
		r.Route("/{id}", func(r chi.Router) {
			r.Use(server.URLParamsMiddleware)
			r.Get("/", rest.Get(repo))
			r.Post("/image", api.uploadArtistImage())
			r.Delete("/image", api.deleteArtistImage())
		})
	})
}

func (api *Router) uploadArtistImage() http.HandlerFunc {
	return handleImageUpload(func(ctx context.Context, reader io.Reader, ext string) error {
		artistID := chi.URLParamFromCtx(ctx, "id")
		ar, err := api.ds.Artist().Get(ctx, artistID)
		if err != nil {
			if errors.Is(err, model.ErrNotFound) {
				return model.ErrNotFound
			}
			return err
		}
		oldPath := ar.UploadedImagePath()
		filename, err := api.imgUpload.SetImage(ctx, consts.EntityArtist, ar.ID, ar.Name, oldPath, reader, ext)
		if err != nil {
			return err
		}
		ar.UploadedImage = filename
		ar.UpdatedAt = new(time.Now())
		if err := api.ds.Artist().Put(ctx, ar, "uploaded_image", "updated_at"); err != nil {
			return err
		}
		api.imgUpload.EnqueueArtwork(ctx, consts.EntityArtist, ar.ID)
		return nil
	})
}

func (api *Router) deleteArtistImage() http.HandlerFunc {
	return handleImageDelete(func(ctx context.Context) error {
		artistID := chi.URLParamFromCtx(ctx, "id")
		ar, err := api.ds.Artist().Get(ctx, artistID)
		if err != nil {
			if errors.Is(err, model.ErrNotFound) {
				return model.ErrNotFound
			}
			return err
		}
		if err := api.imgUpload.RemoveImage(ctx, ar.UploadedImagePath()); err != nil {
			return err
		}
		ar.UploadedImage = ""
		ar.UpdatedAt = new(time.Now())
		if err := api.ds.Artist().Put(ctx, ar, "uploaded_image", "updated_at"); err != nil {
			return err
		}
		api.imgUpload.EnqueueArtwork(ctx, consts.EntityArtist, ar.ID)
		return nil
	})
}