OpenAPIRest
This gem aims to provide an easier way to implement REST api endpoints using OpenAPI specs in a Rails project.
Installation
Add this line to your application's Gemfile:
gem 'openapi_rest'
And then execute:
$ bundle install
Now, generate the initializer:
$ rails g openapi_rest:install
Usage
Place your OpenAPI spec yml file in config/
, see example generators/templates/api_docs.yml
. The file needs to be formatted in OpenAPI v2.0. You can then use OpenAPIRest::ApiModel
directly from a controller. Example:
class Product < ActiveRecord::Base
end
module Api
module V1
class MyController < ActionController::Base
def index
response = OpenAPIRest::ApiModel.new(:product).where(params)
render_rest response
end
def show
response = OpenAPIRest::ApiModel.new(:product).find(params, id: params[:id])
if response.results?
render_rest response
end
end
def update
response = OpenAPIRest::ApiModel.new(:product).find(params, id: params[:id])
if response.results?
response.update_resource
render_rest response
end
end
def create
response = OpenAPIRest::ApiModel.new(:product).build(params, extra_param_ids: store.id)
response.create_resource
render_rest response
end
def destroy
response = OpenAPIRest::ApiModel.new(:product).find(params, id: params[:id])
if response.results?
response.delete_resource
render_rest response
end
end
end
end
end
render_rest
is a custom method that takes a QueryResponse
object to be rendered.
Last but not least, we need to tell to the Rails app which routes will be using the openapi parsing and if the routes have any namespace with the following syntax:
scope module: :api, defaults: { format: 'json' }, openapi: true, namespace: 'api' do
scope module: :v1 do
resources :myresources, only: [:index, :show]
end
end
Adding a Custom Filter
Create a wrapper object that inherits from OpenAPIRest::ApiModel
if you need custom filter. From the ApiModel you will have access to the @model
class variable which is the original AR model.
Example:
module Api
class MyFilteredApiModel < OpenAPIRest::ApiModel
def filter(params)
@model = model.where('mymodelname.updated_at > ?', params[:date_param])
end
end
end
On the Controller side:
module Api
module V1
class MyController < ActionController::Base
def index
response = Api::MyFilteredApiModel.new(:product).where(params) do |wrapper|
wrapper.filter(params)
end
render_rest response
end
end
end
end
Contributing
Bug reports and pull requests are welcome on GitHub at https://github.com/bizimply/OpenAPI-Rails-REST
License
The gem is available as open source under the terms of the MIT License.