feat: added error obj for admin status users on deletion

This commit is contained in:
mirarifhasan
2024-02-08 14:52:06 +06:00
committed by Andrew Bastin
parent 3c7a2401ae
commit a0d40c8776
3 changed files with 31 additions and 8 deletions

View File

@@ -6,6 +6,7 @@ import * as E from 'fp-ts/Either';
import * as O from 'fp-ts/Option';
import { validateEmail } from '../utils';
import {
ADMIN_CAN_NOT_BE_DELETED,
DUPLICATE_EMAIL,
EMAIL_FAILED,
INVALID_EMAIL,
@@ -432,15 +433,30 @@ export class AdminService {
}
/**
* Remove user accounts by UIDs
* Remove user (not Admin) accounts by UIDs
* @param userUid User UIDs
* @returns an Either of boolean or error
*/
async removeUserAccounts(userUIDs: string[]) {
const users = await this.userService.findNonAdminUsersByIds(userUIDs);
if (users.length === 0) return E.left(USER_NOT_FOUND);
const allUsers = await this.userService.findUsersByIds(userUIDs);
if (allUsers.length === 0) return E.left(USER_NOT_FOUND);
const deletionPromises = users.map((user) => {
const userDeleteResult: UserDeleteData[] = [];
// Admin user can not be deleted without removing admin status/role
allUsers.forEach((user) => {
if (user.isAdmin) {
userDeleteResult.push({
userUID: user.uid,
success: false,
errorMessage: ADMIN_CAN_NOT_BE_DELETED,
});
}
});
const normalUsers = allUsers.filter((user) => !user.isAdmin);
const deletionPromises = normalUsers.map((user) => {
return this.userService
.deleteUserByUID(user)()
.then((res) => {
@@ -460,9 +476,9 @@ export class AdminService {
});
const promiseResult = await Promise.allSettled(deletionPromises);
const userDeleteResult = promiseResult.map((result) => {
promiseResult.forEach((result) => {
if (result.status === 'fulfilled') {
return result.value;
userDeleteResult.push(result.value);
}
});

View File

@@ -10,6 +10,14 @@ export const DUPLICATE_EMAIL = 'email/both_emails_cannot_be_same' as const;
export const ONLY_ONE_ADMIN_ACCOUNT =
'admin/only_one_admin_account_found' as const;
/**
* Admin user can not be deleted
* To delete the admin user, first make the Admin user a normal user
* (AdminService)
*/
export const ADMIN_CAN_NOT_BE_DELETED =
'admin/admin_can_not_be_deleted' as const;
/**
* Token Authorization failed (Check 'Authorization' Header)
* (GqlAuthGuard)

View File

@@ -94,11 +94,10 @@ export class UserService {
* @param userUIDs User IDs
* @returns Option of found Users
*/
async findNonAdminUsersByIds(userUIDs: string[]): Promise<AuthUser[]> {
async findUsersByIds(userUIDs: string[]): Promise<AuthUser[]> {
const users = await this.prisma.user.findMany({
where: {
uid: { in: userUIDs },
isAdmin: false,
},
});
return users;