From 2aef6a95b9137cd8e688ffbb6889cb59acd74170 Mon Sep 17 00:00:00 2001 From: xuna Date: Thu, 19 Dec 2024 16:31:51 +0800 Subject: [PATCH] feat: constants --- src/app.module.ts | 9 ++-- src/auth/auth.controller.ts | 13 ++--- src/auth/auth.module.ts | 6 +-- src/auth/auth.service.ts | 15 +++--- src/auth/config.ts | 7 --- src/auth/constants.ts | 12 ----- src/auth/index.ts | 1 - src/captcha/captcha.controller.ts | 3 +- src/captcha/captcha.service.ts | 6 +-- src/captcha/config.ts | 6 --- src/captcha/constants.ts | 3 -- src/captcha/entities/captcha.entity.ts | 5 +- src/captcha/index.ts | 2 - src/common/constants.ts | 5 -- src/common/exception-factory.ts | 2 +- src/config.ts | 6 --- src/constants/config.ts | 61 +++++++++++++++++++++++ src/constants/constants.ts | 32 ++++++++++++ src/constants/index.ts | 2 + src/email/config.ts | 23 --------- src/email/constants.ts | 4 -- src/email/email-record.controller.ts | 3 +- src/email/email.controller.ts | 3 +- src/email/email.service.ts | 10 ++-- src/email/index.ts | 1 - src/group/constants.ts | 4 -- src/group/group.controller.ts | 2 +- src/group/index.ts | 1 - src/main.ts | 2 +- src/mongo/config.ts | 3 -- src/mongo/constants.ts | 4 -- src/mongo/index.ts | 1 - src/mongo/mongo.interceptor.ts | 2 +- src/namespace/constants.ts | 4 -- src/namespace/index.ts | 1 - src/namespace/namespace.controller.ts | 3 +- src/redis/config.ts | 3 -- src/redis/index.ts | 1 - src/redis/redis.module.ts | 8 +-- src/role/constants.ts | 4 -- src/role/index.ts | 1 - src/role/role.controller.ts | 3 +- src/session/constants.ts | 4 -- src/session/index.ts | 1 - src/session/session.controller.ts | 3 +- src/sms/config.ts | 6 --- src/sms/constants.ts | 4 -- src/sms/index.ts | 1 - src/sms/sms-record.controller.ts | 3 +- src/sms/sms.controller.ts | 3 +- src/sms/sms.service.ts | 7 +-- src/third-party/third-party.controller.ts | 3 +- src/user/config.ts | 3 -- src/user/constants.ts | 8 --- src/user/index.ts | 2 - src/user/user.controller.ts | 42 ++++++++-------- src/user/verify-identity.ts | 4 +- 57 files changed, 179 insertions(+), 202 deletions(-) delete mode 100644 src/auth/config.ts delete mode 100644 src/auth/constants.ts delete mode 100644 src/captcha/config.ts delete mode 100644 src/captcha/constants.ts delete mode 100644 src/common/constants.ts delete mode 100644 src/config.ts create mode 100644 src/constants/config.ts create mode 100644 src/constants/constants.ts create mode 100644 src/constants/index.ts delete mode 100644 src/email/config.ts delete mode 100644 src/email/constants.ts delete mode 100644 src/group/constants.ts delete mode 100644 src/mongo/config.ts delete mode 100644 src/mongo/constants.ts delete mode 100644 src/namespace/constants.ts delete mode 100644 src/redis/config.ts delete mode 100644 src/role/constants.ts delete mode 100644 src/session/constants.ts delete mode 100644 src/sms/config.ts delete mode 100644 src/sms/constants.ts delete mode 100644 src/user/config.ts delete mode 100644 src/user/constants.ts diff --git a/src/app.module.ts b/src/app.module.ts index 30f6e54..6cbe9e0 100644 --- a/src/app.module.ts +++ b/src/app.module.ts @@ -5,6 +5,8 @@ import { EventEmitterModule } from '@nestjs/event-emitter'; import { MongooseModule } from '@nestjs/mongoose/dist/mongoose.module'; import { redisClusterInsStore, redisInsStore } from 'cache-manager-redis-yet'; +import * as config from 'src/constants'; + import { AppController } from './app.controller'; import { AuthModule } from './auth'; import { CaptchaModule } from './captcha'; @@ -13,9 +15,8 @@ import { EmailModule } from './email'; import { GroupModule } from './group'; import { HelloController } from './hello.controller'; import { IndustryModule } from './industry'; -import { config as mongo } from './mongo'; import { NamespaceModule } from './namespace'; -import { config as redis, RedisModule } from './redis'; +import { RedisModule } from './redis'; import { RegionModule } from './region'; import { RoleModule } from './role'; import { SessionModule } from './session'; @@ -26,9 +27,9 @@ import { UserModule } from './user'; @Module({ imports: [ RedisModule, - MongooseModule.forRoot(mongo.url), + MongooseModule.forRoot(config.mongo.url), BullModule.forRoot({ - redis: redis.url, + redis: config.redis.url, }), CacheModule.registerAsync({ isGlobal: true, diff --git a/src/auth/auth.controller.ts b/src/auth/auth.controller.ts index 0d51bcd..07792d6 100644 --- a/src/auth/auth.controller.ts +++ b/src/auth/auth.controller.ts @@ -15,13 +15,14 @@ import { ApiOkResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; import { JwtPayload } from 'src/auth'; import { CaptchaService } from 'src/captcha'; +import { ErrorCodes } from 'src/constants'; +import * as config from 'src/constants'; import { addShortTimeSpan } from 'src/lib/lang/time'; -import { CreateSessionDto, ErrorCodes as SessionErrorCodes, SessionService } from 'src/session'; +import { CreateSessionDto, SessionService } from 'src/session'; import { ThirdPartySource } from 'src/third-party'; -import { User, UserDocument, ErrorCodes as UserErrorCodes, UserService } from 'src/user'; +import { User, UserDocument, UserService } from 'src/user'; import { AuthService } from './auth.service'; -import { ErrorCodes } from './constants'; import { GithubDto } from './dto/github.dto'; import { LoginByEmailDto, LoginByPhoneDto, LoginDto, LogoutDto } from './dto/login.dto'; import { RefreshTokenDto } from './dto/refresh-token.dto'; @@ -343,7 +344,7 @@ export class AuthController { const user = await this.userService.get(dto.uid); if (!user) { throw new NotFoundException({ - code: UserErrorCodes.USER_NOT_FOUND, + code: config.ErrorCodes.USER_NOT_FOUND, message: `user ${dto.uid} not found.`, }); } @@ -381,14 +382,14 @@ export class AuthController { let session = await this.sessionService.findByRefreshToken(dto.refreshToken); if (!session) { throw new UnauthorizedException({ - code: SessionErrorCodes.SESSION_NOT_FOUND, + code: config.ErrorCodes.SESSION_NOT_FOUND, message: `session with refresh token ${dto.refreshToken} not found.`, }); } if (session.refreshTokenExpireAt.getTime() < Date.now()) { throw new UnauthorizedException({ - code: SessionErrorCodes.SESSION_EXPIRED, + code: config.ErrorCodes.SESSION_EXPIRED, message: 'Session has been expired.', }); } diff --git a/src/auth/auth.module.ts b/src/auth/auth.module.ts index 7197894..dcf30f4 100644 --- a/src/auth/auth.module.ts +++ b/src/auth/auth.module.ts @@ -4,6 +4,7 @@ import { Module } from '@nestjs/common'; import { JwtModule } from '@nestjs/jwt'; import { CaptchaModule } from 'src/captcha'; +import * as config from 'src/constants'; import { EmailModule } from 'src/email'; import { GroupModule } from 'src/group'; import { NamespaceModule } from 'src/namespace'; @@ -15,16 +16,15 @@ import { UserModule } from 'src/user'; import { AuthController } from './auth.controller'; import { AuthService } from './auth.service'; -import { jwtSecretKey } from './config'; @Module({ imports: [ JwtModule.register({ global: true, - secretOrPrivateKey: jwtSecretKey ?? fs.readFileSync('ssl/private.key', 'utf-8'), + secretOrPrivateKey: config.auth.jwtSecretKey ?? fs.readFileSync('ssl/private.key', 'utf-8'), signOptions: { allowInsecureKeySizes: true, - algorithm: jwtSecretKey ? 'HS256' : 'RS256', + algorithm: config.auth.jwtSecretKey ? 'HS256' : 'RS256', }, }), UserModule, diff --git a/src/auth/auth.service.ts b/src/auth/auth.service.ts index 9e57f4c..1fd70ee 100644 --- a/src/auth/auth.service.ts +++ b/src/auth/auth.service.ts @@ -1,17 +1,16 @@ import { Inject, Injectable } from '@nestjs/common'; import { RedisClientType } from 'redis'; -import { createThirdPartyDto } from 'src/third-party/dto/create-third-party.dto'; -import { ThirdPartyDoc, ThirdPartySource } from 'src/third-party/entities/third-party.entity'; -import { ThirdPartyService } from 'src/third-party/third-party.service'; - -import * as config from './config'; +import * as config from 'src/constants'; import { GithubAccessTokenUrl, GithubClientId, GithubClientSecret, GithubUserUrl, -} from './constants'; +} from 'src/constants'; +import { createThirdPartyDto } from 'src/third-party/dto/create-third-party.dto'; +import { ThirdPartyDoc, ThirdPartySource } from 'src/third-party/entities/third-party.entity'; +import { ThirdPartyService } from 'src/third-party/third-party.service'; @Injectable() export class AuthService { @@ -24,7 +23,7 @@ export class AuthService { const lock = await this.redisClient.hGetAll(`loginLock:${login}`); if (!lock || !lock.attempts) return false; - return Number(lock.attempts) >= config.maxLoginAttempts; + return Number(lock.attempts) >= config.auth.maxLoginAttempts; } async lock(login: string): Promise { @@ -38,7 +37,7 @@ export class AuthService { }); // 设置过期时间为登录锁定时长(秒) - await this.redisClient.expire(lockKey, config.loginLockInS); + await this.redisClient.expire(lockKey, config.auth.loginLockInS); } async getGithubAccessToken(code: string): Promise { diff --git a/src/auth/config.ts b/src/auth/config.ts deleted file mode 100644 index 720ea51..0000000 --- a/src/auth/config.ts +++ /dev/null @@ -1,7 +0,0 @@ -import { toInteger } from 'lodash'; - -import { loadEnv } from 'src/lib/utils/env'; - -export const maxLoginAttempts = toInteger(loadEnv('MAX_LOGIN_ATTEMPTS')); // 过期时间 -export const loginLockInS = toInteger(loadEnv('LOGIN_LOCK_IN_S')); // 验证码长度 -export const jwtSecretKey = loadEnv('JWT_SECRET_KEY'); // jwt secret key diff --git a/src/auth/constants.ts b/src/auth/constants.ts deleted file mode 100644 index 47dbb9a..0000000 --- a/src/auth/constants.ts +++ /dev/null @@ -1,12 +0,0 @@ -export const ErrorCodes = { - AUTH_FAILED: 'AUTH_FAILED', - USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS', - CAPTCHA_INVALID: 'CAPTCHA_INVALID', - TOO_MANY_LOGIN_ATTEMPTS: 'TOO_MANY_LOGIN_ATTEMPTS', - USER_NOT_FOUND: 'USER_NOT_FOUND', -}; - -export const GithubAccessTokenUrl = 'https://github.com/login/oauth/access_token'; -export const GithubClientId = 'Iv23lizBaVPIiABBCHaz'; -export const GithubClientSecret = '041f46399c1396ec27d16851c1aa2aa479a3f5a5'; -export const GithubUserUrl = 'https://api.github.com/user'; diff --git a/src/auth/index.ts b/src/auth/index.ts index 7523706..1aea172 100644 --- a/src/auth/index.ts +++ b/src/auth/index.ts @@ -1,4 +1,3 @@ export * from './auth.module'; export * from './entities/jwt.entity'; export * from './entities/session-with-token.entity'; -export * from './constants'; diff --git a/src/captcha/captcha.controller.ts b/src/captcha/captcha.controller.ts index 813032c..717adfe 100644 --- a/src/captcha/captcha.controller.ts +++ b/src/captcha/captcha.controller.ts @@ -21,8 +21,9 @@ import { } from '@nestjs/swagger'; import { Response } from 'express'; +import { ErrorCodes } from 'src/constants'; + import { CaptchaService } from './captcha.service'; -import { ErrorCodes } from './constants'; import { CreateCaptchaDto } from './dto/create-captcha.dto'; import { ListCaptchasQuery } from './dto/list-captchas.dto'; import { UpdateCaptchaDto } from './dto/update-captcha.dto'; diff --git a/src/captcha/captcha.service.ts b/src/captcha/captcha.service.ts index 8e9ebbb..764937f 100644 --- a/src/captcha/captcha.service.ts +++ b/src/captcha/captcha.service.ts @@ -4,9 +4,9 @@ import dayjs from 'dayjs'; import { DeleteResult } from 'mongodb'; import { Model } from 'mongoose'; +import * as config from 'src/constants'; import { buildMongooseQuery } from 'src/mongo'; -import * as config from './config'; import { CreateCaptchaDto } from './dto/create-captcha.dto'; import { getCaptchaByKeyDto } from './dto/get-captcha.dto'; import { ListCaptchasQuery } from './dto/list-captchas.dto'; @@ -20,7 +20,7 @@ export class CaptchaService { create(createDto: CreateCaptchaDto) { if (!createDto.code) { - createDto.code = this.generateCaptcha(config.codeLength); + createDto.code = this.generateCaptcha(config.captcha.codeLength); } const createdCaptcha = new this.captchaModel(createDto); return createdCaptcha.save(); @@ -64,7 +64,7 @@ export class CaptchaService { { key }, { ...upsertDto, - expireAt: dayjs().add(config.expiresInS, 'second').toDate(), + expireAt: dayjs().add(config.captcha.expiresInS, 'second').toDate(), }, { upsert: true, new: true } ) diff --git a/src/captcha/config.ts b/src/captcha/config.ts deleted file mode 100644 index 762c454..0000000 --- a/src/captcha/config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { toInteger } from 'lodash'; - -import { loadEnv } from 'src/lib/utils/env'; - -export const expiresInS = toInteger(loadEnv('CAPTCHA_EXPIRES_IN_S')); // 过期时间 -export const codeLength = toInteger(loadEnv('CAPTCHA_CODE_LENGTH')); // 验证码长度 diff --git a/src/captcha/constants.ts b/src/captcha/constants.ts deleted file mode 100644 index 0b27806..0000000 --- a/src/captcha/constants.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const ErrorCodes = { - CAPTCHA_NOT_FOUND: 'CAPTCHA_NOT_FOUND', -}; diff --git a/src/captcha/entities/captcha.entity.ts b/src/captcha/entities/captcha.entity.ts index 2548f73..db9234c 100644 --- a/src/captcha/entities/captcha.entity.ts +++ b/src/captcha/entities/captcha.entity.ts @@ -3,11 +3,10 @@ import { IntersectionType } from '@nestjs/swagger'; import { Type } from 'class-transformer'; import { IsDate, IsNotEmpty, IsString } from 'class-validator'; +import * as config from 'src/constants'; import { SortFields } from 'src/lib/sort'; import { helper, MongoEntity } from 'src/mongo'; -import * as config from '../config'; - @Schema() @SortFields(['expireAt']) export class CaptchaDoc { @@ -25,7 +24,7 @@ export class CaptchaDoc { @IsNotEmpty() @Type(() => Date) @IsDate() - @Prop({ default: () => Date.now() + config.expiresInS * 1000, expires: '7d' }) + @Prop({ default: () => Date.now() + config.captcha.expiresInS * 1000, expires: '7d' }) expireAt: Date; /** diff --git a/src/captcha/index.ts b/src/captcha/index.ts index cfe018b..90f4a36 100644 --- a/src/captcha/index.ts +++ b/src/captcha/index.ts @@ -3,5 +3,3 @@ export * from './captcha.controller'; export * from './captcha.service'; export * from './dto/create-captcha.dto'; export * from './entities/captcha.entity'; -export * from './constants'; -export * as config from './config'; diff --git a/src/common/constants.ts b/src/common/constants.ts deleted file mode 100644 index d426064..0000000 --- a/src/common/constants.ts +++ /dev/null @@ -1,5 +0,0 @@ -export const ErrorCodes = { - CASTERROR: 'CASTERROR', - DUPLICATE: 'DUPLICATE', - VALIDATE_FAILED: 'VALIDATION_FAILED', -}; diff --git a/src/common/exception-factory.ts b/src/common/exception-factory.ts index e2e80ff..4cbb297 100644 --- a/src/common/exception-factory.ts +++ b/src/common/exception-factory.ts @@ -1,7 +1,7 @@ import { BadRequestException } from '@nestjs/common'; import { ValidationError } from 'class-validator'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; export type ValidationErrorDetail = { message: string; diff --git a/src/config.ts b/src/config.ts deleted file mode 100644 index 2f46234..0000000 --- a/src/config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { trimStart } from 'lodash'; - -import { loadEnv } from './lib/utils/env'; - -export const port = loadEnv('PORT'); -export const prefix = trimStart(loadEnv('PREFIX') || '', '/'); diff --git a/src/constants/config.ts b/src/constants/config.ts new file mode 100644 index 0000000..c442c21 --- /dev/null +++ b/src/constants/config.ts @@ -0,0 +1,61 @@ +import { toInteger, trimStart } from 'lodash'; + +import { EmailTransporter } from 'src/lib/email'; +import { toBoolean } from 'src/lib/lang/boolean'; + +import { loadEnv } from '../lib/utils/env'; + +export const port = loadEnv('PORT'); +export const prefix = trimStart(loadEnv('PREFIX') || '', '/'); + +export const auth = { + maxLoginAttempts: toInteger(loadEnv('MAX_LOGIN_ATTEMPTS')), // 过期时间 + loginLockInS: toInteger(loadEnv('LOGIN_LOCK_IN_S')), // 验证码长度 + jwtSecretKey: loadEnv('JWT_SECRET_KEY'), // jwt secret key +}; + +export const captcha = { + expiresInS: toInteger(loadEnv('CAPTCHA_EXPIRES_IN_S')), // 过期时间 + codeLength: toInteger(loadEnv('CAPTCHA_CODE_LENGTH')), // 验证码长度 +}; + +export const email = { + transporter: loadEnv('EMAIL_TRANSPORTER') as EmailTransporter, + nodemailer: { + pool: true, + host: loadEnv('NODEMAILER_HOST'), + port: Number(loadEnv('NODEMAILER_PORT')), + secure: toBoolean(loadEnv('NODEMAILER_SECURE')), + tls: { + rejectUnauthorized: false, + }, + auth: { + user: loadEnv('NODEMAILER_AUTH_USER'), + pass: loadEnv('NODEMAILER_AUTH_PASS'), + }, + }, + postmark: { + serverToken: loadEnv('POSTMARK_API_TOKEN'), + }, +}; + +export const mongo = { + url: loadEnv('MONGO_URL'), +}; + +export const redis = { + url: loadEnv('REDIS_URL'), +}; + +export const sms = { + aliyun: { + keyId: loadEnv('ALIYUN_SMS_KEY_ID'), + keySecret: loadEnv('ALIYUN_SMS_KEY_SECRET'), + }, +}; + +export const user = { + identityVerify: { + appCode: 'appCode', + }, +}; diff --git a/src/constants/constants.ts b/src/constants/constants.ts new file mode 100644 index 0000000..a6a6805 --- /dev/null +++ b/src/constants/constants.ts @@ -0,0 +1,32 @@ +export const ErrorCodes = { + AUTH_FAILED: 'AUTH_FAILED', + USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS', + CAPTCHA_INVALID: 'CAPTCHA_INVALID', + TOO_MANY_LOGIN_ATTEMPTS: 'TOO_MANY_LOGIN_ATTEMPTS', + USER_NOT_FOUND: 'USER_NOT_FOUND', + CAPTCHA_NOT_FOUND: 'CAPTCHA_NOT_FOUND', + CASTERROR: 'CASTERROR', + DUPLICATE: 'DUPLICATE', + VALIDATE_FAILED: 'VALIDATION_FAILED', + EMAIL_SEND_FAILED: 'EMAIL_SEND_FAILED', + EMAIL_RECORD_NOT_FOUND: 'EMAIL_RECORD_NOT_FOUND', + GROUP_ALREADY_EXISTS: 'GROUP_ALREADY_EXISTS', + GROUP_NOT_FOUND: 'GROUP_NOT_FOUND', + NAMESPACE_ALREADY_EXISTS: 'NAMESPACE_ALREADY_EXISTS', + NAMESPACE_NOT_FOUND: 'NAMESPACE_NOT_FOUND', + EMPLOYEE_ID_ALREADY_EXISTS: 'EMPLOYEE_ID_ALREADY_EXISTS', + EMAIL_ALREADY_EXISTS: 'EMAIL_ALREADY_EXISTS', + PHONE_ALREADY_EXISTS: 'PHONE_ALREADY_EXISTS', + WRONG_OLD_PASSWORD: 'WRONG_OLD_PASSWORD', + ROLE_ALREADY_EXISTS: 'ROLE_ALREADY_EXISTS', + ROLE_NOT_FOUND: 'ROLE_NOT_FOUND', + SESSION_NOT_FOUND: 'SESSION_NOT_FOUND', + SESSION_EXPIRED: 'SESSION_EXPIRED', + SMS_SEND_FAILED: 'SMS_SEND_FAILED', + SMS_RECORD_NOT_FOUND: 'SMS_RECORD_NOT_FOUND', +}; + +export const GithubAccessTokenUrl = 'https://github.com/login/oauth/access_token'; +export const GithubClientId = 'Iv23lizBaVPIiABBCHaz'; +export const GithubClientSecret = '041f46399c1396ec27d16851c1aa2aa479a3f5a5'; +export const GithubUserUrl = 'https://api.github.com/user'; diff --git a/src/constants/index.ts b/src/constants/index.ts new file mode 100644 index 0000000..be1d300 --- /dev/null +++ b/src/constants/index.ts @@ -0,0 +1,2 @@ +export * from './constants'; +export * from './config'; diff --git a/src/email/config.ts b/src/email/config.ts deleted file mode 100644 index 2fe21dc..0000000 --- a/src/email/config.ts +++ /dev/null @@ -1,23 +0,0 @@ -import { EmailTransporter } from 'src/lib/email'; -import { toBoolean } from 'src/lib/lang/boolean'; -import { loadEnv } from 'src/lib/utils/env'; - -export const transporter = loadEnv('EMAIL_TRANSPORTER') as EmailTransporter; - -export const nodemailer = { - pool: true, - host: loadEnv('NODEMAILER_HOST'), - port: Number(loadEnv('NODEMAILER_PORT')), - secure: toBoolean(loadEnv('NODEMAILER_SECURE')), - tls: { - rejectUnauthorized: false, - }, - auth: { - user: loadEnv('NODEMAILER_AUTH_USER'), - pass: loadEnv('NODEMAILER_AUTH_PASS'), - }, -}; - -export const postmark = { - serverToken: loadEnv('POSTMARK_API_TOKEN'), -}; diff --git a/src/email/constants.ts b/src/email/constants.ts deleted file mode 100644 index 952a302..0000000 --- a/src/email/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - EMAIL_SEND_FAILED: 'EMAIL_SEND_FAILED', - EMAIL_RECORD_NOT_FOUND: 'EMAIL_RECORD_NOT_FOUND', -}; diff --git a/src/email/email-record.controller.ts b/src/email/email-record.controller.ts index 2d21c89..25cd303 100644 --- a/src/email/email-record.controller.ts +++ b/src/email/email-record.controller.ts @@ -24,7 +24,8 @@ import { } from '@nestjs/swagger'; import { Request, Response } from 'express'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateEmailRecordDto } from './dto/create-email-record.dto'; import { ListEmailRecordsQuery } from './dto/list-email-records.dto'; import { UpdateEmailRecordDto } from './dto/update-email-record.dto'; diff --git a/src/email/email.controller.ts b/src/email/email.controller.ts index 2ee7692..a90cf16 100644 --- a/src/email/email.controller.ts +++ b/src/email/email.controller.ts @@ -8,7 +8,8 @@ import { } from '@nestjs/common'; import { ApiNoContentResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateEmailRecordDto } from './dto/create-email-record.dto'; import { SendEmailDto } from './dto/send-email.dto'; import { EmailRecordService } from './email-record.service'; diff --git a/src/email/email.service.ts b/src/email/email.service.ts index 6e8885e..1f12305 100644 --- a/src/email/email.service.ts +++ b/src/email/email.service.ts @@ -1,8 +1,8 @@ import { Injectable, InternalServerErrorException } from '@nestjs/common'; +import * as config from 'src/constants'; import { EmailTransporter, Mailer } from 'src/lib/email'; -import * as config from './config'; import { SendEmailDto } from './dto/send-email.dto'; @Injectable() @@ -10,22 +10,22 @@ export class EmailService { private mailer: Mailer; constructor() { - switch (config.transporter) { + switch (config.email.transporter) { case EmailTransporter.NODEMAILER: this.mailer = new Mailer({ transporter: EmailTransporter.NODEMAILER, - options: config.nodemailer, + options: config.email.nodemailer, }); break; case EmailTransporter.POSTMARK: this.mailer = new Mailer({ transporter: EmailTransporter.POSTMARK, - options: config.postmark, + options: config.email.postmark, }); break; default: throw new InternalServerErrorException( - `Unsupported email transporter: ${config.transporter}` + `Unsupported email transporter: ${config.email.transporter}` ); } } diff --git a/src/email/index.ts b/src/email/index.ts index 043103d..cda2879 100644 --- a/src/email/index.ts +++ b/src/email/index.ts @@ -1,4 +1,3 @@ export * from './email.module'; export * from './email.service'; export * from './dto/send-email.dto'; -export * as config from './config'; diff --git a/src/group/constants.ts b/src/group/constants.ts deleted file mode 100644 index 85c0981..0000000 --- a/src/group/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - GROUP_ALREADY_EXISTS: 'GROUP_ALREADY_EXISTS', - GROUP_NOT_FOUND: 'GROUP_NOT_FOUND', -}; diff --git a/src/group/group.controller.ts b/src/group/group.controller.ts index 907b98a..35d222b 100644 --- a/src/group/group.controller.ts +++ b/src/group/group.controller.ts @@ -24,9 +24,9 @@ import { } from '@nestjs/swagger'; import { Response } from 'express'; +import { ErrorCodes } from 'src/constants'; import { NamespaceService } from 'src/namespace'; -import { ErrorCodes } from './constants'; import { CreateGroupDto } from './dto/create-group.dto'; import { ListGroupsQuery } from './dto/list-groups.dto'; import { UpdateGroupDto } from './dto/update-group.dto'; diff --git a/src/group/index.ts b/src/group/index.ts index 84938d1..360cf02 100644 --- a/src/group/index.ts +++ b/src/group/index.ts @@ -2,4 +2,3 @@ export * from './group.module'; export * from './group.controller'; export * from './group.service'; export * from './entities/group.entity'; -export * from './constants'; diff --git a/src/main.ts b/src/main.ts index 6927341..36fd062 100644 --- a/src/main.ts +++ b/src/main.ts @@ -15,7 +15,7 @@ import { MongoErrorsInterceptor } from 'src/mongo'; import { AppModule } from './app.module'; import { AllExceptionsFilter } from './common/all-exceptions.filter'; import { exceptionFactory } from './common/exception-factory'; -import { port, prefix } from './config'; +import { port, prefix } from './constants/config'; dayjs.extend(isoWeek); dayjs.extend(minMax); diff --git a/src/mongo/config.ts b/src/mongo/config.ts deleted file mode 100644 index f177ddc..0000000 --- a/src/mongo/config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { loadEnv } from 'src/lib/utils/env'; - -export const url = loadEnv('MONGO_URL'); diff --git a/src/mongo/constants.ts b/src/mongo/constants.ts deleted file mode 100644 index 3ab53e2..0000000 --- a/src/mongo/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - CASTERROR: 'CASTERROR', - DUPLICATE: 'DUPLICATE', -}; diff --git a/src/mongo/index.ts b/src/mongo/index.ts index 0b8e68b..c315617 100644 --- a/src/mongo/index.ts +++ b/src/mongo/index.ts @@ -1,4 +1,3 @@ -export * as config from './config'; export * from './entities/date-group.entity'; export * from './entities/mongo.entity'; export * from './helper'; diff --git a/src/mongo/mongo.interceptor.ts b/src/mongo/mongo.interceptor.ts index d85efaf..e1bfccd 100644 --- a/src/mongo/mongo.interceptor.ts +++ b/src/mongo/mongo.interceptor.ts @@ -11,7 +11,7 @@ import lodash from 'lodash'; import { Observable, throwError } from 'rxjs'; import { catchError } from 'rxjs/operators'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; function isMongoError(error: any): boolean { return ['MongoError', 'MongoServerError'].includes(error.name); diff --git a/src/namespace/constants.ts b/src/namespace/constants.ts deleted file mode 100644 index f08ca3f..0000000 --- a/src/namespace/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - NAMESPACE_ALREADY_EXISTS: 'NAMESPACE_ALREADY_EXISTS', - NAMESPACE_NOT_FOUND: 'NAMESPACE_NOT_FOUND', -}; diff --git a/src/namespace/index.ts b/src/namespace/index.ts index 305e8bb..123ebbc 100644 --- a/src/namespace/index.ts +++ b/src/namespace/index.ts @@ -2,4 +2,3 @@ export * from './namespace.module'; export * from './namespace.controller'; export * from './namespace.service'; export * from './entities/namespace.entity'; -export * from './constants'; diff --git a/src/namespace/namespace.controller.ts b/src/namespace/namespace.controller.ts index 4b8841f..b38d39e 100644 --- a/src/namespace/namespace.controller.ts +++ b/src/namespace/namespace.controller.ts @@ -24,7 +24,8 @@ import { } from '@nestjs/swagger'; import { Response } from 'express'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateNamespaceDto } from './dto/create-namespace.dto'; import { ListNamespacesQuery } from './dto/list-namespaces.dto'; import { UpdateNamespaceDto } from './dto/update-namespace.dto'; diff --git a/src/redis/config.ts b/src/redis/config.ts deleted file mode 100644 index ef897a5..0000000 --- a/src/redis/config.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { loadEnv } from 'src/lib/utils/env'; - -export const url = loadEnv('REDIS_URL'); diff --git a/src/redis/index.ts b/src/redis/index.ts index b98a44d..2c88c87 100644 --- a/src/redis/index.ts +++ b/src/redis/index.ts @@ -1,2 +1 @@ -export * as config from './config'; export * from './redis.module'; diff --git a/src/redis/redis.module.ts b/src/redis/redis.module.ts index 2d842b8..9f91e31 100644 --- a/src/redis/redis.module.ts +++ b/src/redis/redis.module.ts @@ -1,7 +1,7 @@ import { Global, Inject, Module } from '@nestjs/common'; import { createClient, createCluster, RedisClientType } from 'redis'; -import * as config from './config'; +import * as config from 'src/constants'; @Global() @Module({ @@ -9,7 +9,7 @@ import * as config from './config'; { provide: 'REDIS_CLIENT', useFactory: async () => { - const urls = config.url.split(','); + const urls = config.redis.url.split(','); if (urls && urls.length > 1) { const cluster = createCluster({ rootNodes: urls.map((node) => { @@ -20,13 +20,13 @@ import * as config from './config'; return cluster; } else if (urls && urls.length > 0) { const client = createClient({ - url: config.url, + url: config.redis.url, }); await client.connect(); return client; } - throw new Error('Redis url error, url=' + config.url); + throw new Error('Redis url error, url=' + config.redis.url); }, }, ], diff --git a/src/role/constants.ts b/src/role/constants.ts deleted file mode 100644 index d513174..0000000 --- a/src/role/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - ROLE_ALREADY_EXISTS: 'ROLE_ALREADY_EXISTS', - ROLE_NOT_FOUND: 'ROLE_NOT_FOUND', -}; diff --git a/src/role/index.ts b/src/role/index.ts index d4bbfe6..665051c 100644 --- a/src/role/index.ts +++ b/src/role/index.ts @@ -2,4 +2,3 @@ export * from './role.module'; export * from './role.controller'; export * from './role.service'; export * from './entities/role.entity'; -export * from './constants'; diff --git a/src/role/role.controller.ts b/src/role/role.controller.ts index 08abb73..1ea6829 100644 --- a/src/role/role.controller.ts +++ b/src/role/role.controller.ts @@ -24,7 +24,8 @@ import { } from '@nestjs/swagger'; import { Response } from 'express'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateRoleDto } from './dto/create-role.dto'; import { ListRolesQuery } from './dto/list-roles.dto'; import { UpdateRoleDto } from './dto/update-role.dto'; diff --git a/src/session/constants.ts b/src/session/constants.ts deleted file mode 100644 index 150310a..0000000 --- a/src/session/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - SESSION_NOT_FOUND: 'SESSION_NOT_FOUND', - SESSION_EXPIRED: 'SESSION_EXPIRED', -}; diff --git a/src/session/index.ts b/src/session/index.ts index 3ee8094..d2ebe41 100644 --- a/src/session/index.ts +++ b/src/session/index.ts @@ -5,4 +5,3 @@ export * from './dto/create-session.dto'; export * from './dto/list-sessions.dto'; export * from '../auth/dto/login.dto'; export * from './dto/update-session.dto'; -export * from './constants'; diff --git a/src/session/session.controller.ts b/src/session/session.controller.ts index 8ee9201..7337726 100644 --- a/src/session/session.controller.ts +++ b/src/session/session.controller.ts @@ -23,7 +23,8 @@ import { } from '@nestjs/swagger'; import { Response } from 'express'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateSessionDto } from './dto/create-session.dto'; import { ListSessionsQuery } from './dto/list-sessions.dto'; import { UpdateSessionDto } from './dto/update-session.dto'; diff --git a/src/sms/config.ts b/src/sms/config.ts deleted file mode 100644 index 6817743..0000000 --- a/src/sms/config.ts +++ /dev/null @@ -1,6 +0,0 @@ -import { loadEnv } from 'src/lib/utils/env'; - -export const aliyun = { - keyId: loadEnv('ALIYUN_SMS_KEY_ID'), - keySecret: loadEnv('ALIYUN_SMS_KEY_SECRET'), -}; diff --git a/src/sms/constants.ts b/src/sms/constants.ts deleted file mode 100644 index 1cee5ee..0000000 --- a/src/sms/constants.ts +++ /dev/null @@ -1,4 +0,0 @@ -export const ErrorCodes = { - SMS_SEND_FAILED: 'SMS_SEND_FAILED', - SMS_RECORD_NOT_FOUND: 'SMS_RECORD_NOT_FOUND', -}; diff --git a/src/sms/index.ts b/src/sms/index.ts index cf556e1..dc0469d 100644 --- a/src/sms/index.ts +++ b/src/sms/index.ts @@ -6,4 +6,3 @@ export * from './dto/list-sms-records.dto'; export * from './dto/create-sms-record.dto'; export * from './dto/update-sms-record.dto'; export * from './entities/sms-record.entity'; -export * as config from './config'; diff --git a/src/sms/sms-record.controller.ts b/src/sms/sms-record.controller.ts index 19ae8ab..d0d4501 100644 --- a/src/sms/sms-record.controller.ts +++ b/src/sms/sms-record.controller.ts @@ -24,7 +24,8 @@ import { } from '@nestjs/swagger'; import { Request, Response } from 'express'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateSmsRecordDto } from './dto/create-sms-record.dto'; import { ListSmsRecordsQuery } from './dto/list-sms-records.dto'; import { UpdateSmsRecordDto } from './dto/update-sms-record.dto'; diff --git a/src/sms/sms.controller.ts b/src/sms/sms.controller.ts index 2c400a2..0dbc97a 100644 --- a/src/sms/sms.controller.ts +++ b/src/sms/sms.controller.ts @@ -8,7 +8,8 @@ import { } from '@nestjs/common'; import { ApiNoContentResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; -import { ErrorCodes } from './constants'; +import { ErrorCodes } from 'src/constants'; + import { CreateSmsRecordDto } from './dto/create-sms-record.dto'; import { SendSmsDto } from './dto/send-sms.dto'; import { SmsStatus } from './entities/sms-record.entity'; diff --git a/src/sms/sms.service.ts b/src/sms/sms.service.ts index 2218e74..d0f998c 100644 --- a/src/sms/sms.service.ts +++ b/src/sms/sms.service.ts @@ -1,7 +1,8 @@ import SMSClient from '@alicloud/sms-sdk'; import { Injectable } from '@nestjs/common'; -import * as config from './config'; +import * as config from 'src/constants'; + import { SendSmsDto } from './dto/send-sms.dto'; @Injectable() @@ -10,8 +11,8 @@ export class SmsService { constructor() { this.aliyunClient = new SMSClient({ - accessKeyId: config.aliyun.keyId, - secretAccessKey: config.aliyun.keySecret, + accessKeyId: config.sms.aliyun.keyId, + secretAccessKey: config.sms.aliyun.keySecret, }); } diff --git a/src/third-party/third-party.controller.ts b/src/third-party/third-party.controller.ts index 7ab8519..f21966a 100644 --- a/src/third-party/third-party.controller.ts +++ b/src/third-party/third-party.controller.ts @@ -13,10 +13,9 @@ import { import { ApiCreatedResponse, ApiOperation, ApiTags } from '@nestjs/swagger'; import { Response } from 'express'; +import { ErrorCodes } from 'src/constants'; import { UserService } from 'src/user'; -import { ErrorCodes } from '../user/constants'; - import { bindThirdPartyDto } from './dto/bind-third-party.dto'; import { createThirdPartyDto } from './dto/create-third-party.dto'; import { ListThirdPartyDto } from './dto/list-third-party.dto'; diff --git a/src/user/config.ts b/src/user/config.ts deleted file mode 100644 index c2d30c9..0000000 --- a/src/user/config.ts +++ /dev/null @@ -1,3 +0,0 @@ -export const identityVerify = { - appCode: 'appCode', -}; diff --git a/src/user/constants.ts b/src/user/constants.ts deleted file mode 100644 index f176ef7..0000000 --- a/src/user/constants.ts +++ /dev/null @@ -1,8 +0,0 @@ -export const ErrorCodes = { - USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS', - EMPLOYEE_ID_ALREADY_EXISTS: 'EMPLOYEE_ID_ALREADY_EXISTS', - EMAIL_ALREADY_EXISTS: 'EMAIL_ALREADY_EXISTS', - PHONE_ALREADY_EXISTS: 'PHONE_ALREADY_EXISTS', - USER_NOT_FOUND: 'USER_NOT_FOUND', - WRONG_OLD_PASSWORD: 'WRONG_OLD_PASSWORD', -}; diff --git a/src/user/index.ts b/src/user/index.ts index 64cc840..685a318 100644 --- a/src/user/index.ts +++ b/src/user/index.ts @@ -2,5 +2,3 @@ export * from './user.module'; export * from './user.controller'; export * from './user.service'; export * from './entities/user.entity'; -export * from './constants'; -export * as config from './config'; diff --git a/src/user/user.controller.ts b/src/user/user.controller.ts index b32fc68..f34db6e 100644 --- a/src/user/user.controller.ts +++ b/src/user/user.controller.ts @@ -24,9 +24,9 @@ import { } from '@nestjs/swagger'; import { Response } from 'express'; -import { NamespaceService, ErrorCodes as NsErrCodes } from 'src/namespace'; +import * as config from 'src/constants'; +import { NamespaceService } from 'src/namespace'; -import { ErrorCodes } from './constants'; import { CreateUserDto } from './dto/create-user.dto'; import { ListUsersQuery } from './dto/list-users.dto'; import { UpdatePasswordDto } from './dto/update-password.dto'; @@ -60,7 +60,7 @@ export class UserController { const user = await this.userService.findByUsername(username); if (user) { throw new ConflictException({ - code: ErrorCodes.USER_ALREADY_EXISTS, + code: config.ErrorCodes.USER_ALREADY_EXISTS, message: `Username ${username} already exists.`, details: [ { @@ -76,7 +76,7 @@ export class UserController { const user = await this.userService.findByEmployeeId(employeeId); if (user) { throw new ConflictException({ - code: ErrorCodes.EMPLOYEE_ID_ALREADY_EXISTS, + code: config.ErrorCodes.EMPLOYEE_ID_ALREADY_EXISTS, message: `EmployeeId ${employeeId} already exists.`, details: [ { @@ -92,7 +92,7 @@ export class UserController { const user = await this.userService.findByEmail(email); if (user) { throw new ConflictException({ - code: ErrorCodes.EMAIL_ALREADY_EXISTS, + code: config.ErrorCodes.EMAIL_ALREADY_EXISTS, message: `Email ${email} already exists.`, details: [ { @@ -108,7 +108,7 @@ export class UserController { const user = await this.userService.findByPhone(phone); if (user) { throw new ConflictException({ - code: ErrorCodes.PHONE_ALREADY_EXISTS, + code: config.ErrorCodes.PHONE_ALREADY_EXISTS, message: `Phone ${phone} already exists.`, details: [ { @@ -125,7 +125,7 @@ export class UserController { const namespace = await this.namespaceService.getByKey(ns); if (!namespace) { throw new NotFoundException({ - code: NsErrCodes.NAMESPACE_NOT_FOUND, + code: config.ErrorCodes.NAMESPACE_NOT_FOUND, message: `Namespace ${ns} not found.`, details: [ { @@ -174,7 +174,7 @@ export class UserController { const user = await this.userService.get(userId); if (!user) { throw new NotFoundException({ - code: ErrorCodes.USER_NOT_FOUND, + code: config.ErrorCodes.USER_NOT_FOUND, message: `User ${userId} not found.`, }); } @@ -199,7 +199,7 @@ export class UserController { const namespace = await this.namespaceService.getByKey(ns); if (!namespace) { throw new NotFoundException({ - code: NsErrCodes.NAMESPACE_NOT_FOUND, + code: config.ErrorCodes.NAMESPACE_NOT_FOUND, message: `Namespace ${ns} not found.`, details: [ { @@ -217,7 +217,7 @@ export class UserController { const exists = await this.userService.findByUsername(username); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.USER_ALREADY_EXISTS, + code: config.ErrorCodes.USER_ALREADY_EXISTS, message: `Username ${username} already exists.`, details: [ { @@ -233,7 +233,7 @@ export class UserController { const exists = await this.userService.findByEmployeeId(employeeId); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.EMPLOYEE_ID_ALREADY_EXISTS, + code: config.ErrorCodes.EMPLOYEE_ID_ALREADY_EXISTS, message: `EmployeeId ${employeeId} already exists.`, details: [ { @@ -249,7 +249,7 @@ export class UserController { const exists = await this.userService.findByEmail(email); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.EMAIL_ALREADY_EXISTS, + code: config.ErrorCodes.EMAIL_ALREADY_EXISTS, message: `Email ${email} already exists.`, details: [ { @@ -265,7 +265,7 @@ export class UserController { const exists = await this.userService.findByPhone(phone); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.PHONE_ALREADY_EXISTS, + code: config.ErrorCodes.PHONE_ALREADY_EXISTS, message: `Phone ${phone} already exists.`, details: [ { @@ -298,7 +298,7 @@ export class UserController { const namespace = await this.namespaceService.getByKey(ns); if (!namespace) { throw new NotFoundException({ - code: NsErrCodes.NAMESPACE_NOT_FOUND, + code: config.ErrorCodes.NAMESPACE_NOT_FOUND, message: `Namespace ${ns} not found.`, details: [ { @@ -316,7 +316,7 @@ export class UserController { const exists = await this.userService.findByUsername(username); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.USER_ALREADY_EXISTS, + code: config.ErrorCodes.USER_ALREADY_EXISTS, message: `Username ${username} already exists.`, details: [ { @@ -332,7 +332,7 @@ export class UserController { const exists = await this.userService.findByEmployeeId(toBeUpdatedEmployeeId); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.EMPLOYEE_ID_ALREADY_EXISTS, + code: config.ErrorCodes.EMPLOYEE_ID_ALREADY_EXISTS, message: `EmployeeId ${employeeId} already exists.`, details: [ { @@ -348,7 +348,7 @@ export class UserController { const exists = await this.userService.findByEmail(email); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.EMAIL_ALREADY_EXISTS, + code: config.ErrorCodes.EMAIL_ALREADY_EXISTS, message: `Email ${email} already exists.`, details: [ { @@ -364,7 +364,7 @@ export class UserController { const exists = await this.userService.findByPhone(phone); if (exists && exists.id !== user?.id) { throw new ConflictException({ - code: ErrorCodes.PHONE_ALREADY_EXISTS, + code: config.ErrorCodes.PHONE_ALREADY_EXISTS, message: `Phone ${phone} already exists.`, details: [ { @@ -404,7 +404,7 @@ export class UserController { const user = await this.userService.get(userId); if (!user) { throw new NotFoundException({ - code: ErrorCodes.USER_NOT_FOUND, + code: config.ErrorCodes.USER_NOT_FOUND, message: `User ${userId} not found.`, }); } @@ -432,14 +432,14 @@ export class UserController { const user = await this.userService.get(userId); if (!user) { throw new NotFoundException({ - code: ErrorCodes.USER_NOT_FOUND, + code: config.ErrorCodes.USER_NOT_FOUND, message: `User ${userId} not found.`, }); } if (user.password && !this.userService.checkPassword(user.password, dto.oldPassword)) { throw new BadRequestException({ - code: ErrorCodes.WRONG_OLD_PASSWORD, + code: config.ErrorCodes.WRONG_OLD_PASSWORD, message: 'Old password not match.', }); } diff --git a/src/user/verify-identity.ts b/src/user/verify-identity.ts index 1b3390b..a5dcd7f 100644 --- a/src/user/verify-identity.ts +++ b/src/user/verify-identity.ts @@ -1,7 +1,7 @@ import axios from 'axios'; import { get } from 'lodash'; -import * as config from './config'; +import * as config from 'src/constants'; const results = { 400: '400 参数不能为空', @@ -18,7 +18,7 @@ export async function verifyIdentity(name: string, identity: string): Promise