updates proto

This commit is contained in:
2026-10-01 14:19:43 +07:00
parent 1887b5b9a1
commit d9c5ca2956
27 changed files with 1897 additions and 1872 deletions
+159 -153
View File
File diff suppressed because it is too large Load Diff
+4 -4
View File
@@ -40,7 +40,7 @@ func (s *testStub) UploadScenarioArchive(_ context.Context, req *httpbody.HttpBo
s.mu.Lock() s.mu.Lock()
defer s.mu.Unlock() defer s.mu.Unlock()
s.uploaded = append([]byte(nil), req.Data...) s.uploaded = append([]byte(nil), req.Data...)
return &proto.UploadScenarioArchiveRsp{Id: 42}, nil return &proto.UploadScenarioArchiveRsp{ID: 42}, nil
} }
func (s *testStub) DownloadScenarioArchive(ctx context.Context, _ *proto.DownloadScenarioArchiveReq) (*httpbody.HttpBody, error) { func (s *testStub) DownloadScenarioArchive(ctx context.Context, _ *proto.DownloadScenarioArchiveReq) (*httpbody.HttpBody, error) {
@@ -81,7 +81,7 @@ func (s *testStub) getUploaded() []byte {
} }
func (s *testStub) DownloadTeamQR(ctx context.Context, req *proto.GetGameReq) (*httpbody.HttpBody, error) { func (s *testStub) DownloadTeamQR(ctx context.Context, req *proto.GetGameReq) (*httpbody.HttpBody, error) {
if req.Id != 7 { if req.ID != 7 {
return nil, status.Error(codes.NotFound, "Игра не найдена") return nil, status.Error(codes.NotFound, "Игра не найдена")
} }
data, err := team_qr_pdf.Generate([]team_qr_pdf.Card{{Name: "Знатоки", URL: "https://example.org/team-story/1?password=test"}}) data, err := team_qr_pdf.Generate([]team_qr_pdf.Card{{Name: "Знатоки", URL: "https://example.org/team-story/1?password=test"}})
@@ -204,8 +204,8 @@ func TestGatewayUploadRawZip(t *testing.T) {
if resp.StatusCode != http.StatusOK { if resp.StatusCode != http.StatusOK {
t.Fatalf("status = %d, body = %s", resp.StatusCode, body) t.Fatalf("status = %d, body = %s", resp.StatusCode, body)
} }
if !strings.Contains(string(body), `"id":42`) { if !strings.Contains(string(body), `"ID":42`) {
t.Errorf("ответ = %s, want id 42", body) t.Errorf("ответ = %s, want ID 42", body)
} }
if got := stub.getUploaded(); !bytes.Equal(got, raw) { if got := stub.getUploaded(); !bytes.Equal(got, raw) {
t.Errorf("сервер получил %q, want %q", got, raw) t.Errorf("сервер получил %q, want %q", got, raw)
File diff suppressed because it is too large Load Diff
+8 -2
View File
@@ -81,7 +81,7 @@ Handler не содержит SQL, транзакций, правил перех
```go ```go
func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.GetGameRsp, error) { func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.GetGameRsp, error) {
game, err := s.gameService.Get(ctx, req.GetId(), currentUserID(ctx)) game, err := s.gameService.Get(ctx, req.GetID(), currentUserID(ctx))
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -90,7 +90,7 @@ func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.Get
// game_mapper.go // game_mapper.go
func mapGetGameResponse(game *Game) *proto.GetGameRsp { func mapGetGameResponse(game *Game) *proto.GetGameRsp {
return &proto.GetGameRsp{Game: &proto.Game{Id: int32(game.ID), Name: game.Name}} return &proto.GetGameRsp{Game: &proto.Game{ID: int32(game.ID), Name: game.Name}}
} }
``` ```
@@ -176,6 +176,12 @@ SQL держи рядом с методом, которому он нужен.
- Protobuf — внешний транспортный контракт. Сгенерированные файлы в `proto/` - Protobuf — внешний транспортный контракт. Сгенерированные файлы в `proto/`
и Swagger вручную не редактируй. и Swagger вручную не редактируй.
- В protobuf используй `ID`, `<name>ID` и `URL` для полей с соответствующими
аббревиатурами. Генератор тогда создаёт `ID`, `GameID`, `URL` в Go и
`ID`, `gameID`, `URL` в TypeScript.
- Поля каждого `message` объявляй в порядке возрастания номеров. Номера уже
опубликованных полей не меняй и не переиспользуй; удалённые номера оставляй
зарезервированными.
- Новые HTTP-методы добавляй через `api/main.proto`, затем запускай генерацию - Новые HTTP-методы добавляй через `api/main.proto`, затем запускай генерацию
`make generate`. `make generate`.
- Преобразование `proto ↔ domain/storage` находится в `app` или пакете, - Преобразование `proto ↔ domain/storage` находится в `app` или пакете,
+3 -3
View File
@@ -13,7 +13,7 @@ import (
func (s *server) GetTeamAnswers(ctx context.Context, req *proto.GetTeamAnswersReq) (*proto.GetTeamAnswersRsp, error) { func (s *server) GetTeamAnswers(ctx context.Context, req *proto.GetTeamAnswersReq) (*proto.GetTeamAnswersRsp, error) {
answers, err := s.answerService.GetTeamAnswers( answers, err := s.answerService.GetTeamAnswers(
ctx, ctx,
int(req.Id), int(req.ID),
req.Password, req.Password,
) )
if err != nil { if err != nil {
@@ -30,7 +30,7 @@ func (s *server) GetTeamAnswers(ctx context.Context, req *proto.GetTeamAnswersRe
func (s *server) SubmitTeamAnswers(ctx context.Context, req *proto.SubmitTeamAnswersReq) (*proto.SubmitTeamAnswersRsp, error) { func (s *server) SubmitTeamAnswers(ctx context.Context, req *proto.SubmitTeamAnswersReq) (*proto.SubmitTeamAnswersRsp, error) {
err := s.answerService.SubmitTeamAnswers( err := s.answerService.SubmitTeamAnswers(
ctx, ctx,
int(req.Id), int(req.ID),
req.Password, req.Password,
convertAnswers(req.Answers), convertAnswers(req.Answers),
) )
@@ -60,7 +60,7 @@ func (s *server) SetTeamAnswerScore(ctx context.Context, req *proto.SetTeamAnswe
err := s.answerService.SetTeamAnswerScore( err := s.answerService.SetTeamAnswerScore(
ctx, ctx,
int(req.Id), int(req.ID),
req.QuestionCode, req.QuestionCode,
score, score,
) )
+2 -2
View File
@@ -35,7 +35,7 @@ func TestChangeUserPasswordAccess(t *testing.T) {
{ctxWithClaims("author"), codes.PermissionDenied}, {ctxWithClaims("author"), codes.PermissionDenied},
{ctxWithClaims("organizer"), codes.PermissionDenied}, {ctxWithClaims("organizer"), codes.PermissionDenied},
} { } {
_, err := s.ChangeUserPassword(tc.ctx, &proto.ChangeUserPasswordReq{Id: 2, NewPassword: "123456789012"}) _, err := s.ChangeUserPassword(tc.ctx, &proto.ChangeUserPasswordReq{ID: 2, NewPassword: "123456789012"})
if status.Code(err) != tc.want { if status.Code(err) != tc.want {
t.Errorf("code = %v, want %v", status.Code(err), tc.want) t.Errorf("code = %v, want %v", status.Code(err), tc.want)
} }
@@ -116,7 +116,7 @@ func TestChangeUserPasswordTransports(t *testing.T) {
} }
rpcCtx = metadata.NewOutgoingContext(ctx, metadata.Pairs("authorization", "Bearer "+token)) rpcCtx = metadata.NewOutgoingContext(ctx, metadata.Pairs("authorization", "Bearer "+token))
} }
_, err := client.ChangeUserPassword(rpcCtx, &proto.ChangeUserPasswordReq{Id: tc.id, NewPassword: tc.password}) _, err := client.ChangeUserPassword(rpcCtx, &proto.ChangeUserPasswordReq{ID: tc.id, NewPassword: tc.password})
if status.Code(err) != tc.code { if status.Code(err) != tc.code {
t.Fatalf("gRPC = %v, want %v", err, tc.code) t.Fatalf("gRPC = %v, want %v", err, tc.code)
} }
+11 -11
View File
@@ -15,34 +15,34 @@ func (s *server) GetGameMap(ctx context.Context, req *proto.GetGameMapReq) (*pro
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 { if req == nil || req.GameID <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры")
} }
game, err := s.gameService.GetFullGame(ctx, int(req.GameId)) game, err := s.gameService.GetFullGame(ctx, int(req.GameID))
if err != nil { if err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена") return nil, status.Error(codes.NotFound, "игра не найдена")
} }
if err := s.mapRepo.Ensure(ctx, int(req.GameId), "organizer_desk", 1); err != nil { if err := s.mapRepo.Ensure(ctx, int(req.GameID), "organizer_desk", 1); err != nil {
return nil, status.Error(codes.Internal, "не удалось сохранить карту") return nil, status.Error(codes.Internal, "не удалось сохранить карту")
} }
for _, team := range game.Teams { for _, team := range game.Teams {
if team.ParticipationStatus == "cancelled" { if team.ParticipationStatus == "cancelled" {
continue continue
} }
if err := s.mapRepo.Ensure(ctx, int(req.GameId), "team", team.ID); err != nil { if err := s.mapRepo.Ensure(ctx, int(req.GameID), "team", team.ID); err != nil {
return nil, status.Error(codes.Internal, "не удалось сохранить карту") return nil, status.Error(codes.Internal, "не удалось сохранить карту")
} }
} }
screens, err := s.screenRepo.ListByGame(ctx, int(req.GameId)) screens, err := s.screenRepo.ListByGame(ctx, int(req.GameID))
if err != nil { if err != nil {
return nil, status.Error(codes.Internal, "не удалось получить экраны") return nil, status.Error(codes.Internal, "не удалось получить экраны")
} }
for _, screen := range screens { for _, screen := range screens {
if err := s.mapRepo.Ensure(ctx, int(req.GameId), "screen", screen.ID); err != nil { if err := s.mapRepo.Ensure(ctx, int(req.GameID), "screen", screen.ID); err != nil {
return nil, status.Error(codes.Internal, "не удалось сохранить карту") return nil, status.Error(codes.Internal, "не удалось сохранить карту")
} }
} }
items, err := s.mapRepo.List(ctx, int(req.GameId)) items, err := s.mapRepo.List(ctx, int(req.GameID))
if err != nil { if err != nil {
return nil, status.Error(codes.Internal, "не удалось получить карту") return nil, status.Error(codes.Internal, "не удалось получить карту")
} }
@@ -66,7 +66,7 @@ func (s *server) GetGameMap(ctx context.Context, req *proto.GetGameMapReq) (*pro
} }
continue continue
} }
mapped := &proto.MapItem{Kind: item.Kind, ItemId: int32(item.ItemID), X: int32(item.X), Y: int32(item.Y), Hidden: item.Hidden} mapped := &proto.MapItem{Kind: item.Kind, ItemID: int32(item.ItemID), X: int32(item.X), Y: int32(item.Y), Hidden: item.Hidden}
if item.Kind == "team" { if item.Kind == "team" {
mapped.Label = teamNames[item.ItemID] mapped.Label = teamNames[item.ItemID]
} }
@@ -74,7 +74,7 @@ func (s *server) GetGameMap(ctx context.Context, req *proto.GetGameMapReq) (*pro
mapped.Label = "Стол организаторов" mapped.Label = "Стол организаторов"
} }
if state := screenStates[item.ItemID]; item.Kind == "screen" && state != nil { if state := screenStates[item.ItemID]; item.Kind == "screen" && state != nil {
mapped.Label = "Экран " + state.Id mapped.Label = "Экран " + state.ID
mapped.Status = state.Status mapped.Status = state.Status
mapped.SoundEnabled = state.SoundEnabled mapped.SoundEnabled = state.SoundEnabled
} }
@@ -87,10 +87,10 @@ func (s *server) UpdateGameMapItem(ctx context.Context, req *proto.UpdateGameMap
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 || req.ItemId <= 0 || (req.Kind != "team" && req.Kind != "screen" && req.Kind != "organizer_desk") { if req == nil || req.GameID <= 0 || req.ItemID <= 0 || (req.Kind != "team" && req.Kind != "screen" && req.Kind != "organizer_desk") {
return nil, status.Error(codes.InvalidArgument, "некорректный объект карты") return nil, status.Error(codes.InvalidArgument, "некорректный объект карты")
} }
if err := s.mapRepo.Update(ctx, game_map_repo.Item{GameID: int(req.GameId), Kind: req.Kind, ItemID: int(req.ItemId), X: int(req.X), Y: int(req.Y), Hidden: req.Hidden}); err != nil { if err := s.mapRepo.Update(ctx, game_map_repo.Item{GameID: int(req.GameID), Kind: req.Kind, ItemID: int(req.ItemID), X: int(req.X), Y: int(req.Y), Hidden: req.Hidden}); err != nil {
if errors.Is(err, game_map_repo.ErrItemNotFound) { if errors.Is(err, game_map_repo.ErrItemNotFound) {
return nil, status.Error(codes.NotFound, "объект карты не найден") return nil, status.Error(codes.NotFound, "объект карты не найден")
} }
+1 -1
View File
@@ -28,7 +28,7 @@ func mapGame(
teams = append(teams, mapTeamDetails(team)) teams = append(teams, mapTeamDetails(team))
} }
return &proto.Game{ return &proto.Game{
Id: int32(o.ID), ID: int32(o.ID),
Name: o.Name, Name: o.Name,
Description: o.Description, Description: o.Description,
Location: location, Location: location,
+6 -6
View File
@@ -12,7 +12,7 @@ import (
) )
func mapGameReview(r *game_reviews_repo.Review) *proto.GameReview { func mapGameReview(r *game_reviews_repo.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} 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_reviews_repo.Review) []*proto.GameReview { func mapGameReviews(reviews []*game_reviews_repo.Review) []*proto.GameReview {
@@ -24,7 +24,7 @@ func mapGameReviews(reviews []*game_reviews_repo.Review) []*proto.GameReview {
} }
func (s *server) CreateGameReview(ctx context.Context, req *proto.CreateGameReviewReq) (*proto.CreateGameReviewRsp, error) { 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) review, err := s.reviewService.Create(ctx, int(req.GameID), int(req.TeamID), req.Password, req.Rating, req.Text)
if err != nil { if err != nil {
return &proto.CreateGameReviewRsp{Error: err.Error()}, nil return &proto.CreateGameReviewRsp{Error: err.Error()}, nil
} }
@@ -32,7 +32,7 @@ func (s *server) CreateGameReview(ctx context.Context, req *proto.CreateGameRevi
} }
func (s *server) GetGameReviews(ctx context.Context, req *proto.GetGameReviewsReq) (*proto.GetGameReviewsRsp, error) { 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) reviews, average, count, err := s.reviewService.List(ctx, int(req.GameID), false)
if err != nil { if err != nil {
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
} }
@@ -40,7 +40,7 @@ func (s *server) GetGameReviews(ctx context.Context, req *proto.GetGameReviewsRe
} }
func (s *server) GetScenarioReviews(ctx context.Context, req *proto.GetScenarioReviewsReq) (*proto.GetGameReviewsRsp, error) { func (s *server) GetScenarioReviews(ctx context.Context, req *proto.GetScenarioReviewsReq) (*proto.GetGameReviewsRsp, error) {
reviews, average, count, err := s.reviewService.ListByScenario(ctx, int(req.ScenarioId)) reviews, average, count, err := s.reviewService.ListByScenario(ctx, int(req.ScenarioID))
if err != nil { if err != nil {
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
} }
@@ -55,7 +55,7 @@ func (s *server) GetGameReviewsForModeration(ctx context.Context, req *proto.Get
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
reviews, average, count, err := s.reviewService.List(ctx, int(req.GameId), true) reviews, average, count, err := s.reviewService.List(ctx, int(req.GameID), true)
if err != nil { if err != nil {
return &proto.GetGameReviewsRsp{Error: err.Error()}, nil return &proto.GetGameReviewsRsp{Error: err.Error()}, nil
} }
@@ -85,7 +85,7 @@ func (s *server) ModerateGameReview(ctx context.Context, req *proto.ModerateGame
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
review, err := s.reviewService.Moderate(ctx, int(req.Id), req.Status) review, err := s.reviewService.Moderate(ctx, int(req.ID), req.Status)
if err != nil { if err != nil {
return &proto.ModerateGameReviewRsp{Error: err.Error()}, nil return &proto.ModerateGameReviewRsp{Error: err.Error()}, nil
} }
+13 -13
View File
@@ -36,7 +36,7 @@ func (s *server) AddGame(ctx context.Context, req *proto.AddGameReq) (*proto.Add
req.Description, req.Description,
nilIfEmpty(req.Location), nilIfEmpty(req.Location),
req.StartAt.AsTime(), req.StartAt.AsTime(),
req.ScenarioId, req.ScenarioID,
req.Format, req.Format,
) )
if err != nil { if err != nil {
@@ -46,7 +46,7 @@ func (s *server) AddGame(ctx context.Context, req *proto.AddGameReq) (*proto.Add
} }
return &proto.AddGameRsp{ return &proto.AddGameRsp{
Id: int32(id), ID: int32(id),
}, nil }, nil
} }
@@ -61,7 +61,7 @@ func (s *server) DeleteGame(ctx context.Context, req *proto.DeleteGameReq) (*pro
err := s.gameService.DeleteGame( err := s.gameService.DeleteGame(
ctx, ctx,
int(req.Id), int(req.ID),
) )
if err != nil { if err != nil {
return &proto.DeleteGameRsp{ return &proto.DeleteGameRsp{
@@ -81,7 +81,7 @@ func (s *server) GetGame(ctx context.Context, req *proto.GetGameReq) (*proto.Get
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
game, err := s.gameService.GetFullGame(ctx, int(req.Id)) game, err := s.gameService.GetFullGame(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.GetGameRsp{ return &proto.GetGameRsp{
Error: err.Error(), Error: err.Error(),
@@ -102,7 +102,7 @@ func (s *server) GetGameAnswers(ctx context.Context, req *proto.GetGameAnswersRe
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
gameAnswers, err := s.answerService.GetGameAnswers(ctx, int(req.GameId)) gameAnswers, err := s.answerService.GetGameAnswers(ctx, int(req.GameID))
if err != nil { if err != nil {
return &proto.GetGameAnswersRsp{ return &proto.GetGameAnswersRsp{
Error: err.Error(), Error: err.Error(),
@@ -124,7 +124,7 @@ func (s *server) GetGameResults(ctx context.Context, req *proto.GetGameResultsRe
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
results, err := s.answerService.GetGameResults(ctx, int(req.GameId)) results, err := s.answerService.GetGameResults(ctx, int(req.GameID))
if err != nil { if err != nil {
return &proto.GetGameResultsRsp{ return &proto.GetGameResultsRsp{
Error: err.Error(), Error: err.Error(),
@@ -173,12 +173,12 @@ func (s *server) UpdateGame(ctx context.Context, req *proto.UpdateGameReq) (*pro
err := s.gameService.UpdateGame( err := s.gameService.UpdateGame(
ctx, ctx,
int(req.Id), int(req.ID),
req.Name, req.Name,
req.Description, req.Description,
nilIfEmpty(req.Location), nilIfEmpty(req.Location),
req.StartAt.AsTime(), req.StartAt.AsTime(),
req.ScenarioId, req.ScenarioID,
req.Format, req.Format,
) )
if err != nil { if err != nil {
@@ -199,7 +199,7 @@ func (s *server) StartGame(ctx context.Context, req *proto.StartGameReq) (*proto
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
err := s.gameService.StartGame(ctx, int(req.Id)) err := s.gameService.StartGame(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.StartGameRsp{ return &proto.StartGameRsp{
Error: err.Error(), Error: err.Error(),
@@ -218,7 +218,7 @@ func (s *server) PauseGame(ctx context.Context, req *proto.PauseGameReq) (*proto
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
err := s.gameService.PauseGame(ctx, int(req.Id)) err := s.gameService.PauseGame(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.PauseGameRsp{ return &proto.PauseGameRsp{
Error: err.Error(), Error: err.Error(),
@@ -237,7 +237,7 @@ func (s *server) PlayGame(ctx context.Context, req *proto.PlayGameReq) (*proto.P
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
err := s.gameService.PlayGame(ctx, int(req.Id)) err := s.gameService.PlayGame(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.PlayGameRsp{ return &proto.PlayGameRsp{
Error: err.Error(), Error: err.Error(),
@@ -256,7 +256,7 @@ func (s *server) FinishGame(ctx context.Context, req *proto.FinishGameReq) (*pro
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
err := s.gameService.FinishGame(ctx, int(req.Id)) err := s.gameService.FinishGame(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.FinishGameRsp{ return &proto.FinishGameRsp{
Error: err.Error(), Error: err.Error(),
@@ -275,7 +275,7 @@ func (s *server) ResetGame(ctx context.Context, req *proto.ResetGameReq) (*proto
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
err := s.gameService.ResetGame(ctx, int(req.Id)) err := s.gameService.ResetGame(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.ResetGameRsp{ return &proto.ResetGameRsp{
Error: err.Error(), Error: err.Error(),
+1 -1
View File
@@ -30,7 +30,7 @@ func TestMapTeamResults(t *testing.T) {
t.Fatalf("len(mapTeamResults) = %d, want 1", len(got)) t.Fatalf("len(mapTeamResults) = %d, want 1", len(got))
} }
row := got[0] row := got[0]
if row.Team == nil || row.Team.Id != 1 || row.Team.Name != "Команда А" { if row.Team == nil || row.Team.ID != 1 || row.Team.Name != "Команда А" {
t.Fatalf("row.Team = %+v, want id 1, name Команда А", row.Team) t.Fatalf("row.Team = %+v, want id 1, name Команда А", row.Team)
} }
// actionsCount продублирован на уровне строки таблицы. // actionsCount продублирован на уровне строки таблицы.
+2 -2
View File
@@ -31,7 +31,7 @@ func (s *server) DownloadScenarioArchive(ctx context.Context, req *proto.Downloa
data, name, err := s.scenarioService.DownloadArchive( data, name, err := s.scenarioService.DownloadArchive(
ctx, ctx,
int(req.Id), int(req.ID),
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
) )
@@ -85,7 +85,7 @@ func (s *server) UploadScenarioArchive(ctx context.Context, req *httpbody.HttpBo
}, nil }, nil
} }
return &proto.UploadScenarioArchiveRsp{ return &proto.UploadScenarioArchiveRsp{
Id: int32(id), ID: int32(id),
}, nil }, nil
} }
+9 -9
View File
@@ -21,7 +21,7 @@ func (s *server) AddScenarioPlace(ctx context.Context, req *proto.AddScenarioPla
err := s.scenarioService.AddScenarioPlace( err := s.scenarioService.AddScenarioPlace(
ctx, ctx,
int(req.Id), int(req.ID),
convertPlace(req.Place), convertPlace(req.Place),
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
@@ -46,7 +46,7 @@ func (s *server) UpdateScenarioPlace(ctx context.Context, req *proto.UpdateScena
err := s.scenarioService.UpdateScenarioPlace( err := s.scenarioService.UpdateScenarioPlace(
ctx, ctx,
int(req.Id), int(req.ID),
req.Code, req.Code,
convertPlace(req.Place), convertPlace(req.Place),
claims.UserID, claims.UserID,
@@ -72,7 +72,7 @@ func (s *server) DeleteScenarioPlace(ctx context.Context, req *proto.DeleteScena
err := s.scenarioService.DeleteScenarioPlace( err := s.scenarioService.DeleteScenarioPlace(
ctx, ctx,
int(req.Id), int(req.ID),
req.Code, req.Code,
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
@@ -97,7 +97,7 @@ func (s *server) AddScenarioQuestion(ctx context.Context, req *proto.AddScenario
err := s.scenarioService.AddScenarioQuestion( err := s.scenarioService.AddScenarioQuestion(
ctx, ctx,
int(req.Id), int(req.ID),
convertQuestion(req.Question), convertQuestion(req.Question),
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
@@ -122,7 +122,7 @@ func (s *server) UpdateScenarioQuestion(ctx context.Context, req *proto.UpdateSc
err := s.scenarioService.UpdateScenarioQuestion( err := s.scenarioService.UpdateScenarioQuestion(
ctx, ctx,
int(req.Id), int(req.ID),
req.Code, req.Code,
convertQuestion(req.Question), convertQuestion(req.Question),
claims.UserID, claims.UserID,
@@ -148,7 +148,7 @@ func (s *server) DeleteScenarioQuestion(ctx context.Context, req *proto.DeleteSc
err := s.scenarioService.DeleteScenarioQuestion( err := s.scenarioService.DeleteScenarioQuestion(
ctx, ctx,
int(req.Id), int(req.ID),
req.Code, req.Code,
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
@@ -173,7 +173,7 @@ func (s *server) UpdateScenarioBackground(ctx context.Context, req *proto.Update
err := s.scenarioService.UpdateScenarioBackground( err := s.scenarioService.UpdateScenarioBackground(
ctx, ctx,
int(req.Id), int(req.ID),
req.Background, req.Background,
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
@@ -198,7 +198,7 @@ func (s *server) UpdateScenarioIntro(ctx context.Context, req *proto.UpdateScena
err := s.scenarioService.UpdateScenarioIntro( err := s.scenarioService.UpdateScenarioIntro(
ctx, ctx,
int(req.Id), int(req.ID),
convertIntroduction(req.Introduction), convertIntroduction(req.Introduction),
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
@@ -220,7 +220,7 @@ func (s *server) UpdateScenarioConclusion(ctx context.Context, req *proto.Update
if !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Author) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
if err := s.scenarioService.UpdateScenarioConclusion(ctx, int(req.Id), convertConclusion(req.Conclusion), claims.UserID, roles.HasRole(claims, roles.Admin)); err != nil { if err := s.scenarioService.UpdateScenarioConclusion(ctx, int(req.ID), convertConclusion(req.Conclusion), claims.UserID, roles.HasRole(claims, roles.Admin)); err != nil {
return &proto.UpdateScenarioConclusionRsp{Error: err.Error()}, nil return &proto.UpdateScenarioConclusionRsp{Error: err.Error()}, nil
} }
return &proto.UpdateScenarioConclusionRsp{}, nil return &proto.UpdateScenarioConclusionRsp{}, nil
+7 -7
View File
@@ -27,7 +27,7 @@ func (s *server) AddScenario(ctx context.Context, req *proto.AddScenarioReq) (*p
}, nil }, nil
} }
return &proto.AddScenarioRsp{ return &proto.AddScenarioRsp{
Id: int32(id), ID: int32(id),
}, nil }, nil
} }
@@ -77,7 +77,7 @@ func (s *server) GetFullScenario(ctx context.Context, req *proto.GetScenarioReq)
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
scenario, err := s.scenarioService.GetFullScenarioByID(ctx, int(req.Id)) scenario, err := s.scenarioService.GetFullScenarioByID(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.GetScenarioRsp{ return &proto.GetScenarioRsp{
Error: err.Error(), Error: err.Error(),
@@ -90,7 +90,7 @@ func (s *server) GetFullScenario(ctx context.Context, req *proto.GetScenarioReq)
} }
func (s *server) GetScenario(ctx context.Context, req *proto.GetScenarioReq) (*proto.GetScenarioRsp, error) { func (s *server) GetScenario(ctx context.Context, req *proto.GetScenarioReq) (*proto.GetScenarioRsp, error) {
scenario, err := s.scenarioService.GetScenarioByID(ctx, int(req.Id)) scenario, err := s.scenarioService.GetScenarioByID(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.GetScenarioRsp{ return &proto.GetScenarioRsp{
Error: err.Error(), Error: err.Error(),
@@ -128,7 +128,7 @@ func (s *server) UpdateScenario(ctx context.Context, req *proto.UpdateScenarioRe
err := s.scenarioService.UpdateScenarioByID( err := s.scenarioService.UpdateScenarioByID(
ctx, ctx,
int(req.Id), int(req.ID),
req.Name, req.Name,
req.Description, req.Description,
req.Image, req.Image,
@@ -155,7 +155,7 @@ func (s *server) PublicScenario(ctx context.Context, req *proto.PublicScenarioRe
err := s.scenarioService.UpdateScenarioStatusByID( err := s.scenarioService.UpdateScenarioStatusByID(
ctx, ctx,
int(req.Id), int(req.ID),
"public", "public",
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), // публикация = момент отчуждения прав roles.HasRole(claims, roles.Admin), // публикация = момент отчуждения прав
@@ -183,7 +183,7 @@ func (s *server) DraftScenario(ctx context.Context, req *proto.DraftScenarioReq)
err := s.scenarioService.UpdateScenarioStatusByID( err := s.scenarioService.UpdateScenarioStatusByID(
ctx, ctx,
int(req.Id), int(req.ID),
"draft", "draft",
claims.UserID, claims.UserID,
true, true,
@@ -210,7 +210,7 @@ func (s *server) DeleteScenario(ctx context.Context, req *proto.DeleteScenarioRe
// отчуждено); админ может. // отчуждено); админ может.
err := s.scenarioService.DeleteScenarioByID( err := s.scenarioService.DeleteScenarioByID(
ctx, ctx,
int(req.Id), int(req.ID),
claims.UserID, claims.UserID,
roles.HasRole(claims, roles.Admin), roles.HasRole(claims, roles.Admin),
) )
+28 -28
View File
@@ -26,14 +26,14 @@ func (s *server) CreateScreenSession(ctx context.Context, _ *proto.CreateScreenS
if err != nil { if err != nil {
return nil, status.Error(codes.Internal, "не удалось создать сессию экрана") return nil, status.Error(codes.Internal, "не удалось создать сессию экрана")
} }
return &proto.CreateScreenSessionRsp{ScreenId: fmt.Sprint(id), AccessToken: token}, nil return &proto.CreateScreenSessionRsp{ScreenID: fmt.Sprint(id), AccessToken: token}, nil
} }
func (s *server) GetScreenState(ctx context.Context, req *proto.GetScreenStateReq) (*proto.GetScreenStateRsp, error) { func (s *server) GetScreenState(ctx context.Context, req *proto.GetScreenStateReq) (*proto.GetScreenStateRsp, error) {
if req == nil || req.ScreenId == "" || req.AccessToken == "" { if req == nil || req.ScreenID == "" || req.AccessToken == "" {
return nil, status.Error(codes.InvalidArgument, "некорректные данные экрана") return nil, status.Error(codes.InvalidArgument, "некорректные данные экрана")
} }
id, err := strconv.Atoi(req.ScreenId) id, err := strconv.Atoi(req.ScreenID)
if err != nil || id <= 0 { if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
@@ -53,13 +53,13 @@ func (s *server) GetGameScreens(ctx context.Context, req *proto.GetGameScreensRe
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 { if req == nil || req.GameID <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры")
} }
if _, err := s.gameService.GetGame(ctx, int(req.GameId)); err != nil { if _, err := s.gameService.GetGame(ctx, int(req.GameID)); err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена") return nil, status.Error(codes.NotFound, "игра не найдена")
} }
sessions, err := s.screenRepo.ListByGame(ctx, int(req.GameId)) sessions, err := s.screenRepo.ListByGame(ctx, int(req.GameID))
if err != nil { if err != nil {
return nil, status.Error(codes.Internal, "не удалось получить экраны игры") return nil, status.Error(codes.Internal, "не удалось получить экраны игры")
} }
@@ -76,18 +76,18 @@ func (s *server) BindScreen(ctx context.Context, req *proto.BindScreenReq) (*pro
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.ScreenId == "" || req.AccessToken == "" || req.GameId <= 0 { if req == nil || req.ScreenID == "" || req.AccessToken == "" || req.GameID <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректные данные привязки") return nil, status.Error(codes.InvalidArgument, "некорректные данные привязки")
} }
id, err := strconv.Atoi(req.ScreenId) id, err := strconv.Atoi(req.ScreenID)
if err != nil || id <= 0 { if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
if _, err = s.gameService.GetGame(ctx, int(req.GameId)); err != nil { if _, err = s.gameService.GetGame(ctx, int(req.GameID)); err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена") return nil, status.Error(codes.NotFound, "игра не найдена")
} }
hash := hashScreenToken(req.AccessToken) hash := hashScreenToken(req.AccessToken)
if err = s.screenRepo.Bind(ctx, id, int(req.GameId), hash); err != nil { if err = s.screenRepo.Bind(ctx, id, int(req.GameID), hash); err != nil {
if errors.Is(err, screen_sessions_repo.ErrScreenNotFound) { if errors.Is(err, screen_sessions_repo.ErrScreenNotFound) {
return nil, status.Error(codes.Unauthenticated, "недействительная сессия экрана") return nil, status.Error(codes.Unauthenticated, "недействительная сессия экрана")
} }
@@ -106,10 +106,10 @@ func (s *server) UnbindScreen(ctx context.Context, req *proto.UnbindScreenReq) (
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.ScreenId == "" { if req == nil || req.ScreenID == "" {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
id, err := strconv.Atoi(req.ScreenId) id, err := strconv.Atoi(req.ScreenID)
if err != nil || id <= 0 { if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
@@ -126,10 +126,10 @@ func (s *server) SetScreenSound(ctx context.Context, req *proto.SetScreenSoundRe
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.ScreenId == "" { if req == nil || req.ScreenID == "" {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
id, err := strconv.Atoi(req.ScreenId) id, err := strconv.Atoi(req.ScreenID)
if err != nil || id <= 0 { if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
@@ -167,7 +167,7 @@ func screenState(session *screen_sessions_repo.ScreenSession) *proto.ScreenState
} }
} }
state := &proto.ScreenState{ state := &proto.ScreenState{
Id: fmt.Sprint(session.ID), ID: fmt.Sprint(session.ID),
Status: "disconnected", Status: "disconnected",
SoundEnabled: session.Sound, SoundEnabled: session.Sound,
Mode: proto.ScreenMode(session.Mode), Mode: proto.ScreenMode(session.Mode),
@@ -185,7 +185,7 @@ func screenState(session *screen_sessions_repo.ScreenSession) *proto.ScreenState
} }
if session.GameID != nil { if session.GameID != nil {
gameID := int32(*session.GameID) gameID := int32(*session.GameID)
state.GameId = &gameID state.GameID = &gameID
if state.Mode == proto.ScreenMode_SCREEN_MODE_UNSPECIFIED { if state.Mode == proto.ScreenMode_SCREEN_MODE_UNSPECIFIED {
state.Mode = proto.ScreenMode_SCREEN_MODE_COVER state.Mode = proto.ScreenMode_SCREEN_MODE_COVER
} }
@@ -223,13 +223,13 @@ func (s *server) SetScreenMode(ctx context.Context, req *proto.SetScreenModeReq)
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 || req.Mode == proto.ScreenMode_SCREEN_MODE_UNSPECIFIED { if req == nil || req.GameID <= 0 || req.Mode == proto.ScreenMode_SCREEN_MODE_UNSPECIFIED {
return nil, status.Error(codes.InvalidArgument, "некорректный режим экрана") return nil, status.Error(codes.InvalidArgument, "некорректный режим экрана")
} }
if _, err := s.gameService.GetGame(ctx, int(req.GameId)); err != nil { if _, err := s.gameService.GetGame(ctx, int(req.GameID)); err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена") return nil, status.Error(codes.NotFound, "игра не найдена")
} }
if err := s.screenRepo.SetMode(ctx, int(req.GameId), int32(req.Mode)); err != nil { if err := s.screenRepo.SetMode(ctx, int(req.GameID), int32(req.Mode)); err != nil {
return nil, status.Error(codes.Internal, "не удалось изменить режим экранов") return nil, status.Error(codes.Internal, "не удалось изменить режим экранов")
} }
return &proto.SetScreenModeRsp{}, nil return &proto.SetScreenModeRsp{}, nil
@@ -239,7 +239,7 @@ func (s *server) SetScreenTimer(ctx context.Context, req *proto.SetScreenTimerRe
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 || req.DurationSeconds <= 0 || req.DurationSeconds > 24*60*60 { if req == nil || req.GameID <= 0 || req.DurationSeconds <= 0 || req.DurationSeconds > 24*60*60 {
return nil, status.Error(codes.InvalidArgument, "некорректные параметры таймера") return nil, status.Error(codes.InvalidArgument, "некорректные параметры таймера")
} }
label := strings.TrimSpace(req.Label) label := strings.TrimSpace(req.Label)
@@ -249,10 +249,10 @@ func (s *server) SetScreenTimer(ctx context.Context, req *proto.SetScreenTimerRe
if len(label) > 200 { if len(label) > 200 {
return nil, status.Error(codes.InvalidArgument, "слишком длинная надпись таймера") return nil, status.Error(codes.InvalidArgument, "слишком длинная надпись таймера")
} }
if _, err := s.gameService.GetGame(ctx, int(req.GameId)); err != nil { if _, err := s.gameService.GetGame(ctx, int(req.GameID)); err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена") return nil, status.Error(codes.NotFound, "игра не найдена")
} }
if err := s.screenRepo.SetTimer(ctx, int(req.GameId), req.DurationSeconds, label); err != nil { if err := s.screenRepo.SetTimer(ctx, int(req.GameID), req.DurationSeconds, label); err != nil {
return nil, status.Error(codes.Internal, "не удалось настроить таймер экранов") return nil, status.Error(codes.Internal, "не удалось настроить таймер экранов")
} }
return &proto.SetScreenTimerRsp{}, nil return &proto.SetScreenTimerRsp{}, nil
@@ -262,14 +262,14 @@ func (s *server) SendScreenCommand(ctx context.Context, req *proto.SendScreenCom
if !canManageScreens(ctx) { if !canManageScreens(ctx) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 || req.Command == proto.ScreenCommand_SCREEN_COMMAND_UNSPECIFIED { if req == nil || req.GameID <= 0 || req.Command == proto.ScreenCommand_SCREEN_COMMAND_UNSPECIFIED {
return nil, status.Error(codes.InvalidArgument, "некорректная команда экрана") return nil, status.Error(codes.InvalidArgument, "некорректная команда экрана")
} }
if _, err := s.gameService.GetGame(ctx, int(req.GameId)); err != nil { if _, err := s.gameService.GetGame(ctx, int(req.GameID)); err != nil {
return nil, status.Error(codes.NotFound, "игра не найдена") return nil, status.Error(codes.NotFound, "игра не найдена")
} }
if isTimerCommand(req.Command) { if isTimerCommand(req.Command) {
if err := s.screenRepo.SetTimerCommand(ctx, int(req.GameId), int32(req.Command)); err != nil { if err := s.screenRepo.SetTimerCommand(ctx, int(req.GameID), int32(req.Command)); err != nil {
return nil, status.Error(codes.Internal, "не удалось выполнить команду таймера") return nil, status.Error(codes.Internal, "не удалось выполнить команду таймера")
} }
return &proto.SendScreenCommandRsp{}, nil return &proto.SendScreenCommandRsp{}, nil
@@ -280,7 +280,7 @@ func (s *server) SendScreenCommand(ctx context.Context, req *proto.SendScreenCom
if req.Volume < 0 || req.Volume > 100 { if req.Volume < 0 || req.Volume > 100 {
return nil, status.Error(codes.InvalidArgument, "некорректная громкость") return nil, status.Error(codes.InvalidArgument, "некорректная громкость")
} }
if err := s.screenRepo.SetCommand(ctx, int(req.GameId), int32(req.Command), req.PositionMs, req.Volume); err != nil { if err := s.screenRepo.SetCommand(ctx, int(req.GameID), int32(req.Command), req.PositionMs, req.Volume); err != nil {
return nil, status.Error(codes.Internal, "не удалось сохранить позицию экранов") return nil, status.Error(codes.Internal, "не удалось сохранить позицию экранов")
} }
return &proto.SendScreenCommandRsp{}, nil return &proto.SendScreenCommandRsp{}, nil
@@ -291,10 +291,10 @@ func isTimerCommand(command proto.ScreenCommand) bool {
} }
func (s *server) GetScreenResults(ctx context.Context, req *proto.GetScreenResultsReq) (*proto.GetScreenResultsRsp, error) { func (s *server) GetScreenResults(ctx context.Context, req *proto.GetScreenResultsReq) (*proto.GetScreenResultsRsp, error) {
if req == nil || req.ScreenId == "" || req.AccessToken == "" { if req == nil || req.ScreenID == "" || req.AccessToken == "" {
return nil, status.Error(codes.InvalidArgument, "некорректные данные экрана") return nil, status.Error(codes.InvalidArgument, "некорректные данные экрана")
} }
id, err := strconv.Atoi(req.ScreenId) id, err := strconv.Atoi(req.ScreenID)
if err != nil || id <= 0 { if err != nil || id <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор экрана")
} }
+1 -1
View File
@@ -26,7 +26,7 @@ func mapScenario(o *scenarios_service.Scenario) *proto.Scenario {
publishedAt = timestamppb.New(*o.PublishedAt) publishedAt = timestamppb.New(*o.PublishedAt)
} }
return &proto.Scenario{ return &proto.Scenario{
Id: int32(o.ID), ID: int32(o.ID),
Name: o.Name, Name: o.Name,
Description: o.Description, Description: o.Description,
Image: o.Image, Image: o.Image,
+1 -1
View File
@@ -9,7 +9,7 @@ func mapTeam(
o *game_model.Team, o *game_model.Team,
) *proto.Team { ) *proto.Team {
return &proto.Team{ return &proto.Team{
Id: int32(o.ID), ID: int32(o.ID),
Name: o.Name, Name: o.Name,
Status: o.Status, Status: o.Status,
Password: o.Password, Password: o.Password,
+2 -2
View File
@@ -26,10 +26,10 @@ func (s *server) DownloadTeamQR(ctx context.Context, req *proto.GetGameReq) (*ht
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.Id <= 0 { if req == nil || req.ID <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры")
} }
data, filename, err := s.teamService.DownloadTeamQR(ctx, int(req.Id)) data, filename, err := s.teamService.DownloadTeamQR(ctx, int(req.ID))
if err != nil { if err != nil {
switch { switch {
case errors.Is(err, games_repo.ErrGameNotFound): case errors.Is(err, games_repo.ErrGameNotFound):
+1 -1
View File
@@ -22,7 +22,7 @@ func TestDownloadTeamQRAccess(t *testing.T) {
{ctxWithClaims("author"), -1, codes.InvalidArgument}, {ctxWithClaims("author"), -1, codes.InvalidArgument},
{ctxWithClaims("admin"), 0, codes.InvalidArgument}, {ctxWithClaims("admin"), 0, codes.InvalidArgument},
} { } {
_, err := s.DownloadTeamQR(tc.ctx, &proto.GetGameReq{Id: tc.id}) _, err := s.DownloadTeamQR(tc.ctx, &proto.GetGameReq{ID: tc.id})
if status.Code(err) != tc.want { if status.Code(err) != tc.want {
t.Errorf("code = %v, want %v", status.Code(err), tc.want) t.Errorf("code = %v, want %v", status.Code(err), tc.want)
} }
+8 -8
View File
@@ -22,7 +22,7 @@ func (s *server) AddTeam(ctx context.Context, req *proto.AddTeamReq) (*proto.Add
team, err := s.teamService.AddTeam( team, err := s.teamService.AddTeam(
ctx, ctx,
claims.UserID, claims.UserID,
int(req.GameId), int(req.GameID),
req.Name, req.Name,
req.CaptainEmail, req.CaptainEmail,
) )
@@ -33,7 +33,7 @@ func (s *server) AddTeam(ctx context.Context, req *proto.AddTeamReq) (*proto.Add
} }
return &proto.AddTeamRsp{ return &proto.AddTeamRsp{
Id: int32(team.ID), ID: int32(team.ID),
Password: team.Password, Password: team.Password,
}, nil }, nil
} }
@@ -49,7 +49,7 @@ func (s *server) UpdateTeam(ctx context.Context, req *proto.UpdateTeamReq) (*pro
err := s.teamService.UpdateTeam( err := s.teamService.UpdateTeam(
ctx, ctx,
int(req.Id), int(req.ID),
req.Name, req.Name,
) )
if err != nil { if err != nil {
@@ -72,7 +72,7 @@ func (s *server) DeleteTeam(ctx context.Context, req *proto.DeleteTeamReq) (*pro
err := s.teamService.DeleteTeam( err := s.teamService.DeleteTeam(
ctx, ctx,
int(req.Id), int(req.ID),
) )
if err != nil { if err != nil {
return &proto.DeleteTeamRsp{ return &proto.DeleteTeamRsp{
@@ -94,7 +94,7 @@ func (s *server) GiveTeamApplications(ctx context.Context, req *proto.GiveTeamAp
err := s.gameplayService.GiveTeamApplications( err := s.gameplayService.GiveTeamApplications(
ctx, ctx,
int(req.Id), int(req.ID),
req.Name, req.Name,
) )
if err != nil { if err != nil {
@@ -109,7 +109,7 @@ func (s *server) GiveTeamApplications(ctx context.Context, req *proto.GiveTeamAp
func (s *server) GetTeamStory(ctx context.Context, req *proto.GetTeamStoryReq) (*proto.GetTeamStoryRsp, error) { func (s *server) GetTeamStory(ctx context.Context, req *proto.GetTeamStoryReq) (*proto.GetTeamStoryRsp, error) {
story, game, actions, err := s.gameplayService.GetTeamActions( story, game, actions, err := s.gameplayService.GetTeamActions(
ctx, ctx,
int(req.Id), int(req.ID),
req.Password, req.Password,
) )
if err != nil { if err != nil {
@@ -132,7 +132,7 @@ func (s *server) GetTeamStory(ctx context.Context, req *proto.GetTeamStoryReq) (
func (s *server) AddTeamAction(ctx context.Context, req *proto.AddTeamActionReq) (*proto.AddTeamActionRsp, error) { func (s *server) AddTeamAction(ctx context.Context, req *proto.AddTeamActionReq) (*proto.AddTeamActionRsp, error) {
err := s.gameplayService.AddTeamAction( err := s.gameplayService.AddTeamAction(
ctx, ctx,
int(req.Id), int(req.ID),
req.Password, req.Password,
req.Code, req.Code,
false, false,
@@ -157,7 +157,7 @@ func (s *server) DeleteLastTeamAction(ctx context.Context, req *proto.DeleteLast
err := s.gameplayService.DeleteLastTeamAction( err := s.gameplayService.DeleteLastTeamAction(
ctx, ctx,
int(req.Id), int(req.ID),
) )
if err != nil { if err != nil {
return &proto.DeleteLastTeamActionRsp{ return &proto.DeleteLastTeamActionRsp{
+5 -5
View File
@@ -25,7 +25,7 @@ func (s *server) GetTicket(ctx context.Context, req *proto.GetTicketReq) (*proto
} }
result := &proto.TicketPage{ result := &proto.TicketPage{
Id: int32(page.ID), ID: int32(page.ID),
GameName: page.GameName, GameName: page.GameName,
StartAt: timestamppb.New(page.StartAt), StartAt: timestamppb.New(page.StartAt),
Status: page.Status, Status: page.Status,
@@ -55,7 +55,7 @@ func (s *server) AcceptTicket(ctx context.Context, req *proto.AcceptTicketReq) (
if err != nil { if err != nil {
return &proto.AcceptTicketRsp{Error: err.Error()}, nil return &proto.AcceptTicketRsp{Error: err.Error()}, nil
} }
result := &proto.TicketPage{Id: int32(page.ID), GameName: page.GameName, StartAt: timestamppb.New(page.StartAt), Status: page.Status, GameStatus: page.GameStatus} result := &proto.TicketPage{ID: int32(page.ID), GameName: page.GameName, StartAt: timestamppb.New(page.StartAt), Status: page.Status, GameStatus: page.GameStatus}
if page.Location != nil { if page.Location != nil {
result.Location = *page.Location result.Location = *page.Location
} }
@@ -76,18 +76,18 @@ func (s *server) IssueGameTickets(ctx context.Context, req *proto.IssueGameTicke
if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) { if !roles.HasRole(claims, roles.Organizer) && !roles.HasRole(claims, roles.Author) {
return nil, status.Error(codes.PermissionDenied, "permission denied") return nil, status.Error(codes.PermissionDenied, "permission denied")
} }
if req == nil || req.GameId <= 0 { if req == nil || req.GameID <= 0 {
return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры") return nil, status.Error(codes.InvalidArgument, "некорректный идентификатор игры")
} }
tickets, err := s.ticketService.Issue(ctx, int(req.GameId), int(req.Count)) tickets, err := s.ticketService.Issue(ctx, int(req.GameID), int(req.Count))
if err != nil { if err != nil {
return &proto.IssueGameTicketsRsp{Error: err.Error()}, nil return &proto.IssueGameTicketsRsp{Error: err.Error()}, nil
} }
result := make([]*proto.Ticket, 0, len(tickets)) result := make([]*proto.Ticket, 0, len(tickets))
for _, ticket := range tickets { for _, ticket := range tickets {
result = append(result, &proto.Ticket{Id: int32(ticket.ID), Url: ticket.URL}) result = append(result, &proto.Ticket{ID: int32(ticket.ID), URL: ticket.URL})
} }
return &proto.IssueGameTicketsRsp{Tickets: result}, nil return &proto.IssueGameTicketsRsp{Tickets: result}, nil
} }
+1 -1
View File
@@ -15,7 +15,7 @@ func mapUser(o *repos.User) *proto.User {
return nil return nil
} }
return &proto.User{ return &proto.User{
Id: int32(o.ID), ID: int32(o.ID),
Username: o.Username, Username: o.Username,
Email: o.Email, Email: o.Email,
Roles: o.Roles, Roles: o.Roles,
+1 -1
View File
@@ -27,7 +27,7 @@ func TestMapUser(t *testing.T) {
if got == nil { if got == nil {
t.Fatal("mapUser вернул nil для не-nil пользователя") t.Fatal("mapUser вернул nil для не-nil пользователя")
} }
if got.Id != 42 || got.Username != "detective" || got.Email != "d@example.com" { if got.ID != 42 || got.Username != "detective" || got.Email != "d@example.com" {
t.Errorf("неожиданный маппинг: %+v", got) t.Errorf("неожиданный маппинг: %+v", got)
} }
if len(got.Roles) != 1 || got.Roles[0] != "user" { if len(got.Roles) != 1 || got.Roles[0] != "user" {
+7 -7
View File
@@ -175,15 +175,15 @@ func (s *server) GetUsers(ctx context.Context, req *proto.GetUsersReq) (*proto.G
}, nil }, nil
} }
func (s *server) GetUserById(ctx context.Context, req *proto.GetUserByIdReq) (*proto.GetUserByIdRsp, error) { func (s *server) GetUserByID(ctx context.Context, req *proto.GetUserByIDReq) (*proto.GetUserByIDRsp, error) {
user, err := s.usersService.GetUserByID(ctx, int(req.Id)) user, err := s.usersService.GetUserByID(ctx, int(req.ID))
if err != nil { if err != nil {
return &proto.GetUserByIdRsp{ return &proto.GetUserByIDRsp{
Error: err.Error(), Error: err.Error(),
}, nil }, nil
} }
return &proto.GetUserByIdRsp{ return &proto.GetUserByIDRsp{
User: mapUser(user), User: mapUser(user),
}, nil }, nil
} }
@@ -213,7 +213,7 @@ func (s *server) AddUserRole(ctx context.Context, req *proto.AddUserRoleReq) (*p
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
if err := s.usersService.AddUserRole(ctx, int(req.Id), req.Role); err != nil { if err := s.usersService.AddUserRole(ctx, int(req.ID), req.Role); err != nil {
return &proto.AddUserRoleRsp{ return &proto.AddUserRoleRsp{
Error: err.Error(), Error: err.Error(),
}, nil }, nil
@@ -229,7 +229,7 @@ func (s *server) DeleteUserRole(ctx context.Context, req *proto.DeleteUserRoleRe
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Errorf(codes.PermissionDenied, "permission denied") return nil, status.Errorf(codes.PermissionDenied, "permission denied")
} }
if err := s.usersService.DeleteUserRole(ctx, int(req.Id), req.Role); err != nil { if err := s.usersService.DeleteUserRole(ctx, int(req.ID), req.Role); err != nil {
return &proto.DeleteUserRoleRsp{ return &proto.DeleteUserRoleRsp{
Error: err.Error(), Error: err.Error(),
}, nil }, nil
@@ -256,7 +256,7 @@ func (s *server) ChangeUserPassword(ctx context.Context, req *proto.ChangeUserPa
if !roles.HasRole(claims, roles.Admin) { if !roles.HasRole(claims, roles.Admin) {
return nil, status.Error(codes.PermissionDenied, "Недостаточно прав") return nil, status.Error(codes.PermissionDenied, "Недостаточно прав")
} }
err := s.usersService.ChangeUserPassword(ctx, claims.UserID, int(req.GetId()), req.GetNewPassword()) err := s.usersService.ChangeUserPassword(ctx, claims.UserID, int(req.GetID()), req.GetNewPassword())
switch { switch {
case errors.Is(err, users_service.ErrPasswordChangeForbidden): case errors.Is(err, users_service.ErrPasswordChangeForbidden):
return nil, status.Error(codes.PermissionDenied, err.Error()) return nil, status.Error(codes.PermissionDenied, err.Error())
+495 -488
View File
File diff suppressed because it is too large Load Diff
+628 -628
View File
File diff suppressed because it is too large Load Diff
+21 -15
View File
@@ -4,6 +4,12 @@
// - protoc v7.36.0 // - protoc v7.36.0
// source: main.proto // source: main.proto
// Contract rules:
// - fields inside each message are declared in ascending number order;
// - published field numbers are never renumbered or reused;
// - use ID, <name>ID and URL for abbreviation fields so generated clients
// keep the same naming convention across Go and TypeScript.
package proto package proto
import ( import (
@@ -33,7 +39,7 @@ const (
EveningDetectiveServer_GetPrivacy_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetPrivacy" EveningDetectiveServer_GetPrivacy_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetPrivacy"
EveningDetectiveServer_GetConsent_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetConsent" EveningDetectiveServer_GetConsent_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetConsent"
EveningDetectiveServer_GetUsers_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetUsers" EveningDetectiveServer_GetUsers_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetUsers"
EveningDetectiveServer_GetUserById_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetUserById" EveningDetectiveServer_GetUserByID_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetUserByID"
EveningDetectiveServer_GetMe_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetMe" EveningDetectiveServer_GetMe_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/GetMe"
EveningDetectiveServer_ChangeUserPassword_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/ChangeUserPassword" EveningDetectiveServer_ChangeUserPassword_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/ChangeUserPassword"
EveningDetectiveServer_AddUserRole_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/AddUserRole" EveningDetectiveServer_AddUserRole_FullMethodName = "/crabs.evening_detective_server.EveningDetectiveServer/AddUserRole"
@@ -124,7 +130,7 @@ type EveningDetectiveServerClient interface {
GetPrivacy(ctx context.Context, in *GetPrivacyReq, opts ...grpc.CallOption) (*GetPrivacyRsp, error) GetPrivacy(ctx context.Context, in *GetPrivacyReq, opts ...grpc.CallOption) (*GetPrivacyRsp, error)
GetConsent(ctx context.Context, in *GetConsentReq, opts ...grpc.CallOption) (*GetConsentRsp, error) GetConsent(ctx context.Context, in *GetConsentReq, opts ...grpc.CallOption) (*GetConsentRsp, error)
GetUsers(ctx context.Context, in *GetUsersReq, opts ...grpc.CallOption) (*GetUsersRsp, error) GetUsers(ctx context.Context, in *GetUsersReq, opts ...grpc.CallOption) (*GetUsersRsp, error)
GetUserById(ctx context.Context, in *GetUserByIdReq, opts ...grpc.CallOption) (*GetUserByIdRsp, error) GetUserByID(ctx context.Context, in *GetUserByIDReq, opts ...grpc.CallOption) (*GetUserByIDRsp, error)
GetMe(ctx context.Context, in *GetMeReq, opts ...grpc.CallOption) (*GetMeRsp, error) GetMe(ctx context.Context, in *GetMeReq, opts ...grpc.CallOption) (*GetMeRsp, error)
// Только администратор; сеансы пользователя сохраняются. // Только администратор; сеансы пользователя сохраняются.
// Ошибки: 401, 403, 400, 404, 500. // Ошибки: 401, 403, 400, 404, 500.
@@ -346,10 +352,10 @@ func (c *eveningDetectiveServerClient) GetUsers(ctx context.Context, in *GetUser
return out, nil return out, nil
} }
func (c *eveningDetectiveServerClient) GetUserById(ctx context.Context, in *GetUserByIdReq, opts ...grpc.CallOption) (*GetUserByIdRsp, error) { func (c *eveningDetectiveServerClient) GetUserByID(ctx context.Context, in *GetUserByIDReq, opts ...grpc.CallOption) (*GetUserByIDRsp, error) {
cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...) cOpts := append([]grpc.CallOption{grpc.StaticMethod()}, opts...)
out := new(GetUserByIdRsp) out := new(GetUserByIDRsp)
err := c.cc.Invoke(ctx, EveningDetectiveServer_GetUserById_FullMethodName, in, out, cOpts...) err := c.cc.Invoke(ctx, EveningDetectiveServer_GetUserByID_FullMethodName, in, out, cOpts...)
if err != nil { if err != nil {
return nil, err return nil, err
} }
@@ -1083,7 +1089,7 @@ type EveningDetectiveServerServer interface {
GetPrivacy(context.Context, *GetPrivacyReq) (*GetPrivacyRsp, error) GetPrivacy(context.Context, *GetPrivacyReq) (*GetPrivacyRsp, error)
GetConsent(context.Context, *GetConsentReq) (*GetConsentRsp, error) GetConsent(context.Context, *GetConsentReq) (*GetConsentRsp, error)
GetUsers(context.Context, *GetUsersReq) (*GetUsersRsp, error) GetUsers(context.Context, *GetUsersReq) (*GetUsersRsp, error)
GetUserById(context.Context, *GetUserByIdReq) (*GetUserByIdRsp, error) GetUserByID(context.Context, *GetUserByIDReq) (*GetUserByIDRsp, error)
GetMe(context.Context, *GetMeReq) (*GetMeRsp, error) GetMe(context.Context, *GetMeReq) (*GetMeRsp, error)
// Только администратор; сеансы пользователя сохраняются. // Только администратор; сеансы пользователя сохраняются.
// Ошибки: 401, 403, 400, 404, 500. // Ошибки: 401, 403, 400, 404, 500.
@@ -1214,8 +1220,8 @@ func (UnimplementedEveningDetectiveServerServer) GetConsent(context.Context, *Ge
func (UnimplementedEveningDetectiveServerServer) GetUsers(context.Context, *GetUsersReq) (*GetUsersRsp, error) { func (UnimplementedEveningDetectiveServerServer) GetUsers(context.Context, *GetUsersReq) (*GetUsersRsp, error) {
return nil, status.Error(codes.Unimplemented, "method GetUsers not implemented") return nil, status.Error(codes.Unimplemented, "method GetUsers not implemented")
} }
func (UnimplementedEveningDetectiveServerServer) GetUserById(context.Context, *GetUserByIdReq) (*GetUserByIdRsp, error) { func (UnimplementedEveningDetectiveServerServer) GetUserByID(context.Context, *GetUserByIDReq) (*GetUserByIDRsp, error) {
return nil, status.Error(codes.Unimplemented, "method GetUserById not implemented") return nil, status.Error(codes.Unimplemented, "method GetUserByID not implemented")
} }
func (UnimplementedEveningDetectiveServerServer) GetMe(context.Context, *GetMeReq) (*GetMeRsp, error) { func (UnimplementedEveningDetectiveServerServer) GetMe(context.Context, *GetMeReq) (*GetMeRsp, error) {
return nil, status.Error(codes.Unimplemented, "method GetMe not implemented") return nil, status.Error(codes.Unimplemented, "method GetMe not implemented")
@@ -1686,20 +1692,20 @@ func _EveningDetectiveServer_GetUsers_Handler(srv interface{}, ctx context.Conte
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
func _EveningDetectiveServer_GetUserById_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) { func _EveningDetectiveServer_GetUserByID_Handler(srv interface{}, ctx context.Context, dec func(interface{}) error, interceptor grpc.UnaryServerInterceptor) (interface{}, error) {
in := new(GetUserByIdReq) in := new(GetUserByIDReq)
if err := dec(in); err != nil { if err := dec(in); err != nil {
return nil, err return nil, err
} }
if interceptor == nil { if interceptor == nil {
return srv.(EveningDetectiveServerServer).GetUserById(ctx, in) return srv.(EveningDetectiveServerServer).GetUserByID(ctx, in)
} }
info := &grpc.UnaryServerInfo{ info := &grpc.UnaryServerInfo{
Server: srv, Server: srv,
FullMethod: EveningDetectiveServer_GetUserById_FullMethodName, FullMethod: EveningDetectiveServer_GetUserByID_FullMethodName,
} }
handler := func(ctx context.Context, req interface{}) (interface{}, error) { handler := func(ctx context.Context, req interface{}) (interface{}, error) {
return srv.(EveningDetectiveServerServer).GetUserById(ctx, req.(*GetUserByIdReq)) return srv.(EveningDetectiveServerServer).GetUserByID(ctx, req.(*GetUserByIDReq))
} }
return interceptor(ctx, in, info, handler) return interceptor(ctx, in, info, handler)
} }
@@ -3042,8 +3048,8 @@ var EveningDetectiveServer_ServiceDesc = grpc.ServiceDesc{
Handler: _EveningDetectiveServer_GetUsers_Handler, Handler: _EveningDetectiveServer_GetUsers_Handler,
}, },
{ {
MethodName: "GetUserById", MethodName: "GetUserByID",
Handler: _EveningDetectiveServer_GetUserById_Handler, Handler: _EveningDetectiveServer_GetUserByID_Handler,
}, },
{ {
MethodName: "GetMe", MethodName: "GetMe",