2022-03-08 17:07:21 +00:00
|
|
|
# Pleroma: A lightweight social networking server
|
2023-01-02 20:38:50 +00:00
|
|
|
# Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
|
2022-03-08 17:07:21 +00:00
|
|
|
# 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
|