Browse Source

✨ feat: 增加AI相关接口

Pchen. 2 months ago
parent
commit
6d4ea63a29
4 changed files with 228 additions and 0 deletions
  1. 44 0
      apis/AI/GetCommitSummary.js
  2. 44 0
      apis/AI/GetScanTaskList.js
  3. 73 0
      apis/AI/ScanRepo.js
  4. 67 0
      apis/AI/SummaryCommit.js

+ 44 - 0
apis/AI/GetCommitSummary.js

@@ -0,0 +1,44 @@
+const API = require("../../lib/API")
+const db = require("../../plugin/DataBase/db")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+
+class GetCommitSummary extends API {
+    constructor() {
+        super()
+
+        this.setPath('/AI/GetCommitSummary')
+        this.setMethod('GET')
+    }
+
+    async onRequest(req, res) {
+        let {uuid, session, id, hash } = req.query
+        if ([uuid, session, id, hash].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        let sql = 'SELECT create_time, start_time, end_time, result, repo_hash FROM commit_summary_tasks WHERE create_user = ? AND repo_id = ? AND repo_hash = ?'
+        let rows = await db.query(sql, [uuid, id, hash])
+
+        if (!rows || rows.length === 0)
+            return res.json({
+                ...BaseStdResponse.OK,
+                data: []
+            })
+
+        res.json({
+            ...BaseStdResponse.OK,
+            data: rows
+        })
+
+    }
+}
+
+module.exports.GetCommitSummary = GetCommitSummary

+ 44 - 0
apis/AI/GetScanTaskList.js

@@ -0,0 +1,44 @@
+const API = require("../../lib/API")
+const db = require("../../plugin/DataBase/db")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+
+class GetScanTaskList extends API {
+    constructor() {
+        super()
+
+        this.setPath('/AI/GetScanTaskList')
+        this.setMethod('GET')
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session, id } = req.query
+        if ([uuid, session, id].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        let sql = 'SELECT create_time, start_time, end_time, result, repo_hash, state, repo_id FROM scan_tasks WHERE create_user = ? AND repo_id = ?'
+        let rows = await db.query(sql, [uuid, id])
+
+        if (!rows || rows.length === 0)
+            return res.json({
+                ...BaseStdResponse.OK,
+                data: []
+            })
+
+        res.json({
+            ...BaseStdResponse.OK,
+            data: rows
+        })
+
+    }
+}
+
+module.exports.GetScanTaskList = GetScanTaskList

+ 73 - 0
apis/AI/ScanRepo.js

@@ -0,0 +1,73 @@
+const API = require("../../lib/API")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+const db = require("../../plugin/DataBase/db")
+const axios = require('axios')
+const simpleGit = require('simple-git')
+const { core_url } = require('../../config.json')
+
+class ScanRepo extends API {
+    constructor() {
+        super()
+
+        this.setMethod("GET")
+        this.setPath("/AI/ScanRepo")
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session, id } = req.query
+
+        if ([uuid, session, id].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        let sql = 'SELECT state, path, url FROM repos WHERE create_user = ? AND id = ?'
+        let rows = await db.query(sql, [uuid, id])
+        if (!rows || rows.length === 0)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '未找到仓库'
+            })
+
+        if (rows[0].state !== 1 || !rows[0].path)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '仓库未成功克隆!'
+            })
+
+        try {
+            const git = simpleGit()
+            await git.cwd(rows[0].path)
+            const hash = await git.revparse(['HEAD'])
+            const time = new Date().getTime()
+
+            sql = 'INSERT INTO scan_tasks (repo_id, create_time, create_user, repo_hash) VALUES (?, ?, ?, ?)'
+            let r = await db.query(sql, [id, time, uuid, hash])
+            if(!r || r.affectedRows !== 1)
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '扫描任务添加失败!'
+                })
+
+            let endpoint = core_url + '/ai/scan'
+            const res = await axios.post(endpoint, { uuid, repo_url: rows[0].url, task_id: String(r.insertId) })
+
+            res.json({
+                ...BaseStdResponse.OK
+            })
+
+        } catch (error) {
+            this.logger.error('获取仓库历史失败!' + error.stack)
+        }
+
+    }
+}
+
+module.exports.ScanRepo = ScanRepo

+ 67 - 0
apis/AI/SummaryCommit.js

@@ -0,0 +1,67 @@
+const API = require("../../lib/API")
+const AccessControl = require("../../lib/AccessControl")
+const { BaseStdResponse } = require("../../BaseStdResponse")
+const db = require("../../plugin/DataBase/db")
+const axios = require('axios')
+const { core_url } = require('../../config.json')
+
+class SummaryCommit extends API {
+    constructor() {
+        super()
+
+        this.setMethod("GET")
+        this.setPath("/AI/SummaryCommit")
+    }
+
+    async onRequest(req, res) {
+        let { uuid, session, id, hash } = req.query
+
+        if ([uuid, session, id, hash].some(value => value === '' || value === null || value === undefined))
+            return res.json({
+                ...BaseStdResponse.MISSING_PARAMETER
+            })
+
+        // 检查 session
+        if (!await AccessControl.checkSession(uuid, session))
+            return res.status(401).json({
+                ...BaseStdResponse.ACCESS_DENIED
+            })
+
+        let sql = 'SELECT state, path, url FROM repos WHERE create_user = ? AND id = ?'
+        let rows = await db.query(sql, [uuid, id])
+        if (!rows || rows.length === 0)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '未找到仓库'
+            })
+
+        if (rows[0].state !== 1 || !rows[0].path)
+            return res.json({
+                ...BaseStdResponse.ERR,
+                msg: '仓库未成功克隆!'
+            })
+
+        try {
+            const time = new Date().getTime()
+            sql = 'INSERT INTO commit_summary_tasks (repo_id, create_time, create_user, repo_hash) VALUES (?, ?, ?, ?)'
+            let r = await db.query(sql, [id, time, uuid, hash])
+
+            if (!r || r.affectedRows !== 1)
+                return res.json({
+                    ...BaseStdResponse.ERR,
+                    msg: '扫描任务添加失败!'
+                })
+
+            res.json({
+                ...BaseStdResponse.OK
+            })
+
+            let endpoint = core_url + '/ai/summaryCommit'
+            await axios.post(endpoint, { uuid, repo_url: rows[0].url, task_id: String(r.insertId) })
+        } catch (error) {
+            this.logger.error('获取仓库历史失败!' + error.stack)
+        }
+    }
+}
+
+module.exports.SummaryCommit = SummaryCommit