feat: add attachment storage bindings and schema
Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
81
migrations/0001_initial.sql
Normal file
81
migrations/0001_initial.sql
Normal 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
10
src/env.ts
Normal 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
40
wrangler.jsonc
Normal 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"
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user