Add shared file storage with folder tree, permissions, and file manager UI

New document hub for centralized file storage — replaces scattered
drives and USB sticks for non-technical SMBs. Three new tables:
storage_folder (nested hierarchy), storage_folder_permission (role
and user-level access control), storage_file.

Backend: folder CRUD with nested paths, file upload/download via
signed URLs, permission checks (view/edit/admin with inheritance
from parent folders), public/private toggle, breadcrumb navigation,
file search.

Frontend: two-panel file manager — collapsible folder tree on left,
icon grid view on right. Folder icons by type, file size display,
upload button, context menu for download/delete. Breadcrumb nav.
Files sidebar link added.
This commit is contained in:
Ryan Moon
2026-03-29 15:31:20 -05:00
parent d36c6f7135
commit 0f6cc104d2
13 changed files with 1093 additions and 1 deletions

View File

@@ -0,0 +1,32 @@
CREATE TYPE "storage_folder_access" AS ENUM ('view', 'edit', 'admin');
CREATE TABLE "storage_folder" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"parent_id" uuid,
"name" varchar(255) NOT NULL,
"path" text NOT NULL DEFAULT '/',
"created_by" uuid REFERENCES "user"("id"),
"is_public" boolean NOT NULL DEFAULT true,
"created_at" timestamp with time zone NOT NULL DEFAULT now(),
"updated_at" timestamp with time zone NOT NULL DEFAULT now()
);
CREATE TABLE "storage_folder_permission" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"folder_id" uuid NOT NULL REFERENCES "storage_folder"("id") ON DELETE CASCADE,
"role_id" uuid REFERENCES "role"("id"),
"user_id" uuid REFERENCES "user"("id"),
"access_level" "storage_folder_access" NOT NULL DEFAULT 'view',
"created_at" timestamp with time zone NOT NULL DEFAULT now()
);
CREATE TABLE "storage_file" (
"id" uuid PRIMARY KEY DEFAULT gen_random_uuid() NOT NULL,
"folder_id" uuid NOT NULL REFERENCES "storage_folder"("id") ON DELETE CASCADE,
"filename" varchar(255) NOT NULL,
"path" varchar(1000) NOT NULL,
"content_type" varchar(100) NOT NULL,
"size_bytes" integer NOT NULL,
"uploaded_by" uuid REFERENCES "user"("id"),
"created_at" timestamp with time zone NOT NULL DEFAULT now()
);

View File

@@ -155,6 +155,13 @@
"when": 1774810000000,
"tag": "0021_remove_company_scoping",
"breakpoints": true
},
{
"idx": 22,
"version": "7",
"when": 1774820000000,
"tag": "0022_shared_file_storage",
"breakpoints": true
}
]
}