getId()); return new JsonResponse(new ClientAccountWhoamiGetResponse( userId: $user->getId(), deviceId: $device->getId(), )); } /** * @see https://spec.matrix.org/v1.16/client-server-api/#post_matrixclientv3useruseridfilter */ #[Route(path: "/_matrix/client/r0/user/{userId}/filter", methods: ["POST"])] #[Route(path: "/_matrix/client/v3/user/{userId}/filter", methods: ["POST"])] public function uploadFilter(Request $request): Response { $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: ""); $user = User::fetchWithAccessToken($accessToken); if (empty($user)) { throw new UnauthorizedError(); } $userId = $request->get("userId"); if ($user->getId() !== $userId) { throw new UnauthorizedError(); } $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); $filterId = md5($userId . random_bytes(512)); Database::getInstance()->query(<< $filterId, "account_data" => isset($body["account_data"]) ? json_encode($body["account_data"]) : null, "event_fields" => isset($body["event_fields"]) ? json_encode($body["event_fields"]) : null, "event_format" => isset($body["event_format"]) ? json_encode($body["event_format"]) : null, "presence" => isset($body["presence"]) ? json_encode($body["presence"]) : null, "room" => isset($body["room"]) ? json_encode($body["room"]) : null, "user_id" => $userId, ]); return new JsonResponse([ "filter_id" => $filterId, ]); } #[Route(path: "/_matrix/client/v3/user/{userId}/{filter}/{filterId}", methods: ["GET"])] public function getFilter(Request $request): Response { $user = User::authenticateWithRequest($request); $userId = $request->attributes->get("userId"); $filterId = $request->attributes->get("filterId"); $filter = Database::getInstance() ->query("select * from filters where id=:id and user_id=:user_id", [ "id" => $filterId, "user_id" => $userId, ]) ->fetch(); if (empty($filter)) { throw new AppException( ErrorCode::NOT_FOUND, "Unknown filter.", Response::HTTP_NOT_FOUND ); } return new JsonResponse([ "account_data" => json_decode($filter["account_data"] ?? ""), "event_fields" => json_decode($filter["event_fields"] ?? ""), "event_format" => $filter["event_format"] ?? "", "presence" => json_decode($filter["presence"] ?? ""), "room" => json_decode($filter["room"] ?? ""), ]); } #[Route(path: "/_matrix/client/v3/profile/{userId}", methods: ["GET"])] public function getProfile(Request $request): Response { $userId = $request->attributes->get("userId"); $user = Database::getInstance()->query("select * from users where id=:user_id", ["user_id" => $userId])->fetch(); if (empty($user)) { throw new AppException( ErrorCode::NOT_FOUND, "There is no profile information for this user or this user does not exist.", Response::HTTP_NOT_FOUND ); } return new JsonResponse(); } }