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 }