logo

pleroma

My custom branche(s) on git.pleroma.social/pleroma/pleroma git clone https://hacktivis.me/git/pleroma.git

message_reference.ex (2574B)


  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. defmodule Pleroma.Chat.MessageReference do
  5. @moduledoc """
  6. A reference that builds a relation between an AP chat message that a user can see and whether it has been seen
  7. by them, or should be displayed to them. Used to build the chat view that is presented to the user.
  8. """
  9. use Ecto.Schema
  10. alias Pleroma.Chat
  11. alias Pleroma.Object
  12. alias Pleroma.Repo
  13. import Ecto.Changeset
  14. import Ecto.Query
  15. @primary_key {:id, FlakeId.Ecto.Type, autogenerate: true}
  16. schema "chat_message_references" do
  17. belongs_to(:object, Object)
  18. belongs_to(:chat, Chat, type: FlakeId.Ecto.CompatType)
  19. field(:unread, :boolean, default: true)
  20. timestamps()
  21. end
  22. def changeset(struct, params) do
  23. struct
  24. |> cast(params, [:object_id, :chat_id, :unread])
  25. |> validate_required([:object_id, :chat_id, :unread])
  26. end
  27. def get_by_id(id) do
  28. __MODULE__
  29. |> Repo.get(id)
  30. |> Repo.preload(:object)
  31. end
  32. def delete(cm_ref) do
  33. cm_ref
  34. |> Repo.delete()
  35. end
  36. def delete_for_object(%{id: object_id}) do
  37. from(cr in __MODULE__,
  38. where: cr.object_id == ^object_id
  39. )
  40. |> Repo.delete_all()
  41. end
  42. def for_chat_and_object(%{id: chat_id}, %{id: object_id}) do
  43. __MODULE__
  44. |> Repo.get_by(chat_id: chat_id, object_id: object_id)
  45. |> Repo.preload(:object)
  46. end
  47. def for_chat_query(chat) do
  48. from(cr in __MODULE__,
  49. where: cr.chat_id == ^chat.id,
  50. order_by: [desc: :id],
  51. preload: [:object]
  52. )
  53. end
  54. def last_message_for_chat(chat) do
  55. chat
  56. |> for_chat_query()
  57. |> limit(1)
  58. |> Repo.one()
  59. end
  60. def create(chat, object, unread) do
  61. params = %{
  62. chat_id: chat.id,
  63. object_id: object.id,
  64. unread: unread
  65. }
  66. %__MODULE__{}
  67. |> changeset(params)
  68. |> Repo.insert()
  69. end
  70. def unread_count_for_chat(chat) do
  71. chat
  72. |> for_chat_query()
  73. |> where([cmr], cmr.unread == true)
  74. |> Repo.aggregate(:count)
  75. end
  76. def mark_as_read(cm_ref) do
  77. cm_ref
  78. |> changeset(%{unread: false})
  79. |> Repo.update()
  80. end
  81. def set_all_seen_for_chat(chat, last_read_id \\ nil) do
  82. query =
  83. chat
  84. |> for_chat_query()
  85. |> exclude(:order_by)
  86. |> exclude(:preload)
  87. |> where([cmr], cmr.unread == true)
  88. if last_read_id do
  89. query
  90. |> where([cmr], cmr.id <= ^last_read_id)
  91. else
  92. query
  93. end
  94. |> Repo.update_all(set: [unread: false])
  95. end
  96. end