Skip to content

Commit ba245da

Browse files
Copilotsschonss
andcommitted
Add support for email login in addition to username
Co-authored-by: sschonss <82298137+sschonss@users.noreply.github.com>
1 parent 35c8479 commit ba245da

File tree

4 files changed

+36
-5
lines changed

4 files changed

+36
-5
lines changed

packages/account/domain/src/server/use-cases/authentication.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,13 @@ export class AuthenticationUseCase
1515
) {}
1616

1717
async execute(data: ValidateUserCode) {
18-
const user = await this.usersService.findOneBy('name', data.name);
18+
// Check if the input is an email or username
19+
const isEmail = data.name.includes('@');
20+
21+
// Try to find user by email or username
22+
const user = isEmail
23+
? await this.usersService.findOneBy('contact.email', data.name)
24+
: await this.usersService.findOneBy('name', data.name);
1925

2026
if (!user || !user.code) {
2127
throw new AuthenticationError('Não autorizado, já criou sua conta?');

packages/account/domain/src/server/use-cases/send-user-code.ts

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,13 @@ export class SendUserCodeUseCase implements UseCase<string, ResponseMessage> {
1212
) {}
1313

1414
async execute(name: string) {
15-
const user = await this.usersService.findOneBy('name', name);
15+
// Check if the input is an email or username
16+
const isEmail = name.includes('@');
17+
18+
// Try to find user by email or username
19+
const user = isEmail
20+
? await this.usersService.findOneBy('contact.email', name)
21+
: await this.usersService.findOneBy('name', name);
1622

1723
if (!user) {
1824
throw new AuthenticationError();

packages/account/feature-auth/src/lib/containers/authentication/authentication.container.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,15 +26,15 @@
2626
</ng-template>
2727
<form [formGroup]="form" (submit)="sendUserCode()">
2828
<mat-form-field>
29-
<mat-label>Seu usuário</mat-label>
29+
<mat-label>Seu usuário ou email</mat-label>
3030
<input
3131
matInput
3232
#nameRef
3333
formControlName="name"
3434
autocomplete="username"
3535
autofocus
3636
/>
37-
<mat-error>Obrigatório</mat-error>
37+
<mat-error>Digite um usuário ou email válido</mat-error>
3838
</mat-form-field>
3939

4040
<button mat-button matStepperNext>Enviar código por e-mail</button>

packages/account/feature-auth/src/lib/forms/authentication.ts

Lines changed: 20 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,31 @@ import { FormControl, FormGroup, Validators } from '@angular/forms';
22
import { ValidateUserCode } from '@devmx/account-data-access';
33
import { TypedForm } from '@devmx/shared-ui-global/forms';
44

5+
/**
6+
* Custom validator that accepts either a username (lowercase alphanumeric) or an email
7+
*/
8+
function usernameOrEmailValidator(control: FormControl) {
9+
const value = control.value;
10+
if (!value) return null;
11+
12+
const isEmail = value.includes('@');
13+
if (isEmail) {
14+
// Use simple email validation (same as Validators.email)
15+
const emailPattern = /^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$/;
16+
return emailPattern.test(value) ? null : { invalidEmailOrUsername: true };
17+
} else {
18+
// Username pattern (lowercase alphanumeric)
19+
const usernamePattern = /^[a-z0-9]+$/;
20+
return usernamePattern.test(value) ? null : { invalidEmailOrUsername: true };
21+
}
22+
}
23+
524
export class AuthenticationForm extends FormGroup<TypedForm<ValidateUserCode>> {
625
constructor() {
726
super({
827
name: new FormControl('', {
928
nonNullable: true,
10-
validators: [Validators.required, Validators.pattern(/^[a-z0-9]+$/)],
29+
validators: [Validators.required, usernameOrEmailValidator],
1130
}),
1231
code: new FormControl('', {
1332
nonNullable: true,

0 commit comments

Comments
 (0)