Feature: E-Mail verify #8
|
@ -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 }],
|
||||||
|
|
|
@ -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;
|
||||||
|
|
|
@ -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);
|
||||||
|
|
|
@ -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 });
|
||||||
|
|
|
@ -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(
|
||||||
|
|
|
@ -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(
|
||||||
|
|
Loading…
Reference in New Issue