Switch to HTTP

This commit is contained in:
Maciej 2026-03-01 10:05:55 +02:00
parent 984ac15084
commit 45f55083fc
Signed by: maciej
GPG key ID: 28243AF437E32F99
9 changed files with 221 additions and 30 deletions

View file

@ -4,27 +4,13 @@ defmodule BirdyChatWeb.Api.Messages.Controller do
def create(conn, params) do
case BirdyChat.Message.validate(params) do
{:ok, changeset} ->
case BirdyChat.Message.find_peer(changeset.changes) do
{:ok, :local} ->
case BirdyChat.MessageWriter.write(changeset.changes) do
:ok ->
conn
|> put_status(:created)
|> render(:create, message: changeset.changes)
end
{:ok, peer_name} ->
BirdyChatWeb.ServerChannel.broadcast!(peer_name, changeset.changes)
case BirdyChat.Dispatcher.dispatch(changeset) do
:ok ->
conn
|> put_status(:created)
|> render(:create, message: changeset.changes)
{:error, :not_found} ->
changeset =
changeset
|> Ecto.Changeset.add_error(:to, "Unknown 'to' server")
:error ->
conn
|> put_status(:unprocessable_entity)
|> render(:error, changeset: changeset)

View file

@ -0,0 +1,34 @@
defmodule BirdyChatWeb.Api.Server.Internal.Controller do
use BirdyChatWeb, :controller
def create(conn, params) do
if authorised?(conn.req_headers, params) do
case BirdyChat.Message.validate(params) do
{:ok, changeset} ->
case BirdyChat.MessageWriter.write(changeset.changes) do
:ok ->
conn
|> put_status(:created)
|> render(:create, message: changeset.changes)
end
end
else
conn
|> put_status(:forbidden)
|> render(:error, message: "Unauthorised")
end
end
defp authorised?(headers, %{"from" => from}) do
case Enum.find(headers, fn {key, _value} -> key == "authorization" end) do
nil ->
false
{"authorization", token} ->
case Phoenix.Token.verify(BirdyChatWeb.Endpoint, "serverAuth", token, max_age: 1200) do
{:ok, id} -> id == from
{:error, :invalid} -> false
end
end
end
end

View file

@ -0,0 +1,18 @@
defmodule BirdyChatWeb.Api.Server.Internal.JSON do
def render("create.json", %{message: message}) do
message
end
def render("error.json", %{message: message}) do
%{errors: %{"general" => Gettext.dgettext(BirdyChatWeb.Gettext, "errors", message, [])}}
end
def render("error.json", %{changeset: changeset}) do
errors = Ecto.Changeset.traverse_errors(changeset, &get_error/1)
%{errors: errors}
end
def get_error({msg, opts}) do
Gettext.dgettext(BirdyChatWeb.Gettext, "errors", msg, opts)
end
end