2026-03-25 11:35:53 +00:00
|
|
|
package imgedit
|
|
|
|
|
|
|
|
|
|
import (
|
|
|
|
|
"encoding/json"
|
|
|
|
|
"io"
|
|
|
|
|
"os"
|
|
|
|
|
"path/filepath"
|
|
|
|
|
|
|
|
|
|
"lmika.dev/lmika/weiro/models"
|
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
type sessionStore struct {
|
|
|
|
|
baseDir string
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:16:50 +00:00
|
|
|
func (ss *sessionStore) save(newSession *models.ImageEditSession) error {
|
2026-03-25 11:35:53 +00:00
|
|
|
sessionMeta, err := json.Marshal(newSession)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
if err := os.MkdirAll(filepath.Join(ss.baseDir, newSession.GUID), 0755); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
if err := os.WriteFile(filepath.Join(ss.baseDir, newSession.GUID, "session.json"), sessionMeta, 0644); err != nil {
|
|
|
|
|
return err
|
|
|
|
|
}
|
|
|
|
|
return nil
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:16:50 +00:00
|
|
|
func (ss *sessionStore) get(guid string) (*models.ImageEditSession, error) {
|
2026-03-25 11:35:53 +00:00
|
|
|
sessionDataBts, err := os.ReadFile(filepath.Join(ss.baseDir, guid, "session.json"))
|
|
|
|
|
if err != nil {
|
2026-03-26 10:16:50 +00:00
|
|
|
return nil, err
|
2026-03-25 11:35:53 +00:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
sessionData := models.ImageEditSession{}
|
|
|
|
|
if err := json.Unmarshal(sessionDataBts, &sessionData); err != nil {
|
2026-03-26 10:16:50 +00:00
|
|
|
return nil, err
|
2026-03-25 11:35:53 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:16:50 +00:00
|
|
|
return &sessionData, nil
|
2026-03-25 11:35:53 +00:00
|
|
|
}
|
|
|
|
|
|
2026-03-28 10:42:35 +00:00
|
|
|
func (ss *sessionStore) delete(guid string) {
|
|
|
|
|
os.RemoveAll(filepath.Join(ss.baseDir, guid))
|
|
|
|
|
}
|
|
|
|
|
|
2026-03-26 10:16:50 +00:00
|
|
|
func (ss *sessionStore) getImage(session *models.ImageEditSession, imageFilename string) (string, func() (io.ReadCloser, error), error) {
|
2026-03-25 11:35:53 +00:00
|
|
|
fullPath := filepath.Join(ss.baseDir, session.GUID, imageFilename)
|
|
|
|
|
if s, err := os.Stat(fullPath); err != nil {
|
|
|
|
|
return "", nil, err
|
|
|
|
|
} else if s.IsDir() {
|
|
|
|
|
return "", nil, os.ErrNotExist
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var mimeType string
|
|
|
|
|
switch filepath.Ext(imageFilename) {
|
|
|
|
|
case ".jpg", ".jpeg":
|
|
|
|
|
mimeType = "image/jpeg"
|
|
|
|
|
case ".png":
|
|
|
|
|
mimeType = "image/png"
|
|
|
|
|
default:
|
|
|
|
|
return "", nil, models.UnsupportedImageFormat
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return mimeType, func() (io.ReadCloser, error) {
|
|
|
|
|
return os.Open(fullPath)
|
|
|
|
|
}, nil
|
|
|
|
|
}
|