using System; using System.Web.Mvc; using CommanderDemo.Domain; using MediatR; namespace CommanderDemo.Web { /// /// Note how the HomeController only has a single dependency on IMediator. /// [Authorize] public class HomeController : Controller { private readonly IMediator _mediator; public HomeController(IMediator mediator) { _mediator = mediator; } [HttpGet] public ActionResult Index() { return View(); } [HttpGet, AllowAnonymous] public ActionResult Login() { return View(new LoginUser()); } [HttpPost, AllowAnonymous] public ActionResult Login(LoginUser loginUser) { return Send(loginUser, x => RedirectToAction("Index"), View); } [AcceptVerbs(HttpVerbs.Get | HttpVerbs.Post), AllowAnonymous] public ActionResult Logout(LogoutUser logoutUser) { return Send(logoutUser, x => RedirectToAction("Index")); } [HttpGet] public ActionResult Users(QueryUsers queryUsers) { return Send(queryUsers, View); } [HttpGet] public ActionResult EditUser(GetUser getUser) { return Send(getUser, x => View("EditUser", x)); } [HttpPost] public ActionResult EditUser(SaveUser saveUser) { return Send(saveUser, x => RedirectToAction("Users"), () => EditUser(new GetUser { Id = saveUser.Id })); } //Note: Only Admin can delete users due to the Authorize(Users="Admin") attribute, create another user and try it. [HttpGet] public ActionResult DeleteUser(DeleteUser deleteUser) { return Send(deleteUser, x => RedirectToAction("Users"), () => EditUser(new GetUser { Id = deleteUser.Id })); } /// /// Send is a wrapper for the Mediator call that provides a common way to put exceptions in the ViewBag /// which can be displayed by Shared\_Messages. /// private ActionResult Send(IRequest cmd, Func success, Func failure = null) { try { var response = _mediator.Send(cmd); return success(response); } catch (Exception ex) { ViewBag._Error = ex.Message; return failure == null ? success(default(T)) : failure(); } } }; }