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 }