ce76046a29
- consolidate API ownership and remove dead vendor code - add Stripe billing, learning paths, and public CV hardening - add migration, recovery, security, audit, and browser gates
42 lines
1.6 KiB
C#
42 lines
1.6 KiB
C#
namespace JobTrackerApi.Models;
|
|
|
|
// Phase 5.4 — Application Assets.
|
|
//
|
|
// Append-only history for a job application's cover letter. JobApplication.CoverLetterText stays the
|
|
// CURRENT text and the existing API contract around it is unchanged; this only records what it used
|
|
// to be, so an AI rewrite or a bad edit is never destructive. Mirrors CvVariantVersion: restore
|
|
// re-saves an old snapshot as a new version rather than rewinding.
|
|
//
|
|
// Reconciler-owned (docs/infrastructure/database-ownership.md) — its migration is a no-op.
|
|
public sealed class CoverLetterVersion
|
|
{
|
|
public int Id { get; set; }
|
|
public string OwnerUserId { get; set; } = string.Empty;
|
|
public int JobApplicationId { get; set; }
|
|
public JobApplication? JobApplication { get; set; }
|
|
|
|
public int Version { get; set; }
|
|
public string Text { get; set; } = string.Empty;
|
|
|
|
// manual | ai | template | restore — how this text came to exist, so the history list can show
|
|
// whether the user wrote it or approved it from a suggestion.
|
|
public string Source { get; set; } = "manual";
|
|
|
|
// For an AI-sourced version: which action produced it (generate | improve | shorten | expand |
|
|
// tone | tailor). Null for anything the user typed.
|
|
public string? AiAction { get; set; }
|
|
|
|
public DateTimeOffset CreatedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
|
}
|
|
|
|
public static class CoverLetterSources
|
|
{
|
|
public const string Manual = "manual";
|
|
public const string Ai = "ai";
|
|
public const string Template = "template";
|
|
public const string Restore = "restore";
|
|
|
|
public static bool IsValid(string? value) =>
|
|
value is Manual or Ai or Template or Restore;
|
|
}
|