using System; using System.Linq; using System.Web.Mvc; using System.Web.Security; using MileageTraker.Web.Attributes; using MileageTraker.Web.Models; using MileageTraker.Web.ViewModels.User; namespace MileageTraker.Web.Controllers { [Authorize(Roles = "Administrator, Developer")] [UserActivity] public class UserController : ControllerBase { public ActionResult Index() { return View(DataService.GetUsers().ToList()); } public ActionResult Details(Guid id) { var user = Membership.GetUser(id); if (user == null) { return HttpNotFound(); } return View(DataService.GetUser(id)); } public ActionResult Create() { var vm = new CreateUserViewModel { AvailableRoles = Roles.GetAllRoles() }; return View(vm); } [HttpPost] public ActionResult Create(CreateUserViewModel viewModel) { if (ModelState.IsValid) { var hasRoles = viewModel.Roles != null && viewModel.Roles.Any(); MembershipCreateStatus membershipCreateStatus; var membershipUser = Membership.CreateUser( viewModel.Username, viewModel.Password, viewModel.Email, null, null, hasRoles, out membershipCreateStatus); if (membershipUser == null) { ModelState.AddModelError("", ErrorCodeToString(membershipCreateStatus)); viewModel.AvailableRoles = Roles.GetAllRoles(); return View(viewModel); } if (hasRoles) { Roles.AddUserToRoles( membershipUser.UserName, viewModel.Roles); } var user = DataService.GetUser( (Guid) membershipUser.ProviderUserKey); user.FullName = viewModel.FullName; DataService.UpdateUserPersonalInfo(user); return RedirectToAction("Index"); } viewModel.AvailableRoles = Roles.GetAllRoles(); return View(viewModel); } public ActionResult Edit(Guid id) { var user = DataService.GetUser(id); if (user == null) { return HttpNotFound(); } return View(user); } [HttpPost] public ActionResult Edit(User user) { if (ModelState.IsValid) { DataService.UpdateUser(user); return RedirectToAction("Index"); } return View(user); } private static string ErrorCodeToString(MembershipCreateStatus createStatus) { // See http://go.microsoft.com/fwlink/?LinkID=177550 for // a full list of status codes. switch (createStatus) { case MembershipCreateStatus.DuplicateUserName: return "User name already exists. Please enter a different user name."; case MembershipCreateStatus.DuplicateEmail: return "A user name for that e-mail address already exists. Please enter a different e-mail address."; case MembershipCreateStatus.InvalidPassword: return "The password provided is invalid. Please enter a valid password value."; case MembershipCreateStatus.InvalidEmail: return "The e-mail address provided is invalid. Please check the value and try again."; case MembershipCreateStatus.InvalidAnswer: return "The password retrieval answer provided is invalid. Please check the value and try again."; case MembershipCreateStatus.InvalidQuestion: return "The password retrieval question provided is invalid. Please check the value and try again."; case MembershipCreateStatus.InvalidUserName: return "The user name provided is invalid. Please check the value and try again."; case MembershipCreateStatus.ProviderError: return "The authentication provider returned an error. Please verify your entry and try again. If the problem persists, please contact your system administrator."; case MembershipCreateStatus.UserRejected: return "The user creation request has been canceled. Please verify your entry and try again. If the problem persists, please contact your system administrator."; default: return "An unknown error occurred. Please verify your entry and try again. If the problem persists, please contact your system administrator."; } } } }