diff --git a/backend/src/modules/session/repository/session.repository.ts b/backend/src/modules/session/repository/session.repository.ts index 8c93c52..be5e85d 100644 --- a/backend/src/modules/session/repository/session.repository.ts +++ b/backend/src/modules/session/repository/session.repository.ts @@ -22,6 +22,21 @@ export class SessionRepository { .getMany(); } + public async getUserIdBySessionId(sessionId: string): Promise { + 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( sessionId: string ): Promise { diff --git a/backend/src/modules/session/services/session.service.ts b/backend/src/modules/session/services/session.service.ts index 0fd0b56..061e83f 100644 --- a/backend/src/modules/session/services/session.service.ts +++ b/backend/src/modules/session/services/session.service.ts @@ -20,6 +20,10 @@ export class SessionService { return this.sessionRepository.findSessionsByUserId(userId); } + public async getUserIdBySessionId(sessionId: string): Promise { + return this.sessionRepository.getUserIdBySessionId(sessionId); + } + public async isSessioExpired(session: Session): Promise { return this.sessionRepository.isSessionExpired(session); } diff --git a/backend/src/modules/user-module/repositories/user-data.repository.ts b/backend/src/modules/user-module/repositories/user-data.repository.ts index 11056eb..1b00fdf 100644 --- a/backend/src/modules/user-module/repositories/user-data.repository.ts +++ b/backend/src/modules/user-module/repositories/user-data.repository.ts @@ -21,10 +21,17 @@ export class UserDataRepository { return this.repository.save(userData); } - // public async updateEmailVerificationStatus(userId: string): Promise { - // await this.repository.update( - // { user: { id: userId } }, - // { isEmailConfirmed: true } - // ); - // } + public async updateEmailVerificationStatus(userId: string): Promise { + try { + const result = await this.repository.update( + { userCredentials: { id: userId } }, + { isEmailConfirmed: true } + ); + + return result.affected > 0; + } catch (error) { + console.error('Error updating email verification status:', error); + return false; + } + } } diff --git a/backend/src/modules/verify-module/controller/verify.controller.ts b/backend/src/modules/verify-module/controller/verify.controller.ts index 76f9180..c68389f 100644 --- a/backend/src/modules/verify-module/controller/verify.controller.ts +++ b/backend/src/modules/verify-module/controller/verify.controller.ts @@ -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 { Request } from 'express'; +import { SessionGuard } from 'src/modules/session/guard'; import { Public } from 'src/shared/decorator'; import { EmailVerificationService } from '../services/email-verification.service'; @@ -23,4 +33,15 @@ export class VerifyController { ): Promise { 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 { + return this.emailVerificationService.isEmailVerified(request.sessionID); + } } diff --git a/backend/src/modules/verify-module/services/email-verification.service.ts b/backend/src/modules/verify-module/services/email-verification.service.ts index 288d2ef..6a0f0ae 100644 --- a/backend/src/modules/verify-module/services/email-verification.service.ts +++ b/backend/src/modules/verify-module/services/email-verification.service.ts @@ -3,6 +3,7 @@ import { randomBytes } from 'crypto'; import { Injectable } from '@nestjs/common'; import { ConfigService } from '@nestjs/config'; import { EmailVerification } from 'src/entities'; +import { SessionService } from 'src/modules/session/services/session.service'; import { UriEncoderService } from 'src/shared'; import { UserDataRepository } from '../../user-module/repositories/user-data.repository'; @@ -13,6 +14,7 @@ export class EmailVerificationService { public constructor( private readonly emailVerifyRepository: EmailVerifyRepository, private readonly userDataRepository: UserDataRepository, + private readonly sessionService: SessionService, private readonly configService: ConfigService ) {} @@ -42,17 +44,25 @@ export class EmailVerificationService { await this.deleteEmailVerificationToken(tokenToVerify); if (emailVerification && emailVerification.user) { - // await this.userDataRepository.updateEmailVerificationStatus( - // emailVerification.user.id - // ); - return true; - } else { - return false; + const isStatusUpdated = + await this.userDataRepository.updateEmailVerificationStatus( + emailVerification.user.id + ); + + return isStatusUpdated; } } + return false; } + public async isEmailVerified(sessionID: string): Promise { + const userId = await this.sessionService.getUserIdBySessionId(sessionID); + + // TODO: Check if user is verified + return true; + } + private async createVerificationToken(): Promise { const verifyToken = randomBytes(32).toString('hex'); diff --git a/backend/src/modules/verify-module/verify.module.ts b/backend/src/modules/verify-module/verify.module.ts index 8c90fc8..f2ea20d 100644 --- a/backend/src/modules/verify-module/verify.module.ts +++ b/backend/src/modules/verify-module/verify.module.ts @@ -3,6 +3,7 @@ import { ConfigModule } from '@nestjs/config'; import { TypeOrmModule } from '@nestjs/typeorm'; import { EmailVerification } from 'src/entities'; +import { SessionModule } from '../session/session.module'; import { UserModule } from '../user-module/user.module'; import { VerifyController } from './controller/verify.controller'; @@ -12,6 +13,7 @@ import { EmailVerificationService } from './services/email-verification.service' @Module({ imports: [ ConfigModule, + SessionModule, UserModule, TypeOrmModule.forFeature([EmailVerification]), ],