Skip to content

Commit

Permalink
Merge pull request #51 from souravbhowmik1999/oblf_new_requirement
Browse files Browse the repository at this point in the history
Auto generated username and password for creating enrolment number
  • Loading branch information
Sourav-Tekdi authored Sep 13, 2024
2 parents 3773e09 + a4a1354 commit dbc42fe
Show file tree
Hide file tree
Showing 2 changed files with 91 additions and 7 deletions.
90 changes: 88 additions & 2 deletions src/adapters/postgres/user-adapter.ts
Original file line number Diff line number Diff line change
Expand Up @@ -463,7 +463,6 @@ export class PostgresUserService implements IServicelocator {
let customFieldError;
if (userCreateDto.customFields && userCreateDto.customFields.length > 0) {
customFieldError = await this.validateCustomField(userCreateDto, response, apiId);

if (customFieldError) {
return APIResponse.error(response, apiId, "BAD_REQUEST", `${customFieldError}`, HttpStatus.BAD_REQUEST);
}
Expand All @@ -478,7 +477,12 @@ export class PostgresUserService implements IServicelocator {
return APIResponse.error(response, apiId, "BAD_REQUEST", `${validatedRoles}`, HttpStatus.BAD_REQUEST);
}

userCreateDto.username = userCreateDto.username.toLocaleLowerCase();
const getUsernameAndPassword = await this.generateUserNamePassword(userCreateDto);

userCreateDto.username = userCreateDto.username ? await this.formatUsername(userCreateDto.username) : getUsernameAndPassword['username'];

userCreateDto.password = userCreateDto.password ? userCreateDto.password : getUsernameAndPassword['password'];

const userSchema = new UserCreateDto(userCreateDto);

let errKeycloak = "";
Expand Down Expand Up @@ -685,6 +689,88 @@ export class PostgresUserService implements IServicelocator {
}
}

async generateUserNamePassword(userCreateDto: UserCreateDto) {
try {
let tenantCohortRoleMap = userCreateDto ? userCreateDto.tenantCohortRoleMapping : [];
let userRole;
let userTenant;
for (const tenantCohortRole of tenantCohortRoleMap) {
if (tenantCohortRole.roleId) {
let getRoleName = await this.roleRepository.find({
where: { "roleId": tenantCohortRole?.roleId },
select: ["title"]
})

let getTenantName = await this.tenantsRepository.find({
where: { "tenantId": tenantCohortRole?.tenantId },
select: ["name"]
})
userRole = getRoleName.map(role => role?.title.toUpperCase()).join(', ')
userTenant = getTenantName.map(role => role?.name).join(', ')
}
}

let generatedUsername;
let generatePassword;

// Generate the username based on the role and the program
if (userRole && userRole === 'STUDENT') {
let fieldValues = userCreateDto ? userCreateDto?.customFields : [];
let suffix;
if (fieldValues) {
for (const fieldsData of fieldValues) {
let getFieldName = await this.fieldsService.getFieldByIdes(fieldsData?.fieldId);
if (getFieldName['name'] === 'program') {
suffix = fieldsData?.value
}
}
}

// Retrieve the maximum sequence number from existing usernames
const maxUsername = await this.usersRepository
.createQueryBuilder('user')
.select("MAX(CAST(REGEXP_REPLACE(user.username, '[^0-9]', '', 'g') AS INTEGER))", 'max')
.where("user.username ILIKE :usernamePattern", { usernamePattern: `${userTenant}%` })
.andWhere("REGEXP_REPLACE(user.username, '[^0-9]', '', 'g') <> ''")
.getRawOne();

const maxNumber = maxUsername?.max;
const newSequenceNumber = maxNumber + 1;

generatedUsername = `${userTenant}${newSequenceNumber}${suffix?.[0]?.toUpperCase() || ''}`;
generatePassword = `${generatedUsername}@${userTenant.toLowerCase() || ''}`
}


if (userRole && userRole === 'TEACHER') {
generatedUsername = await this.formatUsername(userCreateDto?.name);
generatePassword = `${generatedUsername}@${userTenant.toLowerCase() || ''}`
}

let loginCredintial = {
"username": generatedUsername,
"password": generatePassword
};
return loginCredintial;

} catch (error) {
return false;
}
}

async formatUsername(name: string) {
// Remove prefixes (Dr., Mr., Mrs., etc.)
const nameWithoutPrefix = name.replace(/^(Dr\.|Mr\.|Mrs\.)\s+/i, '');

// Split the name by space
const nameParts = nameWithoutPrefix.split(' ');

// Convert the name to lowercase and join with an underscore
const formattedName = nameParts.map(part => part.toLocaleLowerCase()).join('_');

return formattedName;
}

async createUserInDatabase(request: any, userCreateDto: UserCreateDto, response: Response) {

const user = new User()
Expand Down
8 changes: 3 additions & 5 deletions src/user/dto/user-create.dto.ts
Original file line number Diff line number Diff line change
Expand Up @@ -64,10 +64,9 @@ export class UserCreateDto {
@Expose()
userId: string;

@ApiProperty({ type: () => String })
@ApiPropertyOptional({ type: () => String })
@Expose()
@IsNotEmpty()
username: string;
username?: string;

@ApiProperty({ type: () => String })
@Expose()
Expand All @@ -94,11 +93,10 @@ export class UserCreateDto {
@Expose()
email: string;

@ApiProperty({
@ApiPropertyOptional({
type: String,
description: "The password of the user",
})
@IsNotEmpty()
@Expose()
password: string;

Expand Down

0 comments on commit dbc42fe

Please sign in to comment.