# Pleroma: A lightweight social networking server # Copyright © 2017-2022 Pleroma Authors # 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