fix(rd21): retain draft revisions and qualify conflict recovery

This commit is contained in:
cesnimda
2026-10-23 12:34:34 +02:00
parent 12f342c09c
commit 05a738693e
53 changed files with 813 additions and 192 deletions
+12 -6
View File
@@ -14,6 +14,7 @@ export type WorkspaceNextStep = { key: string; label: string; reason: string; se
export type WorkspaceOverview = {
id: number;
revision: number;
jobTitle: string;
company: string | null;
location: string | null;
@@ -252,6 +253,7 @@ export type CoverLetterVersion = {
};
export type CoverLetter = {
revision: number;
text: string | null;
currentVersion: number;
versions: CoverLetterVersion[];
@@ -295,10 +297,10 @@ export const applicationAssetsApi = {
api.get<TailoringPlan>(`/jobapplications/${jobId}/tailoring`).then((r) => r.data),
coverLetter: (jobId: number) =>
api.get<CoverLetter>(`/jobapplications/${jobId}/cover-letter`).then((r) => r.data),
saveCoverLetter: (jobId: number, text: string, source = "manual", aiAction?: string) =>
api.put<CoverLetter>(`/jobapplications/${jobId}/cover-letter`, { text, source, aiAction }).then((r) => r.data),
restoreCoverLetter: (jobId: number, version: number) =>
api.post<CoverLetter>(`/jobapplications/${jobId}/cover-letter/versions/${version}/restore`).then((r) => r.data),
saveCoverLetter: (jobId: number, text: string, expectedVersion: number, source = "manual", aiAction?: string) =>
api.put<CoverLetter>(`/jobapplications/${jobId}/cover-letter`, { text, source, aiAction, expectedVersion }).then((r) => r.data),
restoreCoverLetter: (jobId: number, version: number, expectedVersion: number) =>
api.post<CoverLetter>(`/jobapplications/${jobId}/cover-letter/versions/${version}/restore`, { expectedVersion }).then((r) => r.data),
submittedPackages: (jobId: number) =>
api.get<SubmittedPackage[]>(`/jobapplications/${jobId}/submitted-packages`).then((r) => r.data),
captureSubmittedPackage: (jobId: number) =>
@@ -307,8 +309,12 @@ export const applicationAssetsApi = {
api.get<SubmittedPackageDetail>(`/jobapplications/${jobId}/submitted-packages/${packageId}`).then((r) => r.data),
downloadSubmittedAttachment: (jobId: number, packageId: number, attachmentId: number) =>
api.get<Blob>(`/jobapplications/${jobId}/submitted-packages/${packageId}/attachments/${attachmentId}`, { responseType: "blob" }).then((r) => r.data),
saveApplicationDrafts: (jobId: number, applicationAnswerDraft: string, recruiterMessageDraft: string) =>
api.put(`/jobapplications/${jobId}/application-drafts`, { applicationAnswerDraft, recruiterMessageDraft }).then(() => undefined),
saveApplicationDrafts: (jobId: number, applicationAnswerDraft: string, recruiterMessageDraft: string, expectedVersion: number) =>
api.put(`/jobapplications/${jobId}/application-drafts`, { applicationAnswerDraft, recruiterMessageDraft, expectedVersion }).then((response) => {
const revision = Number(response.headers?.["x-job-version"]);
if (!Number.isInteger(revision) || revision <= 0) throw new Error("Missing committed job revision.");
return revision;
}),
};
// Phase 5.5 — Interview preparation and follow-up. Prep content is the user's; AI suggestions come