57 lines
1.3 KiB
Go
57 lines
1.3 KiB
Go
package event
|
|
|
|
import (
|
|
"context"
|
|
"eventRT/constants"
|
|
"eventRT/database"
|
|
"eventRT/logger"
|
|
"time"
|
|
|
|
"go.opentelemetry.io/otel"
|
|
"go.opentelemetry.io/otel/attribute"
|
|
)
|
|
|
|
func PersistAndPublishEvent(ctx context.Context, record *EventRecord) error {
|
|
ctx, span := otel.Tracer("eventRT/event").Start(ctx, "PersistAndPublishEvent")
|
|
defer span.End()
|
|
|
|
span.SetAttributes(
|
|
attribute.String("event_uuid", record.EventUUID),
|
|
)
|
|
|
|
record.IsPersisted = true
|
|
record.Status = constants.EventStatusReported
|
|
record.Operations = append(record.Operations, OperationRecord{
|
|
Action: "report",
|
|
Op: "eventrt", // TODO
|
|
TS: time.Now().UnixMilli(),
|
|
})
|
|
|
|
dbCtx, cancel := context.WithTimeout(ctx, 5*time.Second)
|
|
defer cancel()
|
|
|
|
_, err := database.GetMongoClient().Database(constants.EventDBName).
|
|
Collection(constants.EventCollectionName).
|
|
InsertOne(dbCtx, record)
|
|
if err != nil {
|
|
logger.Error(ctx, "insert event into database failed",
|
|
"error", err, "event", record)
|
|
return err
|
|
}
|
|
|
|
uiCh, err := initUIEventChannel(ctx)
|
|
if err != nil {
|
|
logger.Error(ctx, "init UI event channel failed", "error", err)
|
|
return nil
|
|
}
|
|
defer uiCh.Close()
|
|
|
|
if err := PublishEventToUI(ctx, uiCh, record); err != nil {
|
|
logger.Error(ctx, "publish event to UI failed",
|
|
"event_uuid", record.EventUUID, "error", err)
|
|
return nil
|
|
}
|
|
|
|
return nil
|
|
}
|