namespace GB5Shared.Storage { /// /// Context object passed to when building the physical /// storage path from a template. All token values must be set by the caller before resolving. /// public class StoragePathContext { /// Tenant/client identifier (LoginDTO.ClientId). public string ClientId { get; set; } = string.Empty; /// /// Human-readable entity type code (e.g., "EMPLOYEE", "PO", "INVOICE"). /// Used in directory partitioning — keep short and filesystem-safe. /// public string ObjectTypeCode { get; set; } = string.Empty; /// Entity instance ID (e.g., EmployeeId, PurchaseOrderId). public int ObjectId { get; set; } /// Year component of the file date (for year-partitioned layouts). public int Year { get; set; } /// Month component (1–12) of the file date. public int Month { get; set; } /// /// Opaque unique identifier for this specific file (GUID-based, no guessable pattern). /// Used as the file name segment so the physical name is never user-controlled. /// public string AttachmentId { get; set; } = string.Empty; /// File extension including the leading dot, e.g. ".pdf", ".jpg". public string Ext { get; set; } = string.Empty; /// Document type code for optional category-based partitioning. public string DocumentTypeCode { get; set; } = string.Empty; } }