Improve primary keys usage
This commit is contained in:
parent
232df26b85
commit
40f3eeff7c
16 changed files with 66 additions and 48 deletions
|
@ -71,7 +71,7 @@ defmodule Architex.Account do
|
|||
|
||||
device_params = %{
|
||||
display_name: initial_device_display_name,
|
||||
device_id: device_id
|
||||
id: device_id
|
||||
}
|
||||
|
||||
Ecto.build_assoc(account, :devices, access_token: access_token)
|
||||
|
|
|
@ -7,14 +7,16 @@ defmodule Architex.Device do
|
|||
alias ArchitexWeb.Client.Request.Login
|
||||
|
||||
@type t :: %__MODULE__{
|
||||
device_id: String.t(),
|
||||
nid: integer(),
|
||||
id: String.t(),
|
||||
access_token: String.t(),
|
||||
display_name: String.t(),
|
||||
account_id: integer()
|
||||
}
|
||||
|
||||
@primary_key {:nid, :id, autogenerate: true}
|
||||
schema "devices" do
|
||||
field :device_id, :string
|
||||
field :id, :string
|
||||
field :access_token, :string, redact: true
|
||||
field :display_name, :string
|
||||
|
||||
|
@ -24,9 +26,9 @@ defmodule Architex.Device do
|
|||
|
||||
def changeset(device, params \\ %{}) do
|
||||
device
|
||||
|> cast(params, [:display_name, :device_id])
|
||||
|> validate_required([:device_id])
|
||||
|> unique_constraint([:device_id, :account_id], name: :devices_device_id_account_id_index)
|
||||
|> cast(params, [:display_name, :id])
|
||||
|> validate_required([:id])
|
||||
|> unique_constraint([:id, :account_id], name: :devices_id_account_id_index)
|
||||
end
|
||||
|
||||
def generate_access_token(localpart, device_id) do
|
||||
|
@ -47,7 +49,7 @@ defmodule Architex.Device do
|
|||
|
||||
update_query =
|
||||
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 ->
|
||||
if initial_device_display_name do
|
||||
update(q, set: [display_name: ^initial_device_display_name])
|
||||
|
@ -57,13 +59,13 @@ defmodule Architex.Device do
|
|||
end)
|
||||
|
||||
device_params = %{
|
||||
device_id: device_id,
|
||||
id: device_id,
|
||||
display_name: initial_device_display_name
|
||||
}
|
||||
|
||||
Ecto.build_assoc(account, :devices)
|
||||
|> Device.changeset(device_params)
|
||||
|> 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
|
||||
|
|
|
@ -6,13 +6,13 @@ defmodule Architex.DeviceTransaction do
|
|||
@type t :: %__MODULE__{
|
||||
txn_id: String.t(),
|
||||
event_id: String.t(),
|
||||
device_id: integer()
|
||||
device_nid: integer()
|
||||
}
|
||||
|
||||
@primary_key {:txn_id, :string, []}
|
||||
schema "device_transactions" do
|
||||
field :event_id, :string
|
||||
|
||||
belongs_to :device, Device
|
||||
belongs_to :device, Device, references: :nid, foreign_key: :device_nid
|
||||
end
|
||||
end
|
||||
|
|
|
@ -20,7 +20,7 @@ defmodule Architex.Event do
|
|||
hashes: map() | nil
|
||||
}
|
||||
|
||||
@primary_key {:event_id, :string, []}
|
||||
@primary_key {:nid, :id, autogenerate: true}
|
||||
schema "events" do
|
||||
field :type, :string
|
||||
field :origin_server_ts, :integer
|
||||
|
@ -32,6 +32,7 @@ defmodule Architex.Event do
|
|||
field :unsigned, :map
|
||||
field :signatures, {:map, {:map, :string}}
|
||||
field :hashes, {:map, :string}
|
||||
field :id, :string
|
||||
|
||||
belongs_to :room, Room, type: :string
|
||||
end
|
||||
|
@ -125,12 +126,12 @@ defmodule Architex.Event do
|
|||
def prevalidate(%Event{auth_events: auth_event_ids, prev_events: prev_event_ids} = event) do
|
||||
prev_events =
|
||||
Event
|
||||
|> where([e], e.event_id in ^prev_event_ids)
|
||||
|> where([e], e.id in ^prev_event_ids)
|
||||
|> Repo.all()
|
||||
|
||||
auth_events =
|
||||
Event
|
||||
|> where([e], e.event_id in ^auth_event_ids)
|
||||
|> where([e], e.id in ^auth_event_ids)
|
||||
|> Repo.all()
|
||||
|
||||
state_pairs = Enum.map(auth_events, &{&1.type, &1.state_key})
|
||||
|
@ -237,7 +238,7 @@ defmodule Architex.Event do
|
|||
event
|
||||
|> Architex.to_serializable_map()
|
||||
|> Map.take([
|
||||
:event_id,
|
||||
:id,
|
||||
:type,
|
||||
:room_id,
|
||||
:sender,
|
||||
|
@ -305,7 +306,7 @@ defmodule Architex.Event do
|
|||
@spec set_event_id(t()) :: {:ok, t()} | {:error, Jason.EncodeError.t()}
|
||||
def set_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
|
||||
|
||||
|
|
|
@ -18,7 +18,7 @@ defmodule Architex.Room do
|
|||
field :visibility, Ecto.Enum, values: [:public, :private]
|
||||
field :state, {:array, {: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
|
||||
end
|
||||
|
||||
|
@ -39,7 +39,7 @@ defmodule Architex.Room do
|
|||
|
||||
def update_forward_extremities(
|
||||
%Event{
|
||||
event_id: event_id,
|
||||
id: event_id,
|
||||
prev_events: prev_event_ids
|
||||
},
|
||||
%Room{id: room_id, forward_extremities: forward_extremities}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue