FEAT: Roles WIP

This commit is contained in:
Gabriel Rosa
2022-07-14 10:23:04 -03:00
parent d5cd562860
commit 14cfc46492
15 changed files with 247 additions and 116 deletions
+9 -7
View File
@@ -36,7 +36,7 @@
"passport-hubspot-oauth2": "^1.0.3",
"passport-mailchimp": "^1.1.0",
"protospack": "2.5.1",
"protospack-v2": "3.0.0",
"protospack-v2": "file:../protospack-v2/protospack-v2-0.0.0.tgz",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.5.5",
@@ -9015,10 +9015,12 @@
}
},
"node_modules/protospack-v2": {
"version": "3.0.0",
"resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.0.0.tgz",
"integrity": "sha512-GEFbf8+vVaq/lA28K4nFf7bOSlghQJn/aeVnrYzh4YJUaa1+ccNz3uQs9p5OGbfjt2u/fFE5rHGEBUtueAA8KA==",
"version": "0.0.0",
"resolved": "file:../protospack-v2/protospack-v2-0.0.0.tgz",
"integrity": "sha512-/Pmor5eTfl0kRUC0uMsqsMojLnl3j5vMHhO9CYYQ9/5bYWSvq40+NovS9msyuqNsTW2oAYpGvMNDm6zeaV4Ciw==",
"license": "ISC",
"dependencies": {
"@grpc/grpc-js": "^1.6.7",
"rxjs": "^7.5.5",
"ts-proto": "^1.112.2"
}
@@ -17244,10 +17246,10 @@
}
},
"protospack-v2": {
"version": "3.0.0",
"resolved": "https://dadosfera-611330257153.d.codeartifact.us-east-1.amazonaws.com:443/npm/dadosfera-npm/protospack-v2/-/protospack-v2-3.0.0.tgz",
"integrity": "sha512-GEFbf8+vVaq/lA28K4nFf7bOSlghQJn/aeVnrYzh4YJUaa1+ccNz3uQs9p5OGbfjt2u/fFE5rHGEBUtueAA8KA==",
"version": "file:../protospack-v2/protospack-v2-0.0.0.tgz",
"integrity": "sha512-/Pmor5eTfl0kRUC0uMsqsMojLnl3j5vMHhO9CYYQ9/5bYWSvq40+NovS9msyuqNsTW2oAYpGvMNDm6zeaV4Ciw==",
"requires": {
"@grpc/grpc-js": "^1.6.7",
"rxjs": "^7.5.5",
"ts-proto": "^1.112.2"
}
+1 -1
View File
@@ -51,7 +51,7 @@
"passport-hubspot-oauth2": "^1.0.3",
"passport-mailchimp": "^1.1.0",
"protospack": "2.5.1",
"protospack-v2": "3.0.0",
"protospack-v2": "file:../protospack-v2/protospack-v2-0.0.0.tgz",
"reflect-metadata": "^0.1.13",
"rimraf": "^3.0.2",
"rxjs": "^7.5.5",
+6
View File
@@ -17,6 +17,12 @@ export interface PermissionsObjectPermission {
'en-us': string;
};
}
export interface PermissionsObjectPermissionTranslated {
seqid: number;
claim: string;
usage: PermissionUsages;
name?: string;
}
export interface PermissionsObjectGroup {
title: {
'pt-br': string;
@@ -3,7 +3,7 @@ import { Test, TestingModule } from '@nestjs/testing';
import { DucClient } from 'src/clients/duc/client.config';
import { PermissionsController } from './permissions.controller';
import { DadosferaLogger } from 'dadosfera-logs';
import { PermissionsClientService } from './permissions.service';
import { PermissionsService } from './permissions.service';
const ducClient = new DucClient();
@@ -21,7 +21,7 @@ describe('PermissionsController', () => {
]),
],
controllers: [PermissionsController],
providers: [DadosferaLogger, PermissionsClientService],
providers: [DadosferaLogger, PermissionsService],
}).compile();
controller = module.get<PermissionsController>(PermissionsController);
@@ -2,13 +2,13 @@ import { Controller, Get, Headers, Inject } from '@nestjs/common';
import { ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { DadosferaLogger } from 'dadosfera-logs';
import { PermissionUsages } from 'src/authentication/permissions.enum';
import { User } from 'src/authentication/user.decorator';
import { RequestUser, User } from 'src/authentication/user.decorator';
import {
GetPublicPermissionsHeader,
GetPublicPermissionsRes,
LanguageEnum,
} from './dto/entities';
import { PermissionsClientService } from './permissions.service';
import { PermissionsService } from './permissions.service';
@ApiTags('Permissions')
@Controller('permissions')
@@ -18,7 +18,7 @@ export class PermissionsController {
constructor(
@Inject(DadosferaLogger)
dadosferaLogger: DadosferaLogger,
private permissionsService: PermissionsClientService,
private permissionsService: PermissionsService,
) {
this.logger = dadosferaLogger.logger;
}
@@ -26,13 +26,13 @@ export class PermissionsController {
@Get()
@ApiOkResponse({ type: GetPublicPermissionsRes })
getPublicPermissions(
@User() user,
@User() user: RequestUser,
@Headers() headers: GetPublicPermissionsHeader,
) {
this.logger.info('getPublicPermissions', { user });
const language: LanguageEnum = headers['dadosfera-lang'];
return this.permissionsService.getPermissions(
return this.permissionsService.getPermissionsGrouped(
PermissionUsages.PUBLIC,
language,
);
@@ -2,7 +2,7 @@ import { Module } from '@nestjs/common';
import { ClientsModule } from '@nestjs/microservices';
import { DadosferaLogger } from 'dadosfera-logs';
import { PermissionsClientService } from './permissions.service';
import { PermissionsService } from './permissions.service';
import { DucClient } from '../../clients/duc/client.config';
import { PermissionsController } from './permissions.controller';
@@ -18,7 +18,8 @@ const ducClient = new DucClient();
},
]),
],
providers: [PermissionsClientService, DadosferaLogger],
providers: [PermissionsService, DadosferaLogger],
controllers: [PermissionsController],
exports: [PermissionsService],
})
export class PermissionsModule {}
+24 -7
View File
@@ -12,22 +12,21 @@ import { PermissionsProtoService as PermissionsServiceInterface } from 'protospa
import { InjectPermissionsRequest } from 'protospack-v2/dist/lib/Duc/interfaces/messages';
import { DadosferaLogger } from 'dadosfera-logs';
import {
PermissionsObjectPermission,
PERMISSIONS,
PermissionsObject,
PermissionUsages,
PermissionsObjectGroup,
PermissionsObjectPermissionTranslated,
} from '../../authentication/permissions.enum';
import ErrorBuilder from '../../utils/ErrorBuilder';
import { LanguageEnum, PermissionDto, PermissionGroup } from './dto/entities';
@Injectable()
export class PermissionsClientService
export class PermissionsService
implements OnModuleInit, OnApplicationBootstrap
{
logger: any;
private permissionsService: PermissionsServiceInterface;
private permissionsClientService: PermissionsServiceInterface;
constructor(
@Inject(DadosferaLogger)
dadosferaLogger: DadosferaLogger,
@@ -37,7 +36,7 @@ export class PermissionsClientService
}
onModuleInit() {
this.permissionsService =
this.permissionsClientService =
this.grpcClient.getService<PermissionsServiceInterface>(
ProtoServices.PermissionsProtoService,
);
@@ -71,10 +70,10 @@ export class PermissionsClientService
this.logger.info('InjectPermissions');
return lastValueFrom(
this.permissionsService.InjectPermissions({ permissions }),
this.permissionsClientService.InjectPermissions({ permissions }),
);
}
getPermissions(
getPermissionsGrouped(
permissionUsage?: PermissionUsages,
language: LanguageEnum = LanguageEnum.ptbr,
): PermissionGroup[] {
@@ -97,4 +96,22 @@ export class PermissionsClientService
}
return groups;
}
getAllPermissions(language: LanguageEnum = LanguageEnum.ptbr) {
const permissions: PermissionsObjectPermissionTranslated[] = [];
for (const key in PERMISSIONS) {
const permissionGroup: PermissionsObjectGroup = PERMISSIONS[key];
const permissionGroupPermissions: PermissionsObjectPermissionTranslated[] =
Object.values(permissionGroup.permissions).map((p) => ({
...p,
name: p.name[language],
}));
permissions.concat(permissionGroupPermissions);
}
return permissions;
}
getPermissionsBySeqId(seqIds: number[]) {
const permissionGroupPermissions = this.getAllPermissions();
return permissionGroupPermissions.filter((p) => seqIds.includes(p.seqid));
}
}
+17 -8
View File
@@ -1,30 +1,39 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';
import { Permission } from 'src/modules/permissions/dto/entities';
import { UserWithoutRoles } from 'src/modules/users/dtos/entities';
import {
Customer,
UserNoRolesAndCustomer,
} from 'src/modules/users/dtos/entities';
export class Role {
@ApiProperty()
id: string;
@ApiProperty()
name: string;
@ApiProperty()
description: string;
@ApiPropertyOptional({ type: () => [Permission] })
permissions: Permission[];
@ApiPropertyOptional({ type: () => [UserWithoutRoles] })
users: UserWithoutRoles[];
@ApiPropertyOptional({ type: () => [UserNoRolesAndCustomer] })
users: UserNoRolesAndCustomer[];
@ApiProperty()
createdAt: string;
@ApiProperty()
updatedAt: string;
@ApiProperty({ type: () => Customer })
customer?: Customer;
}
export class CustomerRole extends OmitType(Role, ['customer']) {}
export enum TrueOrFalseEnum {
true = 'true',
false = 'false',
}
export class GetRolesByCustomerReq {
@ApiPropertyOptional()
permission_id: string[];
permissionIds: string[];
@ApiPropertyOptional({ enum: TrueOrFalseEnum })
get_users: TrueOrFalseEnum;
getUsers: TrueOrFalseEnum;
}
export class GetRolesByCustomerRes {
@@ -35,7 +44,7 @@ export class CreateRoleReq {
@ApiProperty()
name: string;
@ApiProperty()
permissionIds: string[];
permissionIds: number[];
@ApiPropertyOptional()
userIds: string[];
@ApiProperty()
@@ -43,7 +52,7 @@ export class CreateRoleReq {
}
export class CreateRoleRes {
@ApiProperty()
role: Role;
role: CustomerRole;
}
export class AssignPermissionsToRoleReq {
+38 -24
View File
@@ -9,25 +9,28 @@ import {
Post,
Put,
Query,
UseFilters,
} from '@nestjs/common';
import { ApiResponse, ApiTags } from '@nestjs/swagger';
import { User } from 'src/authentication/user.decorator';
import { ApiCreatedResponse, ApiOkResponse, ApiTags } from '@nestjs/swagger';
import { RequestUser, User } from 'src/authentication/user.decorator';
import { DadosferaLogger } from 'dadosfera-logs';
import { RolesService } from './roles.service';
import {
AssignPermissionsToRoleReq,
AssignPermissionsToRoleRes,
AssignPermissionsToRoleReq as grantPermissionsToRoleReq,
AssignPermissionsToRoleRes as GrantPermissionsToRoleRes,
CreateRoleReq,
CreateRoleRes,
GetRolesByCustomerReq,
GetRolesByCustomerRes,
UnassignPermissionsToRoleReq,
UnassignPermissionsToRoleRes,
UnassignPermissionsToRoleReq as RevokePermissionsToRoleReq,
UnassignPermissionsToRoleRes as RevokePermissionsToRoleRes,
UpdateRoleReq,
UpdateRoleRes,
} from './dto/entities';
import { GrpcToHttpExceptionFilter } from 'src/error/grpc-to-http-exception.filter';
@ApiTags('Roles')
@UseFilters(new GrpcToHttpExceptionFilter())
@Controller('roles')
export class RolesController {
logger: any;
@@ -39,46 +42,57 @@ export class RolesController {
) {
this.logger = dadosferaLogger.logger;
}
@Get()
@ApiResponse({ type: GetRolesByCustomerRes })
@ApiOkResponse({ type: GetRolesByCustomerRes })
async getRolesByCustomer(
@User() user,
@User() user: RequestUser,
@Query() filters: GetRolesByCustomerReq,
) {
this.logger.info('getRolesByCustomer', { user });
this.rolesService.getRolesByCustomer(filters);
return await this.rolesService.getRolesByCustomer(
filters,
user.customer_id,
);
}
@Post()
@ApiResponse({ type: CreateRoleRes })
async createRole(@User() user, @Body() body: CreateRoleReq) {
@ApiCreatedResponse({ type: CreateRoleRes })
async createRole(@User() user: RequestUser, @Body() body: CreateRoleReq) {
this.logger.info('createRole', { user });
return await this.rolesService.createRole(body, user.customer_id);
}
@Delete(':id')
async deleteRole(@User() user, @Param('id') id: string) {
async deleteRole(@User() user: RequestUser, @Param('id') id: string) {
this.logger.info('deleteRole', { user });
return await this.rolesService.removeRole(id);
}
@Put('permissions')
@ApiResponse({ type: AssignPermissionsToRoleRes })
async assignPermissionsToRole(
@User() user,
@Body() body: AssignPermissionsToRoleReq,
@ApiOkResponse({ type: GrantPermissionsToRoleRes })
async grantPermissionsToRole(
@User() user: RequestUser,
@Body() body: grantPermissionsToRoleReq,
) {
this.logger.info('assignPermissionsToRole', { user });
this.logger.info('grantPermissionsToRole', { user });
return await this.rolesService.grantPermissionsToRole(body);
}
@Delete('permissions')
@ApiResponse({ type: UnassignPermissionsToRoleRes })
async unassignPermissionsToRole(
@User() user,
@Body() body: UnassignPermissionsToRoleReq,
@ApiOkResponse({ type: RevokePermissionsToRoleRes })
async revokePermissionsToRole(
@User() user: RequestUser,
@Body() body: RevokePermissionsToRoleReq,
) {
this.logger.info('unassignPermissionsToRole', { user });
this.logger.info('revokePermissionsToRole', { user });
return await this.rolesService.revokePermissionToRole(body);
}
@Patch(':id')
@ApiResponse({ type: UpdateRoleRes })
@ApiOkResponse({ type: UpdateRoleRes })
async updateRole(
@User() user,
@User() user: RequestUser,
@Param('id') id: string,
@Body() body: UpdateRoleReq,
) {
+2
View File
@@ -4,6 +4,7 @@ import { DucClient } from 'src/clients/duc/client.config';
import { RolesController } from './roles.controller';
import { RolesService } from './roles.service';
import { DadosferaLogger } from 'dadosfera-logs';
import { PermissionsModule } from '../permissions/permissions.module';
const ducClient = new DucClient();
@@ -15,6 +16,7 @@ const ducClient = new DucClient();
...ducClient.config(),
},
]),
PermissionsModule,
],
controllers: [RolesController],
providers: [RolesService, DadosferaLogger],
+89 -8
View File
@@ -1,10 +1,16 @@
import { Inject, Injectable } from '@nestjs/common';
import { BadRequestException, Inject, Injectable } from '@nestjs/common';
import { ProtoServices } from 'protospack-v2/dist/lib/Duc';
import { RolesProtoService } from 'protospack-v2/dist/lib/Duc/interfaces/write-service';
import { GetRolesByCustomerReq } from './dto/entities';
import { CreateRoleReq, GetRolesByCustomerReq, Role } from './dto/entities';
import { DadosferaLogger } from 'dadosfera-logs';
import { ClientGrpc } from '@nestjs/microservices';
import { lastValueFrom } from 'rxjs';
import { PermissionsService } from '../permissions/permissions.service';
import {
GrantPermissionsToRoleRequest,
RevokePermissionsFromRoleRequest,
RoleUpdateRequest,
} from 'protospack-v2/dist/lib/Duc/interfaces/messages';
@Injectable()
export class RolesService {
@@ -15,22 +21,97 @@ export class RolesService {
@Inject(DadosferaLogger)
dadosferaLogger: DadosferaLogger,
@Inject('DUC_PACKAGE') private readonly grpcClient: ClientGrpc,
private permissionsService: PermissionsService,
) {
this.logger = dadosferaLogger.logger;
}
onModuleInit() {
this.rolesClientService = this.grpcClient.getService<RolesProtoService>(
ProtoServices.UsersProtoService,
ProtoServices.RolesProtoService,
);
}
async getRolesByCustomer(filters: GetRolesByCustomerReq) {
let { permission_id } = filters;
if (!Array.isArray(permission_id)) permission_id = [permission_id];
const { get_users } = filters;
const is_get_users = get_users === 'true';
async getRolesByCustomer(filters: GetRolesByCustomerReq, customerId: string) {
let { permissionIds } = filters;
if (permissionIds && !Array.isArray(permissionIds))
permissionIds = [permissionIds];
const { getUsers } = filters;
const isGetUsers = getUsers === 'true';
const permissionSeqIds =
permissionIds?.map((id) => {
const seqId = Number(id);
if (isNaN(seqId))
throw new BadRequestException(`permissionId ${id} not valid`);
return seqId;
}) || [];
const roles = await lastValueFrom(
this.rolesClientService.RoleFindAllByCustomerId({
customerId,
getUsers: isGetUsers,
permissionIds: [],
permissionSeqIds,
}),
);
const rolesTreated = this.getRolesPermissionsName(roles.roles);
return { roles: rolesTreated };
}
async createRole(data: CreateRoleReq, customerId: string) {
const { description, name, permissionIds, userIds } = data;
const role = await lastValueFrom(
this.rolesClientService.RoleCreate({
customerId,
name,
permissionIds: [],
permissionSeqIds: permissionIds,
description,
userIds,
}),
);
const [roleTreated] = this.getRolesPermissionsName([role.role]);
return { role: roleTreated };
}
async removeRole(id: string) {
return lastValueFrom(this.rolesClientService.RoleRemove({ id }));
}
async grantPermissionsToRole({
roleId,
permissionIds,
}: GrantPermissionsToRoleRequest) {
const role = await lastValueFrom(
this.rolesClientService.GrantPermissionsToRole({
permissionIds,
roleId,
}),
);
}
async revokePermissionToRole({
roleId,
permissionIds,
}: RevokePermissionsFromRoleRequest) {
const role = await lastValueFrom(
this.rolesClientService.RevokePermissionsFromRole({
permissionIds,
roleId,
}),
);
}
async updateRole(req: RoleUpdateRequest) {
const role = await lastValueFrom(this.rolesClientService.RoleUpdate(req));
}
getRolesPermissionsName(roles: Role[]) {
for (const role of roles) {
const permisisonSeqIds = role.permissions.map((p) => p.seqid);
const permissions =
this.permissionsService.getPermissionsBySeqId(permisisonSeqIds);
role.permissions.forEach((p) => {
const permission = permissions.find((per) => per.seqid === p.seqid);
p.name = permission.name;
});
}
return roles;
}
}
+16 -34
View File
@@ -1,4 +1,4 @@
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';
import { Role } from 'src/modules/roles/dto/entities';
export class Customer {
@ApiProperty()
@@ -26,35 +26,13 @@ export class User {
@ApiProperty({ type: [Role] })
roles: Role[];
@ApiProperty()
jobTitle: string;
jobTitle?: string;
@ApiProperty()
department: string;
department?: string;
@ApiProperty()
hierarchy: string;
@ApiProperty()
customer: Customer;
@ApiProperty()
mfaStatus: string;
@ApiProperty()
createdAt: string;
@ApiProperty()
updatedAt: string;
}
export class UserWithoutRoles {
@ApiProperty()
id: string;
@ApiProperty()
name: string;
@ApiProperty()
email: string;
@ApiProperty()
jobTitle: string;
@ApiProperty()
department: string;
@ApiProperty()
hierarchy: string;
@ApiProperty()
customer: Customer;
hierarchy?: string;
@ApiPropertyOptional()
customer?: Customer;
@ApiProperty()
mfaStatus: string;
@ApiProperty()
@@ -62,6 +40,10 @@ export class UserWithoutRoles {
@ApiProperty()
updatedAt: string;
}
export class UserNoRoles extends OmitType(User, ['roles']) {}
export class UserNoRolesAndCustomer extends OmitType(UserNoRoles, [
'customer',
]) {}
export class UserByCustomer {
@ApiProperty({ type: [Role] })
roles: Role[];
@@ -80,17 +62,17 @@ export class UserByCustomer {
}
export class CreateUserReq {
@ApiPropertyOptional()
name: string;
name?: string;
@ApiProperty()
email: string;
@ApiPropertyOptional()
roles: string[];
roles?: string[];
@ApiPropertyOptional()
jobTitle: string;
jobTitle?: string;
@ApiPropertyOptional()
department: string;
department?: string;
@ApiPropertyOptional()
hierarchy: string;
hierarchy?: string;
}
export class CreateUserRes {
@ApiProperty()
@@ -107,7 +89,7 @@ export class BatchCreateUserRes {
export class GetAllUsersByCustomerIdReq {
@ApiPropertyOptional()
s: string;
s?: string;
}
export class GetAllUsersByCustomerIdRes {
@ApiProperty({ type: [UserByCustomer] })
+15 -15
View File
@@ -23,6 +23,7 @@ import {
} from './dtos/entities';
import { UsersService } from './users.service';
// TODO GET de hierarquias e do PATCH em usuário
@ApiTags('Users')
@Controller('users')
export class UsersController {
@@ -54,42 +55,41 @@ export class UsersController {
@Post()
@ApiOkResponse({ type: CreateUserRes })
async createUser(@User() user, @Body() body: CreateUserReq) {
async createUser(@User() user: RequestUser, @Body() body: CreateUserReq) {
this.logger.info('createUser', { user });
}
@Post('batch')
@ApiOkResponse({ type: CreateUserRes })
async batchCreateUser(@User() user, @Body() body: CreateUserReq) {
async batchCreateUser(
@User() user: RequestUser,
@Body() body: CreateUserReq,
) {
this.logger.info('batchCreateUser', { user });
}
@Delete(':id')
@ApiOkResponse({ type: DeleteUserRes })
async deleteUser(@User() user, @Param('id') id: string) {
async deleteUser(@User() user: RequestUser, @Param('id') id: string) {
this.logger.info('deleteUser', { user });
return await this.userService.deleteUser({ id });
}
@Put('role')
async assignRoleToUser(@User() user, @Body() body: AssignRoleToUserReq) {
async assignRoleToUser(
@User() user: RequestUser,
@Body() body: AssignRoleToUserReq,
) {
this.logger.info('assignRoleToUser', { user });
return await this.userService.assignRoleToUser(body);
}
@Delete('role')
async unassignRoleToUser(@User() user, @Body() body: UnassignRoleToUserReq) {
async unassignRoleToUser(
@User() user: RequestUser,
@Body() body: UnassignRoleToUserReq,
) {
this.logger.info('unassignRoleToUser', { user });
return await this.userService.unassignRoleToUser(body);
}
// @Get('search')
// @ApiOkResponse({ type: SearchUserRes })
// async searchUser(
// @User() user: RequestUser,
// @Query('s') searchQuery: SearchUserReq,
// ) {
// this.logger.info('searchUser', { user });
// console.log(searchQuery);
// }
}
+16 -2
View File
@@ -112,6 +112,13 @@ export function EnrichErrorCode(code: string) {
code,
};
case ErrorCodes.ROLE.ALREADY_EXIST:
return {
statusCode: HttpStatus.BAD_REQUEST,
error: 'Grupo já existe',
message: 'Não é possível criar um grupo com esse nome',
code,
};
case ErrorCodes.INTERNAL:
case ErrorCodes.UNKNOWN:
default:
@@ -121,6 +128,7 @@ export function EnrichErrorCode(code: string) {
message:
'Erro desconhecido. Tente novamente ou entre em contato com o suporte',
code: ErrorCodes.UNKNOWN,
details: code,
};
}
}
@@ -138,8 +146,14 @@ export default class ErrorBuilder extends HttpException {
logger.log(code);
}
const { statusCode, message, error, code: rCode } = EnrichErrorCode(code);
super({ statusCode, message, error, code: rCode }, statusCode);
const {
statusCode,
message,
error,
code: rCode,
details,
} = EnrichErrorCode(code);
super({ statusCode, message, error, code: rCode, details }, statusCode);
this.code = code;
}
}
+4 -1
View File
@@ -13,12 +13,15 @@ export const AUTH = {
RESET_PASSWORD_CODE_INVALID: 'AUTH.RESET_PASSWORD_CODE_INVALID',
WEAK_NEW_PASSWORD: 'AUTH.WEAK_NEW_PASSWORD',
};
export const ROLE = {
ALREADY_EXIST: 'ROLE.ALREADY_EXISTS',
};
const ErrorCodes = {
UNKNOWN: 'UNKNOWN',
RATE_LIMIT: 'RATE_LIMIT',
INTERNAL: 'INTERNAL',
AUTH,
ROLE,
};
export default ErrorCodes;