Add this line to Gemfile
.
gem 'zazo-tools', github: 'noplanb/zazo-tools', tag: '1.0.0', require: 'zazo'
# app/controllers/api_controller.rb
class ApiController < ActionController::Base
include Zazo::Controller::Interactions
attr_reader :current_user # current_user will be passed to interactor as user
end
# app/controllers/api/v1/things_controller.rb
class Api::V1::ThingsController < ApiController
def index
handle_interactor(:render,
Index.run(interactor_params))
end
def show
handle_interactor(:render,
Show.run(interactor_params(:id)))
end
def create
handle_interactor([:render, result: false],
Create.run(interactor_params(:some, :params, :you, :need)))
end
def update
handle_interactor([:render, result: false],
Update.run(interactor_params(:id, :some, :params, :you, :need)))
end
def destroy
handle_interactor([:render, result: false],
Destroy.run(interactor_params(:id)))
end
end
# app/interactions/api/v1/things_controller/index.rb
class Api::V1::ThingsController::Index < ActiveInteraction::Base
object :user
def execute
user.things
end
end
This simple component allows to decorate model with multiple decorators.
# app/model/user.rb
class User
include Zazo::Model::Decorator::Decoratable
attr_accessor :id, :name
end
# app/model/user/decorators/inspector.rb
class User::Decorators::Inspector < Zazo::Model::Decorator
def inspect
"user ##{id} with name #{name}"
end
end
# app/model/user/decorators/greeter.rb
class User::Decorators::Greeter < Zazo::Model::Decorator
def greet
"Hello! I'm #{name}"
end
end
user = User.new
user.id = 666
user.name = 'Bruce'
user = user.decorate_with(:inspector, :greeter)
user.greet # => "Hello! I'm Bruce"
user.inspect # => "user #666 with name Bruce"
user.model.inspect # => "#<Userd:0x007ff529d515d0 @id=666, @name=\"Bruce\">"
This rack middleware returns static files (e.g. api documentation) bypassing rails stack. It works with basic authentication and returns files from docs
folder.
You can override default credentials (docs:password) for basic auth via http_documentation_username
and http_documentation_password
environment variables.
# config/application.rb
.....
.....
module ZazoApp
class Application < Rails::Application
.....
.....
.....
config.middleware.insert 0, Zazo::Tools::Middleware::RequestDocs
end
end
Before configuration you should setup AWS_REGION (e.g. us-west-1) environment variable.
# config/initializers/zazo_event_dispatcher.rb
Zazo::Tools::EventDispatcher.configure do |config|
config.send_message_enabled = true # default
config.queue_url = 'https://sqs-worker.dev/' # required
config.logger = Rails.logger # optional
end
# also you can enable/disable sending messages directly
Zazo::Tools::EventDispatcher.enable_send_message!
Zazo::Tools::EventDispatcher.disable_send_message!
# config/initializers/zazo_logger.rb
Zazo::Tools::Logger.configure do |config|
config.local_enabled = true # default is true if rails gem in usage
config.rollbar_enabled = true # default is true if rollbar gem in usage
config.logstash_enabled = true # default is false
config.logstash_host = 'logstash.dev' # required
config.logstash_port = 9900 # required
config.project_name = 'zazo' # required
config.environment = 'production' # default is Rails.env if rails gem in usage
end
Zazo::Tools::Logger.info(Object, 'what happens?')
Zazo::Tools::Logger.debug(Object, 'debugging information')
Zazo::Tools::Logger.error(Object, 'something was wrong', rollbar: true)
Build class by array of parts.
Zazo::Tool::Classifier.new([:zazo, :tool, :classifier]).klass == Zazo::Tool::Classifier # => true
# lib/some_service_api.rb
class SomeServiceApi < Zazo::Tool::ServiceApiWrapper
version 1
base_uri 'http://some-service.dev'
digest_auth 'client', 'token'
mapper filter: { action: :get, prefix: 'fetch/filters' },
create: { action: :post },
default: { action: :get, prefix: '' }
end
# GET http://some-service.dev/api/v1/fetch/filters/users
SomeServiceApi.new.filter(:users)
# GET http://some-service.dev/api/v1/fetch/filters/groups
SomeServiceApi.new.filter(:groups)
# POST http://some-service.dev/api/v1/users with body params
SomeServiceApi.new(some: 'some', params: 'params').create(:users)