mirror of
https://github.com/langgenius/dify.git
synced 2026-07-23 12:08:33 +08:00
69 lines
2.2 KiB
TypeScript
69 lines
2.2 KiB
TypeScript
import type { Release } from '@dify/contracts/enterprise/types.gen'
|
|
|
|
export type ReleaseDeploymentAction = 'deploy' | 'deployExistingRelease' | 'promote' | 'rollback'
|
|
|
|
function releaseCreatedAt(release: Release) {
|
|
const time = Date.parse(release.createdAt)
|
|
return Number.isFinite(time) ? time : undefined
|
|
}
|
|
|
|
function releaseById(releaseRows: Release[], releaseId?: string) {
|
|
return releaseRows.find((release) => release.id === releaseId)
|
|
}
|
|
|
|
function releaseOrderIndex(releaseRows: Release[], releaseId?: string) {
|
|
return releaseRows.findIndex((release) => release.id === releaseId)
|
|
}
|
|
|
|
function compareReleaseOrder(
|
|
targetRelease: Release | undefined,
|
|
currentRelease: Release,
|
|
releaseRows: Release[],
|
|
) {
|
|
if (!targetRelease) return undefined
|
|
if (targetRelease.id === currentRelease.id) return 0
|
|
|
|
const normalizedTargetRelease = releaseById(releaseRows, targetRelease.id) ?? targetRelease
|
|
const normalizedCurrentRelease = releaseById(releaseRows, currentRelease.id) ?? currentRelease
|
|
const targetCreatedAt = releaseCreatedAt(normalizedTargetRelease)
|
|
const currentCreatedAt = releaseCreatedAt(normalizedCurrentRelease)
|
|
|
|
if (
|
|
targetCreatedAt !== undefined &&
|
|
currentCreatedAt !== undefined &&
|
|
targetCreatedAt !== currentCreatedAt
|
|
)
|
|
return targetCreatedAt > currentCreatedAt ? 1 : -1
|
|
|
|
const targetIndex = releaseOrderIndex(releaseRows, targetRelease.id)
|
|
const currentIndex = releaseOrderIndex(releaseRows, currentRelease.id)
|
|
if (targetIndex >= 0 && currentIndex >= 0 && targetIndex !== currentIndex)
|
|
return targetIndex < currentIndex ? 1 : -1
|
|
|
|
return undefined
|
|
}
|
|
|
|
export function releaseDeploymentAction({
|
|
targetRelease,
|
|
currentRelease,
|
|
releaseRows,
|
|
isExistingRelease,
|
|
}: {
|
|
targetRelease?: Release
|
|
currentRelease?: Release
|
|
releaseRows: Release[]
|
|
isExistingRelease?: boolean
|
|
}): ReleaseDeploymentAction {
|
|
if (!currentRelease) return isExistingRelease ? 'deployExistingRelease' : 'deploy'
|
|
|
|
const order = compareReleaseOrder(targetRelease, currentRelease, releaseRows)
|
|
if (order === -1) return 'rollback'
|
|
if (order === 1) return 'promote'
|
|
|
|
return targetRelease && targetRelease.id !== currentRelease.id
|
|
? 'promote'
|
|
: isExistingRelease
|
|
? 'deployExistingRelease'
|
|
: 'deploy'
|
|
}
|