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