| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295 |
- /*
- * 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
- }
|