42 lines
1.3 KiB
Elixir

defmodule MessageServer.Storage do
use GenServer
require Logger
def start_link(server_id) do
GenServer.start_link(__MODULE__, server_id, name: __MODULE__)
end
@spec append_message(String.t(), String.t(), String.t()) :: :ok | {:error, String.t()}
def append_message(user_id, from_user, message) do
GenServer.call(__MODULE__, {:append_message, user_id, from_user, message})
end
@impl true
def init(server_id) do
storage_dir = "storage/server_#{server_id}"
File.mkdir_p!(storage_dir)
{:ok, %{storage_dir: storage_dir, server_id: server_id}}
end
@impl true
def handle_call({:append_message, user_id, from_user, message}, _from, state) do
case write_message_to_file(state, user_id, from_user, message) do
:ok ->
Logger.info("Message stored for user #{user_id}")
{:reply, :ok, state}
{:error, reason} = error ->
Logger.error("Failed to store message for user #{user_id}: #{reason}")
{:reply, error, state}
end
end
@spec write_message_to_file(map(), String.t(), String.t(), String.t()) :: :ok | {:error, atom()}
defp write_message_to_file(%{storage_dir: storage_dir}, user_id, from_user, message) do
file_path = Path.join(storage_dir, "#{user_id}.txt")
content = "#{from_user}: #{message}\n"
File.write(file_path, content, [:append])
end
end