EnVisageOnline/Main-RMO/Source/EnVisage/Code/BLL/ViewManager.cs

166 lines
6.0 KiB
C#

using System;
using System.Collections.Generic;
using System.Linq;
using EnVisage.Models;
using System.Data.Entity;
namespace EnVisage.Code.BLL
{
public class ViewManager : ManagerBase<View, ViewModel>
{
public ViewManager(EnVisageEntities dbContext)
: base(dbContext)
{
}
public override View Save(ViewModel model)
{
var view = base.Save(model);
if (Guid.Empty.Equals(model.Id))
{
model.Id = view.Id;
if (model.UserId != null)
{
foreach (var userId in model.UserId)
{
var user2View = DbContext.User2View.Create();
user2View.Id = Guid.NewGuid();
user2View.ViewId = view.Id;
user2View.UserId = userId;
DbContext.User2View.Add(user2View);
}
}
if (model.TeamId != null)
{
foreach (var teamId in model.TeamId)
{
var team2View = DbContext.Team2View.Create();
team2View.Id = Guid.NewGuid();
team2View.ViewId = view.Id;
team2View.TeamId = teamId;
DbContext.Team2View.Add(team2View);
}
}
}
else
{
var users = DbContext.User2View.Where(x => x.ViewId == model.Id).ToList();
users.Where(x => model.UserId == null || !model.UserId.Contains(x.UserId))
.ToList()
.ForEach(x => DbContext.Entry(x).State = EntityState.Deleted);
if (model.UserId != null)
{
foreach (var userId in model.UserId.Where(c => users.All(x => x.UserId != c)))
{
var user2View = DbContext.User2View.Create();
user2View.Id = Guid.NewGuid();
user2View.ViewId = view.Id;
user2View.UserId = userId;
DbContext.Entry(user2View).State = EntityState.Added;
}
}
var team2Views = DbContext.Team2View.Where(x => x.ViewId == view.Id).ToList();
team2Views.Where(x => model.TeamId == null || !model.TeamId.Contains(x.TeamId)).ToList().
ForEach(x => DbContext.Entry(x).State = EntityState.Deleted);
if (model.TeamId != null)
{
foreach (var teamId in model.TeamId.Where(c => !team2Views.Select(x => x.TeamId).Contains(c)))
{
var team2View = DbContext.Team2View.Create();
team2View.Id = Guid.NewGuid();
team2View.ViewId = view.Id;
team2View.TeamId = teamId;
DbContext.Entry(team2View).State = EntityState.Added;
}
}
}
//env-753 start
if (model.TeamId != null && model.UserId != null)
{
var users = model.UserId.Select(x => x.ToString());
var user2teams = DbContext.User2Team.Where(x => model.TeamId.Contains(x.TeamId) && users.Contains(x.UserId)).ToList();
foreach (var userId in model.UserId)
{
foreach (var teamId in model.TeamId)
{
if (user2teams.Any(x => x.UserId.Equals(userId.ToString(), StringComparison.InvariantCultureIgnoreCase) && x.TeamId == teamId))
continue;
DbContext.User2Team.Add(new User2Team
{
Id = Guid.NewGuid(),
UserId = userId.ToString(),
TeamId = teamId
});
}
}
}
//env-753 end
return view;
}
public ViewModel LoadWithChildCollections(Guid? value, bool isReadOnly = true)
{
ViewModel result = (ViewModel)base.Load(value, isReadOnly);
if (value.HasValue)
{
var users = DbContext.User2View.Where(x => x.ViewId == value.Value).ToList();
result.UserId = users.Select(x => x.UserId).ToList();
var teams = DbContext.Team2View.Where(t => t.ViewId == value.Value).ToList();
result.TeamId = teams.Select(t => t.TeamId).ToList();
}
return result;
}
protected override View InitInstance()
{
return new View { Id = Guid.NewGuid() };
}
protected override View RetrieveReadOnlyById(Guid key)
{
return DataTable.AsNoTracking().FirstOrDefault(t => t.Id == key);
}
public override System.Data.Entity.DbSet<View> DataTable
{
get
{
return DbContext.Views;
}
}
public IList<View> GetViewsByOwner(Guid? ownerId)
{
if (ownerId.HasValue)
{
return DataTable.Where(t => t.User2View.Select(x => x.UserId).Contains(ownerId.Value)).AsNoTracking().ToList();
}
return new List<View>();
}
public IList<Team> GetTeams(Guid? viewId)
{
if (!viewId.HasValue || Guid.Empty.Equals(viewId))
return new List<Team>();
var teams = (from tv in DbContext.Team2View
join t in DbContext.Teams on tv.TeamId equals t.Id
where tv.ViewId == viewId
orderby t.Name
select t).AsNoTracking().ToList();
teams.ForEach(t => t.PeopleResources = t.PeopleResources.OrderBy(r => r.FirstName + r.LastName).ToList());
return teams;
}
}
}