- ใส่คำอธิบายแบบ commit message ได้ทุก flow ที่สร้าง version (Save & Version / Start Versioning / generate จากเว็บ) + แสดงใน version history ทุกหน้า - backend: DocumentVersion.Message (varchar 2048) + migration AddVersionMessage + BadRequest ตรวจความยาวก่อนแตะ MinIO (กัน 500 + orphan object) - add-in: ConfirmVersionDialog เพิ่ม textarea (Start Versioning ใช้ dialog ด้วย) + แสดง message ใน VersionHistoryPanel - web: ฟอร์มสร้างเอกสาร + หน้า detail แสดง message (desktop truncate + tooltip, mobile เต็มบรรทัด) - sync เอกสารทั้งหมด: spec v5 (FR-13/AC-16) + plan Phase 9 + acceptance-review 1–16 + README + CLAUDE.md + web/README - tests: backend 52 / addin 50 / web 36 — เขียวทั้งชุด Co-Authored-By: Claude <noreply@anthropic.com>
85 lines
3.8 KiB
C#
85 lines
3.8 KiB
C#
using System.ComponentModel.DataAnnotations;
|
|
using System.Text.Json;
|
|
|
|
namespace WordVersioning.Api.Models;
|
|
|
|
/// <summary>body ของ POST /api/documents/{documentId}/versions (multipart/form-data)</summary>
|
|
public class UploadVersionRequest
|
|
{
|
|
[Required]
|
|
public IFormFile File { get; set; } = null!;
|
|
|
|
/// <summary>GUID ที่ client generate ต่อ version — ใช้เป็นส่วนหนึ่งของ object key</summary>
|
|
[Required]
|
|
public string ClientVersionId { get; set; } = string.Empty;
|
|
|
|
/// <summary>JSON object map tag→text จาก content controls (FR-11)</summary>
|
|
public string? Fields { get; set; }
|
|
|
|
/// <summary>คำอธิบาย version แบบ commit message (FR-13) — optional</summary>
|
|
public string? Message { get; set; }
|
|
}
|
|
|
|
public record UploadVersionResponse(Guid VersionId, int VersionNumber);
|
|
|
|
/// <summary>body ของ POST /api/documents/generate (FR-10)</summary>
|
|
public class GenerateDocumentRequest
|
|
{
|
|
[Required]
|
|
public Guid TemplateId { get; set; }
|
|
|
|
/// <summary>map fieldKey → value (ค่า scalar ทั้งหมด)</summary>
|
|
public JsonElement Values { get; set; }
|
|
|
|
/// <summary>คำอธิบาย version แบบ commit message (FR-13) — optional</summary>
|
|
public string? Message { get; set; }
|
|
}
|
|
|
|
public record GenerateDocumentResponse(Guid DocumentId, Guid VersionId, int VersionNumber, string DownloadUrl);
|
|
|
|
/// <summary>item ของ version history — fields คือ snapshot ที่ parse แล้ว (ถ้ามี), message คือคำอธิบายของผู้ใช้ (FR-13)</summary>
|
|
public record VersionListItem(
|
|
Guid VersionId,
|
|
int VersionNumber,
|
|
DateTimeOffset CreatedAt,
|
|
string CreatedByUserId,
|
|
string ContentHash,
|
|
object? Fields,
|
|
string? Message);
|
|
|
|
/// <summary>response ของ GET .../download-link — presigned URL อายุสั้นให้เปิดในเบราว์เซอร์ของผู้ใช้</summary>
|
|
public record VersionDownloadLinkResponse(string Url, DateTimeOffset ExpiresAt);
|
|
|
|
/// <summary>item ของ GET /api/templates/{templateId}/documents — รายการเอกสารของ template หนึ่งตัว (FR-12)</summary>
|
|
public record TemplateDocumentListItem(
|
|
Guid DocumentId,
|
|
string FileName,
|
|
DateTimeOffset CreatedAt,
|
|
int VersionCount,
|
|
int LatestVersionNumber,
|
|
DateTimeOffset? LatestVersionAt);
|
|
|
|
/// <summary>field หนึ่งตัวของ document (FR-12) — นิยามจาก TemplateField + ค่าล่าสุดจาก DocumentFieldValue
|
|
/// Label/Type/IsRequired เป็น null เมื่อมีค่าเก็บไว้แต่ key ไม่มีในนิยาม template ปัจจุบัน
|
|
/// (เช่น replace ไฟล์แล้ว tag หาย) — SourceVersionId/UpdatedByUserId/UpdatedAt เป็น null เมื่อ
|
|
/// field เพิ่มเข้า template หลังเอกสารนี้ถูกสร้าง (ยังไม่เคยมีค่า)</summary>
|
|
public record DocumentFieldItem(
|
|
string Key,
|
|
string? Label,
|
|
string? Type,
|
|
bool? IsRequired,
|
|
string Value,
|
|
Guid? SourceVersionId,
|
|
string? UpdatedByUserId,
|
|
DateTimeOffset? UpdatedAt);
|
|
|
|
/// <summary>response ของ GET /api/documents/{documentId} (FR-12) —
|
|
/// TemplateId null คือเอกสาร track เองจาก add-in (ไม่มีนิยาม field, Fields ว่าง)</summary>
|
|
public record DocumentDetail(
|
|
Guid Id,
|
|
string FileName,
|
|
DateTimeOffset CreatedAt,
|
|
Guid? TemplateId,
|
|
string? TemplateName,
|
|
bool TemplateIsActive,
|
|
IReadOnlyList<DocumentFieldItem> Fields);
|