feat(chat): add schema to handle room membership

This commit is contained in:
João Paulo Dubas 2024-11-17 13:39:49 +00:00
parent afea52077b
commit d3253bd900
Signed by: joao.dubas
SSH Key Fingerprint: SHA256:V1mixgOGRc/YMhGx/DNkOSmJxgA2vHNrDZEk3wt/kOA
5 changed files with 51 additions and 0 deletions

View File

@ -2,6 +2,9 @@ defmodule Slax.Accounts.User do
use Ecto.Schema
import Ecto.Changeset
alias Slax.Chat.Room
alias Slax.Chat.RoomMembership
schema "users" do
field :email, :string
field :password, :string, virtual: true, redact: true
@ -9,6 +12,8 @@ defmodule Slax.Accounts.User do
field :current_password, :string, virtual: true, redact: true
field :confirmed_at, :utc_datetime
many_to_many :rooms, Room, join_through: RoomMembership
timestamps(type: :utc_datetime)
end

View File

@ -8,6 +8,7 @@ defmodule Slax.Chat do
alias Slax.Accounts.User
alias Slax.Chat.Message
alias Slax.Chat.Room
alias Slax.Chat.RoomMembership
alias Slax.Repo
@pubsub Slax.PubSub
@ -24,6 +25,10 @@ defmodule Slax.Chat do
|> Repo.update()
end
def join_room!(%Room{} = room, %User{} = user) do
Repo.insert!(%RoomMembership{room: room, user: user})
end
def change_room(room, attrs \\ %{}) do
Room.changeset(room, attrs)
end

View File

@ -1,12 +1,16 @@
defmodule Slax.Chat.Room do
use Ecto.Schema
import Ecto.Changeset
alias Slax.Accounts.User
alias Slax.Chat.Message
alias Slax.Chat.RoomMembership
schema "rooms" do
field :name, :string
field :topic, :string
many_to_many :members, User, join_through: RoomMembership
has_many :messages, Message
timestamps(type: :utc_datetime)

View File

@ -0,0 +1,21 @@
defmodule Slax.Chat.RoomMembership do
use Ecto.Schema
import Ecto.Changeset
alias Slax.Accounts.User
alias Slax.Chat.Room
schema "room_memberships" do
belongs_to :room, Room
belongs_to :user, User
timestamps(type: :utc_datetime)
end
@doc false
def changeset(room_membership, attrs) do
room_membership
|> cast(attrs, [])
|> validate_required([])
end
end

View File

@ -0,0 +1,16 @@
defmodule Slax.Repo.Migrations.CreateRoomMemberships do
use Ecto.Migration
def change do
create table(:room_memberships) do
add :user_id, references(:users, on_delete: :delete_all), null: false
add :room_id, references(:rooms, on_delete: :delete_all), null: false
timestamps(type: :utc_datetime)
end
create index(:room_memberships, [:user_id])
create index(:room_memberships, [:room_id])
create unique_index(:room_memberships, [:user_id, :room_id])
end
end