aboutsummaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
Diffstat (limited to 'lib')
-rw-r--r--lib/pleroma/group.ex74
-rw-r--r--lib/pleroma/user.ex6
2 files changed, 80 insertions, 0 deletions
diff --git a/lib/pleroma/group.ex b/lib/pleroma/group.ex
new file mode 100644
index 000000000..6cc208f15
--- /dev/null
+++ b/lib/pleroma/group.ex
@@ -0,0 +1,74 @@
+# Pleroma: A lightweight social networking server
+# Copyright © 2017-2021 Pleroma Authors <https://pleroma.social/>
+# SPDX-License-Identifier: AGPL-3.0-only
+
+defmodule Pleroma.Group do
+ use Ecto.Schema
+
+ import Ecto.Changeset
+
+ alias Pleroma.User
+ alias Pleroma.Repo
+ alias Pleroma.Web
+ alias Pleroma.EctoType.ActivityPub.ObjectValidators
+
+ @moduledoc """
+ Groups contain all the additional information about a group that's not stored
+ in the user table.
+
+ Concepts:
+
+ - Groups have an owner
+ - Groups have members, invited by the owner.
+ """
+
+ @type t :: %__MODULE__{}
+ @primary_key {:id, FlakeId.Ecto.CompatType, autogenerate: true}
+
+ schema "groups" do
+ belongs_to(:user, User, type: FlakeId.Ecto.CompatType)
+ belongs_to(:owner, User, type: FlakeId.Ecto.CompatType, foreign_key: :owner_id)
+
+ field(:members, {:array, ObjectValidators.ObjectID})
+ field(:name, :string)
+ field(:description, :string)
+ field(:members_collection, :string)
+
+ timestamps()
+ end
+
+ @spec create(map()) :: {:ok, t()} | {:error, Ecto.Changeset.t()}
+ def create(params) do
+ with {:ok, user} <- generate_user() do
+ %__MODULE__{user_id: user.id, members_collection: "#{user.ap_id}/members"}
+ |> changeset(params)
+ |> Repo.insert()
+ end
+ end
+
+ defp generate_ap_id(id) do
+ "#{Web.base_url()}/groups/#{id}"
+ end
+
+ defp generate_user() do
+ id = Ecto.UUID.generate()
+ ap_id = generate_ap_id(id)
+
+ %{
+ ap_id: ap_id,
+ name: id,
+ nickname: id,
+ follower_address: "#{ap_id}/followers",
+ following_address: "#{ap_id}/following",
+ local: true
+ }
+ |> User.group_changeset()
+ |> Repo.insert()
+ end
+
+ def changeset(struct, params) do
+ struct
+ |> cast(params, [:user_id, :owner_id, :name, :description, :members_collection])
+ |> validate_required([:user_id, :owner_id, :members_collection])
+ end
+end
diff --git a/lib/pleroma/user.ex b/lib/pleroma/user.ex
index 2aeacf816..3da658950 100644
--- a/lib/pleroma/user.ex
+++ b/lib/pleroma/user.ex
@@ -407,6 +407,12 @@ defmodule Pleroma.User do
defp fix_follower_address(params), do: params
+ def group_changeset(struct \\ %User{actor_type: "Group"}, params) do
+ struct
+ |> cast(params, [:ap_id, :nickname, :name, :follower_address, :following_address, :local])
+ |> validate_required([:ap_id, :nickname, :name, :follower_address, :following_address, :local])
+ end
+
def remote_user_changeset(struct \\ %User{local: false}, params) do
bio_limit = Config.get([:instance, :user_bio_length], 5000)
name_limit = Config.get([:instance, :user_name_length], 100)