42 lines
1.3 KiB
Elixir
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
|