using System; using System.Collections.Generic; using System.Linq; using System.Text; using Disco.Models.BI.Search; using Disco.Models.Repository; using Disco.Data.Repository; using Disco.Services.Users; namespace Disco.BI.UserBI { public static class Searching { public static List SearchUpstream(string Term) { return Interop.ActiveDirectory.ActiveDirectory.SearchUsers(Term).Select(adU => adU.ToRepositoryUser()).ToList(); } private static List Search_SelectUserSearchResultItems(IQueryable Query, int? LimitCount = null) { if (LimitCount.HasValue) Query = Query.Take(LimitCount.Value); return Query.Select(u => new UserSearchResultItem() { Id = u.Id, Surname = u.Surname, GivenName = u.GivenName, DisplayName = u.DisplayName, AssignedDevicesCount = u.DeviceUserAssignments.Where(dua => !dua.UnassignedDate.HasValue).Count(), JobCount = u.Jobs.Count() }).ToList(); } public static List Search(DiscoDataContext Database, string Term, int? LimitCount = null) { if (string.IsNullOrWhiteSpace(Term) || Term.Length < 2) throw new ArgumentException("Search Term must contain at least two characters", "Term"); // Search Active Directory & Import Relevant Users var adImportedUsers = Interop.ActiveDirectory.ActiveDirectory.SearchUsers(Term).Select(adU => adU.ToRepositoryUser()); foreach (var adU in adImportedUsers) { var existingUser = Database.Users.Find(adU.Id); if (existingUser != null) existingUser.UpdateSelf(adU); else Database.Users.Add(adU); Database.SaveChanges(); UserService.InvalidateCachedUser(adU.Id); } return Search_SelectUserSearchResultItems(Database.Users.Where(u => u.Id.Contains(Term) || u.Surname.Contains(Term) || u.GivenName.Contains(Term) || u.DisplayName.Contains(Term) ), LimitCount); } } }