cursor-init/src/constants/error-codes.ts
expressgy 9a76d91307 feat: 实现用户注册接口 (任务1.0)
- 新增auth.schema.ts: 用户注册请求参数Schema定义和类型导出

- 新增auth.response.ts: 注册成功/失败响应格式定义

- 新增auth.service.ts: 注册业务逻辑,包含验证码验证、用户名邮箱唯一性检查、密码加密

- 新增auth.controller.ts: POST /api/auth/register路由实现,包含错误处理

- 新增auth.test.ts: 完整测试用例覆盖正常、异常、边界场景(14个测试全通过)

- 修复数据库日期时间插入问题和路由路径重复问题

关联PRD: M2-基础用户系统,任务1.0完成
2025-07-06 01:21:09 +08:00

180 lines
6.9 KiB
TypeScript

/**
* @file 统一错误码定义
* @author AI助手
* @date 2025-06-29
* @description 定义整个应用的统一错误码,提供类型安全的错误处理
*/
/**
* 应用错误码枚举
* @description 统一管理所有错误码,确保错误处理的一致性
*/
export const ERROR_CODES = {
// 成功
SUCCESS: 'SUCCESS',
// 客户端错误 4xx
VALIDATION_ERROR: 'VALIDATION_ERROR', // 参数验证失败
UNAUTHORIZED: 'UNAUTHORIZED', // 未授权
FORBIDDEN: 'FORBIDDEN', // 禁止访问
NOT_FOUND: 'NOT_FOUND', // 资源不存在
METHOD_NOT_ALLOWED: 'METHOD_NOT_ALLOWED', // 方法不允许
CONFLICT: 'CONFLICT', // 资源冲突
RATE_LIMIT_EXCEEDED: 'RATE_LIMIT_EXCEEDED', // 请求频率超限
// 业务错误 4xx
BUSINESS_ERROR: 'BUSINESS_ERROR', // 通用业务错误
USER_NOT_FOUND: 'USER_NOT_FOUND', // 用户不存在
USER_ALREADY_EXISTS: 'USER_ALREADY_EXISTS', // 用户已存在
INVALID_CREDENTIALS: 'INVALID_CREDENTIALS', // 凭据无效
TOKEN_EXPIRED: 'TOKEN_EXPIRED', // Token过期
TOKEN_INVALID: 'TOKEN_INVALID', // Token无效
INSUFFICIENT_PERMISSIONS: 'INSUFFICIENT_PERMISSIONS', // 权限不足
// 用户注册相关错误
USERNAME_EXISTS: 'USERNAME_EXISTS', // 用户名已存在
EMAIL_EXISTS: 'EMAIL_EXISTS', // 邮箱已存在
PASSWORD_MISMATCH: 'PASSWORD_MISMATCH', // 密码不匹配
CAPTCHA_ERROR: 'CAPTCHA_ERROR', // 验证码错误
EMAIL_SEND_FAILED: 'EMAIL_SEND_FAILED', // 邮件发送失败
// 用户激活相关错误
INVALID_ACTIVATION_TOKEN: 'INVALID_ACTIVATION_TOKEN', // 激活令牌无效
ALREADY_ACTIVATED: 'ALREADY_ACTIVATED', // 已经激活
// 用户登录相关错误
INVALID_PASSWORD: 'INVALID_PASSWORD', // 密码错误
ACCOUNT_NOT_ACTIVATED: 'ACCOUNT_NOT_ACTIVATED', // 账号未激活
ACCOUNT_LOCKED: 'ACCOUNT_LOCKED', // 账号被锁定
TOO_MANY_FAILED_ATTEMPTS: 'TOO_MANY_FAILED_ATTEMPTS', // 失败次数过多
// 密码重置相关错误
INVALID_RESET_TOKEN: 'INVALID_RESET_TOKEN', // 重置令牌无效
// 系统状态
NOT_IMPLEMENTED: 'NOT_IMPLEMENTED', // 功能未实现
// 服务器错误 5xx
INTERNAL_ERROR: 'INTERNAL_ERROR', // 内部服务器错误
DATABASE_ERROR: 'DATABASE_ERROR', // 数据库错误
REDIS_ERROR: 'REDIS_ERROR', // Redis错误
EXTERNAL_API_ERROR: 'EXTERNAL_API_ERROR', // 外部API错误
SERVICE_UNAVAILABLE: 'SERVICE_UNAVAILABLE', // 服务不可用
} as const;
/**
* 错误码类型
*/
export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES];
/**
* 错误码到HTTP状态码的映射
*/
export const ERROR_CODE_TO_HTTP_STATUS: Record<ErrorCode, number> = {
// 成功
[ERROR_CODES.SUCCESS]: 200,
// 客户端错误 4xx
[ERROR_CODES.VALIDATION_ERROR]: 400,
[ERROR_CODES.UNAUTHORIZED]: 401,
[ERROR_CODES.FORBIDDEN]: 403,
[ERROR_CODES.NOT_FOUND]: 404,
[ERROR_CODES.METHOD_NOT_ALLOWED]: 405,
[ERROR_CODES.CONFLICT]: 409,
[ERROR_CODES.RATE_LIMIT_EXCEEDED]: 429,
// 业务错误 4xx
[ERROR_CODES.BUSINESS_ERROR]: 400,
[ERROR_CODES.USER_NOT_FOUND]: 404,
[ERROR_CODES.USER_ALREADY_EXISTS]: 409,
[ERROR_CODES.INVALID_CREDENTIALS]: 401,
[ERROR_CODES.TOKEN_EXPIRED]: 401,
[ERROR_CODES.TOKEN_INVALID]: 401,
[ERROR_CODES.INSUFFICIENT_PERMISSIONS]: 403,
// 用户注册相关错误
[ERROR_CODES.USERNAME_EXISTS]: 409,
[ERROR_CODES.EMAIL_EXISTS]: 409,
[ERROR_CODES.PASSWORD_MISMATCH]: 400,
[ERROR_CODES.CAPTCHA_ERROR]: 400,
[ERROR_CODES.EMAIL_SEND_FAILED]: 500,
// 用户激活相关错误
[ERROR_CODES.INVALID_ACTIVATION_TOKEN]: 400,
[ERROR_CODES.ALREADY_ACTIVATED]: 409,
// 用户登录相关错误
[ERROR_CODES.INVALID_PASSWORD]: 401,
[ERROR_CODES.ACCOUNT_NOT_ACTIVATED]: 403,
[ERROR_CODES.ACCOUNT_LOCKED]: 403,
[ERROR_CODES.TOO_MANY_FAILED_ATTEMPTS]: 429,
// 密码重置相关错误
[ERROR_CODES.INVALID_RESET_TOKEN]: 400,
// 系统状态
[ERROR_CODES.NOT_IMPLEMENTED]: 501,
// 服务器错误 5xx
[ERROR_CODES.INTERNAL_ERROR]: 500,
[ERROR_CODES.DATABASE_ERROR]: 500,
[ERROR_CODES.REDIS_ERROR]: 500,
[ERROR_CODES.EXTERNAL_API_ERROR]: 502,
[ERROR_CODES.SERVICE_UNAVAILABLE]: 503,
};
/**
* 错误码描述映射
*/
export const ERROR_CODE_MESSAGES: Record<ErrorCode, string> = {
// 成功
[ERROR_CODES.SUCCESS]: '操作成功',
// 客户端错误
[ERROR_CODES.VALIDATION_ERROR]: '请求参数验证失败',
[ERROR_CODES.UNAUTHORIZED]: '未授权访问',
[ERROR_CODES.FORBIDDEN]: '禁止访问',
[ERROR_CODES.NOT_FOUND]: '请求的资源不存在',
[ERROR_CODES.METHOD_NOT_ALLOWED]: '请求方法不被允许',
[ERROR_CODES.CONFLICT]: '请求与当前资源状态冲突',
[ERROR_CODES.RATE_LIMIT_EXCEEDED]: '请求频率超过限制',
// 业务错误
[ERROR_CODES.BUSINESS_ERROR]: '业务处理失败',
[ERROR_CODES.USER_NOT_FOUND]: '用户不存在',
[ERROR_CODES.USER_ALREADY_EXISTS]: '用户已存在',
[ERROR_CODES.INVALID_CREDENTIALS]: '用户名或密码错误',
[ERROR_CODES.TOKEN_EXPIRED]: '访问令牌已过期',
[ERROR_CODES.TOKEN_INVALID]: '访问令牌无效',
[ERROR_CODES.INSUFFICIENT_PERMISSIONS]: '权限不足',
// 用户注册相关错误
[ERROR_CODES.USERNAME_EXISTS]: '用户名已存在',
[ERROR_CODES.EMAIL_EXISTS]: '邮箱已被注册',
[ERROR_CODES.PASSWORD_MISMATCH]: '两次输入的密码不一致',
[ERROR_CODES.CAPTCHA_ERROR]: '验证码错误或已过期',
[ERROR_CODES.EMAIL_SEND_FAILED]: '邮件发送失败',
// 用户激活相关错误
[ERROR_CODES.INVALID_ACTIVATION_TOKEN]: '激活令牌无效或已过期',
[ERROR_CODES.ALREADY_ACTIVATED]: '账号已经激活',
// 用户登录相关错误
[ERROR_CODES.INVALID_PASSWORD]: '密码错误',
[ERROR_CODES.ACCOUNT_NOT_ACTIVATED]: '账号未激活',
[ERROR_CODES.ACCOUNT_LOCKED]: '账号已被锁定',
[ERROR_CODES.TOO_MANY_FAILED_ATTEMPTS]: '登录失败次数过多',
// 密码重置相关错误
[ERROR_CODES.INVALID_RESET_TOKEN]: '重置令牌无效或已过期',
// 系统状态
[ERROR_CODES.NOT_IMPLEMENTED]: '功能未实现',
// 服务器错误
[ERROR_CODES.INTERNAL_ERROR]: '服务器内部错误',
[ERROR_CODES.DATABASE_ERROR]: '数据库操作失败',
[ERROR_CODES.REDIS_ERROR]: 'Redis操作失败',
[ERROR_CODES.EXTERNAL_API_ERROR]: '外部服务调用失败',
[ERROR_CODES.SERVICE_UNAVAILABLE]: '服务暂时不可用',
};