5916f09852
Interview prep re-ran its AI call every time the tab opened -- flagged in the product teardown as work evaporating on every re-open (cost, latency, and non-determinism for no reason). GetInterviewPrep now persists one note per job application and reuses it on subsequent reads, only regenerating when the selected attachment context changes or a refresh is explicitly requested. - InterviewPrepNote: one row per (owner, job), keyed additionally by an attachment-selection fingerprint so picking different attachments correctly triggers a fresh brief without needing an explicit flag. - GetInterviewPrep gained a `refresh` query param; the frontend adds a small "Regenerate" button as the explicit escape hatch for when the underlying job/notes have changed since the note was written. - Both SQLite (dev) and MySQL/MariaDB (prod) reconciler dialects. - 3 new tests: reuse across calls, refresh regenerates, attachment context change regenerates. Verified against the real dev DB.
23 lines
1.2 KiB
C#
23 lines
1.2 KiB
C#
namespace JobTrackerApi.Models;
|
|
|
|
// Persists interview prep so it survives tab switches and page reloads instead of being an AI
|
|
// call re-run every time the tab opens (career-workspace-implementation-roadmap.md Phase F5 --
|
|
// "persist interview prep / fit outputs" -- flagged in the product teardown as work evaporating
|
|
// on every re-open). One row per job application; regenerated when the selected attachment
|
|
// context changes or the user explicitly requests a refresh.
|
|
public sealed class InterviewPrepNote
|
|
{
|
|
public int Id { get; set; }
|
|
public string OwnerUserId { get; set; } = string.Empty;
|
|
public int JobApplicationId { get; set; }
|
|
public JobApplication? JobApplication { get; set; }
|
|
// Fingerprint of the attachment selection this note was generated from, so a different
|
|
// attachment selection triggers regeneration without needing an explicit refresh.
|
|
public string AttachmentContextSignature { get; set; } = string.Empty;
|
|
public string Summary { get; set; } = string.Empty;
|
|
public string TalkingPointsJson { get; set; } = "[]";
|
|
public string LikelyQuestionsJson { get; set; } = "[]";
|
|
public string WeakSpotsJson { get; set; } = "[]";
|
|
public DateTimeOffset GeneratedAtUtc { get; set; } = DateTimeOffset.UtcNow;
|
|
}
|