1445043649
|
a40df03521
|
feat(persistence): WorkspaceRepository + 23 unit tests
新建 backend/packages/harness/deerflow/persistence/workspace/sql.py,方法:
- create(name, slug, owner_id, *, workspace_id=None, status='active')
UUID v4 自动生成;强校验 slug 格式(regex ^[a-z0-9](-?[a-z0-9])*\$ + 3-32
长度)+ slug 黑名单(25 个保留字)+ status 枚举
- get(workspace_id, *, user_id=AUTO) JOIN workspace_memberships 做成员校验;
user_id=None 显式 bypass(迁移/admin)
- get_by_slug(slug) 不带成员校验(path-based routing 用:先 slug→workspace_id
再到 route handler 里查成员)
- list_by_user(*, user_id=AUTO) 列 user 所属所有 workspace
- update_status / delete platform-admin 操作,不带成员校验
WorkspaceValidationError 自定义异常(slug 格式 / 黑名单 / status)。
23 test 覆盖:
- CRUD smoke + get_by_slug missing
- 重复 slug → IntegrityError
- 8 个 invalid slug pattern(短/长/大写/空格/破折号位置/连续破折号/下划线)
- 6 个 blacklisted slug
- status 状态机 + 非法值拒绝
- delete CASCADE 到 memberships(SQLite FK PRAGMA 已开启)
- get/list 成员过滤(user-A 看不见 user-B 的 workspace)
- list user_id=None 显式 bypass
全部在 SQLite ephemeral DB 上跑(< 1s)。partial-unique 双驱动验证留给 T3.8。
Stage 0 PR3 T3.4 + T3.5。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-12 21:11:28 +08:00 |
|
1445043649
|
8323bf68d2
|
feat(persistence): add WorkspaceRow ORM model
新建 backend/packages/harness/deerflow/persistence/workspace/{__init__.py, model.py}
+ 在 persistence.models.__init__ 注册 WorkspaceRow 让 Base.metadata.create_all
能自动建表。
WorkspaceRow schema(来自 workspace-schema-design §2.1 锁定版):
- id String(36) PK(UUID v4 字符串,与 users.id 对齐)
- name String(64) NOT NULL(显示名)
- slug String(32) NOT NULL UNIQUE(URL 标识,正则 ^[a-z0-9](-?[a-z0-9])*$)
- status String(16) default 'active'(active/suspended/deleted)
- owner_id String(36) FK users.id ON DELETE RESTRICT(删 owner 时阻拦,
必须先转让所有权)
- created_at / updated_at DateTime(tz=True)
每列 + 表都带中文 comment(沿用 commit 9ff79055 的 convention)。
Stage 0 PR3 T3.3。
Co-Authored-By: Claude Opus 4.7 (1M context) <noreply@anthropic.com>
|
2026-05-12 21:07:30 +08:00 |
|