From 27d9e8464d06f5a48abea844d7a5c1078f7f1e6d Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 5 Dec 2022 12:04:36 +0800 Subject: [PATCH 1/4] Add unique constraint on user_id and group_id to group_membership table --- packages/api/src/entity/groups/group_membership.ts | 2 ++ ...0102.do.add_unique_constraint_in_group_membership.sql | 9 +++++++++ ...02.undo.add_unique_constraint_in_group_membership.sql | 9 +++++++++ 3 files changed, 20 insertions(+) create mode 100755 packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql create mode 100755 packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql diff --git a/packages/api/src/entity/groups/group_membership.ts b/packages/api/src/entity/groups/group_membership.ts index 0bfc01c63..4db78bd45 100644 --- a/packages/api/src/entity/groups/group_membership.ts +++ b/packages/api/src/entity/groups/group_membership.ts @@ -6,6 +6,7 @@ import { ManyToOne, OneToOne, PrimaryGeneratedColumn, + Unique, UpdateDateColumn, } from 'typeorm' @@ -14,6 +15,7 @@ import { Group } from './group' import { Invite } from './invite' @Entity() +@Unique('group_membership_unique', ['user', 'group']) export class GroupMembership { @PrimaryGeneratedColumn('uuid') id!: string diff --git a/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql b/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql new file mode 100755 index 000000000..583a5c885 --- /dev/null +++ b/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql @@ -0,0 +1,9 @@ +-- Type: DO +-- Name: add_unique_constraint_in_group_membership +-- Description: Add unique constraint in group_membership table + +BEGIN; + +ALTER TABLE omnivore.group_membership ADD CONSTRAINT group_membership_unique UNIQUE (group_id, user_id); + +COMMIT; diff --git a/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql b/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql new file mode 100755 index 000000000..699e71e9d --- /dev/null +++ b/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql @@ -0,0 +1,9 @@ +-- Type: UNDO +-- Name: add_unique_constraint_in_group_membership +-- Description: Add unique constraint in group_membership table + +BEGIN; + +ALTER TABLE omnivore.group_membership DROP CONSTRAINT IF EXISTS group_membership_unique; + +COMMIT; From 8d123cf52d9c8dcbd3442506c645b26c7cc866c4 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 5 Dec 2022 12:42:05 +0800 Subject: [PATCH 2/4] Grant update permission on invite, group_membership and group tables --- .../0102.do.add_unique_constraint_in_group_membership.sql | 4 ++++ .../0102.undo.add_unique_constraint_in_group_membership.sql | 4 ++++ 2 files changed, 8 insertions(+) diff --git a/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql b/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql index 583a5c885..84027e49b 100755 --- a/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql +++ b/packages/db/migrations/0102.do.add_unique_constraint_in_group_membership.sql @@ -6,4 +6,8 @@ BEGIN; ALTER TABLE omnivore.group_membership ADD CONSTRAINT group_membership_unique UNIQUE (group_id, user_id); +GRANT UPDATE ON TABLE omnivore.invite TO omnivore_user; + +GRANT UPDATE ON TABLE omnivore.group TO omnivore_user; + COMMIT; diff --git a/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql b/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql index 699e71e9d..d08f07ae6 100755 --- a/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql +++ b/packages/db/migrations/0102.undo.add_unique_constraint_in_group_membership.sql @@ -6,4 +6,8 @@ BEGIN; ALTER TABLE omnivore.group_membership DROP CONSTRAINT IF EXISTS group_membership_unique; +REVOKE UPDATE ON omnivore.invite FROM omnivore_user; + +REVOKE UPDATE ON omnivore.group FROM omnivore_user; + COMMIT; From 714f0f1f63f1e417b47fdd35a239e1f20a05f364 Mon Sep 17 00:00:00 2001 From: Hongbo Wu Date: Mon, 5 Dec 2022 12:44:18 +0800 Subject: [PATCH 3/4] Add joinGroup API --- packages/api/src/entity/groups/invite.ts | 2 +- packages/api/src/generated/graphql.ts | 49 ++++++++++++++++ packages/api/src/generated/schema.graphql | 17 ++++++ .../api/src/resolvers/function_resolvers.ts | 3 + .../src/resolvers/recommendations/index.ts | 51 +++++++++++++++++ packages/api/src/schema.ts | 17 ++++++ packages/api/src/services/create_group.ts | 56 +++++++++++++++++++ ..._unique_constraint_in_group_membership.sql | 2 + ..._unique_constraint_in_group_membership.sql | 2 + 9 files changed, 198 insertions(+), 1 deletion(-) diff --git a/packages/api/src/entity/groups/invite.ts b/packages/api/src/entity/groups/invite.ts index 7dce6fab7..e2835a629 100644 --- a/packages/api/src/entity/groups/invite.ts +++ b/packages/api/src/entity/groups/invite.ts @@ -14,7 +14,7 @@ import { Group } from './group' @Entity() export class Invite { @PrimaryGeneratedColumn('uuid') - id?: string + id!: string @Column('text') code!: string diff --git a/packages/api/src/generated/graphql.ts b/packages/api/src/generated/graphql.ts index 43d380468..fb527d156 100644 --- a/packages/api/src/generated/graphql.ts +++ b/packages/api/src/generated/graphql.ts @@ -931,6 +931,24 @@ export type IntegrationsSuccess = { integrations: Array; }; +export type JoinGroupError = { + __typename?: 'JoinGroupError'; + errorCodes: Array; +}; + +export enum JoinGroupErrorCode { + BadRequest = 'BAD_REQUEST', + NotFound = 'NOT_FOUND', + Unauthorized = 'UNAUTHORIZED' +} + +export type JoinGroupResult = JoinGroupError | JoinGroupSuccess; + +export type JoinGroupSuccess = { + __typename?: 'JoinGroupSuccess'; + group: RecommendationGroup; +}; + export type Label = { __typename?: 'Label'; color: Scalars['String']; @@ -1127,6 +1145,7 @@ export type Mutation = { generateApiKey: GenerateApiKeyResult; googleLogin: LoginResult; googleSignup: GoogleSignupResult; + joinGroup: JoinGroupResult; logOut: LogOutResult; mergeHighlight: MergeHighlightResult; moveFilter: MoveFilterResult; @@ -1282,6 +1301,11 @@ export type MutationGoogleSignupArgs = { }; +export type MutationJoinGroupArgs = { + inviteCode: Scalars['String']; +}; + + export type MutationMergeHighlightArgs = { input: MergeHighlightInput; }; @@ -3130,6 +3154,10 @@ export type ResolversTypes = { IntegrationsErrorCode: IntegrationsErrorCode; IntegrationsResult: ResolversTypes['IntegrationsError'] | ResolversTypes['IntegrationsSuccess']; IntegrationsSuccess: ResolverTypeWrapper; + JoinGroupError: ResolverTypeWrapper; + JoinGroupErrorCode: JoinGroupErrorCode; + JoinGroupResult: ResolversTypes['JoinGroupError'] | ResolversTypes['JoinGroupSuccess']; + JoinGroupSuccess: ResolverTypeWrapper; Label: ResolverTypeWrapper