feat: improve datasource query audit workflows

This commit is contained in:
Logan committed 2026-07-06 23:01:04 +08:00
1 parent 74748e4914
commit 644981eef4
32 files changed
+780 -3061

No files matched your search

+16 -16
View File
@@ -14,10 +14,10 @@ import (
// GET /api/v1/instances
func ListInstances(c *gin.Context) {
userID, _, role := middleware.GetCurrentUser(c)
var instances []model.Instance
query := model.DB.Order("id")
// developer only sees instances in their groups
if role == "developer" {
var groupIDs []int
@@ -33,12 +33,12 @@ func ListInstances(c *gin.Context) {
}
}
}
if err := query.Find(&instances).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"detail": err.Error()})
return
}
// mask passwords in response
for i := range instances {
instances[i].Password = ""
@@ -86,8 +86,8 @@ func CreateInstance(c *gin.Context) {
if result.Version != "" {
updates["version"] = result.Version
}
if result.ClusterMode {
updates["cluster_mode"] = true
if instance.DBType == "redis" {
updates["cluster_mode"] = result.ClusterMode
}
} else {
updates["status"] = "error"
@@ -108,13 +108,13 @@ func UpdateInstance(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{"detail": "Instance not found"})
return
}
var input map[string]interface{}
if err := c.ShouldBindJSON(&input); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"detail": err.Error()})
return
}
// if password is empty or masked placeholder, don't update it
if pw, ok := input["password"].(string); ok {
pw = strings.TrimSpace(pw)
@@ -128,12 +128,12 @@ func UpdateInstance(c *gin.Context) {
}
}
}
if err := model.DB.Model(&instance).Updates(input).Error; err != nil {
c.JSON(http.StatusInternalServerError, gin.H{"detail": err.Error()})
return
}
model.DB.First(&instance, id)
instance.Password = "******"
c.JSON(http.StatusOK, instance)
@@ -157,15 +157,15 @@ func TestConnection(c *gin.Context) {
c.JSON(http.StatusNotFound, gin.H{"detail": "Instance not found"})
return
}
result := testDBConnectionFull(&instance)
// Update version & cluster_mode in DB if detected
updates := map[string]interface{}{}
if result.Success && result.Version != "" {
updates["version"] = result.Version
}
if result.ClusterMode {
updates["cluster_mode"] = true
if instance.DBType == "redis" {
updates["cluster_mode"] = result.ClusterMode
}
if len(updates) > 0 {
model.DB.Model(&model.Instance{}).Where("id = ?", instance.ID).Updates(updates)
@@ -181,16 +181,16 @@ func TestConnection(c *gin.Context) {
func InstanceStats(c *gin.Context) {
var total int64
model.DB.Model(&model.Instance{}).Count(&total)
type typeCount struct {
DBType string `json:"db_type"`
Count int64 `json:"count"`
}
var byType []typeCount
model.DB.Model(&model.Instance{}).Select("db_type, count(*) as count").Group("db_type").Scan(&byType)
c.JSON(http.StatusOK, gin.H{
"total": total,
"total": total,
"by_type": byType,
})
}