Files
hair-keeper/src/server/routers/dev/arch.ts

69 lines
2.2 KiB
TypeScript

import { createTRPCRouter, permissionRequiredProcedure } from '@/server/trpc'
import { analyzePackagesQueue } from '@/server/queues'
import type { AnalyzePackagesProgress } from '@/server/queues'
import { z } from 'zod'
import { inferProcedureOutput, TRPCError } from '@trpc/server'
export const devArchRouter = createTRPCRouter({
// 获取所有包类型
getAllPkgTypes: permissionRequiredProcedure('SUPER_ADMIN_ONLY').query(async ({ ctx }) => {
const pkgTypes = await ctx.db.devPkgType.findMany({
orderBy: {
order: 'asc',
},
})
return pkgTypes
}),
// 获取所有依赖包数据(按类型分组)
getAllPackages: permissionRequiredProcedure('SUPER_ADMIN_ONLY').query(async ({ ctx }) => {
// 获取所有依赖包,包含类型信息
const packages = await ctx.db.devAnalyzedPkg.findMany({
include: {
pkgType: true,
},
orderBy: [
{ pkgTypeId: 'asc' },
{ relatedFileCount: 'desc' },
],
})
// 按类型分组
const packagesByType: Record<string, typeof packages> = {}
packages.forEach((pkg) => {
const typeId = pkg.pkgTypeId
if (!packagesByType[typeId]) {
packagesByType[typeId] = []
}
packagesByType[typeId].push(pkg)
})
return packagesByType
}),
// 启动依赖包分析任务
startAnalyzePackages: permissionRequiredProcedure('SUPER_ADMIN_ONLY')
.mutation(async () => {
const job = await analyzePackagesQueue.add('analyze-packages', {})
return { jobId: job.id }
}),
// 取消依赖包分析任务
cancelAnalyzePackagesJob: permissionRequiredProcedure('SUPER_ADMIN_ONLY')
.input(z.object({ jobId: z.string() }))
.mutation(async ({ input }) => {
const job = await analyzePackagesQueue.getJob(input.jobId)
if (!job) {
throw new TRPCError({ code: 'NOT_FOUND', message: '任务不存在' })
}
// 更新进度标记为已取消
await job.updateProgress({ ...(job.progress as AnalyzePackagesProgress), canceled: true })
return { success: true }
}),
})
export type DevArchRouter = typeof devArchRouter;
export type PackageData = inferProcedureOutput<DevArchRouter['getAllPackages']>[string][number];