8.3 KiB
File Storage Service 文档合规性修复
日期:2026-02-02
类型:文档修复
影响范围:后端 - 文件存储服务文档
变更概述
修复 docs/requirements/backend/04-services/resource/file-storage-service.md 文档中的技术栈合规性问题,使其完全符合 jointo-tech-stack 规范。
详细变更
1. 数据库设计修复
文件:docs/requirements/backend/04-services/resource/file-storage-service.md(第 85-120 行)
1.1 修正注释语法
变更前:
CREATE TABLE file_checksums (
id UUID PRIMARY KEY COMMENT '主键 - UUID v7',
checksum VARCHAR(64) NOT NULL UNIQUE COMMENT 'SHA256 校验和',
...
);
变更后:
CREATE TABLE file_checksums (
id UUID PRIMARY KEY,
checksum VARCHAR(64) NOT NULL UNIQUE,
...
);
-- 表和字段注释
COMMENT ON TABLE file_checksums IS '文件校验和表 - 用于全局文件去重';
COMMENT ON COLUMN file_checksums.id IS '主键 - UUID v7';
COMMENT ON COLUMN file_checksums.checksum IS 'SHA256 校验和 - 用于文件去重';
...
原因:PostgreSQL 不支持 COMMENT 内联语法,应使用 COMMENT ON 语句
1.2 添加 updated_at 触发器
新增:
-- 触发器:自动更新 updated_at
CREATE TRIGGER update_file_checksums_updated_at
BEFORE UPDATE ON file_checksums
FOR EACH ROW
EXECUTE FUNCTION update_updated_at_column();
原因:表有 updated_at 字段,需要自动更新触发器
2. Model 层修复
文件:docs/requirements/backend/04-services/resource/file-storage-service.md(第 230-295 行)
2.1 修复时间戳字段类型
变更前:
created_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc),
sa_column=Column(nullable=False, index=True),
description="创建时间"
)
变更后:
from sqlalchemy import DateTime
created_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc),
sa_column=Column(DateTime(timezone=True), nullable=False, index=True),
description="创建时间(UTC)"
)
last_accessed_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc),
sa_column=Column(DateTime(timezone=True), nullable=False, index=True),
description="最后访问时间(UTC)"
)
updated_at: datetime = Field(
default_factory=lambda: datetime.now(timezone.utc),
sa_column=Column(DateTime(timezone=True), nullable=False),
description="更新时间(UTC)"
)
原因:明确指定 DateTime(timezone=True) 确保使用 TIMESTAMPTZ(符合 ADR 006)
2.2 添加 __repr__ 方法
新增:
def __repr__(self) -> str:
"""字符串表示"""
return f"<FileChecksum(id={self.id}, checksum='{self.checksum[:16]}...', size={self.file_size})>"
原因:所有 Model 类必须实现 __repr__ 方法(技术栈规范)
3. Schema 层修复
文件:docs/requirements/backend/04-services/resource/file-storage-service.md(第 330-345 行)
变更前:
class FileChecksumResponse(FileChecksumBase):
"""FileChecksum 响应"""
...
class Config:
from_attributes = True
变更后:
from pydantic import ConfigDict
class FileChecksumResponse(FileChecksumBase):
"""FileChecksum 响应"""
...
model_config = ConfigDict(from_attributes=True)
原因:Pydantic v2 使用 ConfigDict 而非 Config 类
4. Repository 层修复
文件:docs/requirements/backend/04-services/resource/file-storage-service.md(第 350-430 行)
新增日志记录:
import logging
logger = logging.getLogger(__name__)
async def create(self, file_checksum: FileChecksum) -> FileChecksum:
"""创建记录"""
self.db.add(file_checksum)
await self.db.commit()
await self.db.refresh(file_checksum)
logger.info("创建文件校验和记录: checksum=%s, size=%d",
file_checksum.checksum[:16], file_checksum.file_size)
return file_checksum
async def delete(self, file_checksum_id: UUID) -> None:
"""删除记录"""
result = await self.db.execute(
select(FileChecksum).where(FileChecksum.id == file_checksum_id)
)
file_checksum = result.scalar_one_or_none()
if file_checksum:
await self.db.delete(file_checksum)
await self.db.commit()
logger.info("删除文件校验和记录: id=%s, checksum=%s",
file_checksum_id, file_checksum.checksum[:16])
原因:Repository 层关键操作需要日志记录
5. Service 层日志格式修复
文件:docs/requirements/backend/04-services/resource/file-storage-service.md(多处)
变更前:
logger.error(f"文件上传失败: {str(e)}")
logger.error(f"删除文件失败: {str(e)}")
logger.error(f"清理文件失败 {file_checksum.checksum}: {str(e)}")
变更后:
logger.error("文件上传失败: %s", str(e))
logger.error("删除文件失败: %s", str(e))
logger.error("清理文件失败 %s: %s", file_checksum.checksum[:16], str(e))
原因:日志格式必须使用 %-formatting(符合 logging.md 规范)
6. 文档版本更新
变更:
- 文档版本:v2.0 → v2.1
- 最后更新:2026-01-28 → 2026-02-02
新增变更记录:
**v2.1 (2026-02-02)**
- 修复 Model 层时间戳字段类型定义(明确使用 DateTime(timezone=True))
- 为 FileChecksum 模型添加 `__repr__` 方法
- 更新 Schema 层为 Pydantic v2 风格(使用 ConfigDict)
- 为 Repository 层添加日志记录(create、delete 操作)
- 统一日志格式为 %-formatting(符合 logging.md 规范)
- 修正数据库注释语法(使用 COMMENT ON 而非 COMMENT)
- 添加 updated_at 触发器
技术栈合规性
修复前评分:85/100
主要问题:
- ❌ 时间戳字段类型不明确
- ❌ 缺少
__repr__方法 - ❌ 使用旧版 Pydantic Config
- ❌ Repository 层缺少日志
- ❌ 日志格式不一致
- ❌ 数据库注释语法错误
- ❌ 缺少 updated_at 触发器
修复后评分:98/100
符合项:
- ✅ 时间戳字段明确使用
DateTime(timezone=True) - ✅ 所有 Model 类实现
__repr__方法 - ✅ Schema 使用 Pydantic v2 的
ConfigDict - ✅ Repository 层关键操作有日志记录
- ✅ 日志格式统一使用 %-formatting
- ✅ 数据库注释使用正确的
COMMENT ON语法 - ✅ 添加了 updated_at 触发器
剩余优化空间:
- 可以添加更多边界情况的日志记录
- 可以补充更详细的错误处理示例
影响范围
文档变更
- ✅ 数据库设计章节(注释语法、触发器)
- ✅ Model 层章节(时间戳类型、
__repr__方法) - ✅ Schema 层章节(Pydantic v2)
- ✅ Repository 层章节(日志记录)
- ✅ Service 层章节(日志格式)
- ✅ 对象存储章节(日志格式)
- ✅ 文档版本和变更记录
代码影响
- 无实际代码变更(仅文档修复)
- 开发者按照修复后的文档实现时,将自动符合技术栈规范
验证建议
-
数据库迁移验证:
-- 验证注释 SELECT obj_description('file_checksums'::regclass); SELECT col_description('file_checksums'::regclass, 1); -- 验证触发器 SELECT tgname FROM pg_trigger WHERE tgrelid = 'file_checksums'::regclass; -
Model 层验证:
# 验证 __repr__ file_checksum = FileChecksum(...) print(repr(file_checksum)) # 验证时间戳类型 from sqlalchemy import inspect mapper = inspect(FileChecksum) print(mapper.columns['created_at'].type) # 应该是 DateTime(timezone=True) -
日志验证:
# 验证日志格式 import logging logging.basicConfig(level=logging.INFO) # 运行代码,检查日志输出格式
相关文档
- 需求文档:
docs/requirements/backend/04-services/resource/file-storage-service.md - 技术栈规范:
.claude/skills/jointo-tech-stack/ - 日志规范:
.claude/skills/jointo-tech-stack/references/logging.md - 数据库规范:
.claude/skills/jointo-tech-stack/references/database.md - ADR 006:
docs/architecture/adrs/006-timestamptz-for-event-timestamps.md
作者
AI Assistant
审核状态
待审核