diff --git a/federation/rest.yaml b/federation/rest.yaml index 92173d8dd..956c1b48d 100644 --- a/federation/rest.yaml +++ b/federation/rest.yaml @@ -291,14 +291,19 @@ endpoints: - title: Sync structure description: Sync structure entrypoint: syncStructure - path: "" + path: "/nodes/{nodeID}/modules/exposed" authentication: [] apis: - name: readExposedAll method: GET title: List all exposed modules changes - path: "/exposed/modules/" + path: "/" parameters: + path: + - type: uint64 + name: nodeID + required: true + title: Node ID get: - type: string name: query diff --git a/federation/rest/handlers/syncStructure.go b/federation/rest/handlers/syncStructure.go index ba8f21433..7597bb3d7 100644 --- a/federation/rest/handlers/syncStructure.go +++ b/federation/rest/handlers/syncStructure.go @@ -58,6 +58,6 @@ func NewSyncStructure(h SyncStructureAPI) *SyncStructure { func (h SyncStructure) MountRoutes(r chi.Router, middlewares ...func(http.Handler) http.Handler) { r.Group(func(r chi.Router) { r.Use(middlewares...) - r.Get("/exposed/modules/", h.ReadExposedAll) + r.Get("/nodes/{nodeID}/modules/exposed/", h.ReadExposedAll) }) } diff --git a/federation/rest/request/syncStructure.go b/federation/rest/request/syncStructure.go index ec48b63e1..8c3d79d92 100644 --- a/federation/rest/request/syncStructure.go +++ b/federation/rest/request/syncStructure.go @@ -30,6 +30,11 @@ var ( type ( // Internal API interface SyncStructureReadExposedAll struct { + // NodeID PATH parameter + // + // Node ID + NodeID uint64 `json:",string"` + // Query GET parameter // // Search query @@ -60,6 +65,7 @@ func NewSyncStructureReadExposedAll() *SyncStructureReadExposedAll { // Auditable returns all auditable/loggable parameters func (r SyncStructureReadExposedAll) Auditable() map[string]interface{} { return map[string]interface{}{ + "nodeID": r.NodeID, "query": r.Query, "limit": r.Limit, "pageCursor": r.PageCursor, @@ -67,6 +73,11 @@ func (r SyncStructureReadExposedAll) Auditable() map[string]interface{} { } } +// Auditable returns all auditable/loggable parameters +func (r SyncStructureReadExposedAll) GetNodeID() uint64 { + return r.NodeID +} + // Auditable returns all auditable/loggable parameters func (r SyncStructureReadExposedAll) GetQuery() string { return r.Query @@ -130,5 +141,17 @@ func (r *SyncStructureReadExposedAll) Fill(req *http.Request) (err error) { } } + { + var val string + // path params + + val = chi.URLParam(req, "nodeID") + r.NodeID, err = payload.ParseUint64(val), nil + if err != nil { + return err + } + + } + return err } diff --git a/federation/rest/sync_structure.go b/federation/rest/sync_structure.go index 633fb058c..35c182c7b 100644 --- a/federation/rest/sync_structure.go +++ b/federation/rest/sync_structure.go @@ -12,9 +12,9 @@ import ( type ( SyncStructure struct{} - TempStruct struct { - Filter types.ExposedModuleFilter `json:"filter"` - Set types.ExposedModuleSet `json:"set"` + listResponse struct { + Filter *types.ExposedModuleFilter `json:"filter"` + Set *types.ExposedModuleSet `json:"set"` } ) @@ -23,15 +23,19 @@ func (SyncStructure) New() *SyncStructure { } func (ctrl SyncStructure) ReadExposedAll(ctx context.Context, r *request.SyncStructureReadExposedAll) (interface{}, error) { - // TODO - fixed values for now - var ( - err error - f = types.ExposedModuleFilter{ - NodeID: 276342359342989444, - } + err error + node *types.Node ) + if node, err = service.DefaultNode.FindBySharedNodeID(ctx, r.NodeID); err != nil { + return nil, err + } + + f := types.ExposedModuleFilter{ + NodeID: node.ID, + } + if f.Paging, err = filter.NewPaging(r.Limit, r.PageCursor); err != nil { return nil, err } @@ -42,8 +46,8 @@ func (ctrl SyncStructure) ReadExposedAll(ctx context.Context, r *request.SyncStr list, f, err := (service.ExposedModule()).Find(context.Background(), f) - return TempStruct{ - Set: list, - Filter: f, - }, err + return listResponse{ + Set: &list, + Filter: &f, + }, nil } diff --git a/federation/service/exposed_module.go b/federation/service/exposed_module.go index 3c5194567..0972d2020 100644 --- a/federation/service/exposed_module.go +++ b/federation/service/exposed_module.go @@ -12,7 +12,6 @@ import ( type ( exposedModule struct { - ctx context.Context module composeService.ModuleService namespace composeService.NamespaceService store store.Storer @@ -33,7 +32,6 @@ type ( func ExposedModule() ExposedModuleService { return &exposedModule{ - ctx: context.Background(), module: composeService.DefaultModule, namespace: composeService.DefaultNamespace, store: DefaultStore, @@ -211,7 +209,7 @@ func (svc exposedModule) Create(ctx context.Context, new *types.ExposedModule) ( } if _, err := svc.module.FindByID(new.ComposeNamespaceID, new.ComposeModuleID); err != nil { - return ExposedModuleErrComposeNamespaceNotFound() + return ExposedModuleErrComposeModuleNotFound() } // Check for node - compose.Module combo diff --git a/federation/service/node.go b/federation/service/node.go index 2f99ad931..e1b6a60f3 100644 --- a/federation/service/node.go +++ b/federation/service/node.go @@ -4,6 +4,11 @@ import ( "context" "errors" "fmt" + "net/http" + "net/url" + "strconv" + "strings" + "github.com/cortezaproject/corteza-server/federation/types" "github.com/cortezaproject/corteza-server/pkg/actionlog" "github.com/cortezaproject/corteza-server/pkg/auth" @@ -11,10 +16,6 @@ import ( "github.com/cortezaproject/corteza-server/store" "github.com/cortezaproject/corteza-server/system/service" sysTypes "github.com/cortezaproject/corteza-server/system/types" - "net/http" - "net/url" - "strconv" - "strings" ) const ( @@ -355,6 +356,10 @@ func (svc node) updater(ctx context.Context, nodeID uint64, action func(...*node return n, svc.recordAction(ctx, aProps, action, err) } +func (svc node) FindBySharedNodeID(ctx context.Context, sharedNodeID uint64) (*types.Node, error) { + return svc.store.LookupFederationNodeBySharedNodeID(ctx, sharedNodeID) +} + // Looks for existing user or crates a new one func (svc node) fetchFederatedUser(ctx context.Context, n *types.Node) (*sysTypes.User, error) { // Generate handle for user that se this node diff --git a/federation/service/service.go b/federation/service/service.go index f1328ac02..1a32ff8e7 100644 --- a/federation/service/service.go +++ b/federation/service/service.go @@ -40,7 +40,9 @@ var ( DefaultActionlog actionlog.Recorder - DefaultNode *node + DefaultNode *node + DefaultExposedModule ExposedModuleService + DefaultSharedModule SharedModuleService // wrapper around time.Now() that will aid service testing now = func() *time.Time { @@ -117,6 +119,8 @@ func Initialize(ctx context.Context, log *zap.Logger, s store.Storer, c Config) hcd.Add(objstore.Healthcheck(DefaultObjectStore), "Store/Federation") DefaultNode = Node(DefaultStore, service.DefaultUser, DefaultActionlog, auth.DefaultJwtHandler) + DefaultExposedModule = ExposedModule() + DefaultSharedModule = SharedModule() return } diff --git a/federation/types/exposed_module.go b/federation/types/exposed_module.go index 4c56ced6d..e5a87723d 100644 --- a/federation/types/exposed_module.go +++ b/federation/types/exposed_module.go @@ -20,9 +20,9 @@ type ( } ExposedModuleFilter struct { - NodeID uint64 `json:"node"` - ComposeModuleID uint64 `json:"composeModuleID"` - ComposeNamespaceID uint64 `json:"composeNamespaceID"` + NodeID uint64 `json:"nodeID,string"` + ComposeModuleID uint64 `json:"composeModuleID,string"` + ComposeNamespaceID uint64 `json:"composeNamespaceID,string"` Query string `json:"query"` Check func(*ExposedModule) (bool, error) `json:"-"` diff --git a/store/federation_nodes.gen.go b/store/federation_nodes.gen.go index 29fd57761..36336c9af 100644 --- a/store/federation_nodes.gen.go +++ b/store/federation_nodes.gen.go @@ -18,6 +18,7 @@ type ( SearchFederationNodes(ctx context.Context, f types.NodeFilter) (types.NodeSet, types.NodeFilter, error) LookupFederationNodeByID(ctx context.Context, id uint64) (*types.Node, error) LookupFederationNodeByBaseURLSharedNodeID(ctx context.Context, base_url string, shared_node_id uint64) (*types.Node, error) + LookupFederationNodeBySharedNodeID(ctx context.Context, shared_node_id uint64) (*types.Node, error) CreateFederationNode(ctx context.Context, rr ...*types.Node) error @@ -52,6 +53,11 @@ func LookupFederationNodeByBaseURLSharedNodeID(ctx context.Context, s Federation return s.LookupFederationNodeByBaseURLSharedNodeID(ctx, base_url, shared_node_id) } +// LookupFederationNodeBySharedNodeID searches for node by shared-node-id +func LookupFederationNodeBySharedNodeID(ctx context.Context, s FederationNodes, shared_node_id uint64) (*types.Node, error) { + return s.LookupFederationNodeBySharedNodeID(ctx, shared_node_id) +} + // CreateFederationNode creates one or more FederationNodes in store func CreateFederationNode(ctx context.Context, s FederationNodes, rr ...*types.Node) error { return s.CreateFederationNode(ctx, rr...) diff --git a/store/federation_nodes.yaml b/store/federation_nodes.yaml index b103241d8..c0d5bf734 100644 --- a/store/federation_nodes.yaml +++ b/store/federation_nodes.yaml @@ -31,6 +31,10 @@ lookups: description: |- searches for node by shared-node-id and base-url + - fields: [SharedNodeID] + description: |- + searches for node by shared-node-id + search: enablePaging: false enableSorting: false diff --git a/store/rdbms/federation_nodes.gen.go b/store/rdbms/federation_nodes.gen.go index b9191cbe6..81e023937 100644 --- a/store/rdbms/federation_nodes.gen.go +++ b/store/rdbms/federation_nodes.gen.go @@ -111,6 +111,13 @@ func (s Store) LookupFederationNodeByBaseURLSharedNodeID(ctx context.Context, ba }) } +// LookupFederationNodeBySharedNodeID searches for node by shared-node-id +func (s Store) LookupFederationNodeBySharedNodeID(ctx context.Context, shared_node_id uint64) (*types.Node, error) { + return s.execLookupFederationNode(ctx, squirrel.Eq{ + s.preprocessColumn("fdn.shared_node_id", ""): store.PreprocessValue(shared_node_id, ""), + }) +} + // CreateFederationNode creates one or more rows in federation_nodes table func (s Store) CreateFederationNode(ctx context.Context, rr ...*types.Node) (err error) { for _, res := range rr {