Have got saving working
This commit is contained in:
parent
f9a65c8ca9
commit
c8a276b248
21 changed files with 248 additions and 22 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue