Improve primary keys usage
This commit is contained in:
parent
232df26b85
commit
40f3eeff7c
16 changed files with 66 additions and 48 deletions
|
@ -183,7 +183,7 @@ defmodule Architex.RoomServer do
|
||||||
|
|
||||||
state_set =
|
state_set =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.event_id in ^state_event_ids)
|
|> where([e], e.id in ^state_event_ids)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.into(%{}, fn %Event{type: type, state_key: state_key} = event ->
|
|> Enum.into(%{}, fn %Event{type: type, state_key: state_key} = event ->
|
||||||
{{type, state_key}, event}
|
{{type, state_key}, event}
|
||||||
|
@ -228,7 +228,7 @@ defmodule Architex.RoomServer do
|
||||||
room_events =
|
room_events =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.room_id == ^room_id)
|
|> where([e], e.room_id == ^room_id)
|
||||||
|> select([e], {e.event_id, e})
|
|> select([e], {e.id, e})
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.into(%{})
|
|> Enum.into(%{})
|
||||||
|
|
||||||
|
@ -248,12 +248,12 @@ defmodule Architex.RoomServer do
|
||||||
room_events =
|
room_events =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.room_id == ^room_id)
|
|> where([e], e.room_id == ^room_id)
|
||||||
|> select([e], {e.event_id, e})
|
|> select([e], {e.id, e})
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.into(%{})
|
|> Enum.into(%{})
|
||||||
|
|
||||||
state_set = StateResolution.resolve(event, false)
|
state_set = StateResolution.resolve(event, false)
|
||||||
state_events = Enum.map(state_set, fn {_, %Event{event_id: event_id}} -> event_id end)
|
state_events = Enum.map(state_set, fn {_, %Event{id: event_id}} -> event_id end)
|
||||||
|
|
||||||
auth_chain =
|
auth_chain =
|
||||||
state_set
|
state_set
|
||||||
|
@ -372,7 +372,7 @@ defmodule Architex.RoomServer do
|
||||||
defp insert_custom_message(
|
defp insert_custom_message(
|
||||||
state_set,
|
state_set,
|
||||||
room,
|
room,
|
||||||
%Device{id: device_id} = device,
|
%Device{nid: device_nid} = device,
|
||||||
message_event,
|
message_event,
|
||||||
txn_id
|
txn_id
|
||||||
) do
|
) do
|
||||||
|
@ -380,13 +380,13 @@ defmodule Architex.RoomServer do
|
||||||
# Check if we already executed this transaction.
|
# Check if we already executed this transaction.
|
||||||
case Repo.one(
|
case Repo.one(
|
||||||
from dt in DeviceTransaction,
|
from dt in DeviceTransaction,
|
||||||
where: dt.txn_id == ^txn_id and dt.device_id == ^device_id
|
where: dt.txn_id == ^txn_id and dt.device_nid == ^device_nid
|
||||||
) do
|
) do
|
||||||
%DeviceTransaction{event_id: event_id} ->
|
%DeviceTransaction{event_id: event_id} ->
|
||||||
{state_set, room, event_id}
|
{state_set, room, event_id}
|
||||||
|
|
||||||
nil ->
|
nil ->
|
||||||
with {state_set, room, %Event{event_id: event_id}} <-
|
with {state_set, room, %Event{id: event_id}} <-
|
||||||
insert_single_event(room, state_set, message_event).() do
|
insert_single_event(room, state_set, message_event).() do
|
||||||
# Mark this transaction as done.
|
# Mark this transaction as done.
|
||||||
Ecto.build_assoc(device, :device_transactions, txn_id: txn_id, event_id: event_id)
|
Ecto.build_assoc(device, :device_transactions, txn_id: txn_id, event_id: event_id)
|
||||||
|
@ -462,7 +462,7 @@ defmodule Architex.RoomServer do
|
||||||
# instead of the state_set state.
|
# instead of the state_set state.
|
||||||
# Create custom type for this.
|
# Create custom type for this.
|
||||||
serialized_state_set =
|
serialized_state_set =
|
||||||
Enum.map(state_set, fn {{type, state_key}, %Event{event_id: event_id}} ->
|
Enum.map(state_set, fn {{type, state_key}, %Event{id: event_id}} ->
|
||||||
[type, state_key, event_id]
|
[type, state_key, event_id]
|
||||||
end)
|
end)
|
||||||
|
|
||||||
|
@ -538,7 +538,7 @@ defmodule Architex.RoomServer do
|
||||||
state_set
|
state_set
|
||||||
|> Map.take(state_pairs)
|
|> Map.take(state_pairs)
|
||||||
|> Map.values()
|
|> Map.values()
|
||||||
|> Enum.map(fn %Event{event_id: event_id} -> event_id end)
|
|> Enum.map(fn %Event{id: event_id} -> event_id end)
|
||||||
end
|
end
|
||||||
|
|
||||||
# Get the auth events specific to m.room.member events.
|
# Get the auth events specific to m.room.member events.
|
||||||
|
|
|
@ -71,7 +71,7 @@ defmodule Architex.Account do
|
||||||
|
|
||||||
device_params = %{
|
device_params = %{
|
||||||
display_name: initial_device_display_name,
|
display_name: initial_device_display_name,
|
||||||
device_id: device_id
|
id: device_id
|
||||||
}
|
}
|
||||||
|
|
||||||
Ecto.build_assoc(account, :devices, access_token: access_token)
|
Ecto.build_assoc(account, :devices, access_token: access_token)
|
||||||
|
|
|
@ -7,14 +7,16 @@ defmodule Architex.Device do
|
||||||
alias ArchitexWeb.Client.Request.Login
|
alias ArchitexWeb.Client.Request.Login
|
||||||
|
|
||||||
@type t :: %__MODULE__{
|
@type t :: %__MODULE__{
|
||||||
device_id: String.t(),
|
nid: integer(),
|
||||||
|
id: String.t(),
|
||||||
access_token: String.t(),
|
access_token: String.t(),
|
||||||
display_name: String.t(),
|
display_name: String.t(),
|
||||||
account_id: integer()
|
account_id: integer()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@primary_key {:nid, :id, autogenerate: true}
|
||||||
schema "devices" do
|
schema "devices" do
|
||||||
field :device_id, :string
|
field :id, :string
|
||||||
field :access_token, :string, redact: true
|
field :access_token, :string, redact: true
|
||||||
field :display_name, :string
|
field :display_name, :string
|
||||||
|
|
||||||
|
@ -24,9 +26,9 @@ defmodule Architex.Device do
|
||||||
|
|
||||||
def changeset(device, params \\ %{}) do
|
def changeset(device, params \\ %{}) do
|
||||||
device
|
device
|
||||||
|> cast(params, [:display_name, :device_id])
|
|> cast(params, [:display_name, :id])
|
||||||
|> validate_required([:device_id])
|
|> validate_required([:id])
|
||||||
|> unique_constraint([:device_id, :account_id], name: :devices_device_id_account_id_index)
|
|> unique_constraint([:id, :account_id], name: :devices_id_account_id_index)
|
||||||
end
|
end
|
||||||
|
|
||||||
def generate_access_token(localpart, device_id) do
|
def generate_access_token(localpart, device_id) do
|
||||||
|
@ -47,7 +49,7 @@ defmodule Architex.Device do
|
||||||
|
|
||||||
update_query =
|
update_query =
|
||||||
from(d in Device)
|
from(d in Device)
|
||||||
|> update(set: [access_token: ^access_token, device_id: ^device_id])
|
|> update(set: [access_token: ^access_token, id: ^device_id])
|
||||||
|> then(fn q ->
|
|> then(fn q ->
|
||||||
if initial_device_display_name do
|
if initial_device_display_name do
|
||||||
update(q, set: [display_name: ^initial_device_display_name])
|
update(q, set: [display_name: ^initial_device_display_name])
|
||||||
|
@ -57,13 +59,13 @@ defmodule Architex.Device do
|
||||||
end)
|
end)
|
||||||
|
|
||||||
device_params = %{
|
device_params = %{
|
||||||
device_id: device_id,
|
id: device_id,
|
||||||
display_name: initial_device_display_name
|
display_name: initial_device_display_name
|
||||||
}
|
}
|
||||||
|
|
||||||
Ecto.build_assoc(account, :devices)
|
Ecto.build_assoc(account, :devices)
|
||||||
|> Device.changeset(device_params)
|
|> Device.changeset(device_params)
|
||||||
|> put_change(:access_token, access_token)
|
|> put_change(:access_token, access_token)
|
||||||
|> Repo.insert(on_conflict: update_query, conflict_target: [:account_id, :device_id])
|
|> Repo.insert(on_conflict: update_query, conflict_target: [:account_id, :id])
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -6,13 +6,13 @@ defmodule Architex.DeviceTransaction do
|
||||||
@type t :: %__MODULE__{
|
@type t :: %__MODULE__{
|
||||||
txn_id: String.t(),
|
txn_id: String.t(),
|
||||||
event_id: String.t(),
|
event_id: String.t(),
|
||||||
device_id: integer()
|
device_nid: integer()
|
||||||
}
|
}
|
||||||
|
|
||||||
@primary_key {:txn_id, :string, []}
|
@primary_key {:txn_id, :string, []}
|
||||||
schema "device_transactions" do
|
schema "device_transactions" do
|
||||||
field :event_id, :string
|
field :event_id, :string
|
||||||
|
|
||||||
belongs_to :device, Device
|
belongs_to :device, Device, references: :nid, foreign_key: :device_nid
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -20,7 +20,7 @@ defmodule Architex.Event do
|
||||||
hashes: map() | nil
|
hashes: map() | nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@primary_key {:event_id, :string, []}
|
@primary_key {:nid, :id, autogenerate: true}
|
||||||
schema "events" do
|
schema "events" do
|
||||||
field :type, :string
|
field :type, :string
|
||||||
field :origin_server_ts, :integer
|
field :origin_server_ts, :integer
|
||||||
|
@ -32,6 +32,7 @@ defmodule Architex.Event do
|
||||||
field :unsigned, :map
|
field :unsigned, :map
|
||||||
field :signatures, {:map, {:map, :string}}
|
field :signatures, {:map, {:map, :string}}
|
||||||
field :hashes, {:map, :string}
|
field :hashes, {:map, :string}
|
||||||
|
field :id, :string
|
||||||
|
|
||||||
belongs_to :room, Room, type: :string
|
belongs_to :room, Room, type: :string
|
||||||
end
|
end
|
||||||
|
@ -125,12 +126,12 @@ defmodule Architex.Event do
|
||||||
def prevalidate(%Event{auth_events: auth_event_ids, prev_events: prev_event_ids} = event) do
|
def prevalidate(%Event{auth_events: auth_event_ids, prev_events: prev_event_ids} = event) do
|
||||||
prev_events =
|
prev_events =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.event_id in ^prev_event_ids)
|
|> where([e], e.id in ^prev_event_ids)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|
|
||||||
auth_events =
|
auth_events =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.event_id in ^auth_event_ids)
|
|> where([e], e.id in ^auth_event_ids)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|
|
||||||
state_pairs = Enum.map(auth_events, &{&1.type, &1.state_key})
|
state_pairs = Enum.map(auth_events, &{&1.type, &1.state_key})
|
||||||
|
@ -237,7 +238,7 @@ defmodule Architex.Event do
|
||||||
event
|
event
|
||||||
|> Architex.to_serializable_map()
|
|> Architex.to_serializable_map()
|
||||||
|> Map.take([
|
|> Map.take([
|
||||||
:event_id,
|
:id,
|
||||||
:type,
|
:type,
|
||||||
:room_id,
|
:room_id,
|
||||||
:sender,
|
:sender,
|
||||||
|
@ -305,7 +306,7 @@ defmodule Architex.Event do
|
||||||
@spec set_event_id(t()) :: {:ok, t()} | {:error, Jason.EncodeError.t()}
|
@spec set_event_id(t()) :: {:ok, t()} | {:error, Jason.EncodeError.t()}
|
||||||
def set_event_id(event) do
|
def set_event_id(event) do
|
||||||
with {:ok, event_id} <- generate_event_id(event) do
|
with {:ok, event_id} <- generate_event_id(event) do
|
||||||
{:ok, %Event{event | event_id: event_id}}
|
{:ok, %Event{event | id: event_id}}
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
|
@ -18,7 +18,7 @@ defmodule Architex.Room do
|
||||||
field :visibility, Ecto.Enum, values: [:public, :private]
|
field :visibility, Ecto.Enum, values: [:public, :private]
|
||||||
field :state, {:array, {:array, :string}}
|
field :state, {:array, {:array, :string}}
|
||||||
field :forward_extremities, {:array, :string}
|
field :forward_extremities, {:array, :string}
|
||||||
has_many :events, Event, foreign_key: :event_id
|
has_many :events, Event, foreign_key: :room_id
|
||||||
has_many :aliases, Alias, foreign_key: :room_id
|
has_many :aliases, Alias, foreign_key: :room_id
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -39,7 +39,7 @@ defmodule Architex.Room do
|
||||||
|
|
||||||
def update_forward_extremities(
|
def update_forward_extremities(
|
||||||
%Event{
|
%Event{
|
||||||
event_id: event_id,
|
id: event_id,
|
||||||
prev_events: prev_event_ids
|
prev_events: prev_event_ids
|
||||||
},
|
},
|
||||||
%Room{id: room_id, forward_extremities: forward_extremities}
|
%Room{id: room_id, forward_extremities: forward_extremities}
|
||||||
|
|
|
@ -31,7 +31,7 @@ defmodule Architex.StateResolution do
|
||||||
room_events =
|
room_events =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.room_id == ^room_id)
|
|> where([e], e.room_id == ^room_id)
|
||||||
|> select([e], {e.event_id, e})
|
|> select([e], {e.id, e})
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.into(%{})
|
|> Enum.into(%{})
|
||||||
|
|
||||||
|
@ -61,14 +61,14 @@ defmodule Architex.StateResolution do
|
||||||
room_events =
|
room_events =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.room_id == ^room_id)
|
|> where([e], e.room_id == ^room_id)
|
||||||
|> select([e], {e.event_id, e})
|
|> select([e], {e.id, e})
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.into(%{})
|
|> Enum.into(%{})
|
||||||
|
|
||||||
Event
|
Event
|
||||||
|> where([e], e.room_id == ^room_id)
|
|> where([e], e.room_id == ^room_id)
|
||||||
|> join(:inner, [e], r in Room, on: e.room_id == r.id)
|
|> join(:inner, [e], r in Room, on: e.room_id == r.id)
|
||||||
|> where([e, r], e.event_id == fragment("ANY(?)", r.forward_extremities))
|
|> where([e, r], e.id == fragment("ANY(?)", r.forward_extremities))
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.map(&resolve/1)
|
|> Enum.map(&resolve/1)
|
||||||
|> do_resolve(room_events)
|
|> do_resolve(room_events)
|
||||||
|
@ -141,7 +141,7 @@ defmodule Architex.StateResolution do
|
||||||
|> Enum.into(%{}, fn state_pair ->
|
|> Enum.into(%{}, fn state_pair ->
|
||||||
events =
|
events =
|
||||||
Enum.map(state_sets, fn
|
Enum.map(state_sets, fn
|
||||||
state_set when is_map_key(state_set, state_pair) -> state_set[state_pair].event_id
|
state_set when is_map_key(state_set, state_pair) -> state_set[state_pair].id
|
||||||
_ -> nil
|
_ -> nil
|
||||||
end)
|
end)
|
||||||
|> MapSet.new()
|
|> MapSet.new()
|
||||||
|
@ -185,7 +185,7 @@ defmodule Architex.StateResolution do
|
||||||
defp auth_chain(%Event{auth_events: auth_events}, room_events) do
|
defp auth_chain(%Event{auth_events: auth_events}, room_events) do
|
||||||
auth_events
|
auth_events
|
||||||
|> Enum.map(&room_events[&1])
|
|> Enum.map(&room_events[&1])
|
||||||
|> Enum.reduce(MapSet.new(), fn %Event{event_id: auth_event_id} = auth_event, acc ->
|
|> Enum.reduce(MapSet.new(), fn %Event{id: auth_event_id} = auth_event, acc ->
|
||||||
auth_event
|
auth_event
|
||||||
|> auth_chain(room_events)
|
|> auth_chain(room_events)
|
||||||
|> MapSet.union(acc)
|
|> MapSet.union(acc)
|
||||||
|
@ -194,8 +194,8 @@ defmodule Architex.StateResolution do
|
||||||
end
|
end
|
||||||
|
|
||||||
defp rev_top_pow_order(room_events) do
|
defp rev_top_pow_order(room_events) do
|
||||||
fn %Event{origin_server_ts: timestamp1, event_id: event_id1} = event1,
|
fn %Event{origin_server_ts: timestamp1, id: event_id1} = event1,
|
||||||
%Event{origin_server_ts: timestamp2, event_id: event_id2} = event2 ->
|
%Event{origin_server_ts: timestamp2, id: event_id2} = event2 ->
|
||||||
power1 = get_power_level(event1, room_events)
|
power1 = get_power_level(event1, room_events)
|
||||||
power2 = get_power_level(event2, room_events)
|
power2 = get_power_level(event2, room_events)
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,7 @@ defmodule Architex.StateResolution.Authorization do
|
||||||
def authorized?(
|
def authorized?(
|
||||||
%Event{type: "m.room.member", state_key: state_key, prev_events: [create_id]},
|
%Event{type: "m.room.member", state_key: state_key, prev_events: [create_id]},
|
||||||
%{
|
%{
|
||||||
{"m.room.create", ""} => %Event{event_id: create_id, content: %{"creator" => creator}}
|
{"m.room.create", ""} => %Event{id: create_id, content: %{"creator" => creator}}
|
||||||
}
|
}
|
||||||
),
|
),
|
||||||
do: state_key == creator
|
do: state_key == creator
|
||||||
|
@ -306,7 +306,7 @@ defmodule Architex.StateResolution.Authorization do
|
||||||
# We assume the auth events are validated beforehand.
|
# We assume the auth events are validated beforehand.
|
||||||
state_set =
|
state_set =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.event_id in ^auth_event_ids)
|
|> where([e], e.id in ^auth_event_ids)
|
||||||
|> Repo.all()
|
|> Repo.all()
|
||||||
|> Enum.reduce(%{}, &update_state_set/2)
|
|> Enum.reduce(%{}, &update_state_set/2)
|
||||||
|
|
||||||
|
|
|
@ -40,7 +40,7 @@ defmodule ArchitexWeb.Client.LoginController do
|
||||||
case Account.login(input) |> Repo.transaction() do
|
case Account.login(input) |> Repo.transaction() do
|
||||||
{:ok,
|
{:ok,
|
||||||
{%Account{localpart: localpart},
|
{%Account{localpart: localpart},
|
||||||
%Device{access_token: access_token, device_id: device_id}}} ->
|
%Device{access_token: access_token, id: device_id}}} ->
|
||||||
data = %{
|
data = %{
|
||||||
user_id: Architex.get_mxid(localpart),
|
user_id: Architex.get_mxid(localpart),
|
||||||
access_token: access_token,
|
access_token: access_token,
|
||||||
|
|
|
@ -24,7 +24,7 @@ defmodule ArchitexWeb.Client.RegisterController do
|
||||||
{:ok,
|
{:ok,
|
||||||
%{
|
%{
|
||||||
account: %Account{localpart: localpart},
|
account: %Account{localpart: localpart},
|
||||||
device: %Device{device_id: device_id, access_token: access_token}
|
device: %Device{id: device_id, access_token: access_token}
|
||||||
}} ->
|
}} ->
|
||||||
data = %{user_id: Architex.get_mxid(localpart)}
|
data = %{user_id: Architex.get_mxid(localpart)}
|
||||||
|
|
||||||
|
|
|
@ -232,4 +232,13 @@ defmodule ArchitexWeb.Client.RoomController do
|
||||||
put_error(conn, :not_found, "The given room was not found.")
|
put_error(conn, :not_found, "The given room was not found.")
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
# GET /_matrix/client/r0/rooms/!atYDsyowueiToUvuqY:localhost:4000/messages
|
||||||
|
# Parameters: %{"dir" => "b", "from" => "", "limit" => "727", "path" => ["_matrix", "client", "r0", "rooms", "!atYDsyowueiToUvuqY:localhost:4000", "messages"]}
|
||||||
|
def message(conn, params) do
|
||||||
|
|
||||||
|
conn
|
||||||
|
|> send_resp(400, [])
|
||||||
|
|> halt()
|
||||||
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -16,7 +16,7 @@ defmodule ArchitexWeb.Federation.EventController do
|
||||||
def event(%Plug.Conn{assigns: %{origin: origin}} = conn, %{"event_id" => event_id}) do
|
def event(%Plug.Conn{assigns: %{origin: origin}} = conn, %{"event_id" => event_id}) do
|
||||||
query =
|
query =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.event_id == ^event_id)
|
|> where([e], e.id == ^event_id)
|
||||||
|> preload(:room)
|
|> preload(:room)
|
||||||
|
|
||||||
case Repo.one(query) do
|
case Repo.one(query) do
|
||||||
|
@ -82,7 +82,7 @@ defmodule ArchitexWeb.Federation.EventController do
|
||||||
defp get_state_or_state_ids(conn, state_or_state_ids, origin, event_id, room_id) do
|
defp get_state_or_state_ids(conn, state_or_state_ids, origin, event_id, room_id) do
|
||||||
query =
|
query =
|
||||||
Event
|
Event
|
||||||
|> where([e], e.event_id == ^event_id and e.room_id == ^room_id)
|
|> where([e], e.id == ^event_id and e.room_id == ^room_id)
|
||||||
|> preload(:room)
|
|> preload(:room)
|
||||||
|
|
||||||
case Repo.one(query) do
|
case Repo.one(query) do
|
||||||
|
|
|
@ -67,6 +67,7 @@ defmodule ArchitexWeb.Router do
|
||||||
post "/ban", RoomController, :ban
|
post "/ban", RoomController, :ban
|
||||||
post "/unban", RoomController, :unban
|
post "/unban", RoomController, :unban
|
||||||
put "/send/:event_type/:txn_id", RoomController, :send_message
|
put "/send/:event_type/:txn_id", RoomController, :send_message
|
||||||
|
get "/messages", RoomController, :messages
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -11,9 +11,9 @@ defmodule Architex.Repo.Migrations.CreateInitialTables do
|
||||||
create index(:accounts, [:localpart], unique: true)
|
create index(:accounts, [:localpart], unique: true)
|
||||||
|
|
||||||
create table(:rooms, primary_key: false) do
|
create table(:rooms, primary_key: false) do
|
||||||
|
add :id, :string, primary_key: true, null: false
|
||||||
add :state, {:array, {:array, :string}}, default: [], null: false
|
add :state, {:array, {:array, :string}}, default: [], null: false
|
||||||
add :forward_extremities, {:array, :string}, default: [], null: false
|
add :forward_extremities, {:array, :string}, default: [], null: false
|
||||||
add :id, :string, primary_key: true, null: false
|
|
||||||
add :visibility, :string, null: false, default: "public"
|
add :visibility, :string, null: false, default: "public"
|
||||||
end
|
end
|
||||||
|
|
||||||
|
@ -26,11 +26,13 @@ defmodule Architex.Repo.Migrations.CreateInitialTables do
|
||||||
end
|
end
|
||||||
|
|
||||||
create table(:events, primary_key: false) do
|
create table(:events, primary_key: false) do
|
||||||
|
add :nid, :serial, primary_key: true
|
||||||
|
|
||||||
add :origin_server_ts, :bigint, null: false
|
add :origin_server_ts, :bigint, null: false
|
||||||
add :unsigned, :map, default: %{}, null: true
|
add :unsigned, :map, default: %{}, null: true
|
||||||
add :hashes, :map, null: false
|
add :hashes, :map, null: false
|
||||||
add :signatures, :map, null: false
|
add :signatures, :map, null: false
|
||||||
add :event_id, :string, null: false
|
add :id, :string, null: false
|
||||||
add :content, :map
|
add :content, :map
|
||||||
add :type, :string, null: false
|
add :type, :string, null: false
|
||||||
add :state_key, :string
|
add :state_key, :string
|
||||||
|
@ -40,6 +42,8 @@ defmodule Architex.Repo.Migrations.CreateInitialTables do
|
||||||
add :room_id, references(:rooms, type: :string), null: false
|
add :room_id, references(:rooms, type: :string), null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
|
create index(:events, [:id], unique: true)
|
||||||
|
|
||||||
create table(:server_key_info, primary_key: false) do
|
create table(:server_key_info, primary_key: false) do
|
||||||
add :valid_until, :bigint, default: 0, null: false
|
add :valid_until, :bigint, default: 0, null: false
|
||||||
add :server_name, :string, primary_key: true, null: false
|
add :server_name, :string, primary_key: true, null: false
|
||||||
|
@ -61,21 +65,22 @@ defmodule Architex.Repo.Migrations.CreateInitialTables do
|
||||||
|
|
||||||
create index(:aliases, [:room_id])
|
create index(:aliases, [:room_id])
|
||||||
|
|
||||||
create table(:devices) do
|
create table(:devices, primary_key: false) do
|
||||||
add :device_id, :string, null: false
|
add :nid, :serial, primary_key: true
|
||||||
|
add :id, :string, null: false
|
||||||
add :access_token, :string, null: false
|
add :access_token, :string, null: false
|
||||||
add :display_name, :string
|
add :display_name, :string
|
||||||
|
|
||||||
add :account_id, references(:accounts, on_delete: :delete_all), null: false
|
add :account_id, references(:accounts, on_delete: :delete_all), null: false
|
||||||
end
|
end
|
||||||
|
|
||||||
create index(:devices, [:device_id, :account_id], unique: true)
|
create index(:devices, [:id, :account_id], unique: true)
|
||||||
create index(:devices, [:account_id])
|
create index(:devices, [:account_id])
|
||||||
create index(:devices, [:access_token], unique: true)
|
create index(:devices, [:access_token], unique: true)
|
||||||
|
|
||||||
create table(:device_transactions, primary_key: false) do
|
create table(:device_transactions, primary_key: false) do
|
||||||
add :txn_id, :string, primary_key: true, null: false
|
add :txn_id, :string, primary_key: true, null: false
|
||||||
add :device_id, references(:devices, on_delete: :delete_all), primary_key: true, null: false
|
add :device_nid, references(:devices, column: :nid, on_delete: :delete_all), primary_key: true
|
||||||
add :event_id, :string, null: false
|
add :event_id, :string, null: false
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
|
@ -8,7 +8,7 @@ account =
|
||||||
|
|
||||||
account
|
account
|
||||||
|> Ecto.build_assoc(:devices,
|
|> Ecto.build_assoc(:devices,
|
||||||
device_id: "android",
|
id: "android",
|
||||||
display_name: "My Android",
|
display_name: "My Android",
|
||||||
access_token: "sneed"
|
access_token: "sneed"
|
||||||
)
|
)
|
||||||
|
|
|
@ -15,7 +15,7 @@ defmodule Architex.Factory do
|
||||||
device_id = sequence(:device_id, &"device#{&1}")
|
device_id = sequence(:device_id, &"device#{&1}")
|
||||||
|
|
||||||
%Device{
|
%Device{
|
||||||
device_id: device_id,
|
id: device_id,
|
||||||
access_token: Device.generate_access_token(localpart, device_id),
|
access_token: Device.generate_access_token(localpart, device_id),
|
||||||
display_name: sequence(:display_name, &"Device #{&1}"),
|
display_name: sequence(:display_name, &"Device #{&1}"),
|
||||||
account: account
|
account: account
|
||||||
|
|
Loading…
Reference in a new issue