56 lines
1.4 KiB
Elixir
56 lines
1.4 KiB
Elixir
|
defmodule MatrixServerWeb.Federation.QueryController do
|
||
|
use MatrixServerWeb, :controller
|
||
|
use MatrixServerWeb.AuthenticateServer
|
||
|
|
||
|
import MatrixServerWeb.Plug.Error
|
||
|
import Ecto.Query
|
||
|
|
||
|
alias MatrixServer.{Repo, Account}
|
||
|
|
||
|
defmodule ProfileRequest do
|
||
|
use Ecto.Schema
|
||
|
|
||
|
import Ecto.Changeset
|
||
|
|
||
|
@primary_key false
|
||
|
embedded_schema do
|
||
|
field :user_id, :string
|
||
|
field :field, :string
|
||
|
end
|
||
|
|
||
|
def validate(params) do
|
||
|
%__MODULE__{}
|
||
|
|> cast(params, [:user_id, :field])
|
||
|
|> validate_required([:user_id])
|
||
|
|> validate_inclusion(:field, ["displayname", "avatar_url"])
|
||
|
|> tap(fn
|
||
|
%Ecto.Changeset{valid?: true} = cs -> {:ok, apply_changes(cs)}
|
||
|
_ -> :error
|
||
|
end)
|
||
|
end
|
||
|
end
|
||
|
|
||
|
def profile(conn, params) do
|
||
|
with %ProfileRequest{user_id: user_id} <- ProfileRequest.validate(params) do
|
||
|
if MatrixServer.get_domain(user_id) == MatrixServer.server_name() do
|
||
|
localpart = MatrixServer.get_localpart(user_id)
|
||
|
|
||
|
case Repo.one(from a in Account, where: a.localpart == ^localpart) do
|
||
|
%Account{} ->
|
||
|
# TODO: Return displayname and avatar_url when we implement them.
|
||
|
conn
|
||
|
|> put_status(200)
|
||
|
|> json(%{})
|
||
|
|
||
|
nil ->
|
||
|
put_error(:not_found, "User does not exist.")
|
||
|
end
|
||
|
else
|
||
|
put_error(:not_found, "Wrong server name.")
|
||
|
end
|
||
|
else
|
||
|
_ -> put_error(conn, :bad_json)
|
||
|
end
|
||
|
end
|
||
|
end
|