refactor:项目架构重构和命名规范化

- 统一文件命名为snake_case格式(kebab-case  snake_case)
- 重构zulip模块为zulip_core,明确Core层职责
- 重构user-mgmt模块为user_mgmt,统一命名规范
- 调整模块依赖关系,优化架构分层
- 删除过时的文件和目录结构
- 更新相关文档和配置文件

本次重构涉及大量文件重命名和模块重组,
旨在建立更清晰的项目架构和统一的命名规范。
This commit is contained in:
moyin
2026-01-08 00:14:14 +08:00
parent 4fa4bd1a70
commit bb796a2469
178 changed files with 24767 additions and 3484 deletions

View File

@@ -12,12 +12,22 @@
* - 欢迎邮件
* - 系统通知
*
* 职责分离:
* - 邮件发送:核心邮件发送功能实现
* - 模板管理:各种邮件模板的生成和管理
* - 配置管理:邮件服务配置和连接管理
*
* 最近修改:
* - 2026-01-07: 代码规范优化 - 清理未使用的导入(BadRequestException),移除多余注释
* - 2026-01-07: 代码规范优化 - 完善方法注释和修改记录
*
* @author moyin
* @version 1.0.0
* @version 1.0.1
* @since 2025-12-17
* @lastModified 2026-01-07
*/
import { Injectable, Logger, BadRequestException } from '@nestjs/common';
import { Injectable, Logger } from '@nestjs/common';
import { ConfigService } from '@nestjs/config';
import * as nodemailer from 'nodemailer';
import { Transporter } from 'nodemailer';
@@ -51,7 +61,7 @@ export interface VerificationEmailOptions {
}
/**
* 邮件发送结果接口 by angjustinl 2025-12-17
* 邮件发送结果接口
*/
export interface EmailSendResult {
/** 是否成功 */
@@ -62,6 +72,27 @@ export interface EmailSendResult {
error?: string;
}
/**
* 邮件服务类
*
* 职责:
* - 邮件发送功能:提供统一的邮件发送接口
* - 模板管理:管理各种邮件模板(验证码、欢迎邮件等)
* - 配置管理:处理邮件服务配置和连接
* - 测试模式:支持开发环境的邮件测试模式
*
* 主要方法:
* - sendEmail() - 通用邮件发送方法
* - sendVerificationCode() - 发送验证码邮件
* - sendWelcomeEmail() - 发送欢迎邮件
* - verifyConnection() - 验证邮件服务连接
*
* 使用场景:
* - 用户注册时发送邮箱验证码
* - 密码重置时发送重置验证码
* - 用户注册成功后发送欢迎邮件
* - 登录验证时发送登录验证码
*/
@Injectable()
export class EmailService {
private readonly logger = new Logger(EmailService.name);
@@ -73,6 +104,14 @@ export class EmailService {
/**
* 初始化邮件传输器
*
* 业务逻辑:
* 1. 从配置服务获取邮件服务配置(主机、端口、安全设置、认证信息)
* 2. 检查是否配置了用户名和密码
* 3. 未配置创建测试模式传输器streamTransport
* 4. 已配置创建真实SMTP传输器
* 5. 记录初始化结果到日志
* 6. 设置transporter实例
*/
private initializeTransporter(): void {
const emailConfig = {
@@ -102,7 +141,20 @@ export class EmailService {
/**
* 检查是否为测试模式
*
* @returns 是否为测试模式
* 业务逻辑:
* 1. 检查transporter的options配置
* 2. 判断是否设置了streamTransport选项
* 3. streamTransport为true表示测试模式
* 4. 返回测试模式状态
*
* @returns 是否为测试模式true表示测试模式false表示生产模式
*
* @example
* ```typescript
* if (emailService.isTestMode()) {
* console.log('当前为测试模式,邮件不会真实发送');
* }
* ```
*/
isTestMode(): boolean {
return !!(this.transporter.options as any).streamTransport;
@@ -111,8 +163,30 @@ export class EmailService {
/**
* 发送邮件
*
* 业务逻辑:
* 1. 构建邮件选项(发件人、收件人、主题、内容)
* 2. 检查是否为测试模式
* 3. 测试模式:输出邮件内容到控制台,不真实发送
* 4. 生产模式通过SMTP服务器发送邮件
* 5. 记录发送结果和错误信息
* 6. 返回发送结果状态
*
* @param options 邮件选项
* @returns 发送结果
* @returns 发送结果,包含成功状态、测试模式标识和错误信息
* @throws Error 当邮件发送失败时抛出错误(已捕获并返回在结果中)
*
* @example
* ```typescript
* const result = await emailService.sendEmail({
* to: 'user@example.com',
* subject: '测试邮件',
* html: '<p>邮件内容</p>',
* text: '邮件内容'
* });
* if (result.success) {
* console.log('邮件发送成功');
* }
* ```
*/
async sendEmail(options: EmailOptions): Promise<EmailSendResult> {
try {
@@ -155,8 +229,28 @@ export class EmailService {
/**
* 发送邮箱验证码
*
* 业务逻辑:
* 1. 根据验证码用途选择对应的邮件主题和模板
* 2. 邮箱验证:使用邮箱验证模板
* 3. 密码重置:使用密码重置模板
* 4. 登录验证:使用登录验证模板
* 5. 生成HTML邮件内容和纯文本内容
* 6. 调用sendEmail方法发送邮件
* 7. 返回发送结果
*
* @param options 验证码邮件选项
* @returns 发送结果
* @returns 发送结果,包含成功状态和错误信息
* @throws Error 当邮件发送失败时(已捕获并返回在结果中)
*
* @example
* ```typescript
* const result = await emailService.sendVerificationCode({
* email: 'user@example.com',
* code: '123456',
* nickname: '张三',
* purpose: 'email_verification'
* });
* ```
*/
async sendVerificationCode(options: VerificationEmailOptions): Promise<EmailSendResult> {
const { email, code, nickname, purpose } = options;
@@ -189,9 +283,25 @@ export class EmailService {
/**
* 发送欢迎邮件
*
* 业务逻辑:
* 1. 设置欢迎邮件主题
* 2. 生成包含用户昵称的欢迎邮件模板
* 3. 模板包含游戏特色介绍(建造创造、社交互动、任务挑战)
* 4. 调用sendEmail方法发送邮件
* 5. 返回发送结果
*
* @param email 邮箱地址
* @param nickname 用户昵称
* @returns 发送结果
* @returns 发送结果,包含成功状态和错误信息
* @throws Error 当邮件发送失败时(已捕获并返回在结果中)
*
* @example
* ```typescript
* const result = await emailService.sendWelcomeEmail(
* 'newuser@example.com',
* '新用户'
* );
* ```
*/
async sendWelcomeEmail(email: string, nickname: string): Promise<EmailSendResult> {
const subject = '🎮 欢迎加入 Whale Town';
@@ -453,7 +563,25 @@ export class EmailService {
/**
* 验证邮件服务配置
*
* @returns 验证结果
* 业务逻辑:
* 1. 调用transporter的verify方法测试连接
* 2. 验证SMTP服务器连接是否正常
* 3. 验证认证信息是否有效
* 4. 记录验证结果到日志
* 5. 返回验证结果状态
*
* @returns 验证结果true表示连接成功false表示连接失败
* @throws Error 当连接验证失败时已捕获并返回false
*
* @example
* ```typescript
* const isConnected = await emailService.verifyConnection();
* if (isConnected) {
* console.log('邮件服务连接正常');
* } else {
* console.log('邮件服务连接失败');
* }
* ```
*/
async verifyConnection(): Promise<boolean> {
try {