summaryrefslogtreecommitdiff
path: root/src/Controllers/SyncController.php
blob: 76b6a26eb466757772a5d4f188bc14034a9ef49c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
<?php

namespace App\Controllers;

use App\Database;
use App\Errors\UnauthorizedError;
use App\Events\PresenceEvent;
use App\Types\PresenceState;
use Symfony\Component\HttpFoundation\Request;
use Symfony\Component\HttpFoundation\Response;
use Symfony\Component\HttpFoundation\JsonResponse;

class SyncController
{
  /**
   * GET /_matrix/client/v3/sync
   *
   * @see https://spec.matrix.org/v1.15/client-server-api/#get_matrixclientv3sync
   * @see https://spec.matrix.org/v1.15/client-server-api/#extensions-to-sync
   */
  public function sync(Request $request): Response
  {
    $accessToken = str_replace("Bearer ", "", $request->headers->get("authorization") ?: "");
    $user = Database::getInstance()->query(<<<SQL
      select users.* from users left join tokens on tokens.user_id = users.id where tokens.access_token=:access_token
    SQL, [
      "access_token" => $accessToken,
    ])->fetch();

    # TODO: token validation

    if (empty($user)) {
      throw new UnauthorizedError();
    }

    $filter = $request->query->get("filter", "");
    $syncFullState = $request->query->get("full_state", false);
    $setPresence = PresenceState::tryFrom($request->query->get("set_presence") ?? "") ?? PresenceState::ONLINE;
    $since = $request->query->get("since", "");
    $timeout = $request->query->get("timeout", 0);

    return new JsonResponse([
      "account_data" => [
        "events" => [

        ],
      ],

      "device_lists" => [],

      "device_one_time_keys_count" => 10,

      "next_batch" => "next_batch_id",

      "presence" => [
        "events" => [
          (new PresenceEvent(sender: $user["id"]))->toJsonEncodeable(),
        ],
      ],

      "rooms" => [
        "invite" => [],
        "join" => [],
        "knock" => [],
        "leave" => [],
      ],

      "to_device" => [
        "events" => [],
      ],
    ]);
  }
}