Implement state_ids federation endpoint

This commit is contained in:
Pim Kunis 2021-08-22 12:19:47 +02:00
parent ba3e290bf1
commit a44595bb99
6 changed files with 56 additions and 9 deletions

View file

@ -48,8 +48,6 @@ defmodule MatrixServer.KeyServer do
object = Map.drop(object, [:signatures, :unsigned])
with {:ok, json} <- MatrixServer.encode_canonical_json(object) do
IO.puts(json)
signature =
json
|> :enacl.sign_detached(private_key)

View file

@ -60,10 +60,16 @@ defmodule MatrixServer.RoomServer do
GenServer.call(pid, {:server_in_room, domain})
end
@spec get_state_at_event(pid(), Event.t()) :: {[Event.t()], [Event.t()]}
def get_state_at_event(pid, event) do
GenServer.call(pid, {:get_state_at_event, event})
end
@spec get_state_ids_at_event(pid(), Event.t()) :: {[String.t()], [String.t()]}
def get_state_ids_at_event(pid, event) do
GenServer.call(pid, {:get_state_ids_at_event, event})
end
### Implementation
@impl true
@ -128,6 +134,26 @@ defmodule MatrixServer.RoomServer do
{:reply, {state_events, auth_chain}, state}
end
def handle_call({:get_state_ids_at_event, %Event{room_id: room_id} = event}, _from, state) do
room_events =
Event
|> where([e], e.room_id == ^room_id)
|> select([e], {e.event_id, e})
|> Repo.all()
|> Enum.into(%{})
state_set = StateResolution.resolve(event, false)
state_events = Enum.map(state_set, fn {_, %Event{event_id: event_id}} -> event_id end)
auth_chain =
state_set
|> Map.values()
|> StateResolution.full_auth_chain(room_events)
|> MapSet.to_list()
{:reply, {state_events, auth_chain}, state}
end
defp create_room_insert_events(room, account, %CreateRoom{
room_version: room_version,
preset: preset,