// Copyright 1998-2016 Epic Games, Inc. All Rights Reserved. using System.Linq; using System.Web.Mvc; using Tools.CrashReporter.CrashReportWebSite.DataModels; using Tools.CrashReporter.CrashReportWebSite.DataModels.Repositories; using Tools.CrashReporter.CrashReportWebSite.ViewModels; namespace Tools.CrashReporter.CrashReportWebSite.Controllers { /// /// The controller to handle associating users with groups. /// public class UsersController : Controller { /// /// /// /// public UsersController(IUnitOfWork unitOfWork) { } /// /// Display the main user groups. /// /// /// A form of user data passed up from the client. /// The name of the current user group to display users for. /// A view to show a list of users in the current user group. public ActionResult Index( FormCollection formData, string userName, string userGroup = "General" ) { UsersViewModel model; using (var unitOfWork = new UnitOfWork(new CrashReportEntities())) { var group = unitOfWork.UserGroupRepository.First(data => data.Name == userGroup); if (!string.IsNullOrWhiteSpace(userName)) { var user = unitOfWork.UserRepository.GetByUserName(userName); if (user != null && group != null) { user.UserGroup = group; unitOfWork.UserRepository.Update(user); unitOfWork.Save(); } } var formhelper = new FormHelper(Request, formData, ""); var skip = (formhelper.Page - 1)*formhelper.PageSize; var take = formhelper.PageSize; model = new UsersViewModel { UserGroup = userGroup, User = userName, Users = unitOfWork.UserRepository.ListAll() .Where(data => data.UserGroupId == @group.Id) .OrderBy(data => data.UserName) .Skip(skip) .Take(take) .Select(data => new UserViewModel() {Name = data.UserName, UserGroup = data.UserGroup.Name}) .ToList() }; var groupCounts = unitOfWork.UserRepository.ListAll() .GroupBy(data => data.UserGroup) .Select(data => new {Key = data.Key, Count = data.Count()}) .ToDictionary(groupCount => groupCount.Key.Name, groupCount => groupCount.Count); model.GroupSelectList = groupCounts.Select( listItem => new SelectListItem { Selected = listItem.Key == userGroup, Text = listItem.Key, Value = listItem.Key }).ToList(); model.GroupCounts = groupCounts; model.PagingInfo = new PagingInfo { CurrentPage = formhelper.Page, PageSize = formhelper.PageSize, TotalResults = unitOfWork.UserRepository.ListAll().Count(data => data.UserGroupId == group.Id) }; } return View( "Index", model ); } /// /// Returns a list of user names and ids as a json for the auto-complete jQuery to parse /// /// /// public JsonResult AutocompleteUser(string userName) { using (var unitOfWork = new UnitOfWork(new CrashReportEntities())) { var users = unitOfWork.UserRepository.Get(data => data.UserName.Contains(userName)) .Take(10) .Select(data => new {UserName = data.UserName, Group = data.UserGroup.Name}) .ToList(); return Json(users, JsonRequestBehavior.AllowGet); } } protected override void Dispose(bool disposing) { base.Dispose(disposing); } } }