public IndexModule(IRepository repository)
        {
            Get ["/"] = parameters =>
            {
                var model = new SignupModel();

                if (Context.CurrentUser.IsAuthenticated())
                {
                    var manager = (Manager)this.Context.CurrentUser;
                    return(this.LoginAndRedirect
                               (manager.Id, fallbackRedirectUrl: "/home"));
                }

                return(View ["Index", model]);
            };
        }
        public LogonModule(IRepository repository, IApiRepository api)
        {
            Get ["/forgot"] = parameters =>
            {
                var model = new ForgotPasswordModel();

                return(View ["Forgot", model]);
            };

            Post ["/forgot"] = parameters =>
            {
                var model = this.Bind <ForgotPasswordModel> ();
                model.Errors = new List <Error> ();
                var result = this.Validate(model);

                if (!result.IsValid)
                {
                    model.Errors = Helpers.GetValidationErrors(result);
                    return(View ["Forgot", model]);
                }

                string password = repository.ForgotPassword(model.Email);

                if (string.IsNullOrEmpty(password))
                {
                    var error = new Error();
                    error.Name    = "NoAccount";
                    error.Message = "Account does not exist. Please sign up for an account.";
                    model.Errors.Add(error);
                }
                else
                {
                    var body = "You have requested a new password.\n";
                    body += string.Format("password: {0}\n", password);
                    body += "login at: https://www.supersimpleauth.com\n\n\n";
                    body += "If you did not request this password please report this activity to: [email protected] \n";
                    body += string.Format("The request was generated from IP: {0}", Request.UserHostAddress);

                    Email.Send("supersimpleauth.com", model.Email,
                               string.Format("New password for: {0}", model.Email), body);

                    model.Messages.Add("Your new password has been sent to your email.");
                }

                return(View ["Forgot", model]);
            };

            Get ["/logon"] = parameters =>
            {
                var logon = new LogonModel();

                return(View ["Logon", logon]);
            };

            Post ["/logon"] = parameters =>
            {
                var model = this.Bind <LogonModel> ();

                model.Errors = new List <Error> ();
                var result = this.Validate(model);

                if (!result.IsValid)
                {
                    model.Errors = Helpers.GetValidationErrors(result);
                    return(View ["Logon", model]);
                }

                var manager = api.Authenticate(repository.SsaDomain.Key,
                                               model.Username,
                                               model.Secret);
                var error = new Error();
                error.Name    = "SignInError";
                error.Message = "Password or username incorrect.";
                model.Errors.Add(error);

                if (manager == null)
                {
                    return(View ["Logon", model]);
                }

                return(this.LoginAndRedirect(manager.Id, fallbackRedirectUrl: "/home"));
            };

            Get ["/logoff"] = parameters =>
            {
                return(this.LogoutAndRedirect("/Logon"));
            };

            Get ["/signup"] = parameters =>
            {
                var model = new SignupModel();
                return(View ["Index", model]);
            };

            Post ["/signup"] = parameters =>
            {
                var model = this.Bind <SignupModel> ();
                model.Errors = new List <Error> ();
                var result = this.Validate(model);

                if (!result.IsValid)
                {
                    model.Errors = Helpers.GetValidationErrors(result);
                    return(View ["Index", model]);
                }

                try
                {
                    repository.CreateManager(model.Email, model.Secret);
                }
                catch (MongoDB.Driver.WriteConcernException e)
                {
                    var error = new Error()
                    {
                        Name    = "Duplicate",
                        Message = "This email has an account."
                    };

                    model.Errors.Add(error);
                    return(View ["Index", model]);
                }

                var logon = new LogonModel();
                logon.Messages.Add("Successully created your account. Please Sign In.");

                return(View ["Logon", logon]);
            };

            Get ["/settings"] = parameters =>
            {
                var model = new SettingsModel();
                model.Manager = (IUser)this.Context.CurrentUser;
                return(View ["Settings", model]);
            };

            Post ["/settings"] = parameters =>
            {
                var model = this.Bind <SettingsModel> ();
                model.Manager = (IUser)this.Context.CurrentUser;

                if (Request.Form.ChangeEmail != null)
                {
                    repository.ChangeEmail(model.Manager.Id,
                                           model.Password, model.Email);
                }

                if (Request.Form.ChangePassword)
                {
                    repository.ChangePassword(model.Manager.Id, model.OldPassword,
                                              model.NewPassword, model.ConfirmPassword);
                }

                if (Request.Form.Delete)
                {
                    if (!string.IsNullOrEmpty(model.DeletePassword))
                    {
                        repository.DeleteManager(model.Manager.Id, model.DeletePassword);
                        return(this.Response.AsRedirect("/"));
                    }
                    else
                    {
                        var error = new Error();
                        error.Name    = "Password";
                        error.Message = "Please supply a valid password to delete account.";
                        model.Errors.Add(error);

                        return(View ["Settings", model]);
                    }
                }

                return(Response.AsRedirect("/settings"));
            };
        }