mirror of
https://github.com/pocket-id/pocket-id.git
synced 2025-12-16 09:13:20 +03:00
83 lines
2.0 KiB
Go
83 lines
2.0 KiB
Go
package service
|
|
|
|
import (
|
|
"fmt"
|
|
"mime/multipart"
|
|
"os"
|
|
"path/filepath"
|
|
"strings"
|
|
"sync"
|
|
|
|
"github.com/pocket-id/pocket-id/backend/internal/common"
|
|
"github.com/pocket-id/pocket-id/backend/internal/utils"
|
|
)
|
|
|
|
type AppImagesService struct {
|
|
mu sync.RWMutex
|
|
extensions map[string]string
|
|
}
|
|
|
|
func NewAppImagesService(extensions map[string]string) *AppImagesService {
|
|
return &AppImagesService{extensions: extensions}
|
|
}
|
|
|
|
func (s *AppImagesService) GetImage(name string) (string, string, error) {
|
|
ext, err := s.getExtension(name)
|
|
if err != nil {
|
|
return "", "", err
|
|
}
|
|
|
|
mimeType := utils.GetImageMimeType(ext)
|
|
if mimeType == "" {
|
|
return "", "", fmt.Errorf("unsupported image type '%s'", ext)
|
|
}
|
|
|
|
imagePath := filepath.Join(common.EnvConfig.UploadPath, "application-images", fmt.Sprintf("%s.%s", name, ext))
|
|
return imagePath, mimeType, nil
|
|
}
|
|
|
|
func (s *AppImagesService) UpdateImage(file *multipart.FileHeader, imageName string) error {
|
|
fileType := strings.ToLower(utils.GetFileExtension(file.Filename))
|
|
mimeType := utils.GetImageMimeType(fileType)
|
|
if mimeType == "" {
|
|
return &common.FileTypeNotSupportedError{}
|
|
}
|
|
|
|
s.mu.Lock()
|
|
defer s.mu.Unlock()
|
|
|
|
currentExt, ok := s.extensions[imageName]
|
|
if !ok {
|
|
return fmt.Errorf("unknown application image '%s'", imageName)
|
|
}
|
|
|
|
imagePath := filepath.Join(common.EnvConfig.UploadPath, "application-images", fmt.Sprintf("%s.%s", imageName, fileType))
|
|
|
|
if err := utils.SaveFile(file, imagePath); err != nil {
|
|
return err
|
|
}
|
|
|
|
if currentExt != "" && currentExt != fileType {
|
|
oldImagePath := filepath.Join(common.EnvConfig.UploadPath, "application-images", fmt.Sprintf("%s.%s", imageName, currentExt))
|
|
if err := os.Remove(oldImagePath); err != nil && !os.IsNotExist(err) {
|
|
return err
|
|
}
|
|
}
|
|
|
|
s.extensions[imageName] = fileType
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *AppImagesService) getExtension(name string) (string, error) {
|
|
s.mu.RLock()
|
|
defer s.mu.RUnlock()
|
|
|
|
ext, ok := s.extensions[name]
|
|
if !ok || ext == "" {
|
|
return "", fmt.Errorf("unknown application image '%s'", name)
|
|
}
|
|
|
|
return strings.ToLower(ext), nil
|
|
}
|