Assignment for Location Calculation
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 

80 lines
2.8 KiB

using Microsoft.AspNetCore.Http;
using POCDistance.DAL;
using POCDistance.Models;
using POCDistance.Util;
using System.Collections.Generic;
using System.Linq;
namespace POCDistance.Service
{
public class LocationService : ILocationService
{
private readonly IHttpContextAccessor _httpContextAccessor;
private readonly IDataSourceAdapter _dataAdapter;
public LocationService(IHttpContextAccessor httpContextAccessor, IDataSourceAdapter dataAdapter)
{
_httpContextAccessor = httpContextAccessor;
_dataAdapter = dataAdapter;
}
public List<LocationModel> GetAll()
{
var locations = new List<LocationModel>();
if (!string.IsNullOrEmpty(_httpContextAccessor.HttpContext.Session.GetString("LocationData")))
{
locations = _httpContextAccessor.HttpContext.Session.GetObjectFromJson<List<LocationModel>>("LocationData");
}
else
{
locations = _dataAdapter.GetLocations();
_httpContextAccessor.HttpContext.Session.SetObjectAsJson("LocationData", locations);
}
return locations;
}
public List<LocationModel> GetManyByZipCode(string zipCode)
{
if (!string.IsNullOrWhiteSpace(zipCode) && zipCode.Length > 1)
{
var locations = GetAll();
var query = locations.Where(l => l.ZipCode.StartsWith(zipCode));
return query.ToList();
}
return new List<LocationModel>();
}
public LocationModel GetByZipCode(string zipCode)
{
var _location = GetManyByZipCode(zipCode);
return _location.OrderByDescending(l => l.Country).FirstOrDefault();
}
public DistanceModel GetDistanceByZipCode(string zipCode1, string zipCode2)
{
double distance = 0.0;
double loc_lat1, loc_long1, loc_lat2, loc_long2;
var model = new DistanceModel();
var location1 = GetByZipCode(zipCode1);
var location2 = GetByZipCode(zipCode2);
if (location1 != null
&& location2 != null
&& double.TryParse(location1.Latitude, out loc_lat1)
&& double.TryParse(location1.Longitude, out loc_long1)
&& double.TryParse(location2.Latitude, out loc_lat2)
&& double.TryParse(location2.Longitude, out loc_long2))
{
distance = CalculateDistance.GetDistance(loc_lat1, loc_long1, loc_lat2, loc_long2);
model.Distance = distance.ToString("0.00");
model.FromCity = location1.City;
model.ToCity = location2.City;
model.Unit = "km";
}
return model;
}
}
}