Files
evening_detective_server/internal/app/files.go
T
2026-10-03 13:22:11 +07:00

65 lines
2.1 KiB
Go

package app
import (
"context"
"errors"
"evening_detective_server/internal/modules/roles"
"evening_detective_server/internal/services/file_service"
proto "evening_detective_server/proto"
"google.golang.org/genproto/googleapis/api/httpbody"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/metadata"
"google.golang.org/grpc/status"
)
func (s *server) UploadFile(ctx context.Context, req *proto.UploadFileReq) (*proto.UploadFileRsp, error) {
claims, claimsErr := claimsFromContext(ctx)
if claimsErr != nil {
return nil, claimsErr
}
if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied")
}
filename, fileType, err := s.fileService.UploadFile(ctx, req.Filename, req.Data)
if err != nil {
switch {
case errors.Is(err, file_service.ErrFileTooLarge):
return nil, status.Error(codes.ResourceExhausted, err.Error())
case errors.Is(err, file_service.ErrEmptyName),
errors.Is(err, file_service.ErrEmptyData),
errors.Is(err, file_service.ErrInvalidExtension),
errors.Is(err, file_service.ErrInvalidContentType):
return nil, status.Error(codes.InvalidArgument, err.Error())
default:
return nil, status.Error(codes.Internal, "не удалось загрузить файл")
}
}
return &proto.UploadFileRsp{
Filename: filename,
FileType: fileType,
}, nil
}
func (s *server) DownloadFile(ctx context.Context, req *proto.DownloadFileReq) (*httpbody.HttpBody, error) {
file, err := s.fileService.DownloadFile(ctx, req.Filename)
if err != nil {
switch {
case errors.Is(err, file_service.ErrFileNotFound):
return nil, status.Error(codes.NotFound, err.Error())
default:
return nil, status.Error(codes.Internal, "не удалось скачать файл")
}
}
if err := grpc.SetHeader(ctx, metadata.Pairs("X-Content-Type-Options", "nosniff")); err != nil {
return nil, status.Error(codes.Internal, "не удалось установить заголовки файла")
}
return &httpbody.HttpBody{
Data: file.Data,
ContentType: file.Mime,
}, nil
}