summaryrefslogtreecommitdiff
path: root/src/Controllers/RoomController.php
diff options
context:
space:
mode:
authorDaniel Weipert <git@mail.dweipert.de>2026-04-10 13:37:26 +0200
committerDaniel Weipert <git@mail.dweipert.de>2026-04-10 14:39:36 +0200
commit74a524ded12c6527745957ac219e1ca34828aa6c (patch)
tree8dee7358b036f4d9e0730b8d89cb801caf46dff3 /src/Controllers/RoomController.php
parent6929089fea7cf79ae5ca9e05486ba33b0e5b216d (diff)
switch routing to attributes
Diffstat (limited to 'src/Controllers/RoomController.php')
-rwxr-xr-xsrc/Controllers/RoomController.php299
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,
- ]);
- }
-}