55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
			
		
		
	
	
			55 lines
		
	
	
	
		
			1.4 KiB
		
	
	
	
		
			Elixir
		
	
	
	
	
	
# 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
 |