浅念
8e870de9d7
fix(storage): correct presign content-type claim; head returns contentType
...
Spec review (live negative test) found s3-request-presigner unconditionally
unsigns content-type: header-less PUT returns 200, so the previous docblock
claiming signature enforcement was a false guarantee. Content-Type is now
documented as convention-only; head() returns contentType so the complete
step (Task 19) can verify it server-side against the session declaration.
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 20:35:08 +08:00
浅念
37f4b3e11f
feat(storage): storage port and minio adapter with forbid-overwrite semantics
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 20:25:18 +08:00
浅念
59464bd73d
feat(api): photo, upload, outbox schema
...
Task 10: photos/photo_variants/upload_sessions/photo_jobs/outbox_events
on the CN schema (flat string FKs, no Prisma relations); migration
20260917120827_photo_upload_domain rewritten to utf8mb4_0900_bin per the
固化 collation recipe; reset.ts table order extended; one semantics e2e
case for photo_jobs @@unique([photoId, type]) and the upload_sessions
A03 idempotency anchor @@unique([userId, clientTaskId]).
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 20:11:26 +08:00
浅念
a99b8f200b
feat(api): album domain schema
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 20:05:09 +08:00
浅念
2801e4f158
feat(api): identity and audit schema with mysql semantics tests
...
packages/db-cn:@photo/db-cn(prisma 5.22,api/worker 共享 client)+
schema(users/sessions/audit_logs,DateTime(6)、cuid、账号唯一)。
迁移 SQL 手工改写表级 collation 为 utf8mb4_0900_bin——Prisma 生成的 MySQL
DDL 固定 utf8mb4_unicode_ci 会覆盖库级 bin collation,账号/token 大小写
敏感语义依赖它(后续迁移需同样复核)。services/api:@Global PrismaModule
(PrismaService 封装 $connect/$disconnect,池上限仍由
DATABASE_URL_CN ?connection_limit=10 承担);reset.ts 落地 FK 包裹式
TRUNCATE;e2e 语义复核 4 例(UTC 往返/大小写敏感/audit Json+actor/
session FK Restrict P2003)。pnpm 10 未拦截 prisma engines(平台包内置),
无需 onlyBuiltDependencies。
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 19:51:56 +08:00
浅念
7d250ec342
feat(api): cn-app skeleton, toolchain, env loading convention
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 19:14:41 +08:00
浅念
f77ab5ae4b
feat(contracts): outbox event contract types
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 18:18:06 +08:00
浅念
b4ee92de96
docs(contracts): locale fallback wording on public endpoints
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 18:11:21 +08:00
浅念
f6448bd006
fix(contracts): quality review fixes for p1a contracts
...
- status enum active|archived -> active|offline (align requirement docs)
- UploadSessionState session-state semantics documented (no failed state)
- maxLength: clientTaskId 128 / filename 255 / cursor 512
- PublicPhoto width/height required (layout placeholders)
- reusable Unauthorized/InternalError responses (hybrid with inline op-specific codes)
- PublicAlbum.translations -> translation (single resolved object)
- contentType enum [jpeg/png/heic] (heic provisional pending G2)
- minLength 1 on title/name; publicToken pattern ^[0-9a-z]{20,32}$
- CursorPageMeta hasMore/nextCursor invariant documented
- public locale: silent fallback to defaultLocale (tech doc section 11)
- plan: upload_sessions state comment aligned; P1b adds management photo list + account lookup endpoints
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 18:06:54 +08:00
浅念
1dae00eaef
feat(contracts): p1a endpoint contracts
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 17:31:11 +08:00
浅念
656498d748
feat(contracts): openapi base, error codes, type generation
...
Co-Authored-By: Claude Code <noreply@anthropic.com >
2026-09-17 17:04:12 +08:00