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 = {} 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[string][number];