/// <response code="200">Found and deleted the record</response>
/// <response code="400">Bad request</response>
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status400BadRequest)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(400, "The request was invalid")]
[HttpDelete("{id}")]
public ActionResult<T> DeleteOne(int id, T entity)
{
if (id != entity.Id)
{
return BadRequest();
}
try
{
MainRepo.Delete(entity);
}
catch (Exception ex)
{
// Должно обрабатываться более элегантно.
return new BadRequestObjectResult(ex.GetBaseException()?.Message);
}
return Ok();
}
Метод начинается с определения маршрута как запроса
HttpDelete
с обязательным параметром маршрута
id
. Значение
id
в маршруте сравнивается со значением
id
, отправленным с остальной частью сущности в теле запроса, и если они не совпадают, то возвращается код 400 (Bad Request). Если хранилище успешно удаляет запись, тогда клиенту возвращается код 200 (ОК), а если возникла какая-то ошибка, то клиент получает код 400 (Bad Request).
На этом создание базового контроллера завершено.
Класс CarsController
Приложению
AutoLot.Api
необходим дополнительный метод
HttpGet
для получения записей
Car
на основе значения
Make
. Он будет создан в новом классе по имени
CarsController
. Создайте в каталоге
Controllers
новый пустой контроллер API под названием
CarsController
. Модифицируйте операторы
using
следующим образом:
using System.Collections.Generic;
using AutoLot.Api.Controllers.Base;
using Microsoft.AspNetCore.Mvc;
using AutoLot.Models.Entities;
using AutoLot.Dal.Repos.Interfaces;
using AutoLot.Services.Logging;
using Microsoft.AspNetCore.Http;
using Swashbuckle.AspNetCore.Annotations;
Класс
CarsController
является производным от класса
BaseCrudController
и определяет маршрут на уровне контроллера. Конструктор принимает специфичное для сущности хранилище и средство ведения журнала. Вот первоначальный код контроллера:
namespace AutoLot.Api.Controllers
{
[Route("api/[controller]")]
public class CarsController : BaseCrudController<Car, CarsController>
{
public CarsController(ICarRepo carRepo, IAppLogging<CarsController> logger) :
base(carRepo, logger)
{
}
}
}
Класс
CarsController
расширяет базовый класс еще одним методом действия, который получает все записи об автомобилях конкретного производителя. Добавьте показанный ниже код:
/// <summary>
/// Gets all cars by make
/// </summary>
/// <returns>All cars for a make</returns>
/// <param name="id">Primary key of the make</param>
/// <response code="200">Returns all cars by make</response>
[Produces("application/json")]
[ProducesResponseType(StatusCodes.Status200OK)]
[ProducesResponseType(StatusCodes.Status204NoContent)]
[SwaggerResponse(200, "The execution was successful")]
[SwaggerResponse(204, "No content")]
[HttpGet("bymake/{id?}")]
public ActionResult<IEnumerable<Car>> GetCarsByMake(int? id)
{
if (id.HasValue && id.Value>0)
{
return Ok(((ICarRepo)MainRepo).GetAllBy(id.Value));
}
return Ok(MainRepo.GetAllIgnoreQueryFilters());
}
Атрибут
HttpGet
расширяет маршрут константой
bymake
и необязательным идентификатором производителя для фильтрации, например:
https://localhost:5021/api/cars/bymake/5
Сначала в методе проверяется, было ли передано значение для
id
. Если нет, то получаются все автомобили. Если значение было передано, тогда с использованием метода
GetAllBy()
класса
CarRepo
получаются автомобили по производителю. Поскольку защищенное свойство
MainRepo
базового класса определено с типом
IRepo<T>
, его потребуется привести к типу
ICarRepo
.