Have got saving working

This commit is contained in:
Leon Mika 2026-03-28 21:42:35 +11:00
parent f9a65c8ca9
commit c8a276b248
21 changed files with 248 additions and 22 deletions

View file

@ -175,6 +175,58 @@ func (s *Service) UpdateProcessor(ctx context.Context, sessionID string, req Upd
return session, nil
}
type SaveResult struct {
UploadID int64 `json:"upload_id"`
}
func (s *Service) Save(ctx context.Context, sessionID string, mode string) (*SaveResult, error) {
session, err := s.loadAndVerifySession(ctx, sessionID)
if err != nil {
return nil, err
}
if len(session.Processors) == 0 {
return nil, fmt.Errorf("no processors in session")
}
lastProc := session.Processors[len(session.Processors)-1]
finalImagePath := fmt.Sprintf("%v/%v/%v.%v", s.scratchDir, session.GUID, lastProc.VersionID, session.ImageExt)
var mimeType string
switch session.ImageExt {
case "jpg", "jpeg":
mimeType = "image/jpeg"
case "png":
mimeType = "image/png"
}
var uploadID int64
switch mode {
case "replace":
upload, err := s.uploadService.ReplaceUploadFile(ctx, session.BaseUploadID, finalImagePath)
if err != nil {
return nil, err
}
uploadID = upload.ID
case "copy":
baseUpload, _, err := s.uploadService.OpenUpload(ctx, session.BaseUploadID)
if err != nil {
return nil, err
}
upload, err := s.uploadService.CreateUploadFromFile(ctx, finalImagePath, baseUpload.Filename, mimeType)
if err != nil {
return nil, err
}
uploadID = upload.ID
default:
return nil, fmt.Errorf("unknown save mode: %v", mode)
}
s.sessionStore.delete(session.GUID)
return &SaveResult{UploadID: uploadID}, nil
}
func (s *Service) loadAndVerifySession(ctx context.Context, sessionID string) (*models.ImageEditSession, error) {
site, user, err := s.fetchSiteAndUser(ctx)
if err != nil {

View file

@ -42,6 +42,10 @@ func (ss *sessionStore) get(guid string) (*models.ImageEditSession, error) {
return &sessionData, nil
}
func (ss *sessionStore) delete(guid string) {
os.RemoveAll(filepath.Join(ss.baseDir, guid))
}
func (ss *sessionStore) getImage(session *models.ImageEditSession, imageFilename string) (string, func() (io.ReadCloser, error), error) {
fullPath := filepath.Join(ss.baseDir, session.GUID, imageFilename)
if s, err := os.Stat(fullPath); err != nil {

View file

@ -6,7 +6,10 @@ import (
"html/template"
"io"
"log"
"os"
"path/filepath"
"strings"
"time"
"lmika.dev/lmika/weiro/models"
)
@ -67,6 +70,75 @@ func (s *Service) renderCopyTemplate(upload models.Upload) string {
return sb.String()
}
func (s *Service) ReplaceUploadFile(ctx context.Context, uploadID int64, srcPath string) (models.Upload, error) {
site, _, err := s.fetchSiteAndUser(ctx)
if err != nil {
return models.Upload{}, err
}
upload, err := s.db.SelectUploadByID(ctx, uploadID)
if err != nil {
return models.Upload{}, err
} else if upload.SiteID != site.ID {
return models.Upload{}, models.NotFoundError
}
if err := s.up.ReplaceFile(site, upload, srcPath); err != nil {
return models.Upload{}, err
}
stat, err := os.Stat(srcPath)
if err != nil {
return models.Upload{}, err
}
upload.FileSize = stat.Size()
if err := s.db.UpdateUploadFileSize(ctx, upload.ID, upload.FileSize); err != nil {
return models.Upload{}, err
}
return upload, nil
}
func (s *Service) CreateUploadFromFile(ctx context.Context, srcPath string, filename string, mimeType string) (models.Upload, error) {
site, _, err := s.fetchSiteAndUser(ctx)
if err != nil {
return models.Upload{}, err
}
stat, err := os.Stat(srcPath)
if err != nil {
return models.Upload{}, err
}
newUploadGUID := models.NewNanoID()
newTime := time.Now().UTC()
newSlug := filepath.Join(
fmt.Sprintf("%04d", newTime.Year()),
fmt.Sprintf("%02d", newTime.Month()),
newUploadGUID+filepath.Ext(filename),
)
newUpload := models.Upload{
SiteID: site.ID,
GUID: models.NewNanoID(),
FileSize: stat.Size(),
MIMEType: mimeType,
Filename: filename,
CreatedAt: newTime,
Slug: newSlug,
}
if err := s.db.SaveUpload(ctx, &newUpload); err != nil {
return models.Upload{}, err
}
if err := s.up.AdoptFile(site, newUpload, srcPath); err != nil {
return models.Upload{}, err
}
return newUpload, nil
}
func (s *Service) ListUploads(ctx context.Context) (res []UploadWithURL, _ error) {
site, _, err := s.fetchSiteAndUser(ctx)
if err != nil {