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  }