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);