2021-09-01 12:43:55 +00:00
|
|
|
defmodule ArchitexWeb.Federation.QueryController do
|
|
|
|
use ArchitexWeb, :controller
|
|
|
|
use ArchitexWeb.Federation.AuthenticateServer
|
2021-08-10 16:02:53 +00:00
|
|
|
|
2021-09-01 12:43:55 +00:00
|
|
|
import ArchitexWeb.Error
|
2021-08-10 16:02:53 +00:00
|
|
|
import Ecto.Query
|
|
|
|
|
2021-09-01 12:43:55 +00:00
|
|
|
alias Architex.{Repo, Account}
|
|
|
|
alias Architex.Types.UserId
|
2021-08-10 16:02:53 +00:00
|
|
|
|
|
|
|
defmodule ProfileRequest do
|
|
|
|
use Ecto.Schema
|
|
|
|
|
|
|
|
import Ecto.Changeset
|
|
|
|
|
|
|
|
@primary_key false
|
|
|
|
embedded_schema do
|
2021-08-19 14:31:03 +00:00
|
|
|
field :user_id, UserId
|
2021-08-10 16:02:53 +00:00
|
|
|
field :field, :string
|
|
|
|
end
|
|
|
|
|
|
|
|
def validate(params) do
|
|
|
|
%__MODULE__{}
|
|
|
|
|> cast(params, [:user_id, :field])
|
|
|
|
|> validate_required([:user_id])
|
|
|
|
|> validate_inclusion(:field, ["displayname", "avatar_url"])
|
2021-08-13 15:36:34 +00:00
|
|
|
|> then(fn
|
2021-08-10 16:02:53 +00:00
|
|
|
%Ecto.Changeset{valid?: true} = cs -> {:ok, apply_changes(cs)}
|
|
|
|
_ -> :error
|
|
|
|
end)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
|
2021-08-24 23:27:03 +00:00
|
|
|
@doc """
|
|
|
|
Performs a query to get profile information, such as a display name or avatar,
|
|
|
|
for a given user.
|
|
|
|
|
|
|
|
Action for GET /_matrix/federation/v1/query/profile.
|
|
|
|
"""
|
2021-08-10 16:02:53 +00:00
|
|
|
def profile(conn, params) do
|
2021-09-09 14:00:58 +00:00
|
|
|
with {:ok,
|
|
|
|
%ProfileRequest{user_id: %UserId{localpart: localpart, domain: domain}, field: field}} <-
|
2021-08-16 12:29:01 +00:00
|
|
|
ProfileRequest.validate(params) do
|
2021-09-01 12:43:55 +00:00
|
|
|
if domain == Architex.server_name() do
|
2021-08-10 16:02:53 +00:00
|
|
|
case Repo.one(from a in Account, where: a.localpart == ^localpart) do
|
2021-09-09 14:00:58 +00:00
|
|
|
%Account{displayname: displayname, avatar_url: avatar_url} ->
|
|
|
|
data = %{}
|
|
|
|
|
|
|
|
data =
|
|
|
|
if field == "displayname" or (field == nil and displayname != nil),
|
|
|
|
do: Map.put(data, :displayname, displayname),
|
|
|
|
else: data
|
|
|
|
|
|
|
|
data =
|
|
|
|
if field == "avatar_url" or (field == nil and avatar_url != nil),
|
|
|
|
do: Map.put(data, :avatar_url, avatar_url),
|
|
|
|
else: data
|
|
|
|
|
2021-08-10 16:02:53 +00:00
|
|
|
conn
|
|
|
|
|> put_status(200)
|
2021-09-09 14:00:58 +00:00
|
|
|
|> json(data)
|
2021-08-10 16:02:53 +00:00
|
|
|
|
|
|
|
nil ->
|
2021-08-13 15:36:34 +00:00
|
|
|
put_error(conn, :not_found, "User does not exist.")
|
2021-08-10 16:02:53 +00:00
|
|
|
end
|
|
|
|
else
|
2021-08-13 15:36:34 +00:00
|
|
|
put_error(conn, :not_found, "Wrong server name.")
|
2021-08-10 16:02:53 +00:00
|
|
|
end
|
|
|
|
else
|
|
|
|
_ -> put_error(conn, :bad_json)
|
|
|
|
end
|
|
|
|
end
|
|
|
|
end
|