/// <summary>
        /// Register user.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// Register user response.
        /// </returns>
        public SignUpResponse RegisterUser(SignUpRequest request)
        {
            var response = new SignUpResponse();
            var user = new User
                {
                    Email = request.Email,
                    Password = request.Password,
                    ActivationCode = Guid.NewGuid(),
                    Profile =
                        new Profile
                            {
                                FirstName = request.FirstName,
                                LastName = request.LastName,
                                NotifyOnOrderStatusChanged = true,
                                NotifyOnPackageStatusChanged = true
                            }
                };

            try
            {
                ////ThrowExceptionIfUserIsInvalid(user);
                var createdUser = this.userRepository.CreateUser(user);
                var profile = this.profileRepository.FindOrAddProfile(user.Profile);
                this.userRepository.SaveChanges();
                this.profileRepository.SaveChanges();

                var role = this.roleRepository.GetRoleByName(request.RoleName);
                if (role == null)
                {
                    this.roleRepository.AddRole(new Role { Name = request.RoleName, Description = string.Empty });
                    this.roleRepository.SaveChanges();
                    role = this.roleRepository.GetRoleByName(request.RoleName);
                }

                createdUser.Roles.Add(role);
                this.userRepository.SaveChanges();

                this.emailService.SendMail(
                    EmailResources.EmailActivationFrom,
                    request.Email,
                    EmailResources.EmailActivationSubject,
                    string.Format(EmailResources.EmailActivationBody, createdUser.Id, createdUser.ActivationCode, profile.GetFullName()));
            }
            catch (InvalidUserException ex)
            {
                response.MessageType = MessageType.Error;
                response.ErrorCode = ErrorCode.UserEmailExists.ToString();
                this.Logger.Error(ErrorCodeResources.UserEmailExists, ex);
            }

            return response;
        }
        /// <summary>
        /// Sign up shopper.
        /// </summary>
        /// <param name="request">
        /// The request.
        /// </param>
        /// <returns>
        /// Sign up shopper response.
        /// </returns>
        public SignUpResponse SignUpShopper(SignUpRequest request)
        {
            var role = new Role { Name = StandardRole.Shopper.ToString(), Description = string.Empty };
            var user = new User
                {
                    Email = request.Email,
                    Password = PasswordHash.CreateHash(request.Password),
                    Profile =
                        new Profile
                            {
                                FirstName = request.FirstName,
                                LastName = request.LastName,
                                NotifyOnOrderStatusChanged = true,
                                NotifyOnPackageStatusChanged = true
                            },
                    ActivationCode = Guid.NewGuid(),
                    Activated = false
                };
            var response = new SignUpResponse { BrokenRules = user.Profile.GetBrokenRules().ToList() };
            response.BrokenRules.AddRange(role.GetBrokenRules());
            response.BrokenRules.AddRange(user.GetBrokenRules());

            if (response.BrokenRules.Any())
            {
                response.MessageType = MessageType.Warning;
                response.Message = CommonResources.SignUpErrorMessage;
                return response;
            }

            var userExists = this.membershipRepository.GetUser(request.Email);
            if (userExists != null)
            {
                response.MessageType = MessageType.Warning;
                response.Message = CommonResources.SignUpErrorMessage;
                response.BrokenRules.Add(UserBusinessRules.EmailExists);
                return response;
            }

            try
            {
                var result = this.membershipRepository.CreateUser(user, new List<Role> { role });

                this.emailService.SendMail(
                    EmailResources.EmailActivationFrom,
                    result.Email,
                    EmailResources.EmailActivationSubject,
                    string.Format(EmailResources.EmailActivationBody, this.ApplicationUrl, result.Id, result.ActivationCode, user.Profile.GetFullName()));
                return result.ConvertToRegisterUserResponse();
            }
            catch (Exception e)
            {
                response.MessageType = MessageType.Error;
                response.Message = CommonResources.SignUpErrorMessage;
                this.Logger.Error(CommonResources.SignUpErrorMessage, e);
                return response;
            }
        }