Initial Commit

This commit is contained in:
2026-02-12 17:10:03 -06:00
commit 6992a06105
135 changed files with 18014 additions and 0 deletions
+36
View File
@@ -0,0 +1,36 @@
defmodule RiverConnect.Application do
# See https://hexdocs.pm/elixir/Application.html
# for more information on OTP Applications
@moduledoc false
use Application
@impl true
def start(_type, _args) do
children = [
TwMerge.Cache,
RiverConnectWeb.Telemetry,
RiverConnect.Repo,
{DNSCluster, query: Application.get_env(:river_connect, :dns_cluster_query) || :ignore},
{Phoenix.PubSub, name: RiverConnect.PubSub},
# Start a worker by calling: RiverConnect.Worker.start_link(arg)
# {RiverConnect.Worker, arg},
# Start to serve requests, typically the last entry
{Oban, Application.fetch_env!(:river_connect, Oban)},
RiverConnectWeb.Endpoint
]
# See https://hexdocs.pm/elixir/Supervisor.html
# for other strategies and supported options
opts = [strategy: :one_for_one, name: RiverConnect.Supervisor]
Supervisor.start_link(children, opts)
end
# Tell Phoenix to update the endpoint configuration
# whenever the application is updated.
@impl true
def config_change(changed, _new, removed) do
RiverConnectWeb.Endpoint.config_change(changed, removed)
:ok
end
end
+104
View File
@@ -0,0 +1,104 @@
defmodule RiverConnect.Audio do
@moduledoc """
The Audio context.
"""
import Ecto.Query, warn: false
alias RiverConnect.Repo
alias RiverConnect.Audio.Message
@doc """
Returns the list of audio_messages.
## Examples
iex> list_messages()
[%Message{}, ...]
"""
def list_messages do
Repo.all(from m in Message, order_by: [desc: m.inserted_at])
end
@doc """
Gets a single message.
Raises `Ecto.NoResultsError` if the Message does not exist.
## Examples
iex> get_message!(123)
%Message{}
iex> get_message!(456)
** (Ecto.NoResultsError)
"""
def get_message!(id), do: Repo.get!(Message, id)
@doc """
Creates a message.
## Examples
iex> create_message(%{field: value})
{:ok, %Message{}}
iex> create_message(%{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def create_message(attrs \\ %{}) do
%Message{}
|> Message.changeset(attrs)
|> Repo.insert()
end
@doc """
Updates a message.
## Examples
iex> update_message(message, %{field: new_value})
{:ok, %Message{}}
iex> update_message(message, %{field: bad_value})
{:error, %Ecto.Changeset{}}
"""
def update_message(%Message{} = message, attrs) do
message
|> Message.changeset(attrs)
|> Repo.update()
end
@doc """
Deletes a message.
## Examples
iex> delete_message(message)
{:ok, %Message{}}
iex> delete_message(message)
{:error, %Ecto.Changeset{}}
"""
def delete_message(%Message{} = message) do
Repo.delete(message)
end
@doc """
Returns an `%Ecto.Changeset{}` for tracking message changes.
## Examples
iex> change_message(message)
%Ecto.Changeset{data: %Message{}}
"""
def change_message(%Message{} = message, attrs \\ %{}) do
Message.changeset(message, attrs)
end
end
+21
View File
@@ -0,0 +1,21 @@
defmodule RiverConnect.Audio.Message do
use Ecto.Schema
import Ecto.Changeset
@derive {Jason.Encoder, only: [:id, :user_id, :file_path, :duration_ms, :status, :inserted_at]}
schema "audio_messages" do
field :status, :string
field :user_id, :string
field :file_path, :string
field :duration_ms, :integer
timestamps(type: :utc_datetime)
end
@doc false
def changeset(message, attrs) do
message
|> cast(attrs, [:user_id, :file_path, :duration_ms, :status])
|> validate_required([:user_id, :file_path, :status])
end
end
+3
View File
@@ -0,0 +1,3 @@
defmodule RiverConnect.Mailer do
use Swoosh.Mailer, otp_app: :river_connect
end
+5
View File
@@ -0,0 +1,5 @@
defmodule RiverConnect.Repo do
use Ecto.Repo,
otp_app: :river_connect,
adapter: Ecto.Adapters.Postgres
end
@@ -0,0 +1,25 @@
defmodule RiverConnect.Workers.ProcessRecording do
use Oban.Worker, queue: :default
alias RiverConnect.Audio
@impl Oban.Worker
def perform(%Oban.Job{args: %{"id" => id}}) do
case Audio.get_message!(id) do
%Audio.Message{} = message ->
# Simulate processing time (e.g. transcoding or upload)
Process.sleep(1000)
# Update status to "ready"
{:ok, _updated_message} = Audio.update_message(message, %{status: "ready"})
# Broadcast update
RiverConnectWeb.Endpoint.broadcast!("audio:lobby", "audio_message_ready", %{id: message.id})
:ok
_ ->
{:error, :not_found}
end
end
end