Files
Partsource/PartSource.Automation/Services/VehicleCacheService.cs
2020-04-12 20:52:03 -04:00

142 lines
4.8 KiB
C#

using PartSource.Automation.Models.Cache;
using PartSource.Data.Nexpart;
using PartSource.Services;
using System;
using System.Collections.Concurrent;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace PartSource.Automation.Services
{
public class VehicleCacheService
{
private readonly ConcurrentBag<VehicleCacheItem> _vehicleCache;
private readonly ConcurrentBag<BaseVehicle> _sorryNotCanadianCache;
private readonly NexpartService _nexpartService;
public VehicleCacheService(NexpartService nexpartService)
{
_vehicleCache = new ConcurrentBag<VehicleCacheItem>();
_sorryNotCanadianCache = new ConcurrentBag<BaseVehicle>();
_nexpartService = nexpartService;
}
public VehicleCacheItem Get(int baseVehicleId, int engineConfigId)
{
return _vehicleCache.FirstOrDefault(v => v.BaseVehicle.BaseVehicleId == baseVehicleId && v.BaseVehicle.EngineConfigId == engineConfigId);
}
public void Add(VehicleCacheItem vehicle)
{
_vehicleCache.Add(vehicle);
}
public bool TryAdd(int baseVehicleId, int engineConfigId)
{
BaseVehicle sorryNotCanadian = _sorryNotCanadianCache.FirstOrDefault(b => b.BaseVehicleId == baseVehicleId && b.EngineConfigId == engineConfigId);
if (sorryNotCanadian != null)
{
return false;
}
VehicleIdSearch vehicleIdSearch = new VehicleIdSearch
{
VehicleIdentifier = new VehicleIdentifier
{
BaseVehicleId = baseVehicleId,
EngineConfigId = engineConfigId
},
ResultOption = new ResultOption[2]
{
new ResultOption { Value = "BASE_VEHICLE" },
new ResultOption { Value = "BASE_VEHICLE_DESC" }
},
RegionId = new RegionId
{
Value = 2
}
};
VehicleIdSearchResponse response = _nexpartService.SendRequest<VehicleIdSearch, VehicleIdSearchResponse>(vehicleIdSearch).Result;
if (response.ResponseBody?.BaseVehicle == null)
{
BaseVehicle vehicle = new BaseVehicle
{
BaseVehicleId = baseVehicleId,
EngineConfigId = engineConfigId
};
_sorryNotCanadianCache.Add(vehicle);
return false;
}
BaseVehicle baseVehicle = response.ResponseBody.BaseVehicle;
baseVehicle.EngineConfigId = engineConfigId;
SubModelSearch smSearch = new SubModelSearch()
{
MakeId = baseVehicle.MakeId,
ModelId = baseVehicle.ModelId,
Year = baseVehicle.Year,
RegionId = 2
};
SubModelSearchResponse smResponse = _nexpartService.SendRequest<SubModelSearch, SubModelSearchResponse>(smSearch).Result;
SubModel[] subModels = smResponse.ResponseBody?.SubModel;
if (subModels == null)
{
_sorryNotCanadianCache.Add(baseVehicle);
return false;
}
IList<int> vehicleIds = new List<int>();
foreach (SubModel submodel in subModels)
{
VehicleIdSearch vidSearch = new VehicleIdSearch
{
VehicleIdentifier = new VehicleIdentifier()
{
BaseVehicleId = baseVehicle.BaseVehicleId,
EngineConfigId = baseVehicle.EngineConfigId
},
Criterion = new Criterion[1]
{
new Criterion
{
Attribute = "SUB_MODEL",
Id = int.Parse(submodel.Id)
}
},
RegionId = new RegionId
{
Value = 2
},
};
VehicleIdSearchResponse vidResponse = _nexpartService.SendRequest<VehicleIdSearch, VehicleIdSearchResponse>(vidSearch).Result;
int? vehicleId = vidResponse.ResponseBody?.VehicleToEngineConfigId;
if (vehicleId != null && vehicleId > 0)
{
vehicleIds.Add((int)vehicleId);
}
}
VehicleCacheItem cacheItem = new VehicleCacheItem
{
BaseVehicle = baseVehicle,
VehicleIds = vehicleIds
};
_vehicleCache.Add(cacheItem);
return true;
}
}
}