public override async Task <SearchReply> Search(SearchCriteria criteria, ServerCallContext context) { await Task.Delay(500); // Gotta look busy... var rng = new Random(); var reply = new SearchReply(); reply.Itineraries.AddRange(Enumerable.Range(0, rng.Next(1, 5)).Select(_ => new Itinerary { Price = rng.Next(10000, 200000) / 100m, Outbound = new FlightSegment { Airline = RandomAirline(), FromAirportCode = criteria.FromAirport, ToAirportCode = criteria.ToAirport, DepartureTime = criteria.OutboundDate.AddHours(rng.Next(24)).AddMinutes(5 * rng.Next(12)), ReturnTime = criteria.OutboundDate.AddHours(rng.Next(24)).AddMinutes(5 * rng.Next(12)), DurationHours = 2 + rng.Next(10), TicketClass = criteria.TicketClass }, Return = new FlightSegment { Airline = RandomAirline(), FromAirportCode = criteria.ToAirport, ToAirportCode = criteria.FromAirport, DepartureTime = criteria.ReturnDate.AddHours(rng.Next(24)).AddMinutes(5 * rng.Next(12)), ReturnTime = criteria.ReturnDate.AddHours(rng.Next(24)).AddMinutes(5 * rng.Next(12)), DurationHours = 2 + rng.Next(10), TicketClass = criteria.TicketClass }, })); return(reply); }
public void ShowsSearchResults() { // Arrange: Prepare a reply from server var app = host.AddComponent <Main>(); var reply = new SearchReply(); reply.Itineraries.Add(TestItinerary.Create("My Airline", 123)); reply.Itineraries.Add(TestItinerary.Create("Another Airline", 456m)); // Act: Click 'search'; receive reply app.Find(".search-submit").Click(); host.WaitForNextRender(() => flightDataClient.SetResponse(reply)); // Assert: Verify UI displays the data Assert.Equal("2 results", app.Find("#results-area .title h2").InnerText); Assert.Collection(app.FindAll("#results-area .search-result"), item => { Assert.Equal("$123", item.QuerySelector(".price h3").InnerText); Assert.Equal("My Airline", item.QuerySelector(".airline span").InnerText); }, item => { Assert.Equal("$456", item.QuerySelector(".price h3").InnerText); Assert.Equal("Another Airline", item.QuerySelector(".airline span").InnerText); }); }
public override async Task <SearchReply> Search(SearchRequest request, ServerCallContext context) { var condition = _mapper.Map <Condition>(request.Condition); var results = await _driver.Search(condition); var response = new SearchReply(); response.Ids.AddRange(results); return(response); }
public override Task <SearchReply> List(SearchRequest request, ServerCallContext context) { SearchReply result = new SearchReply(); for (int i = 0; i < request.Count; i++) { var item = new User { Name = "henryfan", City = "guangzhou", Email = "*****@*****.**", Title = "cxo", Password = "******", ID = Guid.NewGuid().ToString("N"), CreateTime = DateTime.Now.Ticks }; result.Items.Add(item); } return(Task.FromResult(result)); }
public override async Task <SearchReply> ExecuteSearchRequest(SearchRequest request, ServerCallContext context) { if (!RequestIsFromLoopback(context)) { throw new Exception("Request is not from loopback"); } List <string> cns = request.UserIdentity.Cn.ToList(); List <string> ous = request.UserIdentity.Ou.ToList(); if (cns[0] != "BindUser" && ous.Count != 0) { throw new Exception("Search by Non-BindUser"); } SearchReply reply = new SearchReply { }; Guid appId = new Guid(request.UserIdentity.Dc[0]); LdapPacketParserLibrary.Parser parser = new LdapPacketParserLibrary.Parser(); LdapPacketParserLibrary.Models.LdapMessage message = parser.TryParsePacket(request.RawPacket.ToByteArray()); if (message.ProtocolOp.GetType() == typeof(LdapPacketParserLibrary.Models.Operations.Request.SearchRequest)) { LdapPacketParserLibrary.Models.Operations.Request.SearchRequest searchRequest = (LdapPacketParserLibrary.Models.Operations.Request.SearchRequest)message.ProtocolOp; int?limit = searchRequest.SizeLimit; var itemExpression = Expression.Parameter(typeof(AppUser)); SearchExpressionBuilder searchExpressionBuilder = new SearchExpressionBuilder(); var conditions = searchExpressionBuilder.Build(searchRequest.Filter, itemExpression); var queryLambda = Expression.Lambda <Func <AppUser, bool> >(conditions, itemExpression); var predicate = queryLambda.Compile(); List <AppUser> results = await _authDbContext.Users .AsNoTracking() .Include(u => u.Groups) .ThenInclude(g => g.AuthApps) .Where(queryLambda) .Where(u => u.Groups.Any(g => g.AuthApps.Any(a => a.Id == appId))) .AsSplitQuery() .ToListAsync(); SearchReply.Types.ResultEntry entry = new SearchReply.Types.ResultEntry { }; foreach (AppUser user in results) { entry.Rdn = "cn=" + user.Id.ToString() + ",ou=People,dc=" + appId; SearchReply.Types.ResultEntry.Types.ResultAttribute displayNameAttribute = new SearchReply.Types.ResultEntry.Types.ResultAttribute { Name = "displayname", }; displayNameAttribute.Value.Add(user.UserName); SearchReply.Types.ResultEntry.Types.ResultAttribute emailAttribute = new SearchReply.Types.ResultEntry.Types.ResultAttribute { Name = "email", }; emailAttribute.Value.Add(user.Email); SearchReply.Types.ResultEntry.Types.ResultAttribute objectClassAttribute = new SearchReply.Types.ResultEntry.Types.ResultAttribute { Name = "objectclass", }; objectClassAttribute.Value.Add("inetOrgPerson"); SearchReply.Types.ResultEntry.Types.ResultAttribute entryUuidAttribute = new SearchReply.Types.ResultEntry.Types.ResultAttribute { Name = "entryUuid", }; entryUuidAttribute.Value.Add(user.Id.ToString()); entry.Attributes.AddRange(new List <SearchReply.Types.ResultEntry.Types.ResultAttribute>() { displayNameAttribute, emailAttribute, objectClassAttribute, entryUuidAttribute }); reply.Results.Add(entry); } } return(reply); }