package models import ( "github.com/sirupsen/logrus" "time" ) type LogEntryType string // LogEntry represents a event log entry. type LogEntry struct { ID int64 `validate:"-" bun:"id,pk,autoincrement"` CreatedAt time.Time `validate:"-" bun:",nullzero,notnull,default:current_timestamp"` Type LogEntryType `validate:"-" bun:",nullzero,notnull"` MetaData string `validate:"-" bun:",nullzero,notnull"` } type LogEntryMetaData interface { String() string ToJSON() (string, error) FromJSON(string) error } func (l *LogEntry) String() string { log := logger.WithFields(logrus.Fields{ "func": "String", "model": "LogEntry", }) var metadata LogEntryMetaData switch l.Type { case LogEntryTypeBlockCreate: metadata = &LogEntryBlockCreate{} case LogEntryTypeBlockDelete: metadata = &LogEntryBlockDelete{} case LogEntryTypeBlockUpdate: metadata = &LogEntryBlockUpdate{} case LogEntryTypeInstanceDeliveryPaused: metadata = &LogEntryInstanceDeliveryPaused{} case LogEntryTypeInstanceDeliveryResumed: metadata = &LogEntryInstanceDeliveryResumed{} case LogEntryTypeInstanceJoin: metadata = &LogEntryInstanceJoin{} case LogEntryTypeInstanceKick: metadata = &LogEntryInstanceKick{} case LogEntryTypeInstanceLeft: metadata = &LogEntryInstanceLeft{} default: log.Warnf("unhandled log entry type %s", l.Type) return "" } err := metadata.FromJSON(l.MetaData) if err != nil { log.Warnf("can't decode json for event %s: %s", l.Type, err.Error()) return "" } return metadata.String() } func (l *LogEntry) SetMetaData(metadata LogEntryMetaData) error { metaDataJson, err := metadata.ToJSON() if err != nil { return err } l.MetaData = metaDataJson return nil } func (l *LogEntry) GetMetaData(metadata LogEntryMetaData) error { return metadata.FromJSON(l.MetaData) }