fix: policy version API content bug + published version protection#2130
fix: policy version API content bug + published version protection#2130
Conversation
class-transformer with enableImplicitConversion was converting TipTap node objects to empty arrays when processing content: unknown[] DTO fields. Added @Transform decorator to preserve raw values. Also: - Block content updates on published policies via PATCH /policies/:id - Align updateVersionContent guard with UI (only block current version when published) - Sync content to current version when updating via PATCH /policies/:id - Add GET /policies/:id/versions/:versionId endpoint - Add Swagger docs for new endpoint Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
…lse success toast
The upload and delete PDF guards blocked all operations on the current version
regardless of policy status. Now only blocks when policy is actually published
(matching the pattern used everywhere else).
Also fixed PdfViewer onSuccess handlers to check result.data.success before
showing the success toast — previously showed "PDF uploaded successfully"
even when the server action returned { success: false }.
Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub. |
PR SummaryMedium Risk Overview Adds Hardens mutation paths: Written by Cursor Bugbot for commit 425bacf. This will update automatically on new commits. Configure here. |
apps/app/src/app/(app)/[orgId]/policies/[policyId]/actions/upload-policy-pdf.ts
Outdated
Show resolved
Hide resolved
…fix stale pointer Change version mutation guards from `status === 'published'` to `status !== 'draft'` so that the current version is also protected when the policy is in needs_review state. Fix stale currentVersionId in updateById by reading it inside the transaction. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
There was a problem hiding this comment.
Cursor Bugbot has reviewed your changes and found 1 potential issue.
Bugbot Autofix is OFF. To automatically fix reported issues with Cloud Agents, enable Autofix in the Cursor dashboard.
…publish bypass The draft-only content guard was reading policy status before the transaction, allowing a concurrent publish to bypass the check. Now the existence check and status guard both run inside the transaction. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
## [1.82.3](v1.82.2...v1.82.3) (2026-02-12) ### Bug Fixes * **app:** check DNS records using Node's built-in DNS instead of using external APIs ([#2126](#2126)) ([5fab9bd](5fab9bd)) * **app:** enable capitalized text for role in csv when adding users ([#2123](#2123)) ([5fdb448](5fdb448)) * **automation:** clarify automation agent's data retrieval capabilities ([#2129](#2129)) ([eb2957f](eb2957f)) * policy version API content bug + published version protection ([#2130](#2130)) ([7f79351](7f79351))
|
🎉 This PR is included in version 1.82.3 🎉 The release is available on GitHub release Your semantic-release bot 📦🚀 |
…rycompai#2130) * fix(api): fix policy version content stored as empty arrays via API class-transformer with enableImplicitConversion was converting TipTap node objects to empty arrays when processing content: unknown[] DTO fields. Added @Transform decorator to preserve raw values. Also: - Block content updates on published policies via PATCH /policies/:id - Align updateVersionContent guard with UI (only block current version when published) - Sync content to current version when updating via PATCH /policies/:id - Add GET /policies/:id/versions/:versionId endpoint - Add Swagger docs for new endpoint Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(app): allow PDF upload/delete on draft policy versions and fix false success toast The upload and delete PDF guards blocked all operations on the current version regardless of policy status. Now only blocks when policy is actually published (matching the pattern used everywhere else). Also fixed PdfViewer onSuccess handlers to check result.data.success before showing the success toast — previously showed "PDF uploaded successfully" even when the server action returned { success: false }. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(api,app): protect current version during needs_review status and fix stale pointer Change version mutation guards from `status === 'published'` to `status !== 'draft'` so that the current version is also protected when the policy is in needs_review state. Fix stale currentVersionId in updateById by reading it inside the transaction. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> * fix(api): move status guard inside transaction to prevent concurrent publish bypass The draft-only content guard was reading policy status before the transaction, allowing a concurrent publish to bypass the check. Now the existence check and status guard both run inside the transaction. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com> --------- Co-authored-by: Tofik Hasanov <annexcies@gmail.com> Co-authored-by: Claude Opus 4.6 <noreply@anthropic.com>
## [1.82.3](trycompai/comp@v1.82.2...v1.82.3) (2026-02-12) ### Bug Fixes * **app:** check DNS records using Node's built-in DNS instead of using external APIs ([trycompai#2126](trycompai#2126)) ([5fab9bd](trycompai@5fab9bd)) * **app:** enable capitalized text for role in csv when adding users ([trycompai#2123](trycompai#2123)) ([5fdb448](trycompai@5fdb448)) * **automation:** clarify automation agent's data retrieval capabilities ([trycompai#2129](trycompai#2129)) ([eb2957f](trycompai@eb2957f)) * policy version API content bug + published version protection ([trycompai#2130](trycompai#2130)) ([7f79351](trycompai@7f79351))
Summary
class-transformerwithenableImplicitConversionwas converting TipTap node objects to[]when processingcontent: unknown[]DTO fields. Added@Transformdecorator to preserve raw values. This fixes the customer-reported issue where PATCH always returned 200 but content showed empty in the UI.GET /policies/:id/versions/:versionId— new endpoint so API users can fetch a single version by ID (previously returned 404).PATCH /policies/:id— previously this endpoint updatedPolicy.contentbut not the currentPolicyVersion.content, causing them to go out of sync.PdfViewernow checksresult.data.successbefore showing the success toast. Previously showed "PDF uploaded successfully" even when the server action returned{ success: false }.Test plan
GET /policies/:id/versions/:versionIdreturns the version with contentPATCH /policies/:idwith content on a draft policy → verify both Policy.content and current version content are updated🤖 Generated with Claude Code