- เลข version ใหม่: เว็บ-generate = v0 ฉบับตั้งต้น (ไม่มี PDF), add-in save (Start Versioning + Save & Version) = v1+ มี PDF เสมอ - PDF ผลิตจาก Word จริงผ่าน task pane เท่านั้น (getFileAsync Pdf + runtime guard, manifest ไม่เพิ่ม requirement); capture/upload เป็น best-effort — docx ผ่านแม้ PDF ล้ม + MessageBar เตือนตาม hasPdf - Backend: DocumentVersion.PdfObjectKey (nullable, migration AddVersionPdf) + sibling .pdf ใน bucket docx-versions · multipart part pdf (ผิด type → 400) · /download + /download-link รับ ?format=pdf (ไม่มี → 404) · presigned ฝังชื่อไฟล์ไทย + _vN (RFC 5987) - Web: เปิดไฟล์แทน blob-download — PDF แท็บใหม่, docx ผ่าน ms-word:ofe|u| พร้อม heuristic fallback ลิงก์สำรอง (useVersionOpen, versionDownload) · ปุ่ม "เปิดใน Word" ที่หน้า success ของฟอร์มสร้างเอกสาร - Spec v7 + CONTEXT.md + ADR 0001 + แผน docs/plans/version-pdf.md - Automated QA: backend 68 / add-in 63 / web 55 ผ่าน · manual acceptance ผ่านบน Word for Mac (2026-09-08) รวม fidelity + track changes — ค้างเฉพาะ Windows / Word on the web Co-Authored-By: Claude Code <noreply@anthropic.com>
261 lines
9.2 KiB
C#
261 lines
9.2 KiB
C#
// <auto-generated />
|
|
using System;
|
|
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Infrastructure;
|
|
using Microsoft.EntityFrameworkCore.Storage.ValueConversion;
|
|
using Npgsql.EntityFrameworkCore.PostgreSQL.Metadata;
|
|
using WordVersioning.Api.Data;
|
|
|
|
#nullable disable
|
|
|
|
namespace WordVersioning.Api.Migrations
|
|
{
|
|
[DbContext(typeof(AppDbContext))]
|
|
partial class AppDbContextModelSnapshot : ModelSnapshot
|
|
{
|
|
protected override void BuildModel(ModelBuilder modelBuilder)
|
|
{
|
|
#pragma warning disable 612, 618
|
|
modelBuilder
|
|
.HasAnnotation("ProductVersion", "8.0.11")
|
|
.HasAnnotation("Relational:MaxIdentifierLength", 63);
|
|
|
|
NpgsqlModelBuilderExtensions.UseIdentityByDefaultColumns(modelBuilder);
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Document", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("AddInSignature")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("FileName")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("character varying(512)");
|
|
|
|
b.Property<Guid?>("TemplateId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TemplateId");
|
|
|
|
b.ToTable("Documents");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentFieldValue", b =>
|
|
{
|
|
b.Property<Guid>("DocumentId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("FieldKey")
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)");
|
|
|
|
b.Property<Guid>("SourceVersionId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("UpdatedByUserId")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("Value")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.HasKey("DocumentId", "FieldKey");
|
|
|
|
b.ToTable("DocumentFieldValues");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentVersion", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("ContentHash")
|
|
.IsRequired()
|
|
.HasMaxLength(64)
|
|
.HasColumnType("character varying(64)");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("CreatedByUserId")
|
|
.IsRequired()
|
|
.HasColumnType("text");
|
|
|
|
b.Property<Guid>("DocumentId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("FieldsSnapshotJson")
|
|
.HasColumnType("text");
|
|
|
|
b.Property<string>("Message")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)");
|
|
|
|
b.Property<string>("ObjectKey")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("character varying(1024)");
|
|
|
|
b.Property<string>("PdfObjectKey")
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("character varying(1024)");
|
|
|
|
b.Property<int>("VersionNumber")
|
|
.HasColumnType("integer");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("DocumentId", "VersionNumber")
|
|
.IsUnique();
|
|
|
|
b.ToTable("DocumentVersions");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Template", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<DateTimeOffset>("CreatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.Property<string>("Description")
|
|
.HasMaxLength(2048)
|
|
.HasColumnType("character varying(2048)");
|
|
|
|
b.Property<bool>("IsActive")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<string>("Name")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)");
|
|
|
|
b.Property<string>("ObjectKey")
|
|
.IsRequired()
|
|
.HasMaxLength(1024)
|
|
.HasColumnType("character varying(1024)");
|
|
|
|
b.Property<DateTimeOffset>("UpdatedAt")
|
|
.HasColumnType("timestamp with time zone");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.ToTable("Templates");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.TemplateField", b =>
|
|
{
|
|
b.Property<Guid>("Id")
|
|
.ValueGeneratedOnAdd()
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Editor")
|
|
.HasMaxLength(16)
|
|
.HasColumnType("character varying(16)");
|
|
|
|
b.Property<bool>("IsRequired")
|
|
.HasColumnType("boolean");
|
|
|
|
b.Property<string>("Key")
|
|
.IsRequired()
|
|
.HasMaxLength(256)
|
|
.HasColumnType("character varying(256)");
|
|
|
|
b.Property<string>("Label")
|
|
.IsRequired()
|
|
.HasMaxLength(512)
|
|
.HasColumnType("character varying(512)");
|
|
|
|
b.Property<int>("SortOrder")
|
|
.HasColumnType("integer");
|
|
|
|
b.Property<Guid>("TemplateId")
|
|
.HasColumnType("uuid");
|
|
|
|
b.Property<string>("Type")
|
|
.IsRequired()
|
|
.HasMaxLength(16)
|
|
.HasColumnType("character varying(16)");
|
|
|
|
b.HasKey("Id");
|
|
|
|
b.HasIndex("TemplateId", "Key")
|
|
.IsUnique();
|
|
|
|
b.ToTable("TemplateFields");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Document", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Template", "Template")
|
|
.WithMany("Documents")
|
|
.HasForeignKey("TemplateId")
|
|
.OnDelete(DeleteBehavior.Restrict);
|
|
|
|
b.Navigation("Template");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentFieldValue", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Document", null)
|
|
.WithMany()
|
|
.HasForeignKey("DocumentId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.DocumentVersion", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Document", "Document")
|
|
.WithMany("Versions")
|
|
.HasForeignKey("DocumentId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Document");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.TemplateField", b =>
|
|
{
|
|
b.HasOne("WordVersioning.Api.Models.Template", "Template")
|
|
.WithMany("Fields")
|
|
.HasForeignKey("TemplateId")
|
|
.OnDelete(DeleteBehavior.Cascade)
|
|
.IsRequired();
|
|
|
|
b.Navigation("Template");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Document", b =>
|
|
{
|
|
b.Navigation("Versions");
|
|
});
|
|
|
|
modelBuilder.Entity("WordVersioning.Api.Models.Template", b =>
|
|
{
|
|
b.Navigation("Documents");
|
|
|
|
b.Navigation("Fields");
|
|
});
|
|
#pragma warning restore 612, 618
|
|
}
|
|
}
|
|
}
|