eCourt-Doc-Edit/backend/WordVersioning.Api/Services/TemplateFieldValidation.cs

39 lines
2 KiB
C#
Raw Normal View History

using System.Globalization;
using WordVersioning.Api.Models;
namespace WordVersioning.Api.Services;
/// <summary>FR-10/FR-16 — validate required + type ของค่าที่กรอก (ใช้ร่วมทั้ง generate และ generate-draft)
/// field ที่ส่งเกินนิยาม ignore ตาม policy เดียวกับ FR-11</summary>
public static class TemplateFieldValidation
{
/// <summary>null = ผ่าน; ไม่ null = ข้อความ error สำหรับ BadRequest (รูปแบบเดียวกับที่เคยอยู่ใน Generate)</summary>
public static string? Validate(IEnumerable<TemplateField> fieldDefs, IReadOnlyDictionary<string, string?> values)
{
var missingRequired = fieldDefs
.Where(f => f.IsRequired && (!values.TryGetValue(f.Key, out var v) || string.IsNullOrWhiteSpace(v ?? string.Empty)))
.Select(f => f.Key)
.ToList();
if (missingRequired.Count > 0)
return $"กรอก required fields ให้ครบ: {string.Join(", ", missingRequired)}";
var typeErrors = new List<string>();
foreach (var def in fieldDefs)
{
if (!values.TryGetValue(def.Key, out var v) || string.IsNullOrWhiteSpace(v))
continue;
var valid = def.Type switch
{
"number" => decimal.TryParse(v, NumberStyles.Number, CultureInfo.InvariantCulture, out _),
"date" => DateTimeOffset.TryParse(v, CultureInfo.InvariantCulture, DateTimeStyles.None, out _),
_ => true,
};
if (!valid)
typeErrors.Add(def.Type == "number"
? $"`{def.Key}` ต้องเป็นตัวเลข"
: $"`{def.Key}` ต้องเป็นวันที่ที่ parse ได้ (ISO-8601 เช่น 2026-08-19)");
}
return typeErrors.Count > 0 ? string.Join("; ", typeErrors) : null;
}
}