aboutsummaryrefslogtreecommitdiff
path: root/lib/pleroma/announcement_read_relationship.ex
blob: 9b64404ce343a7160ddffbd4f75ec6c7ce69bfa7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
# 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