From 81357d8a0ee0859762f7705cacf1a7826c3d70cc Mon Sep 17 00:00:00 2001 From: Elias Nahum Date: Mon, 6 Jun 2022 05:54:02 -0400 Subject: [PATCH] [Gekidou] Update database to hold if a user is a team or channel admin (#6351) * Update database to hold if a user is a team or channel admin * TeamMembership identifier * Fix handleTeamMembership test * Update server.md Co-authored-by: Avinash Lingaloo --- app/database/models/server/channel_membership.ts | 3 +++ app/database/models/server/team_membership.ts | 3 +++ .../operator/server_data_operator/handlers/team.test.ts | 7 ++++++- .../operator/server_data_operator/handlers/team.ts | 7 ++++++- .../operator/server_data_operator/transformers/channel.ts | 1 + .../operator/server_data_operator/transformers/team.ts | 1 + .../schema/server/table_schemas/channel_membership.ts | 1 + .../schema/server/table_schemas/team_membership.ts | 1 + app/database/schema/server/test.ts | 4 ++++ docs/database/server/server.md | 2 ++ types/api/channels.d.ts | 1 + types/database/database.d.ts | 2 +- types/database/models/servers/channel_membership.d.ts | 3 +++ types/database/models/servers/team_membership.d.ts | 3 +++ 14 files changed, 36 insertions(+), 3 deletions(-) diff --git a/app/database/models/server/channel_membership.ts b/app/database/models/server/channel_membership.ts index cd55ebfe2..182e5454e 100644 --- a/app/database/models/server/channel_membership.ts +++ b/app/database/models/server/channel_membership.ts @@ -37,6 +37,9 @@ export default class ChannelMembershipModel extends Model implements ChannelMemb /* user_id: The foreign key to the related User record*/ @field('user_id') userId!: string; + /* scheme_admin: Determines if the user is an admin of the channel*/ + @field('scheme_admin') schemeAdmin!: boolean; + /** memberChannel : The related channel this member belongs to */ @immutableRelation(CHANNEL, 'channel_id') memberChannel!: Relation; diff --git a/app/database/models/server/team_membership.ts b/app/database/models/server/team_membership.ts index ab5e1a622..1d683024e 100644 --- a/app/database/models/server/team_membership.ts +++ b/app/database/models/server/team_membership.ts @@ -37,6 +37,9 @@ export default class TeamMembershipModel extends Model implements TeamMembership /* user_id: The foreign key to the related User record*/ @field('user_id') userId!: string; + /* scheme_admin: Determines if the user is an admin of the team*/ + @field('scheme_admin') schemeAdmin!: boolean; + /** memberUser: The related user in the team */ @immutableRelation(USER, 'user_id') memberUser!: Relation; diff --git a/app/database/operator/server_data_operator/handlers/team.test.ts b/app/database/operator/server_data_operator/handlers/team.test.ts index b2f265f31..5b4716cde 100644 --- a/app/database/operator/server_data_operator/handlers/team.test.ts +++ b/app/database/operator/server_data_operator/handlers/team.test.ts @@ -85,10 +85,15 @@ describe('*** Operator: Team Handlers tests ***', () => { prepareRecordsOnly: false, }); + const memberships = teamMemberships.map((m) => ({ + ...m, + id: `${m.team_id}-${m.user_id}`, + })); + expect(spyOnHandleRecords).toHaveBeenCalledTimes(1); expect(spyOnHandleRecords).toHaveBeenCalledWith({ fieldName: 'user_id', - createOrUpdateRawValues: teamMemberships, + createOrUpdateRawValues: memberships, tableName: 'TeamMembership', prepareRecordsOnly: false, buildKeyRecordBy: buildTeamMembershipKey, diff --git a/app/database/operator/server_data_operator/handlers/team.ts b/app/database/operator/server_data_operator/handlers/team.ts index 61853c734..08a517cac 100644 --- a/app/database/operator/server_data_operator/handlers/team.ts +++ b/app/database/operator/server_data_operator/handlers/team.ts @@ -59,7 +59,12 @@ const TeamHandler = (superclass: any) => class extends superclass { return []; } - const createOrUpdateRawValues = getUniqueRawsBy({raws: teamMemberships, key: 'team_id'}); + const memberships: TeamMembership[] = teamMemberships.map((m) => ({ + ...m, + id: `${m.team_id}-${m.user_id}`, + })); + + const createOrUpdateRawValues = getUniqueRawsBy({raws: memberships, key: 'id'}); return this.handleRecords({ fieldName: 'user_id', diff --git a/app/database/operator/server_data_operator/transformers/channel.ts b/app/database/operator/server_data_operator/transformers/channel.ts index d2c660f7e..88a8b6ae7 100644 --- a/app/database/operator/server_data_operator/transformers/channel.ts +++ b/app/database/operator/server_data_operator/transformers/channel.ts @@ -165,6 +165,7 @@ export const transformChannelMembershipRecord = ({action, database, value}: Tran channelMember._raw.id = isCreateAction ? (raw?.id ?? channelMember.id) : record.id; channelMember.channelId = raw.channel_id; channelMember.userId = raw.user_id; + channelMember.schemeAdmin = raw.scheme_admin ?? false; }; return prepareBaseRecord({ diff --git a/app/database/operator/server_data_operator/transformers/team.ts b/app/database/operator/server_data_operator/transformers/team.ts index aabb7eeea..a52ee94cb 100644 --- a/app/database/operator/server_data_operator/transformers/team.ts +++ b/app/database/operator/server_data_operator/transformers/team.ts @@ -37,6 +37,7 @@ export const transformTeamMembershipRecord = ({action, database, value}: Transfo teamMembership._raw.id = isCreateAction ? (raw?.id ?? teamMembership.id) : record.id; teamMembership.teamId = raw.team_id; teamMembership.userId = raw.user_id; + teamMembership.schemeAdmin = raw.scheme_admin; }; return prepareBaseRecord({ diff --git a/app/database/schema/server/table_schemas/channel_membership.ts b/app/database/schema/server/table_schemas/channel_membership.ts index 72c0c8315..0361e8c02 100644 --- a/app/database/schema/server/table_schemas/channel_membership.ts +++ b/app/database/schema/server/table_schemas/channel_membership.ts @@ -12,5 +12,6 @@ export default tableSchema({ columns: [ {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, + {name: 'scheme_admin', type: 'boolean'}, ], }); diff --git a/app/database/schema/server/table_schemas/team_membership.ts b/app/database/schema/server/table_schemas/team_membership.ts index 0fdeed877..6d061896e 100644 --- a/app/database/schema/server/table_schemas/team_membership.ts +++ b/app/database/schema/server/table_schemas/team_membership.ts @@ -12,5 +12,6 @@ export default tableSchema({ columns: [ {name: 'team_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, + {name: 'scheme_admin', type: 'boolean'}, ], }); diff --git a/app/database/schema/server/test.ts b/app/database/schema/server/test.ts index 0a66aedd2..a3c474227 100644 --- a/app/database/schema/server/test.ts +++ b/app/database/schema/server/test.ts @@ -137,10 +137,12 @@ describe('*** Test schema for SERVER database ***', () => { columns: { channel_id: {name: 'channel_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, + scheme_admin: {name: 'scheme_admin', type: 'boolean'}, }, columnArray: [ {name: 'channel_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, + {name: 'scheme_admin', type: 'boolean'}, ], }, [CUSTOM_EMOJI]: { @@ -486,10 +488,12 @@ describe('*** Test schema for SERVER database ***', () => { columns: { team_id: {name: 'team_id', type: 'string', isIndexed: true}, user_id: {name: 'user_id', type: 'string', isIndexed: true}, + scheme_admin: {name: 'scheme_admin', type: 'boolean'}, }, columnArray: [ {name: 'team_id', type: 'string', isIndexed: true}, {name: 'user_id', type: 'string', isIndexed: true}, + {name: 'scheme_admin', type: 'boolean'}, ], }, [TEAM_SEARCH_HISTORY]: { diff --git a/docs/database/server/server.md b/docs/database/server/server.md index 8ba16b24e..57653e057 100644 --- a/docs/database/server/server.md +++ b/docs/database/server/server.md @@ -55,6 +55,7 @@ ChannelMembership id PK string # composition ID Channel.id-User.id channel_id string INDEX FK >- Channel.id user_id string INDEX FK >- User.id +scheme_admin bool CustomEmoji - @@ -241,6 +242,7 @@ TeamMembership id PK string # auto-generated team_id string INDEX FK >- Team.id user_id string INDEX FK >- User.id +scheme_admin bool TeamSearchHistory diff --git a/types/api/channels.d.ts b/types/api/channels.d.ts index 32d8a6bf8..686262f1d 100644 --- a/types/api/channels.d.ts +++ b/types/api/channels.d.ts @@ -51,6 +51,7 @@ type ChannelMember = { id?: string; channel_id: string; user_id: string; + scheme_admin?: boolean; } type ChannelMembership = { id?: string; diff --git a/types/database/database.d.ts b/types/database/database.d.ts index e69279a27..e2ed712fa 100644 --- a/types/database/database.d.ts +++ b/types/database/database.d.ts @@ -239,7 +239,7 @@ export type HandleTeamArgs = PrepareOnly & { }; export type HandleChannelMembershipArgs = PrepareOnly & { - channelMemberships?: Array>; + channelMemberships?: Array>; }; export type HandleTeamMembershipArgs = PrepareOnly & { diff --git a/types/database/models/servers/channel_membership.d.ts b/types/database/models/servers/channel_membership.d.ts index f90b0285a..e460a7790 100644 --- a/types/database/models/servers/channel_membership.d.ts +++ b/types/database/models/servers/channel_membership.d.ts @@ -24,6 +24,9 @@ export default class ChannelMembershipModel extends Model { /* user_id: The foreign key to the related User record*/ userId: string; + /* scheme_admin: Determines if the user is an admin of the channel*/ + schemeAdmin: boolean; + /** memberChannel : The related channel this member belongs to */ memberChannel: Relation; diff --git a/types/database/models/servers/team_membership.d.ts b/types/database/models/servers/team_membership.d.ts index d063285aa..762162f73 100644 --- a/types/database/models/servers/team_membership.d.ts +++ b/types/database/models/servers/team_membership.d.ts @@ -24,6 +24,9 @@ export default class TeamMembershipModel extends Model { /* user_id: The foreign key to the related User record*/ userId: string; + /* scheme_admin: Determines if the user is an admin of the channel*/ + schemeAdmin: boolean; + /** memberUser: The related user in the team */ memberUser: Relation;