package app import ( "context" "evening_detective_server/internal/modules/roles" "evening_detective_server/internal/services/game_review_service" "evening_detective_server/proto" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "google.golang.org/protobuf/types/known/timestamppb" ) func mapGameReview(r *game_review_service.Review) *proto.GameReview { return &proto.GameReview{ ID: int32(r.ID), GameID: int32(r.GameID), TeamID: int32(r.TeamID), TeamName: r.TeamName, Rating: r.Rating, Text: r.Text, Status: r.Status, CreatedAt: timestamppb.New(r.CreatedAt), GameName: r.GameName, } } func mapGameReviews(reviews []*game_review_service.Review) []*proto.GameReview { result := make([]*proto.GameReview, 0, len(reviews)) for _, review := range reviews { result = append(result, mapGameReview(review)) } return result } func (s *server) CreateGameReview(ctx context.Context, req *proto.CreateGameReviewReq) (*proto.CreateGameReviewRsp, error) { review, err := s.reviewService.Create(ctx, int(req.GameID), int(req.TeamID), req.Password, req.Rating, req.Text) if err != nil { return nil, reviewErrorStatus(err, "не удалось создать отзыв") } return &proto.CreateGameReviewRsp{Review: mapGameReview(review)}, nil } func (s *server) GetGameReviews(ctx context.Context, req *proto.GetGameReviewsReq) (*proto.GetGameReviewsRsp, error) { reviews, average, count, err := s.reviewService.List(ctx, int(req.GameID), false) if err != nil { return nil, reviewErrorStatus(err, "не удалось получить отзывы игры") } return &proto.GetGameReviewsRsp{AverageRating: average, ReviewsCount: count, Reviews: mapGameReviews(reviews)}, nil } func (s *server) GetScenarioReviews(ctx context.Context, req *proto.GetScenarioReviewsReq) (*proto.GetGameReviewsRsp, error) { reviews, average, count, err := s.reviewService.ListByScenario(ctx, int(req.ScenarioID)) if err != nil { return nil, reviewErrorStatus(err, "не удалось получить отзывы сценария") } return &proto.GetGameReviewsRsp{AverageRating: average, ReviewsCount: count, Reviews: mapGameReviews(reviews)}, nil } func (s *server) GetGameReviewsForModeration(ctx context.Context, req *proto.GetGameReviewsReq) (*proto.GetGameReviewsRsp, error) { claims, claimsErr := claimsFromContext(ctx) if claimsErr != nil { return nil, claimsErr } if !roles.HasRole(claims, roles.Admin) { return nil, status.Error(codes.PermissionDenied, "permission denied") } reviews, average, count, err := s.reviewService.List(ctx, int(req.GameID), true) if err != nil { return nil, reviewErrorStatus(err, "не удалось получить отзывы для модерации") } return &proto.GetGameReviewsRsp{AverageRating: average, ReviewsCount: count, Reviews: mapGameReviews(reviews)}, nil } func (s *server) GetReviewsForModeration(ctx context.Context, req *proto.GetReviewsForModerationReq) (*proto.GetGameReviewsRsp, error) { claims, claimsErr := claimsFromContext(ctx) if claimsErr != nil { return nil, claimsErr } if !roles.HasRole(claims, roles.Admin) { return nil, status.Error(codes.PermissionDenied, "permission denied") } reviews, err := s.reviewService.ListForModeration(ctx) if err != nil { return nil, reviewErrorStatus(err, "не удалось получить отзывы для модерации") } return &proto.GetGameReviewsRsp{Reviews: mapGameReviews(reviews)}, nil } func (s *server) ModerateGameReview(ctx context.Context, req *proto.ModerateGameReviewReq) (*proto.ModerateGameReviewRsp, error) { claims, claimsErr := claimsFromContext(ctx) if claimsErr != nil { return nil, claimsErr } if !roles.HasRole(claims, roles.Admin) { return nil, status.Error(codes.PermissionDenied, "permission denied") } review, err := s.reviewService.Moderate(ctx, int(req.ID), req.Status) if err != nil { return nil, reviewErrorStatus(err, "не удалось изменить статус отзыва") } return &proto.ModerateGameReviewRsp{Review: mapGameReview(review)}, nil }