예제 #1
0
 private async Task SaveRequest(WorkersCriteria criteria)
 {
     _dbContext
     .Set <CustomerSearch>()
     .Add(_mapper.Map <CustomerSearch>(criteria));
     await _dbContext.SaveChangesAsync();
 }
예제 #2
0
        public async Task <WorkersResponse> Execute(WorkersCriteria criteria)
        {
            await SaveRequest(criteria);

            IQueryable <Customer> workers = _dbContext.Set <Customer>();

            if (criteria.AgeFrom.HasValue)
            {
                workers = workers.Where(c => c.BirthDate.HasValue && c.BirthDate.Value.Year >= criteria.AgeFrom.Value);
            }
            if (criteria.AgeTo.HasValue)
            {
                workers = workers.Where(c => c.BirthDate.HasValue && c.BirthDate.Value.Year <= criteria.AgeTo.Value);
            }

            if (criteria.WorkerType.HasValue)
            {
                workers = workers.Where(c => c.SearchType == criteria.WorkerType.Value);
            }

            if (!criteria.DistanceUntil.HasValue || !criteria.DistanceLat.HasValue || !criteria.DistanceLng.HasValue)
            {
                throw new ArgumentNullException(nameof(criteria), "lat_or_lng_undefined");
            }

            var lat         = criteria.DistanceLat.Value.ToString(CultureInfo.GetCultureInfo("en-GB"));
            var lng         = criteria.DistanceLng.Value.ToString(CultureInfo.GetCultureInfo("en-GB"));
            var dbGeography = DbGeography.PointFromText($"POINT({lng:R} {lat:R})", 4326);

            /* lar range */
            var distance = criteria.DistanceUntil.Value * 1000;

            workers = CutLocationRange(distance, criteria.DistanceLat.Value, criteria.DistanceLng.Value, workers);


            workers = workers
                      .Where(
                c =>
                c.Address.Details.Location.Distance(dbGeography) <= distance);

            return(new WorkersResponse
            {
                Count = workers.Count(),
                Workers = workers
                          .Include(c => c.Address.Details)
                          .OrderBy(c => c.Address.Details.Location.Distance(dbGeography))
                          .Skip(criteria.Page * criteria.Count)
                          .Take(criteria.Count)
                          .ToArray()
                          .Select(c => WorkerRelative.Get(dbGeography, c))
            });
        }
예제 #3
0
        public async Task <IHttpActionResult> Get([FromUri] WorkersCriteria id)
        {
            if (RequestContext.Principal.Identity.IsAuthenticated &&
                (!id.DistanceLat.HasValue || !id.DistanceLng.HasValue))
            {
                var addressDetails = await _addressDetailsByUserEmailQuery.Execute(RequestContext.Principal.Identity.Name);

                if (addressDetails != null)
                {
                    id.DistanceLat = addressDetails.Lat;
                    id.DistanceLng = addressDetails.Lng;
                }
            }

            if (id.Count <= 0)
            {
                id.Count = 100;
            }

            return(Ok(await _workersQuery.Execute(id)));
        }