add inbound language test
[akkoma] / lib / pleroma / announcement_read_relationship.ex
1 # Pleroma: A lightweight social networking server
2 # Copyright © 2017-2022 Pleroma Authors <https://pleroma.social/>
3 # SPDX-License-Identifier: AGPL-3.0-only
4
5 defmodule Pleroma.AnnouncementReadRelationship do
6 use Ecto.Schema
7
8 import Ecto.Changeset
9
10 alias FlakeId.Ecto.CompatType
11 alias Pleroma.Announcement
12 alias Pleroma.Repo
13 alias Pleroma.User
14
15 @type t :: %__MODULE__{}
16
17 schema "announcement_read_relationships" do
18 belongs_to(:user, User, type: CompatType)
19 belongs_to(:announcement, Announcement, type: CompatType)
20
21 timestamps(updated_at: false)
22 end
23
24 def mark_read(user, announcement) do
25 %__MODULE__{}
26 |> cast(%{user_id: user.id, announcement_id: announcement.id}, [:user_id, :announcement_id])
27 |> validate_required([:user_id, :announcement_id])
28 |> foreign_key_constraint(:user_id)
29 |> foreign_key_constraint(:announcement_id)
30 |> unique_constraint([:user_id, :announcement_id])
31 |> Repo.insert()
32 end
33
34 def mark_unread(user, announcement) do
35 with relationship <- get(user, announcement),
36 {:exists, true} <- {:exists, not is_nil(relationship)},
37 {:ok, _} <- Repo.delete(relationship) do
38 :ok
39 else
40 {:exists, false} ->
41 :ok
42
43 _ ->
44 :error
45 end
46 end
47
48 def get(user, announcement) do
49 Repo.get_by(__MODULE__, user_id: user.id, announcement_id: announcement.id)
50 end
51
52 def exists?(user, announcement) do
53 not is_nil(get(user, announcement))
54 end
55 end