Я новичок в создании API. Мой проект содержит три типичных уровня: контроллеры, службы, отвечающие за бизнес-логику c, и репозитории, которые обращаются к данным. Каждый запрос, поступающий на мои контроллеры, должен пройти go через некоторый процесс проверки перед выполнением определенного действия c. Для примера, пожалуйста, проверьте код ниже:
[HttpPost]
public async Task<ActionResult<TicketDTO>> CreateTicketAsync([FromBody] CreateTicketDTO ticket)
{
try
{
if (ticket.Events == null)
{
return BadRequest(new {Message = _localizer["LackOfEventsErrorMessage"].Value});
}
var user = await _userService.GetUserByIdAsync(ticket.UserId);
if (user == null)
{
return NotFound(new { Message = _localizer["UserNotFoundErrorMessage", ticket.UserId].Value });
}
var invalidTicket = await _ticketService.CheckHasUserPlayedAnyOfGamesBeforeAsync(ticket);
if (invalidTicket)
{
return BadRequest(new { Message = _localizer["EventsRepeatedByUserErrorMessage"].Value });
}
var createdTicket = await _ticketService.AddTicketAsync(ticket);
if (createdTicket == null)
{
return BadRequest(new { Message = _localizer["TicketNotCreatedErrorMessage"].Value });
}
return CreatedAtAction(nameof(GetTicketById), new {ticketId = createdTicket.TicketId}, createdTicket);
}
catch (Exception ex)
{
return StatusCode(StatusCodes.Status500InternalServerError,
new
{
Message = ex.InnerException != null
? $"{ex.Message} {ex.InnerException.Message}"
: ex.Message
});
}
}
Это один из моих методов контроллера. Прежде чем билет сохраняется в базе данных, он должен пройти несколько проверок. Владелец билета должен существовать, если нет, то я возвращаюсь, пользователь не найден и т. Д. c. Проблема в том, что мне не очень нравится такой способ проверки запросов. Метод грязный и не очень читабельный. Я хотел бы знать, что является хорошим подходом для проверки запросов и правильно реагировать, если что-то пошло не так (например, вернуть «UserNotFoundErrorMessage», если в базе данных нет пользователя, и т. Д. c. Один блок перехвата не решает мою проблему) Я тоже не хотел бы, чтобы там было несколько блоков catch, это также грязно, я думаю. Я ошибаюсь?) Интересно, нарушает ли прикрепленный фрагмент некоторые правила чистого кода или нет? Как должен выглядеть код? Что я делаю не так?