package uploads import ( "context" "fmt" "io" "lmika.dev/lmika/weiro/models" ) type UploadWithURL struct { Upload models.Upload URL string } func (s *Service) FetchUpload(ctx context.Context, uploadID int64) (res UploadWithURL, _ error) { site, _, err := s.fetchSiteAndUser(ctx) if err != nil { return UploadWithURL{}, err } upload, err := s.db.SelectUploadByID(ctx, uploadID) if err != nil { return UploadWithURL{}, err } return UploadWithURL{ Upload: upload, URL: fmt.Sprintf("/sites/%v/uploads/%v/raw", site.ID, upload.ID), }, nil } func (s *Service) ListUploads(ctx context.Context) (res []UploadWithURL, _ error) { site, _, err := s.fetchSiteAndUser(ctx) if err != nil { return nil, err } uploads, err := s.db.SelectUploadsOfSite(ctx, site.ID) if err != nil { return nil, err } res = make([]UploadWithURL, len(uploads)) for i, upload := range uploads { res[i] = UploadWithURL{ Upload: upload, URL: fmt.Sprintf("/sites/%v/uploads/%v/raw", site.ID, upload.ID), } } return res, nil } func (s *Service) OpenUpload(ctx context.Context, id int64) (models.Upload, func() (io.ReadCloser, error), error) { site, _, err := s.fetchSiteAndUser(ctx) if err != nil { return models.Upload{}, nil, err } upload, err := s.db.SelectUploadByID(ctx, id) if err != nil { return models.Upload{}, nil, err } else if upload.SiteID != site.ID { return models.Upload{}, nil, models.NotFoundError } return upload, func() (io.ReadCloser, error) { rw, err := s.up.OpenUpload(site, upload) if err != nil { return nil, err } return rw, nil }, nil }