diff options
| author | Daniel Weipert <git@mail.dweipert.de> | 2026-04-10 13:37:26 +0200 |
|---|---|---|
| committer | Daniel Weipert <git@mail.dweipert.de> | 2026-04-10 14:39:36 +0200 |
| commit | 74a524ded12c6527745957ac219e1ca34828aa6c (patch) | |
| tree | 8dee7358b036f4d9e0730b8d89cb801caf46dff3 /src/Controllers/RoomController.php | |
| parent | 6929089fea7cf79ae5ca9e05486ba33b0e5b216d (diff) | |
switch routing to attributes
Diffstat (limited to 'src/Controllers/RoomController.php')
| -rwxr-xr-x | src/Controllers/RoomController.php | 299 |
1 files changed, 0 insertions, 299 deletions
diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php deleted file mode 100755 index 060a030..0000000 --- a/src/Controllers/RoomController.php +++ /dev/null @@ -1,299 +0,0 @@ -<?php - -namespace App\Controllers; - -use App\Database; -use App\Errors\AppException; -use App\Errors\Exception; -use App\Errors\UnauthorizedError; -use App\Models\RoomEvent; -use App\Models\User; -use App\Support\Id; -use App\Support\Parser; -use App\Support\RequestValidator; -use Matrix\Data\UnsignedData; -use Matrix\Enums\ErrorCode; -use Matrix\Enums\EventType; -use Matrix\Enums\MembershipState; -use Matrix\Enums\MessageType; -use Matrix\Enums\RoomGuestAccess; -use Matrix\Enums\RoomHistoryVisibility; -use Matrix\Enums\RoomJoinRule; -use Matrix\Enums\RoomVisibility; -use Matrix\Events\ClientEvent; -use Matrix\Events\Room\CreateEvent; -use Matrix\Events\Room\GuestAccessEvent; -use Matrix\Events\Room\HistoryVisibilityEvent; -use Matrix\Events\Room\JoinRulesEvent; -use Matrix\Events\Room\MemberEvent; -use Matrix\Events\Room\NameEvent; -use Matrix\Events\Room\PowerLevelsEvent; -use Symfony\Component\HttpFoundation\Request; -use Symfony\Component\HttpFoundation\Response; -use Symfony\Component\HttpFoundation\JsonResponse; - -class RoomController -{ - public function createRoom(Request $request): Response - { - $user = User::authenticateWithRequest($request); - $body = json_decode($request->getContent(), true); - RequestValidator::validateJson(); - - $creationContent = $body["creation_content"] ?? []; - $initialState = $body["initial_state"] ?? []; - $invite = $body["invite"] ?? []; - $body["invite_3pid"] ?? []; - $body["is_direct"] ?? false; - $name = $body["name"] ?? ""; - $body["power_level_content_override"] ?? []; - $preset = $body["preset"] ?? ""; - $roomAliasName = $body["room_alias_name"] ?? ""; - $roomVersion = $body["room_version"] ?? "DEFAULT_ROOM_VERSION"; - $topic = $body["topic"] ?? ""; - $visibility = RoomVisibility::tryFrom($body["visibility"] ?? "private"); - - if (! $preset) { - $preset = $visibility->value . "_chat"; - } - - # TODO: get events for preset - # TODO: override preset events with initial state - # TODO: override events with name and topic if applicable - $state = []; - - if ($name) { - $state[EventType::ROOM_NAME->value] = $name; - } - - if ($topic) { - $state[EventType::ROOM_TOPIC->value] = $topic; - } - - // create room - $roomId = Id::generateRoomId(); - Database::getInstance()->query(<<<SQL - insert into rooms (id, name) values (:id, :name) - SQL, [ - "id" => $roomId, - "name" => $roomAliasName, # "#$roomAliasName:$_ENV[DOMAIN]", - ]); - - $roomCreateEvent = new RoomEvent(new CreateEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - roomVersion: "12", - )); - $roomCreateEvent->insert(); - - $roomMemberEvent = new RoomEvent(new MemberEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - stateKey: $user->getId(), - isDirect: false, - membership: MembershipState::JOIN, - displayName: $user->getName(), - )); - $roomMemberEvent->insert(); - - $roomPowerLevelsEvent = new RoomEvent(new PowerLevelsEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - )); - $roomPowerLevelsEvent->insert(); - - $roomJoinRulesEvent = new RoomEvent(new JoinRulesEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - joinRule: RoomJoinRule::INVITE, - )); - $roomJoinRulesEvent->insert(); - - $roomHistoryVisibilityEvent = new RoomEvent(new HistoryVisibilityEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - historyVisibility: RoomHistoryVisibility::SHARED, - )); - $roomHistoryVisibilityEvent->insert(); - - $roomGuestAccessEvent = new RoomEvent(new GuestAccessEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - guestAccess: RoomGuestAccess::CAN_JOIN, - )); - $roomGuestAccessEvent->insert(); - - $roomNameEvent = new RoomEvent(new NameEvent( - eventId: Id::generateEventId(), - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - name: $roomAliasName, - )); - $roomNameEvent->insert(); - - Database::getInstance()->query(<<<SQL - insert into room_memberships (room_id, user_id, state) - values (:room_id, :user_id, :state) - SQL, [ - "room_id" => $roomId, - "user_id" => $user->getId(), - "state" => MembershipState::JOIN->value, - ]); - - return new JsonResponse([ - "room_id" => $roomId, - ]); - } - - /** - * GET /_matrix/client/v3/directory/room/{roomAlias} - * - * @see https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3directoryroomroomalias - */ - public function resolveAlias(Request $request): Response - { - $alias = $request->attributes->get("roomAlias"); - - $roomAlias = Parser::parseRoomAlias($alias); # TODO: on parse error => 400 - $roomId = null; - - if ($roomAlias["server"] != $_ENV["DOMAIN"]) { - # TODO: federation API resolve - $roomId = -1; - } - else { - $room = Database::getInstance()->query(<<<SQL - select id from rooms where name = :name - SQL, [ - "name" => $roomAlias["name"], - ])->fetch(); - - $roomId = $room["id"] ?? null; - } - - if (empty($roomId)) { - throw new AppException( - ErrorCode::NOT_FOUND, - "Room alias $alias not found.", - Response::HTTP_NOT_FOUND - ); - } - - return new JsonResponse([ - "room_id" => $roomId, - "servers" => [], - ]); - } - - /** - * GET /_matrix/client/v3/rooms/{roomId}/messages - */ - public function getMessages(Request $request): Response - { - $user = User::authenticateWithRequest($request); - - $roomId = $request->attributes->get("roomId"); - - $membership = Database::getInstance() - ->query("select state from room_memberships where user_id=:user_id and room_id=:room_id", [ - "user_id" => $user->getId(), - "room_id" => $roomId, - ]) - ->fetchColumn(); - - if (MembershipState::from($membership) !== MembershipState::JOIN) { - throw new Exception(ErrorCode::FORBIDDEN, "You aren't a member of the room.", Response::HTTP_FORBIDDEN); - } - - $direction = $request->query->get("dir"); - $filter = $request->query->get("filter"); - $from = $request->query->get("from"); - $limit = $request->query->get("limit", 10); - $to = $request->query->get("to"); - - $events = Database::getInstance()->query(<<<SQL - select * from room_events - where room_id = :room_id - SQL, [ - "room_id" => $roomId, - #"limit" => ($filter["room"]["timeline"]["limit"] ?? false) ? "limit " . $filter["room"]["timeline"]["limit"] : "", - ])->fetchAll(); - - return new JsonResponse([ - "chunk" => array_map([RoomEvent::class, "transformEvent"], $events), - "end" => "", - "start" => "", - "state" => [], - ]); - } - - /** - * POST /_matrix/client/v3/rooms/{roomId}/read_markers - */ - public function readMarkers(Request $request): Response - { - $user = User::authenticateWithRequest($request); - $body = json_decode($request->getContent(), true); - RequestValidator::validateJson(); - - $roomId = $request->attributes->get("roomId"); - - return new JsonResponse(); - } - - /** - * PUT /_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId} - * - * @see https://spec.matrix.org/v1.15/client-server-api/#put_matrixclientv3roomsroomidsendeventtypetxnid - */ - public function send(Request $request): Response - { - $user = User::authenticateWithRequest($request); - - if (empty($user)) { - throw new UnauthorizedError(); - } - - $roomId = $request->attributes->get("roomId"); - $eventType = EventType::from($request->attributes->get("eventType")); - $transactionId = $request->attributes->get("txnId"); - - $body = json_decode($request->getContent(), true); - RequestValidator::validateJson(); - - // validate msgtype - MessageType::from($body["msgtype"]); - - $eventId = Id::generateEventId(); - $event = new RoomEvent(new ClientEvent( - content: $body, - eventId: $eventId, - originServerTimestamp: time(), - roomId: $roomId, - sender: $user->getId(), - type: $eventType, - unsigned: new UnsignedData( - age: 1234, # TODO - membership: MembershipState::JOIN, - ), - )); - $event->insert(); - - return new JsonResponse([ - "event_id" => $eventId, - ]); - } -} |
