/// <summary>
        /// Get the view Model to display the Sign In Header
        /// </summary>
        /// <returns>
        /// The view model to display the Sign In Header
        /// </returns>
        public virtual async Task <SignInHeaderViewModel> GetSignInHeaderModel(GetSignInHeaderParam param)
        {
            var myAccountUrl = MyAccountUrlProvider.GetMyAccountUrl(new BaseUrlParameter
            {
                CultureInfo = param.CultureInfo
            });

            var loginUrl = MyAccountUrlProvider.GetLoginUrl(new BaseUrlParameter
            {
                CultureInfo = param.CultureInfo
            });

            var customer = await CustomerRepository.GetCustomerByIdAsync(new GetCustomerByIdParam
            {
                CultureInfo = param.CultureInfo,
                CustomerId  = param.CustomerId,
                Scope       = param.Scope
            }).ConfigureAwait(false);

            var viewModel = ViewModelMapper.MapTo <SignInHeaderViewModel>(customer, param.CultureInfo) ?? new SignInHeaderViewModel();

            viewModel.IsLoggedIn = param.IsAuthenticated;

            viewModel.EncryptedCustomerId = param.EncryptedCustomerId;

            viewModel.Url = viewModel.IsLoggedIn ? myAccountUrl : loginUrl;

            return(viewModel);
        }
        public virtual IHttpActionResult Register(RegisterRequest registerRequest)
        {
            //todo:  Captcha for bots or not?!
            if (registerRequest == null)
            {
                return(BadRequest("No body found in the request"));
            }

            var returnUrl = registerRequest.ReturnUrl;

            if (string.IsNullOrWhiteSpace(returnUrl) || !UrlFormatter.IsReturnUrlValid(RequestUtils.GetBaseUrl(Request).ToString(), returnUrl))
            {
                returnUrl = MyAccountUrlProvider.GetMyAccountUrl(new BaseUrlParameter
                {
                    CultureInfo = ComposerContext.CultureInfo
                });
            }

            var registerParam = new CreateUserParam
            {
                Username         = registerRequest.Username,
                Password         = registerRequest.Password,
                Email            = registerRequest.Email,
                FirstName        = registerRequest.FirstName,
                LastName         = registerRequest.LastName,
                PhoneNumber      = registerRequest.PhoneNumber,
                PasswordQuestion = registerRequest.PasswordQuestion,
                PasswordAnswer   = registerRequest.PasswordAnswer,
                ReturnUrl        = returnUrl,
                Scope            = ComposerContext.Scope,
                CultureInfo      = ComposerContext.CultureInfo,
                GuestCustomerId  = ComposerContext.CustomerId
            };

            var createAccountViewModel = MembershipViewService.RegisterAsync(registerParam).Result;

            if (!createAccountViewModel.IsSuccess)
            {
                return(Ok(createAccountViewModel));
            }

            var loginParam = new LoginParam
            {
                CultureInfo     = ComposerContext.CultureInfo,
                Scope           = ComposerContext.Scope,
                GuestCustomerId = ComposerContext.CustomerId,
                Username        = registerRequest.Email,
                Password        = registerRequest.Password
            };

            var loginViewModel = MembershipViewService.LoginAsync(loginParam).Result;

            ComposerContext.IsGuest    = false;
            ComposerContext.CustomerId = createAccountViewModel.CustomerId;
            FormsAuthentication.SetAuthCookie(createAccountViewModel.Username, true, WebsiteContext.WebsiteId.ToString());

            return(Ok(createAccountViewModel));
        }
        public virtual IHttpActionResult SignIn(LoginViewModel loginRequest)
        {
            if (loginRequest == null)
            {
                return(BadRequest("Request body cannot be null"));
            }

            var returnUrl = loginRequest.ReturnUrl;

            if (string.IsNullOrWhiteSpace(returnUrl) || !UrlFormatter.IsReturnUrlValid(RequestUtils.GetBaseUrl(Request).ToString(), returnUrl))
            {
                returnUrl = MyAccountUrlProvider.GetMyAccountUrl(new BaseUrlParameter
                {
                    CultureInfo = ComposerContext.CultureInfo
                });
            }

            var loginParam = new LoginParam
            {
                Password        = loginRequest.Password,
                Username        = loginRequest.Username,
                Scope           = ComposerContext.Scope,
                CultureInfo     = ComposerContext.CultureInfo,
                ReturnUrl       = returnUrl,
                GuestCustomerId = ComposerContext.CustomerId,
            };

            var loginViewModel = MembershipViewService.LoginAsync(loginParam).Result;

            if (!loginViewModel.IsSuccess)
            {
                return(Ok(loginViewModel));
            }

            ComposerContext.CustomerId = loginViewModel.CustomerId;
            ComposerContext.IsGuest    = false;

            if (loginRequest.IsRememberMe)
            {
                FormsAuthentication.SetAuthCookie(
                    loginViewModel.Username,
                    SiteConfiguration.CookieAccesserSettings.TimeoutInMinutes,
                    loginRequest.IsRememberMe,
                    WebsiteContext.WebsiteId.ToString(),
                    SiteConfiguration.CookieAccesserSettings.RequireSsl);
            }
            else
            {
                FormsAuthentication.SetAuthCookie(loginViewModel.Username, true, WebsiteContext.WebsiteId.ToString());
            }

            return(Ok(loginViewModel));
        }
        /// <summary>
        /// Get the view Model to display User information
        /// </summary>
        /// <returns>
        /// The view model to display the User information
        /// </returns>
        public virtual async Task <UserMetadataViewModel> GetUserMetadataModel(GetUserMetadataParam param)
        {
            var urlParam = new BaseUrlParameter {
                CultureInfo = param.CultureInfo
            };

            var customer = await CustomerRepository.GetCustomerByIdAsync(new GetCustomerByIdParam
            {
                CultureInfo = param.CultureInfo,
                CustomerId  = param.CustomerId,
                Scope       = param.Scope
            }).ConfigureAwait(false);

            var viewModel = ViewModelMapper.MapTo <UserMetadataViewModel>(customer, param.CultureInfo) ?? new UserMetadataViewModel();

            viewModel.IsAuthenticated     = param.IsAuthenticated;
            viewModel.EncryptedCustomerId = param.EncryptedCustomerId;
            viewModel.Url         = viewModel.IsAuthenticated ? MyAccountUrlProvider.GetMyAccountUrl(urlParam) : MyAccountUrlProvider.GetLoginUrl(urlParam);
            viewModel.RegisterUrl = MyAccountUrlProvider.GetCreateAccountUrl(urlParam);
            return(viewModel);
        }
        public virtual MenuViewModel CreateMenu(string currentUrl)
        {
            var urlParam = new BaseUrlParameter
            {
                CultureInfo = ComposerContext.CultureInfo
            };

            bool recurringOrderConfigEnabled = RecurringOrdersSettings.Enabled;
            var  myAccountUrl      = MyAccountUrlProvider.GetMyAccountUrl(urlParam);
            var  addressListUrl    = MyAccountUrlProvider.GetAddressListUrl(urlParam);
            var  myOrderHistoryUrl = OrderUrlProvider.GetOrderHistoryUrl(new GetOrderUrlParameter {
                CultureInfo = ComposerContext.CultureInfo
            });
            var myWishListUrl = WishListUrlProvider.GetWishListUrl(new GetWishListUrlParam {
                CultureInfo = ComposerContext.CultureInfo
            });
            var myRecurringScheduleUrl = RecurringScheduleUrlProvider.GetRecurringScheduleUrl(new GetRecurringScheduleUrlParam {
                CultureInfo = ComposerContext.CultureInfo
            });

            var currentPageId = new Guid(currentUrl);

            var menu = new MenuViewModel {
                MenuItems = new List <MenuItemViewModel>()
            };
            var pageConfiguration       = SiteConfiguration.GetPagesConfiguration(ComposerContext.CultureInfo, WebsiteContext.WebsiteId);
            var myAccountPage           = PageService.GetPage(pageConfiguration.MyAccountPageId, ComposerContext.CultureInfo);
            var myAddressPage           = PageService.GetPage(pageConfiguration.AddressListPageId, ComposerContext.CultureInfo);
            var myOrderHistoryPage      = PageService.GetPage(pageConfiguration.OrderHistoryPageId, ComposerContext.CultureInfo);
            var myWishListage           = PageService.GetPage(pageConfiguration.MyWishListPageId, ComposerContext.CultureInfo);
            var myRecurringSchedulePage = PageService.GetPage(RecurringOrdersSettings.RecurringSchedulePageId, ComposerContext.CultureInfo);

            var myAccountMenuItem = new MenuItemViewModel
            {
                Name     = myAccountPage.MenuTitle,
                Url      = myAccountUrl,
                IsActive = currentPageId == pageConfiguration.MyAccountPageId ||
                           currentPageId == pageConfiguration.ChangePasswordPageId
            };

            var myAdressesMenuItem = new MenuItemViewModel
            {
                Name     = myAddressPage.MenuTitle,
                Url      = addressListUrl,
                IsActive = currentPageId == pageConfiguration.AddressListPageId ||
                           currentPageId == pageConfiguration.AddAddressPageId ||
                           currentPageId == pageConfiguration.UpdateAddressPageId
            };

            var myWishListMenuItem = new MenuItemViewModel
            {
                Name     = myWishListage.MenuTitle,
                Url      = myWishListUrl,
                IsActive = currentPageId == pageConfiguration.MyWishListPageId
            };

            var myOrderHistoryMenuItem = new MenuItemViewModel
            {
                Name     = myOrderHistoryPage.MenuTitle,
                Url      = myOrderHistoryUrl,
                IsActive = currentPageId == pageConfiguration.OrderHistoryPageId ||
                           currentPageId == pageConfiguration.OrderDetailsPageId ||
                           currentPageId == RecurringOrdersSettings.RecurringCartDetailsPageId
            };

            var myRecurringScheduleMenuItem = new MenuItemViewModel
            {
                Name     = myRecurringSchedulePage.MenuTitle,
                Url      = myRecurringScheduleUrl,
                IsActive = currentPageId == RecurringOrdersSettings.RecurringSchedulePageId || currentPageId == RecurringOrdersSettings.RecurringScheduleDetailsPageId
            };

            menu.MenuItems.AddRange(new List <MenuItemViewModel> {
                myAccountMenuItem, myWishListMenuItem, myAdressesMenuItem, myOrderHistoryMenuItem
            });

            if (recurringOrderConfigEnabled)
            {
                menu.MenuItems.Add(myRecurringScheduleMenuItem);
            }

            return(menu);
        }