// 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);
}
}
}