This commit is contained in:
2026-10-11 13:47:22 +07:00
parent 6f2b63511c
commit 63f570aad1
17 changed files with 2038 additions and 247 deletions
+5
View File
@@ -35,6 +35,7 @@ import (
"evening_detective_server/internal/repos/tickets_repo"
"evening_detective_server/internal/repos/users_repo"
"evening_detective_server/internal/services/answer_service"
"evening_detective_server/internal/services/device_presence_service"
"evening_detective_server/internal/services/file_service"
"evening_detective_server/internal/services/game_export_service"
"evening_detective_server/internal/services/game_import_service"
@@ -228,6 +229,8 @@ func main() {
log.Fatalln("Failed to listen:", err)
}
devicePresenceService := device_presence_service.NewDevicePresenceService(venueMode, gameService, teamService, screenService)
s := grpc.NewServer(
grpc.MaxRecvMsgSize(grpcMsgLimit),
grpc.UnaryInterceptor(
@@ -237,6 +240,7 @@ func main() {
"/crabs.evening_detective_server.EveningDetectiveServer/GetParticipation": true,
"/crabs.evening_detective_server.EveningDetectiveServer/GetTicket": true,
"/crabs.evening_detective_server.EveningDetectiveServer/AnswerParticipation": true,
"/crabs.evening_detective_server.EveningDetectiveServer/DeviceHeartbeat": true,
"/crabs.evening_detective_server.EveningDetectiveServer/Ping": true,
"/crabs.evening_detective_server.EveningDetectiveServer/Echo": true,
"/crabs.evening_detective_server.EveningDetectiveServer/Signup": true,
@@ -287,6 +291,7 @@ func main() {
gameImportService,
gameResultsService,
gameResultsApplyService,
devicePresenceService,
),
)
@@ -333,6 +333,74 @@
]
}
},
"/api/devices": {
"get": {
"summary": "Получить устройства площадки",
"description": "Только venue; организатор, администратор или разработчик. Связь актуальна менее 60 секунд; подключения удаляются через 15 минут. Фильтр gameID оставляет только подключения указанной игры.",
"operationId": "EveningDetectiveServer_GetDevices",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/evening_detective_serverGetDevicesRsp"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "gameID",
"in": "query",
"required": false,
"type": "integer",
"format": "int32"
}
],
"tags": [
"Устройства"
]
}
},
"/api/devices/heartbeat": {
"post": {
"summary": "Обновить присутствие подключения браузера",
"description": "Публичный endpoint. Контексты взаимоисключающие и проверяются сервером. В prod enabled=false без регистрации. UUID обозначает браузерный профиль, не физический телефон.",
"operationId": "EveningDetectiveServer_DeviceHeartbeat",
"responses": {
"200": {
"description": "A successful response.",
"schema": {
"$ref": "#/definitions/evening_detective_serverDeviceHeartbeatRsp"
}
},
"default": {
"description": "An unexpected error response.",
"schema": {
"$ref": "#/definitions/rpcStatus"
}
}
},
"parameters": [
{
"name": "body",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/evening_detective_serverDeviceHeartbeatReq"
}
}
],
"tags": [
"Устройства"
],
"security": []
}
},
"/api/files/upload": {
"post": {
"summary": "Загрузить файл",
@@ -4700,6 +4768,87 @@
},
"description": "Developer tasks use new, in_progress, review and done statuses."
},
"evening_detective_serverDeviceConnection": {
"type": "object",
"properties": {
"ID": {
"type": "string"
},
"firstSeenAt": {
"type": "string",
"format": "date-time"
},
"lastSeenAt": {
"type": "string",
"format": "date-time"
},
"IP": {
"type": "string"
},
"userAgent": {
"type": "string"
},
"connected": {
"type": "boolean"
},
"gameID": {
"type": "integer",
"format": "int32"
},
"teamID": {
"type": "integer",
"format": "int32"
},
"screenID": {
"type": "integer",
"format": "int32"
},
"kind": {
"type": "string",
"title": "browser, organizer, team, screen"
}
}
},
"evening_detective_serverDeviceHeartbeatReq": {
"type": "object",
"properties": {
"deviceID": {
"type": "string"
},
"connectionID": {
"type": "string"
},
"organizerGameID": {
"type": "integer",
"format": "int32"
},
"teamID": {
"type": "integer",
"format": "int32"
},
"password": {
"type": "string"
},
"screenID": {
"type": "string"
},
"accessToken": {
"type": "string"
}
}
},
"evening_detective_serverDeviceHeartbeatRsp": {
"type": "object",
"properties": {
"enabled": {
"type": "boolean"
},
"serverTime": {
"type": "string",
"format": "date-time"
}
}
},
"evening_detective_serverDoor": {
"type": "object",
"properties": {
@@ -4894,6 +5043,22 @@
}
}
},
"evening_detective_serverGetDevicesRsp": {
"type": "object",
"properties": {
"devices": {
"type": "array",
"items": {
"type": "object",
"$ref": "#/definitions/evening_detective_serverVenueDevice"
}
},
"serverTime": {
"type": "string",
"format": "date-time"
}
}
},
"evening_detective_serverGetGameAnswersRsp": {
"type": "object",
"properties": {
@@ -6155,6 +6320,32 @@
}
}
},
"evening_detective_serverVenueDevice": {
"type": "object",
"properties": {
"ID": {
"type": "string"
},
"firstSeenAt": {
"type": "string",
"format": "date-time"
},
"lastSeenAt": {
"type": "string",
"format": "date-time"
},
"connected": {
"type": "boolean"
},
"connections": {
"type": "array",
"items": {
"type": "object",
"$ref": "#/definitions/evening_detective_serverDeviceConnection"
}
}
}
},
"protobufAny": {
"type": "object",
"properties": {