node.go 2.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899
  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. core.List()
  39. }
  40. func AddNode(c *gin.Context) {
  41. cosy.Core[model.Node](c).SetValidRules(gin.H{
  42. "name": "required",
  43. "url": "required,url",
  44. "token": "required",
  45. "enabled": "omitempty,boolean",
  46. }).ExecutedHook(func(c *cosy.Ctx[model.Node]) {
  47. cache.InvalidateNodeCache()
  48. go analytic.RestartRetrieveNodesStatus()
  49. }).Create()
  50. }
  51. func EditNode(c *gin.Context) {
  52. cosy.Core[model.Node](c).SetValidRules(gin.H{
  53. "name": "required",
  54. "url": "required,url",
  55. "token": "required",
  56. "enabled": "omitempty,boolean",
  57. }).ExecutedHook(func(c *cosy.Ctx[model.Node]) {
  58. cache.InvalidateNodeCache()
  59. go analytic.RestartRetrieveNodesStatus()
  60. }).Modify()
  61. }
  62. func DeleteNode(c *gin.Context) {
  63. cosy.Core[model.Node](c).
  64. ExecutedHook(func(c *cosy.Ctx[model.Node]) {
  65. cache.InvalidateNodeCache()
  66. go analytic.RestartRetrieveNodesStatus()
  67. }).Destroy()
  68. }
  69. func LoadNodeFromSettings(c *gin.Context) {
  70. err := settings.ReloadCluster()
  71. if err != nil {
  72. cosy.ErrHandler(c, err)
  73. return
  74. }
  75. ctx := context.Background()
  76. cluster.RegisterPredefinedNodes(ctx)
  77. cache.InvalidateNodeCache()
  78. go analytic.RestartRetrieveNodesStatus()
  79. c.JSON(http.StatusOK, gin.H{
  80. "message": "ok",
  81. })
  82. }