@@ -6,6 +6,7 @@ import { type NextRequest, NextResponse } from 'next/server'
66import { z } from 'zod'
77import { AuditAction , AuditResourceType , recordAudit } from '@/lib/audit/log'
88import { getSession } from '@/lib/auth'
9+ import { getRetentionDefaultHours } from '@/lib/billing/cleanup-dispatcher'
910import { getHighestPrioritySubscription } from '@/lib/billing/core/plan'
1011import { isEnterprisePlan } from '@/lib/billing/core/subscription'
1112import {
@@ -21,40 +22,19 @@ const logger = createLogger('DataRetentionAPI')
2122const MIN_HOURS = 24
2223const MAX_HOURS = 43800 // 5 years
2324
24- const FREE_LOG_RETENTION_HOURS = 7 * 24
25- const FREE_SOFT_DELETE_RETENTION_HOURS = 7 * 24
26- const FREE_TASK_REDACTION_HOURS = null // never
27- const FREE_TASK_CLEANUP_HOURS = null // never
28-
29- const PRO_LOG_RETENTION_HOURS = 30 * 24
30- const PRO_SOFT_DELETE_RETENTION_HOURS = 30 * 24
31- const PRO_TASK_REDACTION_HOURS = 30 * 24
32- const PRO_TASK_CLEANUP_HOURS = null // never
33-
3425interface PlanDefaults {
35- logRetentionHours : number
36- softDeleteRetentionHours : number
37- taskRedactionHours : number | null
26+ logRetentionHours : number | null
27+ softDeleteRetentionHours : number | null
3828 taskCleanupHours : number | null
3929}
4030
4131function getPlanDefaults ( plan : 'free' | 'pro' | 'enterprise' ) : PlanDefaults {
42- switch ( plan ) {
43- case 'enterprise' :
44- case 'pro' :
45- return {
46- logRetentionHours : PRO_LOG_RETENTION_HOURS ,
47- softDeleteRetentionHours : PRO_SOFT_DELETE_RETENTION_HOURS ,
48- taskRedactionHours : PRO_TASK_REDACTION_HOURS ,
49- taskCleanupHours : PRO_TASK_CLEANUP_HOURS ,
50- }
51- default :
52- return {
53- logRetentionHours : FREE_LOG_RETENTION_HOURS ,
54- softDeleteRetentionHours : FREE_SOFT_DELETE_RETENTION_HOURS ,
55- taskRedactionHours : FREE_TASK_REDACTION_HOURS ,
56- taskCleanupHours : FREE_TASK_CLEANUP_HOURS ,
57- }
32+ const tier : 'free' | 'paid' | 'enterprise' =
33+ plan === 'free' ? 'free' : plan === 'enterprise' ? 'enterprise' : 'paid'
34+ return {
35+ logRetentionHours : getRetentionDefaultHours ( tier , 'logRetentionHours' ) ,
36+ softDeleteRetentionHours : getRetentionDefaultHours ( tier , 'softDeleteRetentionHours' ) ,
37+ taskCleanupHours : getRetentionDefaultHours ( tier , 'taskCleanupHours' ) ,
5838 }
5939}
6040
@@ -71,7 +51,6 @@ async function resolveWorkspacePlan(
7151const updateRetentionSchema = z . object ( {
7252 logRetentionHours : z . number ( ) . int ( ) . min ( MIN_HOURS ) . max ( MAX_HOURS ) . nullable ( ) . optional ( ) ,
7353 softDeleteRetentionHours : z . number ( ) . int ( ) . min ( MIN_HOURS ) . max ( MAX_HOURS ) . nullable ( ) . optional ( ) ,
74- taskRedactionHours : z . number ( ) . int ( ) . min ( MIN_HOURS ) . max ( MAX_HOURS ) . nullable ( ) . optional ( ) ,
7554 taskCleanupHours : z . number ( ) . int ( ) . min ( MIN_HOURS ) . max ( MAX_HOURS ) . nullable ( ) . optional ( ) ,
7655} )
7756
@@ -98,7 +77,6 @@ export async function GET(_request: NextRequest, { params }: { params: Promise<{
9877 . select ( {
9978 logRetentionHours : workspace . logRetentionHours ,
10079 softDeleteRetentionHours : workspace . softDeleteRetentionHours ,
101- taskRedactionHours : workspace . taskRedactionHours ,
10280 taskCleanupHours : workspace . taskCleanupHours ,
10381 billedAccountUserId : workspace . billedAccountUserId ,
10482 } )
@@ -123,20 +101,17 @@ export async function GET(_request: NextRequest, { params }: { params: Promise<{
123101 configured : {
124102 logRetentionHours : ws . logRetentionHours ,
125103 softDeleteRetentionHours : ws . softDeleteRetentionHours ,
126- taskRedactionHours : ws . taskRedactionHours ,
127104 taskCleanupHours : ws . taskCleanupHours ,
128105 } ,
129106 effective : isEnterpriseWorkspace
130107 ? {
131108 logRetentionHours : ws . logRetentionHours ,
132109 softDeleteRetentionHours : ws . softDeleteRetentionHours ,
133- taskRedactionHours : ws . taskRedactionHours ,
134110 taskCleanupHours : ws . taskCleanupHours ,
135111 }
136112 : {
137113 logRetentionHours : defaults . logRetentionHours ,
138114 softDeleteRetentionHours : defaults . softDeleteRetentionHours ,
139- taskRedactionHours : defaults . taskRedactionHours ,
140115 taskCleanupHours : defaults . taskCleanupHours ,
141116 } ,
142117 } ,
@@ -196,10 +171,7 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{
196171 if ( parsed . data . softDeleteRetentionHours !== undefined ) {
197172 updateData . softDeleteRetentionHours = parsed . data . softDeleteRetentionHours
198173 }
199- if ( parsed . data . taskRedactionHours !== undefined ) {
200- updateData . taskRedactionHours = parsed . data . taskRedactionHours
201- }
202- if ( parsed . data . taskCleanupHours !== undefined ) {
174+ if ( parsed . data . taskCleanupHours !== undefined ) {
203175 updateData . taskCleanupHours = parsed . data . taskCleanupHours
204176 }
205177
@@ -210,7 +182,6 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{
210182 . returning ( {
211183 logRetentionHours : workspace . logRetentionHours ,
212184 softDeleteRetentionHours : workspace . softDeleteRetentionHours ,
213- taskRedactionHours : workspace . taskRedactionHours ,
214185 taskCleanupHours : workspace . taskCleanupHours ,
215186 } )
216187
@@ -242,13 +213,11 @@ export async function PUT(request: NextRequest, { params }: { params: Promise<{
242213 configured : {
243214 logRetentionHours : updated . logRetentionHours ,
244215 softDeleteRetentionHours : updated . softDeleteRetentionHours ,
245- taskRedactionHours : updated . taskRedactionHours ,
246216 taskCleanupHours : updated . taskCleanupHours ,
247217 } ,
248218 effective : {
249219 logRetentionHours : updated . logRetentionHours ,
250220 softDeleteRetentionHours : updated . softDeleteRetentionHours ,
251- taskRedactionHours : updated . taskRedactionHours ,
252221 taskCleanupHours : updated . taskCleanupHours ,
253222 } ,
254223 } ,
0 commit comments