public async Task <Result <MarketSettingsErrorCodes> > AddAsync(MarketSettingsCreateOrUpdateDto model, string username, string correlationId)
        {
            var creationResult = CreateMarketSettingsWithDefaults(model, out var marketSettings);

            if (creationResult.IsFailed)
            {
                return(creationResult);
            }

            var validationResult = ValidateSettings(marketSettings);

            if (validationResult.IsFailed)
            {
                return(validationResult);
            }

            var addResult = await _marketSettingsRepository.AddAsync(marketSettings);

            if (addResult.IsFailed)
            {
                return(addResult);
            }

            await _auditService.TryAudit(correlationId, username, model.Id, AuditDataType.MarketSettings,
                                         marketSettings.ToJson());

            await PublishMarketSettingsChangedEvent(null, marketSettings, username, correlationId, ChangeType.Creation);

            return(new Result <MarketSettingsErrorCodes>());
        }
        private static Result <MarketSettingsErrorCodes> CreateMarketSettingsWithDefaults(
            MarketSettingsCreateOrUpdateDto model,
            out MarketSettings marketSettings)
        {
            marketSettings = null;

            try
            {
                marketSettings = MarketSettings.GetMarketSettingsWithDefaults(model);
            }
            catch (InvalidOpenAndCloseHoursException)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes.InvalidOpenAndCloseHours));
            }
            catch (WinterOpenAndCloseWithAppliedTimezoneMustBeInTheSameDayException)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes
                                                             .WinterOpenAndCloseWithAppliedTimezoneMustBeInTheSameDay));
            }
            catch (SummerOpenAndCloseWithAppliedTimezoneMustBeInTheSameDayException)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes
                                                             .SummerOpenAndCloseWithAppliedTimezoneMustBeInTheSameDay));
            }
            catch (InvalidTimeZoneException)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes.InvalidTimezone));
            }
            catch (InconsistentWorkingCalendarException)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes.InconsistentWorkingCalendar));
            }
            catch (InvalidWorkingDayStringException)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes.InvalidHalfWorkingDayString));
            }

            return(new Result <MarketSettingsErrorCodes>());
        }
        public async Task <Result <MarketSettingsErrorCodes> > UpdateAsync(MarketSettingsCreateOrUpdateDto model, string username, string correlationId)
        {
            var creationResult = CreateMarketSettingsWithDefaults(model, out var marketSettings);

            if (creationResult.IsFailed)
            {
                return(creationResult);
            }

            var currentSettings = await _marketSettingsRepository.GetByIdAsync(marketSettings.Id);

            if (currentSettings == null)
            {
                return(new Result <MarketSettingsErrorCodes>(MarketSettingsErrorCodes.MarketSettingsDoNotExist));
            }

            var validationResult = ValidateSettings(marketSettings, currentSettings);

            if (validationResult.IsFailed)
            {
                return(validationResult);
            }

            var updateResult = await _marketSettingsRepository.UpdateAsync(marketSettings);

            if (updateResult.IsFailed)
            {
                return(updateResult);
            }

            await _auditService.TryAudit(correlationId, username, marketSettings.Id, AuditDataType.MarketSettings,
                                         marketSettings.ToJson(), currentSettings.ToJson());

            await PublishMarketSettingsChangedEvent(currentSettings, marketSettings, username, correlationId, ChangeType.Edition);

            return(new Result <MarketSettingsErrorCodes>());
        }