node.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. package cluster
  2. import (
  3. "context"
  4. "net/http"
  5. "github.com/0xJacky/Nginx-UI/internal/analytic"
  6. "github.com/0xJacky/Nginx-UI/internal/cache"
  7. "github.com/0xJacky/Nginx-UI/internal/cluster"
  8. "github.com/0xJacky/Nginx-UI/model"
  9. "github.com/0xJacky/Nginx-UI/query"
  10. "github.com/0xJacky/Nginx-UI/settings"
  11. "github.com/gin-gonic/gin"
  12. "github.com/spf13/cast"
  13. "github.com/uozi-tech/cosy"
  14. "gorm.io/gorm"
  15. )
  16. func GetNode(c *gin.Context) {
  17. id := cast.ToUint64(c.Param("id"))
  18. nodeQuery := query.Node
  19. node, err := nodeQuery.FirstByID(id)
  20. if err != nil {
  21. cosy.ErrHandler(c, err)
  22. return
  23. }
  24. c.JSON(http.StatusOK, analytic.GetNode(node))
  25. }
  26. func GetNodeList(c *gin.Context) {
  27. core := cosy.Core[model.Node](c).
  28. SetFussy("name")
  29. // fix for sqlite
  30. if c.Query("enabled") != "" {
  31. core.GormScope(func(tx *gorm.DB) *gorm.DB {
  32. return tx.Where("enabled = ?", cast.ToInt(cast.ToBool(c.Query("enabled"))))
  33. })
  34. }
  35. core.SetTransformer(func(m *model.Node) any {
  36. return analytic.GetNode(m)
  37. })
  38. data, ok := core.ListAllData()
  39. if !ok {
  40. return
  41. }
  42. c.JSON(http.StatusOK, model.DataList{
  43. Data: data,
  44. })
  45. }
  46. func AddNode(c *gin.Context) {
  47. cosy.Core[model.Node](c).SetValidRules(gin.H{
  48. "name": "required",
  49. "url": "required,url",
  50. "token": "required",
  51. "enabled": "omitempty,boolean",
  52. }).ExecutedHook(func(c *cosy.Ctx[model.Node]) {
  53. cache.InvalidateNodeCache()
  54. go analytic.RestartRetrieveNodesStatus()
  55. }).Create()
  56. }
  57. func EditNode(c *gin.Context) {
  58. cosy.Core[model.Node](c).SetValidRules(gin.H{
  59. "name": "required",
  60. "url": "required,url",
  61. "token": "required",
  62. "enabled": "omitempty,boolean",
  63. }).ExecutedHook(func(c *cosy.Ctx[model.Node]) {
  64. cache.InvalidateNodeCache()
  65. go analytic.RestartRetrieveNodesStatus()
  66. }).Modify()
  67. }
  68. func DeleteNode(c *gin.Context) {
  69. cosy.Core[model.Node](c).
  70. ExecutedHook(func(c *cosy.Ctx[model.Node]) {
  71. cache.InvalidateNodeCache()
  72. go analytic.RestartRetrieveNodesStatus()
  73. }).Destroy()
  74. }
  75. func LoadNodeFromSettings(c *gin.Context) {
  76. err := settings.ReloadCluster()
  77. if err != nil {
  78. cosy.ErrHandler(c, err)
  79. return
  80. }
  81. ctx := context.Background()
  82. cluster.RegisterPredefinedNodes(ctx)
  83. cache.InvalidateNodeCache()
  84. go analytic.RestartRetrieveNodesStatus()
  85. c.JSON(http.StatusOK, gin.H{
  86. "message": "ok",
  87. })
  88. }