{"_id":"@dbs-portal/module-file-management","name":"@dbs-portal/module-file-management","dist-tags":{"latest":"1.0.0"},"versions":{"1.0.0":{"name":"@dbs-portal/module-file-management","version":"1.0.0","description":"File management module with cloud storage, file browser, and advanced file operations","type":"module","main":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js","types":"./dist/index.d.ts"}},"scripts":{"build":"tsc && vite build","dev":"vite build --watch","type-check":"tsc --noEmit","lint":"eslint src --ext .ts,.tsx","lint:fix":"eslint src --ext .ts,.tsx --fix","test":"vitest","test:ui":"vitest --ui","clean":"rimraf dist"},"dependencies":{"@dbs-portal/core-shared":"1.0.0","@dbs-portal/core-api":"1.0.0","@tanstack/react-query":"^5.0.0","antd":"^5.0.0","react":"^18.0.0","react-dom":"^18.0.0","date-fns":"^3.0.0","lodash-es":"^4.17.21","zod":"^3.22.0","mime-types":"^2.1.35","file-saver":"^2.0.5","react-dropzone":"^14.2.3","react-image-gallery":"^1.3.0","react-pdf":"^7.5.1","react-player":"^2.13.0"},"devDependencies":{"@dbs-portal/tool-build":"1.0.0","@types/react":"^18.0.0","@types/react-dom":"^18.0.0","@types/lodash-es":"^4.17.0","@types/mime-types":"^2.1.4","@types/file-saver":"^2.0.7","typescript":"^5.0.0","vite":"^5.0.0","vitest":"^1.0.0","eslint":"^8.0.0","rimraf":"^5.0.0"},"peerDependencies":{"react":"^18.0.0","react-dom":"^18.0.0"},"keywords":["dbs-portal","file-management","cloud-storage","file-browser","upload","download","react","typescript"],"author":{"name":"DBS Portal Team"},"license":"MIT","repository":{"type":"git","url":"git+https://github.com/devboost-solutions/dbs-portal.git","directory":"packages/modules/file-management"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"bugs":{"url":"https://github.com/your-org/dbs-portal/issues"},"homepage":"https://github.com/your-org/dbs-portal#readme","_id":"@dbs-portal/module-file-management@1.0.0","gitHead":"61a23904a481b624f3e8ed7abb6c944ecfeaca7b","_nodeVersion":"20.19.0","_npmVersion":"10.8.2","dist":{"integrity":"sha512-lJ5nfQTuWz/yfUVlhv4W0uYIvJ5bI0j3wVTNBLW3iWyDlACvGW5MvfiEoYTUrnejequS+xECA3W6OEZCkEMQKA==","shasum":"54834670c481cc96002751dcf2db2bc280ff5482","tarball":"https://registry.npmjs.org/@dbs-portal/module-file-management/-/module-file-management-1.0.0.tgz","fileCount":56,"unpackedSize":1238260,"signatures":[{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEQCIH0FfkFxIq4vM8o/ZsqmAq4c3POhKWbY4Qa+HdtFEUjvAiAKYc7F1wMd2YVyZbtR8yGg4xto8OU8HoAQrb3F9PKMGA=="}]},"_npmUser":{"name":"longvq","email":"vqlong1604@gmail.com"},"directories":{},"maintainers":[{"name":"longvq","email":"vqlong1604@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/module-file-management_1.0.0_1754218660376_0.17383025562254506"},"_hasShrinkwrap":false}},"time":{"created":"2025-08-03T10:57:40.305Z","1.0.0":"2025-08-03T10:57:40.598Z","modified":"2025-08-03T10:57:40.927Z"},"maintainers":[{"name":"longvq","email":"vqlong1604@gmail.com"}],"description":"File management module with cloud storage, file browser, and advanced file operations","homepage":"https://github.com/your-org/dbs-portal#readme","keywords":["dbs-portal","file-management","cloud-storage","file-browser","upload","download","react","typescript"],"repository":{"type":"git","url":"git+https://github.com/devboost-solutions/dbs-portal.git","directory":"packages/modules/file-management"},"author":{"name":"DBS Portal Team"},"bugs":{"url":"https://github.com/your-org/dbs-portal/issues"},"license":"MIT","readme":"# File Management Module\n\nA comprehensive file management system for DBS Portal with cloud storage abstraction, advanced file browser, drag-and-drop upload, multi-format preview, and enterprise-grade file operations.\n\n## Features\n\n### 🗂️ Advanced File Browser\n- **Multiple View Modes**: Grid, list, and tree views with customizable layouts\n- **Smart Filtering**: Search by name, category, type, size, date, and tags\n- **Bulk Operations**: Select multiple files for copy, move, delete, and share operations\n- **Folder Navigation**: Hierarchical folder structure with breadcrumb navigation\n- **Real-time Updates**: Live file list updates with React Query caching\n\n### ☁️ Cloud Storage Support\n- **Multi-Provider Support**: Local, AWS S3, Azure Blob Storage, and extensible architecture\n- **Storage Abstraction**: Unified API across different storage providers\n- **Automatic Failover**: Seamless switching between storage providers\n- **Configuration Management**: Easy setup and configuration for cloud providers\n\n### ☁️ Cloud Storage Abstraction\n- **Multi-Provider Support**: Local, AWS S3, Azure Blob, Google Cloud, Cloudinary\n- **Storage Engine**: Pluggable architecture for custom storage providers\n- **Automatic Failover**: Redundancy and backup strategies\n- **Performance Optimization**: Intelligent caching and CDN integration\n\n### 📤 Drag-and-Drop Upload\n- **Modern Upload Experience**: Drag-and-drop with progress tracking\n- **Batch Processing**: Multiple file uploads with individual progress\n- **File Validation**: Size, type, and security validation\n- **Auto-categorization**: Intelligent file categorization based on MIME types\n- **Upload Settings**: Configurable access levels, tags, and processing options\n\n### 👁️ Multi-Format File Viewer\n- **Image Preview**: High-quality image viewing with zoom and pan\n- **Video/Audio Player**: Integrated media player with controls\n- **Document Viewer**: PDF and text file preview\n- **Metadata Display**: Comprehensive file information and EXIF data\n- **Fullscreen Mode**: Immersive viewing experience\n\n### 🔄 Version Control\n- **File Versioning**: Track changes with detailed changelog\n- **Version Comparison**: Compare different versions\n- **Rollback Support**: Restore previous versions\n- **Active Version Management**: Control which version is live\n\n### 🔗 File Sharing & Permissions\n- **Granular Access Control**: Public, private, restricted, internal levels\n- **Secure Sharing**: Time-limited links with password protection\n- **Download Limits**: Control access frequency and duration\n- **User/Role Permissions**: Fine-grained access management\n\n### 📊 Analytics & Monitoring\n- **Usage Statistics**: Download counts, view metrics, popularity scores\n- **Storage Analytics**: Space usage, category breakdown, trends\n- **Performance Monitoring**: Upload/download speeds, error rates\n- **Audit Trail**: Complete activity logging\n\n## Installation\n\n```bash\nnpm install @dbs-portal/module-file-management\n```\n\n## Dependencies\n\n### Required\n- `@tanstack/react-query` - Data fetching and caching\n- `antd` - UI components\n- `react` - React framework\n- `date-fns` - Date formatting\n- `lodash-es` - Utility functions\n- `zod` - Schema validation\n\n### Optional (Enhanced Features)\n- `react-dropzone` - Enhanced drag-and-drop (fallback available)\n- `react-image-gallery` - Image gallery viewer\n- `react-pdf` - PDF preview support\n- `react-player` - Video/audio player\n- `file-saver` - File download utilities\n- `mime-types` - MIME type detection\n\n## Quick Start\n\n### 1. Complete File Manager\n\n```tsx\nimport { FileManager } from '@dbs-portal/module-file-management'\n\nfunction FileManagementPage() {\n  return (\n    <FileManager\n      viewMode=\"list\"\n      selectionMode=\"multiple\"\n      showToolbar\n      showSidebar\n      showPreview\n      allowUpload\n      allowCreateFolder\n      onFileSelect={(file) => console.log('Selected:', file)}\n    />\n  )\n}\n```\n\n### 2. File Browser Only\n\n```tsx\nimport { FileBrowser } from '@dbs-portal/module-file-management'\n\nfunction FileBrowserPage() {\n  const [selectedFiles, setSelectedFiles] = useState([])\n\n  return (\n    <FileBrowser\n      parentId=\"folder-123\"\n      viewMode=\"grid\"\n      selectionMode=\"multiple\"\n      allowUpload\n      allowDelete\n      allowShare\n      onFileSelect={(file) => console.log('File selected:', file)}\n      onSelectionChange={setSelectedFiles}\n    />\n  )\n}\n```\n\n### 3. File Upload Component\n\n```tsx\nimport { FileUploader } from '@dbs-portal/module-file-management'\n\nfunction UploadPage() {\n  return (\n    <FileUploader\n      parentId=\"folder-123\"\n      multiple\n      accept=\"image/*,application/pdf\"\n      maxSize={50 * 1024 * 1024} // 50MB\n      maxFiles={10}\n      autoUpload={false}\n      showProgress\n      onUploadComplete={(files) => {\n        console.log('Uploaded files:', files)\n      }}\n      onUploadError={(error) => {\n        console.error('Upload failed:', error)\n      }}\n    />\n  )\n}\n```\n\n### 4. File Viewer\n\n```tsx\nimport { FileViewer, useFile } from '@dbs-portal/module-file-management'\n\nfunction FileViewerPage({ fileId }: { fileId: string }) {\n  const { data: file, isLoading } = useFile(fileId)\n\n  if (isLoading || !file) return <div>Loading...</div>\n\n  return (\n    <FileViewer\n      file={file}\n      showMetadata\n      showActions\n      allowDownload\n      allowShare\n      allowEdit\n      onEdit={(file) => console.log('Edit file:', file)}\n      onShare={(file) => console.log('Share file:', file)}\n      onDownload={(file) => console.log('Download file:', file)}\n    />\n  )\n}\n```\n\n### 5. Cloud Storage Configuration\n\n```tsx\nimport {\n  storageEngine,\n  S3StorageProvider,\n  AzureBlobStorageProvider\n} from '@dbs-portal/module-file-management'\n\n// Configure AWS S3\nstorageEngine.registerS3Provider({\n  provider: 'aws-s3',\n  region: 'us-east-1',\n  bucket: 'my-app-files',\n  accessKey: process.env.AWS_ACCESS_KEY_ID,\n  secretKey: process.env.AWS_SECRET_ACCESS_KEY,\n  maxFileSize: 100 * 1024 * 1024, // 100MB\n  allowedMimeTypes: ['image/*', 'application/pdf', 'text/*'],\n  thumbnailSizes: [\n    { width: 150, height: 150 },\n    { width: 300, height: 300 }\n  ],\n  previewFormats: ['image/*', 'application/pdf']\n})\n\n// Configure Azure Blob Storage\nstorageEngine.registerAzureProvider({\n  provider: 'azure-blob',\n  bucket: 'files',\n  accessKey: 'account-name:connection-string',\n  secretKey: process.env.AZURE_STORAGE_KEY,\n  maxFileSize: 100 * 1024 * 1024,\n  allowedMimeTypes: ['*/*'],\n  thumbnailSizes: [{ width: 150, height: 150 }],\n  previewFormats: ['image/*', 'application/pdf']\n})\n\n// Set default provider\nstorageEngine.setDefaultProvider('aws-s3')\n```\n\n### 6. Using Hooks for Custom Components\n\n```tsx\nimport {\n  useFiles,\n  useUploadFile,\n  useDeleteFile,\n  useStorageUsage\n} from '@dbs-portal/module-file-management'\n\nfunction CustomFileComponent() {\n  const { data: filesResponse, isLoading } = useFiles(1, 20, {\n    category: 'image',\n    sortBy: 'createdAt',\n    sortOrder: 'desc'\n  })\n\n  const uploadMutation = useUploadFile()\n  const deleteMutation = useDeleteFile()\n  const { data: storageUsage } = useStorageUsage()\n\n  const handleUpload = async (file: File) => {\n    try {\n      const uploadedFile = await uploadMutation.mutateAsync({\n        request: {\n          file,\n          category: 'image',\n          accessLevel: 'private',\n          generateThumbnail: true\n        }\n      })\n      console.log('File uploaded:', uploadedFile)\n    } catch (error) {\n      console.error('Upload failed:', error)\n    }\n  }\n\n  const handleDelete = async (fileId: string) => {\n    try {\n      await deleteMutation.mutateAsync(fileId)\n      console.log('File deleted')\n    } catch (error) {\n      console.error('Delete failed:', error)\n    }\n  }\n\n  return (\n    <div>\n      <div>Storage Used: {storageUsage?.usedSpace} bytes</div>\n      <div>Total Files: {filesResponse?.meta?.total}</div>\n      \n      {filesResponse?.data?.map(file => (\n        <div key={file.id}>\n          <span>{file.name}</span>\n          <button onClick={() => handleDelete(file.id)}>Delete</button>\n        </div>\n      ))}\n      \n      <input\n        type=\"file\"\n        onChange={(e) => {\n          const file = e.target.files?.[0]\n          if (file) handleUpload(file)\n        }}\n      />\n    </div>\n  )\n}\n```\n\n## API Reference\n\n### Components\n\n#### FileManager\nComplete file management interface with sidebar, toolbar, and preview.\n\n```tsx\ninterface FileManagerProps {\n  initialParentId?: string\n  viewMode?: 'grid' | 'list' | 'tree'\n  selectionMode?: 'single' | 'multiple' | 'none'\n  showToolbar?: boolean\n  showSidebar?: boolean\n  showPreview?: boolean\n  allowUpload?: boolean\n  allowCreateFolder?: boolean\n  onFileSelect?: (file: FileEntity) => void\n  className?: string\n}\n```\n\n#### FileBrowser\nAdvanced file browser with filtering and bulk operations.\n\n```tsx\ninterface FileBrowserProps {\n  parentId?: string\n  viewMode?: 'grid' | 'list' | 'tree'\n  selectionMode?: 'single' | 'multiple' | 'none'\n  allowUpload?: boolean\n  allowCreateFolder?: boolean\n  allowDelete?: boolean\n  allowRename?: boolean\n  allowMove?: boolean\n  allowShare?: boolean\n  filters?: Partial<FileSearchFilters>\n  onFileSelect?: (file: FileEntity) => void\n  onFileDoubleClick?: (file: FileEntity) => void\n  onFolderSelect?: (folder: FolderEntity) => void\n  onSelectionChange?: (selectedFiles: FileEntity[]) => void\n  className?: string\n}\n```\n\n#### FileUploader\nDrag-and-drop file uploader with progress tracking.\n\n```tsx\ninterface FileUploaderProps {\n  parentId?: string\n  multiple?: boolean\n  accept?: string\n  maxSize?: number\n  maxFiles?: number\n  autoUpload?: boolean\n  showProgress?: boolean\n  showPreview?: boolean\n  onUploadStart?: (files: File[]) => void\n  onUploadProgress?: (progress: FileUploadProgress[]) => void\n  onUploadComplete?: (files: FileEntity[]) => void\n  onUploadError?: (error: string, file?: File) => void\n  className?: string\n}\n```\n\n#### FileViewer\nMulti-format file viewer with metadata and actions.\n\n```tsx\ninterface FileViewerProps {\n  file: FileEntity\n  showMetadata?: boolean\n  showActions?: boolean\n  allowDownload?: boolean\n  allowShare?: boolean\n  allowEdit?: boolean\n  onClose?: () => void\n  onEdit?: (file: FileEntity) => void\n  onShare?: (file: FileEntity) => void\n  onDownload?: (file: FileEntity) => void\n  className?: string\n}\n```\n\n### Hooks\n\n#### File CRUD Operations\n- `useFiles(page, pageSize, filters)` - Fetch paginated files with filtering\n- `useFile(id)` - Fetch single file by ID\n- `useUploadFile()` - Upload single file with progress\n- `useUploadFiles()` - Upload multiple files with batch progress\n- `useUpdateFile()` - Update file metadata\n- `useDeleteFile()` - Delete file\n- `useDownloadFile()` - Download file as blob\n- `useGetDownloadUrl()` - Get secure download URL\n\n#### File Operations\n- `useCopyFile()` - Copy file to another location\n- `useMoveFile()` - Move file to another folder\n- `useRenameFile()` - Rename file\n- `useBulkFileOperation()` - Perform bulk operations on multiple files\n\n#### File Sharing\n- `useShareFile()` - Configure file sharing settings\n- `useFileSharing(id)` - Get file sharing configuration\n- `useRemoveFileSharing()` - Remove file sharing\n\n#### Version Management\n- `useFileVersions(id)` - Get file version history\n- `useCreateFileVersion()` - Create new file version\n- `useSetActiveFileVersion()` - Set active version\n\n#### File Processing\n- `useFileProcessingJobs(id)` - Get processing job status\n- `useStartProcessingJob()` - Start processing job (thumbnail, preview, etc.)\n\n#### Search & Discovery\n- `useSearchFiles(query, filters)` - Search files with advanced filters\n- `useRecentFiles(limit)` - Get recently accessed files\n- `usePopularFiles(limit)` - Get most popular files\n- `useFilesByCategory(category)` - Get files by category\n\n#### Analytics\n- `useFileStatistics(id)` - Get file usage statistics\n- `useStorageUsage()` - Get storage usage analytics\n\n#### Folder Operations\n- `useFolders(parentId)` - Get folders in parent\n- `useCreateFolder()` - Create new folder\n- `useUpdateFolder()` - Update folder metadata\n- `useDeleteFolder()` - Delete folder (with recursive option)\n- `useFolderTree(rootId)` - Get hierarchical folder tree\n\n### Storage Engine\n\n#### Built-in Providers\n\n```tsx\n// Local storage (development)\nconst localProvider = new LocalStorageProvider({\n  baseUrl: '/api/files',\n  uploadEndpoint: '/api/files/upload'\n})\n\n// AWS S3 (production)\nconst s3Provider = new S3StorageProvider({\n  provider: 'aws-s3',\n  region: 'us-east-1',\n  bucket: 'my-bucket',\n  accessKey: 'ACCESS_KEY',\n  secretKey: 'SECRET_KEY'\n})\n\n// Register providers\nstorageEngine.registerProvider('local', localProvider)\nstorageEngine.registerProvider('aws-s3', s3Provider)\nstorageEngine.setDefaultProvider('aws-s3')\n```\n\n#### Custom Storage Provider\n\n```tsx\nclass CustomStorageProvider implements IStorageProvider {\n  async upload(file: File, path: string): Promise<StorageOperationResult> {\n    // Custom upload logic\n    return { success: true, url: 'https://example.com/file', path }\n  }\n\n  async download(path: string): Promise<Blob> {\n    // Custom download logic\n    return new Blob()\n  }\n\n  async delete(path: string): Promise<boolean> {\n    // Custom delete logic\n    return true\n  }\n\n  // Implement other required methods...\n}\n\nstorageEngine.registerProvider('custom', new CustomStorageProvider())\n```\n\n### File Types and Categories\n\n```tsx\ntype FileCategory = \n  | 'document'  // PDF, DOC, TXT, etc.\n  | 'image'     // JPG, PNG, GIF, etc.\n  | 'video'     // MP4, AVI, MOV, etc.\n  | 'audio'     // MP3, WAV, FLAC, etc.\n  | 'archive'   // ZIP, RAR, TAR, etc.\n  | 'code'      // JS, TS, PY, etc.\n  | 'data'      // JSON, XML, CSV, etc.\n  | 'other'     // Unknown types\n\ntype FileAccessLevel = 'public' | 'private' | 'restricted' | 'internal'\ntype FileStatus = 'uploading' | 'processing' | 'ready' | 'failed' | 'archived' | 'deleted'\n```\n\n## Advanced Usage\n\n### Custom File Processing\n\n```tsx\nimport { useStartProcessingJob } from '@dbs-portal/module-file-management'\n\nfunction ProcessingExample({ fileId }: { fileId: string }) {\n  const processingMutation = useStartProcessingJob()\n\n  const generateThumbnail = async () => {\n    try {\n      await processingMutation.mutateAsync({\n        id: fileId,\n        type: 'thumbnail',\n        options: {\n          width: 200,\n          height: 200,\n          quality: 80\n        }\n      })\n    } catch (error) {\n      console.error('Processing failed:', error)\n    }\n  }\n\n  return (\n    <button onClick={generateThumbnail}>\n      Generate Thumbnail\n    </button>\n  )\n}\n```\n\n### Bulk File Operations\n\n```tsx\nimport { useBulkFileOperation } from '@dbs-portal/module-file-management'\n\nfunction BulkOperationsExample() {\n  const bulkMutation = useBulkFileOperation()\n\n  const moveFiles = async (fileIds: string[], targetFolderId: string) => {\n    try {\n      const result = await bulkMutation.mutateAsync({\n        operation: 'move',\n        fileIds,\n        targetId: targetFolderId\n      })\n      \n      console.log(`Moved ${result.processedCount} files`)\n      if (result.failedCount > 0) {\n        console.error('Failed operations:', result.errors)\n      }\n    } catch (error) {\n      console.error('Bulk operation failed:', error)\n    }\n  }\n\n  return (\n    <button onClick={() => moveFiles(['file1', 'file2'], 'folder1')}>\n      Move Selected Files\n    </button>\n  )\n}\n```\n\n### File Sharing Configuration\n\n```tsx\nimport { useShareFile } from '@dbs-portal/module-file-management'\n\nfunction SharingExample({ fileId }: { fileId: string }) {\n  const shareMutation = useShareFile()\n\n  const shareFile = async () => {\n    try {\n      await shareMutation.mutateAsync({\n        id: fileId,\n        sharing: {\n          isEnabled: true,\n          accessLevel: 'view',\n          expiresAt: new Date(Date.now() + 7 * 24 * 60 * 60 * 1000), // 7 days\n          password: 'optional-password',\n          downloadLimit: 10,\n          allowedUsers: ['user1', 'user2']\n        }\n      })\n    } catch (error) {\n      console.error('Sharing failed:', error)\n    }\n  }\n\n  return (\n    <button onClick={shareFile}>\n      Share File\n    </button>\n  )\n}\n```\n\n## Configuration\n\n### Environment Variables\n```env\n# Storage settings\nVITE_FILE_MAX_SIZE=104857600\nVITE_FILE_ALLOWED_TYPES=image/*,application/pdf,text/*\nVITE_FILE_STORAGE_PROVIDER=local\n\n# AWS S3 settings (if using S3)\nVITE_AWS_REGION=us-east-1\nVITE_AWS_BUCKET=my-file-bucket\nVITE_AWS_ACCESS_KEY=your-access-key\nVITE_AWS_SECRET_KEY=your-secret-key\n\n# Processing settings\nVITE_FILE_ENABLE_THUMBNAILS=true\nVITE_FILE_ENABLE_PREVIEWS=true\nVITE_FILE_THUMBNAIL_SIZES=200x200,400x400\n```\n\n### Storage Configuration\n```tsx\nimport { createStorageEngine } from '@dbs-portal/module-file-management'\n\nconst storageEngine = createStorageEngine({\n  provider: 'aws-s3',\n  region: 'us-east-1',\n  bucket: 'my-bucket',\n  maxFileSize: 100 * 1024 * 1024, // 100MB\n  allowedMimeTypes: [\n    'image/*',\n    'application/pdf',\n    'text/*',\n    'video/mp4'\n  ],\n  thumbnailSizes: [\n    { width: 200, height: 200, quality: 80 },\n    { width: 400, height: 400, quality: 90 }\n  ],\n  previewFormats: ['jpg', 'png', 'pdf', 'mp4']\n})\n```\n\n## Development\n\n### Building\n```bash\nnpm run build\n```\n\n### Testing\n```bash\nnpm test\n```\n\n### Type Checking\n```bash\nnpm run type-check\n```\n\n### Linting\n```bash\nnpm run lint\n```\n\n## Contributing\n\n1. Follow established patterns for components, hooks, and services\n2. Ensure all new features have TypeScript types\n3. Add comprehensive validation for file operations\n4. Update documentation for API changes\n5. Test with various file types and sizes\n\n## Performance Considerations\n\n### Optimization Tips\n- Use pagination for large file lists\n- Implement virtual scrolling for thousands of files\n- Lazy load thumbnails and previews\n- Cache frequently accessed files\n- Use CDN for file delivery\n- Implement progressive image loading\n\n### Memory Management\n- Clean up blob URLs after use\n- Limit concurrent uploads\n- Use streaming for large file operations\n- Implement proper error boundaries\n\n## Security\n\n### File Validation\n- Server-side MIME type validation\n- File size limits\n- Virus scanning integration\n- Content sanitization\n- Path traversal protection\n\n### Access Control\n- JWT-based authentication\n- Role-based permissions\n- Audit logging\n- Secure file URLs with expiration\n- IP-based restrictions\n\n## License\n\nMIT License - see LICENSE file for details.\n","readmeFilename":"README.md","_rev":"1-163fbe0d1ad89535147f2bb33839bbde"}