public async Task Handle(WithdrawApplicationCommand message, CancellationToken cancellationToken)
        {
            _logger.LogInformation("Withdrawing application for vacancyReference:{vacancyReference} and candidateId:{candidateId}", message.VacancyReference, message.CandidateId);

            var applicationReview = await _applicationReviewRepository.GetAsync(message.VacancyReference, message.CandidateId);

            if (applicationReview == null)
            {
                _logger.LogInformation("Cannot find application to withdraw for vacancyReference:{vacancyReference} and candidateId:{candidateId}", message.VacancyReference, message.CandidateId);
                return;
            }

            if (applicationReview.CanWithdraw == false)
            {
                _logger.LogWarning("Cannot withdraw ApplicationReviewId:{applicationReviewId} as not in correct state", applicationReview.Id);
                return;
            }

            applicationReview.IsWithdrawn       = true;
            applicationReview.WithdrawnDate     = _timeProvider.Now;
            applicationReview.Application       = null;
            applicationReview.CandidateFeedback = null;

            await _applicationReviewRepository.UpdateAsync(applicationReview);

            await _messaging.PublishEvent(new ApplicationReviewWithdrawnEvent
            {
                VacancyReference = applicationReview.VacancyReference
            });

            _logger.LogInformation("Finished withdrawing application for vacancyReference:{vacancyReference} and candidateId:{candidateId}", message.VacancyReference, message.CandidateId);
        }
        private async Task Handle(Guid applicationReviewId, VacancyUser user, ApplicationReviewStatus status, string candidateFeedback = null)
        {
            var applicationReview = await _applicationReviewRepository.GetAsync(applicationReviewId);

            if (applicationReview.CanReview == false)
            {
                _logger.LogWarning("Cannot review ApplicationReviewId:{applicationReviewId} as not in correct state", applicationReview.Id);
                return;
            }

            applicationReview.Status            = status;
            applicationReview.CandidateFeedback = candidateFeedback;
            applicationReview.StatusUpdatedDate = _timeProvider.Now;
            applicationReview.StatusUpdatedBy   = user;

            Validate(applicationReview);

            await _applicationReviewRepository.UpdateAsync(applicationReview);

            await _messaging.PublishEvent(new ApplicationReviewedEvent
            {
                Status            = applicationReview.Status,
                VacancyReference  = applicationReview.VacancyReference,
                CandidateFeedback = applicationReview.CandidateFeedback,
                CandidateId       = applicationReview.CandidateId
            });
        }