README.md in haku-1.0.0 vs README.md in haku-1.1.0

- old
+ new

@@ -1,10 +1,10 @@ # Haku ![CI](https://github.com/javierav/haku/workflows/CI/badge.svg) -TODO: Write a better gem description. +A library for build simple service objects. ## Installation Add this line to your application's Gemfile: @@ -12,35 +12,224 @@ gem 'haku' ``` And then execute: - $ bundle install +```shell +bundle install +``` ## Usage -TODO: Write usage instructions here +### Basic example +````ruby +class Users::Update + include Haku::Core + + input :user, :attributes + on_success :send_email + + def call + if user.update(attributes) + success! resource: user + else + failure! resource: user, errors: user.errors + end + end + + private + + def send_email + UserMailer.with(user: user).update.deliver_later + end +end + +response = Users::Update.call(user: User.first, attributes: { name: "Javier" }) + +response.success? # => true +response.resource # => <User id="1" ...> +```` + +### Using resourceable helpers + +````ruby +class Users::Update + include Haku::Core + include Haku::Resourceable + + input :user, :attributes + on_success :send_email + + def call + update_resource(user, attributes) + end + + private + + def send_email + UserMailer.with(user: user).update.deliver_later + end +end +```` + +### Controller helpers + +```ruby +class UsersController < ApplicationController + before_action :find_user + + def update + execute Users::Update, user: @user, attributes: update_params + + if execution.success? + redirect_to user_path(execution.resource) + else + render :edit, errors: execution.errors + end + end + + private + + def find_user + @user = User.find(params[:id]) + end + + def update_params + params.require(:user).permit(:first_name, :last_name) + end +end +``` + +### Using eventable + +````ruby +class Users::Update + include Haku::Core + include Haku::Resourceable + include Haku::Eventable + + input :user, :attributes + event resource: :user + + def call + update_resource(user, attributes) + end +end + +Users::Update.call(user: User.first, attributes: { name: "Javier" }) + +# => call Event.create(name: "user:update", resource: User.first) +```` + +### Using parent class + +```ruby +class ApplicationAction + include Haku::Core + include Haku::Resourceable + include Haku::Eventable +end + +class Users::Update < ApplicationAction +end +``` + +## Configure + +### Example + +```ruby +# config/initializers/haku.rb + +Haku.configure do |config| + config.event_model = "EventLog" +end +``` + +### Allowed options + +| Config | Description | Default value | +|:-----------------------------------|:-------------------------------------------------------|:---------------------------------------------------------| +| `enable_in_action_controller_base` | Include controller helpers in `ActionController::Base` | `true` | +| `enable_in_action_controller_api` | Include controller helpers in `ActionController::API` | `true` | +| `event_model` | Name of the model used for create events | `Event` | +| `event_properties` | List of attributes passed from service to event model | `%i[actor resource target context]` | +| `event_property_for_name` | Property used for name in event model | `:name` | +| `event_name` | String or Proc to determine the event name | Custom Proc. Example: `user:created` for `Users::Create` | + + +## Resourceable + +This module include helpers to works with *ActiveRecord* compatible model resources, invoking `success!` or `failure!` +based in the result of the performed operation. + +### create_resource + +Call to `create` or `<singleton>_create` method of the `parent` object passing the `attributes` and storing +the result object in the `ivar` instance variable. Invoke `success!` if the model is persisted or `failure!` in other +case. + +| parameter | type | description | +|--------------|----------|------------------------------------------------------------------| +| `parent` | `Object` | Parent object where new resource will be created | +| `attributes` | `Hash` | Attributes for create | +| `ivar` | `Symbol` | Name of the instance variable used to access to the new resource | +| `options` | `Hash` | Options hash | + +#### options + +| parameter | type | description | +|-------------|----------|----------------------------------------------------------------------| +| `singleton` | `Symbol` | If the resource should be created using `<singleton>_create` suffix. | + +### update_resource + +Call to `update` method of the `resource` object passing `attributes`to it. Invoke `success!` if the model is updated or +`failure!` in other case. + +| parameter | type | description | +|--------------|----------|------------------------| +| `resource` | `Object` | Resource to be updated | +| `attributes` | `Hash` | Attributes to update | + +### destroy_resource + +Call to `destroy` method of the `resource`. Invoke `success!` if the model is destroyed or `failure!` in other case. + +| parameter | type | description | +|--------------|----------|--------------------------| +| `resource` | `Object` | Resource to be destroyed | + +### persist_resource + +| parameter | type | description | +|----------------|----------|---------------------------------------------| +| `resource` | `Object` | Resource to be destroyed | +| `save_options` | `Hash` | Options passed to `save` method of resource | + +For more info please view the [source code](lib/haku/resourceable.rb) of the module. + ## Development After checking out the repo, run `bin/setup` to install dependencies. Then, run `rake test` to run the tests. You can also run `bin/console` for an interactive prompt that will allow you to experiment. To install this gem onto your local machine, run `bundle exec rake install`. + To release a new version, update the version number in `version.rb`, and then run `bundle exec rake release`, which will create a git tag for the version, push git commits and the created tag, and push the `.gem` file to [rubygems.org](https://rubygems.org). ## Contributing -Bug reports and pull requests are welcome on GitHub at https://github.com/javierav/haku. This project is intended to be -a safe, welcoming space for collaboration, and contributors are expected to adhere to the -[code of conduct](https://github.com/javierav/haku/blob/development/CODE_OF_CONDUCT.md). +Bug reports and pull requests are welcome, please follow +[Github Flow](https://docs.github.com/en/get-started/quickstart/github-flow). ## Code of Conduct Everyone interacting in the Haku project's codebases, issue trackers, chat rooms and mailing lists is expected to follow the [code of conduct](https://github.com/javierav/haku/blob/development/CODE_OF_CONDUCT.md). ## License -The gem is available as open source under the terms of the [MIT License](https://opensource.org/licenses/MIT). +Copyright © 2022 Javier Aranda. Released under the terms of the [MIT license](LICENSE).