public async Task <IReadOnlyCollection <ISearchResult> > SearchAsync(int?currentUserId, string searchString) { bool matchByIdIsPerfect; int? characterIdToFind = SearchKeywordsResolver.TryGetId( searchString, keysForPerfectMath, out matchByIdIsPerfect); var results = await UnitOfWork.GetDbSet <Character>() .Where(c => (c.CharacterId == characterIdToFind || c.CharacterName.Contains(searchString) || (c.Description.Contents != null && c.Description.Contents.Contains(searchString))) && c.IsActive ) .OrderByDescending(cg => cg.CharacterName.Contains(searchString)) .ToListAsync(); //search by ID is only for masters of the character's project var characters = results.Where(c => CheckMasterAccessIfMatchById(c, currentUserId, characterIdToFind)); return(GetWorldObjectsResult( currentUserId, characters, LinkType.ResultCharacter, wasFoundByIdPredicate: c => c.Id == characterIdToFind, perfectMatchPredicte: c => c.Id == characterIdToFind && matchByIdIsPerfect)); }
public async Task <IReadOnlyCollection <ISearchResult> > SearchAsync(int?currentUserId, string searchString) { int?idToFind = SearchKeywordsResolver.TryGetId( searchString, keysForPerfectMath, out var matchByIdIsPerfect); if (idToFind == null) { //Only search by Id is valid for claims return(new ReadOnlyCollection <ISearchResult>(new List <ISearchResult>())); } var results = await UnitOfWork.GetDbSet <Claim>() .Where(claim => claim.ClaimId == idToFind) .ToListAsync(); return(results .Where(claim => claim.HasMasterAccess(currentUserId)) .Select(claim => new SearchResultImpl { LinkType = LinkType.Claim, Name = claim.Name, Description = new MarkdownString(WorldObjectProviderBase.GetFoundByIdDescription(claim.ClaimId)), Identification = claim.ClaimId.ToString(), ProjectId = claim.ProjectId, IsPublic = false, IsActive = claim.ClaimStatus.IsActive(), IsPerfectMatch = claim.ClaimId == idToFind && matchByIdIsPerfect, }) .ToList()); }
public async Task <IReadOnlyCollection <ISearchResult> > SearchAsync(int?currentUserId, string searchString) { bool matchByIdIsPerfect; int? idToFind = SearchKeywordsResolver.TryGetId( searchString, keysForPerfectMath, out matchByIdIsPerfect); var results = await UnitOfWork.GetDbSet <User>() .Where(user => //TODO There should be magic way to do this. Experiment with Expression.Voodoo user.UserId == idToFind || user.Email.Contains(searchString) || user.FatherName.Contains(searchString) || user.BornName.Contains(searchString) || user.SurName.Contains(searchString) || user.PrefferedName.Contains(searchString) || (user.Extra != null && user.Extra.Nicknames != null && user.Extra.Nicknames.Contains(searchString)) ) .ToListAsync(); return(results.Select(user => { bool wasfoundById = user.UserId == idToFind; var description = new MarkdownString(wasfoundById ? WorldObjectProviderBase.GetFoundByIdDescription(user.UserId) : ""); return new SearchResultImpl { LinkType = LinkType.ResultUser, Name = user.GetDisplayName(), Description = description, Identification = user.UserId.ToString(), ProjectId = null, //Users not associated with any project IsPublic = true, IsActive = true, IsPerfectMatch = wasfoundById && matchByIdIsPerfect, }; }).ToList()); }