generated from VLADIMIR/template
104 lines
4.0 KiB
Go
104 lines
4.0 KiB
Go
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, _ *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
|
|
}
|