public static void ApplyProvenance(
     this MunicipalitySyndicationItem item,
     ProvenanceData provenance)
 {
     item.Application  = provenance.Application;
     item.Modification = provenance.Modification;
     item.Operator     = provenance.Operator;
     item.Organisation = provenance.Organisation;
     item.Reason       = provenance.Reason;
 }
        private static void UpdateNameByLanguage(MunicipalitySyndicationItem municipalitySyndicationItem, Language?language, string name)
        {
            switch (language)
            {
            case Language.Dutch:
                municipalitySyndicationItem.NameDutch = name;
                break;

            case Language.French:
                municipalitySyndicationItem.NameFrench = name;
                break;

            case Language.German:
                municipalitySyndicationItem.NameGerman = name;
                break;

            case Language.English:
                municipalitySyndicationItem.NameEnglish = name;
                break;
            }
        }
        private static void UpdateDefaultName(MunicipalitySyndicationItem municipalitySyndicationItem)
        {
            switch (municipalitySyndicationItem.OfficialLanguages.FirstOrDefault())
            {
            default:
            case Language.Dutch:
                municipalitySyndicationItem.DefaultName = municipalitySyndicationItem.NameDutch;
                break;

            case Language.French:
                municipalitySyndicationItem.DefaultName = municipalitySyndicationItem.NameFrench;
                break;

            case Language.German:
                municipalitySyndicationItem.DefaultName = municipalitySyndicationItem.NameGerman;
                break;

            case Language.English:
                municipalitySyndicationItem.DefaultName = municipalitySyndicationItem.NameEnglish;
                break;
            }
        }
        public MunicipalitySyndicationProjections()
        {
            When <Envelope <MunicipalityWasRegistered> >(async(context, message, ct) =>
            {
                var newMunicipalitySyndicationItem = new MunicipalitySyndicationItem
                {
                    Position                 = message.Position,
                    MunicipalityId           = message.Message.MunicipalityId,
                    NisCode                  = message.Message.NisCode,
                    RecordCreatedAt          = message.Message.Provenance.Timestamp,
                    LastChangedOn            = message.Message.Provenance.Timestamp,
                    ChangeType               = message.EventName,
                    SyndicationItemCreatedAt = DateTimeOffset.UtcNow
                };

                newMunicipalitySyndicationItem.ApplyProvenance(message.Message.Provenance);
                newMunicipalitySyndicationItem.SetEventData(message.Message, message.EventName);

                await context
                .MunicipalitySyndication
                .AddAsync(newMunicipalitySyndicationItem, ct);
            });

            When <Envelope <MunicipalityNisCodeWasDefined> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x => x.NisCode = message.Message.NisCode,
                    ct);
            });

            When <Envelope <MunicipalityNisCodeWasCorrected> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x => x.NisCode = message.Message.NisCode,
                    ct);
            });

            When <Envelope <MunicipalityWasNamed> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    UpdateNameByLanguage(x, message.Message.Language, message.Message.Name);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityNameWasCorrected> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    UpdateNameByLanguage(x, message.Message.Language, message.Message.Name);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityNameWasCleared> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    UpdateNameByLanguage(x, message.Message.Language, null);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityNameWasCorrectedToCleared> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    UpdateNameByLanguage(x, message.Message.Language, null);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityOfficialLanguageWasAdded> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    x.AddOfficialLanguage(message.Message.Language);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityOfficialLanguageWasRemoved> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    x.RemoveOfficialLanguage(message.Message.Language);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityFacilityLanguageWasAdded> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    x.AddFacilitiesLanguage(message.Message.Language);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityFacilitiesLanguageWasRemoved> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x =>
                {
                    x.RemoveFacilitiesLanguage(message.Message.Language);
                    UpdateDefaultName(x);
                },
                    ct);
            });

            When <Envelope <MunicipalityBecameCurrent> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x => x.Status = MunicipalityStatus.Current,
                    ct);
            });

            When <Envelope <MunicipalityWasCorrectedToCurrent> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x => x.Status = MunicipalityStatus.Current,
                    ct);
            });

            When <Envelope <MunicipalityWasRetired> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x => x.Status = MunicipalityStatus.Retired,
                    ct);
            });

            When <Envelope <MunicipalityWasCorrectedToRetired> >(async(context, message, ct) =>
            {
                await context.CreateNewMunicipalitySyndicationItem(
                    message.Message.MunicipalityId,
                    message,
                    x => x.Status = MunicipalityStatus.Retired,
                    ct);
            });

            When <Envelope <MunicipalityGeometryWasCleared> >(async(context, message, ct) => DoNothing());
            When <Envelope <MunicipalityGeometryWasCorrected> >(async(context, message, ct) => DoNothing());
            When <Envelope <MunicipalityGeometryWasCorrectedToCleared> >(async(context, message, ct) => DoNothing());
            When <Envelope <MunicipalityWasDrawn> >(async(context, message, ct) => DoNothing());
            When <Envelope <MunicipalityNameWasImportedFromCrab> >(async(context, message, ct) => DoNothing());
            When <Envelope <MunicipalityWasImportedFromCrab> >(async(context, message, ct) => DoNothing());
        }
 public static void SetEventData <T>(this MunicipalitySyndicationItem syndicationItem, T message, string eventName)
 => syndicationItem.EventDataAsXml = message.ToXml(eventName).ToString(SaveOptions.DisableFormatting);