logo

pleroma

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

announcement.ex (3901B)


  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.Announcement do
  5. use Ecto.Schema
  6. import Ecto.Changeset, only: [cast: 3, validate_required: 2]
  7. import Ecto.Query
  8. alias Pleroma.AnnouncementReadRelationship
  9. alias Pleroma.Repo
  10. @type t :: %__MODULE__{}
  11. @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true}
  12. schema "announcements" do
  13. field(:data, :map)
  14. field(:starts_at, :utc_datetime)
  15. field(:ends_at, :utc_datetime)
  16. field(:rendered, :map)
  17. timestamps(type: :utc_datetime)
  18. end
  19. @doc "Generates changeset for %Pleroma.Announcement{}"
  20. @spec changeset(%__MODULE__{}, map()) :: %Ecto.Changeset{}
  21. def changeset(announcement \\ %__MODULE__{}, params \\ %{data: %{}}) do
  22. announcement
  23. |> cast(validate_params(announcement, params), [:data, :starts_at, :ends_at, :rendered])
  24. |> validate_required([:data])
  25. end
  26. defp validate_params(announcement, params) do
  27. base_data =
  28. %{
  29. "content" => "",
  30. "all_day" => false
  31. }
  32. |> Map.merge((announcement && announcement.data) || %{})
  33. merged_data =
  34. Map.merge(base_data, params.data)
  35. |> Map.take(["content", "all_day"])
  36. params
  37. |> Map.merge(%{data: merged_data})
  38. |> add_rendered_properties()
  39. end
  40. def add_rendered_properties(params) do
  41. {content_html, _, _} =
  42. Pleroma.Web.CommonAPI.Utils.format_input(params.data["content"], "text/plain",
  43. mentions_format: :full
  44. )
  45. rendered = %{
  46. "content" => content_html
  47. }
  48. params
  49. |> Map.put(:rendered, rendered)
  50. end
  51. def add(params) do
  52. changeset = changeset(%__MODULE__{}, params)
  53. Repo.insert(changeset)
  54. end
  55. def update(announcement, params) do
  56. changeset = changeset(announcement, params)
  57. Repo.update(changeset)
  58. end
  59. def list_all do
  60. __MODULE__
  61. |> Repo.all()
  62. end
  63. def list_paginated(%{limit: limited_number, offset: offset_number}) do
  64. __MODULE__
  65. |> limit(^limited_number)
  66. |> offset(^offset_number)
  67. |> Repo.all()
  68. end
  69. def get_by_id(id) do
  70. Repo.get_by(__MODULE__, id: id)
  71. end
  72. def delete_by_id(id) do
  73. with announcement when not is_nil(announcement) <- get_by_id(id),
  74. {:ok, _} <- Repo.delete(announcement) do
  75. :ok
  76. else
  77. _ ->
  78. :error
  79. end
  80. end
  81. def read_by?(announcement, user) do
  82. AnnouncementReadRelationship.exists?(user, announcement)
  83. end
  84. def mark_read_by(announcement, user) do
  85. AnnouncementReadRelationship.mark_read(user, announcement)
  86. end
  87. def render_json(announcement, opts \\ []) do
  88. extra_params =
  89. case Keyword.fetch(opts, :for) do
  90. {:ok, user} when not is_nil(user) ->
  91. %{read: read_by?(announcement, user)}
  92. _ ->
  93. %{}
  94. end
  95. admin_extra_params =
  96. case Keyword.fetch(opts, :admin) do
  97. {:ok, true} ->
  98. %{pleroma: %{raw_content: announcement.data["content"]}}
  99. _ ->
  100. %{}
  101. end
  102. base = %{
  103. id: announcement.id,
  104. content: announcement.rendered["content"],
  105. starts_at: announcement.starts_at,
  106. ends_at: announcement.ends_at,
  107. all_day: announcement.data["all_day"],
  108. published_at: announcement.inserted_at,
  109. updated_at: announcement.updated_at,
  110. mentions: [],
  111. statuses: [],
  112. tags: [],
  113. emojis: [],
  114. reactions: []
  115. }
  116. base
  117. |> Map.merge(extra_params)
  118. |> Map.merge(admin_extra_params)
  119. end
  120. # "visible" means:
  121. # starts_at < time < ends_at
  122. def list_all_visible_when(time) do
  123. __MODULE__
  124. |> where([a], is_nil(a.starts_at) or a.starts_at < ^time)
  125. |> where([a], is_nil(a.ends_at) or a.ends_at > ^time)
  126. |> Repo.all()
  127. end
  128. def list_all_visible do
  129. list_all_visible_when(DateTime.now("Etc/UTC") |> elem(1))
  130. end
  131. end