using System.ComponentModel.DataAnnotations; using System.Text.Json; namespace WordVersioning.Api.Models; /// body ของ POST /api/documents/{documentId}/versions (multipart/form-data) public class UploadVersionRequest { [Required] public IFormFile File { get; set; } = null!; /// GUID ที่ client generate ต่อ version — ใช้เป็นส่วนหนึ่งของ object key [Required] public string ClientVersionId { get; set; } = string.Empty; /// JSON object map tag→text จาก content controls (FR-11) public string? Fields { get; set; } /// คำอธิบาย version แบบ commit message (FR-13) — optional public string? Message { get; set; } } public record UploadVersionResponse(Guid VersionId, int VersionNumber); /// body ของ POST /api/documents/generate (FR-10) public class GenerateDocumentRequest { [Required] public Guid TemplateId { get; set; } /// map fieldKey → value (ค่า scalar ทั้งหมด) public JsonElement Values { get; set; } /// คำอธิบาย version แบบ commit message (FR-13) — optional public string? Message { get; set; } } public record GenerateDocumentResponse(Guid DocumentId, Guid VersionId, int VersionNumber, string DownloadUrl); /// item ของ version history — fields คือ snapshot ที่ parse แล้ว (ถ้ามี), message คือคำอธิบายของผู้ใช้ (FR-13) public record VersionListItem( Guid VersionId, int VersionNumber, DateTimeOffset CreatedAt, string CreatedByUserId, string ContentHash, object? Fields, string? Message); /// response ของ GET .../download-link — presigned URL อายุสั้นให้เปิดในเบราว์เซอร์ของผู้ใช้ public record VersionDownloadLinkResponse(string Url, DateTimeOffset ExpiresAt); /// item ของ GET /api/templates/{templateId}/documents — รายการเอกสารของ template หนึ่งตัว (FR-12) public record TemplateDocumentListItem( Guid DocumentId, string FileName, DateTimeOffset CreatedAt, int VersionCount, int LatestVersionNumber, DateTimeOffset? LatestVersionAt); /// field หนึ่งตัวของ document (FR-12) — นิยามจาก TemplateField + ค่าล่าสุดจาก DocumentFieldValue /// Label/Type/IsRequired เป็น null เมื่อมีค่าเก็บไว้แต่ key ไม่มีในนิยาม template ปัจจุบัน /// (เช่น replace ไฟล์แล้ว tag หาย) — SourceVersionId/UpdatedByUserId/UpdatedAt เป็น null เมื่อ /// field เพิ่มเข้า template หลังเอกสารนี้ถูกสร้าง (ยังไม่เคยมีค่า) public record DocumentFieldItem( string Key, string? Label, string? Type, bool? IsRequired, string Value, Guid? SourceVersionId, string? UpdatedByUserId, DateTimeOffset? UpdatedAt); /// response ของ GET /api/documents/{documentId} (FR-12) — /// TemplateId null คือเอกสาร track เองจาก add-in (ไม่มีนิยาม field, Fields ว่าง) public record DocumentDetail( Guid Id, string FileName, DateTimeOffset CreatedAt, Guid? TemplateId, string? TemplateName, bool TemplateIsActive, IReadOnlyList Fields);