github.com/voedger/voedger@v0.0.0-20240520144910-273e84102129/pkg/sys/journal/types.go (about) 1 /* 2 * Copyright (c) 2021-present unTill Pro, Ltd. 3 */ 4 5 package journal 6 7 import ( 8 "encoding/json" 9 "fmt" 10 11 "github.com/voedger/voedger/pkg/appdef" 12 "github.com/voedger/voedger/pkg/extensionpoints" 13 "github.com/voedger/voedger/pkg/istructs" 14 coreutils "github.com/voedger/voedger/pkg/utils" 15 ) 16 17 type predicate func(iws appdef.IWorkspace, qName appdef.QName) bool 18 19 type Filter struct { 20 predicates []predicate 21 iWorkspace appdef.IWorkspace 22 } 23 24 func NewFilter(iws appdef.IWorkspace, eventTypes []string, epJournalPredicates extensionpoints.IExtensionPoint) (Filter, error) { 25 pp := make([]predicate, len(eventTypes)) 26 for i, eventType := range eventTypes { 27 p, ok := epJournalPredicates.Find(eventType) 28 if !ok { 29 return Filter{}, fmt.Errorf("invalid event type: %s", eventType) 30 } 31 pp[i] = p.(func(iws appdef.IWorkspace, qName appdef.QName) bool) 32 } 33 return Filter{ 34 predicates: pp, 35 iWorkspace: iws, 36 }, nil 37 } 38 39 func (f Filter) isMatch(qName appdef.QName) bool { 40 for _, p := range f.predicates { 41 if p(f.iWorkspace, qName) { 42 return true 43 } 44 } 45 return false 46 } 47 48 type EventObject struct { 49 istructs.NullObject 50 Data map[string]int64 51 JSON string 52 Empty bool 53 } 54 55 func (o *EventObject) AsInt64(name string) int64 { return o.Data[name] } 56 func (o *EventObject) AsString(string) string { return o.JSON } 57 58 func NewEventObject(event istructs.IWLogEvent, appDef appdef.IAppDef, f Filter, opts ...coreutils.MapperOpt) (o *EventObject, err error) { 59 var bb []byte 60 data := make(map[string]interface{}) 61 data["sys.QName"] = event.QName().String() 62 data["RegisteredAt"] = event.RegisteredAt() 63 data["Synced"] = event.Synced() 64 data["DeviceID"] = event.DeviceID() 65 data["SyncedAt"] = event.SyncedAt() 66 noArgs := true 67 if f.isMatch(event.ArgumentObject().QName()) { 68 data["args"] = coreutils.ObjectToMap(event.ArgumentObject(), appDef, opts...) 69 noArgs = false 70 } 71 cuds := coreutils.CUDsToMap(event, appDef, coreutils.WithFilter(f.isMatch), coreutils.WithMapperOpts(opts...)) 72 data["cuds"] = cuds 73 bb, err = json.Marshal(&data) 74 eo := &EventObject{ 75 Data: make(map[string]int64), 76 JSON: string(bb), 77 Empty: len(cuds) == 0 && noArgs, 78 } 79 eo.Data[Field_EventTime] = int64(event.RegisteredAt()) 80 return eo, err 81 }