diff --git a/src/modules/account/account.controller.ts b/src/modules/account/account.controller.ts index 219df5e..46a8cb0 100644 --- a/src/modules/account/account.controller.ts +++ b/src/modules/account/account.controller.ts @@ -2,8 +2,8 @@ import { Body, Controller, Get, Post, Query } from "@nestjs/common"; import { CheckDuplicationRequestDto } from "./dto/checkDuplication/check-duplication-request.dto"; import { CheckDuplicationResponseDto } from "./dto/checkDuplication/check-duplication-response.dto"; import { AccountService } from "./account.service"; -import { SendVerificationCodeRequestDto } from "./dto/checkDuplication/send-verification-code-request.dto"; -import { SendVerificationCodeResponseDto } from "./dto/checkDuplication/send-verification-code-response.dto"; +import { SendVerificationCodeRequestDto } from "./dto/sendVerification/send-verification-code-request.dto"; +import { SendVerificationCodeResponseDto } from "./dto/sendVerification/send-verification-code-response.dto"; @Controller('account') export class AccountController { diff --git a/src/modules/account/account.repo.ts b/src/modules/account/account.repo.ts index ad7b06b..0f7baa7 100644 --- a/src/modules/account/account.repo.ts +++ b/src/modules/account/account.repo.ts @@ -18,4 +18,18 @@ export class AccountRepo { return result[0].count; } + + async activeAccount(email: string) { + return this + .db + .update(schema.account) + .set({ status: 'active' }) + .where( + and( + eq(schema.account.email, email), + eq(schema.account.status, 'wait'), + eq(schema.account.isDeleted, false) + ) + ) + } } \ No newline at end of file diff --git a/src/modules/account/account.service.ts b/src/modules/account/account.service.ts index 0522b83..5dbe385 100644 --- a/src/modules/account/account.service.ts +++ b/src/modules/account/account.service.ts @@ -1,17 +1,21 @@ -import { Injectable } from "@nestjs/common"; +import { Inject, Injectable } from "@nestjs/common"; import { AccountRepo } from "./account.repo"; import { CheckDuplicationRequestDto } from "./dto/checkDuplication/check-duplication-request.dto"; import { CheckDuplicationResponseDto } from "./dto/checkDuplication/check-duplication-response.dto"; -import { SendVerificationCodeRequestDto } from "./dto/checkDuplication/send-verification-code-request.dto"; +import { SendVerificationCodeRequestDto } from "./dto/sendVerification/send-verification-code-request.dto"; import { MailerService } from "src/util/mailer/mailer.service"; import { Generator } from "src/util/generator"; -import { SendVerificationCodeResponseDto } from "./dto/checkDuplication/send-verification-code-response.dto"; +import { SendVerificationCodeResponseDto } from "./dto/sendVerification/send-verification-code-response.dto"; +import Redis from "ioredis"; +import { VerifyCodeResponseDto } from "./dto/verifyCode/verify-code-response.dto"; +import { VerifyCodeRequestDto } from "./dto/verifyCode/verify-code-request.dto"; @Injectable() export class AccountService { constructor( private readonly accountRepo: AccountRepo , private readonly mailerService: MailerService + , @Inject("REDIS") private readonly redis: Redis ) {} async checkDuplication(data: CheckDuplicationRequestDto): Promise { @@ -28,7 +32,21 @@ export class AccountService { if (result.rejected.length > 0) { return { success: false, error: result.response } } else { + await this.redis.set(`verify:${data.email}`, code, 'EX', 600); + return { success: true, message: "이메일 발송 완료" }; } } + + async verifyCode(data: VerifyCodeRequestDto): Promise{ + const { email, code } = data; + + const storedCode = await this.redis.get(`verify:${email}`); + + if (!storedCode) return { verified: false, error: '잘못된 이메일이거나 코드가 만료되었습니다.'}; + if (storedCode !== code) return { verified: false, error: "잘못된 코드입니다." }; + + await this.redis.del(`verify:${email}`); + return { verified: true, message: "이메일 인증이 완료되었습니다." }; + } } \ No newline at end of file diff --git a/src/modules/account/dto/checkDuplication/send-verification-code-request.dto.ts b/src/modules/account/dto/sendVerification/send-verification-code-request.dto.ts similarity index 100% rename from src/modules/account/dto/checkDuplication/send-verification-code-request.dto.ts rename to src/modules/account/dto/sendVerification/send-verification-code-request.dto.ts diff --git a/src/modules/account/dto/checkDuplication/send-verification-code-response.dto.ts b/src/modules/account/dto/sendVerification/send-verification-code-response.dto.ts similarity index 100% rename from src/modules/account/dto/checkDuplication/send-verification-code-response.dto.ts rename to src/modules/account/dto/sendVerification/send-verification-code-response.dto.ts diff --git a/src/modules/account/dto/verifyCode/verify-code-request.dto.ts b/src/modules/account/dto/verifyCode/verify-code-request.dto.ts new file mode 100644 index 0000000..09f6f17 --- /dev/null +++ b/src/modules/account/dto/verifyCode/verify-code-request.dto.ts @@ -0,0 +1,9 @@ +import { IsEmail, IsString } from "@nestjs/class-validator"; + +export class VerifyCodeRequestDto { + @IsEmail() + email: string; + + @IsString() + code: string; +} \ No newline at end of file diff --git a/src/modules/account/dto/verifyCode/verify-code-response.dto.ts b/src/modules/account/dto/verifyCode/verify-code-response.dto.ts new file mode 100644 index 0000000..739bae7 --- /dev/null +++ b/src/modules/account/dto/verifyCode/verify-code-response.dto.ts @@ -0,0 +1,5 @@ +export class VerifyCodeResponseDto { + verified: boolean; + message?: string; + error?: string; +} \ No newline at end of file diff --git a/src/redis/redis.module.ts b/src/redis/redis.module.ts index 6d2c99f..3ca63fd 100644 --- a/src/redis/redis.module.ts +++ b/src/redis/redis.module.ts @@ -6,7 +6,7 @@ import Redis from "ioredis"; providers: [ { provide: "REDIS", - useFactory: () => { + useFactory: (): Redis => { return new Redis({ host: process.env.RD_HOST!, port: Number(process.env.RD_PORT || 6779) diff --git a/src/util/mailer/mailer.service.ts b/src/util/mailer/mailer.service.ts index 4a3d1e7..6145cca 100644 --- a/src/util/mailer/mailer.service.ts +++ b/src/util/mailer/mailer.service.ts @@ -19,7 +19,6 @@ export class MailerService { async sendMail(to: string, subject: string, html: string) { const accessToken = await this.oauth2Client.getAccessToken(); - console.log(accessToken); const options: SMTPTransport.Options = { host: "smtp.gmail.com", port: 465,