package app import ( "context" "evening_detective_server/internal/modules/roles" "evening_detective_server/internal/services/team_service" "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 receiptClaims(ctx context.Context) error { claims, err := claimsFromContext(ctx) if err != nil { return err } if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { return status.Error(codes.PermissionDenied, "нет доступа к печати чеков команды") } return nil } func (s *server) PreviewTeamReceipt(ctx context.Context, req *proto.TeamReceiptReq) (*httpbody.HttpBody, error) { if err := receiptClaims(ctx); err != nil { return nil, err } data, err := s.teamService.PreviewTeamReceipt(ctx, int(req.GetGameID()), req.GetTeamID()) if err != nil { return nil, teamReceiptError(err) } if err := grpc.SetHeader(ctx, metadata.Pairs("Cache-Control", "no-store", "X-Content-Type-Options", "nosniff")); err != nil { return nil, status.Error(codes.Internal, "не удалось установить заголовки чека") } return &httpbody.HttpBody{ ContentType: "image/png", Data: data, }, nil } func (s *server) PrintTeamReceipt(ctx context.Context, req *proto.TeamReceiptReq) (*proto.PrintTeamReceiptRsp, error) { if err := receiptClaims(ctx); err != nil { return nil, err } ctx, cancel := context.WithTimeout(ctx, team_service.ReceiptTimeout) defer cancel() if err := s.teamService.PrintTeamReceipt(ctx, int(req.GetGameID()), req.GetTeamID()); err != nil { return nil, teamReceiptError(err) } return &proto.PrintTeamReceiptRsp{}, nil }