Skip to content

Commit 19f0851

Browse files
committed
fix(backend): normalize emails to lowercase in dtos (SCRUM-307)
1 parent 25ccfe8 commit 19f0851

6 files changed

Lines changed: 21 additions & 2 deletions

File tree

backend/src/modules/admin/dto/create-admin.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ApiProperty } from '@nestjs/swagger';
22
import { IsEmail, IsString, IsNotEmpty } from 'class-validator';
3+
import { Transform } from 'class-transformer';
34
import { IsAllowedEmailDomain } from '../../../common/validators/allowed-email-domains.validator';
45

56
export class CreateAdminDto {
@@ -10,6 +11,9 @@ export class CreateAdminDto {
1011
})
1112
@IsEmail()
1213
@IsNotEmpty()
14+
@Transform(({ value }: { value: unknown }) =>
15+
typeof value === 'string' ? value.toLowerCase() : (value as string),
16+
)
1317
@IsAllowedEmailDomain({
1418
message: 'Email must be from an allowed domain',
1519
})

backend/src/modules/admin/dto/supervisors-bulk-import.dto.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { Type } from 'class-transformer';
1+
import { Type, Transform } from 'class-transformer';
22
import {
33
IsEmail,
44
IsString,
@@ -19,6 +19,9 @@ export class SupervisorDto {
1919
})
2020
@IsEmail()
2121
@IsNotEmpty()
22+
@Transform(({ value }: { value: unknown }) =>
23+
typeof value === 'string' ? value.toLowerCase() : (value as string),
24+
)
2225
email: string;
2326

2427
@ApiPropertyOptional({

backend/src/modules/auth/strategies/clerk-registration.strategy.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -121,7 +121,7 @@ export class ClerkRegistrationStrategy extends PassportStrategy(Strategy, 'clerk
121121
// For registration, extract and return the claims without DB lookup
122122
return {
123123
clerk_id: payload.sub,
124-
email: payload.email,
124+
email: payload.email.toLowerCase(),
125125
exp: payload.exp,
126126
};
127127
} catch (error) {

backend/src/modules/requests/supervision/dto/create-supervision-request.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ApiPropertyOptional } from '@nestjs/swagger';
22
import { IsEmail, IsOptional, IsUUID } from 'class-validator';
3+
import { Transform } from 'class-transformer';
34
import { IsAllowedEmailDomain } from '../../../../common/validators/allowed-email-domains.validator';
45

56
export class CreateSupervisionRequestDto {
@@ -18,6 +19,9 @@ export class CreateSupervisionRequestDto {
1819
})
1920
@IsOptional()
2021
@IsEmail()
22+
@Transform(({ value }: { value: unknown }) =>
23+
typeof value === 'string' ? value.toLowerCase() : (value as string),
24+
)
2125
@IsAllowedEmailDomain({
2226
message: 'Email must be from an allowed domain',
2327
})

backend/src/modules/users/dto/create-user.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
22
import { IsEmail, IsOptional, IsString, IsNotEmpty } from 'class-validator';
3+
import { Transform } from 'class-transformer';
34

45
export class CreateUserDto {
56
@ApiProperty({
@@ -9,6 +10,9 @@ export class CreateUserDto {
910
})
1011
@IsEmail()
1112
@IsNotEmpty()
13+
@Transform(({ value }: { value: unknown }) =>
14+
typeof value === 'string' ? value.toLowerCase() : (value as string),
15+
)
1216
email: string;
1317

1418
@ApiPropertyOptional({

backend/src/modules/users/dto/update-user.dto.ts

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import { ApiPropertyOptional } from '@nestjs/swagger';
22
import { IsEmail, IsOptional, IsString } from 'class-validator';
3+
import { Transform } from 'class-transformer';
34

45
export class UpdateUserDto {
56
@ApiPropertyOptional({
@@ -8,6 +9,9 @@ export class UpdateUserDto {
89
})
910
@IsEmail()
1011
@IsOptional()
12+
@Transform(({ value }: { value: unknown }) =>
13+
typeof value === 'string' ? value.toLowerCase() : (value as string),
14+
)
1115
email?: string;
1216

1317
@ApiPropertyOptional({

0 commit comments

Comments
 (0)