Commit 80cc9eb9 authored by Tomaž Jerman's avatar Tomaž Jerman Committed by Peter Grlica
Browse files

Add reference to the namespace

......@@ -19,13 +19,6 @@ $ docker-compose -f federation/etc/docker-compose.yml up -d node_origin
$ docker-compose -f federation/etc/docker-compose.yml up -d node_destination
----
Add testing migrations
[source,bash]
----
$ docker-compose -f federation/etc/docker-compose.yml run db_origin mysql -u corteza -prootcorteza corteza -h localhost --port 3306 < federation/migration_federation_origin.sql
$ docker-compose -f federation/etc/docker-compose.yml run db_destination mysql -u corteza -prootcorteza corteza -h localhost --port 3307 < federation/migration_federation_destination.sql
----
== Setup db (postgres)
Add db dsn to .env
......
......@@ -164,6 +164,10 @@ endpoints:
name: composeModuleID
required: true
title: Compose module id
- type: uint64
name: composeNamespaceID
required: true
title: Compose namespace id
- type: types.ModuleFieldSet
name: fields
required: false
......@@ -215,6 +219,10 @@ endpoints:
name: composeModuleID
required: true
title: Compose module id
- type: uint64
name: composeNamespaceID
required: true
title: Compose namespace id
- type: types.ModuleFieldMappingSet
name: fields
required: false
......
......@@ -28,9 +28,10 @@ func (ctrl ManageStructure) ReadExposed(ctx context.Context, r *request.ManageSt
func (ctrl ManageStructure) CreateExposed(ctx context.Context, r *request.ManageStructureCreateExposed) (interface{}, error) {
var (
mod = &types.ExposedModule{
NodeID: r.NodeID,
ComposeModuleID: r.ComposeModuleID,
Fields: r.Fields,
NodeID: r.NodeID,
ComposeModuleID: r.ComposeModuleID,
ComposeNamespaceID: r.ComposeNamespaceID,
Fields: r.Fields,
}
)
......@@ -38,6 +39,10 @@ func (ctrl ManageStructure) CreateExposed(ctx context.Context, r *request.Manage
return nil, errors.New("TODO - http 400 bad request - use compose module id in request")
}
if r.ComposeNamespaceID == 0 {
return nil, errors.New("TODO - http 400 bad request - use compose namespace id in request")
}
return (service.ExposedModule()).Create(context.Background(), mod)
}
......@@ -49,6 +54,7 @@ func (ctrl ManageStructure) CreateMappings(ctx context.Context, r *request.Manag
mm := &types.ModuleMapping{
FederationModuleID: r.ModuleID,
ComposeModuleID: r.ComposeModuleID,
ComposeNamespaceID: r.ComposeNamespaceID,
FieldMapping: r.Fields,
}
......
......@@ -53,6 +53,11 @@ type (
// Compose module id
ComposeModuleID uint64 `json:",string"`
// ComposeNamespaceID POST parameter
//
// Compose namespace id
ComposeNamespaceID uint64 `json:",string"`
// Fields POST parameter
//
// Exposed module fields
......@@ -99,6 +104,11 @@ type (
// Compose module id
ComposeModuleID uint64 `json:",string"`
// ComposeNamespaceID POST parameter
//
// Compose namespace id
ComposeNamespaceID uint64 `json:",string"`
// Fields POST parameter
//
// Exposed module fields
......@@ -200,9 +210,10 @@ func NewManageStructureCreateExposed() *ManageStructureCreateExposed {
// Auditable returns all auditable/loggable parameters
func (r ManageStructureCreateExposed) Auditable() map[string]interface{} {
return map[string]interface{}{
"nodeID": r.NodeID,
"composeModuleID": r.ComposeModuleID,
"fields": r.Fields,
"nodeID": r.NodeID,
"composeModuleID": r.ComposeModuleID,
"composeNamespaceID": r.ComposeNamespaceID,
"fields": r.Fields,
}
}
......@@ -216,6 +227,11 @@ func (r ManageStructureCreateExposed) GetComposeModuleID() uint64 {
return r.ComposeModuleID
}
// Auditable returns all auditable/loggable parameters
func (r ManageStructureCreateExposed) GetComposeNamespaceID() uint64 {
return r.ComposeNamespaceID
}
// Auditable returns all auditable/loggable parameters
func (r ManageStructureCreateExposed) GetFields() types.ModuleFieldSet {
return r.Fields
......@@ -248,6 +264,13 @@ func (r *ManageStructureCreateExposed) Fill(req *http.Request) (err error) {
}
}
if val, ok := req.Form["composeNamespaceID"]; ok && len(val) > 0 {
r.ComposeNamespaceID, err = payload.ParseUint64(val[0]), nil
if err != nil {
return err
}
}
//if val, ok := req.Form["fields[]"]; ok && len(val) > 0 {
// r.Fields, err = types.ModuleFieldSet(val), nil
// if err != nil {
......@@ -393,10 +416,11 @@ func NewManageStructureCreateMappings() *ManageStructureCreateMappings {
// Auditable returns all auditable/loggable parameters
func (r ManageStructureCreateMappings) Auditable() map[string]interface{} {
return map[string]interface{}{
"nodeID": r.NodeID,
"moduleID": r.ModuleID,
"composeModuleID": r.ComposeModuleID,
"fields": r.Fields,
"nodeID": r.NodeID,
"moduleID": r.ModuleID,
"composeModuleID": r.ComposeModuleID,
"composeNamespaceID": r.ComposeNamespaceID,
"fields": r.Fields,
}
}
......@@ -415,6 +439,11 @@ func (r ManageStructureCreateMappings) GetComposeModuleID() uint64 {
return r.ComposeModuleID
}
// Auditable returns all auditable/loggable parameters
func (r ManageStructureCreateMappings) GetComposeNamespaceID() uint64 {
return r.ComposeNamespaceID
}
// Auditable returns all auditable/loggable parameters
func (r ManageStructureCreateMappings) GetFields() types.ModuleFieldMappingSet {
return r.Fields
......@@ -447,6 +476,13 @@ func (r *ManageStructureCreateMappings) Fill(req *http.Request) (err error) {
}
}
if val, ok := req.Form["composeNamespaceID"]; ok && len(val) > 0 {
r.ComposeNamespaceID, err = payload.ParseUint64(val[0]), nil
if err != nil {
return err
}
}
//if val, ok := req.Form["fields[]"]; ok && len(val) > 0 {
// r.Fields, err = types.ModuleFieldMappingSet(val), nil
// if err != nil {
......
......@@ -173,12 +173,15 @@ func (svc exposedModule) Create(ctx context.Context, new *types.ExposedModule) (
func (svc exposedModule) uniqueCheck(ctx context.Context, m *types.ExposedModule) (err error) {
f := types.ExposedModuleFilter{
NodeID: m.NodeID,
ComposeModuleID: m.ComposeModuleID,
NodeID: m.NodeID,
ComposeModuleID: m.ComposeModuleID,
ComposeNamespaceID: m.ComposeNamespaceID,
}
if set, _, err := store.SearchFederationExposedModules(ctx, svc.store, f); len(set) > 0 && err != nil {
if set, _, err := store.SearchFederationExposedModules(ctx, svc.store, f); len(set) > 0 && err == nil {
return ExposedModuleErrNotUnique()
} else if err != nil {
return err
}
return nil
......
......@@ -3,6 +3,7 @@ package service
import (
"context"
composeService "github.com/cortezaproject/corteza-server/compose/service"
"github.com/cortezaproject/corteza-server/federation/types"
"github.com/cortezaproject/corteza-server/pkg/actionlog"
"github.com/cortezaproject/corteza-server/store"
......@@ -12,6 +13,7 @@ type (
moduleMapping struct {
ctx context.Context
store store.Storer
compose composeService.ModuleService
actionlog actionlog.Recorder
}
......@@ -30,6 +32,7 @@ func ModuleMapping() ModuleMappingService {
return &moduleMapping{
ctx: context.Background(),
store: DefaultStore,
compose: composeService.Module(),
actionlog: DefaultActionlog,
}
}
......@@ -131,10 +134,13 @@ func (svc moduleMapping) uniqueCheck(ctx context.Context, m *types.ModuleMapping
f := types.ModuleMappingFilter{
FederationModuleID: m.FederationModuleID,
ComposeModuleID: m.ComposeModuleID,
ComposeNamespaceID: m.ComposeNamespaceID,
}
if set, _, err := store.SearchFederationModuleMappings(ctx, svc.store, f); len(set) > 0 && err == nil {
return ModuleMappingErrModuleMappingExists()
} else if err != nil {
return err
}
return err
......
......@@ -22,6 +22,7 @@ type (
Find(ctx context.Context, filter types.SharedModuleFilter) (types.SharedModuleSet, types.SharedModuleFilter, error)
FindByID(ctx context.Context, nodeID uint64, moduleID uint64) (*types.SharedModule, error)
FindByAny(ctx context.Context, nodeID uint64, identifier interface{}) (*types.SharedModule, error)
Create(ctx context.Context, new *types.SharedModule) (*types.SharedModule, error)
// DeleteByID(ctx context.Context, nodeID, moduleID uint64) error
}
......@@ -70,6 +71,62 @@ func (svc sharedModule) FindByID(ctx context.Context, nodeID uint64, moduleID ui
return module, err
}
func (svc sharedModule) Create(ctx context.Context, new *types.SharedModule) (*types.SharedModule, error) {
var (
aProps = &sharedModuleActionProps{changed: new}
)
err := store.Tx(ctx, svc.store, func(ctx context.Context, s store.Storer) (err error) {
// TODO
// if !svc.ac.CanCreateFederationExposedModule(ctx, ns) {
// return ExposedModuleErrNotAllowedToCreate()
// }
// TODO - fetch Node
aProps.setNode(nil)
// Check for node - compose.Module combo
if err = svc.uniqueCheck(ctx, new); err != nil {
return err
}
new.ID = nextID()
new.CreatedAt = *now()
new.UpdatedAt = nil
new.DeletedAt = nil
// check if Fields can be unmarshaled to the fields structure
if new.Fields != nil {
}
aProps.setModule(new)
if err = store.CreateFederationSharedModule(ctx, s, new); err != nil {
return err
}
return nil
})
return new, svc.recordAction(ctx, aProps, SharedModuleActionCreate, err)
}
func (svc sharedModule) uniqueCheck(ctx context.Context, m *types.SharedModule) (err error) {
f := types.SharedModuleFilter{
NodeID: m.NodeID,
Handle: m.Handle,
Name: m.Name,
}
if set, _, err := store.SearchFederationSharedModules(ctx, svc.store, f); len(set) > 0 && err == nil {
return SharedModuleErrNotUnique()
} else if err != nil {
return err
}
return nil
}
// func (svc sharedModule) DeleteByID(ctx context.Context, nodeID, moduleID uint64) error {
// return trim1st(svc.updater(ctx, nodeID, moduleID, ModuleActionDelete, svc.handleDelete))
// }
......
......@@ -593,6 +593,36 @@ func SharedModuleErrStaleData(props ...*sharedModuleActionProps) *sharedModuleEr
}
// SharedModuleErrNotUnique returns "federation:shared_module.notUnique" audit event as actionlog.Warning
//
//
// This function is auto-generated.
//
func SharedModuleErrNotUnique(props ...*sharedModuleActionProps) *sharedModuleError {
var e = &sharedModuleError{
timestamp: time.Now(),
resource: "federation:shared_module",
error: "notUnique",
action: "error",
message: "node not unique",
log: "used duplicate node TODO",
severity: actionlog.Warning,
props: func() *sharedModuleActionProps {
if len(props) > 0 {
return props[0]
}
return nil
}(),
}
if len(props) > 0 {
e.props = props[0]
}
return e
}
// SharedModuleErrNotAllowedToRead returns "federation:shared_module.notAllowedToRead" audit event as actionlog.Error
//
//
......
......@@ -60,6 +60,11 @@ errors:
message: "stale data"
severity: warning
- error: notUnique
message: "node not unique"
log: "used duplicate node TODO"
severity: warning
- error: notAllowedToRead
message: "not allowed to read this module"
log: "could not read {module}; insufficient permissions"
......
......@@ -8,10 +8,11 @@ import (
type (
ExposedModule struct {
ID uint64 `json:"moduleID,string"`
NodeID uint64 `json:"nodeID,string"`
ComposeModuleID uint64 `json:"composeModuleID,string"`
Fields ModuleFieldSet `json:"fields"`
ID uint64 `json:"moduleID,string"`
NodeID uint64 `json:"nodeID,string"`
ComposeModuleID uint64 `json:"composeModuleID,string"`
ComposeNamespaceID uint64 `json:"composeNamespaceID,string"`
Fields ModuleFieldSet `json:"fields"`
CreatedAt time.Time `json:"createdAt,omitempty"`
UpdatedAt *time.Time `json:"updatedAt,omitempty"`
......@@ -19,9 +20,10 @@ type (
}
ExposedModuleFilter struct {
NodeID uint64 `json:"node"`
ComposeModuleID uint64 `json:"composeModuleID"`
Query string `json:"query"`
NodeID uint64 `json:"node"`
ComposeModuleID uint64 `json:"composeModuleID"`
ComposeNamespaceID uint64 `json:"composeNamespaceID"`
Query string `json:"query"`
Check func(*ExposedModule) (bool, error) `json:"-"`
......
......@@ -8,11 +8,13 @@ type (
ModuleMapping struct {
FederationModuleID uint64 `json:"federationModuleID,string"`
ComposeModuleID uint64 `json:"composeModuleID,string"`
ComposeNamespaceID uint64 `json:"composeNamespaceID,string"`
FieldMapping ModuleFieldMappingSet `json:"fields"`
}
ModuleMappingFilter struct {
ComposeModuleID uint64 `json:"composeModuleID"`
ComposeNamespaceID uint64 `json:"composeNamespaceID"`
FederationModuleID uint64 `json:"federationModuleID"`
Query string `json:"query"`
......
......@@ -8,6 +8,7 @@ fields:
- { field: ID }
- { field: NodeID }
- { field: ComposeModuleID }
- { field: ComposeNamespaceID }
- { field: Fields, type: "json.Text" }
- { field: CreatedAt, sortable: true }
- { field: UpdatedAt, sortable: true }
......
......@@ -16,7 +16,7 @@ import (
type (
FederationModuleMappings interface {
SearchFederationModuleMappings(ctx context.Context, f types.ModuleMappingFilter) (types.ModuleMappingSet, types.ModuleMappingFilter, error)
LookupFederationModuleMappingByFederationModuleIDComposeModuleID(ctx context.Context, federation_module_id uint64, compose_module_id uint64) (*types.ModuleMapping, error)
LookupFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx context.Context, federation_module_id uint64, compose_module_id uint64, compose_namespace_id uint64) (*types.ModuleMapping, error)
LookupFederationModuleMappingByFederationModuleID(ctx context.Context, federation_module_id uint64) (*types.ModuleMapping, error)
CreateFederationModuleMapping(ctx context.Context, rr ...*types.ModuleMapping) error
......@@ -26,7 +26,7 @@ type (
UpsertFederationModuleMapping(ctx context.Context, rr ...*types.ModuleMapping) error
DeleteFederationModuleMapping(ctx context.Context, rr ...*types.ModuleMapping) error
DeleteFederationModuleMappingByFederationModuleIDComposeModuleID(ctx context.Context, federationModuleID uint64, composeModuleID uint64) error
DeleteFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx context.Context, federationModuleID uint64, composeModuleID uint64, composeNamespaceID uint64) error
TruncateFederationModuleMappings(ctx context.Context) error
}
......@@ -40,11 +40,11 @@ func SearchFederationModuleMappings(ctx context.Context, s FederationModuleMappi
return s.SearchFederationModuleMappings(ctx, f)
}
// LookupFederationModuleMappingByFederationModuleIDComposeModuleID searches for module mapping by federation module id and compose module id
// LookupFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID searches for module mapping by federation module id and compose module id
//
// It returns module mapping
func LookupFederationModuleMappingByFederationModuleIDComposeModuleID(ctx context.Context, s FederationModuleMappings, federation_module_id uint64, compose_module_id uint64) (*types.ModuleMapping, error) {
return s.LookupFederationModuleMappingByFederationModuleIDComposeModuleID(ctx, federation_module_id, compose_module_id)
func LookupFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx context.Context, s FederationModuleMappings, federation_module_id uint64, compose_module_id uint64, compose_namespace_id uint64) (*types.ModuleMapping, error) {
return s.LookupFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx, federation_module_id, compose_module_id, compose_namespace_id)
}
// LookupFederationModuleMappingByFederationModuleID searches for module mapping by federation module id
......@@ -74,9 +74,9 @@ func DeleteFederationModuleMapping(ctx context.Context, s FederationModuleMappin
return s.DeleteFederationModuleMapping(ctx, rr...)
}
// DeleteFederationModuleMappingByFederationModuleIDComposeModuleID Deletes FederationModuleMapping from store
func DeleteFederationModuleMappingByFederationModuleIDComposeModuleID(ctx context.Context, s FederationModuleMappings, federationModuleID uint64, composeModuleID uint64) error {
return s.DeleteFederationModuleMappingByFederationModuleIDComposeModuleID(ctx, federationModuleID, composeModuleID)
// DeleteFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID Deletes FederationModuleMapping from store
func DeleteFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx context.Context, s FederationModuleMappings, federationModuleID uint64, composeModuleID uint64, composeNamespaceID uint64) error {
return s.DeleteFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx, federationModuleID, composeModuleID, composeNamespaceID)
}
// TruncateFederationModuleMappings Deletes all FederationModuleMappings from store
......
......@@ -5,12 +5,13 @@ types:
type: types.ModuleMapping
fields:
- { field: FederationModuleID, isPrimaryKey: true }
- { field: ComposeModuleID, isPrimaryKey: true }
- { field: FederationModuleID, isPrimaryKey: true, sortable: true }
- { field: ComposeModuleID, isPrimaryKey: true, sortable: true }
- { field: ComposeNamespaceID, isPrimaryKey: true, sortable: true }
- { field: FieldMapping, type: "json.Text" }
lookups:
- fields: [FederationModuleID, ComposeModuleID]
- fields: [FederationModuleID, ComposeModuleID, ComposeNamespaceID]
description: |-
searches for module mapping by federation module id and compose module id
......@@ -28,4 +29,5 @@ rdbms:
mapFields:
FederationModuleID: { column: rel_federation_module }
ComposeModuleID: { column: rel_compose_module }
ComposeNamespaceID: { column: rel_compose_namespace }
FieldMapping: { column: field_mapping }
......@@ -377,6 +377,7 @@ func (s Store) internalFederationExposedModuleRowScanner(row rowScanner) (res *t
&res.ID,
&res.NodeID,
&res.ComposeModuleID,
&res.ComposeNamespaceID,
&res.Fields,
&res.CreatedAt,
&res.UpdatedAt,
......@@ -423,6 +424,7 @@ func (Store) federationExposedModuleColumns(aa ...string) []string {
alias + "id",
alias + "rel_node",
alias + "rel_compose_module",
alias + "rel_compose_namespace",
alias + "fields",
alias + "created_at",
alias + "updated_at",
......@@ -450,13 +452,14 @@ func (Store) sortableFederationExposedModuleColumns() []string {
// func when rdbms.customEncoder=true
func (s Store) internalFederationExposedModuleEncoder(res *types.ExposedModule) store.Payload {
return store.Payload{
"id": res.ID,
"rel_node": res.NodeID,
"rel_compose_module": res.ComposeModuleID,
"fields": res.Fields,
"created_at": res.CreatedAt,
"updated_at": res.UpdatedAt,
"deleted_at": res.DeletedAt,
"id": res.ID,
"rel_node": res.NodeID,
"rel_compose_module": res.ComposeModuleID,
"rel_compose_namespace": res.ComposeNamespaceID,
"fields": res.Fields,
"created_at": res.CreatedAt,
"updated_at": res.UpdatedAt,
"deleted_at": res.DeletedAt,
}
}
......
......@@ -14,6 +14,14 @@ func (s Store) convertFederationExposedModuleFilter(f types.ExposedModuleFilter)
query = query.Where("cmd.rel_node = ?", f.NodeID)
}
if f.ComposeModuleID > 0 {
query = query.Where("cmd.rel_compose_module = ?", f.ComposeModuleID)
}
if f.ComposeNamespaceID > 0 {
query = query.Where("cmd.rel_compose_namespace = ?", f.ComposeNamespaceID)
}
// if f.Query != "" {
// q := "%" + strings.ToLower(f.Query) + "%"
// query = query.Where(squirrel.Or{
......
......@@ -115,6 +115,10 @@ func (s Store) fetchFullPageOfFederationModuleMappings(
sort = append(sort, &filter.SortExpr{Column: "rel_compose_module"})
}
if sort.Get("rel_compose_namespace") == nil {
sort = append(sort, &filter.SortExpr{Column: "rel_compose_namespace"})
}
// Apply sorting expr from filter to query
if q, err = setOrderBy(q, sort, s.sortableFederationModuleMappingColumns()...); err != nil {
return nil, err
......@@ -222,13 +226,14 @@ func (s Store) QueryFederationModuleMappings(
return set, fetched, res, rows.Err()
}
// LookupFederationModuleMappingByFederationModuleIDComposeModuleID searches for module mapping by federation module id and compose module id
// LookupFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID searches for module mapping by federation module id and compose module id
//
// It returns module mapping
func (s Store) LookupFederationModuleMappingByFederationModuleIDComposeModuleID(ctx context.Context, federation_module_id uint64, compose_module_id uint64) (*types.ModuleMapping, error) {
func (s Store) LookupFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx context.Context, federation_module_id uint64, compose_module_id uint64, compose_namespace_id uint64) (*types.ModuleMapping, error) {
return s.execLookupFederationModuleMapping(ctx, squirrel.Eq{
s.preprocessColumn("cmd.rel_federation_module", ""): s.preprocessValue(federation_module_id, ""),
s.preprocessColumn("cmd.rel_compose_module", ""): s.preprocessValue(compose_module_id, ""),
s.preprocessColumn("cmd.rel_compose_namespace", ""): s.preprocessValue(compose_namespace_id, ""),
})
}
......@@ -274,9 +279,9 @@ func (s Store) partialFederationModuleMappingUpdate(ctx context.Context, onlyCol
err = s.execUpdateFederationModuleMappings(
ctx,
squirrel.Eq{
s.preprocessColumn("cmd.rel_federation_module", ""): s.preprocessValue(res.FederationModuleID, ""), s.preprocessColumn("cmd.rel_compose_module", ""): s.preprocessValue(res.ComposeModuleID, ""),
s.preprocessColumn("cmd.rel_federation_module", ""): s.preprocessValue(res.FederationModuleID, ""), s.preprocessColumn("cmd.rel_compose_module", ""): s.preprocessValue(res.ComposeModuleID, ""), s.preprocessColumn("cmd.rel_compose_namespace", ""): s.preprocessValue(res.ComposeNamespaceID, ""),
},
s.internalFederationModuleMappingEncoder(res).Skip("rel_federation_module", "rel_compose_module").Only(onlyColumns...))
s.internalFederationModuleMappingEncoder(res).Skip("rel_federation_module", "rel_compose_module", "rel_compose_namespace").Only(onlyColumns...))
if err != nil {
return s.config.ErrorHandler(err)
}
......@@ -307,7 +312,7 @@ func (s Store) DeleteFederationModuleMapping(ctx context.Context, rr ...*types.M
for _, res := range rr {
err = s.execDeleteFederationModuleMappings(ctx, squirrel.Eq{
s.preprocessColumn("cmd.rel_federation_module", ""): s.preprocessValue(res.FederationModuleID, ""), s.preprocessColumn("cmd.rel_compose_module", ""): s.preprocessValue(res.ComposeModuleID, ""),
s.preprocessColumn("cmd.rel_federation_module", ""): s.preprocessValue(res.FederationModuleID, ""), s.preprocessColumn("cmd.rel_compose_module", ""): s.preprocessValue(res.ComposeModuleID, ""), s.preprocessColumn("cmd.rel_compose_namespace", ""): s.preprocessValue(res.ComposeNamespaceID, ""),
})
if err != nil {
return s.config.ErrorHandler(err)
......@@ -317,11 +322,12 @@ func (s Store) DeleteFederationModuleMapping(ctx context.Context, rr ...*types.M
return nil
}
// DeleteFederationModuleMappingByFederationModuleIDComposeModuleID Deletes row from the federation_module_mapping table
func (s Store) DeleteFederationModuleMappingByFederationModuleIDComposeModuleID(ctx context.Context, federationModuleID uint64, composeModuleID uint64) error {
// DeleteFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID Deletes row from the federation_module_mapping table
func (s Store) DeleteFederationModuleMappingByFederationModuleIDComposeModuleIDComposeNamespaceID(ctx context.Context, federationModuleID uint64, composeModuleID uint64, composeNamespaceID uint64) error {
return s.execDeleteFederationModuleMappings(ctx, squirrel.Eq{
s.preprocessColumn("cmd.rel_federation_module", ""): s.preprocessValue(federationModuleID, ""),
s.preprocessColumn("cmd.rel_compose_module", ""): s.preprocessValue(composeModuleID, ""),
s.preprocessColumn("cmd.rel_compose_namespace", ""): s.preprocessValue(composeNamespaceID, ""),
})
}
......@@ -368,6 +374,7 @@ func (s Store) execUpsertFederationModuleMappings(ctx context.Context, set store
set,
"rel_federation_module",
"rel_compose_module",
"rel_compose_namespace",
)
if err != nil {
......@@ -392,6 +399,7 @@ func (s Store) internalFederationModuleMappingRowScanner(row rowScanner) (res *t
err = row.Scan(
&res.FederationModuleID,
&res.ComposeModuleID,
&res.ComposeNamespaceID,
&res.FieldMapping,
)
}
......@@ -434,6 +442,7 @@ func (Store) federationModuleMappingColumns(aa ...string) []string {
return []string{
alias + "rel_federation_module",
alias + "rel_compose_module",
alias + "rel_compose_namespace",
alias + "field_mapping",
}
}
......@@ -444,7 +453,11 @@ func (Store) federationModuleMappingColumns(aa ...string) []string {
//
// With optional string arg, all columns are returned aliased
func (Store) sortableFederationModuleMappingColumns() []string {
return []string{}
return []string{
"rel_federation_module",
"rel_compose_module",
"rel_compose_namespace",
}
}
// internalFederationModuleMappingEncoder encodes fields from types.ModuleMapping to store.Payload (map)
......@@ -455,6 +468,7 @@ func (s Store) internalFederationModuleMappingEncoder(res *types.ModuleMapping)
return store.Payload{
"rel_federation_module": res.FederationModuleID,
"rel_compose_module": res.ComposeModuleID,
"rel_compose_namespace": res.ComposeNamespaceID,
"field_mapping": res.FieldMapping,
}
}
......@@ -480,6 +494,8 @@ func (s Store) collectFederationModuleMappingCursorValues(res *types.ModuleMappi
pkRel_compose_module bool
pkRel_compose_namespace bool
collect = func(cc ...string) {
for _, c := range cc {
switch c {
......@@ -491,6 +507,10 @@ func (s Store) collectFederationModuleMappingCursorValues(res *types.ModuleMappi
cursor.Set(c, res.ComposeModuleID, false)
pkRel_compose_module = true
case "rel_compose_namespace":
cursor.Set(c, res.ComposeNamespaceID, false)
pkRel_compose_namespace = true
}
}
......@@ -498,8 +518,8 @@ func (s Store) collectFederationModuleMappingCursorValues(res *types.ModuleMappi
)
collect(cc...)
if !hasUnique || !(pkRel_federation_module && pkRel_compose_module && true) {
collect("rel_federation_module", "rel_compose_module")
if !hasUnique || !(pkRel_federation_module && pkRel_compose_module && pkRel_compose_namespace && true) {
collect("rel_federation_module", "rel_compose_module", "rel_compose_namespace")
}
return cursor
......
......@@ -16,5 +16,9 @@ func (s Store) convertFederationModuleMappingFilter(f types.ModuleMappingFilter)
query = query.Where("cmd.rel_federation_module = ?", f.FederationModuleID)
}
if f.ComposeNamespaceID > 0 {
query = query.Where("cmd.rel_compose_namespace = ?", f.ComposeNamespaceID)
}
return
}
......@@ -16,6 +16,14 @@ func (s Store) convertFederationSharedModuleFilter(f types.SharedModuleFilter) (
query = query.Where("cmd.rel_node = ?", f.NodeID)
}
if f.Handle != "" {
query = query.Where("cmd.handle = ?", f.Handle)
}
if f.Name != "" {
query = query.Where("cmd.name = ?", f.Name)
}
if f.Query != "" {
q := "%" + strings.ToLower(f.Query) + "%"
query = query.Where(squirrel.Or{
......
......@@ -509,21 +509,22 @@ func (Schema) FederationModuleExposed() *Table {
ID,
ColumnDef("rel_node", ColumnTypeIdentifier),
ColumnDef("rel_compose_module", ColumnTypeIdentifier),
ColumnDef("rel_compose_namespace", ColumnTypeIdentifier),
ColumnDef("fields", ColumnTypeText),
CUDTimestamps,
AddIndex("unique_node_composemodule", IColumn("rel_node", "rel_compose_module")),
AddIndex("unique_node_compose_module", IColumn("rel_node", "rel_compose_module", "rel_compose_namespace")),
)
}
func (Schema) FederationModuleMapping() *Table {
return TableDef("federation_module_mapping",
ID,
ColumnDef("rel_federation_module", ColumnTypeIdentifier),
ColumnDef("rel_compose_module", ColumnTypeIdentifier),
ColumnDef("rel_compose_namespace", ColumnTypeIdentifier),
ColumnDef("field_mapping", ColumnTypeText),
AddIndex("unique_federationmodule_composemodule", IColumn("rel_federation_module", "rel_compose_module")),
AddIndex("unique_federation_module_compose_module", IColumn("rel_federation_module", "rel_compose_module", "rel_compose_namespace")),
)
}
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment