public override async Task <MakeDonationResponse> Handle(MakeDonationRequest message)
        {
            if (message.CharityActionKey.HasValue)
            {
                var charityAction = await _context.CharityActions.SingleOrDefaultAsync(c => c.CharityActionKey == message.CharityActionKey.Value);

                if (charityAction == null)
                {
                    return(Error(ErrorType.CharityActionNotFound));
                }

                var charityActionDonation = _mapper.Map <CharityActionDonation>(message);
                charityActionDonation.CharityAction = charityAction;

                if (message.UserKey.HasValue && !message.IsAnonymous)
                {
                    var user = await _context.Users.SingleOrDefaultAsync(u => u.UserKey == message.UserKey.Value);

                    if (user == null)
                    {
                        return(Error(ErrorType.UserNotFound));
                    }

                    charityActionDonation.User = user;
                }

                if (!message.UserKey.HasValue && !message.IsAnonymous)
                {
                    var user = _mapper.Map <User>(message);
                    user.UserKey = Guid.NewGuid();
                    _context.Users.Add(user);
                    charityActionDonation.User = user;
                }

                _context.CharityActionDonations.Add(charityActionDonation);
                return(await _context.TrySaveChangesAsync <MakeDonationResponse>(response =>
                {
                    response.CoverImage = charityAction.CoverImage;
                    response.ThankYou = charityAction.ThankYou;
                }));
            }


            var charity = await _context.Charities.SingleOrDefaultAsync(c => c.CharityKey == message.CharityKey);

            if (charity == null)
            {
                return(Error(ErrorType.CharityNotFound));
            }

            var charityDonation = _mapper.Map <CharityDonation>(message);

            charityDonation.Charity = charity;

            if (message.UserKey.HasValue && !message.IsAnonymous)
            {
                var user = await _context.Users.SingleOrDefaultAsync(u => u.UserKey == message.UserKey.Value);

                if (user == null)
                {
                    return(Error(ErrorType.UserNotFound));
                }

                charityDonation.User = user;
            }

            if (!message.UserKey.HasValue && !message.IsAnonymous)
            {
                var user = _mapper.Map <User>(message);
                user.UserKey = Guid.NewGuid();
                _context.Users.Add(user);
                charityDonation.User = user;
            }

            _context.CharityDonations.Add(charityDonation);
            return(await _context.TrySaveChangesAsync <MakeDonationResponse>(response =>
            {
                response.CoverImage = charity.CoverImage;
                response.ThankYou = charity.ThankYou;
            }));
        }