This commit is contained in:
2026-09-16 02:44:44 +07:00
parent 27db2067e3
commit 0e42278b36
25 changed files with 1781 additions and 424 deletions
+64 -8
View File
@@ -35,6 +35,24 @@ option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_swagger) = {
};
service EveningDetectiveServer {
rpc GetParticipation(GetParticipationReq) returns (ParticipationRsp) {
option (google.api.http) = { post: "/api/participation/get" body: "*" };
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
security : {};
tags : "Подтверждение участия";
summary : "Получить состояние участия";
description: "Возвращает команду, игру и текущее решение по персональному токену из письма. Авторизация JWT не требуется. Чтение не меняет статус участия. Токен передаётся в теле запроса. Недействительная ссылка и ошибки обработки возвращаются в поле error при HTTP 200.";
};
}
rpc AnswerParticipation(AnswerParticipationReq) returns (ParticipationRsp) {
option (google.api.http) = { post: "/api/participation/answer" body: "*" };
option (grpc.gateway.protoc_gen_openapiv2.options.openapiv2_operation) = {
security : {};
tags : "Подтверждение участия";
summary : "Подтвердить или отменить участие";
description: "Принимает окончательный ответ капитана: confirmed или cancelled. Авторизация JWT не требуется; доступ определяется персональным токеном. Первый ответ сохраняется, повтор того же ответа успешен, противоположный ответ отклоняется. Новый ответ принимается только до планового начала игры и пока игра имеет статус draft. Ошибки ссылки, значения answer, закрытого приёма или изменения решения возвращаются в поле error при HTTP 200; при уже принятом решении возвращается его текущее состояние.";
};
}
rpc Ping(PingReq) returns (PingRsp) {
option (google.api.http) = {
get: "/api/test/ping"
@@ -1452,15 +1470,53 @@ message GetScreenResultsRsp {
repeated TeamResult teams = 3;
}
message GetParticipationReq {
// Персональный токен из письма: 64 шестнадцатеричных символа. Не является JWT.
string token = 1;
}
message AnswerParticipationReq {
// Персональный токен из письма: 64 шестнадцатеричных символа. Не является JWT.
string token = 1;
// Окончательное решение: confirmed — участвуем, cancelled — отменяем запись.
string answer = 2;
}
message ParticipationRsp {
// Пустая строка при успехе; иначе сообщение об ошибке для пользователя.
string error = 1;
// Название команды. Данные доступны только по действительному токену.
string team_name = 2;
// Название игры.
string game_name = 3;
// Плановое начало игры, UTC (RFC 3339 в JSON).
google.protobuf.Timestamp start_at = 4;
// Заявленное число участников команды.
int32 participants_count = 5;
// pending — ожидает ответа, confirmed — подтверждено, cancelled — отменено.
string status = 6;
// Новые ответы закрыты: наступило плановое начало или игра вышла из draft.
// Изменение уже принятого решения запрещено независимо от этого поля.
bool closed = 7;
}
message Team {
int32 id = 1;
string name = 2;
string status = 3;
string password = 4;
int32 actions_count = 5;
repeated Application applications = 6;
string captain_email = 7;
int32 participants_count = 8;
// Статус участия: pending, confirmed или cancelled. Поле панели организатора.
string participation_status = 9;
// Источник решения: captain, automatic либо пустая строка до ответа.
string participation_source = 10;
// Последняя ошибка отправки; пустая строка, если ошибки нет.
string participation_email_error = 11;
// Письмо принято SMTP-сервером; не означает прочтение или доставку во входящие.
bool participation_email_sent = 12;
int32 id = 1;
string name = 2;
string status = 3;
string password = 4;
int32 actions_count = 5;
repeated Application applications = 6;
string captain_email = 7;
int32 participants_count = 8;
}
message GetGameReq {