/* * Auto Update Config API List * /autoUpdateConfig/option - GET 获取配置选项 * /autoUpdateConfig/packageInfo - GET 获取包信息 - 通过升级包名 * /autoUpdateConfig/packageInfo/create/:type - POST 创建自动升级包信息 * /autoUpdateConfig/packageInfo/update/:id - POST 更新自动升级包信息 * /autoUpdateConfig/packageInfo/delete/:type/:id - DELETE 删除自动升级包信息 * /autoUpdateConfig/aPowerVersion - GET 获取aPower版本信息 - 通过硬件版本号 * /autoUpdateConfig/aPowerVersion/:version - POST 新增&更新aPower版本信息 - 通过硬件版本号 * /autoUpdateConfig/aPowerVersion/:version - DELETE 删除aPower版本信息 - 通过硬件版本号 * /autoUpdateConfig/config - GET 获取配置 - 通过aGate硬件版本 * /autoUpdateConfig/config/:aGate - POST 新增&更新配置 - 通过aGate硬件版本 * /autoUpdateConfig/config/:aGate - DELETE 删除配置 - 通过aGate硬件版本 * /autoUpdateConfig/config/special/:aGate - POST 新增特殊配置 - 通过aGate硬件版本 * /autoUpdateConfig/config/special/:aGate/:id - DELETE 删除特殊配置 - 通过aGate硬件版本 * /autoUpdateConfig/configFile - GET 获取配置文件列表 * /autoUpdateConfig/configFile/create - POST 创建配置文件 * /autoUpdateConfig/configFile/download/:fileName - GET 下载配置文件列表 */ package controllers import ( "bufio" "encoding/base64" "fmt" "fwh-toolbox-server/domain" "fwh-toolbox-server/services" "net/url" "strconv" "github.com/gofiber/fiber/v2" "go.uber.org/zap" ) // 获取自动升级配置选项 // /autoUpdateConfig/option func GetAutoUpdateConfigOption(c *fiber.Ctx) error { option, err := services.GetAutoUpdateConfigOption() if err != nil { return Error(c, "Database read failed. (MongoDb)") } return Success(c, option) } // 获取自动升级包信息 - 通过升级包名 // /autoUpdateConfig/packageInfo func GetAutoUpdatePackageInfo(c *fiber.Ctx) error { fileName := c.Query("fileName", "") info, err := services.GetAutoUpdatePackageInfo(fileName) if err != nil { return Error(c, "Database read failed. (MongoDb)") } return Success(c, info) } // 创建自动升级包信息 // /autoUpdateConfig/packageInfo/create/:type func CreateAutoUpdatePackageInfo(c *fiber.Ctx) error { packageType := c.Params("type") var body domain.AutoUpdatePackages if err := c.BodyParser(&body); err != nil { zap.L().Warn("Invalid request body", zap.String("err", err.Error())) return Fail(c, "Invalid request body") } if body.Id == "" { return Fail(c, "fileName is nil") } err := services.CreateAutoUpdatePackageInfo(packageType, body) if err != nil { return Error(c, err.Error()) } return Success[any](c, nil, "Success") } // 更新自动升级包信息 // /autoUpdateConfig/packageInfo/update/:id func UpdateAutoUpdatePackageInfo(c *fiber.Ctx) error { fileName := c.Params("id") var body domain.AutoUpdatePackages if err := c.BodyParser(&body); err != nil { zap.L().Warn("Invalid request body", zap.String("err", err.Error())) return Fail(c, "Invalid request body") } if fileName == "" || body.Id == "" { return Fail(c, "fileName is nil") } err := services.UpdateAutoUpdatePackageInfo(fileName, body) if err != nil { return Error(c, err.Error()) } return Success[any](c, nil, "Success") } // 删除自动升级包信息 // /autoUpdateConfig/packageInfo/delete/:type/:id func DeleteAutoUpdatePackageInfo(c *fiber.Ctx) error { packageType := c.Params("type") fileName := c.Params("id") if fileName == "" { return Fail(c, "fileName is nil") } err := services.DeleteAutoUpdatePackageInfo(packageType, fileName) if err != nil { return Error(c, err.Error()) } return Success[any](c, nil, "Success") } // 获取aPower版本信息 - 通过硬件版本号 // /autoUpdateConfig/aPowerVersion func GetAutoUpdateAPowerVersion(c *fiber.Ctx) error { versionList, err := services.GetAutoUpdateAPowerVersion() if err != nil { return Error(c, "Database read failed. (MongoDb) "+err.Error()) } return Success(c, versionList) } // 新增&更新aPower版本信息 - 通过硬件版本号 // /autoUpdateConfig/aPowerVersion/:version func UpdateAutoUpdateAPowerVersion(c *fiber.Ctx) error { aPowerVersion := c.Params("version") var body domain.AutoUpdateAPowerVersion if err := c.BodyParser(&body); err != nil { zap.L().Warn("Invalid request body", zap.String("err", err.Error())) return Fail(c, "Invalid request body") } err := services.UpdateAutoUpdateAPowerVersion(aPowerVersion, body) if err != nil { return Error(c, "Database write failed. (MongoDb) "+err.Error()) } return Success[any](c, nil, "Success") } // 删除aPower版本信息 - 通过硬件版本号 // /autoUpdateConfig/aPowerVersion/:version func DeleteAutoUpdateAPowerVersion(c *fiber.Ctx) error { aPowerVersion := c.Params("version") err := services.DeleteAutoUpdateAPowerVersion(aPowerVersion) if err != nil { return Error(c, "Database delete failed. (MongoDb) "+err.Error()) } return Success[any](c, nil, "Success") } // 获取自动升级配置 // /autoUpdateConfig/config func GetAutoUpdateConfig(c *fiber.Ctx) error { aGateVersion := c.Query("aGate", "") config, err := services.GetAutoUpdateConfig(aGateVersion) if err != nil { return Error(c, "Database read failed. (MongoDb) "+err.Error()) } return Success(c, config) } // 新增&更新配置 // /autoUpdateConfig/config/:aGate func UpdateAutoUpdateConfig(c *fiber.Ctx) error { aGateVersion := c.Params("aGate") var body domain.AutoUpdateConfig if err := c.BodyParser(&body); err != nil { zap.L().Warn("Invalid request body", zap.String("err", err.Error())) return Fail(c, "Invalid request body") } err := services.UpdateAutoUpdateConfig(aGateVersion, body) if err != nil { return Error(c, "Database write failed. (MongoDb) "+err.Error()) } return Success[any](c, nil, "Success") } // 删除配置 // /autoUpdateConfig/config/:aGate func DeleteAutoUpdateConfig(c *fiber.Ctx) error { aGateVersion := c.Params("aGate") err := services.DeleteAutoUpdateConfig(aGateVersion) if err != nil { return Error(c, "Database delete failed. (MongoDb) "+err.Error()) } return Success[any](c, nil, "Success") } // 新增特殊配置 // /autoUpdateConfig/config/special/:aGate func CreateAutoUpdateSpecialConfig(c *fiber.Ctx) error { aGateVersion := c.Params("aGate") var body domain.AutoUpdateSpecialTypeConfig if err := c.BodyParser(&body); err != nil { zap.L().Warn("Invalid request body", zap.String("err", err.Error())) return Fail(c, "Invalid request body") } err := services.CreateAutoUpdateSpecialConfig(aGateVersion, body) if err != nil { return Error(c, "Database create failed. (MongoDb) "+err.Error()) } return Success[any](c, nil, "Success") } // 删除特殊配置 // /autoUpdateConfig/config/special/:aGate/:id func DeleteAutoUpdateSpecialConfig(c *fiber.Ctx) error { aGateVersion := c.Params("aGate") id := c.Params("id") err := services.DeleteAutoUpdateSpecialConfig(aGateVersion, id) if err != nil { return Error(c, "Database delete failed. (MongoDb) "+err.Error()) } return Success[any](c, nil, "Success") } // 获取配置文件列表 // /autoUpdateConfig/configFile func GetAutoUpdateConfigFileInfo(c *fiber.Ctx) error { pageStr := c.Query("page", "") sizeStr := c.Query("size", "") page, err := strconv.Atoi(pageStr) if err != nil { return err } size, err := strconv.Atoi(sizeStr) if err != nil { return err } if page < 1 { return fmt.Errorf("page < 1") } if size < 1 { return fmt.Errorf("size < 1") } infoPage, err := services.GetAutoUpdateConfigFileInfo(uint(page), uint(size)) if err != nil { return Error(c, "Database read failed. (MongoDb) "+err.Error()) } return Success[any](c, infoPage, "Success") } // 创建配置文件 // /autoUpdateConfig/configFile/create func CreateAutoUpdateConfigFile(c *fiber.Ctx) error { err := services.CreateAutoUpdateConfigFile() if err != nil { return Error(c, "File create failed. "+err.Error()) } return Success[any](c, nil, "Success") } // 下载配置文件 // /autoUpdateConfig/configFile/download/:fileName func DownloadAutoUpdateConfigFile(c *fiber.Ctx) error { fileNameEncode := c.Params("fileName") // URL-safe Base64 解码 decoded, err := base64.RawURLEncoding.DecodeString(fileNameEncode) if err != nil { return c.Status(400).SendString("invalid token") } fileName := string(decoded) fmt.Printf("fileName = %s\n", fileName) c.Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet") c.Set("Content-Disposition", "attachment; filename*=UTF-8''"+url.PathEscape(fileName)) // Fiber 原生 Context 的 BodyWriter,可直接写数据到 HTTP 输出 // writer := c.Context().Response.BodyWriter() // 使用 SetBodyStreamWriter 流式写入 c.Context().SetBodyStreamWriter(func(w *bufio.Writer) { err := services.DownloadAutoUpdateConfigFile(fileName, w) if err != nil { zap.L().Warn("Database read failed. (MongoDb)", zap.String("err", err.Error())) return } w.Flush() fmt.Println("SetBodyStreamWriter complete.") }) return nil }