Feature: E-Mail verify #8

Merged
igorpropisnov merged 4 commits from feature/mail-verify into main 2024-05-29 20:01:58 +02:00
6 changed files with 18 additions and 12 deletions
Showing only changes of commit 4278196096 - Show all commits

View File

@ -12,6 +12,7 @@ import { AccessTokenGuard } from './modules/auth-module/common/guards';
import { DatabaseModule } from './modules/database-module/database.module'; import { DatabaseModule } from './modules/database-module/database.module';
import { SendgridModule } from './modules/sendgrid-module/sendgrid.module'; import { SendgridModule } from './modules/sendgrid-module/sendgrid.module';
import { UserModule } from './modules/user-module/user.module'; import { UserModule } from './modules/user-module/user.module';
import { VerifyModule } from './modules/verify-module/verify.module';
@Module({ @Module({
imports: [ imports: [
@ -22,6 +23,7 @@ import { UserModule } from './modules/user-module/user.module';
AuthModule, AuthModule,
UserModule, UserModule,
SendgridModule, SendgridModule,
VerifyModule,
], ],
controllers: [AppController], controllers: [AppController],
providers: [AppService, { provide: 'APP_GUARD', useClass: AccessTokenGuard }], providers: [AppService, { provide: 'APP_GUARD', useClass: AccessTokenGuard }],

View File

@ -9,7 +9,7 @@ import {
@Entity() @Entity()
export class UserCredentials { export class UserCredentials {
@PrimaryGeneratedColumn('uuid') @PrimaryGeneratedColumn('uuid')
public id: number; public id: string;
@Column({ unique: true }) @Column({ unique: true })
public email: string; public email: string;

View File

@ -50,7 +50,7 @@ export class AuthController {
}) })
@Post('logout') @Post('logout')
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
public async logout(@GetCurrentUserId() userId: number): Promise<boolean> { public async logout(@GetCurrentUserId() userId: string): Promise<boolean> {
return this.authService.logout(userId); return this.authService.logout(userId);
} }
@ -70,7 +70,7 @@ export class AuthController {
@Post('refresh') @Post('refresh')
@HttpCode(HttpStatus.OK) @HttpCode(HttpStatus.OK)
public async refresh( public async refresh(
@GetCurrentUserId() userId: number, @GetCurrentUserId() userId: string,
@GetCurrentUser('refresh_token') refresh_token: string @GetCurrentUser('refresh_token') refresh_token: string
): Promise<TokensDto> { ): Promise<TokensDto> {
return this.authService.refresh(userId, refresh_token); return this.authService.refresh(userId, refresh_token);

View File

@ -26,13 +26,13 @@ export class UserCredentialsRepository {
} }
public async findUserById( public async findUserById(
userId: number userId: string
): Promise<UserCredentials | undefined> { ): Promise<UserCredentials | undefined> {
return this.repository.findOne({ where: { id: userId } }); return this.repository.findOne({ where: { id: userId } });
} }
public async updateUserTokenHash( public async updateUserTokenHash(
userId: number, userId: string,
hashedRt: string | null hashedRt: string | null
): Promise<number> { ): Promise<number> {
const result = await this.repository.update(userId, { hashedRt }); const result = await this.repository.update(userId, { hashedRt });

View File

@ -2,6 +2,7 @@ import { ForbiddenException, Injectable } from '@nestjs/common';
import { PasswordConfirmationMailService } from '../../sendgrid-module/services/password-confirmation.mail.service'; import { PasswordConfirmationMailService } from '../../sendgrid-module/services/password-confirmation.mail.service';
import { UserDataRepository } from '../../user-module/repositories/user-data.repository'; import { UserDataRepository } from '../../user-module/repositories/user-data.repository';
import { EmailVerificationService } from '../../verify-module/services/email-verification.service';
import { TokensDto, UserCredentialsDto } from '../models/dto'; import { TokensDto, UserCredentialsDto } from '../models/dto';
import { UserCredentialsRepository } from '../repositories/user-credentials.repository'; import { UserCredentialsRepository } from '../repositories/user-credentials.repository';
@ -15,7 +16,8 @@ export class AuthService {
private readonly userDataRepository: UserDataRepository, private readonly userDataRepository: UserDataRepository,
private readonly tokenManagementService: TokenManagementService, private readonly tokenManagementService: TokenManagementService,
private readonly encryptionService: EncryptionService, private readonly encryptionService: EncryptionService,
private readonly passwordConfirmationMailService: PasswordConfirmationMailService private readonly passwordConfirmationMailService: PasswordConfirmationMailService,
private readonly emailVerificationService: EmailVerificationService
) {} ) {}
public async signup(userCredentials: UserCredentialsDto): Promise<TokensDto> { public async signup(userCredentials: UserCredentialsDto): Promise<TokensDto> {
@ -34,6 +36,8 @@ export class AuthService {
// user.email // user.email
// ); // );
// await this.emailVerificationService.generateEmailVerificationToken(user.id);
return this.generateAndPersistTokens(user.id, user.email); return this.generateAndPersistTokens(user.id, user.email);
} }
@ -59,7 +63,7 @@ export class AuthService {
} }
public async refresh( public async refresh(
userId: number, userId: string,
refreshToken: string refreshToken: string
): Promise<TokensDto> { ): Promise<TokensDto> {
const user = await this.userCredentialsRepository.findUserById(userId); const user = await this.userCredentialsRepository.findUserById(userId);
@ -80,7 +84,7 @@ export class AuthService {
return this.generateAndPersistTokens(user.id, user.email); return this.generateAndPersistTokens(user.id, user.email);
} }
public async logout(userId: number): Promise<boolean> { public async logout(userId: string): Promise<boolean> {
const affected = await this.userCredentialsRepository.updateUserTokenHash( const affected = await this.userCredentialsRepository.updateUserTokenHash(
userId, userId,
null null
@ -90,7 +94,7 @@ export class AuthService {
} }
private async generateAndPersistTokens( private async generateAndPersistTokens(
userId: number, userId: string,
email: string email: string
): Promise<TokensDto> { ): Promise<TokensDto> {
const tokens = await this.tokenManagementService.generateTokens( const tokens = await this.tokenManagementService.generateTokens(

View File

@ -26,7 +26,7 @@ export class TokenManagementService {
} }
public async generateTokens( public async generateTokens(
userId: number, userId: string,
email: string email: string
): Promise<TokensDto> { ): Promise<TokensDto> {
const access_token: string = await this.createAccessToken(userId, email); const access_token: string = await this.createAccessToken(userId, email);
@ -36,7 +36,7 @@ export class TokenManagementService {
} }
private async createAccessToken( private async createAccessToken(
userId: number, userId: string,
email: string email: string
): Promise<string> { ): Promise<string> {
return this.jwt.signAsync( return this.jwt.signAsync(
@ -49,7 +49,7 @@ export class TokenManagementService {
} }
private async createRefreshToken( private async createRefreshToken(
userId: number, userId: string,
email: string email: string
): Promise<string> { ): Promise<string> {
return this.jwt.signAsync( return this.jwt.signAsync(