Page MenuHomePhorge

No OneTemporary

Size
2 KB
Referenced Files
None
Subscribers
None
diff --git a/lib/pleroma/web/activity_pub/chat/room.ex b/lib/pleroma/web/activity_pub/chat/room.ex
index a49ec3da0..dab56dfff 100644
--- a/lib/pleroma/web/activity_pub/chat/room.ex
+++ b/lib/pleroma/web/activity_pub/chat/room.ex
@@ -1,22 +1,45 @@
defmodule Pleroma.Web.ActivityPub.Chat.Room do
alias Pleroma.Web.ActivityPub.Actor
alias Pleroma.Object
def build(name) do
base_url = Pleroma.Web.Endpoint.url()
base = "#{base_url}/chat/rooms/#{name}"
with {:ok, actor} <- Actor.build(base) do
room = actor
|> Map.put("name", name)
|> Map.put("members", [])
+ |> Map.put("type", "ChatRoom")
{:ok, room}
end
end
def create(name) do
with {:ok, room} <- build(name) do
Object.create(room)
end
end
+
+ def join(user, room_id) do
+ with object <- Object.get_cached_by_ap_id(room_id),
+ false <- object == nil,
+ members <- object.data["members"] || [],
+ members <- Enum.uniq(members ++ [user]),
+ data <- Map.put(object.data, "members", members),
+ cng <- Object.change(object, %{data: data}) do
+ Pleroma.Repo.update(cng)
+ end
+ end
+
+ def leave(user, room_id) do
+ with object <- Object.get_cached_by_ap_id(room_id),
+ false <- object == nil,
+ members <- object.data["members"] || [],
+ members <- List.delete(members, user),
+ data <- Map.put(object.data, "members", members),
+ cng <- Object.change(object, %{data: data}) do
+ Pleroma.Repo.update(cng)
+ end
+ end
end
diff --git a/test/web/activity_pub/chat/room_test.exs b/test/web/activity_pub/chat/room_test.exs
index c781b4d76..3670f29c6 100644
--- a/test/web/activity_pub/chat/room_test.exs
+++ b/test/web/activity_pub/chat/room_test.exs
@@ -1,21 +1,34 @@
defmodule Pleroma.Web.ActivityPub.Chat.RoomTest do
use Pleroma.DataCase
alias Pleroma.Web.ActivityPub.Chat.Room
alias Pleroma.Object
test "builds a local room" do
{:ok, room} = Room.build("chatroom")
assert room["id"] =~ "/chat/rooms/chatroom"
assert room["name"] == "chatroom"
assert room["members"] == []
assert room["inbox"]
+ assert room["type"] == "ChatRoom"
end
test "creates a local room building it and inserting it into the object database" do
{:ok, %Object{} = room} = Room.create("chatroom")
assert room.data["id"] =~ "/chat/rooms/chatroom"
# Inserting the same again will fail
assert {:error, _} = Room.create("chatroom")
end
+
+ test "makes it possible to join and leave a room, adding a user to the memberships" do
+ {:ok, room} = Room.create("chatroom")
+ actor_id = "https://user_at_some_server.com"
+ {:ok, %Object{} = room} = Room.join(actor_id, room.data["id"])
+
+ assert room.data["members"] == [actor_id]
+
+ {:ok, %Object{} = room} = Room.leave(actor_id, room.data["id"])
+
+ assert room.data["members"] == []
+ end
end

File Metadata

Mime Type
text/x-diff
Expires
Sat, Aug 8, 11:28 AM (1 d, 6 h)
Storage Engine
blob
Storage Format
Raw Data
Storage Handle
1723124
Default Alt Text
(2 KB)

Event Timeline