fix email verfitication

This commit is contained in:
Igor Hrenowitsch Propisnov 2024-07-31 00:00:22 +02:00
parent 584f34f947
commit b3f1c8bc89
6 changed files with 72 additions and 13 deletions

View File

@ -22,6 +22,21 @@ export class SessionRepository {
.getMany(); .getMany();
} }
public async getUserIdBySessionId(sessionId: string): Promise<string | null> {
const session = await this.findSessionBySessionId(sessionId);
if (!session || !session.json) {
return null;
}
const sessionData =
typeof session.json === 'string'
? JSON.parse(session.json)
: session.json;
return sessionData?.passport?.user?.id || null;
}
public async findSessionBySessionId( public async findSessionBySessionId(
sessionId: string sessionId: string
): Promise<Session | null> { ): Promise<Session | null> {

View File

@ -20,6 +20,10 @@ export class SessionService {
return this.sessionRepository.findSessionsByUserId(userId); return this.sessionRepository.findSessionsByUserId(userId);
} }
public async getUserIdBySessionId(sessionId: string): Promise<string | null> {
return this.sessionRepository.getUserIdBySessionId(sessionId);
}
public async isSessioExpired(session: Session): Promise<boolean> { public async isSessioExpired(session: Session): Promise<boolean> {
return this.sessionRepository.isSessionExpired(session); return this.sessionRepository.isSessionExpired(session);
} }

View File

@ -21,10 +21,17 @@ export class UserDataRepository {
return this.repository.save(userData); return this.repository.save(userData);
} }
// public async updateEmailVerificationStatus(userId: string): Promise<void> { public async updateEmailVerificationStatus(userId: string): Promise<boolean> {
// await this.repository.update( try {
// { user: { id: userId } }, const result = await this.repository.update(
// { isEmailConfirmed: true } { userCredentials: { id: userId } },
// ); { isEmailConfirmed: true }
// } );
return result.affected > 0;
} catch (error) {
console.error('Error updating email verification status:', error);
return false;
}
}
} }

View File

@ -1,5 +1,15 @@
import { Controller, Get, HttpCode, HttpStatus, Query } from '@nestjs/common'; import {
Controller,
Get,
Req,
HttpCode,
HttpStatus,
Query,
UseGuards,
} from '@nestjs/common';
import { ApiCreatedResponse, ApiTags } from '@nestjs/swagger'; import { ApiCreatedResponse, ApiTags } from '@nestjs/swagger';
import { Request } from 'express';
import { SessionGuard } from 'src/modules/session/guard';
import { Public } from 'src/shared/decorator'; import { Public } from 'src/shared/decorator';
import { EmailVerificationService } from '../services/email-verification.service'; import { EmailVerificationService } from '../services/email-verification.service';
@ -23,4 +33,15 @@ export class VerifyController {
): Promise<boolean> { ): Promise<boolean> {
return this.emailVerificationService.verifyEmail(tokenToVerify); return this.emailVerificationService.verifyEmail(tokenToVerify);
} }
@ApiCreatedResponse({
description: 'Check if email is verified',
type: Boolean,
})
@Get('check')
@HttpCode(HttpStatus.OK)
@UseGuards(SessionGuard)
public async isEmailVerified(@Req() request: Request): Promise<boolean> {
return this.emailVerificationService.isEmailVerified(request.sessionID);
}
} }

View File

@ -3,6 +3,7 @@ import { randomBytes } from 'crypto';
import { Injectable } from '@nestjs/common'; import { Injectable } from '@nestjs/common';
import { ConfigService } from '@nestjs/config'; import { ConfigService } from '@nestjs/config';
import { EmailVerification } from 'src/entities'; import { EmailVerification } from 'src/entities';
import { SessionService } from 'src/modules/session/services/session.service';
import { UriEncoderService } from 'src/shared'; import { UriEncoderService } from 'src/shared';
import { UserDataRepository } from '../../user-module/repositories/user-data.repository'; import { UserDataRepository } from '../../user-module/repositories/user-data.repository';
@ -13,6 +14,7 @@ export class EmailVerificationService {
public constructor( public constructor(
private readonly emailVerifyRepository: EmailVerifyRepository, private readonly emailVerifyRepository: EmailVerifyRepository,
private readonly userDataRepository: UserDataRepository, private readonly userDataRepository: UserDataRepository,
private readonly sessionService: SessionService,
private readonly configService: ConfigService private readonly configService: ConfigService
) {} ) {}
@ -42,15 +44,23 @@ export class EmailVerificationService {
await this.deleteEmailVerificationToken(tokenToVerify); await this.deleteEmailVerificationToken(tokenToVerify);
if (emailVerification && emailVerification.user) { if (emailVerification && emailVerification.user) {
// await this.userDataRepository.updateEmailVerificationStatus( const isStatusUpdated =
// emailVerification.user.id await this.userDataRepository.updateEmailVerificationStatus(
// ); emailVerification.user.id
);
return isStatusUpdated;
}
}
return false;
}
public async isEmailVerified(sessionID: string): Promise<boolean> {
const userId = await this.sessionService.getUserIdBySessionId(sessionID);
// TODO: Check if user is verified
return true; return true;
} else {
return false;
}
}
return false;
} }
private async createVerificationToken(): Promise<string> { private async createVerificationToken(): Promise<string> {

View File

@ -3,6 +3,7 @@ import { ConfigModule } from '@nestjs/config';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { EmailVerification } from 'src/entities'; import { EmailVerification } from 'src/entities';
import { SessionModule } from '../session/session.module';
import { UserModule } from '../user-module/user.module'; import { UserModule } from '../user-module/user.module';
import { VerifyController } from './controller/verify.controller'; import { VerifyController } from './controller/verify.controller';
@ -12,6 +13,7 @@ import { EmailVerificationService } from './services/email-verification.service'
@Module({ @Module({
imports: [ imports: [
ConfigModule, ConfigModule,
SessionModule,
UserModule, UserModule,
TypeOrmModule.forFeature([EmailVerification]), TypeOrmModule.forFeature([EmailVerification]),
], ],