feat(chat): add schema to handle room membership
This commit is contained in:
parent
afea52077b
commit
d3253bd900
@ -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
|
||||
|
||||
|
@ -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
|
||||
|
@ -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)
|
||||
|
21
lib/slax/chat/room_membership.ex
Normal file
21
lib/slax/chat/room_membership.ex
Normal 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
|
@ -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
|
Loading…
x
Reference in New Issue
Block a user