From 2ae0c2fa2a0bb5a7cd1fd9da1c6d2a6090126e67 Mon Sep 17 00:00:00 2001 From: Daniel Weipert Date: Fri, 19 Sep 2025 14:29:17 +0200 Subject: sending messages creates message event in database --- Makefile | 4 ++ bin/db-migrate | 2 +- migrations/20250819.php | 21 +++++++++ src/Controllers/KeyController.php | 10 +++++ src/Controllers/RoomController.php | 21 ++++++++- src/Controllers/SyncController.php | 12 ++++-- src/Controllers/UserController.php | 32 ++++++++++++++ src/Events/Event.php | 6 ++- src/Events/PresenceEvent.php | 2 +- src/Events/RoomMemberEvent.php | 7 ++- src/Events/RoomMessageEvent.php | 86 +++++++++++++++++++++++++++++++++++++ src/Events/RoomNameEvent.php | 2 +- src/Router/routes_client_server.php | 21 +++++++++ src/Types/MembershipState.php | 12 ++++++ 14 files changed, 228 insertions(+), 10 deletions(-) create mode 100644 Makefile create mode 100755 src/Controllers/UserController.php create mode 100644 src/Events/RoomMessageEvent.php create mode 100644 src/Types/MembershipState.php diff --git a/Makefile b/Makefile new file mode 100644 index 0000000..c9a01fa --- /dev/null +++ b/Makefile @@ -0,0 +1,4 @@ +.ONESHELL: + +db-migrate: + docker compose exec php php bin/db-migrate diff --git a/bin/db-migrate b/bin/db-migrate index c166fcd..c777406 100755 --- a/bin/db-migrate +++ b/bin/db-migrate @@ -1,4 +1,4 @@ -#!/bin/env php +#!/usr/bin/env php query(<<query(<<headers->get("authorization") ?: ""); + $user = User::fetchWithAccessToken($accessToken); + + if (empty($user)) { + throw new UnauthorizedError(); + } + $body = json_decode($request->getContent(), true); RequestValidator::validateJson(); return new JsonResponse([ "one_time_key_counts" => [ + "curve25519" => 0, "signed_curve25519" => count($body["one_time_keys"]) ], ]); diff --git a/src/Controllers/RoomController.php b/src/Controllers/RoomController.php index 367d754..c02d5ce 100755 --- a/src/Controllers/RoomController.php +++ b/src/Controllers/RoomController.php @@ -6,10 +6,12 @@ use App\Database; use App\Errors\AppException; use App\Errors\ErrorCode; use App\Errors\UnauthorizedError; +use App\Events\RoomMessageEvent; use App\Models\User; use App\Support\Parser; use App\Support\RequestValidator; use App\Types\EventType; +use App\Types\MembershipState; use App\Types\MessageType; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -81,8 +83,25 @@ class RoomController $message = $body["body"]; $messageType = MessageType::from($body["msgtype"]); + $eventId = "\$" . md5(random_bytes(512)) . ":" . $_ENV["DOMAIN"]; + $event = new RoomMessageEvent( + id: $eventId, + sender: $user->getId(), + originServerTimestamp: new \DateTime("now"), + content: [ + "body" => $message, + "msgtype" => $messageType->value, + ], + unsigned: [ + "age" => 1234, + "membership" => MembershipState::JOIN->value, + ], + roomId: $roomId, + ); + $event->insert(); + return new JsonResponse([ - "event_id" => "\$asdfghjkl:" . $_ENV["DOMAIN"], + "event_id" => $eventId, ]); } } diff --git a/src/Controllers/SyncController.php b/src/Controllers/SyncController.php index b7d51c3..243fab5 100755 --- a/src/Controllers/SyncController.php +++ b/src/Controllers/SyncController.php @@ -5,7 +5,10 @@ namespace App\Controllers; use App\Database; use App\Errors\UnauthorizedError; use App\Events\PresenceEvent; +use App\Events\RoomMemberEvent; +use App\Events\RoomMessageEvent; use App\Models\User; +use App\Types\MembershipState; use App\Types\PresenceState; use Symfony\Component\HttpFoundation\Request; use Symfony\Component\HttpFoundation\Response; @@ -62,14 +65,17 @@ class SyncController ], "timeline" => [ - "events" => [], + "events" => [ + (new RoomMemberEvent($user->getId(), $user->getId(), MembershipState::JOIN))->toJsonEncodeable(), + (new RoomMessageEvent($user->getId(), "Hallo Test Nachricht"))->toJsonEncodeable(), + ], "limited" => false, "prev_batch" => "", ], "unread_notifications" => [ - "highlight_count" => 1, - "notification_count" => 2, + "highlight_count" => random_int(0, 1), + "notification_count" => random_int(0, 10), ], "unread_thread_notifications" => new \stdClass(), diff --git a/src/Controllers/UserController.php b/src/Controllers/UserController.php new file mode 100755 index 0000000..a056e1d --- /dev/null +++ b/src/Controllers/UserController.php @@ -0,0 +1,32 @@ +headers->get("authorization") ?: ""); + $user = User::fetchWithAccessToken($accessToken); + + if (empty($user)) { + throw new UnauthorizedError(); + } + + return new JsonResponse([ + "filter_id" => "1234", + ]); + } +} diff --git a/src/Events/Event.php b/src/Events/Event.php index cab1b14..7dbf242 100644 --- a/src/Events/Event.php +++ b/src/Events/Event.php @@ -11,6 +11,10 @@ abstract class Event ) {} - abstract public function fromJson(string $json): static; + abstract public function fromJson(string $json): self; + + /** + * @return array + */ abstract public function toJsonEncodeable(): array; } diff --git a/src/Events/PresenceEvent.php b/src/Events/PresenceEvent.php index e3a54b3..cd230c5 100644 --- a/src/Events/PresenceEvent.php +++ b/src/Events/PresenceEvent.php @@ -19,7 +19,7 @@ class PresenceEvent extends Event parent::__construct(EventType::PRESENCE); } - public function fromJson(string $json): static + public function fromJson(string $json): self { } diff --git a/src/Events/RoomMemberEvent.php b/src/Events/RoomMemberEvent.php index 02793ea..79ba0cc 100644 --- a/src/Events/RoomMemberEvent.php +++ b/src/Events/RoomMemberEvent.php @@ -3,19 +3,20 @@ namespace App\Events; use App\Types\EventType; +use App\Types\MembershipState; class RoomMemberEvent extends Event { public function __construct( private string $sender, private string $stateKey, - private string $membership, + private MembershipState $membership, ) { parent::__construct(EventType::ROOM_MEMBER); } - public function fromJson(string $json): static + public function fromJson(string $json): self { } @@ -25,6 +26,8 @@ class RoomMemberEvent extends Event "type" => $this->type, "sender" => $this->sender, "state_key" => $this->stateKey, + "event_id" => "\$0", + "origin_server_ts" => time(), "content" => [ "membership" => $this->membership, ], diff --git a/src/Events/RoomMessageEvent.php b/src/Events/RoomMessageEvent.php new file mode 100644 index 0000000..3ccc408 --- /dev/null +++ b/src/Events/RoomMessageEvent.php @@ -0,0 +1,86 @@ + $this->type, + "sender" => $this->sender, + "event_id" => $this->id, + "origin_server_ts" => $this->originServerTimestamp->format("U.v"), + "content" => [ + "body" => $this->body, + "msgtype" => MessageType::TEXT, + ], + "unsigned" => [ + "age" => 1234, + "membership" => MembershipState::JOIN, + ], + "room_id" => $this->roomId, + ]; + } + + public static function fromDatabase(array $row): self + { + } + + public static function fetch(): ?self + { + } + + public static function fetchAll(): array + { + } + + public function insert(): bool + { + return !! Database::getInstance()->query( + << $this->id, + "type" => $this->type->value, + "sender" => $this->sender, + "origin_server_timestamp" => (new \DateTime("now"))->format("U.v"), + "content" => json_encode($this->content), + "unsigned" => json_encode($this->unsigned), + "room_id" => $this->roomId, + ] + ); + } + + public function update(): bool + { + } + + public function delete(): bool + { + } +} diff --git a/src/Events/RoomNameEvent.php b/src/Events/RoomNameEvent.php index 59abbe2..279e6c1 100644 --- a/src/Events/RoomNameEvent.php +++ b/src/Events/RoomNameEvent.php @@ -15,7 +15,7 @@ class RoomNameEvent extends Event parent::__construct(EventType::ROOM_NAME); } - public function fromJson(string $json): static + public function fromJson(string $json): self { } diff --git a/src/Router/routes_client_server.php b/src/Router/routes_client_server.php index 7543892..fd39d08 100644 --- a/src/Router/routes_client_server.php +++ b/src/Router/routes_client_server.php @@ -9,6 +9,7 @@ use App\Controllers\RoomController; use App\Controllers\ServerDiscoveryController; use App\Controllers\ServerImplementationController; use App\Controllers\SyncController; +use App\Controllers\UserController; use Symfony\Component\Routing\Loader\Configurator\RouteConfigurator; return function (RouteConfigurator $routes): void @@ -34,6 +35,11 @@ return function (RouteConfigurator $routes): void ->controller($supportedLoginTypes) ->methods(["GET"]); + $routes + ->add("matrix_client_r0_login", "/_matrix/client/r0/login") + ->controller([LoginController::class, "login"]) + ->methods(["POST"]); + $routes ->add("matrix_client_v3_login", "/_matrix/client/v3/login") ->controller([LoginController::class, "login"]) @@ -44,11 +50,21 @@ return function (RouteConfigurator $routes): void ->controller([KeyController::class, "upload"]) ->methods(["POST"]); + $routes + ->add("matrix_client_r0_keys_upload", "/_matrix/client/r0/keys/upload") + ->controller([KeyController::class, "upload"]) + ->methods(["POST"]); + $routes ->add("matrix_client_v3_sync", "/_matrix/client/v3/sync") ->controller([SyncController::class, "sync"]) ->methods(["GET"]); + $routes + ->add("matrix_client_r0_sync", "/_matrix/client/r0/sync") + ->controller([SyncController::class, "sync"]) + ->methods(["GET"]); + $routes ->add("matrix_client_v3_refresh", "/_matrix/client/v3/refresh") ->controller([KeyController::class, "refresh"]) @@ -68,4 +84,9 @@ return function (RouteConfigurator $routes): void ->add("matrix_client_v3_rooms_id_send_event_transaction", "/_matrix/client/v3/rooms/{roomId}/send/{eventType}/{txnId}") ->controller([RoomController::class, "send"]) ->methods(["PUT"]); + + $routes + ->add("matrix_client_r0_user_id_filter", "/_matrix/client/r0/user/{userId}/filter") + ->controller([UserController::class, "uploadFilter"]) + ->methods(["POST"]); }; diff --git a/src/Types/MembershipState.php b/src/Types/MembershipState.php new file mode 100644 index 0000000..a4b2a1d --- /dev/null +++ b/src/Types/MembershipState.php @@ -0,0 +1,12 @@ +