This commit is contained in:
2020-09-02 20:53:34 -04:00
parent 85d99d2615
commit d06925204d
38 changed files with 913 additions and 679 deletions

View File

@@ -1,35 +0,0 @@
using Microsoft.AspNetCore.Authorization;
using Microsoft.AspNetCore.Diagnostics;
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace PartSource.Api.Controllers
{
[Route("[controller]")]
public class ErrorController : ControllerBase
{
[HttpGet]
[Route("")]
[AllowAnonymous]
public ActionResult Get()
{
IExceptionHandlerPathFeature exceptionFeature = HttpContext.Features.Get<IExceptionHandlerPathFeature>();
if (exceptionFeature != null)
{
string route = exceptionFeature.Path;
Exception ex = exceptionFeature.Error;
//TODO: Logging
}
return StatusCode(StatusCodes.Status500InternalServerError);
}
}
}

View File

@@ -9,6 +9,7 @@ namespace PartSource.Api.Controllers
[Route("[controller]")]
[Route("v1/[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = "v1")]
public class InventoryController : BaseNexpartController
{
private readonly PartService _inventoryService;

View File

@@ -20,6 +20,7 @@ namespace PartSource.Api.Controllers
[Route("vehicles")]
[Route("v1/vehicles")]
[ApiController]
[ApiExplorerSettings(GroupName = "v1")]
public class LegacyVehiclesController : BaseNexpartController
{
private readonly VehicleService _vehicleService;
@@ -116,7 +117,7 @@ namespace PartSource.Api.Controllers
});
}
return Ok(new { data = new { subModel = submodels } });
return Ok(new { data = new { subModel = nexpartSubmodels } });
}
[HttpGet]

View File

@@ -1,158 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using PartSource.Data.Nexpart;
using PartSource.Services;
using System.Threading.Tasks;
namespace PartSource.Api.Controllers
{
[Route("[controller]")]
[ApiController]
public class NexpartVehiclesController : BaseNexpartController
{
private readonly NexpartService _nexpartService;
public NexpartVehiclesController(NexpartService nexpartService)
{
this._nexpartService = nexpartService;
}
[HttpGet]
[Route("types")]
public async Task<ActionResult> GetVehicleTypes()
{
NexpartVehiclesController vehiclesController = this;
VehicleTypesGetResponse response = await vehiclesController._nexpartService.SendRequest<VehicleTypesGet, VehicleTypesGetResponse>(new VehicleTypesGet());
return vehiclesController.NexpartResponse<VehicleTypesGetResponse, VehicleTypes>(response);
}
[HttpGet]
[Route("makes")]
public async Task<ActionResult> GetMakes()
{
NexpartVehiclesController vehiclesController = this;
MakeSearch requestContent = new MakeSearch()
{
VehicleTypeId = new int[] { 5, 6, 7 }
};
MakeSearchResponse response = await vehiclesController._nexpartService.SendRequest<MakeSearch, MakeSearchResponse>(requestContent);
return vehiclesController.NexpartResponse<MakeSearchResponse, Makes>(response);
}
[HttpGet]
[Route("makes/vehicletypeid/{vehicleTypeId}")]
public async Task<ActionResult> GetMakes(int vehicleTypeId)
{
NexpartVehiclesController vehiclesController = this;
MakeSearch requestContent = new MakeSearch()
{
VehicleTypeId = new int[] { vehicleTypeId }
};
MakeSearchResponse response = await vehiclesController._nexpartService.SendRequest<MakeSearch, MakeSearchResponse>(requestContent);
return vehiclesController.NexpartResponse<MakeSearchResponse, Makes>(response);
}
[HttpGet]
[Route("models/makeid/{makeId}/modelyear/{year}")]
public async Task<ActionResult> GetModels(int makeId, int year)
{
NexpartVehiclesController vehiclesController = this;
ModelSearch requestContent = new ModelSearch()
{
MakeId = makeId,
Year = year,
VehicleTypeId = new int[] { 5, 6, 7 }
};
ModelSearchResponse response = await vehiclesController._nexpartService.SendRequest<ModelSearch, ModelSearchResponse>(requestContent);
return vehiclesController.NexpartResponse<ModelSearchResponse, Models[]>(response);
}
[HttpGet]
[Route("models/makeid/{makeId}/modelyear/{year}/vehicletypeid/{vehicleTypeId}")]
public async Task<ActionResult> GetModels(int makeId, int year, int vehicleTypeId)
{
NexpartVehiclesController vehiclesController = this;
ModelSearch requestContent = new ModelSearch()
{
MakeId = makeId,
Year = year,
VehicleTypeId = new int[] { vehicleTypeId }
};
ModelSearchResponse response = await vehiclesController._nexpartService.SendRequest<ModelSearch, ModelSearchResponse>(requestContent);
return vehiclesController.NexpartResponse<ModelSearchResponse, Models[]>(response);
}
[HttpGet]
[Route("basevehicle/makeid/{makeId}/modelid/{modelId}/modelyear/{year}")]
public async Task<ActionResult> GetBaseVehicle(int makeId, int modelId, int year)
{
BaseVehicleDetailLookup requestContent = new BaseVehicleDetailLookup()
{
MakeId = makeId,
ModelId = modelId,
Year = year
};
BaseVehicleDetailLookupResponse response = await _nexpartService.SendRequest<BaseVehicleDetailLookup, BaseVehicleDetailLookupResponse>(requestContent);
return NexpartResponse<BaseVehicleDetailLookupResponse, BaseVehicleDetail>(response);
}
[HttpGet]
[Route("engines/basevehicleid/{baseVehicleId}")]
[Route("engines/basevehicleid/{baseVehicleId}/submodelid/{subModelId}")]
public async Task<ActionResult> GetEngines(int baseVehicleId, int? subModelId = null)
{
EngineSearch requestContent = new EngineSearch()
{
VehicleIdentifier = new VehicleIdentifier()
{
BaseVehicleId = baseVehicleId
},
SubModelId = subModelId
};
EngineSearchResponse response = await _nexpartService.SendRequest<EngineSearch, EngineSearchResponse>(requestContent);
return NexpartResponse<EngineSearchResponse, Engines>(response);
}
[HttpGet]
[Route("trim/makeid/{makeId}/modelid/{modelId}/modelyear/{year}")]
public async Task<ActionResult> GetTrim(int makeId, int modelId, int year)
{
SubModelSearch requestContent = new SubModelSearch()
{
MakeId = makeId,
ModelId = modelId,
Year = year,
RegionId = 2
};
SubModelSearchResponse response = await _nexpartService.SendRequest<SubModelSearch, SubModelSearchResponse>(requestContent);
return NexpartResponse<SubModelSearchResponse, SubModels>(response);
}
[HttpGet]
[Route("/detail/basevehicleid/{baseVehicleId}/submodelid/{subModelId}/engineconfigid/{engineConfigId}")]
public async Task<ActionResult> GetVehicleId(int baseVehicleId, int subModelId, int engineConfigId)
{
VehicleIdSearch requestContent = new VehicleIdSearch
{
VehicleIdentifier = new VehicleIdentifier()
{
BaseVehicleId = baseVehicleId,
EngineConfigId = engineConfigId
},
Criterion = new Criterion[1]{
new Criterion
{
Attribute = "SUB_MODEL",
Id = subModelId
}
},
RegionId = new RegionId
{
Value = 2
},
};
VehicleIdSearchResponse response = await _nexpartService.SendRequest<VehicleIdSearch, VehicleIdSearchResponse>(requestContent);
return NexpartResponse<VehicleIdSearchResponse, VehicleDetail>(response);
}
}
}

View File

@@ -10,6 +10,7 @@ namespace PartSource.Api.Controllers
{
[Route("[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = "v1")]
public class PartsController : BaseNexpartController
{
private readonly NexpartService _nexpartService;

View File

@@ -1,32 +0,0 @@
using Microsoft.AspNetCore.Mvc;
using PartSource.Data.Nexpart;
using PartSource.Services;
using System.Threading.Tasks;
namespace PartSource.Api.Controllers
{
[Route("[controller]")]
[ApiController]
public class SearchController : BaseNexpartController
{
private readonly NexpartService _nexpartService;
public SearchController()
{
this._nexpartService = new NexpartService();
}
[HttpGet]
[Route("makes/vehicletypeid/{vehicleTypeId}")]
public async Task<ActionResult> GetMakes(int vehicleTypeId)
{
SearchController searchController = this;
MakeSearch requestContent = new MakeSearch()
{
VehicleTypeId = new int[] { vehicleTypeId }
};
MakeSearchResponse response = await searchController._nexpartService.SendRequest<MakeSearch, MakeSearchResponse>(requestContent);
return searchController.NexpartResponse<MakeSearchResponse, Makes>(response);
}
}
}

View File

@@ -1,47 +0,0 @@
//using Microsoft.AspNetCore.Mvc;
//using PartSource.Data.Models;
//using PartSource.Services;
//using System.Web.Http;
//namespace PartSource.Api.Controllers
//{
// [Route("stores")]
// public class StoresController : ControllerBase
// {
// private const int Count = 5;
// private const int Page = 1;
// private readonly LocationService _service;
// public StoresController(LocationService service)
// {
// this._service = service;
// }
// [HttpGet]
// [Route("nearest/{postal}")]
// [Route("nearest/{postal}/count/{count}")]
// [Route("nearest/{postal}/count/{count}/page/{page}")]
// public ActionResult GetNearestStores(string postal, int count = 5, int page = 1)
// {
// PostalCode postalCodeData = this._service.GetPostalCodeData(postal);
// if (postalCodeData == null)
// return (ActionResult)this.BadRequest("Invalid postal code");
// return (ActionResult)this.Ok(new
// {
// Data = this._service.GetClosestLocations(postalCodeData, count, page)
// });
// }
// [HttpGet]
// [Route("nearest/{postal}/radius/{radius}")]
// [Route("nearest/{postal}/radius/{radius}/count/{count}")]
// [Route("nearest/{postal}/radius/{radius}/count/{count}/page/{page}")]
// public ActionResult GetNearestStores(string postal, double radius, int count = 5, int page = 1)
// {
// return (ActionResult)this.Ok(new
// {
// Data = this._service.GetClosestLocations(this._service.GetPostalCodeData(postal), count, page, radius)
// });
// }
// }
//}

View File

@@ -1,40 +0,0 @@
using Microsoft.AspNetCore.Http;
using Microsoft.AspNetCore.Mvc;
using Microsoft.Extensions.Primitives;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Threading.Tasks;
namespace PartSource.Api.Controllers
{
[Route("[controller]")]
[ApiController]
public class TemplatesController : ControllerBase
{
[Route("{templateName}/{vehicleId}")]
[HttpGet]
public IActionResult GetTemplate(string templateName, int vehicleId)
{
StringValues contentType = new StringValues("application/liquid");
Response.Headers.Add("Content-Type", contentType);
string content = $"{templateName},{vehicleId}";
return Ok(content);
}
//Crappy oauth code to make the app installable on shopify
//HttpRequest request = HttpContext.Request;
//string location = "https://ratermaniac.myshopify.com/admin/oauth/authorize?client_id=097de154602f28499e058f66b8653033&scope=read_customers&redirect_uri=https://soundpress.com&state=0.4585849384";
//StringValues locationHeader = new StringValues(location);
// //Response.Headers.Add("Location", location);
// return Redirect(location);
}
}

View File

@@ -10,8 +10,12 @@ using System.Threading.Tasks;
namespace PartSource.Api.Controllers
{
/// <remarks>
/// This endpoint gets vehicle data from WHI's SEO data.
/// </remarks>
[Route("v2/[controller]")]
[ApiController]
[ApiExplorerSettings(GroupName = "v2")]
public class VehiclesController : BaseApiController
{
private readonly VehicleService _vehicleService;
@@ -21,17 +25,30 @@ namespace PartSource.Api.Controllers
_vehicleService = vehicleService;
}
[HttpGet]
[Route("")]
public async Task<ActionResult> GetVehicles([FromQuery] Vehicle vehicleQuery)
/// <summary>
/// Get Vehicles
/// </summary>
/// <response code="200"><strong>OK:</strong> An array of vehicles matching the query.</response>
/// <response code="204"><strong>No Content:</strong> The query executed successfully, but no vehicles were found.</response>
[HttpGet("")]
[ProducesResponseType(typeof(IList<VehicleDto>), 200)]
[ProducesResponseType(204)]
public async Task<ActionResult> GetVehicles([FromQuery] VehicleDto vehicleQuery)
{
IList<Vehicle> vehicles = await _vehicleService.GetVehicles(vehicleQuery);
return ApiResponse(vehicles);
}
[HttpGet]
[Route("{id}")]
/// <summary>
/// Get Vehicle by ID
/// </summary>
/// <param name="id">A WHI VehicleToEngineConfigId</param>
/// <response code="200"><strong>OK:</strong> The vehicle with the provided VehicleToEngineConfigId.</response>
/// <response code="404"><strong>Not Found:</strong> No vehicle was found matching the provided VehicleToEngineConfigId.</response>
[HttpGet("{id}")]
[ProducesResponseType(typeof(VehicleDto), 200)]
[ProducesResponseType(404)]
public async Task<ActionResult> GetVehicleById(int id)
{
Vehicle vehicle = await _vehicleService.GetVehicleById(id);
@@ -39,94 +56,162 @@ namespace PartSource.Api.Controllers
return ApiResponse(vehicle);
}
[HttpGet]
[Route("makes")]
public async Task<ActionResult> GetMakes([FromQuery] VehicleMake vehicleMake)
/// <summary>
/// Get Makes
/// </summary>
/// <response code="200"><strong>OK:</strong> An array of makes matching the query.</response>
/// <response code="204"><strong>No Content:</strong> The query executed successfully, but no makes were found.</response>
[HttpGet("makes")]
[ProducesResponseType(typeof(IList<MakeDto>), 200)]
[ProducesResponseType(204)]
public async Task<ActionResult> GetMakes([FromQuery] VehicleDto vehicleQuery)
{
IList<VehicleMake> makes = await _vehicleService.GetMakes(vehicleMake);
IList<MakeDto> makes = await _vehicleService.GetMakes(vehicleQuery);
return ApiResponse(makes);
}
[HttpGet]
[Route("makes/{id}")]
/// <summary>
/// Get Make by ID
/// </summary>
/// <param name="id">A WHI MakeId</param>
/// <response code="200"><strong>OK:</strong> The make with the provided MakeId.</response>
/// <response code="404"><strong>Not Found:</strong> No make was found matching the provided MakeId.</response>
[HttpGet("makes/{id}")]
[ProducesResponseType(typeof(MakeDto), 200)]
[ProducesResponseType(404)]
public async Task<ActionResult> GetMakeById(int id)
{
VehicleMake make = await _vehicleService.GetMakeById(id);
MakeDto make = await _vehicleService.GetMakeById(id);
return ApiResponse(make);
}
[HttpGet]
[Route("models")]
public async Task<ActionResult> GetModels([FromQuery] VehicleModel vehicleModel)
/// <summary>
/// Get Models
/// </summary>
/// <response code="200"><strong>OK:</strong> An array of models matching the query.</response>
/// <response code="204"><strong>No Content:</strong> The query executed successfully, but no models were found.</response>
[HttpGet("models")]
[ProducesResponseType(typeof(IList<ModelDto>), 200)]
[ProducesResponseType(204)]
public async Task<ActionResult> GetModels([FromQuery] VehicleDto vehicleQuery)
{
IList<VehicleModel> models = await _vehicleService.GetModels(vehicleModel);
IList<ModelDto> models = await _vehicleService.GetModels(vehicleQuery);
return ApiResponse(models);
}
[HttpGet]
[Route("models/{id}")]
/// <summary>
/// Get Model by ID
/// </summary>
/// <param name="id">A WHI ModelId</param>
/// <response code="200"><strong>OK:</strong> The model with the provided ModelId.</response>
/// <response code="404"><strong>Not Found:</strong> No model was found matching the provided ModelId.</response>
[HttpGet("models/{id}")]
[ProducesResponseType(typeof(ModelDto), 200)]
[ProducesResponseType(404)]
public async Task<ActionResult> GetModelById(int id)
{
VehicleModel model = await _vehicleService.GetModelById(id);
ModelDto model = await _vehicleService.GetModelById(id);
return ApiResponse(model);
}
[HttpGet]
[Route("basevehicles")]
public async Task<ActionResult> GetBaseVehicles([FromQuery] BaseVehicle baseVehicle)
/// <summary>
/// Get Submodels
/// </summary>
/// /// <remarks><em>Note: Submodels can be shared between models. Do not assume a submodel is unique to a given model.</em></remarks>
/// <response code="200"><strong>OK:</strong> An array of submodels matching the query.</response>
/// <response code="204"><strong>No Content:</strong> The query executed successfully, but no submodels were found.</response>
[HttpGet("submodels")]
[ProducesResponseType(typeof(IList<SubmodelDto>), 200)]
[ProducesResponseType(204)]
public async Task<ActionResult> GetSubmodels([FromQuery] VehicleDto vehicleQuery)
{
IList<BaseVehicle> baseVehicles = await _vehicleService.GetBaseVehicles(baseVehicle);
return ApiResponse(baseVehicles);
}
[HttpGet]
[Route("basevehicles/{id}")]
public async Task<ActionResult> GetBaseVehicleById(int id)
{
BaseVehicle baseVehicle = await _vehicleService.GetBaseVehicleById(id);
return ApiResponse(baseVehicle);
}
[HttpGet]
[Route("engines")]
public async Task<ActionResult> GetEngines([FromQuery] Engine engine)
{
IList<Engine> engines = await _vehicleService.GetEngines(engine);
return ApiResponse(engines);
}
[HttpGet]
[Route("engines/{id}")]
public async Task<ActionResult> GetEngineById(int id)
{
EngineDto engine = await _vehicleService.GetEngineById(id);
return ApiResponse(engine);
}
[HttpGet]
[Route("submodels")]
public async Task<ActionResult> GetSubmodels([FromQuery] Submodel submodelQuery)
{
IList<Submodel> submodels = await _vehicleService.GetSubmodels(submodelQuery);
IList<SubmodelDto> submodels = await _vehicleService.GetSubmodels(vehicleQuery);
return ApiResponse(submodels);
}
[HttpGet]
[Route("submodels/{id}")]
/// <summary>
/// Get Submodel by ID
/// </summary>
/// <remarks><em>Note: Submodels can be shared between models. Do not assume a submodel is unique to a given model.</em></remarks>
/// <param name="id">A WHI SubmodelId</param>
/// <response code="200"><strong>OK:</strong> The submodel with the provided SubmodelId.</response>
/// <response code="404"><strong>Not Found:</strong> No submodel was found matching the provided SubmodelId.</response>
[HttpGet("submodels/{id}")]
[ProducesResponseType(typeof(SubmodelDto), 200)]
[ProducesResponseType(404)]
public async Task<ActionResult> GetSubmodels(int id)
{
SubmodelDto submodel = await _vehicleService.GetSubmodelById(id);
return ApiResponse(submodel);
}
/// <summary>
/// Get Base Vehicles
/// </summary>
/// <response code="200"><strong>OK:</strong> An array of base vehicles matching the query.</response>
/// <response code="204"><strong>No Content:</strong> The query executed successfully, but no base vehicles were found.</response>
[HttpGet("basevehicles")]
[ProducesResponseType(typeof(IList<BaseVehicleDto>), 200)]
[ProducesResponseType(204)]
public async Task<ActionResult> GetBaseVehicles([FromQuery] VehicleDto vehicleQuery)
{
IList<BaseVehicleDto> baseVehicles = await _vehicleService.GetBaseVehicles(vehicleQuery);
return ApiResponse(baseVehicles);
}
/// <summary>
/// Get Base Vehicle by ID
/// </summary>
/// <param name="id">A WHI BaseVehicleId</param>
/// <response code="200"><strong>OK:</strong> The base vehicle with the provided BaseVehicleId.</response>
/// <response code="404"><strong>Not Found:</strong> No base vehicle was found matching the provided BaseVehicleId.</response>
[HttpGet("basevehicles/{id}")]
[ProducesResponseType(typeof(BaseVehicleDto), 200)]
[ProducesResponseType(404)]
public async Task<ActionResult> GetBaseVehicleById(int id)
{
BaseVehicleDto baseVehicle = await _vehicleService.GetBaseVehicleById(id);
return ApiResponse(baseVehicle);
}
/// <summary>
/// Get Engines
/// </summary>
/// <response code="200"><strong>OK:</strong> An array of engines matching the query.</response>
/// <response code="204"><strong>No Content:</strong> The query executed successfully, but no engines were found.</response>
[HttpGet("engines")]
[ProducesResponseType(typeof(IList<EngineDto>), 200)]
[ProducesResponseType(204)]
public async Task<ActionResult> GetEngines([FromQuery] VehicleDto vehicleQuery)
{
IList<EngineDto> engines = await _vehicleService.GetEngines(vehicleQuery);
return ApiResponse(engines);
}
/// <summary>
/// Get Engine by ID
/// </summary>
/// <param name="id">A WHI EngineConfigId</param>
/// <response code="200"><strong>OK:</strong> The engine with the provided EngineConfigId.</response>
/// <response code="404"><strong>Not Found:</strong> No engine was found matching the provided EngineConfigId.</response>
[HttpGet("engines/{id}")]
[ProducesResponseType(typeof(EngineDto), 200)]
[ProducesResponseType(404)]
public async Task<ActionResult> GetEngineById(int id)
{
EngineDto engine = await _vehicleService.GetEngineById(id);
return ApiResponse(engine);
}
}
}