128 lines
2.4 KiB
Go
128 lines
2.4 KiB
Go
package storage
|
|
|
|
import (
|
|
"context"
|
|
"io"
|
|
"mime/multipart"
|
|
"os"
|
|
"path/filepath"
|
|
|
|
filemanager "git-molva.ru/Molva/molva-backend/services/api_gateway/internal/file_manager"
|
|
)
|
|
|
|
type Storage struct {
|
|
basePath string
|
|
}
|
|
|
|
func New(basePath string) *Storage {
|
|
return &Storage{
|
|
basePath: basePath,
|
|
}
|
|
}
|
|
|
|
func (s *Storage) GetFilePaths(
|
|
ctx context.Context,
|
|
fileType filemanager.FileType,
|
|
parameters filemanager.ParameterTable,
|
|
) ([]string, error) {
|
|
var dirPath string
|
|
|
|
fileNames := make([]string, 0)
|
|
|
|
switch fileType {
|
|
case filemanager.AvatarFileType:
|
|
userId, ok := parameters[filemanager.UserIdParam]
|
|
if !ok {
|
|
return nil, filemanager.ErrParameterNotFound
|
|
}
|
|
|
|
dirPath = filepath.Join(s.basePath, userId.(string), "avatars")
|
|
|
|
case filemanager.CVFileType:
|
|
submId, ok := parameters[filemanager.SubmissionIdParam]
|
|
if !ok {
|
|
return nil, filemanager.ErrParameterNotFound
|
|
}
|
|
|
|
dirPath = filepath.Join(s.basePath, "CVs", submId.(string))
|
|
|
|
default:
|
|
return nil, filemanager.ErrInvalidFileType
|
|
}
|
|
|
|
if _, err := os.Stat(dirPath); os.IsNotExist(err) {
|
|
return nil, filemanager.ErrFileNotFound
|
|
}
|
|
|
|
if err := filepath.WalkDir(dirPath, func(path string, d os.DirEntry, err error) error {
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if d.IsDir() {
|
|
return nil
|
|
}
|
|
|
|
fileNames = append(fileNames, path)
|
|
|
|
return nil
|
|
}); err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
if len(fileNames) == 0 {
|
|
return nil, filemanager.ErrFileNotFound
|
|
}
|
|
|
|
return fileNames, nil
|
|
}
|
|
|
|
func (s *Storage) SaveFile(
|
|
ctx context.Context,
|
|
fileType filemanager.FileType,
|
|
file multipart.File,
|
|
fileHeader *multipart.FileHeader,
|
|
parameters filemanager.ParameterTable,
|
|
) error {
|
|
var dirPath string
|
|
|
|
switch fileType {
|
|
case filemanager.AvatarFileType:
|
|
userId, ok := parameters[filemanager.UserIdParam]
|
|
if !ok {
|
|
return filemanager.ErrParameterNotFound
|
|
}
|
|
|
|
dirPath = filepath.Join(s.basePath, userId.(string), "avatars")
|
|
|
|
case filemanager.CVFileType:
|
|
submId, ok := parameters[filemanager.SubmissionIdParam]
|
|
if !ok {
|
|
return filemanager.ErrParameterNotFound
|
|
}
|
|
|
|
dirPath = filepath.Join(s.basePath, "CVs", submId.(string))
|
|
|
|
default:
|
|
return filemanager.ErrInvalidFileType
|
|
}
|
|
|
|
if err := os.MkdirAll(dirPath, 0755); err != nil {
|
|
return err
|
|
}
|
|
|
|
filePath := filepath.Join(dirPath, fileHeader.Filename)
|
|
|
|
dstFile, err := os.Create(filePath)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
defer dstFile.Close()
|
|
|
|
if _, err := io.Copy(dstFile, file); err != nil {
|
|
return err
|
|
}
|
|
|
|
return nil
|
|
}
|