69 lines
2.2 KiB
TypeScript
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];
|