autoUpdateConfigControllers.go 8.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295
  1. /*
  2. * Auto Update Config API List
  3. * /autoUpdateConfig/option - GET 获取配置选项
  4. * /autoUpdateConfig/packageInfo - GET 获取包信息 - 通过升级包名
  5. * /autoUpdateConfig/packageInfo/create/:type - POST 创建自动升级包信息
  6. * /autoUpdateConfig/packageInfo/update/:id - POST 更新自动升级包信息
  7. * /autoUpdateConfig/packageInfo/delete/:type/:id - DELETE 删除自动升级包信息
  8. * /autoUpdateConfig/aPowerVersion - GET 获取aPower版本信息 - 通过硬件版本号
  9. * /autoUpdateConfig/aPowerVersion/:version - POST 新增&更新aPower版本信息 - 通过硬件版本号
  10. * /autoUpdateConfig/aPowerVersion/:version - DELETE 删除aPower版本信息 - 通过硬件版本号
  11. * /autoUpdateConfig/config - GET 获取配置 - 通过aGate硬件版本
  12. * /autoUpdateConfig/config/:aGate - POST 新增&更新配置 - 通过aGate硬件版本
  13. * /autoUpdateConfig/config/:aGate - DELETE 删除配置 - 通过aGate硬件版本
  14. * /autoUpdateConfig/config/special/:aGate - POST 新增特殊配置 - 通过aGate硬件版本
  15. * /autoUpdateConfig/config/special/:aGate/:id - DELETE 删除特殊配置 - 通过aGate硬件版本
  16. * /autoUpdateConfig/configFile - GET 获取配置文件列表
  17. * /autoUpdateConfig/configFile/create - POST 创建配置文件
  18. * /autoUpdateConfig/configFile/download/:fileName - GET 下载配置文件列表
  19. */
  20. package controllers
  21. import (
  22. "bufio"
  23. "encoding/base64"
  24. "fmt"
  25. "fwh-toolbox-server/domain"
  26. "fwh-toolbox-server/services"
  27. "net/url"
  28. "strconv"
  29. "github.com/gofiber/fiber/v2"
  30. "go.uber.org/zap"
  31. )
  32. // 获取自动升级配置选项
  33. // /autoUpdateConfig/option
  34. func GetAutoUpdateConfigOption(c *fiber.Ctx) error {
  35. option, err := services.GetAutoUpdateConfigOption()
  36. if err != nil {
  37. return Error(c, "Database read failed. (MongoDb)")
  38. }
  39. return Success(c, option)
  40. }
  41. // 获取自动升级包信息 - 通过升级包名
  42. // /autoUpdateConfig/packageInfo
  43. func GetAutoUpdatePackageInfo(c *fiber.Ctx) error {
  44. fileName := c.Query("fileName", "")
  45. info, err := services.GetAutoUpdatePackageInfo(fileName)
  46. if err != nil {
  47. return Error(c, "Database read failed. (MongoDb)")
  48. }
  49. return Success(c, info)
  50. }
  51. // 创建自动升级包信息
  52. // /autoUpdateConfig/packageInfo/create/:type
  53. func CreateAutoUpdatePackageInfo(c *fiber.Ctx) error {
  54. packageType := c.Params("type")
  55. var body domain.AutoUpdatePackages
  56. if err := c.BodyParser(&body); err != nil {
  57. zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
  58. return Fail(c, "Invalid request body")
  59. }
  60. if body.Id == "" {
  61. return Fail(c, "fileName is nil")
  62. }
  63. err := services.CreateAutoUpdatePackageInfo(packageType, body)
  64. if err != nil {
  65. return Error(c, err.Error())
  66. }
  67. return Success[any](c, nil, "Success")
  68. }
  69. // 更新自动升级包信息
  70. // /autoUpdateConfig/packageInfo/update/:id
  71. func UpdateAutoUpdatePackageInfo(c *fiber.Ctx) error {
  72. fileName := c.Params("id")
  73. var body domain.AutoUpdatePackages
  74. if err := c.BodyParser(&body); err != nil {
  75. zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
  76. return Fail(c, "Invalid request body")
  77. }
  78. if fileName == "" || body.Id == "" {
  79. return Fail(c, "fileName is nil")
  80. }
  81. err := services.UpdateAutoUpdatePackageInfo(fileName, body)
  82. if err != nil {
  83. return Error(c, err.Error())
  84. }
  85. return Success[any](c, nil, "Success")
  86. }
  87. // 删除自动升级包信息
  88. // /autoUpdateConfig/packageInfo/delete/:type/:id
  89. func DeleteAutoUpdatePackageInfo(c *fiber.Ctx) error {
  90. packageType := c.Params("type")
  91. fileName := c.Params("id")
  92. if fileName == "" {
  93. return Fail(c, "fileName is nil")
  94. }
  95. err := services.DeleteAutoUpdatePackageInfo(packageType, fileName)
  96. if err != nil {
  97. return Error(c, err.Error())
  98. }
  99. return Success[any](c, nil, "Success")
  100. }
  101. // 获取aPower版本信息 - 通过硬件版本号
  102. // /autoUpdateConfig/aPowerVersion
  103. func GetAutoUpdateAPowerVersion(c *fiber.Ctx) error {
  104. versionList, err := services.GetAutoUpdateAPowerVersion()
  105. if err != nil {
  106. return Error(c, "Database read failed. (MongoDb) "+err.Error())
  107. }
  108. return Success(c, versionList)
  109. }
  110. // 新增&更新aPower版本信息 - 通过硬件版本号
  111. // /autoUpdateConfig/aPowerVersion/:version
  112. func UpdateAutoUpdateAPowerVersion(c *fiber.Ctx) error {
  113. aPowerVersion := c.Params("version")
  114. var body domain.AutoUpdateAPowerVersion
  115. if err := c.BodyParser(&body); err != nil {
  116. zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
  117. return Fail(c, "Invalid request body")
  118. }
  119. err := services.UpdateAutoUpdateAPowerVersion(aPowerVersion, body)
  120. if err != nil {
  121. return Error(c, "Database write failed. (MongoDb) "+err.Error())
  122. }
  123. return Success[any](c, nil, "Success")
  124. }
  125. // 删除aPower版本信息 - 通过硬件版本号
  126. // /autoUpdateConfig/aPowerVersion/:version
  127. func DeleteAutoUpdateAPowerVersion(c *fiber.Ctx) error {
  128. aPowerVersion := c.Params("version")
  129. err := services.DeleteAutoUpdateAPowerVersion(aPowerVersion)
  130. if err != nil {
  131. return Error(c, "Database delete failed. (MongoDb) "+err.Error())
  132. }
  133. return Success[any](c, nil, "Success")
  134. }
  135. // 获取自动升级配置
  136. // /autoUpdateConfig/config
  137. func GetAutoUpdateConfig(c *fiber.Ctx) error {
  138. aGateVersion := c.Query("aGate", "")
  139. config, err := services.GetAutoUpdateConfig(aGateVersion)
  140. if err != nil {
  141. return Error(c, "Database read failed. (MongoDb) "+err.Error())
  142. }
  143. return Success(c, config)
  144. }
  145. // 新增&更新配置
  146. // /autoUpdateConfig/config/:aGate
  147. func UpdateAutoUpdateConfig(c *fiber.Ctx) error {
  148. aGateVersion := c.Params("aGate")
  149. var body domain.AutoUpdateConfig
  150. if err := c.BodyParser(&body); err != nil {
  151. zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
  152. return Fail(c, "Invalid request body")
  153. }
  154. err := services.UpdateAutoUpdateConfig(aGateVersion, body)
  155. if err != nil {
  156. return Error(c, "Database write failed. (MongoDb) "+err.Error())
  157. }
  158. return Success[any](c, nil, "Success")
  159. }
  160. // 删除配置
  161. // /autoUpdateConfig/config/:aGate
  162. func DeleteAutoUpdateConfig(c *fiber.Ctx) error {
  163. aGateVersion := c.Params("aGate")
  164. err := services.DeleteAutoUpdateConfig(aGateVersion)
  165. if err != nil {
  166. return Error(c, "Database delete failed. (MongoDb) "+err.Error())
  167. }
  168. return Success[any](c, nil, "Success")
  169. }
  170. // 新增特殊配置
  171. // /autoUpdateConfig/config/special/:aGate
  172. func CreateAutoUpdateSpecialConfig(c *fiber.Ctx) error {
  173. aGateVersion := c.Params("aGate")
  174. var body domain.AutoUpdateSpecialTypeConfig
  175. if err := c.BodyParser(&body); err != nil {
  176. zap.L().Warn("Invalid request body", zap.String("err", err.Error()))
  177. return Fail(c, "Invalid request body")
  178. }
  179. err := services.CreateAutoUpdateSpecialConfig(aGateVersion, body)
  180. if err != nil {
  181. return Error(c, "Database create failed. (MongoDb) "+err.Error())
  182. }
  183. return Success[any](c, nil, "Success")
  184. }
  185. // 删除特殊配置
  186. // /autoUpdateConfig/config/special/:aGate/:id
  187. func DeleteAutoUpdateSpecialConfig(c *fiber.Ctx) error {
  188. aGateVersion := c.Params("aGate")
  189. id := c.Params("id")
  190. err := services.DeleteAutoUpdateSpecialConfig(aGateVersion, id)
  191. if err != nil {
  192. return Error(c, "Database delete failed. (MongoDb) "+err.Error())
  193. }
  194. return Success[any](c, nil, "Success")
  195. }
  196. // 获取配置文件列表
  197. // /autoUpdateConfig/configFile
  198. func GetAutoUpdateConfigFileInfo(c *fiber.Ctx) error {
  199. pageStr := c.Query("page", "")
  200. sizeStr := c.Query("size", "")
  201. page, err := strconv.Atoi(pageStr)
  202. if err != nil {
  203. return err
  204. }
  205. size, err := strconv.Atoi(sizeStr)
  206. if err != nil {
  207. return err
  208. }
  209. if page < 1 {
  210. return fmt.Errorf("page < 1")
  211. }
  212. if size < 1 {
  213. return fmt.Errorf("size < 1")
  214. }
  215. infoPage, err := services.GetAutoUpdateConfigFileInfo(uint(page), uint(size))
  216. if err != nil {
  217. return Error(c, "Database read failed. (MongoDb) "+err.Error())
  218. }
  219. return Success[any](c, infoPage, "Success")
  220. }
  221. // 创建配置文件
  222. // /autoUpdateConfig/configFile/create
  223. func CreateAutoUpdateConfigFile(c *fiber.Ctx) error {
  224. err := services.CreateAutoUpdateConfigFile()
  225. if err != nil {
  226. return Error(c, "File create failed. "+err.Error())
  227. }
  228. return Success[any](c, nil, "Success")
  229. }
  230. // 下载配置文件
  231. // /autoUpdateConfig/configFile/download/:fileName
  232. func DownloadAutoUpdateConfigFile(c *fiber.Ctx) error {
  233. fileNameEncode := c.Params("fileName")
  234. // URL-safe Base64 解码
  235. decoded, err := base64.RawURLEncoding.DecodeString(fileNameEncode)
  236. if err != nil {
  237. return c.Status(400).SendString("invalid token")
  238. }
  239. fileName := string(decoded)
  240. fmt.Printf("fileName = %s\n", fileName)
  241. c.Set("Content-Type", "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet")
  242. c.Set("Content-Disposition", "attachment; filename*=UTF-8''"+url.PathEscape(fileName))
  243. // Fiber 原生 Context 的 BodyWriter,可直接写数据到 HTTP 输出
  244. // writer := c.Context().Response.BodyWriter()
  245. // 使用 SetBodyStreamWriter 流式写入
  246. c.Context().SetBodyStreamWriter(func(w *bufio.Writer) {
  247. err := services.DownloadAutoUpdateConfigFile(fileName, w)
  248. if err != nil {
  249. zap.L().Warn("Database read failed. (MongoDb)", zap.String("err", err.Error()))
  250. return
  251. }
  252. w.Flush()
  253. fmt.Println("SetBodyStreamWriter complete.")
  254. })
  255. return nil
  256. }