From 05c5fb51302f3fce778c9e6f72304bfdda0ca6a0 Mon Sep 17 00:00:00 2001 From: anvesh Date: Fri, 25 Jul 2025 09:18:52 +0545 Subject: [PATCH 1/6] feat: add removePhoto mutation to user resolver --- .../user/src/model/users/graphql/resolver.ts | 44 +++++++++++++++++++ 1 file changed, 44 insertions(+) diff --git a/packages/user/src/model/users/graphql/resolver.ts b/packages/user/src/model/users/graphql/resolver.ts index 7e0af7d03..f3efb02ad 100644 --- a/packages/user/src/model/users/graphql/resolver.ts +++ b/packages/user/src/model/users/graphql/resolver.ts @@ -306,6 +306,50 @@ const Mutation = { return mercuriusError; } }, + removePhoto: async ( + parent: unknown, + arguments_: undefined, + context: MercuriusContext, + ) => { + const { app, config, database, dbSchema, reply, user } = context; + + const service = getUserService(config, database, dbSchema); + + if (!user) { + return new mercurius.ErrorWithProps("unauthorized", {}, 401); + } + + try { + // eslint-disable-next-line unicorn/no-null + const updatedUser = await service.update(user.id, { photoId: null }); + + if (user.photoId) { + await service.fileService.delete(user.photoId); + } + + const request = reply.request; + + request.user = updatedUser; + + if (request.config.user.features?.profileValidation?.enabled) { + await request.session?.fetchAndSetClaim( + new ProfileValidationClaim(), + createUserContext(undefined, request), + ); + } + + return updatedUser; + } catch (error) { + app.log.error(error); + + const mercuriusError = new mercurius.ErrorWithProps( + "Oops, Something went wrong", + ); + mercuriusError.statusCode = 500; + + return mercuriusError; + } + }, changeEmail: async ( parent: unknown, arguments_: { From ebcb0a42909bdf39a8dfa9ef1f1e10f5ff7aa242 Mon Sep 17 00:00:00 2001 From: anvesh Date: Fri, 25 Jul 2025 16:09:06 +0545 Subject: [PATCH 2/6] feat: add removePhoto field to User type in GraphQL schema --- packages/user/src/model/users/graphql/schema.ts | 1 + 1 file changed, 1 insertion(+) diff --git a/packages/user/src/model/users/graphql/schema.ts b/packages/user/src/model/users/graphql/schema.ts index a8068efb2..4dd298044 100644 --- a/packages/user/src/model/users/graphql/schema.ts +++ b/packages/user/src/model/users/graphql/schema.ts @@ -75,6 +75,7 @@ const user = gql` @auth(profileValidation: false, emailVerification: false) changeEmail(email: String!): ChangeEmailResponse @auth(profileValidation: false, emailVerification: false) + removePhoto: User } type Query { From 8b41e971a6da73940f498cc46842aa01882be3fb Mon Sep 17 00:00:00 2001 From: anvesh Date: Fri, 25 Jul 2025 16:38:57 +0545 Subject: [PATCH 3/6] feat: add auth directive to removePhoto field in User type --- packages/user/src/model/users/graphql/schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/user/src/model/users/graphql/schema.ts b/packages/user/src/model/users/graphql/schema.ts index 4dd298044..c6204be9e 100644 --- a/packages/user/src/model/users/graphql/schema.ts +++ b/packages/user/src/model/users/graphql/schema.ts @@ -75,7 +75,7 @@ const user = gql` @auth(profileValidation: false, emailVerification: false) changeEmail(email: String!): ChangeEmailResponse @auth(profileValidation: false, emailVerification: false) - removePhoto: User + removePhoto: User @auth } type Query { From 1ea19d6193d2b334746588475dd2603b3b80c83d Mon Sep 17 00:00:00 2001 From: anvesh Date: Fri, 25 Jul 2025 16:57:10 +0545 Subject: [PATCH 4/6] feat: add email verification claim fetching in updateMe mutation --- packages/user/src/model/users/graphql/resolver.ts | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/packages/user/src/model/users/graphql/resolver.ts b/packages/user/src/model/users/graphql/resolver.ts index f3efb02ad..fbb0c1c4d 100644 --- a/packages/user/src/model/users/graphql/resolver.ts +++ b/packages/user/src/model/users/graphql/resolver.ts @@ -294,6 +294,13 @@ const Mutation = { ); } + if (request.config.user.features?.signUp?.emailVerification) { + await request.session?.fetchAndSetClaim( + EmailVerificationClaim, + createUserContext(undefined, request), + ); + } + return updatedUser; } catch (error) { app.log.error(error); From c59391a0fef87a20b6481edb08f2796b690a8063 Mon Sep 17 00:00:00 2001 From: anvesh Date: Fri, 25 Jul 2025 16:59:18 +0545 Subject: [PATCH 5/6] feat: move email verification claim fetching to updateMe mutation --- packages/user/src/model/users/graphql/resolver.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/packages/user/src/model/users/graphql/resolver.ts b/packages/user/src/model/users/graphql/resolver.ts index fbb0c1c4d..51243a13e 100644 --- a/packages/user/src/model/users/graphql/resolver.ts +++ b/packages/user/src/model/users/graphql/resolver.ts @@ -294,13 +294,6 @@ const Mutation = { ); } - if (request.config.user.features?.signUp?.emailVerification) { - await request.session?.fetchAndSetClaim( - EmailVerificationClaim, - createUserContext(undefined, request), - ); - } - return updatedUser; } catch (error) { app.log.error(error); @@ -345,6 +338,13 @@ const Mutation = { ); } + if (request.config.user.features?.signUp?.emailVerification) { + await request.session?.fetchAndSetClaim( + EmailVerificationClaim, + createUserContext(undefined, request), + ); + } + return updatedUser; } catch (error) { app.log.error(error); From 6a9e99c714ab282b121750c2ce3143d2c758c57d Mon Sep 17 00:00:00 2001 From: anvesh Date: Fri, 25 Jul 2025 17:12:52 +0545 Subject: [PATCH 6/6] feat: update removePhoto field to include validations in auth directive --- packages/user/src/model/users/graphql/schema.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/user/src/model/users/graphql/schema.ts b/packages/user/src/model/users/graphql/schema.ts index c6204be9e..53ce4d5ff 100644 --- a/packages/user/src/model/users/graphql/schema.ts +++ b/packages/user/src/model/users/graphql/schema.ts @@ -75,7 +75,7 @@ const user = gql` @auth(profileValidation: false, emailVerification: false) changeEmail(email: String!): ChangeEmailResponse @auth(profileValidation: false, emailVerification: false) - removePhoto: User @auth + removePhoto: User @auth(profileValidation: false, emailVerification: false) } type Query {