diff --git a/apis/admin/server.api b/apis/admin/server.api index e4b4618..7502feb 100644 --- a/apis/admin/server.api +++ b/apis/admin/server.api @@ -168,6 +168,9 @@ type ( ResetSortRequest { Sort []SortItem `json:"sort"` } + QueryNodeTagResponse { + Tags []string `json:"tags"` + } ) @server ( @@ -231,5 +234,9 @@ service ppanel { @doc "Reset node sort" @handler ResetSortWithNode post /node/sort (ResetSortRequest) + + @doc "Query all node tags" + @handler QueryNodeTag + get /node/tags returns (QueryNodeTagResponse) } diff --git a/internal/handler/admin/server/queryNodeTagHandler.go b/internal/handler/admin/server/queryNodeTagHandler.go new file mode 100644 index 0000000..fa963cc --- /dev/null +++ b/internal/handler/admin/server/queryNodeTagHandler.go @@ -0,0 +1,18 @@ +package server + +import ( + "github.com/gin-gonic/gin" + "github.com/perfect-panel/server/internal/logic/admin/server" + "github.com/perfect-panel/server/internal/svc" + "github.com/perfect-panel/server/pkg/result" +) + +// Query all node tags +func QueryNodeTagHandler(svcCtx *svc.ServiceContext) func(c *gin.Context) { + return func(c *gin.Context) { + + l := server.NewQueryNodeTagLogic(c.Request.Context(), svcCtx) + resp, err := l.QueryNodeTag() + result.HttpResult(c, resp, err) + } +} diff --git a/internal/handler/routes.go b/internal/handler/routes.go index 1c876ef..e20564e 100644 --- a/internal/handler/routes.go +++ b/internal/handler/routes.go @@ -323,6 +323,9 @@ func RegisterHandlers(router *gin.Engine, serverCtx *svc.ServiceContext) { // Toggle Node Status adminServerGroupRouter.POST("/node/status/toggle", adminServer.ToggleNodeStatusHandler(serverCtx)) + // Query all node tags + adminServerGroupRouter.GET("/node/tags", adminServer.QueryNodeTagHandler(serverCtx)) + // Update Node adminServerGroupRouter.POST("/node/update", adminServer.UpdateNodeHandler(serverCtx)) diff --git a/internal/logic/admin/server/queryNodeTagLogic.go b/internal/logic/admin/server/queryNodeTagLogic.go new file mode 100644 index 0000000..47e0daf --- /dev/null +++ b/internal/logic/admin/server/queryNodeTagLogic.go @@ -0,0 +1,46 @@ +package server + +import ( + "context" + "strings" + + "github.com/perfect-panel/server/internal/model/node" + "github.com/perfect-panel/server/internal/svc" + "github.com/perfect-panel/server/internal/types" + "github.com/perfect-panel/server/pkg/logger" + "github.com/perfect-panel/server/pkg/tool" + "github.com/perfect-panel/server/pkg/xerr" + "github.com/pkg/errors" +) + +type QueryNodeTagLogic struct { + logger.Logger + ctx context.Context + svcCtx *svc.ServiceContext +} + +// NewQueryNodeTagLogic Query all node tags +func NewQueryNodeTagLogic(ctx context.Context, svcCtx *svc.ServiceContext) *QueryNodeTagLogic { + return &QueryNodeTagLogic{ + Logger: logger.WithContext(ctx), + ctx: ctx, + svcCtx: svcCtx, + } +} + +func (l *QueryNodeTagLogic) QueryNodeTag() (resp *types.QueryNodeTagResponse, err error) { + + var nodes []*node.Node + if err = l.svcCtx.DB.WithContext(l.ctx).Model(&node.Node{}).Find(&nodes).Error; err != nil { + l.Errorw("[QueryNodeTag] Query Database Error: ", logger.Field("error", err.Error())) + return nil, errors.Wrapf(xerr.NewErrCode(xerr.DatabaseQueryError), "[QueryNodeTag] Query Database Error") + } + var tags []string + for _, item := range nodes { + tags = append(tags, strings.Split(item.Tags, ",")...) + } + + return &types.QueryNodeTagResponse{ + Tags: tool.RemoveDuplicateElements(tags...), + }, nil +} diff --git a/internal/types/types.go b/internal/types/types.go index d54b9aa..588aa6d 100644 --- a/internal/types/types.go +++ b/internal/types/types.go @@ -1477,6 +1477,10 @@ type QueryDocumentListResponse struct { List []Document `json:"list"` } +type QueryNodeTagResponse struct { + Tags []string `json:"tags"` +} + type QueryOrderDetailRequest struct { OrderNo string `form:"order_no" validate:"required"` }