* @category Class * @license https://www.gnu.org/licenses/lgpl-3.0.en.html GNU Lesser General Public License * @link www.splendidbear.org * @since 2026. 04. 09. */ class MercureController extends AbstractController { public function __construct( private readonly TopicManager $topicManager, private readonly RpcManager $rpcManager, ) { } /** POST /api/game/start — save the grid and create the PlayedGame record */ public function start(Request $request): JsonResponse { $data = $request->toArray(); $result = $this->rpcManager->saveGrid([$data['grid'], $data['gameAssoc']]); return $this->json(['success' => $result]); } /** GET /api/game/connect/{gameAssoc} — return grid + current user info (base64 JSON) */ public function connect(string $gameAssoc): Response { $payload = $this->rpcManager->getConnectInformation($gameAssoc); return new Response($payload, Response::HTTP_OK, ['Content-Type' => 'text/plain']); } /** POST /api/game/join/{gameAssoc} — register the player, broadcast subscription event via Mercure */ public function join(string $gameAssoc, Request $request): JsonResponse { $this->topicManager->subscribe($gameAssoc, $this->resolveUserName($request), $this->getUser()); return $this->json(['success' => true]); } /** POST /api/game/step/{gameAssoc} — persist the step and broadcast game event via Mercure */ public function step(string $gameAssoc, Request $request): JsonResponse { $this->topicManager->publish($gameAssoc, $this->resolveUserName($request), $request->toArray()); return $this->json(['success' => true]); } /** POST /api/game/leave/{gameAssoc} — broadcast disconnect event via Mercure */ public function leave(string $gameAssoc, Request $request): JsonResponse { $this->topicManager->unSubscribe($gameAssoc, $this->resolveUserName($request)); return $this->json(['success' => true]); } private function resolveUserName(Request $request): string { $user = $this->getUser(); if (null !== $user) { return $user->getUserIdentifier(); } $sessionId = $request->getSession()->getId(); if (empty($sessionId)) { $sessionId = bin2hex(random_bytes(16)); } return 'anon_' . $sessionId; } }