2021-06-25 15:43:12 +00:00
|
|
|
defmodule MatrixServer.Device do
|
|
|
|
use Ecto.Schema
|
|
|
|
import Ecto.Changeset
|
|
|
|
alias MatrixServer.{Account, Device}
|
|
|
|
|
|
|
|
@primary_key false
|
|
|
|
schema "devices" do
|
|
|
|
field :device_id, :string, primary_key: true
|
|
|
|
field :access_token, :string
|
|
|
|
field :display_name, :string
|
|
|
|
|
|
|
|
belongs_to :account, Account,
|
|
|
|
foreign_key: :localpart,
|
|
|
|
references: :localpart,
|
|
|
|
type: :string,
|
|
|
|
primary_key: true
|
|
|
|
end
|
|
|
|
|
|
|
|
def changeset(device, params \\ %{}) do
|
|
|
|
device
|
2021-06-27 15:28:28 +00:00
|
|
|
|> cast(params, [:display_name, :device_id])
|
2021-06-25 15:43:12 +00:00
|
|
|
|> validate_required([:localpart, :device_id])
|
|
|
|
|> unique_constraint([:localpart, :device_id], name: :devices_pkey)
|
|
|
|
end
|
|
|
|
|
2021-06-27 15:28:28 +00:00
|
|
|
def insert_new_access_token(repo, %{
|
2021-06-25 22:29:33 +00:00
|
|
|
device: %Device{localpart: localpart, device_id: device_id} = device
|
|
|
|
}) do
|
2021-06-27 15:28:28 +00:00
|
|
|
access_token = generate_access_token(localpart, device_id)
|
2021-06-25 22:29:33 +00:00
|
|
|
|
2021-06-25 15:43:12 +00:00
|
|
|
device
|
|
|
|
|> change(%{access_token: access_token})
|
|
|
|
|> repo.update()
|
|
|
|
end
|
2021-06-26 20:02:18 +00:00
|
|
|
|
2021-06-27 15:28:28 +00:00
|
|
|
def generate_access_token(localpart, device_id) do
|
|
|
|
Phoenix.Token.encrypt(MatrixServerWeb.Endpoint, "access_token", {localpart, device_id})
|
|
|
|
end
|
|
|
|
|
|
|
|
def generate_device_id(localpart) do
|
2021-06-26 20:02:18 +00:00
|
|
|
time_string =
|
|
|
|
DateTime.utc_now()
|
|
|
|
|> DateTime.to_unix()
|
|
|
|
|> Integer.to_string()
|
|
|
|
|
|
|
|
"#{localpart}_#{time_string}"
|
|
|
|
end
|
2021-06-25 15:43:12 +00:00
|
|
|
end
|