forked from MirrorHub/synapse
Comments
This commit is contained in:
parent
8d55877c9e
commit
26451a09eb
3 changed files with 79 additions and 5 deletions
|
@ -54,6 +54,12 @@ class GroupsServerHandler(object):
|
|||
"""Check that the group is ours, and optionally if it exists.
|
||||
|
||||
If group does exist then return group.
|
||||
|
||||
Args:
|
||||
group_id (str)
|
||||
and_exists (bool): whether to also check if group exists
|
||||
and_is_admin (str): whether to also check if given str is a user_id
|
||||
that is an admin
|
||||
"""
|
||||
if not self.is_mine_id(group_id):
|
||||
raise SynapseError(400, "Group not on this server")
|
||||
|
@ -71,6 +77,14 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def get_group_summary(self, group_id, requester_user_id):
|
||||
"""Get the summary for a group as seen by requester_user_id.
|
||||
|
||||
The group summary consists of the profile of the room, and a curated
|
||||
list of users and rooms. These list *may* be organised by role/category.
|
||||
The roles/categories are ordered, and so are the users/rooms within them.
|
||||
|
||||
A user/room may appear in multiple roles/categories.
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True)
|
||||
|
||||
is_user_in_group = yield self.store.is_user_in_group(requester_user_id, group_id)
|
||||
|
@ -133,6 +147,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def update_group_summary_room(self, group_id, user_id, room_id, category_id, content):
|
||||
"""Add/update a room to the group summary
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
order = content.get("order", None)
|
||||
|
@ -151,6 +167,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def delete_group_summary_room(self, group_id, user_id, room_id, category_id):
|
||||
"""Remove a room from the summary
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
yield self.store.remove_room_from_summary(
|
||||
|
@ -163,6 +181,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def get_group_categories(self, group_id, user_id):
|
||||
"""Get all categories in a group (as seen by user)
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True)
|
||||
|
||||
categories = yield self.store.get_group_categories(
|
||||
|
@ -172,6 +192,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def get_group_category(self, group_id, user_id, category_id):
|
||||
"""Get a specific category in a group (as seen by user)
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True)
|
||||
|
||||
res = yield self.store.get_group_category(
|
||||
|
@ -183,6 +205,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def update_group_category(self, group_id, user_id, category_id, content):
|
||||
"""Add/Update a group category
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
is_public = _parse_visibility_from_contents(content)
|
||||
|
@ -199,6 +223,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def delete_group_category(self, group_id, user_id, category_id):
|
||||
"""Delete a group category
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
yield self.store.remove_group_category(
|
||||
|
@ -210,6 +236,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def get_group_roles(self, group_id, user_id):
|
||||
"""Get all roles in a group (as seen by user)
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True)
|
||||
|
||||
roles = yield self.store.get_group_roles(
|
||||
|
@ -219,6 +247,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def get_group_role(self, group_id, user_id, role_id):
|
||||
"""Get a specific role in a group (as seen by user)
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True)
|
||||
|
||||
res = yield self.store.get_group_role(
|
||||
|
@ -229,6 +259,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def update_group_role(self, group_id, user_id, role_id, content):
|
||||
"""Add/update a role in a group
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
is_public = _parse_visibility_from_contents(content)
|
||||
|
@ -246,6 +278,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def delete_group_role(self, group_id, user_id, role_id):
|
||||
"""Remove role from group
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
yield self.store.remove_group_role(
|
||||
|
@ -258,6 +292,8 @@ class GroupsServerHandler(object):
|
|||
@defer.inlineCallbacks
|
||||
def update_group_summary_user(self, group_id, requester_user_id, user_id, role_id,
|
||||
content):
|
||||
"""Add/update a users entry in the group summary
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
order = content.get("order", None)
|
||||
|
@ -276,6 +312,8 @@ class GroupsServerHandler(object):
|
|||
|
||||
@defer.inlineCallbacks
|
||||
def delete_group_summary_user(self, group_id, requester_user_id, user_id, role_id):
|
||||
"""Remove a user from the group summary
|
||||
"""
|
||||
yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
|
||||
|
||||
yield self.store.remove_user_from_summary(
|
||||
|
|
|
@ -22,6 +22,8 @@ from ._base import SQLBaseStore
|
|||
import ujson as json
|
||||
|
||||
|
||||
# The category ID for the "default" category. We don't store as null in the
|
||||
# database to avoid the fun of null != null
|
||||
_DEFAULT_CATEGORY_ID = "default"
|
||||
|
||||
|
||||
|
@ -70,6 +72,10 @@ class GroupServerStore(SQLBaseStore):
|
|||
)
|
||||
|
||||
def get_rooms_for_summary_by_category(self, group_id, include_private=False):
|
||||
"""Get the rooms and categories that should be included in a summary request
|
||||
|
||||
Returns ([rooms], [categories])
|
||||
"""
|
||||
def _get_rooms_for_summary_txn(txn):
|
||||
keyvalues = {
|
||||
"group_id": group_id,
|
||||
|
@ -134,6 +140,14 @@ class GroupServerStore(SQLBaseStore):
|
|||
|
||||
def _add_room_to_summary_txn(self, txn, group_id, room_id, category_id, order,
|
||||
is_public):
|
||||
"""Add room to summary.
|
||||
|
||||
This automatically adds the room to the end of the list of rooms to be
|
||||
included in the summary response. If a role is given then user will
|
||||
be added under that category (the category will automatically be added tothe
|
||||
the summary if a user is listed under that role in the summary).
|
||||
"""
|
||||
|
||||
if category_id is None:
|
||||
category_id = _DEFAULT_CATEGORY_ID
|
||||
else:
|
||||
|
@ -278,6 +292,8 @@ class GroupServerStore(SQLBaseStore):
|
|||
defer.returnValue(category)
|
||||
|
||||
def upsert_group_category(self, group_id, category_id, profile, is_public):
|
||||
"""Add/update room category for group
|
||||
"""
|
||||
insertion_values = {}
|
||||
update_values = {"category_id": category_id} # This cannot be empty
|
||||
|
||||
|
@ -348,6 +364,8 @@ class GroupServerStore(SQLBaseStore):
|
|||
defer.returnValue(role)
|
||||
|
||||
def upsert_group_role(self, group_id, role_id, profile, is_public):
|
||||
"""Add/remove user role
|
||||
"""
|
||||
insertion_values = {}
|
||||
update_values = {"role_id": role_id} # This cannot be empty
|
||||
|
||||
|
@ -390,6 +408,13 @@ class GroupServerStore(SQLBaseStore):
|
|||
|
||||
def _add_user_to_summary_txn(self, txn, group_id, user_id, role_id, order,
|
||||
is_public):
|
||||
"""Add user to summary.
|
||||
|
||||
This automatically adds the user to the end of the list of users to be
|
||||
included in the summary response. If a role is given then user will
|
||||
be added under that role (the role will automatically be added to the
|
||||
summary if a user is listed under that role in the summary).
|
||||
"""
|
||||
if role_id is None:
|
||||
role_id = _DEFAULT_CATEGORY_ID
|
||||
else:
|
||||
|
@ -499,6 +524,10 @@ class GroupServerStore(SQLBaseStore):
|
|||
)
|
||||
|
||||
def get_users_for_summary_by_role(self, group_id, include_private=False):
|
||||
"""Get the users and roles that should be included in a summary request
|
||||
|
||||
Returns ([users], [roles])
|
||||
"""
|
||||
def _get_users_for_summary_txn(txn):
|
||||
keyvalues = {
|
||||
"group_id": group_id,
|
||||
|
|
|
@ -56,18 +56,21 @@ CREATE INDEX groups_rooms_g_idx ON group_rooms(group_id, room_id);
|
|||
CREATE INDEX groups_rooms_r_idx ON group_rooms(room_id);
|
||||
|
||||
|
||||
-- Rooms to include in the summary
|
||||
CREATE TABLE group_summary_rooms (
|
||||
group_id TEXT NOT NULL,
|
||||
room_id TEXT NOT NULL,
|
||||
category_id TEXT NOT NULL,
|
||||
room_order BIGINT NOT NULL,
|
||||
is_public BOOLEAN NOT NULL,
|
||||
is_public BOOLEAN NOT NULL, -- whether the room should be show to everyone
|
||||
UNIQUE (group_id, category_id, room_id, room_order),
|
||||
CHECK (room_order > 0)
|
||||
);
|
||||
|
||||
CREATE UNIQUE INDEX group_summary_rooms_g_idx ON group_summary_rooms(group_id, room_id, category_id);
|
||||
|
||||
|
||||
-- Categories to include in the summary
|
||||
CREATE TABLE group_summary_room_categories (
|
||||
group_id TEXT NOT NULL,
|
||||
category_id TEXT NOT NULL,
|
||||
|
@ -76,25 +79,27 @@ CREATE TABLE group_summary_room_categories (
|
|||
CHECK (cat_order > 0)
|
||||
);
|
||||
|
||||
-- The categories in the group
|
||||
CREATE TABLE group_room_categories (
|
||||
group_id TEXT NOT NULL,
|
||||
category_id TEXT NOT NULL,
|
||||
profile TEXT NOT NULL,
|
||||
is_public BOOLEAN NOT NULL,
|
||||
is_public BOOLEAN NOT NULL, -- whether the category should be show to everyone
|
||||
UNIQUE (group_id, category_id)
|
||||
);
|
||||
|
||||
|
||||
-- The users to include in the group summary
|
||||
CREATE TABLE group_summary_users (
|
||||
group_id TEXT NOT NULL,
|
||||
user_id TEXT NOT NULL,
|
||||
role_id TEXT NOT NULL,
|
||||
user_order BIGINT NOT NULL,
|
||||
is_public BOOLEAN NOT NULL
|
||||
is_public BOOLEAN NOT NULL -- whether the user should be show to everyone
|
||||
);
|
||||
|
||||
CREATE INDEX group_summary_users_g_idx ON group_summary_users(group_id);
|
||||
|
||||
-- The roles to include in the group summary
|
||||
CREATE TABLE group_summary_roles (
|
||||
group_id TEXT NOT NULL,
|
||||
role_id TEXT NOT NULL,
|
||||
|
@ -103,11 +108,13 @@ CREATE TABLE group_summary_roles (
|
|||
CHECK (role_order > 0)
|
||||
);
|
||||
|
||||
|
||||
-- The roles in a groups
|
||||
CREATE TABLE group_roles (
|
||||
group_id TEXT NOT NULL,
|
||||
role_id TEXT NOT NULL,
|
||||
profile TEXT NOT NULL,
|
||||
is_public BOOLEAN NOT NULL,
|
||||
is_public BOOLEAN NOT NULL, -- whether the role should be show to everyone
|
||||
UNIQUE (group_id, role_id)
|
||||
);
|
||||
|
||||
|
|
Loading…
Reference in a new issue