예제 #1
0
        public IEnumerable <string> GetReadModelIds(IDomainEvent domainEvent)
        {
            IAggregateEvent aggregateEvent = domainEvent.GetAggregateEvent();

            switch (aggregateEvent)
            {
            case InvitationAdded @event:
                yield return(@event.InvitationId.Value);

                break;

            case InvitationDeleted @event:
                yield return(@event.InvitationId.Value);

                break;

            case InvitationAccepted @event:
                yield return(@event.InvitationId.Value);

                break;

            case InvitationRejected @event:
                yield return(@event.InvitationId.Value);

                break;
            }
        }
        private IIdentity GetIdentityTypeForEvent(IDomainEvent @event)
        {
            if (@event.GetAggregateEvent() is RoomOccupied roomOccupied)
            {
                return(roomOccupied.ReservationId);
            }

            return(@event.GetIdentity());
        }
예제 #3
0
        public ResourceCreationSagaId LocateSaga(IDomainEvent domainEvent)
        {
            switch (domainEvent.GetAggregateEvent())
            {
            case ResourceCreatedEvent _:
                return(new ResourceCreationSagaId($"{LocatorIdPrefix}-{domainEvent.GetIdentity()}"));

            default:
                throw new ArgumentException(nameof(domainEvent));
            }
        }
예제 #4
0
        public RabbitMqMessage Create(IDomainEvent domainEvent)
        {
            var messageId = domainEvent.Metadata.EventId.Value;
            var message   = JsonConvert.SerializeObject(domainEvent.GetAggregateEvent());
            var headers   = domainEvent.Metadata.ToDictionary(kv => kv.Key, kv => (Object)kv.Value);

            return(new RabbitMqMessage(
                       messageId: messageId,
                       message: message,
                       headers: headers
                       ));
        }
예제 #5
0
        public IEnumerable <string> GetReadModelIds(IDomainEvent domainEvent)
        {
            IAggregateEvent aggregateEvent = domainEvent.GetAggregateEvent();

            switch (aggregateEvent)
            {
            case EmployeeAddedEvent employeeRecordAddedEvent:
                yield return(employeeRecordAddedEvent.EmployeeRecord.Id.Value);

                break;
            }
        }
예제 #6
0
        public IEnumerable <string> GetReadModelIds(IDomainEvent domainEvent)
        {
            IAggregateEvent aggregateEvent = domainEvent.GetAggregateEvent();

            switch (aggregateEvent)
            {
            case TransactionAddedEvent transactionRecordAddedEvent:
                yield return(transactionRecordAddedEvent.Transaction.Id.Value);

                break;
            }
        }
예제 #7
0
        public MoneyTransferSagaId LocateSaga(IDomainEvent domainEvent)
        {
            switch (domainEvent.GetAggregateEvent())
            {
            case MoneySentEvent evt:
                return(new MoneyTransferSagaId($"{LocatorIdPrefix}-{evt.Transaction.Id}"));

            case MoneyReceivedEvent evt:
                return(new MoneyTransferSagaId($"{LocatorIdPrefix}-{evt.Transaction.Id}"));

            default:
                throw new ArgumentException(nameof(domainEvent));
            }
        }
예제 #8
0
        public TestAsyncSagaId LocateSaga(IDomainEvent domainEvent)
        {
            var moniker = "testSaga";
            switch (domainEvent.GetAggregateEvent())
            {
                case TestSentEvent evt:
                    return new TestAsyncSagaId($"{moniker}-{evt.Test.Id}");

                case TestReceivedEvent evt:
                    return new TestAsyncSagaId($"{moniker}-{evt.Test.Id}");

                default:
                    throw new ArgumentException(nameof(domainEvent));
            }
        }
예제 #9
0
        public static Transaktion FromEvent(IDomainEvent domainEvent)
        {
            var aggregateEvent = domainEvent.GetAggregateEvent();
            var timestamp      = domainEvent.Timestamp;

            switch (aggregateEvent)
            {
            case Eingezahlt eingezahlt:
                return(new Transaktion(timestamp, eingezahlt));

            case Abgebucht abgebucht:
                return(new Transaktion(timestamp, abgebucht));
            }

            throw new ArgumentException(nameof(domainEvent));
        }
        public Task <ISagaId> LocateSagaAsync(IDomainEvent domainEvent, CancellationToken cancellationToken)
        {
            var e = domainEvent.GetAggregateEvent();

            if (e is BezahlungAngefordert angefordertEvent)
            {
                var     bestellung = (BestellungId)domainEvent.GetIdentity();
                ISagaId id         = new BezahlungId(bestellung, angefordertEvent.Benutzer);
                return(Task.FromResult(id));
            }

            if (e is Abgebucht || e is KontoEroeffnet)
            {
                return(Task.FromResult(this.CreateId(domainEvent)));
            }

            return(Task.FromResult(BezahlungId.Empty));
        }
예제 #11
0
        public IEnumerable <string> GetReadModelIds(IDomainEvent domainEvent)
        {
            var aggregateEvent = domainEvent.GetAggregateEvent();

            switch (aggregateEvent)
            {
            case ThingyMessageAddedEvent messageAddedEvent:
                yield return(messageAddedEvent.ThingyMessage.Id.Value);

                break;

            case ThingyMessageHistoryAddedEvent messageHistoryAddedEvent:
                foreach (var message in messageHistoryAddedEvent.ThingyMessages)
                {
                    yield return(message.Id.Value);
                }
                break;
            }
        }
예제 #12
0
        public IEnumerable <string> GetReadModelIds(IDomainEvent domainEvent)
        {
            var aggregateEvent = domainEvent.GetAggregateEvent();

            switch (aggregateEvent)
            {
            case BankStatementExtracted1Event pe:
            {
                foreach (var id in pe.PredictionRequests.Select(x => x.Id).Distinct())
                {
                    yield return(BankStatementLineItemId.With(id).ToString());
                }

                break;
            }

            case BankStatementPredicted2Event pe:
            {
                foreach (var req in pe.PredictionResults.Select(x => x.Request.Id).Distinct())
                {
                    yield return(BankStatementLineItemId.With(req).ToString());
                }

                break;
            }

            case BankStatementTextMatched3Event pe:
            {
                foreach (var req in pe.Matched.Select(x => x.Key.Request.Id).Distinct())
                {
                    yield return(BankStatementLineItemId.With(req).ToString());
                }

                foreach (var req in pe.Unmatched.Select(x => x.Request.Id).Distinct())
                {
                    yield return(BankStatementLineItemId.With(req).ToString());
                }

                break;
            }
            }
        }
        public Task <ISagaId> LocateSagaAsync(IDomainEvent domainEvent, CancellationToken cancellationToken)
        {
            var @event = domainEvent.GetAggregateEvent();

            switch (@event)
            {
            case PatientIsRegisteredEvent _:
            {
                var patientId = (PatientId)domainEvent.GetIdentity();
                var sagaId    = GetSagaId(patientId);
                return(Task.FromResult <ISagaId>(sagaId));
            }

            case TreatmentRoomIsReservedEvent treatmentRoomIsReserved:
            {
                var sagaId = new ConsultationSchedulerSagaId(treatmentRoomIsReserved.ReferenceId);
                return(Task.FromResult <ISagaId>(sagaId));
            }

            case DoctorIsReservedEvent doctorIsReserved:
            {
                var sagaId = new ConsultationSchedulerSagaId(doctorIsReserved.ReferenceId);
                return(Task.FromResult <ISagaId>(sagaId));
            }

            case ConsultationSchedulingIsCompletedEvent schedule:
            {
                var sagaId = GetSagaId(schedule.PatientId);
                return(Task.FromResult <ISagaId>(sagaId));
            }

            default:
            {
                var patientId = domainEvent.Metadata["patientId"];
                var sagaId    = GetSagaId(patientId);

                return(Task.FromResult <ISagaId>(sagaId));
            }
            }
        }
예제 #14
0
        public IEnumerable <string> GetReadModelIds(IDomainEvent domainEvent)
        {
            IAggregateEvent aggregateEvent = domainEvent.GetAggregateEvent();

            switch (aggregateEvent)
            {
            case CompanyAddedEvent companyRecordAddedEvent:
                yield return(companyRecordAddedEvent.CompanyRecord.Id.Value);

                break;

            case CompanyEditedEvent companyEditedEvent:
                yield return(companyEditedEvent.CompanyRecord.Id.Value);

                break;

            case CompanyDeletedEvent companyDeletedEvent:
                yield return(companyDeletedEvent.CompanyRecord.Id.Value);

                break;
            }
        }
예제 #15
0
        public RabbitMqMessage CreateMessage(IDomainEvent domainEvent)
        {
            var serializedEvent = _eventJsonSerializer.Serialize(
                domainEvent.GetAggregateEvent(),
                domainEvent.Metadata);

            var routingKey = new RoutingKey(string.Format(
                                                "eventflow.domainevent.{0}.{1}.{2}",
                                                domainEvent.Metadata[MetadataKeys.AggregateName].ToSlug(),
                                                domainEvent.Metadata.EventName.ToSlug(),
                                                domainEvent.Metadata.EventVersion));
            var exchange = new Exchange(_rabbitMqConfiguration.Exchange);

            var rabbitMqMessage = new RabbitMqMessage(
                serializedEvent.SerializedData,
                domainEvent.Metadata,
                exchange,
                routingKey,
                new MessageId(domainEvent.Metadata[MetadataKeys.EventId]));

            _log.Verbose("Create RabbitMQ message {0}", rabbitMqMessage);

            return(rabbitMqMessage);
        }
        public RabbitMqMessage CreateMessage(IDomainEvent domainEvent)
        {
            var serializedEvent = _eventJsonSerializer.Serialize(
                domainEvent.GetAggregateEvent(),
                domainEvent.Metadata);

            var routingKey = new RoutingKey(string.Format(
                "eventflow.domainevent.{0}.{1}.{2}",
                domainEvent.Metadata[MetadataKeys.AggregateName].ToSlug(),
                domainEvent.Metadata.EventName.ToSlug(),
                domainEvent.Metadata.EventVersion));
            var exchange = new Exchange("eventflow");

            var rabbitMqMessage = new RabbitMqMessage(
                serializedEvent.SerializedData,
                domainEvent.Metadata,
                exchange,
                routingKey,
                new MessageId(domainEvent.Metadata[MetadataKeys.EventId]));

            _log.Verbose("Create RabbitMQ message {0}", rabbitMqMessage);

            return rabbitMqMessage;
        }
예제 #17
0
 public SerializedEvent Serialize(
     IDomainEvent domainEvent)
 {
     return(Serialize(domainEvent.GetAggregateEvent(), domainEvent.Metadata));
 }
예제 #18
0
        private async Task <GetEnrollmentDetails.EventData> BuildEventData(EnrollmentAggregate aggregate, IDomainEvent <EnrollmentAggregate, EnrollmentAggregate.EnrollmentId> @event, IReadOnlyCollection <Training> trainings, IReadOnlyCollection <TrainerDetails> trainers)
        {
            switch (@event.GetAggregateEvent())
            {
            case RecruitmentFormSubmitted e:
                return(new GetEnrollmentDetails.RecruitmentFormSubmittedEventData()
                {
                    DateTime = e.SubmissionDate.InMainTimezone(),
                    AboutMe = e.AboutMe,
                    EmailAddress = e.Email.ToString(),
                    FullName = $"{e.FirstName} {e.LastName}",
                    PhoneNumber = e.PhoneNumber.ToString(),
                    PreferredLecturingCities = e.PreferredLecturingCities,
                    PreferredTrainings = trainings
                                         .Where(x => e.PreferredTrainingIds.Contains(x.ID))
                                         .Select(x => BuildTrainingSummary(x, trainers)).ToArray()
                });

            case EmailSent e:
                return(new GetEnrollmentDetails.EmailSentEventData()
                {
                    DateTime = e.Instant.InMainTimezone(),
                    To = aggregate.Email.ToString(),
                    Body = e.Body,
                    Subject = e.Subject,
                    IsBodyHtml = e.IsBodyHtml
                });

            case EmailSendingFailed e:
                return(new GetEnrollmentDetails.EmailFailedToSendEventData()
                {
                    DateTime = e.Instant.InMainTimezone(),
                    To = aggregate.Email.ToString(),
                    Body = e.Body,
                    Subject = e.Subject,
                    IsBodyHtml = e.IsBodyHtml
                });

            case CandidateAcceptedTrainingInvitation e:
                return(new GetEnrollmentDetails.CandidateAcceptedTrainingInvitationEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingCoordinatorID),
                    SelectedTraining = BuildTrainingSummary(trainings.Single(x => x.ID == e.SelectedTrainingID), trainers),
                    AdditionalNotes = e.AdditionalNotes
                });

            case CandidateRefusedTrainingInvitation e:
                return(new GetEnrollmentDetails.CandidateRefusedTrainingInvitationEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingCoordinatorID),
                    AdditionalNotes = e.AdditionalNotes,
                    RefusalReason = e.RefusalReason
                });

            case CandidateAttendedTraining e:
                return(new GetEnrollmentDetails.CandidateAttendedTrainingEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingCoordinatorID),
                    Training = BuildTrainingSummary(trainings.Single(x => x.ID == e.TrainingID), trainers),
                    AdditionalNotes = e.AdditionalNotes
                });

            case CandidateWasAbsentFromTraining e:
                return(new GetEnrollmentDetails.CandidateWasAbsentFromTrainingEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingCoordinatorID),
                    Training = BuildTrainingSummary(trainings.Single(x => x.ID == e.TrainingID), trainers),
                    AdditionalNotes = e.AdditionalNotes
                });

            case CandidateObtainedLecturerRights e:
                return(new GetEnrollmentDetails.CandidateObtainedLecturerRightsEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.GrantingCoordinatorID),
                    AdditionalNotes = e.AdditionalNotes
                });

            case CandidateResignedPermanently e:
                return(new GetEnrollmentDetails.CandidateResignedPermanentlyEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingCoordinatorID),
                    ResignationReason = e.ResignationReason,
                    AdditionalNotes = e.AdditionalNotes
                });

            case CandidateResignedTemporarily e:
                return(new GetEnrollmentDetails.CandidateResignedTemporarilyEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingCoordinatorID),
                    ResignationReason = e.ResignationReason,
                    AdditionalNotes = e.AdditionalNotes,
                    ResumeDate = e.ResumeDate
                });

            case ContactOccured e:
                return(new GetEnrollmentDetails.ContactOccuredEventData()
                {
                    DateTime = @event.Timestamp.ToZonedDateTime(),
                    RecordingUser = await GetUserName(e.RecordingUserId),
                    CommunicationChannel = e.CommunicationChannel,
                    Content = e.Content,
                    AdditionalNotes = e.AdditionalNotes
                });

            default:
                throw new NotSupportedException();
            }
        }
예제 #19
0
        private async Task <GetDetails.EventData> BuildEventData(SchoolAggregate school, IDomainEvent <SchoolAggregate, SchoolId> @event)
        {
            switch (@event.GetAggregateEvent())
            {
            case SchoolRegistered e:
                return(new GetDetails.SchoolRegisteredEventData()
                {
                    DateTime = e.Timestamp.InMainTimezone().ToOffsetDateTime()
                });

            case ContactOccured e:
                return(new GetDetails.ContactOccuredEventData()
                {
                    DateTime = e.ContactTimestamp.InMainTimezone().ToOffsetDateTime(),
                    CommunicationChannel = e.CommunicationChannel, ContactPersonName = e.ContactPersonName,
                    PhoneNumber = e.PhoneNumber, EmailAddress = e.EmailAddress,
                    Content = e.Content, AdditionalNotes = e.AdditionalNotes, RecordingUser = await GetUserName(e.RecordingUserId)
                });

            case InitialAgreementAchieved e:
                return(new GetDetails.InitialAgreementAchievedEventData()
                {
                    DateTime = OffsetDateTime.FromDateTimeOffset(@event.Timestamp),
                    AgreeingPersonName = e.AgreeingPersonName,
                    AdditionalNotes = e.AdditionalNotes, RecordingUser = await GetUserName(e.RecordingUserId)
                });

            case FixedTermAgreementSigned e:
                return(new GetDetails.FixedTermAgreementSignedEventData()
                {
                    AgreementId = e.Id,
                    DateTime = OffsetDateTime.FromDateTimeOffset(@event.Timestamp),
                    AgreementEndDate = e.AgreementEndDate,
                    AdditionalNotes = e.AdditionalNotes, RecordingUser = await GetUserName(e.RecordingUserId)
                });

            case PermanentAgreementSigned e:
                return(new GetDetails.PermanentAgreementSignedEventData()
                {
                    AgreementId = e.Id,
                    DateTime = OffsetDateTime.FromDateTimeOffset(@event.Timestamp),
                    AdditionalNotes = e.AdditionalNotes, RecordingUser = await GetUserName(e.RecordingUserId)
                });

            case SchoolResignedFromCooperation e:
                return(new GetDetails.SchoolResignedFromCooperationEventData()
                {
                    DateTime = OffsetDateTime.FromDateTimeOffset(@event.Timestamp),
                    PotentialNextContactDate = e.PotentialNextContactDate,
                    AdditionalNotes = e.AdditionalNotes, RecordingUser = await GetUserName(e.RecordingUserId)
                });

            case NoteAdded _:
            case NoteEdited _:
            case NoteDeleted _:
                return(null);

            default:
                throw new NotImplementedException();
            }
        }