feat(modules): group-files schema + owner-relative path helpers + repo (§11.6 files C1)
Extends the §11.6 shared-collection machinery to the filesystem-backed `files` blob store (after KV/0053 and docs/0054). - 0055_group_files.sql: widen the group_collections kind CHECK to admit 'files'; add a group-keyed `group_files` metadata table mirroring `files` (0018), CASCADE on group delete. - files_repo: generalize the four path/IO free functions (shard_dir_at / final_path_at / write_atomic_at / read_verify_at) to take an owner-relative dir instead of `app_id`, and make them (plus the cursor helpers) pub(crate). The security-sensitive atomic-write + checksum-on-read mechanics now have a single source shared by the app and group repos. App behavior is unchanged (apps shard at `<app_id>/`). - group_files_repo: FsGroupFilesRepo keyed by group_id, blobs at `<root>/files/groups/<group_id>/<collection>/<id[0:2]>/<id>` — a `groups/` infix disjoint from the per-app subtree, so the existing recursive orphan sweeper covers it with zero change. Schema snapshot blessed (55 migrations); app-files fs tests still green. Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
This commit is contained in:
@@ -239,6 +239,17 @@ table: group_docs
|
||||
created_at: timestamp with time zone NOT NULL default=now()
|
||||
updated_at: timestamp with time zone NOT NULL default=now()
|
||||
|
||||
table: group_files
|
||||
group_id: uuid NOT NULL
|
||||
collection: text NOT NULL
|
||||
id: uuid NOT NULL
|
||||
name: text NOT NULL
|
||||
content_type: text NOT NULL
|
||||
size_bytes: bigint NOT NULL
|
||||
checksum_sha256: text NOT NULL
|
||||
created_at: timestamp with time zone NOT NULL default=now()
|
||||
updated_at: timestamp with time zone NOT NULL default=now()
|
||||
|
||||
table: group_kv_entries
|
||||
group_id: uuid NOT NULL
|
||||
collection: text NOT NULL
|
||||
@@ -522,6 +533,10 @@ indexes on group_docs:
|
||||
idx_group_docs_data_gin: public.group_docs USING gin (data jsonb_path_ops)
|
||||
idx_group_docs_group_collection: public.group_docs USING btree (group_id, collection)
|
||||
|
||||
indexes on group_files:
|
||||
group_files_pkey: public.group_files USING btree (group_id, collection, id)
|
||||
idx_group_files_group_collection: public.group_files USING btree (group_id, collection)
|
||||
|
||||
indexes on group_kv_entries:
|
||||
group_kv_entries_pkey: public.group_kv_entries USING btree (group_id, collection, key)
|
||||
idx_group_kv_entries_group_collection: public.group_kv_entries USING btree (group_id, collection)
|
||||
@@ -727,7 +742,7 @@ constraints on files_trigger_details:
|
||||
[PRIMARY KEY] files_trigger_details_pkey: PRIMARY KEY (trigger_id)
|
||||
|
||||
constraints on group_collections:
|
||||
[CHECK] group_collections_kind_check: CHECK ((kind = ANY (ARRAY['kv'::text, 'docs'::text])))
|
||||
[CHECK] group_collections_kind_check: CHECK ((kind = ANY (ARRAY['kv'::text, 'docs'::text, 'files'::text])))
|
||||
[CHECK] group_collections_owner_exactly_one: CHECK (((group_id IS NULL) <> (app_id IS NULL)))
|
||||
[FOREIGN KEY] group_collections_app_id_fkey: FOREIGN KEY (app_id) REFERENCES apps(id) ON DELETE CASCADE
|
||||
[FOREIGN KEY] group_collections_group_id_fkey: FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE
|
||||
@@ -737,6 +752,10 @@ constraints on group_docs:
|
||||
[FOREIGN KEY] group_docs_group_id_fkey: FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE
|
||||
[PRIMARY KEY] group_docs_pkey: PRIMARY KEY (group_id, collection, id)
|
||||
|
||||
constraints on group_files:
|
||||
[FOREIGN KEY] group_files_group_id_fkey: FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE
|
||||
[PRIMARY KEY] group_files_pkey: PRIMARY KEY (group_id, collection, id)
|
||||
|
||||
constraints on group_kv_entries:
|
||||
[FOREIGN KEY] group_kv_entries_group_id_fkey: FOREIGN KEY (group_id) REFERENCES groups(id) ON DELETE CASCADE
|
||||
[PRIMARY KEY] group_kv_entries_pkey: PRIMARY KEY (group_id, collection, key)
|
||||
@@ -881,3 +900,4 @@ constraints on vars:
|
||||
0052: group collections
|
||||
0053: group kv entries
|
||||
0054: group docs
|
||||
0055: group files
|
||||
|
||||
Reference in New Issue
Block a user