private async Task <TlsRptEntityState> LoadState(string id, string messageType)
        {
            TlsRptEntityState state = await _dao.Get(id);

            if (state == null)
            {
                _log.LogError("Ignoring {EventName} as TLS/RPT Entity does not exist for {Id}.", messageType, id);
                throw new MailCheckException(
                          $"Cannot handle event {messageType} as TLS/RPT Entity does not exists for {id}.");
            }

            return(state);
        }
        public async Task Handle(TlsRptRecordExpired message)
        {
            string messageId = message.Id.ToLower();

            TlsRptEntityState state = await LoadState(messageId, nameof(message));

            Message updatePollPending = state.UpdatePollPending();

            state.Version++;

            await _dao.Save(state);

            _dispatcher.Dispatch(updatePollPending, _tlsRptEntityConfig.SnsTopicArn);
        }
        public async Task Handle(TlsRptRecordsEvaluated message)
        {
            string messageId = message.Id.ToLower();

            TlsRptEntityState state = await LoadState(messageId, nameof(message));

            _changeNotifiersComposite.Handle(state, message);

            Message updateTlsRptEvaluation = state.UpdateTlsRptEvaluation(message.Records,
                                                                          message.Messages, message.Timestamp);

            state.Version++;

            await _dao.Save(state);

            _dispatcher.Dispatch(updateTlsRptEvaluation, _tlsRptEntityConfig.SnsTopicArn);
        }
        public async Task Handle(DomainCreated message)
        {
            string messageId = message.Id.ToLower();

            TlsRptEntityState state = await _dao.Get(messageId);

            if (state != null)
            {
                _log.LogError("Ignoring {EventName} as TlsRptEntity already exists for {Id}.", nameof(DomainCreated), messageId);
                throw new MailCheckException($"Cannot handle event {nameof(DomainCreated)} as TlsRptEntity already exists for {messageId}.");
            }

            state = new TlsRptEntityState(messageId, 1, TlsRptState.Created, DateTime.UtcNow);
            await _dao.Save(state);

            TlsRptEntityCreated tlsRptEntityCreated = new TlsRptEntityCreated(messageId, state.Version);

            _dispatcher.Dispatch(tlsRptEntityCreated, _tlsRptEntityConfig.SnsTopicArn);
            _log.LogInformation("Created TlsRptEntity for {Id}.", messageId);
        }