diff --git a/migrations/0001_initial.sql b/migrations/0001_initial.sql new file mode 100644 index 0000000..ececf9d --- /dev/null +++ b/migrations/0001_initial.sql @@ -0,0 +1,81 @@ +-- cfw-attachment 初始 schema:附件、分类、标签、业务关联、审计 +CREATE TABLE attachments ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + status TEXT NOT NULL, + filename TEXT NOT NULL, + content_type TEXT NOT NULL, + byte_size INTEGER, + checksum_sha256 TEXT, + visibility TEXT NOT NULL DEFAULT 'private', + category_id TEXT, + description TEXT, + object_key TEXT, + etag TEXT, + created_by_user_id TEXT NOT NULL, + updated_by_user_id TEXT NOT NULL, + deleted_by_user_id TEXT, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + deleted_at TEXT +); + +CREATE TABLE attachment_categories ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + name TEXT NOT NULL, + slug TEXT NOT NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + UNIQUE(user_id, slug) +); + +CREATE TABLE attachment_tags ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + name TEXT NOT NULL, + slug TEXT NOT NULL, + created_at TEXT NOT NULL, + updated_at TEXT NOT NULL, + UNIQUE(user_id, slug) +); + +CREATE TABLE attachment_tag_links ( + attachment_id TEXT NOT NULL, + tag_id TEXT NOT NULL, + user_id TEXT NOT NULL, + created_at TEXT NOT NULL, + PRIMARY KEY (attachment_id, tag_id), + FOREIGN KEY (attachment_id) REFERENCES attachments(id), + FOREIGN KEY (tag_id) REFERENCES attachment_tags(id) +); + +CREATE TABLE attachment_links ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + attachment_id TEXT NOT NULL, + owner_type TEXT NOT NULL, + owner_id TEXT NOT NULL, + purpose TEXT NOT NULL, + sort_order INTEGER NOT NULL DEFAULT 0, + created_by_user_id TEXT NOT NULL, + created_at TEXT NOT NULL, + UNIQUE(user_id, owner_type, owner_id, purpose, attachment_id) +); + +CREATE TABLE attachment_audit_events ( + id TEXT PRIMARY KEY, + user_id TEXT NOT NULL, + attachment_id TEXT, + actor_user_id TEXT NOT NULL, + action TEXT NOT NULL, + detail_json TEXT NOT NULL, + created_at TEXT NOT NULL +); + +CREATE INDEX idx_attachments_user_status ON attachments(user_id, status, created_at); +CREATE INDEX idx_attachments_user_category ON attachments(user_id, category_id, created_at); +CREATE INDEX idx_attachment_tags_user_slug ON attachment_tags(user_id, slug); +CREATE INDEX idx_attachment_tag_links_tag ON attachment_tag_links(user_id, tag_id); +CREATE INDEX idx_attachment_links_owner ON attachment_links(user_id, owner_type, owner_id, purpose); +CREATE INDEX idx_attachment_audit_user_attachment ON attachment_audit_events(user_id, attachment_id, created_at); diff --git a/src/env.ts b/src/env.ts new file mode 100644 index 0000000..5d0fbde --- /dev/null +++ b/src/env.ts @@ -0,0 +1,10 @@ +export interface FetcherLike { + fetch(request: Request): Promise; +} + +export interface Env { + AUTH: FetcherLike; + DB: D1Database; + ATTACHMENTS: R2Bucket; + MAX_UPLOAD_BYTES?: string; +} diff --git a/wrangler.jsonc b/wrangler.jsonc new file mode 100644 index 0000000..565cc11 --- /dev/null +++ b/wrangler.jsonc @@ -0,0 +1,40 @@ +{ + "$schema": "node_modules/wrangler/config-schema.json", + "name": "cfw-attachment", + "main": "src/index.ts", + "account_id": "67720b647ff2b55cf37ba3ef9e677083", + "compatibility_date": "2026-06-10", + "compatibility_flags": ["nodejs_compat"], + "routes": [ + { + "pattern": "cfw-attachment.bowong.cc", + "custom_domain": true + } + ], + "observability": { + "enabled": true, + "head_sampling_rate": 0.1 + }, + "services": [ + { + "binding": "AUTH", + "service": "cfw-auth" + } + ], + "d1_databases": [ + { + "binding": "DB", + "database_name": "cfw-attachment", + "database_id": "f8516e33-2902-423c-9a2d-df9974154cda" + } + ], + "r2_buckets": [ + { + "binding": "ATTACHMENTS", + "bucket_name": "cfw-attachment" + } + ], + "vars": { + "MAX_UPLOAD_BYTES": "52428800" + } +}