From a93308afb1fc62ebc42a53f236b3c7999e34856a Mon Sep 17 00:00:00 2001 From: Andrew Glaze Date: Fri, 16 May 2025 13:01:08 -0400 Subject: [PATCH] impl heartbeat --- .../Controllers/OpenApiController.swift | 29 +++++++++++++++++++ 1 file changed, 29 insertions(+) diff --git a/Sources/stella/Controllers/OpenApiController.swift b/Sources/stella/Controllers/OpenApiController.swift index fda6b06..4393c45 100644 --- a/Sources/stella/Controllers/OpenApiController.swift +++ b/Sources/stella/Controllers/OpenApiController.swift @@ -1,4 +1,5 @@ import Vapor +import JWT struct OpenApiController: RouteCollection { func boot(routes: any RoutesBuilder) throws { @@ -10,5 +11,33 @@ struct OpenApiController: RouteCollection { req.logger.log(level: .debug, .init(stringLiteral: req.body.string ?? "")) return Response() } + + group.post("v3", "player", "heartbeat") { req in + let beat = try req.content.decode(Heartbeat.self, as: .json) + guard let zatToken = req.headers["zat"].first else { + throw Abort(.badRequest, reason: "Missing zat header.") + } + let jwt = try await req.jwt.verify(zatToken, as: SessionPayload.self) + guard jwt.accountId.value == beat.playerId else { + throw Abort(.unauthorized, reason: "zat invalid") + } + return "{}" + } + + group.post("v3", "push", "token", "register") { req in + let beat = try req.content.decode(Heartbeat.self, as: .json) + guard let zatToken = req.headers["zat"].first else { + throw Abort(.badRequest, reason: "Missing zat header.") + } + let jwt = try await req.jwt.verify(zatToken, as: SessionPayload.self) + guard jwt.accountId.value == beat.playerId else { + throw Abort(.unauthorized, reason: "zat invalid") + } + return "{}" + } } } + +struct Heartbeat: Content { + let playerId: String +}