const API = require("../../lib/API") const AccessControl = require("../../lib/AccessControl") const { BaseStdResponse } = require("../../BaseStdResponse") const db = require("../../plugin/DataBase/db") const redis = require('../../plugin/DataBase/Redis') const fs = require('fs/promises') class DeleteRepo extends API { constructor() { super() this.setMethod("DELETE") this.setPath("/Repos") } async onRequest(req, res) { const { uuid, session, id } = req.body if ([uuid, session, id].some(v => v == null || v === '')) { return res.json({ ...BaseStdResponse.MISSING_PARAMETER }) } if (!await AccessControl.checkSession(uuid, session)) { return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED }) } try { const [repoInfo] = await db.query('SELECT path FROM repos WHERE create_user = ? AND id = ?', [uuid, id]) if (!repoInfo || !repoInfo.path) return res.json({ ...BaseStdResponse.NOT_FOUND, msg: '仓库不存在' }) const repoPath = repoInfo.path const redisKeys = [ `gitLogs:${repoPath}`, `contributors:${repoPath}`, `codeStats:${repoPath}` ] await redis.del(...redisKeys) try { await fs.rm(repoPath, { recursive: true, force: true }) } catch (err) { this.logger.warn(`仓库文件夹删除失败:${err.message}`) } // 执行数据库清理 const deleteSQLs = [ ['DELETE FROM repos WHERE create_user = ? AND id = ?', [uuid, id]], ['DELETE FROM commit_summary_tasks WHERE create_user = ? AND repo_id = ?', [uuid, id]], ['DELETE FROM file_summary_tasks WHERE create_user = ? AND repo_id = ?', [uuid, id]], ['DELETE FROM scan_tasks WHERE create_user = ? AND repo_id = ?', [uuid, id]], ] for (let [sql, params] of deleteSQLs) { await db.query(sql, params) } return res.json({ ...BaseStdResponse.OK }) } catch (error) { this.logger.error(`删除仓库异常:${error.stack}`) return res.json({ ...BaseStdResponse.ERR, msg: '删除仓库失败,请稍后重试' }) } } } module.exports.DeleteRepo = DeleteRepo