From 0f0717fc79aac9fb2a18de0c2a27850b7861da19 Mon Sep 17 00:00:00 2001 From: geonhee-min Date: Tue, 2 Dec 2025 12:35:45 +0900 Subject: [PATCH] =?UTF-8?q?issue=20#41=20-=20=EB=B9=84=EB=B0=80=EB=B2=88?= =?UTF-8?q?=ED=98=B8=20=EC=B4=88=EA=B8=B0=ED=99=94=20=EB=A1=9C=EC=A7=81=20?= =?UTF-8?q?1=EC=B0=A8=20=EA=B5=AC=ED=98=84(=ED=85=8C=EC=8A=A4=ED=8A=B8=20?= =?UTF-8?q?=ED=95=84=EC=9A=94)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- package.json | 3 + src/common/filters/all-exceptions.filter.ts | 39 ++ src/main.ts | 12 +- src/modules/account/account.controller.ts | 30 +- src/modules/account/account.repo.ts | 17 +- src/modules/account/account.service.ts | 98 +++- ...e-response.dto.ts => base-response.dto.ts} | 2 +- .../check-duplication-response.dto.ts | 4 +- src/modules/account/dto/index.ts | 21 +- .../account/dto/login/login-response.dto.ts | 7 +- .../refresh-access-token-response.dto.ts | 4 +- .../reset-password-request.dto.ts | 9 + .../reset-password-response.dto.ts | 5 + ...end-email-verification-code-request.dto.ts | 6 + ...nd-email-verification-code-response.dto.ts | 4 + .../send-reset-password-code-request.dto.ts} | 2 +- .../send-reset-password-code-response.dto.ts | 4 + .../account/dto/signup/signup-response.dto.ts | 7 +- .../verifyCode/verify-code-response.dto.ts | 5 - ...fy-email-verification-code-request.dto.ts} | 2 +- ...fy-email-verification-code-response.dto.ts | 5 + .../verify-reset-password-code-request.dto.ts | 9 + ...verify-reset-password-code-response.dto.ts | 4 + src/util/generator.ts | 32 ++ yarn.lock | 444 +++++++++++++++++- 25 files changed, 729 insertions(+), 46 deletions(-) create mode 100644 src/common/filters/all-exceptions.filter.ts rename src/modules/account/dto/{sendVerification/send-verification-code-response.dto.ts => base-response.dto.ts} (55%) create mode 100644 src/modules/account/dto/resetPassword/reset-password-request.dto.ts create mode 100644 src/modules/account/dto/resetPassword/reset-password-response.dto.ts create mode 100644 src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-request.dto.ts create mode 100644 src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-response.dto.ts rename src/modules/account/dto/{sendVerification/send-verification-code-request.dto.ts => sendResetPasswordCode/send-reset-password-code-request.dto.ts} (63%) create mode 100644 src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-response.dto.ts delete mode 100644 src/modules/account/dto/verifyCode/verify-code-response.dto.ts rename src/modules/account/dto/{verifyCode/verify-code-request.dto.ts => verifyEmailVerificationCode/verify-email-verification-code-request.dto.ts} (70%) create mode 100644 src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-response.dto.ts create mode 100644 src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-request.dto.ts create mode 100644 src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-response.dto.ts diff --git a/package.json b/package.json index 4b2d83a..9be0082 100644 --- a/package.json +++ b/package.json @@ -31,10 +31,13 @@ "@nestjs/jwt": "^11.0.1", "@nestjs/passport": "^11.0.5", "@nestjs/platform-express": "^11.0.1", + "@nestjs/platform-fastify": "^11.1.9", "bcrypt": "^6.0.0", "dotenv": "^17.2.3", "drizzle-kit": "^0.31.7", "drizzle-orm": "^0.44.7", + "fastify": "^5.6.2", + "fastify-cors": "^6.1.0", "googleapis": "^166.0.0", "ioredis": "^5.8.2", "nodemailer": "^7.0.10", diff --git a/src/common/filters/all-exceptions.filter.ts b/src/common/filters/all-exceptions.filter.ts new file mode 100644 index 0000000..8397661 --- /dev/null +++ b/src/common/filters/all-exceptions.filter.ts @@ -0,0 +1,39 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus +} from '@nestjs/common'; +import { FastifyReply, FastifyRequest } from 'fastify'; + +@Catch() +export class AllExceptionsFilter implements ExceptionFilter { + catch(exception: unknown, host: ArgumentsHost) { + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + const request = ctx.getRequest(); + + let status = + exception instanceof HttpException + ? exception.getStatus() + : HttpStatus.INTERNAL_SERVER_ERROR; + + let message = + exception instanceof HttpException + ? exception.getResponse() + : 'Internal server error'; + + if (typeof message === 'object' && (message as any).message) { + message = (message as any).message; + } + + response.status(status).send({ + success: false, + timestamp: new Date().toISOString(), + path: request.url, + statusCode: status, + error: message + }); + } +} \ No newline at end of file diff --git a/src/main.ts b/src/main.ts index a4bf559..c0cfa21 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,8 +1,16 @@ import { NestFactory } from '@nestjs/core'; import { AppModule } from './app.module'; +import { + FastifyAdapter, + NestFastifyApplication +} from '@nestjs/platform-fastify'; +import { AllExceptionsFilter } from './common/filters/all-exceptions.filter'; async function bootstrap() { - const app = await NestFactory.create(AppModule); + const app = await NestFactory.create( + AppModule, + new FastifyAdapter() + ); app.enableCors({ origin: (origin, callback) => { // origin이 없는 경우(local file, curl 등) 허용 @@ -21,7 +29,7 @@ async function bootstrap() { }); app.enableShutdownHooks(); - + app.useGlobalFilters(new AllExceptionsFilter()); await app.listen(process.env.PORT ?? 3000, () => { process.env.NODE_ENV !== 'prod' && console.log(`servier is running on ${process.env.PORT}`) }); } diff --git a/src/modules/account/account.controller.ts b/src/modules/account/account.controller.ts index 12f616d..1805670 100644 --- a/src/modules/account/account.controller.ts +++ b/src/modules/account/account.controller.ts @@ -22,20 +22,40 @@ export class AccountController { } @Public() - @Post('send-verification-code') - async sendVerificationCode(@Body() body: DTO.SendVerificationCodeRequest): Promise { + @Post('send-email-verification-code') + async sendEmailVerificationCode(@Body() body: DTO.SendEmailVerificationCodeRequest): Promise { const result = await this.accountService.sendVerificationCode(body); return result; } @Public() - @Post('verify-code') - async verifyCode(@Body() body: DTO.VerifyCodeRequest): Promise { - console.log(body.email); + @Post('verify-email-verification-code') + async verifyCode(@Body() body: DTO.VerifyEmailVerificationCodeRequest): Promise { const result = await this.accountService.verifyCode(body); return result; } + @Public() + @Post('send-reset-password-code') + async sendResetPasswordCode(@Body() body: DTO.SendResetPasswordCodeRequest): Promise { + const result = await this.accountService.sendResetPasswordCode(body); + return result; + } + + @Public() + @Post('verify-reset-password-code') + async verifyResetPasswordCode(@Body() body: DTO.VerifyResetPasswordCodeRequest): Promise { + const result = await this.accountService.verifyResetPasswordCode(body); + return result; + } + + @Public() + @Post('reset-password') + async resetPassword(@Body() body: DTO.ResetPasswordRequest): Promise { + const result = await this.accountService.resetPassword(body); + return result; + } + @Public() @Post('signup') async signup(@Body() body: DTO.SignupRequest): Promise { diff --git a/src/modules/account/account.repo.ts b/src/modules/account/account.repo.ts index e8de7b9..0bcaaa1 100644 --- a/src/modules/account/account.repo.ts +++ b/src/modules/account/account.repo.ts @@ -7,7 +7,7 @@ import { NodePgDatabase } from "drizzle-orm/node-postgres"; export class AccountRepo { constructor(@Inject('DRIZZLE') private readonly db: NodePgDatabase) {} - async checkDuplication(type: 'email' | 'accountId', value: string) { + async checkIdExists(type: 'email' | 'accountId', value: string) { const result = await this .db .select({ count: countDistinct(schema.account[type])}) @@ -70,4 +70,19 @@ export class AccountRepo { ) ) } + + async updatePassword(type: 'email' | 'accountId', id: string, value: string) { + return await this + .db + .update(schema.account) + .set({ + password: value + }) + .where( + and( + eq(schema.account[type], id), + 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 9974d85..f8a8066 100644 --- a/src/modules/account/account.service.ts +++ b/src/modules/account/account.service.ts @@ -18,12 +18,12 @@ export class AccountService { async checkDuplication(data: DTO.CheckDuplicationRequest): Promise { const { type, value } = data; - const count = await this.accountRepo.checkDuplication(type, value); + const count = await this.accountRepo.checkIdExists(type, value); - return { isDuplicated: count > 0 }; + return { isDuplicated: count > 0, success: true }; } - async sendVerificationCode(data: DTO.SendVerificationCodeRequest): Promise { + async sendVerificationCode(data: DTO.SendEmailVerificationCodeRequest): Promise { const { email } = data; const code = Generator.getVerificationCode(); const html = `

Your verification code is: ${code}

`; @@ -38,20 +38,20 @@ export class AccountService { } } - async verifyCode(data: DTO.VerifyCodeRequest): Promise { + async verifyCode(data: DTO.VerifyEmailVerificationCodeRequest): Promise { const { email, code } = data; const storedCode = await this.redis.get(`verify:${email}`); if (!storedCode) { - return { verified: false, error: '잘못된 이메일이거나 코드가 만료되었습니다.'}; + return { verified: false, success: true, error: '잘못된 이메일이거나 코드가 만료되었습니다.'}; } if (storedCode !== code) { - return { verified: false, error: "잘못된 코드입니다." }; + return { verified: false, success: true, error: "잘못된 코드입니다." }; } await this.redis.del(`verify:${email}`); - return { verified: true, message: "이메일 인증이 완료되었습니다." }; + return { verified: true, success: true, message: "이메일 인증이 완료되었습니다." }; } async signup(data: DTO.SignupRequest): Promise { @@ -77,7 +77,7 @@ export class AccountService { const { type, id, password } = data; const queryResult = await this.accountRepo.login(type, id); const typeValue = type === 'email' ? '이메일' : '아이디'; - console.log(queryResult); + if (!queryResult || (queryResult.length < 1)) { return { success: false, @@ -114,7 +114,87 @@ export class AccountService { const { accessToken, refreshToken } = this.authService.refreshTokens(id); return { accessToken: accessToken, - refreshToken: refreshToken + refreshToken: refreshToken, + success: true + }; + } + + async sendResetPasswordCode(data: DTO.SendResetPasswordCodeRequest): Promise { + const { email } = data; + + const count = await this.accountRepo.checkIdExists('email', email); + + if (count === 0) { + return { + success: false, + error: "찾을 수 없는 사용자" + }; + } + + const code = Generator.getResetPasswordCode(); + + const html = + `

Your Password Reset Code is: ${code}

` + + `

Please Enter this code in 5 minutes.

`; + const result = await this.mailerService.sendMail(email, " 비밀번호 초기화 코드", html); + + if (result.rejected.length > 0) { + return { + success: false, + error: result.response + }; + } + + await this.redis.set(`resetPassword:${email}`, code, 'EX', 300); + + return { + success: true, + message: "비밀번호 초기화 코드 발송 완료" + }; + } + + async verifyResetPasswordCode(data: DTO.VerifyResetPasswordCodeRequest): Promise { + const { email, code } = data; + + const storedCode = await this.redis.get(`resetPassword:${email}`); + + if (!storedCode) { + return { + success: false, + message: "잘못된 이메일이거나 코드가 만료되었습니다." + }; + } + + if (storedCode !== code) { + return { + success: false, + message: "잘못된 코드입니다." + }; + } + + await this.redis.del(`resetPassword:${email}`); + + return { + success: true, + message: "비밀번호 초기화 코드 인증 완료" + }; + } + + async resetPassword(data: DTO.ResetPasswordRequest): Promise { + const { email, password } = data; + const hashedPassword = Converter.getHashedPassword(password); + const result = await this.accountRepo.updatePassword('email', email, hashedPassword); + + if (result.rows.length === 0) { + return { + success: false, + error: "비밀번호 초기화 실패" + }; + } + + return { + success: true, + message: "비밀번호 초기화 성공" }; } } \ No newline at end of file diff --git a/src/modules/account/dto/sendVerification/send-verification-code-response.dto.ts b/src/modules/account/dto/base-response.dto.ts similarity index 55% rename from src/modules/account/dto/sendVerification/send-verification-code-response.dto.ts rename to src/modules/account/dto/base-response.dto.ts index 04f8725..0596e94 100644 --- a/src/modules/account/dto/sendVerification/send-verification-code-response.dto.ts +++ b/src/modules/account/dto/base-response.dto.ts @@ -1,4 +1,4 @@ -export class SendVerificationCodeResponseDto { +export class BaseResponseDto { success: boolean; message?: string; error?: string; diff --git a/src/modules/account/dto/checkDuplication/check-duplication-response.dto.ts b/src/modules/account/dto/checkDuplication/check-duplication-response.dto.ts index 63085b3..188531c 100644 --- a/src/modules/account/dto/checkDuplication/check-duplication-response.dto.ts +++ b/src/modules/account/dto/checkDuplication/check-duplication-response.dto.ts @@ -1,3 +1,5 @@ -export class CheckDuplicationResponseDto { +import { BaseResponseDto } from "../base-response.dto"; + +export class CheckDuplicationResponseDto extends BaseResponseDto { isDuplicated: boolean; } \ No newline at end of file diff --git a/src/modules/account/dto/index.ts b/src/modules/account/dto/index.ts index 4793a71..8b09d0d 100644 --- a/src/modules/account/dto/index.ts +++ b/src/modules/account/dto/index.ts @@ -1,11 +1,13 @@ +import { ResetPasswordRequestDto } from './resetPassword/reset-password-request.dto'; + export { CheckDuplicationRequestDto as CheckDuplicationRequest } from './checkDuplication/check-duplication-request.dto'; export { CheckDuplicationResponseDto as CheckDuplicationResponse } from './checkDuplication/check-duplication-response.dto'; -export { SendVerificationCodeRequestDto as SendVerificationCodeRequest } from './sendVerification/send-verification-code-request.dto'; -export { SendVerificationCodeResponseDto as SendVerificationCodeResponse } from './sendVerification/send-verification-code-response.dto'; +export { SendEmailVerificationCodeRequestDto as SendEmailVerificationCodeRequest } from './sendEmailVerificationCode/send-email-verification-code-request.dto'; +export { SendEmailVerificationCodeResponseDto as SendEmailVerificationCodeResponse } from './sendEmailVerificationCode/send-email-verification-code-response.dto'; -export { VerifyCodeRequestDto as VerifyCodeRequest } from './verifyCode/verify-code-request.dto'; -export { VerifyCodeResponseDto as VerifyCodeResponse } from './verifyCode/verify-code-response.dto'; +export { VerifyEmailVerificationCodeRequestDto as VerifyEmailVerificationCodeRequest } from './verifyEmailVerificationCode/verify-email-verification-code-request.dto'; +export { VerifyEmailVerificationCodeResponseDto as VerifyEmailVerificationCodeResponse } from './verifyEmailVerificationCode/verify-email-verification-code-response.dto'; export { SignupRequestDto as SignupRequest } from './signup/signup-request.dto'; export { SignupResponseDto as SignupResponse } from './signup/signup-response.dto'; @@ -13,4 +15,13 @@ export { SignupResponseDto as SignupResponse } from './signup/signup-response.dt export { LoginRequestDto as LoginRequest } from './login/login-request.dto'; export { LoginResponseDto as LoginResponse } from './login/login-response.dto' -export { RefreshAccessTokenResponseDto as RefreshAccessTokenResponse } from './refreshAccessToken/refresh-access-token-response.dto'; \ No newline at end of file +export { RefreshAccessTokenResponseDto as RefreshAccessTokenResponse } from './refreshAccessToken/refresh-access-token-response.dto'; + +export { SendResetPasswordCodeRequestDto as SendResetPasswordCodeRequest } from './sendResetPasswordCode/send-reset-password-code-request.dto'; +export { SendResetPasswordCodeResponseDto as SendResetPasswordCodeResponse } from './sendResetPasswordCode/send-reset-password-code-response.dto'; + +export { VerifyResetPasswordCodeRequestDto as VerifyResetPasswordCodeRequest } from './verifyResetPasswordCode/verify-reset-password-code-request.dto'; +export { VerifyResetPasswordCodeResponseDto as VerifyResetPasswordCodeResponse } from './verifyResetPasswordCode/verify-reset-password-code-response.dto' + +export { ResetPasswordRequestDto as ResetPasswordRequest } from './resetPassword/reset-password-request.dto'; +export { ResetPasswordResponseDto as ResetPasswordResponse } from './resetPassword/reset-password-response.dto'; \ No newline at end of file diff --git a/src/modules/account/dto/login/login-response.dto.ts b/src/modules/account/dto/login/login-response.dto.ts index f6c909f..05892cb 100644 --- a/src/modules/account/dto/login/login-response.dto.ts +++ b/src/modules/account/dto/login/login-response.dto.ts @@ -1,7 +1,6 @@ -export class LoginResponseDto { - success: boolean; +import { BaseResponseDto } from "../base-response.dto"; + +export class LoginResponseDto extends BaseResponseDto { accessToken?: string; refreshToken?: string; - message?: string; - error?: string; } \ No newline at end of file diff --git a/src/modules/account/dto/refreshAccessToken/refresh-access-token-response.dto.ts b/src/modules/account/dto/refreshAccessToken/refresh-access-token-response.dto.ts index 4a8fc33..dd4b08f 100644 --- a/src/modules/account/dto/refreshAccessToken/refresh-access-token-response.dto.ts +++ b/src/modules/account/dto/refreshAccessToken/refresh-access-token-response.dto.ts @@ -1,4 +1,6 @@ -export class RefreshAccessTokenResponseDto { +import { BaseResponseDto } from "../base-response.dto"; + +export class RefreshAccessTokenResponseDto extends BaseResponseDto{ accessToken: string; refreshToken: string; } \ No newline at end of file diff --git a/src/modules/account/dto/resetPassword/reset-password-request.dto.ts b/src/modules/account/dto/resetPassword/reset-password-request.dto.ts new file mode 100644 index 0000000..30bfb49 --- /dev/null +++ b/src/modules/account/dto/resetPassword/reset-password-request.dto.ts @@ -0,0 +1,9 @@ +import { IsEmail, IsString } from "@nestjs/class-validator"; + +export class ResetPasswordRequestDto { + @IsEmail() + email: string; + + @IsString() + password: string; +} \ No newline at end of file diff --git a/src/modules/account/dto/resetPassword/reset-password-response.dto.ts b/src/modules/account/dto/resetPassword/reset-password-response.dto.ts new file mode 100644 index 0000000..cec874f --- /dev/null +++ b/src/modules/account/dto/resetPassword/reset-password-response.dto.ts @@ -0,0 +1,5 @@ +import { BaseResponseDto } from "../base-response.dto"; + +export class ResetPasswordResponseDto extends BaseResponseDto { + +} \ No newline at end of file diff --git a/src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-request.dto.ts b/src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-request.dto.ts new file mode 100644 index 0000000..550bbe1 --- /dev/null +++ b/src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-request.dto.ts @@ -0,0 +1,6 @@ +import { IsEmail } from "@nestjs/class-validator"; + +export class SendEmailVerificationCodeRequestDto { + @IsEmail() + email: string; +} \ No newline at end of file diff --git a/src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-response.dto.ts b/src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-response.dto.ts new file mode 100644 index 0000000..ac53990 --- /dev/null +++ b/src/modules/account/dto/sendEmailVerificationCode/send-email-verification-code-response.dto.ts @@ -0,0 +1,4 @@ +import { BaseResponseDto } from "../base-response.dto"; + +export class SendEmailVerificationCodeResponseDto extends BaseResponseDto{ +} \ No newline at end of file diff --git a/src/modules/account/dto/sendVerification/send-verification-code-request.dto.ts b/src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-request.dto.ts similarity index 63% rename from src/modules/account/dto/sendVerification/send-verification-code-request.dto.ts rename to src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-request.dto.ts index d924521..6194f8a 100644 --- a/src/modules/account/dto/sendVerification/send-verification-code-request.dto.ts +++ b/src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-request.dto.ts @@ -1,6 +1,6 @@ import { IsEmail } from "@nestjs/class-validator"; -export class SendVerificationCodeRequestDto { +export class SendResetPasswordCodeRequestDto { @IsEmail() email: string; } \ No newline at end of file diff --git a/src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-response.dto.ts b/src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-response.dto.ts new file mode 100644 index 0000000..c883b72 --- /dev/null +++ b/src/modules/account/dto/sendResetPasswordCode/send-reset-password-code-response.dto.ts @@ -0,0 +1,4 @@ +import { BaseResponseDto } from "../base-response.dto"; + +export class SendResetPasswordCodeResponseDto extends BaseResponseDto { +} \ No newline at end of file diff --git a/src/modules/account/dto/signup/signup-response.dto.ts b/src/modules/account/dto/signup/signup-response.dto.ts index de2948d..60fe8d3 100644 --- a/src/modules/account/dto/signup/signup-response.dto.ts +++ b/src/modules/account/dto/signup/signup-response.dto.ts @@ -1,5 +1,4 @@ -export class SignupResponseDto { - success: boolean; - message?: string; - error?: string; +import { BaseResponseDto } from "../base-response.dto"; + +export class SignupResponseDto extends BaseResponseDto { } \ 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 deleted file mode 100644 index 739bae7..0000000 --- a/src/modules/account/dto/verifyCode/verify-code-response.dto.ts +++ /dev/null @@ -1,5 +0,0 @@ -export class VerifyCodeResponseDto { - verified: boolean; - message?: string; - error?: string; -} \ No newline at end of file diff --git a/src/modules/account/dto/verifyCode/verify-code-request.dto.ts b/src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-request.dto.ts similarity index 70% rename from src/modules/account/dto/verifyCode/verify-code-request.dto.ts rename to src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-request.dto.ts index 09f6f17..ec26b3a 100644 --- a/src/modules/account/dto/verifyCode/verify-code-request.dto.ts +++ b/src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-request.dto.ts @@ -1,6 +1,6 @@ import { IsEmail, IsString } from "@nestjs/class-validator"; -export class VerifyCodeRequestDto { +export class VerifyEmailVerificationCodeRequestDto { @IsEmail() email: string; diff --git a/src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-response.dto.ts b/src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-response.dto.ts new file mode 100644 index 0000000..174ec1f --- /dev/null +++ b/src/modules/account/dto/verifyEmailVerificationCode/verify-email-verification-code-response.dto.ts @@ -0,0 +1,5 @@ +import { BaseResponseDto } from "../base-response.dto"; + +export class VerifyEmailVerificationCodeResponseDto extends BaseResponseDto{ + verified: boolean; +} \ No newline at end of file diff --git a/src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-request.dto.ts b/src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-request.dto.ts new file mode 100644 index 0000000..ca53262 --- /dev/null +++ b/src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-request.dto.ts @@ -0,0 +1,9 @@ +import { IsEmail, IsString } from "@nestjs/class-validator" + +export class VerifyResetPasswordCodeRequestDto { + @IsEmail() + email: string; + + @IsString() + code: string; +} \ No newline at end of file diff --git a/src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-response.dto.ts b/src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-response.dto.ts new file mode 100644 index 0000000..a6f62e5 --- /dev/null +++ b/src/modules/account/dto/verifyResetPasswordCode/verify-reset-password-code-response.dto.ts @@ -0,0 +1,4 @@ +import { BaseResponseDto } from "../base-response.dto"; + +export class VerifyResetPasswordCodeResponseDto extends BaseResponseDto { +} \ No newline at end of file diff --git a/src/util/generator.ts b/src/util/generator.ts index 1547cfa..fd5c7dd 100644 --- a/src/util/generator.ts +++ b/src/util/generator.ts @@ -2,4 +2,36 @@ export class Generator { static getVerificationCode() { return Math.random().toString().slice(2, 8); } + + private static getRandomCharacter(string: string) { + return string[Math.floor(Math.random() * string.length)]; + } + + private static getShuffledString(string: string) { + let arr = string.split(''); + + for (let i = arr.length - 1; i > 0; i--) { + const j = Math.floor(Math.random() * (i + 1)); + [arr[i], arr[j]] = [arr[j], arr[i]]; + } + + return arr.join(''); + } + + static getResetPasswordCode() { + const alphabets = 'abcdefghijklmnopqrstuvwxyz'; + const numbers = '0123456789'; + const specials = '!@#$%^'; + const all = alphabets + numbers + specials; + + let resetPasswordCode = Generator.getRandomCharacter(alphabets); + let requiredNumber = Generator.getRandomCharacter(numbers); + let requiredSpecial = Generator.getRandomCharacter(specials); + + let shuffledRestPart = Generator.getShuffledString(all).slice(0, 5); + + let shuffledRestCode = Generator.getShuffledString(requiredNumber + requiredSpecial + shuffledRestPart); + + return resetPasswordCode + shuffledRestCode; + } } \ No newline at end of file diff --git a/yarn.lock b/yarn.lock index ad4f98b..5d56117 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1515,6 +1515,91 @@ __metadata: languageName: node linkType: hard +"@fastify/ajv-compiler@npm:^4.0.0": + version: 4.0.5 + resolution: "@fastify/ajv-compiler@npm:4.0.5" + dependencies: + ajv: "npm:^8.12.0" + ajv-formats: "npm:^3.0.1" + fast-uri: "npm:^3.0.0" + checksum: 10c0/b701602c5fad35d1327a6ebda530ca5ba2c7728223cd214b2b24af7cb2522c864b6cbbe77335ddd6a55d03f76899fb009386da783121b7ece136feb7ea937e13 + languageName: node + linkType: hard + +"@fastify/cors@npm:11.1.0": + version: 11.1.0 + resolution: "@fastify/cors@npm:11.1.0" + dependencies: + fastify-plugin: "npm:^5.0.0" + toad-cache: "npm:^3.7.0" + checksum: 10c0/3e6051c94a6e35fc7029ab9b31f3baed3e370072605a18a53d7d2e28975a74480d522f049b3f23229881ea483b4146ffe3cd3e90894c9c12ae09eaba6250dfc6 + languageName: node + linkType: hard + +"@fastify/error@npm:^4.0.0": + version: 4.2.0 + resolution: "@fastify/error@npm:4.2.0" + checksum: 10c0/8bdafe95b368a71dfc5644ef22e0a2412dfbb2f300cf4658fdbd9035c96d7c034c53fd7d38e1150437d9cf7a2d75e6bd05e458cf9ba5f2e47e527df8a5e0bd4e + languageName: node + linkType: hard + +"@fastify/fast-json-stringify-compiler@npm:^5.0.0": + version: 5.0.3 + resolution: "@fastify/fast-json-stringify-compiler@npm:5.0.3" + dependencies: + fast-json-stringify: "npm:^6.0.0" + checksum: 10c0/1f0e33c973fc228de44d997a8a1a43e883a580a8c971773bb9cb2375b0114694f81b47c52ac7e788eb6372d1f3dfc10be3176bad354a80d502d8b26a93dbc6c9 + languageName: node + linkType: hard + +"@fastify/formbody@npm:8.0.2": + version: 8.0.2 + resolution: "@fastify/formbody@npm:8.0.2" + dependencies: + fast-querystring: "npm:^1.1.2" + fastify-plugin: "npm:^5.0.0" + checksum: 10c0/7eba1a9751d9b1f790a4a9740273521b226d361d00996165d273727233441e802694d6841af01bf2dce006521d1b8303064bf16129dd86f7c6842bee65e194d5 + languageName: node + linkType: hard + +"@fastify/forwarded@npm:^3.0.0": + version: 3.0.1 + resolution: "@fastify/forwarded@npm:3.0.1" + checksum: 10c0/fad9f7fb7ff4bf2f8ba782f79d46de190469817ed1bd55dc789927c381a38e63b53ab8c127d9444d703a449c5393529533bea365a25f6eb85a5ecbc78460be2a + languageName: node + linkType: hard + +"@fastify/merge-json-schemas@npm:^0.2.0": + version: 0.2.1 + resolution: "@fastify/merge-json-schemas@npm:0.2.1" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/dfa884a8f62d53f71de273fdcd0e501b213367767a7d8c522ae87ba6fb571b3eea85175d6e019036d7c0c5419be60305abe54899b9459f76ed5333358699efcb + languageName: node + linkType: hard + +"@fastify/middie@npm:9.0.3": + version: 9.0.3 + resolution: "@fastify/middie@npm:9.0.3" + dependencies: + "@fastify/error": "npm:^4.0.0" + fastify-plugin: "npm:^5.0.0" + path-to-regexp: "npm:^8.1.0" + reusify: "npm:^1.0.4" + checksum: 10c0/ddcdb6ce921b819ec17c9cdf35f377d7e9db458c4c18de8283a2f4096d0e317991db697976a2df0dd3609a53bbc2fff0108b1a45eb08856f550e4a7643532915 + languageName: node + linkType: hard + +"@fastify/proxy-addr@npm:^5.0.0": + version: 5.1.0 + resolution: "@fastify/proxy-addr@npm:5.1.0" + dependencies: + "@fastify/forwarded": "npm:^3.0.0" + ipaddr.js: "npm:^2.1.0" + checksum: 10c0/d9167e848086cb66a0ae8b008eb6a79e9ae0e17c3e8697a3a22b23152376e22843bea6642a2c07eba5460faa786ebda6157dfa6537ac7b733f758428cd51988b + languageName: node + linkType: hard + "@humanfs/core@npm:^0.19.1": version: 0.19.1 resolution: "@humanfs/core@npm:0.19.1" @@ -2386,6 +2471,32 @@ __metadata: languageName: node linkType: hard +"@nestjs/platform-fastify@npm:^11.1.9": + version: 11.1.9 + resolution: "@nestjs/platform-fastify@npm:11.1.9" + dependencies: + "@fastify/cors": "npm:11.1.0" + "@fastify/formbody": "npm:8.0.2" + "@fastify/middie": "npm:9.0.3" + fast-querystring: "npm:1.1.2" + fastify: "npm:5.6.2" + light-my-request: "npm:6.6.0" + path-to-regexp: "npm:8.3.0" + tslib: "npm:2.8.1" + peerDependencies: + "@fastify/static": ^8.0.0 + "@fastify/view": ^10.0.0 || ^11.0.0 + "@nestjs/common": ^11.0.0 + "@nestjs/core": ^11.0.0 + peerDependenciesMeta: + "@fastify/static": + optional: true + "@fastify/view": + optional: true + checksum: 10c0/18ab1922d41d9b7ec5a23d229448ac31f57dfb2806c37b0553bd1e2c37ee063f2d60c6df6cf93db1345c32994f328fb441befb89ad43514d5e2b7568ad8ee436 + languageName: node + linkType: hard + "@nestjs/schematics@npm:^11.0.0, @nestjs/schematics@npm:^11.0.1": version: 11.0.9 resolution: "@nestjs/schematics@npm:11.0.9" @@ -2496,6 +2607,13 @@ __metadata: languageName: node linkType: hard +"@pinojs/redact@npm:^0.4.0": + version: 0.4.0 + resolution: "@pinojs/redact@npm:0.4.0" + checksum: 10c0/4b311ba17ee0cf154ff9c39eb063ec04cd0d0017cb3750efcdf06c2d485df3e1095e13e872175993568c5568c23e4508dd877c981bbc9c5ae5e384d569efcdff + languageName: node + linkType: hard + "@pkgjs/parseargs@npm:^0.11.0": version: 0.11.0 resolution: "@pkgjs/parseargs@npm:0.11.0" @@ -3911,6 +4029,13 @@ __metadata: languageName: node linkType: hard +"abstract-logging@npm:^2.0.1": + version: 2.0.1 + resolution: "abstract-logging@npm:2.0.1" + checksum: 10c0/304879d9babcf6772260e5ddde632e6428e1f42f7a7a116d4689e97ad813a20e0ec2dd1e0a122f3617557f40091b9ca85735de4b48c17a2041268cb47b3f8ef1 + languageName: node + linkType: hard + "accepts@npm:^2.0.0": version: 2.0.0 resolution: "accepts@npm:2.0.0" @@ -3964,7 +4089,7 @@ __metadata: languageName: node linkType: hard -"ajv-formats@npm:3.0.1": +"ajv-formats@npm:3.0.1, ajv-formats@npm:^3.0.1": version: 3.0.1 resolution: "ajv-formats@npm:3.0.1" dependencies: @@ -4012,7 +4137,7 @@ __metadata: languageName: node linkType: hard -"ajv@npm:8.17.1, ajv@npm:^8.0.0, ajv@npm:^8.9.0": +"ajv@npm:8.17.1, ajv@npm:^8.0.0, ajv@npm:^8.12.0, ajv@npm:^8.9.0": version: 8.17.1 resolution: "ajv@npm:8.17.1" dependencies: @@ -4171,6 +4296,23 @@ __metadata: languageName: node linkType: hard +"atomic-sleep@npm:^1.0.0": + version: 1.0.0 + resolution: "atomic-sleep@npm:1.0.0" + checksum: 10c0/e329a6665512736a9bbb073e1761b4ec102f7926cce35037753146a9db9c8104f5044c1662e4a863576ce544fb8be27cd2be6bc8c1a40147d03f31eb1cfb6e8a + languageName: node + linkType: hard + +"avvio@npm:^9.0.0": + version: 9.1.0 + resolution: "avvio@npm:9.1.0" + dependencies: + "@fastify/error": "npm:^4.0.0" + fastq: "npm:^1.17.1" + checksum: 10c0/bdc294a7e8f38e1e21f9d338d97d7240025db54f1005fc419cfe0499a35edf2276ab1fe91135739faa3a9437358ec6912d5a56f23361b061880333cb4f1c7884 + languageName: node + linkType: hard + "babel-jest@npm:30.2.0": version: 30.2.0 resolution: "babel-jest@npm:30.2.0" @@ -4262,6 +4404,7 @@ __metadata: "@nestjs/jwt": "npm:^11.0.1" "@nestjs/passport": "npm:^11.0.5" "@nestjs/platform-express": "npm:^11.0.1" + "@nestjs/platform-fastify": "npm:^11.1.9" "@nestjs/schematics": "npm:^11.0.0" "@nestjs/testing": "npm:^11.0.1" "@types/bcrypt": "npm:^6" @@ -4282,6 +4425,8 @@ __metadata: eslint: "npm:^9.18.0" eslint-config-prettier: "npm:^10.0.1" eslint-plugin-prettier: "npm:^5.2.2" + fastify: "npm:^5.6.2" + fastify-cors: "npm:^6.1.0" globals: "npm:^16.0.0" googleapis: "npm:^166.0.0" ioredis: "npm:^5.8.2" @@ -4802,6 +4947,13 @@ __metadata: languageName: node linkType: hard +"cookie@npm:^1.0.1": + version: 1.1.1 + resolution: "cookie@npm:1.1.1" + checksum: 10c0/79c4ddc0fcad9c4f045f826f42edf54bcc921a29586a4558b0898277fa89fb47be95bc384c2253f493af7b29500c830da28341274527328f18eba9f58afa112c + languageName: node + linkType: hard + "cookiejar@npm:^2.1.4": version: 2.1.4 resolution: "cookiejar@npm:2.1.4" @@ -4949,6 +5101,13 @@ __metadata: languageName: node linkType: hard +"dequal@npm:^2.0.3": + version: 2.0.3 + resolution: "dequal@npm:2.0.3" + checksum: 10c0/f98860cdf58b64991ae10205137c0e97d384c3a4edc7f807603887b7c4b850af1224a33d88012009f150861cbee4fa2d322c4cc04b9313bee312e47f6ecaa888 + languageName: node + linkType: hard + "detect-newline@npm:^3.1.0": version: 3.1.0 resolution: "detect-newline@npm:3.1.0" @@ -5745,6 +5904,13 @@ __metadata: languageName: node linkType: hard +"fast-decode-uri-component@npm:^1.0.1": + version: 1.0.1 + resolution: "fast-decode-uri-component@npm:1.0.1" + checksum: 10c0/039d50c2e99d64f999c3f2126c23fbf75a04a4117e218a149ca0b1d2aeb8c834b7b19d643b9d35d4eabce357189a6a94085f78cf48869e6e26cc59b036284bc3 + languageName: node + linkType: hard + "fast-deep-equal@npm:^3.1.1, fast-deep-equal@npm:^3.1.3": version: 3.1.3 resolution: "fast-deep-equal@npm:3.1.3" @@ -5779,6 +5945,20 @@ __metadata: languageName: node linkType: hard +"fast-json-stringify@npm:^6.0.0": + version: 6.1.1 + resolution: "fast-json-stringify@npm:6.1.1" + dependencies: + "@fastify/merge-json-schemas": "npm:^0.2.0" + ajv: "npm:^8.12.0" + ajv-formats: "npm:^3.0.1" + fast-uri: "npm:^3.0.0" + json-schema-ref-resolver: "npm:^3.0.0" + rfdc: "npm:^1.2.0" + checksum: 10c0/15bf8e1e183c1631687d40907e4330b1ae764f790fbdeedf1f2b5d75fece457a445a1a99c0ea8e8113612928e4dae32bfccd7a7a7da57555d6be893471478a7a + languageName: node + linkType: hard + "fast-levenshtein@npm:^2.0.6": version: 2.0.6 resolution: "fast-levenshtein@npm:2.0.6" @@ -5786,6 +5966,15 @@ __metadata: languageName: node linkType: hard +"fast-querystring@npm:1.1.2, fast-querystring@npm:^1.0.0, fast-querystring@npm:^1.1.2": + version: 1.1.2 + resolution: "fast-querystring@npm:1.1.2" + dependencies: + fast-decode-uri-component: "npm:^1.0.1" + checksum: 10c0/e8223273a9b199722f760f5a047a77ad049a14bd444b821502cb8218f5925e3a5fffb56b64389bca73ab2ac6f1aa7aebbe4e203e5f6e53ff5978de97c0fde4e3 + languageName: node + linkType: hard + "fast-safe-stringify@npm:2.1.1, fast-safe-stringify@npm:^2.1.1": version: 2.1.1 resolution: "fast-safe-stringify@npm:2.1.1" @@ -5793,7 +5982,7 @@ __metadata: languageName: node linkType: hard -"fast-uri@npm:^3.0.1": +"fast-uri@npm:^3.0.0, fast-uri@npm:^3.0.1": version: 3.1.0 resolution: "fast-uri@npm:3.1.0" checksum: 10c0/44364adca566f70f40d1e9b772c923138d47efeac2ae9732a872baafd77061f26b097ba2f68f0892885ad177becd065520412b8ffeec34b16c99433c5b9e2de7 @@ -5811,7 +6000,64 @@ __metadata: languageName: node linkType: hard -"fastq@npm:^1.6.0": +"fastify-cors-deprecated@npm:fastify-cors@6.0.3": + version: 6.0.3 + resolution: "fastify-cors@npm:6.0.3" + dependencies: + fastify-plugin: "npm:^3.0.0" + vary: "npm:^1.1.2" + checksum: 10c0/aa35840f2372cda41172bd8b83a054df2fbf47b0a50ea0a7deb5b48b8ee412b4d0b142839765da670b1bff45b65fb05ab5700c19545d81c08c9881ef58a1ddcc + languageName: node + linkType: hard + +"fastify-cors@npm:^6.1.0": + version: 6.1.0 + resolution: "fastify-cors@npm:6.1.0" + dependencies: + fastify-cors-deprecated: "npm:fastify-cors@6.0.3" + process-warning: "npm:^1.0.0" + checksum: 10c0/003e6bf528a36d49fbab4af455fd008164ec9fafaa951622337892c3c9f27374fd7b2363710a3bd2d4a32ff8780b4851da0578075ba00a8da03ec025a32ab1fb + languageName: node + linkType: hard + +"fastify-plugin@npm:^3.0.0": + version: 3.0.1 + resolution: "fastify-plugin@npm:3.0.1" + checksum: 10c0/045a107d2e1962d0967ec21e4417fb31e4f49059cf45d28a612025bdc841092fc897d4ab29eded5a977ad8fdd602c0b30c1a08ae5508f8bff97ece4a30d96032 + languageName: node + linkType: hard + +"fastify-plugin@npm:^5.0.0": + version: 5.1.0 + resolution: "fastify-plugin@npm:5.1.0" + checksum: 10c0/61b330b8cb03a3581b796d745137499a782934abcf65dbf9a41d07248520cfd220b3ae8b16afeaf81af712e68e1ac24352895132cfeb2b372c66662c0170f365 + languageName: node + linkType: hard + +"fastify@npm:5.6.2, fastify@npm:^5.6.2": + version: 5.6.2 + resolution: "fastify@npm:5.6.2" + dependencies: + "@fastify/ajv-compiler": "npm:^4.0.0" + "@fastify/error": "npm:^4.0.0" + "@fastify/fast-json-stringify-compiler": "npm:^5.0.0" + "@fastify/proxy-addr": "npm:^5.0.0" + abstract-logging: "npm:^2.0.1" + avvio: "npm:^9.0.0" + fast-json-stringify: "npm:^6.0.0" + find-my-way: "npm:^9.0.0" + light-my-request: "npm:^6.0.0" + pino: "npm:^10.1.0" + process-warning: "npm:^5.0.0" + rfdc: "npm:^1.3.1" + secure-json-parse: "npm:^4.0.0" + semver: "npm:^7.6.0" + toad-cache: "npm:^3.7.0" + checksum: 10c0/a3c31316ba5db03eb14a5dc46571fe0f888d0f4569befb8a0aedebc7b24fbd6139e7b16f2bf0dad793345ad66cd5952bdffe182ee2ab0d4e4cb5f331f74a7781 + languageName: node + linkType: hard + +"fastq@npm:^1.17.1, fastq@npm:^1.6.0": version: 1.19.1 resolution: "fastq@npm:1.19.1" dependencies: @@ -5902,6 +6148,17 @@ __metadata: languageName: node linkType: hard +"find-my-way@npm:^9.0.0": + version: 9.3.0 + resolution: "find-my-way@npm:9.3.0" + dependencies: + fast-deep-equal: "npm:^3.1.3" + fast-querystring: "npm:^1.0.0" + safe-regex2: "npm:^5.0.0" + checksum: 10c0/f221bc0c70b2c2a6f9282fd3e0ac1911fcbb68ac718da043ddcefdec3b9d884a54d6ef1bf92e1b2ff83400e50f3c22141206a8ea3308bf0e9e37fd177843425d + languageName: node + linkType: hard + "find-up@npm:^4.0.0, find-up@npm:^4.1.0": version: 4.1.0 resolution: "find-up@npm:4.1.0" @@ -6587,6 +6844,13 @@ __metadata: languageName: node linkType: hard +"ipaddr.js@npm:^2.1.0": + version: 2.3.0 + resolution: "ipaddr.js@npm:2.3.0" + checksum: 10c0/084bab99e2f6875d7a62adc3325e1c64b038a12c9521e35fb967b5e263a8b3afb1b8884dd77c276092331f5d63298b767491e10997ef147c62da01b143780bbd + languageName: node + linkType: hard + "is-arrayish@npm:^0.2.1": version: 0.2.1 resolution: "is-arrayish@npm:0.2.1" @@ -7265,6 +7529,15 @@ __metadata: languageName: node linkType: hard +"json-schema-ref-resolver@npm:^3.0.0": + version: 3.0.0 + resolution: "json-schema-ref-resolver@npm:3.0.0" + dependencies: + dequal: "npm:^2.0.3" + checksum: 10c0/0b6f4b66951ac0f6864949c08317cf0b7f7ae94e8da0b94e40df3561dc1a0b77a69b669d60aa1511b06aa18469203886eb2e89fd6bb3dcf0be46c329d69b0115 + languageName: node + linkType: hard + "json-schema-traverse@npm:^0.4.1": version: 0.4.1 resolution: "json-schema-traverse@npm:0.4.1" @@ -7408,6 +7681,17 @@ __metadata: languageName: node linkType: hard +"light-my-request@npm:6.6.0, light-my-request@npm:^6.0.0": + version: 6.6.0 + resolution: "light-my-request@npm:6.6.0" + dependencies: + cookie: "npm:^1.0.1" + process-warning: "npm:^4.0.0" + set-cookie-parser: "npm:^2.6.0" + checksum: 10c0/1440853cd3822ab83fbb1be4456099082dec8e9e3a4ea35c9d8d7d17a7ab98c83ad0a4c39a73a8c2b31b9ca70c57506e5b7a929495c149463ca0daca0d90dc6f + languageName: node + linkType: hard + "lines-and-columns@npm:^1.1.6": version: 1.2.4 resolution: "lines-and-columns@npm:1.2.4" @@ -8049,6 +8333,13 @@ __metadata: languageName: node linkType: hard +"on-exit-leak-free@npm:^2.1.0": + version: 2.1.2 + resolution: "on-exit-leak-free@npm:2.1.2" + checksum: 10c0/faea2e1c9d696ecee919026c32be8d6a633a7ac1240b3b87e944a380e8a11dc9c95c4a1f8fb0568de7ab8db3823e790f12bda45296b1d111e341aad3922a0570 + languageName: node + linkType: hard + "on-finished@npm:^2.4.1": version: 2.4.1 resolution: "on-finished@npm:2.4.1" @@ -8261,7 +8552,7 @@ __metadata: languageName: node linkType: hard -"path-to-regexp@npm:8.3.0, path-to-regexp@npm:^8.0.0": +"path-to-regexp@npm:8.3.0, path-to-regexp@npm:^8.0.0, path-to-regexp@npm:^8.1.0": version: 8.3.0 resolution: "path-to-regexp@npm:8.3.0" checksum: 10c0/ee1544a73a3f294a97a4c663b0ce71bbf1621d732d80c9c9ed201b3e911a86cb628ebad691b9d40f40a3742fe22011e5a059d8eed2cf63ec2cb94f6fb4efe67c @@ -8391,6 +8682,43 @@ __metadata: languageName: node linkType: hard +"pino-abstract-transport@npm:^2.0.0": + version: 2.0.0 + resolution: "pino-abstract-transport@npm:2.0.0" + dependencies: + split2: "npm:^4.0.0" + checksum: 10c0/02c05b8f2ffce0d7c774c8e588f61e8b77de8ccb5f8125afd4a7325c9ea0e6af7fb78168999657712ae843e4462bb70ac550dfd6284f930ee57f17f486f25a9f + languageName: node + linkType: hard + +"pino-std-serializers@npm:^7.0.0": + version: 7.0.0 + resolution: "pino-std-serializers@npm:7.0.0" + checksum: 10c0/73e694d542e8de94445a03a98396cf383306de41fd75ecc07085d57ed7a57896198508a0dec6eefad8d701044af21eb27253ccc352586a03cf0d4a0bd25b4133 + languageName: node + linkType: hard + +"pino@npm:^10.1.0": + version: 10.1.0 + resolution: "pino@npm:10.1.0" + dependencies: + "@pinojs/redact": "npm:^0.4.0" + atomic-sleep: "npm:^1.0.0" + on-exit-leak-free: "npm:^2.1.0" + pino-abstract-transport: "npm:^2.0.0" + pino-std-serializers: "npm:^7.0.0" + process-warning: "npm:^5.0.0" + quick-format-unescaped: "npm:^4.0.3" + real-require: "npm:^0.2.0" + safe-stable-stringify: "npm:^2.3.1" + sonic-boom: "npm:^4.0.1" + thread-stream: "npm:^3.0.0" + bin: + pino: bin.js + checksum: 10c0/49c1dd80d5f99f02bde1acf2f60cef7686948a937f751f6cb368c2868c7e82e54aeabac63a34587e16019965cbf0eb6e609edf92c439a98a0a4fcb0add277eaf + languageName: node + linkType: hard + "pirates@npm:^4.0.7": version: 4.0.7 resolution: "pirates@npm:4.0.7" @@ -8487,6 +8815,27 @@ __metadata: languageName: node linkType: hard +"process-warning@npm:^1.0.0": + version: 1.0.0 + resolution: "process-warning@npm:1.0.0" + checksum: 10c0/43ec4229d64eb5c58340c8aacade49eb5f6fd513eae54140abf365929ca20987f0a35c5868125e2b583cad4de8cd257beb5667d9cc539d9190a7a4c3014adf22 + languageName: node + linkType: hard + +"process-warning@npm:^4.0.0": + version: 4.0.1 + resolution: "process-warning@npm:4.0.1" + checksum: 10c0/577a268b9fd5c3d9f6dbb4348220099391d830905642845d591e7ee8b1e45043d98b7b9826a3c1379bdd1686cdfe0f6cf349cb812affc5853b662e6a9896579e + languageName: node + linkType: hard + +"process-warning@npm:^5.0.0": + version: 5.0.0 + resolution: "process-warning@npm:5.0.0" + checksum: 10c0/941f48863d368ec161e0b5890ba0c6af94170078f3d6b5e915c19b36fb59edb0dc2f8e834d25e0d375a8bf368a49d490f080508842168832b93489d17843ec29 + languageName: node + linkType: hard + "promise-retry@npm:^2.0.1": version: 2.0.1 resolution: "promise-retry@npm:2.0.1" @@ -8537,6 +8886,13 @@ __metadata: languageName: node linkType: hard +"quick-format-unescaped@npm:^4.0.3": + version: 4.0.4 + resolution: "quick-format-unescaped@npm:4.0.4" + checksum: 10c0/fe5acc6f775b172ca5b4373df26f7e4fd347975578199e7d74b2ae4077f0af05baa27d231de1e80e8f72d88275ccc6028568a7a8c9ee5e7368ace0e18eff93a4 + languageName: node + linkType: hard + "randombytes@npm:^2.1.0": version: 2.1.0 resolution: "randombytes@npm:2.1.0" @@ -8590,6 +8946,13 @@ __metadata: languageName: node linkType: hard +"real-require@npm:^0.2.0": + version: 0.2.0 + resolution: "real-require@npm:0.2.0" + checksum: 10c0/23eea5623642f0477412ef8b91acd3969015a1501ed34992ada0e3af521d3c865bb2fe4cdbfec5fe4b505f6d1ef6a03e5c3652520837a8c3b53decff7e74b6a0 + languageName: node + linkType: hard + "redis-errors@npm:^1.0.0, redis-errors@npm:^1.2.0": version: 1.2.0 resolution: "redis-errors@npm:1.2.0" @@ -8667,6 +9030,13 @@ __metadata: languageName: node linkType: hard +"ret@npm:~0.5.0": + version: 0.5.0 + resolution: "ret@npm:0.5.0" + checksum: 10c0/220868b194f87bf1998e32e409086eec6b39e860c052bf267f8ad4d0131706a9773d45fd3f91acfb1a7c928fce002b694ab86fdba90bc8d4b8df68fa8645c5cc + languageName: node + linkType: hard + "retry@npm:^0.12.0": version: 0.12.0 resolution: "retry@npm:0.12.0" @@ -8681,6 +9051,13 @@ __metadata: languageName: node linkType: hard +"rfdc@npm:^1.2.0, rfdc@npm:^1.3.1": + version: 1.4.1 + resolution: "rfdc@npm:1.4.1" + checksum: 10c0/4614e4292356cafade0b6031527eea9bc90f2372a22c012313be1dcc69a3b90c7338158b414539be863fa95bfcb2ddcd0587be696841af4e6679d85e62c060c7 + languageName: node + linkType: hard + "rimraf@npm:^5.0.1": version: 5.0.10 resolution: "rimraf@npm:5.0.10" @@ -8739,6 +9116,22 @@ __metadata: languageName: node linkType: hard +"safe-regex2@npm:^5.0.0": + version: 5.0.0 + resolution: "safe-regex2@npm:5.0.0" + dependencies: + ret: "npm:~0.5.0" + checksum: 10c0/83d5b1b60a5a97cb71a6e615518ec4a47761b3600aba389089be59a417498185250db2368080afc2f5e91237d68809c6c634b97a2e1cc8bd56a4c7eef2eeb6cf + languageName: node + linkType: hard + +"safe-stable-stringify@npm:^2.3.1": + version: 2.5.0 + resolution: "safe-stable-stringify@npm:2.5.0" + checksum: 10c0/baea14971858cadd65df23894a40588ed791769db21bafb7fd7608397dbdce9c5aac60748abae9995e0fc37e15f2061980501e012cd48859740796bea2987f49 + languageName: node + linkType: hard + "safer-buffer@npm:>= 2.1.2 < 3.0.0": version: 2.1.2 resolution: "safer-buffer@npm:2.1.2" @@ -8769,6 +9162,13 @@ __metadata: languageName: node linkType: hard +"secure-json-parse@npm:^4.0.0": + version: 4.1.0 + resolution: "secure-json-parse@npm:4.1.0" + checksum: 10c0/52b3f8125ea974db1333a5b63e6a1df550c36c0d5f9a263911d6732812bd02e938b30be324dcbbb9da3ef9bf5a84849e0dd911f56544003d3c09e8eee12504de + languageName: node + linkType: hard + "semver@npm:^6.3.1": version: 6.3.1 resolution: "semver@npm:6.3.1" @@ -8827,6 +9227,13 @@ __metadata: languageName: node linkType: hard +"set-cookie-parser@npm:^2.6.0": + version: 2.7.2 + resolution: "set-cookie-parser@npm:2.7.2" + checksum: 10c0/4381a9eb7ee951dfe393fe7aacf76b9a3b4e93a684d2162ab35594fa4053cc82a4d7d7582bf397718012c9adcf839b8cd8f57c6c42901ea9effe33c752da4a45 + languageName: node + linkType: hard + "setprototypeof@npm:1.2.0, setprototypeof@npm:~1.2.0": version: 1.2.0 resolution: "setprototypeof@npm:1.2.0" @@ -8947,6 +9354,15 @@ __metadata: languageName: node linkType: hard +"sonic-boom@npm:^4.0.1": + version: 4.2.0 + resolution: "sonic-boom@npm:4.2.0" + dependencies: + atomic-sleep: "npm:^1.0.0" + checksum: 10c0/ae897e6c2cd6d3cb7cdcf608bc182393b19c61c9413a85ce33ffd25891485589f39bece0db1de24381d0a38fc03d08c9862ded0c60f184f1b852f51f97af9684 + languageName: node + linkType: hard + "source-map-support@npm:0.5.13": version: 0.5.13 resolution: "source-map-support@npm:0.5.13" @@ -8988,7 +9404,7 @@ __metadata: languageName: node linkType: hard -"split2@npm:^4.1.0": +"split2@npm:^4.0.0, split2@npm:^4.1.0": version: 4.2.0 resolution: "split2@npm:4.2.0" checksum: 10c0/b292beb8ce9215f8c642bb68be6249c5a4c7f332fc8ecadae7be5cbdf1ea95addc95f0459ef2e7ad9d45fd1064698a097e4eb211c83e772b49bc0ee423e91534 @@ -9279,6 +9695,15 @@ __metadata: languageName: node linkType: hard +"thread-stream@npm:^3.0.0": + version: 3.1.0 + resolution: "thread-stream@npm:3.1.0" + dependencies: + real-require: "npm:^0.2.0" + checksum: 10c0/c36118379940b77a6ef3e6f4d5dd31e97b8210c3f7b9a54eb8fe6358ab173f6d0acfaf69b9c3db024b948c0c5fd2a7df93e2e49151af02076b35ada3205ec9a6 + languageName: node + linkType: hard + "tinyglobby@npm:^0.2.12": version: 0.2.15 resolution: "tinyglobby@npm:0.2.15" @@ -9305,6 +9730,13 @@ __metadata: languageName: node linkType: hard +"toad-cache@npm:^3.7.0": + version: 3.7.0 + resolution: "toad-cache@npm:3.7.0" + checksum: 10c0/7dae2782ee20b22c9798bb8b71dec7ec6a0091021d2ea9dd6e8afccab6b65b358fdba49a02209fac574499702e2c000660721516c87c2538d1b2c0ba03e8c0c3 + languageName: node + linkType: hard + "toidentifier@npm:1.0.1, toidentifier@npm:~1.0.1": version: 1.0.1 resolution: "toidentifier@npm:1.0.1"