// Copyright (c) Abstract Machines // SPDX-License-Identifier: Apache-2.0 package cli import ( "encoding/json" "fmt" smqsdk "github.com/absmach/magistrala/pkg/sdk" "github.com/spf13/cobra" ) const ( freeze = "freeze" // Usage strings for domain operations. usageDomainCreate = "cli domains create " usageDomainGet = "cli domains get " usageDomainUpdate = "cli domains update " usageDomainEnable = "cli domains enable " usageDomainDisable = "cli domains disable " usageDomainFreeze = "cli domains freeze " usageDomainUsers = "cli domains users " // Usage strings for domain roles operations. usageDomainRolesCreate = "cli domains roles create " usageDomainRolesGet = "cli domains roles get " usageDomainRolesUpdate = "cli domains roles update " usageDomainRolesDelete = "cli domains roles delete " // Usage strings for domain role actions operations. usageDomainRoleActionsAdd = "cli domains roles actions add " usageDomainRoleActionsList = "cli domains roles actions list " usageDomainRoleActionsDelete = "cli domains roles actions delete " usageDomainRoleActionsAvailable = "cli domains roles actions available-actions " // Usage strings for domain role members operations. usageDomainRoleMembersAdd = "cli domains roles members add " usageDomainRoleMembersList = "cli domains roles members list " usageDomainRoleMembersDelete = "cli domains roles members delete " ) func NewDomainsCmd() *cobra.Command { cmd := &cobra.Command{ Use: "domains [operation] [args...]", Short: "Domains management", Long: `Format: domains create [args...] domains [args...] Operations (require domain_id/all): get, update, enable, disable, freeze, users, roles Examples: domains create domains all get domains get domains update domains enable domains disable domains freeze domains users `, Run: func(cmd *cobra.Command, args []string) { if len(args) == 0 { logUsageCmd(*cmd, cmd.Use) return } if args[0] == create { handleDomainCreate(cmd, args[1:]) return } if len(args) < 2 { logUsageCmd(*cmd, "domains [args...]") return } domainParams := args[0] operation := args[1] opArgs := args[2:] switch operation { case get: handleDomainGet(cmd, domainParams, opArgs) case update: handleDomainUpdate(cmd, domainParams, opArgs) case enable: handleDomainEnable(cmd, domainParams, opArgs) case disable: handleDomainDisable(cmd, domainParams, opArgs) case freeze: handleDomainFreeze(cmd, domainParams, opArgs) case users: handleDomainUsers(cmd, domainParams, opArgs) case roles: handleDomainRoles(cmd, domainParams, opArgs) default: logErrorCmd(*cmd, fmt.Errorf("unknown operation: %s", operation)) } }, } return cmd } func handleDomainCreate(cmd *cobra.Command, args []string) { if len(args) != 3 { logUsageCmd(*cmd, usageDomainCreate) return } dom := smqsdk.Domain{ Name: args[0], Route: args[1], } d, err := sdk.CreateDomain(cmd.Context(), dom, args[2]) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, d) } func handleDomainGet(cmd *cobra.Command, domainParams string, args []string) { if len(args) != 1 { logUsageCmd(*cmd, usageDomainGet) return } if domainParams == all { metadata, err := convertMetadata(Metadata) if err != nil { logErrorCmd(*cmd, err) return } pageMetadata := smqsdk.PageMetadata{ Name: Name, Offset: Offset, Limit: Limit, Metadata: metadata, Status: Status, } l, err := sdk.Domains(cmd.Context(), pageMetadata, args[0]) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, l) return } d, err := sdk.Domain(cmd.Context(), domainParams, args[0]) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, d) } func handleDomainUpdate(cmd *cobra.Command, domainID string, args []string) { if len(args) != 2 { logUsageCmd(*cmd, usageDomainUpdate) return } var d smqsdk.Domain if err := json.Unmarshal([]byte(args[0]), &d); err != nil { logErrorCmd(*cmd, err) return } d.ID = domainID d, err := sdk.UpdateDomain(cmd.Context(), d, args[1]) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, d) } func handleDomainEnable(cmd *cobra.Command, domainID string, args []string) { if len(args) != 1 { logUsageCmd(*cmd, usageDomainEnable) return } if err := sdk.EnableDomain(cmd.Context(), domainID, args[0]); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) } func handleDomainDisable(cmd *cobra.Command, domainID string, args []string) { if len(args) != 1 { logUsageCmd(*cmd, usageDomainDisable) return } if err := sdk.DisableDomain(cmd.Context(), domainID, args[0]); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) } func handleDomainFreeze(cmd *cobra.Command, domainID string, args []string) { if len(args) != 1 { logUsageCmd(*cmd, usageDomainFreeze) return } if err := sdk.FreezeDomain(cmd.Context(), domainID, args[0]); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) } func handleDomainUsers(cmd *cobra.Command, domainID string, args []string) { if len(args) != 1 { logUsageCmd(*cmd, usageDomainUsers) return } metadata, err := convertMetadata(Metadata) if err != nil { logErrorCmd(*cmd, err) return } pageMetadata := smqsdk.PageMetadata{ Offset: Offset, Limit: Limit, Metadata: metadata, Status: Status, } l, err := sdk.ListDomainMembers(cmd.Context(), domainID, pageMetadata, args[0]) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, l) } func handleDomainRoles(cmd *cobra.Command, domainID string, args []string) { if len(args) < 1 { logUsageCmd(*cmd, "cli domains roles [args...]") return } operation := args[0] opArgs := args[1:] switch operation { case create: handleDomainRoleCreate(cmd, domainID, opArgs) case get: handleDomainRoleGet(cmd, domainID, opArgs) case update: handleDomainRoleUpdate(cmd, domainID, opArgs) case delete: handleDomainRoleDelete(cmd, domainID, opArgs) case actions: handleDomainRoleActions(cmd, domainID, opArgs) case members: handleDomainRoleMembers(cmd, domainID, opArgs) default: logErrorCmd(*cmd, fmt.Errorf("unknown roles operation: %s", operation)) } } func handleDomainRoleCreate(cmd *cobra.Command, domainID string, args []string) { if len(args) != 2 { logUsageCmd(*cmd, usageDomainRolesCreate) return } var roleReq smqsdk.RoleReq if err := json.Unmarshal([]byte(args[0]), &roleReq); err != nil { logErrorCmd(*cmd, err) return } r, err := sdk.CreateDomainRole(cmd.Context(), domainID, roleReq, args[1]) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, r) } func handleDomainRoleGet(cmd *cobra.Command, domainID string, args []string) { if len(args) != 2 { logUsageCmd(*cmd, usageDomainRolesGet) return } roleID := args[0] token := args[1] if roleID == all { pageMetadata := smqsdk.PageMetadata{ Offset: Offset, Limit: Limit, } rs, err := sdk.DomainRoles(cmd.Context(), domainID, pageMetadata, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, rs) return } r, err := sdk.DomainRole(cmd.Context(), domainID, roleID, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, r) } func handleDomainRoleUpdate(cmd *cobra.Command, domainID string, args []string) { if len(args) != 3 { logUsageCmd(*cmd, usageDomainRolesUpdate) return } roleID := args[0] newName := args[1] token := args[2] r, err := sdk.UpdateDomainRole(cmd.Context(), domainID, roleID, newName, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, r) } func handleDomainRoleDelete(cmd *cobra.Command, domainID string, args []string) { if len(args) != 2 { logUsageCmd(*cmd, usageDomainRolesDelete) return } roleID := args[0] token := args[1] if err := sdk.DeleteDomainRole(cmd.Context(), domainID, roleID, token); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) } func handleDomainRoleActions(cmd *cobra.Command, domainID string, args []string) { if len(args) < 1 { logUsageCmd(*cmd, "cli domains roles actions [args...]") return } operation := args[0] opArgs := args[1:] switch operation { case add: handleDomainRoleActionsAdd(cmd, domainID, opArgs) case list: handleDomainRoleActionsList(cmd, domainID, opArgs) case delete: handleDomainRoleActionsDelete(cmd, domainID, opArgs) case availableActions: handleDomainRoleActionsAvailable(cmd, opArgs) default: logErrorCmd(*cmd, fmt.Errorf("unknown actions operation: %s", operation)) } } func handleDomainRoleActionsAdd(cmd *cobra.Command, domainID string, args []string) { if len(args) != 3 { logUsageCmd(*cmd, usageDomainRoleActionsAdd) return } roleID := args[0] actionsJSON := args[1] token := args[2] actions := struct { Actions []string `json:"actions"` }{} if err := json.Unmarshal([]byte(actionsJSON), &actions); err != nil { logErrorCmd(*cmd, err) return } acts, err := sdk.AddDomainRoleActions(cmd.Context(), domainID, roleID, actions.Actions, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, acts) } func handleDomainRoleActionsList(cmd *cobra.Command, domainID string, args []string) { if len(args) != 2 { logUsageCmd(*cmd, usageDomainRoleActionsList) return } roleID := args[0] token := args[1] l, err := sdk.DomainRoleActions(cmd.Context(), domainID, roleID, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, l) } func handleDomainRoleActionsDelete(cmd *cobra.Command, domainID string, args []string) { if len(args) != 3 { logUsageCmd(*cmd, usageDomainRoleActionsDelete) return } roleID := args[0] actionsJSON := args[1] token := args[2] if actionsJSON == all { if err := sdk.RemoveAllDomainRoleActions(cmd.Context(), domainID, roleID, token); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) return } actions := struct { Actions []string `json:"actions"` }{} if err := json.Unmarshal([]byte(actionsJSON), &actions); err != nil { logErrorCmd(*cmd, err) return } if err := sdk.RemoveDomainRoleActions(cmd.Context(), domainID, roleID, actions.Actions, token); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) } func handleDomainRoleActionsAvailable(cmd *cobra.Command, args []string) { if len(args) != 1 { logUsageCmd(*cmd, usageDomainRoleActionsAvailable) return } token := args[0] acts, err := sdk.AvailableDomainRoleActions(cmd.Context(), token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, acts) } func handleDomainRoleMembers(cmd *cobra.Command, domainID string, args []string) { if len(args) < 1 { logUsageCmd(*cmd, "cli domains roles members [args...]") return } operation := args[0] opArgs := args[1:] switch operation { case add: handleDomainRoleMembersAdd(cmd, domainID, opArgs) case list: handleDomainRoleMembersList(cmd, domainID, opArgs) case delete: handleDomainRoleMembersDelete(cmd, domainID, opArgs) default: logErrorCmd(*cmd, fmt.Errorf("unknown members operation: %s", operation)) } } func handleDomainRoleMembersAdd(cmd *cobra.Command, domainID string, args []string) { if len(args) != 3 { logUsageCmd(*cmd, usageDomainRoleMembersAdd) return } roleID := args[0] membersJSON := args[1] token := args[2] members := struct { Members []string `json:"members"` }{} if err := json.Unmarshal([]byte(membersJSON), &members); err != nil { logErrorCmd(*cmd, err) return } memb, err := sdk.AddDomainRoleMembers(cmd.Context(), domainID, roleID, members.Members, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, memb) } func handleDomainRoleMembersList(cmd *cobra.Command, domainID string, args []string) { if len(args) != 2 { logUsageCmd(*cmd, usageDomainRoleMembersList) return } roleID := args[0] token := args[1] pageMetadata := smqsdk.PageMetadata{ Offset: Offset, Limit: Limit, } l, err := sdk.DomainRoleMembers(cmd.Context(), domainID, roleID, pageMetadata, token) if err != nil { logErrorCmd(*cmd, err) return } logJSONCmd(*cmd, l) } func handleDomainRoleMembersDelete(cmd *cobra.Command, domainID string, args []string) { if len(args) != 3 { logUsageCmd(*cmd, usageDomainRoleMembersDelete) return } roleID := args[0] membersJSON := args[1] token := args[2] if membersJSON == all { if err := sdk.RemoveAllDomainRoleMembers(cmd.Context(), domainID, roleID, token); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) return } members := struct { Members []string `json:"members"` }{} if err := json.Unmarshal([]byte(membersJSON), &members); err != nil { logErrorCmd(*cmd, err) return } if err := sdk.RemoveDomainRoleMembers(cmd.Context(), domainID, roleID, members.Members, token); err != nil { logErrorCmd(*cmd, err) return } logOKCmd(*cmd) }