Made-with: Cursor
3.8 KiB
Resource Management
1. High-Level Overview
Purpose: Server-side file storage management — upload, list, download (with per-user AES encryption), folder clearing, and installer distribution.
Architectural Pattern: Service layer — filesystem operations with encryption applied at the service boundary.
Upstream dependencies: Data Layer (ResourcesConfig), Authentication & Security (encryption via Security.EncryptTo).
Downstream consumers: Admin API (resource endpoints).
2. Internal Interfaces
Interface: IResourcesService
| Method | Input | Output | Async | Error Types |
|---|---|---|---|---|
GetInstaller |
bool isStage |
(string?, Stream?) |
No | None (returns nulls if not found) |
GetEncryptedResource |
string? dataFolder, string fileName, string key, CancellationToken |
Stream |
Yes | FileNotFoundException |
SaveResource |
string? dataFolder, IFormFile data, CancellationToken |
void | Yes | BusinessException(NoFileProvided) |
ListResources |
string? dataFolder, string? search, CancellationToken |
IEnumerable<string> |
Yes | DirectoryNotFoundException |
ClearFolder |
string? dataFolder |
void | No | None |
Input DTOs:
GetResourceRequest:
Password: string (required, min 8 chars)
Hardware: string (required, not empty)
FileName: string (required, not empty)
CheckResourceRequest:
Hardware: string (required)
3. External API Specification
N/A — exposed through Admin API.
4. Data Access Patterns
No database access. All operations are filesystem-based.
Storage Estimates
Resources are stored as flat files in configured directories. Size depends on uploaded content (AI models, DLLs, installers — potentially hundreds of MB per file).
5. Implementation Details
State Management: Stateless — reads/writes directly to filesystem.
Key Dependencies: None beyond BCL (System.IO).
Error Handling Strategy:
SaveResourcethrowsBusinessException(NoFileProvided)for null uploads.- Missing files/directories throw standard .NET I/O exceptions.
ClearFoldersilently returns if directory doesn't exist.GetInstallerreturns(null, null)tuple if installer file is not found.
6. Extensions and Helpers
| Helper | Purpose | Used By |
|---|---|---|
Security.EncryptTo |
AES stream encryption | GetEncryptedResource |
Security.GetApiEncryptionKey |
Key derivation | Admin API (before calling GetEncryptedResource) |
7. Caveats & Edge Cases
Known limitations:
- No path traversal protection:
dataFolderparameter is concatenated directly withResourcesFolder. A maliciousdataFolderlike../../etccould access arbitrary filesystem paths. SaveResourcedeletes existing file before writing — no versioning or backup.GetEncryptedResourceloads the entire encrypted file into aMemoryStream— memory-intensive for large files.ListResourceswraps a synchronousDirectoryInfo.GetFilesinTask.FromResult— not truly async.
Performance bottlenecks:
- Full file encryption to memory before streaming response: memory usage scales with file size.
ClearFolderiterates and deletes files synchronously.
8. Dependency Graph
Must be implemented after: Data Layer (ResourcesConfig), Authentication & Security (encryption).
Can be implemented in parallel with: User Management.
Blocks: Admin API.
9. Logging Strategy
| Log Level | When | Example |
|---|---|---|
| INFO | Successful file save | Resource {data.FileName} Saved Successfully |
Log format: String interpolation via Serilog.
Log storage: Console + rolling file (via Serilog configured in Program.cs).
Modules Covered
Services/ResourcesServiceCommon/Requests/GetResourceRequest(includes CheckResourceRequest)Common/Configs/ResourcesConfig