diff --git a/packages/api/src/datalayer/user/index.ts b/packages/api/src/datalayer/user/index.ts index 16bee8312..ef39505b1 100644 --- a/packages/api/src/datalayer/user/index.ts +++ b/packages/api/src/datalayer/user/index.ts @@ -327,6 +327,17 @@ class UserModel extends DataModel { } return this.kx.transaction((tx) => this.updateProfile(userId, set, tx)) } + + @logMethod + deleteUser(userId: string, tx: Knex.Transaction): boolean { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + const result = super.delete(userId, tx) as any + if (result.error) { + return false + } else { + return true + } + } } export default UserModel diff --git a/packages/api/src/resolvers/user/index.ts b/packages/api/src/resolvers/user/index.ts index 3c8673c5f..90d4786d7 100644 --- a/packages/api/src/resolvers/user/index.ts +++ b/packages/api/src/resolvers/user/index.ts @@ -1,4 +1,8 @@ import { + DeleteAccountSuccess, + DeleteAccountError, + DeleteAccountErrorCode, + MutationDeleteAccountArgs, GoogleSignupResult, LoginErrorCode, LoginResult, @@ -355,3 +359,38 @@ export const signupResolver: ResolverFn< return { errorCodes: [SignupErrorCode.Unknown] } } } + +export const deleteAccountResolver = authorized< + DeleteAccountSuccess, + DeleteAccountError, + MutationDeleteAccountArgs +>(async (_, { userID }, { models, claims, log }) => { + const user = await models.user.get(userID) + + if (!user || user.id !== claims.uid) { + return { + errorCodes: [DeleteAccountErrorCode.Unauthorized], + } + } + + const deleteUserResult = await authTrx((tx) => + models.user.deleteUser(userID as string, tx) + ) + + if (!deleteUserResult) { + return { + errorCodes: [DeleteAccountErrorCode.Forbidden], + } + } + + log.info('Deleting a user account', { + userID, + labels: { + source: 'resolver', + resolver: 'deleteAccountResolver', + uid: claims.uid, + }, + }) + + return { userID } +})