feat(description): add deployment version descriptions (#3048)

* feat(description): added version description for deployments table

* feat(description): refactor to tanstack query and remove useEffect

* add wand to generate diff

* ack comments

* removed redundant logic, kept single source of truth for diff

* updated docs

* use consolidated sse parsing util, add loops & parallels check

* DRY
This commit is contained in:
Waleed
2026-01-28 13:52:40 -08:00
committed by GitHub
parent c00f05c346
commit 8b2404752b
18 changed files with 11562 additions and 308 deletions

View File

@@ -9,13 +9,24 @@ import { createErrorResponse, createSuccessResponse } from '@/app/api/workflows/
const logger = createLogger('WorkflowDeploymentVersionAPI')
const patchBodySchema = z.object({
name: z
.string()
.trim()
.min(1, 'Name cannot be empty')
.max(100, 'Name must be 100 characters or less'),
})
const patchBodySchema = z
.object({
name: z
.string()
.trim()
.min(1, 'Name cannot be empty')
.max(100, 'Name must be 100 characters or less')
.optional(),
description: z
.string()
.trim()
.max(500, 'Description must be 500 characters or less')
.nullable()
.optional(),
})
.refine((data) => data.name !== undefined || data.description !== undefined, {
message: 'At least one of name or description must be provided',
})
export const dynamic = 'force-dynamic'
export const runtime = 'nodejs'
@@ -88,33 +99,46 @@ export async function PATCH(
return createErrorResponse(validation.error.errors[0]?.message || 'Invalid request body', 400)
}
const { name } = validation.data
const { name, description } = validation.data
const updateData: { name?: string; description?: string | null } = {}
if (name !== undefined) {
updateData.name = name
}
if (description !== undefined) {
updateData.description = description
}
const [updated] = await db
.update(workflowDeploymentVersion)
.set({ name })
.set(updateData)
.where(
and(
eq(workflowDeploymentVersion.workflowId, id),
eq(workflowDeploymentVersion.version, versionNum)
)
)
.returning({ id: workflowDeploymentVersion.id, name: workflowDeploymentVersion.name })
.returning({
id: workflowDeploymentVersion.id,
name: workflowDeploymentVersion.name,
description: workflowDeploymentVersion.description,
})
if (!updated) {
return createErrorResponse('Deployment version not found', 404)
}
logger.info(
`[${requestId}] Renamed deployment version ${version} for workflow ${id} to "${name}"`
)
logger.info(`[${requestId}] Updated deployment version ${version} for workflow ${id}`, {
name: updateData.name,
description: updateData.description,
})
return createSuccessResponse({ name: updated.name })
return createSuccessResponse({ name: updated.name, description: updated.description })
} catch (error: any) {
logger.error(
`[${requestId}] Error renaming deployment version ${version} for workflow ${id}`,
`[${requestId}] Error updating deployment version ${version} for workflow ${id}`,
error
)
return createErrorResponse(error.message || 'Failed to rename deployment version', 500)
return createErrorResponse(error.message || 'Failed to update deployment version', 500)
}
}

View File

@@ -26,6 +26,7 @@ export async function GET(request: NextRequest, { params }: { params: Promise<{
id: workflowDeploymentVersion.id,
version: workflowDeploymentVersion.version,
name: workflowDeploymentVersion.name,
description: workflowDeploymentVersion.description,
isActive: workflowDeploymentVersion.isActive,
createdAt: workflowDeploymentVersion.createdAt,
createdBy: workflowDeploymentVersion.createdBy,