Browse Source

🐞 fix: 修复无法删除仓库的问题

Pchen. 2 weeks ago
parent
commit
ebf55245c6
1 changed files with 45 additions and 32 deletions
  1. 45 32
      apis/Repos/DeleteRepo.js

+ 45 - 32
apis/Repos/DeleteRepo.js

@@ -3,54 +3,67 @@ 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')
+const fs = require('fs/promises')
 
-// 删除仓库
 class DeleteRepo extends API {
     constructor() {
         super()
-
         this.setMethod("DELETE")
         this.setPath("/Repos")
     }
 
     async onRequest(req, res) {
-        let { uuid, session, id } = req.body
+        const { uuid, session, id } = req.body
 
-        if ([uuid, session, id].some(value => value === '' || value === null || value === undefined))
-            return res.json({
-                ...BaseStdResponse.MISSING_PARAMETER
-            })
+        if ([uuid, session, id].some(v => v == null || v === '')) {
+            return res.json({ ...BaseStdResponse.MISSING_PARAMETER })
+        }
 
-        // 检查 session
-        if (!await AccessControl.checkSession(uuid, session))
-            return res.status(401).json({
-                ...BaseStdResponse.ACCESS_DENIED
-            })
-        let sql = 'SELECT path FROM repos WHERE create_user = ? AND id = ?'
-        let r = await db.query(sql, [uuid, id])
+        if (!await AccessControl.checkSession(uuid, session)) {
+            return res.status(401).json({ ...BaseStdResponse.ACCESS_DENIED })
+        }
 
-        if (r && r[0].path) {
-            const redisKey = [`gitLogs:${r[0].path}`,`contributors:${r[0].path}`,`codeStats:${r[0].path}`]
-            await redis.del(redisKey)
+        try {
+            const [repoInfo] = await db.query('SELECT path FROM repos WHERE create_user = ? AND id = ?', [uuid, id])
 
-            fs.rm(r[0].path, { recursive: true, force: true }, (err) => { 
-                this.logger.error('删除仓库失败!' + err)
-                res.json({ ...BaseStdResponse.ERR, endpoint: 7894378, msg: '删除仓库失败!' })
-            })
-        }
-            
-        sql = 'DELETE FROM repos WHERE create_user = ? AND id = ?'
+            if (!repoInfo || !repoInfo.path)
+                return res.json({ ...BaseStdResponse.NOT_FOUND, msg: '仓库不存在' })
 
-        let result = await db.query(sql, [uuid, id])
+            const repoPath = repoInfo.path
 
-        if (result && result.affectedRows > 0) {
-            res.json({
-                ...BaseStdResponse.OK
-            })
+            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)
+            }
 
-        } else {
-            res.json({ ...BaseStdResponse.ERR, endpoint: 7894378, msg: '删除仓库失败!' })
+            return res.json({ ...BaseStdResponse.OK })
+
+        } catch (error) {
+            this.logger.error(`删除仓库异常:${error.stack}`)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '删除仓库失败,请稍后重试'
+            })
         }
     }
 }