image-storage/internal/mainHandler/service.go

105 lines
2.7 KiB
Go
Raw Normal View History

2025-10-20 22:21:55 +03:00
package mainHandler
import (
"context"
2025-10-22 21:34:17 +03:00
"fmt"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/status"
"google.golang.org/protobuf/types/known/emptypb"
2025-10-20 22:21:55 +03:00
pb "imageStorage/pkg/proto/imageStorage"
2025-10-22 21:34:17 +03:00
"os"
"path/filepath"
"strings"
2025-10-20 22:21:55 +03:00
)
2025-10-22 21:34:17 +03:00
func (i *ImageHandler) UploadImage(ctx context.Context, req *pb.UploadMerchImageRequest) (*pb.UploadMerchImageResponse, error) {
if len(req.ImageData) == 0 {
return nil, status.Errorf(codes.InvalidArgument, "image data is empty")
}
path := i._makeMerchImagePath(req.UserUuid, req.MerchUuid)
if err := os.MkdirAll(path, 0777); err != nil {
return nil, err
}
full := filepath.Join(path, "full.jpg")
thumbnail := filepath.Join(path, "thumbnail.jpg")
fullFile, err := os.Create(full)
if err != nil {
return nil, err
}
defer fullFile.Close()
thumbnailFile, err := os.Create(thumbnail)
if err != nil {
return nil, err
}
defer thumbnailFile.Close()
if err = i.converter.ConvertAndSave(req.ImageData, fullFile, thumbnailFile); err != nil {
return nil, err
}
response := &pb.UploadMerchImageResponse{
FullImage: i._makeMerchImageURL(req.UserUuid, req.MerchUuid, full),
Thumbnail: i._makeMerchImageURL(req.UserUuid, req.MerchUuid, thumbnail),
}
return response, nil
2025-10-20 22:21:55 +03:00
}
func (i *ImageHandler) GetImage(ctx context.Context, req *pb.GetImageRequest) (*pb.GetImageResponse, error) {
2025-10-22 21:34:17 +03:00
path := i._makeMerchImagePath(req.UserUuid, req.MerchUuid)
unk := status.Error(codes.InvalidArgument, "unknown image type")
switch req.ImgType {
case pb.ImageType_UNKNOWN:
return nil, unk
case pb.ImageType_FULL:
return &pb.GetImageResponse{
Url: fmt.Sprintf("%s/%s", i.domain, filepath.Join(path, "full.jpg")),
Etag: "",
}, nil
case pb.ImageType_THUMBNAIL:
return &pb.GetImageResponse{
Url: fmt.Sprintf("%s/%s", i.domain, filepath.Join(path, "thumbnail.jpg")),
Etag: "",
}, nil
default:
return nil, unk
}
}
func (i *ImageHandler) DeleteImage(ctx context.Context, req *pb.DeleteImageRequest) (*emptypb.Empty, error) {
path := i._makeMerchImagePath(req.UserUuid, req.MerchUuid)
entries, err := os.ReadDir(path)
if err != nil {
if os.IsNotExist(err) {
return &emptypb.Empty{}, nil
}
return nil, err
}
for _, entry := range entries {
if !entry.IsDir() {
filePath := filepath.Join(path, entry.Name())
if err := os.Remove(filePath); err != nil {
return nil, err
}
}
}
return &emptypb.Empty{}, nil
}
func (i *ImageHandler) _makeMerchImagePath(u, m string) string {
return fmt.Sprintf("%s/merchImages/%s/%s", i.volume, u, m)
2025-10-20 22:21:55 +03:00
}
2025-10-22 21:34:17 +03:00
func (i *ImageHandler) _makeMerchImageURL(u, m, n string) string {
d := strings.TrimSuffix(i.domain, "/")
return fmt.Sprintf("%s/merchImages/%s/%s/%s", d, u, m, n)
2025-10-20 22:21:55 +03:00
}