From 84810c1745cdf86b3dba5d4b34caac140f8d66ea Mon Sep 17 00:00:00 2001 From: Peter Grlica Date: Wed, 28 Oct 2020 17:18:31 +0100 Subject: [PATCH] Added federation decoder to pkg --- pkg/decoder/compose_module.go | 11 ++++ pkg/decoder/compose_record.go | 16 ++++++ pkg/decoder/decoder.go | 105 ++++++++++++++++++++++++++++++++++ 3 files changed, 132 insertions(+) create mode 100644 pkg/decoder/compose_module.go create mode 100644 pkg/decoder/compose_record.go create mode 100644 pkg/decoder/decoder.go diff --git a/pkg/decoder/compose_module.go b/pkg/decoder/compose_module.go new file mode 100644 index 000000000..d2cac5932 --- /dev/null +++ b/pkg/decoder/compose_module.go @@ -0,0 +1,11 @@ +package decoder + +import ( + "github.com/cortezaproject/corteza-server/compose/types" +) + +type ( + ComposeModule struct { + types.Module + } +) diff --git a/pkg/decoder/compose_record.go b/pkg/decoder/compose_record.go new file mode 100644 index 000000000..d438a76fe --- /dev/null +++ b/pkg/decoder/compose_record.go @@ -0,0 +1,16 @@ +package decoder + +import ( + "github.com/cortezaproject/corteza-server/compose/types" +) + +type ( + ComposeRecord struct { + types.Record + } + ComposeRecordSet []*ComposeRecord + + ComposeRecordFilter struct { + types.RecordFilter + } +) diff --git a/pkg/decoder/decoder.go b/pkg/decoder/decoder.go new file mode 100644 index 000000000..a24f4a41c --- /dev/null +++ b/pkg/decoder/decoder.go @@ -0,0 +1,105 @@ +package decoder + +import ( + "encoding/json" + "time" + + "github.com/cortezaproject/corteza-server/compose/types" + ftypes "github.com/cortezaproject/corteza-server/federation/types" +) + +type ( + ExposedRecord struct { + ID uint64 `json:"recordID,string"` + Values []*types.RecordValue `json:"values"` + + CreatedAt time.Time `json:"createdAt,omitempty"` + UpdatedAt *time.Time `json:"updatedAt,omitempty"` + DeletedAt *time.Time `json:"deletedAt,omitempty"` + } + + // Bits for decoding structure sync + ModuleDocument struct { + Response ComposeModule + } + + ExposedModuleDocument struct { + Response struct { + Set ftypes.ExposedModuleSet + } + } + + ExposedRecordDocument struct { + Response struct { + Set []*ExposedRecord + } + } + + ExposedModule struct { + ftypes.ExposedModule + } + + // Bits for decoding data sync + ComposeRecordResponse struct { + Filter ComposeRecordFilter `json:",omitempty"` + Set ComposeRecordSet `json:",omitempty"` + } + ComposeRecordDocument struct { + Response ComposeRecordResponse + } +) + +// DecodeModuleSync decodes the response from the structure sync request. +// +// It returns a set of modules. +func DecodeModuleSync(in []byte) (types.ModuleSet, error) { + out := &ModuleDocument{} + + err := json.Unmarshal(in, out) + if err != nil { + return nil, err + } + + return types.ModuleSet{&out.Response.Module}, nil +} + +func DecodeFederationModuleSync(in []byte) (ftypes.ExposedModuleSet, error) { + out := &ExposedModuleDocument{} + + err := json.Unmarshal(in, out) + if err != nil { + return nil, err + } + + return out.Response.Set, nil +} + +func DecodeFederationRecordSync(in []byte) ([]*ExposedRecord, error) { + out := &ExposedRecordDocument{} + + err := json.Unmarshal(in, out) + if err != nil { + return nil, err + } + + return out.Response.Set, nil +} + +// DecodeRecordSync decodes the response from the data sync request. +// +// It returns a set of records along with the used filter. +func DecodeRecordSync(in []byte) (types.RecordSet, *types.RecordFilter, error) { + out := &ComposeRecordDocument{} + + err := json.Unmarshal(in, out) + if err != nil { + return nil, nil, err + } + + ss := make(types.RecordSet, 0, len(out.Response.Set)) + for _, r := range out.Response.Set { + ss = append(ss, &r.Record) + } + + return ss, &out.Response.Filter.RecordFilter, nil +}