This commit is contained in:
Erik Johnston 2017-07-12 14:11:59 +01:00
parent 8d55877c9e
commit 26451a09eb
3 changed files with 79 additions and 5 deletions

View File

@ -54,6 +54,12 @@ class GroupsServerHandler(object):
"""Check that the group is ours, and optionally if it exists. """Check that the group is ours, and optionally if it exists.
If group does exist then return group. 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): if not self.is_mine_id(group_id):
raise SynapseError(400, "Group not on this server") raise SynapseError(400, "Group not on this server")
@ -71,6 +77,14 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_group_summary(self, group_id, requester_user_id): 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) 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) 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 @defer.inlineCallbacks
def update_group_summary_room(self, group_id, user_id, room_id, category_id, content): 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) yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
order = content.get("order", None) order = content.get("order", None)
@ -151,6 +167,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def delete_group_summary_room(self, group_id, user_id, room_id, category_id): 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.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
yield self.store.remove_room_from_summary( yield self.store.remove_room_from_summary(
@ -163,6 +181,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_group_categories(self, group_id, user_id): 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) yield self.check_group_is_ours(group_id, and_exists=True)
categories = yield self.store.get_group_categories( categories = yield self.store.get_group_categories(
@ -172,6 +192,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_group_category(self, group_id, user_id, category_id): 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) yield self.check_group_is_ours(group_id, and_exists=True)
res = yield self.store.get_group_category( res = yield self.store.get_group_category(
@ -183,6 +205,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def update_group_category(self, group_id, user_id, category_id, content): 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) yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
is_public = _parse_visibility_from_contents(content) is_public = _parse_visibility_from_contents(content)
@ -199,6 +223,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def delete_group_category(self, group_id, user_id, category_id): 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.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
yield self.store.remove_group_category( yield self.store.remove_group_category(
@ -210,6 +236,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_group_roles(self, group_id, user_id): 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) yield self.check_group_is_ours(group_id, and_exists=True)
roles = yield self.store.get_group_roles( roles = yield self.store.get_group_roles(
@ -219,6 +247,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def get_group_role(self, group_id, user_id, role_id): 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) yield self.check_group_is_ours(group_id, and_exists=True)
res = yield self.store.get_group_role( res = yield self.store.get_group_role(
@ -229,6 +259,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def update_group_role(self, group_id, user_id, role_id, content): 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) yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
is_public = _parse_visibility_from_contents(content) is_public = _parse_visibility_from_contents(content)
@ -246,6 +278,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def delete_group_role(self, group_id, user_id, role_id): 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.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
yield self.store.remove_group_role( yield self.store.remove_group_role(
@ -258,6 +292,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def update_group_summary_user(self, group_id, requester_user_id, user_id, role_id, def update_group_summary_user(self, group_id, requester_user_id, user_id, role_id,
content): 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) yield self.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
order = content.get("order", None) order = content.get("order", None)
@ -276,6 +312,8 @@ class GroupsServerHandler(object):
@defer.inlineCallbacks @defer.inlineCallbacks
def delete_group_summary_user(self, group_id, requester_user_id, user_id, role_id): 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.check_group_is_ours(group_id, and_exists=True, and_is_admin=user_id)
yield self.store.remove_user_from_summary( yield self.store.remove_user_from_summary(

View File

@ -22,6 +22,8 @@ from ._base import SQLBaseStore
import ujson as json 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" _DEFAULT_CATEGORY_ID = "default"
@ -70,6 +72,10 @@ class GroupServerStore(SQLBaseStore):
) )
def get_rooms_for_summary_by_category(self, group_id, include_private=False): 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): def _get_rooms_for_summary_txn(txn):
keyvalues = { keyvalues = {
"group_id": group_id, "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, def _add_room_to_summary_txn(self, txn, group_id, room_id, category_id, order,
is_public): 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: if category_id is None:
category_id = _DEFAULT_CATEGORY_ID category_id = _DEFAULT_CATEGORY_ID
else: else:
@ -278,6 +292,8 @@ class GroupServerStore(SQLBaseStore):
defer.returnValue(category) defer.returnValue(category)
def upsert_group_category(self, group_id, category_id, profile, is_public): def upsert_group_category(self, group_id, category_id, profile, is_public):
"""Add/update room category for group
"""
insertion_values = {} insertion_values = {}
update_values = {"category_id": category_id} # This cannot be empty update_values = {"category_id": category_id} # This cannot be empty
@ -348,6 +364,8 @@ class GroupServerStore(SQLBaseStore):
defer.returnValue(role) defer.returnValue(role)
def upsert_group_role(self, group_id, role_id, profile, is_public): def upsert_group_role(self, group_id, role_id, profile, is_public):
"""Add/remove user role
"""
insertion_values = {} insertion_values = {}
update_values = {"role_id": role_id} # This cannot be empty 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, def _add_user_to_summary_txn(self, txn, group_id, user_id, role_id, order,
is_public): 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: if role_id is None:
role_id = _DEFAULT_CATEGORY_ID role_id = _DEFAULT_CATEGORY_ID
else: else:
@ -499,6 +524,10 @@ class GroupServerStore(SQLBaseStore):
) )
def get_users_for_summary_by_role(self, group_id, include_private=False): 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): def _get_users_for_summary_txn(txn):
keyvalues = { keyvalues = {
"group_id": group_id, "group_id": group_id,

View File

@ -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); CREATE INDEX groups_rooms_r_idx ON group_rooms(room_id);
-- Rooms to include in the summary
CREATE TABLE group_summary_rooms ( CREATE TABLE group_summary_rooms (
group_id TEXT NOT NULL, group_id TEXT NOT NULL,
room_id TEXT NOT NULL, room_id TEXT NOT NULL,
category_id TEXT NOT NULL, category_id TEXT NOT NULL,
room_order BIGINT 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), UNIQUE (group_id, category_id, room_id, room_order),
CHECK (room_order > 0) CHECK (room_order > 0)
); );
CREATE UNIQUE INDEX group_summary_rooms_g_idx ON group_summary_rooms(group_id, room_id, category_id); 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 ( CREATE TABLE group_summary_room_categories (
group_id TEXT NOT NULL, group_id TEXT NOT NULL,
category_id TEXT NOT NULL, category_id TEXT NOT NULL,
@ -76,25 +79,27 @@ CREATE TABLE group_summary_room_categories (
CHECK (cat_order > 0) CHECK (cat_order > 0)
); );
-- The categories in the group
CREATE TABLE group_room_categories ( CREATE TABLE group_room_categories (
group_id TEXT NOT NULL, group_id TEXT NOT NULL,
category_id TEXT NOT NULL, category_id TEXT NOT NULL,
profile 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) UNIQUE (group_id, category_id)
); );
-- The users to include in the group summary
CREATE TABLE group_summary_users ( CREATE TABLE group_summary_users (
group_id TEXT NOT NULL, group_id TEXT NOT NULL,
user_id TEXT NOT NULL, user_id TEXT NOT NULL,
role_id TEXT NOT NULL, role_id TEXT NOT NULL,
user_order BIGINT 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); 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 ( CREATE TABLE group_summary_roles (
group_id TEXT NOT NULL, group_id TEXT NOT NULL,
role_id TEXT NOT NULL, role_id TEXT NOT NULL,
@ -103,11 +108,13 @@ CREATE TABLE group_summary_roles (
CHECK (role_order > 0) CHECK (role_order > 0)
); );
-- The roles in a groups
CREATE TABLE group_roles ( CREATE TABLE group_roles (
group_id TEXT NOT NULL, group_id TEXT NOT NULL,
role_id TEXT NOT NULL, role_id TEXT NOT NULL,
profile 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) UNIQUE (group_id, role_id)
); );