announcement_read_relationship.ex (1473B)
- # Pleroma: A lightweight social networking server
- # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
- # SPDX-License-Identifier: AGPL-3.0-only
- defmodule Pleroma.AnnouncementReadRelationship do
- use Ecto.Schema
- import Ecto.Changeset
- alias FlakeId.Ecto.CompatType
- alias Pleroma.Announcement
- alias Pleroma.Repo
- alias Pleroma.User
- @type t :: %__MODULE__{}
- schema "announcement_read_relationships" do
- belongs_to(:user, User, type: CompatType)
- belongs_to(:announcement, Announcement, type: CompatType)
- timestamps(updated_at: false)
- end
- def mark_read(user, announcement) do
- %__MODULE__{}
- |> cast(%{user_id: user.id, announcement_id: announcement.id}, [:user_id, :announcement_id])
- |> validate_required([:user_id, :announcement_id])
- |> foreign_key_constraint(:user_id)
- |> foreign_key_constraint(:announcement_id)
- |> unique_constraint([:user_id, :announcement_id])
- |> Repo.insert()
- end
- def mark_unread(user, announcement) do
- with relationship <- get(user, announcement),
- {:exists, true} <- {:exists, not is_nil(relationship)},
- {:ok, _} <- Repo.delete(relationship) do
- :ok
- else
- {:exists, false} ->
- :ok
- _ ->
- :error
- end
- end
- def get(user, announcement) do
- Repo.get_by(__MODULE__, user_id: user.id, announcement_id: announcement.id)
- end
- def exists?(user, announcement) do
- not is_nil(get(user, announcement))
- end
- end