KWork é uma biblioteca para a construção de transações comerciais em Ruby projetado para:
Kwork::Result
, Dry::Monads::Result
, Dry::Monads::Maybe
...).ROM
, ActiveRecord
...). Adicione esta linha ao GemFile do seu aplicativo:
gem 'kwork' , github : 'waiting-for-dev/kwork'
E depois execute:
$ bundle install
Usando dry-auto_inject
& dry-monads
.
require "kwork"
class CheckOutOrder
include Kwork [ adapter : :result ]
include Deps [ :update_line_items , :update_order , :calculate_best_prices , :enqueue_order_completed_email ]
def call ( order_id , attrs )
attrs = step validate ( attrs )
line_items = step update_line_items . ( order_id , attrs [ :line_items ] )
order = step update_order . ( order_id , attrs . except ( :line_items ) )
step calculate_best_prices . ( order : , line_items : )
step enqueue_order_completed_email . ( order )
success ( order )
end
private
def validate ( attrs )
# ...
end
end
include Dry :: Monads [ :result ]
case CheckoutOrder . new
in Success [ message ]
puts message
in Failure [ error ]
puts error
end
Você pode aproveitar transacto para usar elegantemente o padrão ferroviário para transformação de dados ou todo o fluxo de trabalho transacional. Por enquanto, ele só funciona com Dry::Monads::Result
Adapter:
class CreateUser
include Kwork [ adapter : :result ]
include Deps [ "user_repo" , "validate_user" ]
include Dry :: Monads [ :result ]
DEFAULT_USER_ATTRS = {
country : :us ,
currency : :usd
}
def call ( user_attrs )
user = pipe user_attrs ,
merge ( DEFAULT_USER_ATTRS ) ,
method ( :validate_user )
step create_user ( user )
end
private
def create_user ( user )
Success ( user_repo . create ( user ) )
end
end
Na maioria das vezes, uma transação comercial precisa ser envolvida em uma transação de banco de dados. Para apoiar esse caso de uso, o KWork oferece a capacidade de estender o retorno de chamada da transação para que você possa envolvê -lo com seu próprio código. Algumas extensões são enviadas por padrão, mas você pode construir facilmente o seu.
Você precisa adicionar ROM ao seu Gemfile
para usá -lo. Quando essa extensão é usada, a transação KWork é envolvida em uma transação de banco de dados, que é revertida no caso de retornar uma falha.
require "kwork"
require "kwork/extensions/rom"
rom = # ROM container
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ROM [ rom , :default ] # :default is the name of the gateway
]
# ...
end
Em uma aplicação do Rails, você pode usar a extensão ActiveRecord. A transação RAW KWork será envolvida em uma transação de banco de dados e será revertida em caso de retornar uma falha.
require "kwork"
require "kwork/extensions/active_record"
class AddUser
include Kwork [
extension : Kwork :: Extensions :: ActiveRecord
]
# ...
end
Extensões personalizadas são apenas qualquer coisa que responda a #call
aceitando o retorno de chamada da transação KWork. Você só precisa garantir que você responda o resultado da execução desse retorno de chamada. Leve em consideração que o retorno de chamada retornará uma instância do Kwork::Result
, independentemente do adaptador em uso. Isso garante totalmente operabilidade com qualquer tipo de resultado.
require "kwork"
MyExtension = lambda do | callback |
callback . ( ) . tap do | result |
do_something if result . success?
end
end
class AddUser
include Kwork [
extension : MyExtension
]
# ...
end
Depois de verificar o repositório, execute bin/setup
para instalar dependências. Em seguida, execute rake spec
para executar os testes. Você também pode executar bin/console
para um prompt interativo que permitirá experimentar.
Para instalar esta gema na sua máquina local, execute bundle exec rake install
. Para lançar uma nova versão, atualize o número da versão no version.rb
e, em seguida, execute bundle exec rake release
, que criará uma tag git para a versão, push git cometidos e a tag criada e pressionará o arquivo .gem
para os rubygems. org.
Relatórios de bug e solicitações de puxão são bem -vindos no github em https://github.com/ponusername ]/kwork. Este projeto deve ser um espaço seguro e acolhedor para a colaboração, e os colaboradores devem aderir ao Código de Conduta.
A GEM está disponível como código aberto nos termos da licença do MIT.
Todos interagindo nas bases de código do KWork Project, rastreadores de emissão, salas de bate -papo e listas de discussão devem seguir o código de conduta.