Add relations

This commit is contained in:
Mirai Kumiko 2025-06-18 06:35:58 +02:00
parent f43b4bd038
commit 3a57d74357
Signed by: miraikumiko
GPG key ID: 3F178B1B5E0CB278
12 changed files with 81 additions and 85 deletions

View file

@ -1,30 +1,62 @@
defmodule Nulla.Models.Relation do
use Ecto.Schema
import Ecto.Changeset
alias Nulla.Repo
alias Nulla.Snowflake
alias Nulla.Models.Actor
alias Nulla.Models.Activity
@primary_key {:id, :integer, autogenerate: false}
@foreign_key_type :integer
schema "relations" do
field :type, :string
field :status, :string
field :following, :boolean, default: false
field :followed_by, :boolean, default: false
field :showing_replies, :boolean, default: true
field :showing_reblogs, :boolean, default: true
field :notifying, :boolean, default: false
field :muting, :boolean, default: false
field :muting_notifications, :boolean, default: false
field :blocking, :boolean, default: false
field :blocked_by, :boolean, default: false
field :domain_blocking, :boolean, default: false
field :requested, :boolean, default: false
field :note, :string
belongs_to :source, Actor, foreign_key: :source_id, type: :integer
belongs_to :target, Actor, foreign_key: :target_id, type: :integer
belongs_to :activity, Activity, foreign_key: :activity_id, type: :integer
belongs_to :local_actor_id, Actor
belongs_to :remote_actor_id, Actor
timestamps()
end
@doc false
def changeset(relation, attrs) do
relation
|> cast(attrs, [:id, :source_id, :target_id, :type, :status, :activity_id])
|> validate_required([:id, :source_id, :target_id, :type])
|> validate_inclusion(:type, ~w(follow block mute friend_request))
|> validate_inclusion(:status, ~w(pending accepted rejected active))
|> foreign_key_constraint(:source_id)
|> foreign_key_constraint(:target_id)
|> foreign_key_constraint(:activity_id)
|> unique_constraint([:source_id, :target_id, :type])
|> cast(attrs, [
:id,
:following,
:followed_by,
:showing_replies,
:showing_reblogs,
:notifying,
:muting,
:muting_notifications,
:blocking,
:blocked_by,
:domain_blocking,
:requested,
:note,
:source_id,
:target_id
])
|> validate_required([:id, :local_actor_id, :remote_actor_id])
|> unique_constraint([:local_actor_id, :remote_actor_id])
end
def create_relation(attrs) do
id = Snowflake.next_id()
%__MODULE__{}
|> __MODULE__.changeset(attrs)
|> Changeset.put_change(:id, id)
|> Repo.insert()
end
end