using Novelly.Api.Common.Validation; namespace Novelly.Api.Imports; public record ImportJobResponse( Guid Id, string SourceRoot, Guid? NovelId, ImportJobStatus Status, string? StatusMessage, int ChaptersCompleted, int ChaptersTotal, DateTimeOffset CreatedAt, DateTimeOffset UpdatedAt); public enum ImportReadiness { Fresh, Resumable, Complete } public record ImportInspectionResponse( ImportReadiness Readiness, Guid? NovelId, int ChaptersCompleted, int ChaptersTotal, IReadOnlyList CompletedPasses); public record InspectImportRequest(string SourceRoot); public class InspectImportRequestValidator : IModelValidator { public ValidationResult Validate(InspectImportRequest model) { var result = new ValidationResult(); if (string.IsNullOrWhiteSpace(model.SourceRoot)) result.AddError("SourceRoot", "'Source Root' must not be empty."); return result; } } public record StartImportRequest(string SourceRoot, bool ForceRestart = false); public class StartImportRequestValidator : IModelValidator { public ValidationResult Validate(StartImportRequest model) { var result = new ValidationResult(); if (string.IsNullOrWhiteSpace(model.SourceRoot)) result.AddError("SourceRoot", "'Source Root' must not be empty."); return result; } } public static class ImportMapping { public static ImportJobResponse ToResponse(this ImportJob job) => new( job.Id, job.SourceRoot, job.NovelId, job.Status, job.StatusMessage, job.ChaptersCompleted, job.ChaptersTotal, job.CreatedAt, job.UpdatedAt); }