mirror of
https://github.com/Rain-kl/OpenFlare.git
synced 2026-09-30 14:26:36 +08:00
260 lines
8.6 KiB
Go
260 lines
8.6 KiB
Go
/*
|
||
Copyright 2025 linux.do
|
||
|
||
Licensed under the Apache License, Version 2.0 (the "License");
|
||
you may not use this file except in compliance with the License.
|
||
You may obtain a copy of the License at
|
||
|
||
http://www.apache.org/licenses/LICENSE-2.0
|
||
|
||
Unless required by applicable law or agreed to in writing, software
|
||
distributed under the License is distributed on an "AS IS" BASIS,
|
||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||
See the License for the specific language governing permissions and
|
||
limitations under the License.
|
||
*/
|
||
|
||
package system_config
|
||
|
||
import (
|
||
"errors"
|
||
"net/http"
|
||
|
||
"github.com/gin-gonic/gin"
|
||
"github.com/linux-do/credit/internal/db"
|
||
"github.com/linux-do/credit/internal/model"
|
||
"github.com/linux-do/credit/internal/util"
|
||
"gorm.io/gorm"
|
||
)
|
||
|
||
// CreateSystemConfigRequest 创建系统配置请求
|
||
type CreateSystemConfigRequest struct {
|
||
Key string `json:"key" binding:"required,max=64"`
|
||
Value string `json:"value" binding:"required,max=255"`
|
||
Type string `json:"type" binding:"required,oneof=system business"`
|
||
Description string `json:"description" binding:"max=255"`
|
||
}
|
||
|
||
// UpdateSystemConfigRequest 更新系统配置请求
|
||
type UpdateSystemConfigRequest struct {
|
||
Value string `json:"value" binding:"required,max=255"`
|
||
Description string `json:"description" binding:"max=255"`
|
||
}
|
||
|
||
// CreateSystemConfig 创建系统配置
|
||
// @Summary 创建系统配置
|
||
// @Description 创建一条新的系统配置项,配置键不可重复,同时将新配置同步到 Redis,需要管理员权限
|
||
// @Tags admin
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security SessionCookie
|
||
// @Param request body system_config.CreateSystemConfigRequest true "创建请求参数"
|
||
// @Success 200 {object} util.ResponseAny{data=string} "创建成功"
|
||
// @Failure 400 {object} util.ResponseAny "参数错误或配置键已存在"
|
||
// @Failure 401 {object} util.ResponseAny "未登录"
|
||
// @Failure 403 {object} util.ResponseAny "无管理员权限"
|
||
// @Failure 500 {object} util.ResponseAny "内部错误"
|
||
// @Router /api/v1/admin/system-configs [post]
|
||
func CreateSystemConfig(c *gin.Context) {
|
||
var req CreateSystemConfigRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
// 检查配置键是否已存在
|
||
var existing model.SystemConfig
|
||
if err := db.DB(c.Request.Context()).Where("key = ?", req.Key).First(&existing).Error; err == nil {
|
||
c.JSON(http.StatusBadRequest, util.Err(ConfigKeyExists))
|
||
return
|
||
} else if !errors.Is(err, gorm.ErrRecordNotFound) {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
config := model.SystemConfig{
|
||
Key: req.Key,
|
||
Value: req.Value,
|
||
Type: req.Type,
|
||
Description: req.Description,
|
||
}
|
||
|
||
if err := db.DB(c.Request.Context()).Transaction(func(tx *gorm.DB) error {
|
||
// 创建配置
|
||
if err := tx.Create(&config).Error; err != nil {
|
||
return err
|
||
}
|
||
|
||
if err := db.HSetJSON(c.Request.Context(), model.SystemConfigRedisHashKey, req.Key, &config); err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}); err != nil {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, util.OKNil())
|
||
}
|
||
|
||
// ListSystemConfigs 获取系统配置列表
|
||
// @Summary 获取系统配置列表
|
||
// @Description 返回所有系统配置列表,支持按配置类型(system/business)过滤,需要管理员权限
|
||
// @Tags admin
|
||
// @Produce json
|
||
// @Security SessionCookie
|
||
// @Param type query string false "配置类型(system/business)"
|
||
// @Success 200 {object} util.ResponseAny{data=[]model.SystemConfig} "系统配置列表"
|
||
// @Failure 401 {object} util.ResponseAny "未登录"
|
||
// @Failure 403 {object} util.ResponseAny "无管理员权限"
|
||
// @Failure 500 {object} util.ResponseAny "内部错误"
|
||
// @Router /api/v1/admin/system-configs [get]
|
||
func ListSystemConfigs(c *gin.Context) {
|
||
configType := c.Query("type")
|
||
query := db.DB(c.Request.Context()).Order("created_at DESC")
|
||
if configType != "" {
|
||
query = query.Where("type = ?", configType)
|
||
}
|
||
|
||
var configs []model.SystemConfig
|
||
if err := query.Find(&configs).Error; err != nil {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, util.OK(configs))
|
||
}
|
||
|
||
// GetSystemConfig 获取单个系统配置
|
||
// @Summary 获取单个系统配置
|
||
// @Description 根据配置键获取对应的系统配置详情,需要管理员权限
|
||
// @Tags admin
|
||
// @Produce json
|
||
// @Security SessionCookie
|
||
// @Param key path string true "配置键"
|
||
// @Success 200 {object} util.ResponseAny{data=model.SystemConfig} "系统配置详情"
|
||
// @Failure 401 {object} util.ResponseAny "未登录"
|
||
// @Failure 403 {object} util.ResponseAny "无管理员权限"
|
||
// @Failure 404 {object} util.ResponseAny "配置不存在"
|
||
// @Failure 500 {object} util.ResponseAny "内部错误"
|
||
// @Router /api/v1/admin/system-configs/{key} [get]
|
||
func GetSystemConfig(c *gin.Context) {
|
||
var config model.SystemConfig
|
||
if err := db.DB(c.Request.Context()).Where("key = ?", c.Param("key")).First(&config).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
c.JSON(http.StatusNotFound, util.Err(SystemConfigNotFound))
|
||
} else {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
}
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, util.OK(config))
|
||
}
|
||
|
||
// UpdateSystemConfig 更新系统配置
|
||
// @Summary 更新系统配置
|
||
// @Description 根据配置键更新对应的配置内容,同时将更新同步到 Redis,需要管理员权限
|
||
// @Tags admin
|
||
// @Accept json
|
||
// @Produce json
|
||
// @Security SessionCookie
|
||
// @Param key path string true "配置键"
|
||
// @Param request body system_config.UpdateSystemConfigRequest true "更新请求参数"
|
||
// @Success 200 {object} util.ResponseAny{data=string} "更新成功"
|
||
// @Failure 400 {object} util.ResponseAny "参数错误"
|
||
// @Failure 401 {object} util.ResponseAny "未登录"
|
||
// @Failure 403 {object} util.ResponseAny "无管理员权限"
|
||
// @Failure 404 {object} util.ResponseAny "配置不存在"
|
||
// @Failure 500 {object} util.ResponseAny "内部错误"
|
||
// @Router /api/v1/admin/system-configs/{key} [put]
|
||
func UpdateSystemConfig(c *gin.Context) {
|
||
var req UpdateSystemConfigRequest
|
||
if err := c.ShouldBindJSON(&req); err != nil {
|
||
c.JSON(http.StatusBadRequest, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
key := c.Param("key")
|
||
|
||
// 检查配置是否存在
|
||
var config model.SystemConfig
|
||
if err := db.DB(c.Request.Context()).Where("key = ?", key).First(&config).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
c.JSON(http.StatusNotFound, util.Err(SystemConfigNotFound))
|
||
} else {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
}
|
||
return
|
||
}
|
||
|
||
if err := db.DB(c.Request.Context()).Transaction(func(tx *gorm.DB) error {
|
||
// 更新配置
|
||
if err := tx.Model(&config).
|
||
Updates(map[string]interface{}{
|
||
"value": req.Value,
|
||
"description": req.Description,
|
||
}).Error; err != nil {
|
||
return err
|
||
}
|
||
|
||
if err := db.HSetJSON(c.Request.Context(), model.SystemConfigRedisHashKey, key, &config); err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}); err != nil {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, util.OKNil())
|
||
}
|
||
|
||
// DeleteSystemConfig 删除系统配置
|
||
// @Summary 删除系统配置
|
||
// @Description 根据配置键删除对应配置,同时从 Redis 中移除对应缓存,需要管理员权限
|
||
// @Tags admin
|
||
// @Produce json
|
||
// @Security SessionCookie
|
||
// @Param key path string true "配置键"
|
||
// @Success 200 {object} util.ResponseAny{data=string} "删除成功"
|
||
// @Failure 401 {object} util.ResponseAny "未登录"
|
||
// @Failure 403 {object} util.ResponseAny "无管理员权限"
|
||
// @Failure 404 {object} util.ResponseAny "配置不存在"
|
||
// @Failure 500 {object} util.ResponseAny "内部错误"
|
||
// @Router /api/v1/admin/system-configs/{key} [delete]
|
||
func DeleteSystemConfig(c *gin.Context) {
|
||
key := c.Param("key")
|
||
|
||
// 检查配置是否存在
|
||
var config model.SystemConfig
|
||
if err := db.DB(c.Request.Context()).Where("key = ?", key).First(&config).Error; err != nil {
|
||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||
c.JSON(http.StatusNotFound, util.Err(SystemConfigNotFound))
|
||
} else {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
}
|
||
return
|
||
}
|
||
|
||
if err := db.DB(c.Request.Context()).Transaction(func(tx *gorm.DB) error {
|
||
// 删除配置
|
||
if err := tx.Delete(&config).Error; err != nil {
|
||
return err
|
||
}
|
||
|
||
if err := db.Redis.HDel(c.Request.Context(), db.PrefixedKey(model.SystemConfigRedisHashKey), key).Err(); err != nil {
|
||
return err
|
||
}
|
||
|
||
return nil
|
||
}); err != nil {
|
||
c.JSON(http.StatusInternalServerError, util.Err(err.Error()))
|
||
return
|
||
}
|
||
|
||
c.JSON(http.StatusOK, util.OKNil())
|
||
}
|