31 lines
1.0 KiB
Elixir
31 lines
1.0 KiB
Elixir
defmodule MessageServer.RemoteHandler do
|
|
require Logger
|
|
|
|
@spec handle_remote_message(map()) :: :ok | {:error, String.t()}
|
|
def handle_remote_message(%{from: from, to: to, message: message}) do
|
|
with {:ok, to_server} <- extract_server_id(to),
|
|
:ok <- validate_recipient_ownership(to_server) do
|
|
MessageServer.Storage.append_message(to, from, message)
|
|
end
|
|
end
|
|
|
|
@spec extract_server_id(String.t()) :: {:ok, String.t()} | {:error, String.t()}
|
|
defp extract_server_id(user_id) do
|
|
case String.split(user_id, "-", parts: 2) do
|
|
[server_id, _user_part] -> {:ok, server_id}
|
|
_ -> {:error, "Invalid user ID format: #{user_id}"}
|
|
end
|
|
end
|
|
|
|
@spec validate_recipient_ownership(String.t()) :: :ok | {:error, String.t()}
|
|
defp validate_recipient_ownership(recipient_server) do
|
|
local_server = MessageServer.ServerRegistry.get_server_id()
|
|
|
|
if recipient_server == local_server do
|
|
:ok
|
|
else
|
|
{:error, "Cannot deliver messages to users from other servers"}
|
|
end
|
|
end
|
|
end
|