@flusys/ng-storage 1.1.0-beta → 1.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +144 -5
- package/fesm2022/{flusys-ng-storage-file-manager-form.component-CxAYC6nj.mjs → flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs} +120 -351
- package/fesm2022/flusys-ng-storage-file-manager-form.component-CXVB9G-f.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs +304 -0
- package/fesm2022/flusys-ng-storage-file-manager-list.component-0O_b4EjN.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage-folder-form.component-BTQGEqNu.mjs +155 -0
- package/fesm2022/flusys-ng-storage-folder-form.component-BTQGEqNu.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage-folder-list.component-B8GoIh6Z.mjs +194 -0
- package/fesm2022/flusys-ng-storage-folder-list.component-B8GoIh6Z.mjs.map +1 -0
- package/fesm2022/{flusys-ng-storage-storage-config-form.component-SEYIBife.mjs → flusys-ng-storage-storage-config-form.component-CorNWrmF.mjs} +219 -302
- package/fesm2022/flusys-ng-storage-storage-config-form.component-CorNWrmF.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage-storage-config-list.component-YXzz3Tvo.mjs +187 -0
- package/fesm2022/flusys-ng-storage-storage-config-list.component-YXzz3Tvo.mjs.map +1 -0
- package/fesm2022/flusys-ng-storage.mjs +267 -226
- package/fesm2022/flusys-ng-storage.mjs.map +1 -1
- package/package.json +9 -9
- package/types/flusys-ng-storage.d.ts +101 -151
- package/fesm2022/flusys-ng-storage-file-manager-form.component-CxAYC6nj.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-file-manager-list.component-BevfDZO0.mjs +0 -475
- package/fesm2022/flusys-ng-storage-file-manager-list.component-BevfDZO0.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-form.component-BhurG3dl.mjs +0 -253
- package/fesm2022/flusys-ng-storage-folder-form.component-BhurG3dl.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-folder-list.component-Clrjcw0B.mjs +0 -267
- package/fesm2022/flusys-ng-storage-folder-list.component-Clrjcw0B.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-form.component-SEYIBife.mjs.map +0 -1
- package/fesm2022/flusys-ng-storage-storage-config-list.component-CofVBysj.mjs +0 -328
- package/fesm2022/flusys-ng-storage-storage-config-list.component-CofVBysj.mjs.map +0 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"flusys-ng-storage.mjs","sources":["../../../projects/ng-storage/enums/file-location.enum.ts","../../../projects/ng-storage/services/file-manager-api.service.ts","../../../projects/ng-storage/services/upload.service.ts","../../../projects/ng-storage/adapters/profile-upload-provider.adapter.ts","../../../projects/ng-storage/providers/storage-providers.ts","../../../projects/ng-storage/services/folder-api.service.ts","../../../projects/ng-storage/services/storage-config-api.service.ts","../../../projects/ng-storage/routes/storage.routes.ts","../../../projects/ng-storage/pages/storage-container/storage-container.component.ts","../../../projects/ng-storage/public-api.ts","../../../projects/ng-storage/flusys-ng-storage.ts"],"sourcesContent":["/**\n * File Location Enum\n * Storage provider types (matches backend FileLocationEnum)\n */\nexport enum FileLocationEnum {\n LOCAL = 'local',\n AWS = 'aws',\n AZURE = 'azure',\n SFTP = 'sftp',\n}\n\n/**\n * Image Format Enum\n * Supported image output formats for compression\n */\nexport enum ImageFormat {\n ORIGINAL = 'original',\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable } from 'rxjs';\nimport { ApiResourceService, ISingleResponse, IListResponse } from '@flusys/ng-shared';\nimport {\n IFileManager,\n ICreateFileManagerDto,\n IUpdateFileManagerDto,\n IGetFilesRequestDto,\n IFilesResponseDto,\n} from '../interfaces/file-manager.interface';\n\n/**\n * File Manager API Service\n * Handles file metadata CRUD operations\n * Endpoint: POST /storage/file-manager/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FileManagerApiService extends ApiResourceService<\n IUpdateFileManagerDto,\n IFileManager\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/file-manager', http);\n }\n\n /**\n * Get multiple files with valid URLs\n * POST /storage/file-manager/get-files\n * Regenerates presigned URLs if expired\n */\n getFiles(\n fileIds: string[]\n ): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(\n `${this.baseUrl}/get-files`,\n requests\n );\n }\n\n /**\n * Get files by folder\n * POST /storage/file-manager/get-all\n * Filtered by folder ID and company (if enabled)\n */\n getFilesByFolder(\n folderId: number | null,\n page: number = 1,\n limit: number = 50\n ): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: folderId ? { folderId } : {},\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Get private files (requires permission)\n * POST /storage/file-manager/get-all\n * Filtered by isPrivate and user permission 'storage.file.viewPrivate'\n */\n getPrivateFiles(\n page: number = 1,\n limit: number = 50\n ): Observable<IListResponse<IFileManager>> {\n return this.getAll('', {\n filter: { isPrivate: true },\n pagination: { currentPage: page - 1, pageSize: limit },\n select: [],\n sort: {},\n });\n }\n\n /**\n * Create new file manager record\n * POST /storage/file-manager/insert\n */\n create(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(\n `${this.baseUrl}/insert`,\n dto\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport {\n IUploadOptionsDto,\n IUploadedFileInfo,\n} from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { IFileManager } from '../interfaces/file-manager.interface';\nimport { FileLocationEnum } from '../enums/file-location.enum';\n\n/**\n * Upload Service\n * Handles file upload/delete operations\n * Endpoint: POST /storage/upload/*\n *\n * Features:\n * - Company-scoped uploads (if company feature enabled)\n * - Image compression\n * - Multiple storage providers\n * - File validation (size, type)\n * - Default storage config from environment (services.storage.defaultStorageConfigId)\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /**\n * Get default storage config ID from app config\n * Used when no storageConfigId is provided in upload options\n */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /**\n * Upload single file\n * POST /storage/upload/single-file?storageConfigId=x&folderPath=y\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n */\n uploadSingleFile(\n file: File,\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/single-file')}?${queryParams}`\n : this.getUrl('upload/single-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(url, formData);\n }\n\n /**\n * Upload multiple files (max 50)\n * POST /storage/upload/multiple-file?storageConfigId=x&folderPath=y\n *\n * @param files - Array of files to upload\n * @param options - Upload options\n */\n uploadMultipleFiles(\n files: File[],\n options?: IUploadOptionsDto\n ): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n\n const queryParams = this.buildQueryParams(options);\n const url = queryParams\n ? `${this.getUrl('upload/multiple-file')}?${queryParams}`\n : this.getUrl('upload/multiple-file');\n\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(url, formData);\n }\n\n /**\n * Build query string from upload options\n * Uses default storageConfigId from app config if not provided in options\n */\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n\n // Use provided storageConfigId or fall back to default from config\n const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();\n if (storageConfigId) params.append('storageConfigId', storageConfigId);\n\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n /**\n * Delete single file\n * POST /storage/upload/delete-single-file\n *\n * @param key - File key/path to delete\n * @param storageConfigId - Optional storage config ID (uses default from config if not provided)\n */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n const configId = storageConfigId ?? this.getDefaultConfigId();\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n { key, ...(configId && { storageConfigId: configId }) }\n );\n }\n\n /**\n * Delete multiple files\n * POST /storage/upload/delete-multiple-file\n *\n * @param keys - Array of file keys/paths to delete\n * @param storageConfigId - Optional storage config ID (uses default from config if not provided)\n */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n const configId = storageConfigId ?? this.getDefaultConfigId();\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n { keys, ...(configId && { storageConfigId: configId }) }\n );\n }\n\n /**\n * Get file download URL\n * GET /storage/upload/file/:filePath\n *\n * @param key - File key/path\n * @returns URL for direct file access\n */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /**\n * Upload file and register in file manager\n * Returns file manager ID (UUID) for storing in references like profilePictureId\n *\n * @param file - File to upload\n * @param options - Upload options (storage config, compression, etc.)\n * @returns Observable with file manager record (id is the UUID to store)\n */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string }\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((uploadResponse) => {\n if (!uploadResponse.success || !uploadResponse.data) {\n throw new Error(uploadResponse.message || 'Upload failed');\n }\n\n const uploadedFile = uploadResponse.data;\n const storageConfigId = options?.storageConfigId ?? this.getDefaultConfigId();\n\n // Create file manager record\n return this.fileManagerApi.create({\n name: uploadedFile.name,\n key: uploadedFile.key,\n size: String(uploadedFile.size),\n contentType: uploadedFile.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId,\n location: FileLocationEnum.LOCAL,\n });\n })\n );\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n IProfileUploadProvider,\n IProfileUploadOptions,\n IProfileUploadResult,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { UploadService } from '../services/upload.service';\n\n/**\n * Profile Upload Provider Adapter\n *\n * Implements IProfileUploadProvider interface for ng-auth profile page.\n * Uses UploadService.uploadAndRegister() to upload files and register in file manager.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * ...provideStorageProviders(),\n * ]\n */\n@Injectable()\nexport class ProfileUploadProviderAdapter implements IProfileUploadProvider {\n private readonly uploadService = inject(UploadService);\n\n /**\n * Upload profile picture and register in file manager\n * Returns file manager ID (UUID) for storing in user.profilePictureId\n */\n uploadProfilePicture(\n file: File,\n options?: IProfileUploadOptions\n ): Observable<ISingleResponse<IProfileUploadResult>> {\n return this.uploadService\n .uploadAndRegister(file, {\n folderPath: options?.folderPath ?? 'profile-pictures',\n compress: options?.compress ?? true,\n maxWidth: options?.maxWidth ?? 400,\n maxHeight: options?.maxHeight ?? 400,\n })\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: response.data\n ? {\n id: response.data.id,\n name: response.data.name,\n key: response.data.key,\n size: parseFloat(response.data.size) * 1024, // Convert KB to bytes\n contentType: response.data.contentType,\n }\n : undefined,\n }))\n );\n }\n}\n","import { Provider } from '@angular/core';\nimport { PROFILE_UPLOAD_PROVIDER } from '@flusys/ng-shared';\nimport { ProfileUploadProviderAdapter } from '../adapters/profile-upload-provider.adapter';\n\n/**\n * Provide Storage Providers\n *\n * Registers storage-related provider implementations.\n * Call this in app.config.ts to enable storage features in other packages.\n *\n * @example\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * ...provideStorageProviders(),\n * ],\n * };\n *\n * @returns Array of providers for storage functionality\n */\nexport function provideStorageProviders(): Provider[] {\n return [\n {\n provide: PROFILE_UPLOAD_PROVIDER,\n useClass: ProfileUploadProviderAdapter,\n },\n ];\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IFolder, IUpdateFolderDto } from '../interfaces/folder.interface';\n\n/**\n * Folder API Service\n * Handles folder CRUD operations\n * Endpoint: POST /storage/folder/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFolder> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/folder', http);\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { IStorageConfig, IUpdateStorageConfigDto } from '../interfaces/storage-config.interface';\n\n/**\n * Storage Config API Service\n * Handles storage configuration CRUD operations\n * Endpoint: POST /storage/storage-config/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StorageConfigApiService extends ApiResourceService<\n IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n const http = inject(HttpClient);\n super('storage/storage-config', http);\n }\n}\n","import { Routes } from '@angular/router';\n\n/**\n * Storage Module Routes\n * All storage management routes: configs, files, folders\n *\n * All routes are protected by permission guards to prevent direct URL access.\n */\nexport const STORAGE_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-container/storage-container.component').then(\n (m) => m.StorageContainerComponent,\n ),\n children: [\n // File Manager Routes\n {\n path: 'files',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-list.component').then(\n (m) => m.FileManagerListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n ],\n },\n\n // Folder Routes\n {\n path: 'folders',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/folder/folder-list.component').then(\n (m) => m.FolderListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n ],\n },\n\n // Storage Config Routes\n {\n path: 'configs',\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-list.component').then(\n (m) => m.StorageConfigListComponent,\n ),\n },\n {\n path: 'new',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect to files\n {\n path: '',\n redirectTo: 'files',\n pathMatch: 'full',\n },\n ],\n },\n];\n","import { Component } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n */\n@Component({\n selector: 'lib-storage-container',\n standalone: true,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n template: `\n <div class=\"storage-page p-4\">\n <div class=\"storage-header mb-4\">\n <h1 class=\"text-2xl font-bold m-0\">Storage</h1>\n <p class=\"text-gray-500 mt-1\">Manage files, folders, and storage configurations</p>\n </div>\n\n <div class=\"storage-tabs flex gap-1 mb-4 border-b border-gray-200\">\n @for (tab of tabs; track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"active\"\n class=\"tab-link flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors\">\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <div class=\"storage-content\">\n <router-outlet />\n </div>\n </div>\n `,\n styles: [\n `\n .tab-link {\n color: var(--text-color-secondary, #6b7280);\n text-decoration: none;\n border-bottom: 2px solid transparent;\n margin-bottom: -1px;\n }\n .tab-link.active {\n color: var(--primary-color, #3b82f6);\n border-bottom-color: var(--primary-color, #3b82f6);\n background-color: var(--surface-ground, #f9fafb);\n }\n .tab-link:hover:not(.active) {\n background-color: var(--surface-hover, #f3f4f6);\n }\n `,\n ],\n})\nexport class StorageContainerComponent {\n /** All available tabs */\n readonly tabs: ITab[] = [\n {\n id: 'files',\n label: 'Files',\n icon: 'pi pi-file',\n route: 'files',\n },\n {\n id: 'folders',\n label: 'Folders',\n icon: 'pi pi-folder',\n route: 'folders',\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n },\n ];\n}\n","// =============================================================================\n// @flusys/ng-storage - Storage Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Adapters\nexport { ProfileUploadProviderAdapter } from './adapters/profile-upload-provider.adapter';\n\n// Providers\nexport { provideStorageProviders } from './providers/storage-providers';\n\n// Services\nexport { FileManagerApiService } from './services/file-manager-api.service';\nexport { FolderApiService } from './services/folder-api.service';\nexport { StorageConfigApiService } from './services/storage-config-api.service';\nexport { UploadService } from './services/upload.service';\n\n// Routes\nexport { STORAGE_ROUTES } from './routes/storage.routes';\n\n// Components\nexport { StorageContainerComponent } from './pages/storage-container/storage-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":";;;;;;;;;;AAAA;;;AAGG;IACS;AAAZ,CAAA,UAAY,gBAAgB,EAAA;AAC1B,IAAA,gBAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,gBAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,gBAAA,CAAA,OAAA,CAAA,GAAA,OAAe;AACf,IAAA,gBAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EALW,gBAAgB,KAAhB,gBAAgB,GAAA,EAAA,CAAA,CAAA;AAO5B;;;AAGG;IACS;AAAZ,CAAA,UAAY,WAAW,EAAA;AACrB,IAAA,WAAA,CAAA,UAAA,CAAA,GAAA,UAAqB;AACrB,IAAA,WAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACb,IAAA,WAAA,CAAA,KAAA,CAAA,GAAA,KAAW;AACX,IAAA,WAAA,CAAA,MAAA,CAAA,GAAA,MAAa;AACf,CAAC,EALW,WAAW,KAAX,WAAW,GAAA,EAAA,CAAA,CAAA;;ACHvB;;;;;;AAMG;AAIG,MAAO,qBAAsB,SAAQ,kBAG1C,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,KAAK,CAAC,sBAAsB,EAAE,IAAI,CAAC;IACrC;AAEA;;;;AAIG;AACH,IAAA,QAAQ,CACN,OAAiB,EAAA;AAEjB,QAAA,MAAM,QAAQ,GAA0B,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,CAAC;AACrE,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,UAAA,CAAY,EAC3B,QAAQ,CACT;IACH;AAEA;;;;AAIG;AACH,IAAA,gBAAgB,CACd,QAAuB,EACvB,OAAe,CAAC,EAChB,QAAgB,EAAE,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;YACrB,MAAM,EAAE,QAAQ,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;YACpC,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;AACtD,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACT,SAAA,CAAC;IACJ;AAEA;;;;AAIG;AACH,IAAA,eAAe,CACb,IAAA,GAAe,CAAC,EAChB,QAAgB,EAAE,EAAA;AAElB,QAAA,OAAO,IAAI,CAAC,MAAM,CAAC,EAAE,EAAE;AACrB,YAAA,MAAM,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE;YAC3B,UAAU,EAAE,EAAE,WAAW,EAAE,IAAI,GAAG,CAAC,EAAE,QAAQ,EAAE,KAAK,EAAE;AACtD,YAAA,MAAM,EAAE,EAAE;AACV,YAAA,IAAI,EAAE,EAAE;AACT,SAAA,CAAC;IACJ;AAEA;;;AAGG;AACH,IAAA,MAAM,CAAC,GAA0B,EAAA;AAC/B,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,CAAA,EAAG,IAAI,CAAC,OAAO,CAAA,OAAA,CAAS,EACxB,GAAG,CACJ;IACH;uGApEW,qBAAqB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAArB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,qBAAqB,cAFpB,MAAM,EAAA,CAAA;;2FAEP,qBAAqB,EAAA,UAAA,EAAA,CAAA;kBAHjC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACTD;;;;;;;;;;;AAWG;AAIG,MAAO,aAAc,SAAQ,cAAc,CAAA;AAC9B,IAAA,cAAc,GAAG,MAAM,CAAC,qBAAqB,CAAC;AAE/D,IAAA,WAAA,GAAA;QACE,KAAK,CAAC,SAAS,CAAC;IAClB;AAEA;;;AAGG;IACH,kBAAkB,GAAA;AAChB,QAAA,OAAO,yBAAyB,CAAC,IAAI,CAAC,SAAS,CAAC;IAClD;AAEA;;;;;;AAMG;IACH,gBAAgB,CACd,IAAU,EACV,OAA2B,EAAA;AAE3B,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,QAAQ,CAAC,MAAM,CAAC,MAAM,EAAE,IAAI,CAAC;QAE7B,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAClD,MAAM,GAAG,GAAG;cACR,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA;AACrD,cAAE,IAAI,CAAC,MAAM,CAAC,oBAAoB,CAAC;QAErC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAqC,GAAG,EAAE,QAAQ,CAAC;IAC1E;AAEA;;;;;;AAMG;IACH,mBAAmB,CACjB,KAAa,EACb,OAA2B,EAAA;AAE3B,QAAA,MAAM,QAAQ,GAAG,IAAI,QAAQ,EAAE;AAC/B,QAAA,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,KAAK,QAAQ,CAAC,MAAM,CAAC,OAAO,EAAE,IAAI,CAAC,CAAC;QAEvD,MAAM,WAAW,GAAG,IAAI,CAAC,gBAAgB,CAAC,OAAO,CAAC;QAClD,MAAM,GAAG,GAAG;cACR,CAAA,EAAG,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC,CAAA,CAAA,EAAI,WAAW,CAAA;AACvD,cAAE,IAAI,CAAC,MAAM,CAAC,sBAAsB,CAAC;QAEvC,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CAAuC,GAAG,EAAE,QAAQ,CAAC;IAC5E;AAEA;;;AAGG;AACK,IAAA,gBAAgB,CAAC,OAA2B,EAAA;AAClD,QAAA,MAAM,MAAM,GAAG,IAAI,eAAe,EAAE;;QAGpC,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC7E,QAAA,IAAI,eAAe;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,iBAAiB,EAAE,eAAe,CAAC;QAEtE,IAAI,OAAO,EAAE,UAAU;YAAE,MAAM,CAAC,MAAM,CAAC,YAAY,EAAE,OAAO,CAAC,UAAU,CAAC;QACxE,IAAI,OAAO,EAAE,QAAQ;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;QAC7E,IAAI,OAAO,EAAE,SAAS;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,WAAW,EAAE,OAAO,CAAC,SAAS,CAAC,QAAQ,EAAE,CAAC;QAChF,IAAI,OAAO,EAAE,OAAO;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;QAC1E,IAAI,OAAO,EAAE,MAAM;YAAE,MAAM,CAAC,MAAM,CAAC,QAAQ,EAAE,OAAO,CAAC,MAAM,CAAC;AAC5D,QAAA,IAAI,OAAO,EAAE,QAAQ,KAAK,SAAS;AAAE,YAAA,MAAM,CAAC,MAAM,CAAC,UAAU,EAAE,OAAO,CAAC,QAAQ,CAAC,QAAQ,EAAE,CAAC;AAE3F,QAAA,OAAO,MAAM,CAAC,QAAQ,EAAE;IAC1B;AAEA;;;;;;AAMG;IACH,gBAAgB,CAAC,GAAW,EAAE,eAAwB,EAAA;QACpD,MAAM,QAAQ,GAAG,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC7D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,MAAM,CAAC,2BAA2B,CAAC,EACxC,EAAE,GAAG,EAAE,IAAI,QAAQ,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,CACxD;IACH;AAEA;;;;;;AAMG;IACH,mBAAmB,CAAC,IAAc,EAAE,eAAwB,EAAA;QAC1D,MAAM,QAAQ,GAAG,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE;AAC7D,QAAA,OAAO,IAAI,CAAC,IAAI,CAAC,IAAI,CACnB,IAAI,CAAC,MAAM,CAAC,6BAA6B,CAAC,EAC1C,EAAE,IAAI,EAAE,IAAI,QAAQ,IAAI,EAAE,eAAe,EAAE,QAAQ,EAAE,CAAC,EAAE,CACzD;IACH;AAEA;;;;;;AAMG;AACH,IAAA,UAAU,CAAC,GAAW,EAAA;QACpB,OAAO,IAAI,CAAC,MAAM,CAAC,eAAe,GAAG,CAAA,CAAE,CAAC;IAC1C;AAEA;;;;;;;AAOG;IACH,iBAAiB,CACf,IAAU,EACV,OAAwE,EAAA;AAExE,QAAA,OAAO,IAAI,CAAC,gBAAgB,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC,IAAI,CAC9C,SAAS,CAAC,CAAC,cAAc,KAAI;YAC3B,IAAI,CAAC,cAAc,CAAC,OAAO,IAAI,CAAC,cAAc,CAAC,IAAI,EAAE;gBACnD,MAAM,IAAI,KAAK,CAAC,cAAc,CAAC,OAAO,IAAI,eAAe,CAAC;YAC5D;AAEA,YAAA,MAAM,YAAY,GAAG,cAAc,CAAC,IAAI;YACxC,MAAM,eAAe,GAAG,OAAO,EAAE,eAAe,IAAI,IAAI,CAAC,kBAAkB,EAAE;;AAG7E,YAAA,OAAO,IAAI,CAAC,cAAc,CAAC,MAAM,CAAC;gBAChC,IAAI,EAAE,YAAY,CAAC,IAAI;gBACvB,GAAG,EAAE,YAAY,CAAC,GAAG;AACrB,gBAAA,IAAI,EAAE,MAAM,CAAC,YAAY,CAAC,IAAI,CAAC;gBAC/B,WAAW,EAAE,YAAY,CAAC,WAAW;AACrC,gBAAA,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,KAAK;gBACtC,QAAQ,EAAE,OAAO,EAAE,QAAQ;gBAC3B,eAAe;gBACf,QAAQ,EAAE,gBAAgB,CAAC,KAAK;AACjC,aAAA,CAAC;QACJ,CAAC,CAAC,CACH;IACH;uGA3JW,aAAa,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAb,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,aAAa,cAFZ,MAAM,EAAA,CAAA;;2FAEP,aAAa,EAAA,UAAA,EAAA,CAAA;kBAHzB,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACfD;;;;;;;;;;;AAWG;MAEU,4BAA4B,CAAA;AACtB,IAAA,aAAa,GAAG,MAAM,CAAC,aAAa,CAAC;AAEtD;;;AAGG;IACH,oBAAoB,CAClB,IAAU,EACV,OAA+B,EAAA;QAE/B,OAAO,IAAI,CAAC;aACT,iBAAiB,CAAC,IAAI,EAAE;AACvB,YAAA,UAAU,EAAE,OAAO,EAAE,UAAU,IAAI,kBAAkB;AACrD,YAAA,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,IAAI;AACnC,YAAA,QAAQ,EAAE,OAAO,EAAE,QAAQ,IAAI,GAAG;AAClC,YAAA,SAAS,EAAE,OAAO,EAAE,SAAS,IAAI,GAAG;SACrC;aACA,IAAI,CACH,GAAG,CAAC,CAAC,QAAQ,MAAM;YACjB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,OAAO,EAAE,QAAQ,CAAC,OAAO;YACzB,IAAI,EAAE,QAAQ,CAAC;AACb,kBAAE;AACE,oBAAA,EAAE,EAAE,QAAQ,CAAC,IAAI,CAAC,EAAE;AACpB,oBAAA,IAAI,EAAE,QAAQ,CAAC,IAAI,CAAC,IAAI;AACxB,oBAAA,GAAG,EAAE,QAAQ,CAAC,IAAI,CAAC,GAAG;AACtB,oBAAA,IAAI,EAAE,UAAU,CAAC,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,IAAI;AAC3C,oBAAA,WAAW,EAAE,QAAQ,CAAC,IAAI,CAAC,WAAW;AACvC;AACH,kBAAE,SAAS;SACd,CAAC,CAAC,CACJ;IACL;uGAjCW,4BAA4B,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;2GAA5B,4BAA4B,EAAA,CAAA;;2FAA5B,4BAA4B,EAAA,UAAA,EAAA,CAAA;kBADxC;;;ACnBD;;;;;;;;;;;;;;;AAeG;SACa,uBAAuB,GAAA;IACrC,OAAO;AACL,QAAA;AACE,YAAA,OAAO,EAAE,uBAAuB;AAChC,YAAA,QAAQ,EAAE,4BAA4B;AACvC,SAAA;KACF;AACH;;ACtBA;;;;;;AAMG;AAIG,MAAO,gBAAiB,SAAQ,kBAA6C,CAAA;AACjF,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,KAAK,CAAC,gBAAgB,EAAE,IAAI,CAAC;IAC/B;uGAJW,gBAAgB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAhB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,gBAAgB,cAFf,MAAM,EAAA,CAAA;;2FAEP,gBAAgB,EAAA,UAAA,EAAA,CAAA;kBAH5B,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACTD;;;;;;AAMG;AAIG,MAAO,uBAAwB,SAAQ,kBAG5C,CAAA;AACC,IAAA,WAAA,GAAA;AACE,QAAA,MAAM,IAAI,GAAG,MAAM,CAAC,UAAU,CAAC;AAC/B,QAAA,KAAK,CAAC,wBAAwB,EAAE,IAAI,CAAC;IACvC;uGAPW,uBAAuB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,UAAA,EAAA,CAAA;AAAvB,IAAA,OAAA,KAAA,GAAA,EAAA,CAAA,qBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,QAAA,EAAA,EAAA,EAAA,IAAA,EAAA,uBAAuB,cAFtB,MAAM,EAAA,CAAA;;2FAEP,uBAAuB,EAAA,UAAA,EAAA,CAAA;kBAHnC,UAAU;AAAC,YAAA,IAAA,EAAA,CAAA;AACV,oBAAA,UAAU,EAAE,MAAM;AACnB,iBAAA;;;ACZD;;;;;AAKG;AACI,MAAM,cAAc,GAAW;AACpC,IAAA;AACE,QAAA,IAAI,EAAE,EAAE;AACR,QAAA,aAAa,EAAE,MACb,0EAAgE,CAAC,IAAI,CACnE,CAAC,CAAC,KAAK,CAAC,CAAC,yBAAyB,CACnC;AACH,QAAA,QAAQ,EAAE;;AAER,YAAA;AACE,gBAAA,IAAI,EAAE,OAAO;AACb,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,8DAAmD,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,8DAAmD,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,8DAAmD,CAAC,CAAC,IAAI,CAC9D,CAAC,CAAC,KAAK,CAAC,CAAC,wBAAwB,CAClC;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;AAGD,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,wDAAuC,CAAC,CAAC,IAAI,CAClD,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAC7B;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,wDAAuC,CAAC,CAAC,IAAI,CAClD,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAC7B;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,wDAAuC,CAAC,CAAC,IAAI,CAClD,CAAC,CAAC,KAAK,CAAC,CAAC,mBAAmB,CAC7B;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;AAGD,YAAA;AACE,gBAAA,IAAI,EAAE,SAAS;AACf,gBAAA,QAAQ,EAAE;AACR,oBAAA;AACE,wBAAA,IAAI,EAAE,EAAE;AACR,wBAAA,aAAa,EAAE,MACb,OAAO,gEAAuD,CAAC,CAAC,IAAI,CAClE,CAAC,CAAC,KAAK,CAAC,CAAC,0BAA0B,CACpC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,gEAAuD,CAAC,CAAC,IAAI,CAClE,CAAC,CAAC,KAAK,CAAC,CAAC,0BAA0B,CACpC;AACJ,qBAAA;AACD,oBAAA;AACE,wBAAA,IAAI,EAAE,KAAK;AACX,wBAAA,aAAa,EAAE,MACb,OAAO,gEAAuD,CAAC,CAAC,IAAI,CAClE,CAAC,CAAC,KAAK,CAAC,CAAC,0BAA0B,CACpC;AACJ,qBAAA;AACF,iBAAA;AACF,aAAA;;AAGD,YAAA;AACE,gBAAA,IAAI,EAAE,EAAE;AACR,gBAAA,UAAU,EAAE,OAAO;AACnB,gBAAA,SAAS,EAAE,MAAM;AAClB,aAAA;AACF,SAAA;AACF,KAAA;;;AChGH;;;;;AAKG;MAgDU,yBAAyB,CAAA;;AAE3B,IAAA,IAAI,GAAW;AACtB,QAAA;AACE,YAAA,EAAE,EAAE,OAAO;AACX,YAAA,KAAK,EAAE,OAAO;AACd,YAAA,IAAI,EAAE,YAAY;AAClB,YAAA,KAAK,EAAE,OAAO;AACf,SAAA;AACD,QAAA;AACE,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,KAAK,EAAE,SAAS;AAChB,YAAA,IAAI,EAAE,cAAc;AACpB,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA;AACD,QAAA;AACE,YAAA,EAAE,EAAE,SAAS;AACb,YAAA,KAAK,EAAE,gBAAgB;AACvB,YAAA,IAAI,EAAE,WAAW;AACjB,YAAA,KAAK,EAAE,SAAS;AACjB,SAAA;KACF;uGArBU,yBAAyB,EAAA,IAAA,EAAA,EAAA,EAAA,MAAA,EAAA,EAAA,CAAA,eAAA,CAAA,SAAA,EAAA,CAAA;AAAzB,IAAA,OAAA,IAAA,GAAA,EAAA,CAAA,oBAAA,CAAA,EAAA,UAAA,EAAA,QAAA,EAAA,OAAA,EAAA,QAAA,EAAA,IAAA,EAAA,yBAAyB,EAAA,YAAA,EAAA,IAAA,EAAA,QAAA,EAAA,uBAAA,EAAA,QAAA,EAAA,EAAA,EAAA,QAAA,EA3C1B;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,QAAA,EAAA,IAAA,EAAA,MAAA,EAAA,CAAA,wWAAA,CAAA,EAAA,YAAA,EAAA,CAAA,EAAA,IAAA,EAAA,UAAA,EAAA,IAAA,EAxBS,YAAY,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,YAAY,EAAA,QAAA,EAAA,eAAA,EAAA,MAAA,EAAA,CAAA,MAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,UAAA,EAAA,YAAA,EAAA,QAAA,EAAA,QAAA,CAAA,EAAA,QAAA,EAAA,CAAA,QAAA,CAAA,EAAA,EAAA,EAAA,IAAA,EAAA,WAAA,EAAA,IAAA,EAAE,UAAU,oOAAE,gBAAgB,EAAA,QAAA,EAAA,oBAAA,EAAA,MAAA,EAAA,CAAA,yBAAA,EAAA,uBAAA,EAAA,kBAAA,CAAA,EAAA,OAAA,EAAA,CAAA,gBAAA,CAAA,EAAA,QAAA,EAAA,CAAA,kBAAA,CAAA,EAAA,CAAA,EAAA,CAAA;;2FA4CvD,yBAAyB,EAAA,UAAA,EAAA,CAAA;kBA/CrC,SAAS;AACE,YAAA,IAAA,EAAA,CAAA,EAAA,QAAA,EAAA,uBAAuB,EAAA,UAAA,EACrB,IAAI,EAAA,OAAA,EACP,CAAC,YAAY,EAAE,YAAY,EAAE,UAAU,EAAE,gBAAgB,CAAC,EAAA,QAAA,EACzD;;;;;;;;;;;;;;;;;;;;;;;AAuBT,EAAA,CAAA,EAAA,MAAA,EAAA,CAAA,wWAAA,CAAA,EAAA;;;;;;;;AC5CH;AACA;AACA;AAEA;;ACJA;;AAEG;;;;"}
|
|
1
|
+
{"version":3,"file":"flusys-ng-storage.mjs","sources":["../../../projects/ng-storage/enums/file-location.enum.ts","../../../projects/ng-storage/utils/storage-utils.ts","../../../projects/ng-storage/utils/base-storage-page.ts","../../../projects/ng-storage/services/file-manager-api.service.ts","../../../projects/ng-storage/services/upload.service.ts","../../../projects/ng-storage/adapters/profile-upload-provider.adapter.ts","../../../projects/ng-storage/providers/storage-providers.ts","../../../projects/ng-storage/services/folder-api.service.ts","../../../projects/ng-storage/services/storage-config-api.service.ts","../../../projects/ng-storage/routes/storage.routes.ts","../../../projects/ng-storage/pages/storage-container/storage-container.component.ts","../../../projects/ng-storage/public-api.ts","../../../projects/ng-storage/flusys-ng-storage.ts"],"sourcesContent":["/**\n * File Location Enum\n * Storage provider types (matches backend FileLocationEnum)\n */\nexport enum FileLocationEnum {\n LOCAL = 'local',\n AWS = 'aws',\n AZURE = 'azure',\n SFTP = 'sftp',\n}\n\n/**\n * Image Format Enum\n * Supported image output formats for compression\n */\nexport enum ImageFormat {\n ORIGINAL = 'original',\n JPEG = 'jpeg',\n PNG = 'png',\n WEBP = 'webp',\n}\n","import { FileLocationEnum } from '../enums/file-location.enum';\n\n/**\n * Storage Provider Configuration\n * Maps provider enum to display properties\n */\ninterface IProviderConfig {\n label: string;\n icon: string;\n severity: 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast';\n}\n\n/**\n * Provider configurations for all storage types\n */\nconst PROVIDER_CONFIGS: Record<FileLocationEnum, IProviderConfig> = {\n [FileLocationEnum.LOCAL]: {\n label: 'Local',\n icon: 'pi pi-folder',\n severity: 'secondary',\n },\n [FileLocationEnum.AWS]: {\n label: 'AWS S3',\n icon: 'pi pi-cloud',\n severity: 'warn',\n },\n [FileLocationEnum.AZURE]: {\n label: 'Azure Blob',\n icon: 'pi pi-cloud',\n severity: 'info',\n },\n [FileLocationEnum.SFTP]: {\n label: 'SFTP',\n icon: 'pi pi-server',\n severity: 'contrast',\n },\n};\n\n/**\n * Get provider label for display\n */\nexport function getProviderLabel(storage: FileLocationEnum | string): string {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.label ?? storage;\n}\n\n/**\n * Get provider icon class\n */\nexport function getProviderIcon(storage: FileLocationEnum | string): string {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.icon ?? 'pi pi-database';\n}\n\n/**\n * Get provider severity for p-tag\n */\nexport function getProviderSeverity(\n storage: FileLocationEnum | string,\n): 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast' {\n const enumValue = storage as FileLocationEnum;\n return PROVIDER_CONFIGS[enumValue]?.severity ?? 'secondary';\n}\n\n/**\n * Get file icon based on content type\n */\nexport function getFileIcon(contentType: string): string {\n if (contentType.startsWith('image/')) return 'pi pi-image';\n if (contentType.startsWith('video/')) return 'pi pi-video';\n if (contentType.startsWith('audio/')) return 'pi pi-volume-up';\n if (contentType.includes('pdf')) return 'pi pi-file-pdf';\n if (contentType.includes('word') || contentType.includes('document'))\n return 'pi pi-file-word';\n if (contentType.includes('excel') || contentType.includes('spreadsheet'))\n return 'pi pi-file-excel';\n return 'pi pi-file';\n}\n\n/**\n * Format file size from bytes to human readable string\n */\nexport function formatFileSize(bytes: number): string {\n if (bytes <= 0) return '0 Bytes';\n const k = 1024;\n const sizes = ['Bytes', 'KB', 'MB', 'GB'];\n const i = Math.min(Math.floor(Math.log(bytes) / Math.log(k)), sizes.length - 1);\n return Math.round((bytes / Math.pow(k, i)) * 100) / 100 + ' ' + sizes[i];\n}\n\n/**\n * Storage provider options for dropdown selects\n */\nexport const STORAGE_PROVIDERS = [\n { label: 'AWS S3', value: FileLocationEnum.AWS },\n { label: 'Azure Blob Storage', value: FileLocationEnum.AZURE },\n { label: 'SFTP', value: FileLocationEnum.SFTP },\n { label: 'Local Storage', value: FileLocationEnum.LOCAL },\n] as const;\n","import { computed, Directive, inject, signal } from '@angular/core';\nimport { Router } from '@angular/router';\nimport { APP_CONFIG, DEFAULT_APP_NAME } from '@flusys/ng-core';\nimport { LAYOUT_AUTH_STATE } from '@flusys/ng-layout';\nimport { BaseListPage } from '@flusys/ng-shared';\nimport { MessageService } from 'primeng/api';\n\n@Directive()\nexport abstract class BaseStoragePage {\n protected readonly router = inject(Router);\n protected readonly messageService = inject(MessageService);\n protected readonly appConfig = inject(APP_CONFIG);\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n readonly isLoading = signal(false);\n readonly showCompanyInfo = computed(() => this.appConfig.enableCompanyFeature);\n readonly currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME);\n\n protected showSuccess(detail: string, summary = 'Success'): void {\n this.messageService.add({ severity: 'success', summary, detail });\n }\n\n protected showError(detail: string, summary = 'Error'): void {\n this.messageService.add({ severity: 'error', summary, detail });\n }\n\n protected navigateTo(path: string[]): void {\n this.router.navigate(path);\n }\n}\n\n@Directive()\nexport abstract class BaseStorageListPage<T> extends BaseListPage<T> {\n protected readonly companyContext = inject(LAYOUT_AUTH_STATE);\n\n override readonly pageSize = signal(50);\n readonly totalRecords = this.total;\n readonly currentCompanyName = computed(() => this.companyContext.currentCompanyInfo()?.name ?? DEFAULT_APP_NAME);\n\n getDeleteConfirmMessage(item: T): string {\n const name = (item as { name?: string }).name ?? 'this item';\n return `Are you sure you want to delete \"${name}\"?`;\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { Observable, firstValueFrom } from 'rxjs';\nimport { ApiResourceService, ISingleResponse } from '@flusys/ng-shared';\nimport { ICreateFileManagerDto, IFileManager, IFilesResponseDto, IGetFilesRequestDto, IUpdateFileManagerDto } from '../interfaces/file-manager.interface';\n\n@Injectable({ providedIn: 'root' })\nexport class FileManagerApiService extends ApiResourceService<IUpdateFileManagerDto, IFileManager> {\n constructor() {\n super('file-manager', inject(HttpClient), 'storage');\n }\n\n getFiles(fileIds: string[]): Observable<ISingleResponse<IFilesResponseDto[]>> {\n const requests: IGetFilesRequestDto[] = fileIds.map((id) => ({ id }));\n return this.http.post<ISingleResponse<IFilesResponseDto[]>>(`${this.baseUrl}/get-files`, requests);\n }\n\n createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>> {\n return this.http.post<ISingleResponse<IFileManager>>(`${this.baseUrl}/insert`, dto);\n }\n\n async createFileAsync(dto: ICreateFileManagerDto): Promise<ISingleResponse<IFileManager>> {\n return firstValueFrom(this.createFile(dto));\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable, switchMap } from 'rxjs';\nimport { BaseApiService, getDefaultStorageConfigId } from '@flusys/ng-core';\nimport { ISingleResponse } from '@flusys/ng-shared';\nimport { IUploadOptionsDto, IUploadedFileInfo } from '../interfaces/upload.interface';\nimport { FileManagerApiService } from './file-manager-api.service';\nimport { IFileManager } from '../interfaces/file-manager.interface';\n\n/**\n * Upload Service - File upload/delete operations\n * Endpoint: POST /storage/upload/*\n */\n@Injectable({ providedIn: 'root' })\nexport class UploadService extends BaseApiService {\n private readonly fileManagerApi = inject(FileManagerApiService);\n\n constructor() {\n super('storage');\n }\n\n /** Get default storage config ID from app config */\n getDefaultConfigId(): string | undefined {\n return getDefaultStorageConfigId(this.appConfig);\n }\n\n /** Upload single file - POST /storage/upload/single-file */\n uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>> {\n const formData = new FormData();\n formData.append('file', file);\n return this.http.post<ISingleResponse<IUploadedFileInfo>>(this.buildUploadUrl('single-file', options), formData);\n }\n\n /** Upload multiple files (max 50) - POST /storage/upload/multiple-file */\n uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>> {\n const formData = new FormData();\n files.forEach((file) => formData.append('files', file));\n return this.http.post<ISingleResponse<IUploadedFileInfo[]>>(this.buildUploadUrl('multiple-file', options), formData);\n }\n\n /** Delete single file - POST /storage/upload/delete-single-file */\n deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-single-file'),\n this.buildDeleteBody({ key }, storageConfigId),\n );\n }\n\n /** Delete multiple files - POST /storage/upload/delete-multiple-file */\n deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>> {\n return this.http.post<ISingleResponse<void>>(\n this.getUrl('upload/delete-multiple-file'),\n this.buildDeleteBody({ keys }, storageConfigId),\n );\n }\n\n /** Get file download URL - GET /storage/upload/file/:filePath */\n getFileUrl(key: string): string {\n return this.getUrl(`upload/file/${key}`);\n }\n\n /** Upload file and register in file manager - returns file manager ID (UUID) */\n uploadAndRegister(\n file: File,\n options?: IUploadOptionsDto & { isPrivate?: boolean; folderId?: string },\n ): Observable<ISingleResponse<IFileManager>> {\n return this.uploadSingleFile(file, options).pipe(\n switchMap((response) => {\n if (!response.success || !response.data) {\n throw new Error(response.message || 'Upload failed');\n }\n return this.fileManagerApi.createFile({\n name: response.data.name,\n key: response.data.key,\n size: String(response.data.size),\n contentType: response.data.contentType,\n isPrivate: options?.isPrivate ?? false,\n folderId: options?.folderId,\n storageConfigId: this.resolveConfigId(options?.storageConfigId),\n });\n }),\n );\n }\n\n // ─── Private Helpers ───────────────────────────────────────────────────────\n\n private resolveConfigId(storageConfigId?: string): string | undefined {\n return storageConfigId ?? this.getDefaultConfigId();\n }\n\n private buildUploadUrl(endpoint: string, options?: IUploadOptionsDto): string {\n const params = this.buildQueryParams(options);\n const baseUrl = this.getUrl(`upload/${endpoint}`);\n return params ? `${baseUrl}?${params}` : baseUrl;\n }\n\n private buildQueryParams(options?: IUploadOptionsDto): string {\n const params = new URLSearchParams();\n const configId = this.resolveConfigId(options?.storageConfigId);\n\n if (configId) params.append('storageConfigId', configId);\n if (options?.folderPath) params.append('folderPath', options.folderPath);\n if (options?.maxWidth) params.append('maxWidth', options.maxWidth.toString());\n if (options?.maxHeight) params.append('maxHeight', options.maxHeight.toString());\n if (options?.quality) params.append('quality', options.quality.toString());\n if (options?.format) params.append('format', options.format);\n if (options?.compress !== undefined) params.append('compress', options.compress.toString());\n\n return params.toString();\n }\n\n private buildDeleteBody(data: { key?: string; keys?: string[] }, storageConfigId?: string): Record<string, unknown> {\n const configId = this.resolveConfigId(storageConfigId);\n return { ...data, ...(configId && { storageConfigId: configId }) };\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { Observable } from 'rxjs';\nimport { map } from 'rxjs/operators';\nimport {\n IProfileUploadProvider,\n IProfileUploadOptions,\n IProfileUploadResult,\n ISingleResponse,\n} from '@flusys/ng-shared';\nimport { UploadService } from '../services/upload.service';\n\n/**\n * Profile Upload Provider Adapter\n *\n * Implements IProfileUploadProvider interface for ng-auth profile page.\n * Uses UploadService.uploadAndRegister() to upload files and register in file manager.\n *\n * @example\n * // In app.config.ts\n * providers: [\n * ...provideStorageProviders(),\n * ]\n */\n@Injectable()\nexport class ProfileUploadProviderAdapter implements IProfileUploadProvider {\n private readonly uploadService = inject(UploadService);\n\n /**\n * Upload profile picture and register in file manager\n * Returns file manager ID (UUID) for storing in user.profilePictureId\n */\n uploadProfilePicture(\n file: File,\n options?: IProfileUploadOptions\n ): Observable<ISingleResponse<IProfileUploadResult>> {\n return this.uploadService\n .uploadAndRegister(file, {\n folderPath: options?.folderPath ?? 'profile-pictures',\n compress: options?.compress ?? true,\n maxWidth: options?.maxWidth ?? 400,\n maxHeight: options?.maxHeight ?? 400,\n })\n .pipe(\n map((response) => ({\n success: response.success,\n message: response.message,\n data: response.data\n ? {\n id: response.data.id,\n name: response.data.name,\n key: response.data.key,\n size: parseFloat(response.data.size) * 1024, // Convert KB to bytes\n contentType: response.data.contentType,\n }\n : undefined,\n }))\n );\n }\n}\n","import { Provider } from '@angular/core';\nimport { PROFILE_UPLOAD_PROVIDER } from '@flusys/ng-shared';\nimport { ProfileUploadProviderAdapter } from '../adapters/profile-upload-provider.adapter';\n\n/**\n * Provide Storage Providers\n *\n * Registers storage-related provider implementations.\n * Call this in app.config.ts to enable storage features in other packages.\n *\n * @example\n * // In app.config.ts\n * export const appConfig: ApplicationConfig = {\n * providers: [\n * ...provideStorageProviders(),\n * ],\n * };\n *\n * @returns Array of providers for storage functionality\n */\nexport function provideStorageProviders(): Provider[] {\n return [\n {\n provide: PROFILE_UPLOAD_PROVIDER,\n useClass: ProfileUploadProviderAdapter,\n },\n ];\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateFolderDto, IFolder, IUpdateFolderDto } from '../interfaces/folder.interface';\n\n/**\n * Folder API Service\n * Handles folder CRUD operations\n * Endpoint: POST /storage/folder/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class FolderApiService extends ApiResourceService<ICreateFolderDto | IUpdateFolderDto, IFolder> {\n constructor() {\n super('folder', inject(HttpClient), 'storage');\n }\n}\n","import { inject, Injectable } from '@angular/core';\nimport { HttpClient } from '@angular/common/http';\nimport { ApiResourceService } from '@flusys/ng-shared';\nimport { ICreateStorageConfigDto, IStorageConfig, IUpdateStorageConfigDto } from '../interfaces/storage-config.interface';\n\n/**\n * Storage Config API Service\n * Handles storage configuration CRUD operations\n * Endpoint: POST /storage/storage-config/*\n *\n * Note: Company feature enabled - all queries automatically scoped to user's company\n */\n@Injectable({\n providedIn: 'root',\n})\nexport class StorageConfigApiService extends ApiResourceService<\n ICreateStorageConfigDto | IUpdateStorageConfigDto,\n IStorageConfig\n> {\n constructor() {\n super('storage-config', inject(HttpClient), 'storage');\n }\n}\n","import { Routes } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n permissionGuard,\n STORAGE_CONFIG_PERMISSIONS,\n} from '@flusys/ng-shared';\n\n/**\n * Storage Module Routes\n * All routes protected by permission guards\n */\nexport const STORAGE_ROUTES: Routes = [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-container/storage-container.component').then(\n (m) => m.StorageContainerComponent,\n ),\n children: [\n // File Manager Routes\n {\n path: 'files',\n canActivate: [permissionGuard(FILE_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/file-manager/file-manager-list.component').then(\n (m) => m.FileManagerListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(FILE_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(FILE_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/file-manager/file-manager-form.component').then(\n (m) => m.FileManagerFormComponent,\n ),\n },\n ],\n },\n\n // Folder Routes\n {\n path: 'folders',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/folder/folder-list.component').then(\n (m) => m.FolderListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(FOLDER_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/folder/folder-form.component').then(\n (m) => m.FolderFormComponent,\n ),\n },\n ],\n },\n\n // Storage Config Routes\n {\n path: 'configs',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.READ)],\n children: [\n {\n path: '',\n loadComponent: () =>\n import('../pages/storage-config/storage-config-list.component').then(\n (m) => m.StorageConfigListComponent,\n ),\n },\n {\n path: 'new',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.CREATE)],\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n {\n path: ':id',\n canActivate: [permissionGuard(STORAGE_CONFIG_PERMISSIONS.UPDATE)],\n loadComponent: () =>\n import('../pages/storage-config/storage-config-form.component').then(\n (m) => m.StorageConfigFormComponent,\n ),\n },\n ],\n },\n\n // Default redirect\n { path: '', redirectTo: 'files', pathMatch: 'full' },\n ],\n },\n];\n","import { ChangeDetectionStrategy, Component, computed, inject } from '@angular/core';\nimport { CommonModule } from '@angular/common';\nimport { RouterLink, RouterLinkActive, RouterOutlet } from '@angular/router';\nimport {\n FILE_PERMISSIONS,\n FOLDER_PERMISSIONS,\n PermissionValidatorService,\n STORAGE_CONFIG_PERMISSIONS,\n} from '@flusys/ng-shared';\n\ninterface ITab {\n id: string;\n label: string;\n icon: string;\n route: string;\n permission: string;\n}\n\n/**\n * Storage Container Component\n *\n * Main container for Storage module with tab navigation\n * Routes: Files | Folders | Configurations\n * Tabs are filtered based on user permissions\n */\n@Component({\n selector: 'lib-storage-container',\n changeDetection: ChangeDetectionStrategy.OnPush,\n imports: [CommonModule, RouterOutlet, RouterLink, RouterLinkActive],\n styles: `\n .scrollbar-hide {\n -ms-overflow-style: none;\n scrollbar-width: none;\n &::-webkit-scrollbar { display: none; }\n }\n `,\n template: `\n <div class=\"p-2 sm:p-4\">\n <div class=\"mb-4\">\n <h1 class=\"text-xl sm:text-2xl font-bold m-0\">Storage</h1>\n <p class=\"text-muted-color mt-1 text-sm sm:text-base\">{{ subtitle() }}</p>\n </div>\n\n <div class=\"scrollbar-hide flex gap-1 mb-4 border-b border-surface overflow-x-auto flex-nowrap\">\n @for (tab of visibleTabs(); track tab.id) {\n <a\n [routerLink]=\"tab.route\"\n routerLinkActive=\"tab-active\"\n class=\"flex items-center gap-2 px-4 py-2 rounded-t-lg cursor-pointer transition-colors text-muted-color no-underline border-b-2 border-transparent -mb-px hover:bg-surface-hover [&.tab-active]:text-primary [&.tab-active]:border-primary [&.tab-active]:bg-surface-ground whitespace-nowrap shrink-0\"\n >\n <i [class]=\"tab.icon\"></i>\n <span>{{ tab.label }}</span>\n </a>\n }\n </div>\n\n <router-outlet />\n </div>\n `,\n})\nexport class StorageContainerComponent {\n private readonly permissionValidator = inject(PermissionValidatorService);\n\n /** All available tabs with required permissions */\n private readonly allTabs: ITab[] = [\n {\n id: 'files',\n label: 'Files',\n icon: 'pi pi-file',\n route: 'files',\n permission: FILE_PERMISSIONS.READ,\n },\n {\n id: 'folders',\n label: 'Folders',\n icon: 'pi pi-folder',\n route: 'folders',\n permission: FOLDER_PERMISSIONS.READ,\n },\n {\n id: 'configs',\n label: 'Configurations',\n icon: 'pi pi-cog',\n route: 'configs',\n permission: STORAGE_CONFIG_PERMISSIONS.READ,\n },\n ];\n\n /** Visible tabs based on user permissions */\n readonly visibleTabs = computed(() =>\n this.allTabs.filter((tab) => this.permissionValidator.hasPermission(tab.permission)),\n );\n\n /** Dynamic subtitle based on visible tabs */\n readonly subtitle = computed(() => {\n const tabs = this.visibleTabs();\n if (tabs.length === 0) return 'No permissions available';\n return `Manage ${tabs.map((t) => t.label.toLowerCase()).join(', ')}`;\n });\n}\n","// =============================================================================\n// @flusys/ng-storage - Storage Package\n// =============================================================================\n\n// Enums\nexport * from './enums/public-api';\n\n// Interfaces\nexport * from './interfaces/public-api';\n\n// Utils\nexport * from './utils/public-api';\n\n// Adapters\nexport { ProfileUploadProviderAdapter } from './adapters/profile-upload-provider.adapter';\n\n// Providers\nexport { provideStorageProviders } from './providers/storage-providers';\n\n// Services\nexport { FileManagerApiService } from './services/file-manager-api.service';\nexport { FolderApiService } from './services/folder-api.service';\nexport { StorageConfigApiService } from './services/storage-config-api.service';\nexport { UploadService } from './services/upload.service';\n\n// Routes\nexport { STORAGE_ROUTES } from './routes/storage.routes';\n\n// Components\nexport { StorageContainerComponent } from './pages/storage-container/storage-container.component';\n","/**\n * Generated bundle index. Do not edit.\n */\n\nexport * from './public-api';\n"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@flusys/ng-storage",
|
|
3
|
-
"version": "1.1.0
|
|
3
|
+
"version": "1.1.0",
|
|
4
4
|
"description": "File storage module for FLUSYS Angular applications",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"peerDependencies": {
|
|
7
|
-
"@angular/common": "
|
|
8
|
-
"@angular/core": "
|
|
9
|
-
"@flusys/ng-core": "
|
|
10
|
-
"@flusys/ng-layout": "
|
|
11
|
-
"@flusys/ng-shared": "
|
|
12
|
-
"@primeuix/themes": "
|
|
13
|
-
"primeicons": "
|
|
14
|
-
"primeng": "
|
|
7
|
+
"@angular/common": ">=21.0.0",
|
|
8
|
+
"@angular/core": ">=21.0.0",
|
|
9
|
+
"@flusys/ng-core": ">=1.1.0",
|
|
10
|
+
"@flusys/ng-layout": ">=1.1.0",
|
|
11
|
+
"@flusys/ng-shared": ">=1.1.0",
|
|
12
|
+
"@primeuix/themes": ">=1.0.0",
|
|
13
|
+
"primeicons": ">=7.0.0",
|
|
14
|
+
"primeng": ">=21.0.0"
|
|
15
15
|
},
|
|
16
16
|
"dependencies": {
|
|
17
17
|
"tslib": "^2.3.0"
|
|
@@ -1,9 +1,12 @@
|
|
|
1
|
-
import { IBaseEntity, IProfileUploadProvider, IProfileUploadOptions, ISingleResponse, IProfileUploadResult, ApiResourceService
|
|
2
|
-
import { Observable } from 'rxjs';
|
|
1
|
+
import { IBaseEntity, BaseListPage, IProfileUploadProvider, IProfileUploadOptions, ISingleResponse, IProfileUploadResult, ApiResourceService } from '@flusys/ng-shared';
|
|
3
2
|
import * as i0 from '@angular/core';
|
|
4
3
|
import { Provider } from '@angular/core';
|
|
4
|
+
import * as _flusys_ng_layout from '@flusys/ng-layout';
|
|
5
|
+
import * as _flusys_ng_core from '@flusys/ng-core';
|
|
5
6
|
import { BaseApiService } from '@flusys/ng-core';
|
|
6
|
-
import { Routes } from '@angular/router';
|
|
7
|
+
import { Router, Routes } from '@angular/router';
|
|
8
|
+
import { MessageService } from 'primeng/api';
|
|
9
|
+
import { Observable } from 'rxjs';
|
|
7
10
|
|
|
8
11
|
/**
|
|
9
12
|
* File Location Enum
|
|
@@ -29,10 +32,7 @@ declare enum ImageFormat {
|
|
|
29
32
|
/**
|
|
30
33
|
* File Manager Interface (matches backend IFileManager)
|
|
31
34
|
*/
|
|
32
|
-
interface IFileManager {
|
|
33
|
-
id: string;
|
|
34
|
-
createdAt: Date;
|
|
35
|
-
updatedAt: Date;
|
|
35
|
+
interface IFileManager extends IBaseEntity {
|
|
36
36
|
name: string;
|
|
37
37
|
contentType: string;
|
|
38
38
|
size: string;
|
|
@@ -84,69 +84,36 @@ interface IFilesResponseDto {
|
|
|
84
84
|
url: string;
|
|
85
85
|
}
|
|
86
86
|
|
|
87
|
-
/**
|
|
88
|
-
* Folder Interface
|
|
89
|
-
* Matches backend IFolder and FolderResponseDto
|
|
90
|
-
*/
|
|
91
87
|
interface IFolder extends IBaseEntity {
|
|
92
88
|
name: string;
|
|
93
89
|
slug: string;
|
|
94
90
|
companyId?: string | null;
|
|
95
91
|
}
|
|
96
|
-
/**
|
|
97
|
-
* Create Folder DTO
|
|
98
|
-
* POST /storage/folder/insert
|
|
99
|
-
*/
|
|
100
92
|
interface ICreateFolderDto {
|
|
101
93
|
name: string;
|
|
102
94
|
}
|
|
103
|
-
|
|
104
|
-
* Update Folder DTO
|
|
105
|
-
* POST /storage/folder/update
|
|
106
|
-
*/
|
|
107
|
-
interface IUpdateFolderDto {
|
|
95
|
+
interface IUpdateFolderDto extends Partial<ICreateFolderDto> {
|
|
108
96
|
id: string;
|
|
109
|
-
name?: string;
|
|
110
97
|
}
|
|
111
98
|
|
|
112
|
-
/**
|
|
113
|
-
* Storage Config Interface
|
|
114
|
-
* Matches backend IStorageConfig and StorageConfigResponseDto
|
|
115
|
-
*/
|
|
116
99
|
interface IStorageConfig extends IBaseEntity {
|
|
117
100
|
name: string;
|
|
118
101
|
storage: FileLocationEnum;
|
|
119
|
-
config: Record<string,
|
|
102
|
+
config: Record<string, unknown>;
|
|
120
103
|
isActive: boolean;
|
|
121
104
|
isDefault: boolean;
|
|
122
105
|
companyId?: string | null;
|
|
123
106
|
}
|
|
124
|
-
/**
|
|
125
|
-
* Create Storage Config DTO
|
|
126
|
-
* POST /storage/storage-config/insert
|
|
127
|
-
*/
|
|
128
107
|
interface ICreateStorageConfigDto {
|
|
129
108
|
name: string;
|
|
130
109
|
storage: FileLocationEnum;
|
|
131
|
-
config: Record<string,
|
|
110
|
+
config: Record<string, unknown>;
|
|
132
111
|
isActive?: boolean;
|
|
133
112
|
isDefault?: boolean;
|
|
134
113
|
}
|
|
135
|
-
|
|
136
|
-
* Update Storage Config DTO
|
|
137
|
-
* POST /storage/storage-config/update
|
|
138
|
-
*/
|
|
139
|
-
interface IUpdateStorageConfigDto {
|
|
114
|
+
interface IUpdateStorageConfigDto extends Partial<ICreateStorageConfigDto> {
|
|
140
115
|
id: string;
|
|
141
|
-
name?: string;
|
|
142
|
-
storage?: FileLocationEnum;
|
|
143
|
-
config?: Record<string, any>;
|
|
144
|
-
isActive?: boolean;
|
|
145
|
-
isDefault?: boolean;
|
|
146
116
|
}
|
|
147
|
-
/**
|
|
148
|
-
* AWS S3 Configuration
|
|
149
|
-
*/
|
|
150
117
|
interface IAwsS3Config {
|
|
151
118
|
region: string;
|
|
152
119
|
bucket: string;
|
|
@@ -154,17 +121,11 @@ interface IAwsS3Config {
|
|
|
154
121
|
secretAccessKey: string;
|
|
155
122
|
endpoint?: string;
|
|
156
123
|
}
|
|
157
|
-
/**
|
|
158
|
-
* Azure Blob Storage Configuration
|
|
159
|
-
*/
|
|
160
124
|
interface IAzureBlobConfig {
|
|
161
125
|
accountName: string;
|
|
162
126
|
accountKey: string;
|
|
163
127
|
containerName: string;
|
|
164
128
|
}
|
|
165
|
-
/**
|
|
166
|
-
* SFTP Configuration
|
|
167
|
-
*/
|
|
168
129
|
interface ISftpConfig {
|
|
169
130
|
host: string;
|
|
170
131
|
port: number;
|
|
@@ -173,9 +134,6 @@ interface ISftpConfig {
|
|
|
173
134
|
privateKey?: string;
|
|
174
135
|
basePath: string;
|
|
175
136
|
}
|
|
176
|
-
/**
|
|
177
|
-
* Local Storage Configuration
|
|
178
|
-
*/
|
|
179
137
|
interface ILocalStorageConfig {
|
|
180
138
|
basePath: string;
|
|
181
139
|
}
|
|
@@ -200,6 +158,69 @@ interface IUploadedFileInfo {
|
|
|
200
158
|
key: string;
|
|
201
159
|
size: number;
|
|
202
160
|
contentType: string;
|
|
161
|
+
location?: string;
|
|
162
|
+
storageConfigId?: string;
|
|
163
|
+
}
|
|
164
|
+
|
|
165
|
+
/**
|
|
166
|
+
* Get provider label for display
|
|
167
|
+
*/
|
|
168
|
+
declare function getProviderLabel(storage: FileLocationEnum | string): string;
|
|
169
|
+
/**
|
|
170
|
+
* Get provider icon class
|
|
171
|
+
*/
|
|
172
|
+
declare function getProviderIcon(storage: FileLocationEnum | string): string;
|
|
173
|
+
/**
|
|
174
|
+
* Get provider severity for p-tag
|
|
175
|
+
*/
|
|
176
|
+
declare function getProviderSeverity(storage: FileLocationEnum | string): 'success' | 'info' | 'warn' | 'danger' | 'secondary' | 'contrast';
|
|
177
|
+
/**
|
|
178
|
+
* Get file icon based on content type
|
|
179
|
+
*/
|
|
180
|
+
declare function getFileIcon(contentType: string): string;
|
|
181
|
+
/**
|
|
182
|
+
* Format file size from bytes to human readable string
|
|
183
|
+
*/
|
|
184
|
+
declare function formatFileSize(bytes: number): string;
|
|
185
|
+
/**
|
|
186
|
+
* Storage provider options for dropdown selects
|
|
187
|
+
*/
|
|
188
|
+
declare const STORAGE_PROVIDERS: readonly [{
|
|
189
|
+
readonly label: "AWS S3";
|
|
190
|
+
readonly value: FileLocationEnum.AWS;
|
|
191
|
+
}, {
|
|
192
|
+
readonly label: "Azure Blob Storage";
|
|
193
|
+
readonly value: FileLocationEnum.AZURE;
|
|
194
|
+
}, {
|
|
195
|
+
readonly label: "SFTP";
|
|
196
|
+
readonly value: FileLocationEnum.SFTP;
|
|
197
|
+
}, {
|
|
198
|
+
readonly label: "Local Storage";
|
|
199
|
+
readonly value: FileLocationEnum.LOCAL;
|
|
200
|
+
}];
|
|
201
|
+
|
|
202
|
+
declare abstract class BaseStoragePage {
|
|
203
|
+
protected readonly router: Router;
|
|
204
|
+
protected readonly messageService: MessageService;
|
|
205
|
+
protected readonly appConfig: _flusys_ng_core.IAppConfig;
|
|
206
|
+
protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
|
|
207
|
+
readonly isLoading: i0.WritableSignal<boolean>;
|
|
208
|
+
readonly showCompanyInfo: i0.Signal<boolean>;
|
|
209
|
+
readonly currentCompanyName: i0.Signal<string>;
|
|
210
|
+
protected showSuccess(detail: string, summary?: string): void;
|
|
211
|
+
protected showError(detail: string, summary?: string): void;
|
|
212
|
+
protected navigateTo(path: string[]): void;
|
|
213
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BaseStoragePage, never>;
|
|
214
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStoragePage, never, never, {}, {}, never, never, true, never>;
|
|
215
|
+
}
|
|
216
|
+
declare abstract class BaseStorageListPage<T> extends BaseListPage<T> {
|
|
217
|
+
protected readonly companyContext: _flusys_ng_layout.ILayoutAuthState;
|
|
218
|
+
readonly pageSize: i0.WritableSignal<number>;
|
|
219
|
+
readonly totalRecords: i0.WritableSignal<number>;
|
|
220
|
+
readonly currentCompanyName: i0.Signal<string>;
|
|
221
|
+
getDeleteConfirmMessage(item: T): string;
|
|
222
|
+
static ɵfac: i0.ɵɵFactoryDeclaration<BaseStorageListPage<any>, never>;
|
|
223
|
+
static ɵdir: i0.ɵɵDirectiveDeclaration<BaseStorageListPage<any>, never, never, {}, {}, never, never, true, never>;
|
|
203
224
|
}
|
|
204
225
|
|
|
205
226
|
/**
|
|
@@ -243,38 +264,11 @@ declare class ProfileUploadProviderAdapter implements IProfileUploadProvider {
|
|
|
243
264
|
*/
|
|
244
265
|
declare function provideStorageProviders(): Provider[];
|
|
245
266
|
|
|
246
|
-
/**
|
|
247
|
-
* File Manager API Service
|
|
248
|
-
* Handles file metadata CRUD operations
|
|
249
|
-
* Endpoint: POST /storage/file-manager/*
|
|
250
|
-
*
|
|
251
|
-
* Note: Company feature enabled - all queries automatically scoped to user's company
|
|
252
|
-
*/
|
|
253
267
|
declare class FileManagerApiService extends ApiResourceService<IUpdateFileManagerDto, IFileManager> {
|
|
254
268
|
constructor();
|
|
255
|
-
/**
|
|
256
|
-
* Get multiple files with valid URLs
|
|
257
|
-
* POST /storage/file-manager/get-files
|
|
258
|
-
* Regenerates presigned URLs if expired
|
|
259
|
-
*/
|
|
260
269
|
getFiles(fileIds: string[]): Observable<ISingleResponse<IFilesResponseDto[]>>;
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
* POST /storage/file-manager/get-all
|
|
264
|
-
* Filtered by folder ID and company (if enabled)
|
|
265
|
-
*/
|
|
266
|
-
getFilesByFolder(folderId: number | null, page?: number, limit?: number): Observable<IListResponse<IFileManager>>;
|
|
267
|
-
/**
|
|
268
|
-
* Get private files (requires permission)
|
|
269
|
-
* POST /storage/file-manager/get-all
|
|
270
|
-
* Filtered by isPrivate and user permission 'storage.file.viewPrivate'
|
|
271
|
-
*/
|
|
272
|
-
getPrivateFiles(page?: number, limit?: number): Observable<IListResponse<IFileManager>>;
|
|
273
|
-
/**
|
|
274
|
-
* Create new file manager record
|
|
275
|
-
* POST /storage/file-manager/insert
|
|
276
|
-
*/
|
|
277
|
-
create(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>>;
|
|
270
|
+
createFile(dto: ICreateFileManagerDto): Observable<ISingleResponse<IFileManager>>;
|
|
271
|
+
createFileAsync(dto: ICreateFileManagerDto): Promise<ISingleResponse<IFileManager>>;
|
|
278
272
|
static ɵfac: i0.ɵɵFactoryDeclaration<FileManagerApiService, never>;
|
|
279
273
|
static ɵprov: i0.ɵɵInjectableDeclaration<FileManagerApiService>;
|
|
280
274
|
}
|
|
@@ -286,7 +280,7 @@ declare class FileManagerApiService extends ApiResourceService<IUpdateFileManage
|
|
|
286
280
|
*
|
|
287
281
|
* Note: Company feature enabled - all queries automatically scoped to user's company
|
|
288
282
|
*/
|
|
289
|
-
declare class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFolder> {
|
|
283
|
+
declare class FolderApiService extends ApiResourceService<ICreateFolderDto | IUpdateFolderDto, IFolder> {
|
|
290
284
|
constructor();
|
|
291
285
|
static ɵfac: i0.ɵɵFactoryDeclaration<FolderApiService, never>;
|
|
292
286
|
static ɵprov: i0.ɵɵInjectableDeclaration<FolderApiService>;
|
|
@@ -299,98 +293,47 @@ declare class FolderApiService extends ApiResourceService<IUpdateFolderDto, IFol
|
|
|
299
293
|
*
|
|
300
294
|
* Note: Company feature enabled - all queries automatically scoped to user's company
|
|
301
295
|
*/
|
|
302
|
-
declare class StorageConfigApiService extends ApiResourceService<IUpdateStorageConfigDto, IStorageConfig> {
|
|
296
|
+
declare class StorageConfigApiService extends ApiResourceService<ICreateStorageConfigDto | IUpdateStorageConfigDto, IStorageConfig> {
|
|
303
297
|
constructor();
|
|
304
298
|
static ɵfac: i0.ɵɵFactoryDeclaration<StorageConfigApiService, never>;
|
|
305
299
|
static ɵprov: i0.ɵɵInjectableDeclaration<StorageConfigApiService>;
|
|
306
300
|
}
|
|
307
301
|
|
|
308
302
|
/**
|
|
309
|
-
* Upload Service
|
|
310
|
-
* Handles file upload/delete operations
|
|
303
|
+
* Upload Service - File upload/delete operations
|
|
311
304
|
* Endpoint: POST /storage/upload/*
|
|
312
|
-
*
|
|
313
|
-
* Features:
|
|
314
|
-
* - Company-scoped uploads (if company feature enabled)
|
|
315
|
-
* - Image compression
|
|
316
|
-
* - Multiple storage providers
|
|
317
|
-
* - File validation (size, type)
|
|
318
|
-
* - Default storage config from environment (services.storage.defaultStorageConfigId)
|
|
319
305
|
*/
|
|
320
306
|
declare class UploadService extends BaseApiService {
|
|
321
307
|
private readonly fileManagerApi;
|
|
322
308
|
constructor();
|
|
323
|
-
/**
|
|
324
|
-
* Get default storage config ID from app config
|
|
325
|
-
* Used when no storageConfigId is provided in upload options
|
|
326
|
-
*/
|
|
309
|
+
/** Get default storage config ID from app config */
|
|
327
310
|
getDefaultConfigId(): string | undefined;
|
|
328
|
-
/**
|
|
329
|
-
* Upload single file
|
|
330
|
-
* POST /storage/upload/single-file?storageConfigId=x&folderPath=y
|
|
331
|
-
*
|
|
332
|
-
* @param file - File to upload
|
|
333
|
-
* @param options - Upload options (storage config, compression, etc.)
|
|
334
|
-
*/
|
|
311
|
+
/** Upload single file - POST /storage/upload/single-file */
|
|
335
312
|
uploadSingleFile(file: File, options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo>>;
|
|
336
|
-
/**
|
|
337
|
-
* Upload multiple files (max 50)
|
|
338
|
-
* POST /storage/upload/multiple-file?storageConfigId=x&folderPath=y
|
|
339
|
-
*
|
|
340
|
-
* @param files - Array of files to upload
|
|
341
|
-
* @param options - Upload options
|
|
342
|
-
*/
|
|
313
|
+
/** Upload multiple files (max 50) - POST /storage/upload/multiple-file */
|
|
343
314
|
uploadMultipleFiles(files: File[], options?: IUploadOptionsDto): Observable<ISingleResponse<IUploadedFileInfo[]>>;
|
|
344
|
-
/**
|
|
345
|
-
* Build query string from upload options
|
|
346
|
-
* Uses default storageConfigId from app config if not provided in options
|
|
347
|
-
*/
|
|
348
|
-
private buildQueryParams;
|
|
349
|
-
/**
|
|
350
|
-
* Delete single file
|
|
351
|
-
* POST /storage/upload/delete-single-file
|
|
352
|
-
*
|
|
353
|
-
* @param key - File key/path to delete
|
|
354
|
-
* @param storageConfigId - Optional storage config ID (uses default from config if not provided)
|
|
355
|
-
*/
|
|
315
|
+
/** Delete single file - POST /storage/upload/delete-single-file */
|
|
356
316
|
deleteSingleFile(key: string, storageConfigId?: string): Observable<ISingleResponse<void>>;
|
|
357
|
-
/**
|
|
358
|
-
* Delete multiple files
|
|
359
|
-
* POST /storage/upload/delete-multiple-file
|
|
360
|
-
*
|
|
361
|
-
* @param keys - Array of file keys/paths to delete
|
|
362
|
-
* @param storageConfigId - Optional storage config ID (uses default from config if not provided)
|
|
363
|
-
*/
|
|
317
|
+
/** Delete multiple files - POST /storage/upload/delete-multiple-file */
|
|
364
318
|
deleteMultipleFiles(keys: string[], storageConfigId?: string): Observable<ISingleResponse<void>>;
|
|
365
|
-
/**
|
|
366
|
-
* Get file download URL
|
|
367
|
-
* GET /storage/upload/file/:filePath
|
|
368
|
-
*
|
|
369
|
-
* @param key - File key/path
|
|
370
|
-
* @returns URL for direct file access
|
|
371
|
-
*/
|
|
319
|
+
/** Get file download URL - GET /storage/upload/file/:filePath */
|
|
372
320
|
getFileUrl(key: string): string;
|
|
373
|
-
/**
|
|
374
|
-
* Upload file and register in file manager
|
|
375
|
-
* Returns file manager ID (UUID) for storing in references like profilePictureId
|
|
376
|
-
*
|
|
377
|
-
* @param file - File to upload
|
|
378
|
-
* @param options - Upload options (storage config, compression, etc.)
|
|
379
|
-
* @returns Observable with file manager record (id is the UUID to store)
|
|
380
|
-
*/
|
|
321
|
+
/** Upload file and register in file manager - returns file manager ID (UUID) */
|
|
381
322
|
uploadAndRegister(file: File, options?: IUploadOptionsDto & {
|
|
382
323
|
isPrivate?: boolean;
|
|
383
324
|
folderId?: string;
|
|
384
325
|
}): Observable<ISingleResponse<IFileManager>>;
|
|
326
|
+
private resolveConfigId;
|
|
327
|
+
private buildUploadUrl;
|
|
328
|
+
private buildQueryParams;
|
|
329
|
+
private buildDeleteBody;
|
|
385
330
|
static ɵfac: i0.ɵɵFactoryDeclaration<UploadService, never>;
|
|
386
331
|
static ɵprov: i0.ɵɵInjectableDeclaration<UploadService>;
|
|
387
332
|
}
|
|
388
333
|
|
|
389
334
|
/**
|
|
390
335
|
* Storage Module Routes
|
|
391
|
-
* All
|
|
392
|
-
*
|
|
393
|
-
* All routes are protected by permission guards to prevent direct URL access.
|
|
336
|
+
* All routes protected by permission guards
|
|
394
337
|
*/
|
|
395
338
|
declare const STORAGE_ROUTES: Routes;
|
|
396
339
|
|
|
@@ -399,19 +342,26 @@ interface ITab {
|
|
|
399
342
|
label: string;
|
|
400
343
|
icon: string;
|
|
401
344
|
route: string;
|
|
345
|
+
permission: string;
|
|
402
346
|
}
|
|
403
347
|
/**
|
|
404
348
|
* Storage Container Component
|
|
405
349
|
*
|
|
406
350
|
* Main container for Storage module with tab navigation
|
|
407
351
|
* Routes: Files | Folders | Configurations
|
|
352
|
+
* Tabs are filtered based on user permissions
|
|
408
353
|
*/
|
|
409
354
|
declare class StorageContainerComponent {
|
|
410
|
-
|
|
411
|
-
|
|
355
|
+
private readonly permissionValidator;
|
|
356
|
+
/** All available tabs with required permissions */
|
|
357
|
+
private readonly allTabs;
|
|
358
|
+
/** Visible tabs based on user permissions */
|
|
359
|
+
readonly visibleTabs: i0.Signal<ITab[]>;
|
|
360
|
+
/** Dynamic subtitle based on visible tabs */
|
|
361
|
+
readonly subtitle: i0.Signal<string>;
|
|
412
362
|
static ɵfac: i0.ɵɵFactoryDeclaration<StorageContainerComponent, never>;
|
|
413
363
|
static ɵcmp: i0.ɵɵComponentDeclaration<StorageContainerComponent, "lib-storage-container", never, {}, {}, never, never, true, never>;
|
|
414
364
|
}
|
|
415
365
|
|
|
416
|
-
export { FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, ProfileUploadProviderAdapter, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService, provideStorageProviders };
|
|
366
|
+
export { BaseStorageListPage, BaseStoragePage, FileLocationEnum, FileManagerApiService, FolderApiService, ImageFormat, ProfileUploadProviderAdapter, STORAGE_PROVIDERS, STORAGE_ROUTES, StorageConfigApiService, StorageContainerComponent, UploadService, formatFileSize, getFileIcon, getProviderIcon, getProviderLabel, getProviderSeverity, provideStorageProviders };
|
|
417
367
|
export type { IAwsS3Config, IAzureBlobConfig, ICreateFileManagerDto, ICreateFolderDto, ICreateStorageConfigDto, IFileManager, IFilesResponseDto, IFolder, IGetFilesRequestDto, ILocalStorageConfig, ISftpConfig, IStorageConfig, IUpdateFileManagerDto, IUpdateFolderDto, IUpdateStorageConfigDto, IUploadOptionsDto, IUploadedFileInfo };
|