feat: add attachment storage bindings and schema

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
Claude
2026-07-02 07:33:38 -07:00
parent faaa66490b
commit fb7afb69f3
3 changed files with 131 additions and 0 deletions

View File

@@ -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);

10
src/env.ts Normal file
View File

@@ -0,0 +1,10 @@
export interface FetcherLike {
fetch(request: Request): Promise<Response>;
}
export interface Env {
AUTH: FetcherLike;
DB: D1Database;
ATTACHMENTS: R2Bucket;
MAX_UPLOAD_BYTES?: string;
}

40
wrangler.jsonc Normal file
View File

@@ -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"
}
}