FEAT-8c: import loader — /import/dry-run + /import/execute (gated)
- Additive migration: Gerbil.RawImportData + Litter.PairingCode (Zuchtnummer der Verpaarung). - ImportService consumes tools/import/output (animals.json + litters.json): litters first (authoritative), then conflict-free animals with a DOB; high-confidence (hoch) litter links set LitterId, date-only/ambiguous links quarantined; conflicts + stubs never loaded. Genotype mapped8locus -> frozen compact string; rawGenotype+unmappedTokens preserved in RawImportData; Farbschlag matched to ColorVariety; gender inferred from litter role; provenance ImportSource/ExternalRef; idempotent (ExternalRef / Name+Date). Photos copied to store. - ImportEndpoints: POST /import/dry-run (no writes, Julian-readable report) + /import/execute (gated).
This commit is contained in:
90
GerbilManagerWebAPI/Import/ImportModels.cs
Normal file
90
GerbilManagerWebAPI/Import/ImportModels.cs
Normal file
@@ -0,0 +1,90 @@
|
||||
using System.Text.Json.Serialization;
|
||||
|
||||
namespace GerbilManagerWebAPI.Import
|
||||
{
|
||||
// ---- Source shapes (tools/import/output JSON, produced by extract.py) ----
|
||||
|
||||
public sealed class SourceAnimal
|
||||
{
|
||||
public string Id { get; set; } = "";
|
||||
public string Name { get; set; } = "";
|
||||
public List<string> NameVariants { get; set; } = new();
|
||||
public string Dob { get; set; } = "";
|
||||
public string Death { get; set; } = "";
|
||||
public string? Gender { get; set; }
|
||||
public string Farbschlag { get; set; } = "";
|
||||
public List<string> FarbschlagVariants { get; set; } = new();
|
||||
public SourceGenotype Genotype { get; set; } = new();
|
||||
public string Zucht { get; set; } = "";
|
||||
public List<SourceParentRef> ParentRefs { get; set; } = new();
|
||||
public List<string> Photos { get; set; } = new();
|
||||
public List<string> SourceFiles { get; set; } = new();
|
||||
public bool Conflict { get; set; }
|
||||
public SourceLitterRef? LitterRef { get; set; }
|
||||
}
|
||||
|
||||
public sealed class SourceGenotype
|
||||
{
|
||||
public Dictionary<string, List<string>> Mapped8locus { get; set; } = new();
|
||||
public string RawGenotype { get; set; } = "";
|
||||
public List<string> UnmappedTokens { get; set; } = new();
|
||||
}
|
||||
|
||||
public sealed class SourceParentRef
|
||||
{
|
||||
public string Name { get; set; } = "";
|
||||
public string Dob { get; set; } = "";
|
||||
public string RoleGuess { get; set; } = "";
|
||||
}
|
||||
|
||||
public sealed class SourceLitterRef
|
||||
{
|
||||
public string LitterId { get; set; } = "";
|
||||
public string Method { get; set; } = "";
|
||||
public string Confidence { get; set; } = ""; // "hoch" | "niedrig" | (ambiguous => candidates)
|
||||
public List<string>? Candidates { get; set; }
|
||||
}
|
||||
|
||||
public sealed class SourceLitter
|
||||
{
|
||||
public string Id { get; set; } = "";
|
||||
public string LitterId { get; set; } = "";
|
||||
public string Date { get; set; } = "";
|
||||
public string DamName { get; set; } = "";
|
||||
public string SireName { get; set; } = "";
|
||||
public int? TotalBorn { get; set; }
|
||||
public string Zuchtnummer { get; set; } = "";
|
||||
public string Note { get; set; } = "";
|
||||
public List<string> Warnings { get; set; } = new();
|
||||
}
|
||||
|
||||
// ---- Report shapes (Julian-readable: counts per category + samples) ----
|
||||
|
||||
public sealed record ImportReport(
|
||||
bool Executed,
|
||||
LitterSummary Litters,
|
||||
AnimalSummary Animals,
|
||||
PhotoSummary Photos,
|
||||
IReadOnlyList<string> Samples,
|
||||
IReadOnlyList<string> Notes);
|
||||
|
||||
public sealed record LitterSummary(int InSource, int Created, int AlreadyImported);
|
||||
|
||||
public sealed record AnimalSummary(
|
||||
int InSource,
|
||||
int Created,
|
||||
int LinkedToLitter,
|
||||
int FarbschlagMatched,
|
||||
int FarbschlagUnmatched,
|
||||
int AlreadyImported,
|
||||
QuarantineSummary Quarantined);
|
||||
|
||||
public sealed record QuarantineSummary(
|
||||
int Conflicts,
|
||||
int Stubs,
|
||||
int DateOnlyLinks,
|
||||
int AmbiguousLinks,
|
||||
int Total);
|
||||
|
||||
public sealed record PhotoSummary(int Attached, int SourceFilesMissing);
|
||||
}
|
||||
Reference in New Issue
Block a user