You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 

9.8 KiB

文件夹服务集成完成

日期:2026-02-04
类型:集成完成
影响范围:后端 - 文件夹服务(路由注册、定时任务、测试配置)


变更概述

完成文件夹服务的最终集成工作,包括公开 API 路由注册、Celery 定时任务配置和测试数据库配置。


变更内容

1. 公开 API 路由注册

文件server/app/main.py

变更

# 注册公开路由(无需认证)
from app.api.v1.public.shared_folders import router as public_shared_folders_router
app.include_router(
    public_shared_folders_router,
    prefix="/api/v1",
    tags=["公开分享"]
)

说明

  • 注册公开分享链接访问接口
  • 无需认证即可访问
  • 路由前缀:/api/v1/public/shared/f/{token}

2. Celery 任务配置

文件server/app/core/celery_app.py

2.1 任务模块注册

变更

celery_app = Celery(
    "jointo",
    broker=settings.CELERY_BROKER_URL,
    backend=settings.CELERY_RESULT_BACKEND,
    include=[
        "app.tasks.ai_tasks",
        "app.tasks.export_tasks",
        "app.tasks.credit_tasks",
        "app.tasks.cleanup_files",
        "app.tasks.folder_export_tasks",      # 新增
        "app.tasks.folder_cleanup_tasks",     # 新增
    ]
)

2.2 任务路由配置

变更

task_routes={
    "app.tasks.ai_tasks.*": {"queue": "ai"},
    "app.tasks.export_tasks.*": {"queue": "export"},
    "app.tasks.folder_export_tasks.*": {"queue": "export"},        # 新增
    "app.tasks.folder_cleanup_tasks.*": {"queue": "maintenance"},  # 新增
},

说明

  • 导出任务路由到 export 队列
  • 清理任务路由到 maintenance 队列

2.3 定时任务配置

变更

beat_schedule={
    # ... 其他定时任务 ...
    
    # 每天凌晨 2 点清理过期的导出文件
    "cleanup-expired-exports": {
        "task": "app.tasks.folder_cleanup_tasks.cleanup_expired_exports",
        "schedule": crontab(hour=2, minute=0),
    },
    # 每天凌晨 3 点清理过期的分享链接
    "cleanup-expired-share-links": {
        "task": "app.tasks.folder_cleanup_tasks.cleanup_expired_share_links",
        "schedule": crontab(hour=3, minute=0),
    },
    # 每月 1 号凌晨 4 点清理撤销的分享链接(30天前)
    "cleanup-revoked-shares": {
        "task": "app.tasks.folder_cleanup_tasks.cleanup_revoked_shares",
        "schedule": crontab(day_of_month=1, hour=4, minute=0),
    },
}

定时任务说明

任务名称 执行时间 功能 队列
cleanup-expired-exports 每天 02:00 清理过期的导出文件(24小时后) maintenance
cleanup-expired-share-links 每天 03:00 自动撤销过期的分享链接 maintenance
cleanup-revoked-shares 每月 1 号 04:00 物理删除已撤销 30 天的分享记录 maintenance

3. 测试配置更新

文件

  • tests/unit/repositories/test_folder_share_repository.py
  • tests/unit/repositories/test_folder_export_repository.py

变更

  • 将所有测试方法的 async_session 参数改为 db_session
  • 删除底部的 TODO fixture(使用 conftest.py 中的统一配置)

示例

# 变更前
async def test_create_user_share(self, async_session):
    repo = FolderShareRepository(async_session)

# 变更后
async def test_create_user_share(self, db_session):
    repo = FolderShareRepository(db_session)

说明

  • 使用 server/tests/conftest.py 中定义的 db_session fixture
  • 自动处理事务回滚,确保测试隔离
  • 无需额外配置测试数据库

部署说明

1. 重启服务

# 重启 FastAPI 应用(加载新路由)
docker restart jointo-server-app

# 重启 Celery Beat(加载新定时任务)
docker restart jointo-server-celery-beat

# 重启 Celery Worker(加载新任务模块)
docker restart jointo-server-celery-export

2. 验证路由注册

# 访问 API 文档
curl http://localhost:8000/api/docs

# 查找公开分享接口
# GET /api/v1/public/shared/f/{token}
# GET /api/v1/public/shared/f/{token}/info
# POST /api/v1/public/shared/f/{token}/verify-password

3. 验证定时任务

# 进入 Celery Beat 容器
docker exec -it jointo-server-celery-beat bash

# 查看定时任务配置
celery -A app.core.celery_app inspect scheduled

# 手动触发清理任务(测试)
docker exec jointo-server-app python -c "
from app.tasks.folder_cleanup_tasks import cleanup_expired_exports
result = cleanup_expired_exports.apply()
print(result.get())
"

测试验证

1. 运行单元测试

# 运行所有文件夹相关测试
docker exec jointo-server-app pytest tests/unit/repositories/test_folder_*.py -v

# 运行特定测试
docker exec jointo-server-app pytest tests/unit/repositories/test_folder_share_repository.py::TestFolderShareRepository::test_create_user_share -v

2. 测试公开 API

# 测试访问分享链接(无密码)
curl http://localhost:8000/api/v1/public/shared/f/test_token_123

# 测试访问分享链接(有密码)
curl "http://localhost:8000/api/v1/public/shared/f/test_token_123?password=secret"

# 测试获取分享信息
curl http://localhost:8000/api/v1/public/shared/f/test_token_123/info

3. 测试 Celery 任务

# 测试导出任务
docker exec jointo-server-app python -c "
from app.tasks.folder_export_tasks import process_folder_export
result = process_folder_export.apply_async(args=['test_job_id'])
print(f'Task ID: {result.id}')
"

# 查看任务状态
docker exec jointo-server-app python -c "
from celery.result import AsyncResult
from app.core.celery_app import celery_app
result = AsyncResult('task_id', app=celery_app)
print(f'Status: {result.status}')
print(f'Result: {result.result}')
"

架构图

文件夹服务完整架构

┌─────────────────────────────────────────────────────────────┐
│                      文件夹服务架构                          │
└─────────────────────────────────────────────────────────────┘

┌──────────────┐     ┌──────────────┐     ┌──────────────┐
│  认证 API    │     │  公开 API    │     │  Celery 任务  │
│              │     │              │     │              │
│ /folders     │     │ /public/     │     │ - 导出任务   │
│ /shares      │     │  shared/f/   │     │ - 清理任务   │
│ /exports     │     │  {token}     │     │              │
└──────┬───────┘     └──────┬───────┘     └──────┬───────┘
       │                    │                    │
       └────────────────────┼────────────────────┘
                            │
                    ┌───────▼────────┐
                    │  Service 层    │
                    │                │
                    │ - FolderService│
                    └───────┬────────┘
                            │
                    ┌───────▼────────┐
                    │ Repository 层  │
                    │                │
                    │ - FolderRepo   │
                    │ - ShareRepo    │
                    │ - ExportRepo   │
                    └───────┬────────┘
                            │
                    ┌───────▼────────┐
                    │  数据库层      │
                    │                │
                    │ - folders      │
                    │ - folder_shares│
                    │ - folder_exports│
                    └───────┬────────┘
                            │
                    ┌───────▼────────┐
                    │  对象存储      │
                    │                │
                    │ - 阿里云 OSS   │
                    │ - 导出文件     │
                    └────────────────┘

相关文档


总结

本次变更完成了文件夹服务的最终集成:

  1. 公开 API 路由 - 注册到 FastAPI 应用
  2. Celery 任务模块 - 注册到 Celery 应用
  3. 任务路由配置 - 分配到正确的队列
  4. 定时任务配置 - 配置清理任务调度
  5. 测试配置更新 - 使用统一的测试 fixture

文件夹服务现已完全集成到项目中,可以正常运行。所有功能已就绪:

  • 文件夹 CRUD 操作
  • 用户分享和链接分享
  • 异步导出任务
  • 定时清理任务
  • 公开分享链接访问
  • 阿里云 OSS 集成
  • 单元测试覆盖

下一步建议

  1. 实现文件夹内容收集逻辑(导出任务中的 TODO)
  2. 添加集成测试(端到端测试)
  3. 添加性能测试(大文件夹导出)
  4. 配置监控和告警(任务失败通知)