diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/pleroma/group.ex | 74 | ||||
-rw-r--r-- | lib/pleroma/user.ex | 6 |
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) |