это выглядит типа (оч сырой код, не ругайтесь)
def call
logger.debug('>>> CreateOrderTransaction start...')
params = yield validate
order = yield persist(input)
yield pay(order)
notify(order)
logger.debug('>>> CreateOrderTransaction finish...')
response = serializer.call(order)
Success(response)
end
и не всегда все может обойтись ролбэком в базе, иногда должны вызываться сервисы с более сложной логикой, например пересчет какой, сторонние сервисы
ты типа хочешь если операция Failure то выполнить действие? У Result монад есть метод or Один из вариантов - def persist(params) Try[ActiveRecord::RecordInvalid] do repository.create!(params) end.to_result.or { |err| # Тут вызов ролбэка } end Можно свой враппер для этого написать и переиспользовать, если не нравится синтаксис
транзакция базы данных, а внутри блока монады
кстати, думаю что serializer это не слой для UseCases, а скорее presenter слой Типа контроллер -> input model -> use case -> output model (serializer, view, presenter ...) но это чисто мое имхо, тут у всех свой подход
Обсуждают сегодня