module CrudService::Api

This mixin provides a static methods to configure a sinatra class with the provided resource name, service and api_options

Public Instance Methods

crud_api(resource_name, service_name, primary_key_name, api_options = {}) click to toggle source

Set up full CRUD API functionality on the given resource

# File lib/crud-service/api.rb, line 6
def crud_api(resource_name, service_name, primary_key_name, api_options = {})
  api_options = get_defaults(api_options)

  crud_options(resource_name, api_options) if api_options[:enable_options]

  if api_options[:enable_write]
    crud_post(resource_name, service_name, primary_key_name, api_options) if api_options[:enable_post]
    crud_put(resource_name, service_name, primary_key_name, api_options)  if api_options[:enable_put]
    crud_delete(resource_name, service_name, primary_key_name, api_options) if api_options[:enable_delete]
  end

  if api_options[:enable_read]
    crud_get(resource_name, service_name, primary_key_name, api_options) if api_options[:enable_get]
    crud_get_all(resource_name, service_name, api_options) if api_options[:enable_get_all]
  end
end
crud_delete(resource_name, service_name, primary_key_name, api_options = {}) click to toggle source

Set up DELETE functionality on the given resource

# File lib/crud-service/api.rb, line 92
def crud_delete(resource_name, service_name, primary_key_name, api_options = {})
  api_options = get_defaults(api_options)
  delete '/'+resource_name+'/:'+primary_key_name do
    service = settings.send(service_name)

    # Must Exist
    return 404 unless service.exists_by_primary_key?(params[primary_key_name.to_sym])

    # Do Delete
    return 500 unless service.delete_by_primary_key(params[primary_key_name.to_sym])

    204
  end
end
crud_get(resource_name, service_name, primary_key_name, api_options = {}) click to toggle source

Set up GET/get_one functionality on the given resource

# File lib/crud-service/api.rb, line 62
def crud_get(resource_name, service_name, primary_key_name, api_options = {})
  api_options = get_defaults(api_options)
  get '/'+resource_name+'/:'+primary_key_name do
    service = settings.send(service_name)

    sanitize_params(params)
    return 400 unless service.valid_query?(params)

    record = service.get_one_by_query(params)
    return 404 if record.nil?
    JSON.fast_generate record
  end
end
crud_get_all(resource_name, service_name, api_options = {}) click to toggle source

Set up GET/get_all functionality on the given resource

# File lib/crud-service/api.rb, line 77
def crud_get_all(resource_name, service_name, api_options = {})
  api_options = get_defaults(api_options)
  get '/'+resource_name do
    service = settings.send(service_name)

    sanitize_params(params)
    # Check query validity
    return 400 unless service.valid_query?(params)

    # Return Regions on Query
    JSON.fast_generate service.get_all_by_query(params)
  end
end
crud_options(resource_name, api_options = {}) click to toggle source

Set up OPTIONS functionality on the given resource

# File lib/crud-service/api.rb, line 24
def crud_options(resource_name, api_options = {})
  api_options = get_defaults(api_options)
  options '/'+resource_name do
    204
  end
end
crud_post(resource_name, service_name, primary_key_name, api_options = {}) click to toggle source

Set up POST/insert functionality on the given resource

# File lib/crud-service/api.rb, line 108
def crud_post(resource_name, service_name, primary_key_name, api_options = {})
  api_options = get_defaults(api_options)
  post '/'+resource_name do
    service = settings.send(service_name)

    # Get The data
    begin
      data = JSON.parse(request.body.read)
    rescue Exception => e
      return 422
    end

    # Valid POST?
    return 422 unless service.valid_insert?(data)

    # Already Exists?
    return 409 if service.exists_by_primary_key?(data[primary_key_name])

    # Do Insert
    record = service.insert(data)

    # Other Error
    return 500 if record.nil?

    # Output new record
    JSON.fast_generate record
  end
end
crud_put(resource_name, service_name, primary_key_name, api_options = {}) click to toggle source

Set up UPDATE/put functionality on the given resource

# File lib/crud-service/api.rb, line 32
def crud_put(resource_name, service_name, primary_key_name, api_options = {})
  api_options = get_defaults(api_options)
  put '/'+resource_name+'/:'+primary_key_name do
    service = settings.send(service_name)

    # Must Exist
    return 404 unless service.exists_by_primary_key?(params[primary_key_name.to_sym])

    # Get The Data
    begin
      data = JSON.parse(request.body.read)
    rescue Exception => e
      return 422
    end

    # Valid Update?
    return 422 unless service.valid_update?(data)

    # Do Update
    record = service.update_by_primary_key(params[primary_key_name.to_sym],data)

    # Other Error
    return 500 if record.nil?

    # Return new Region
    JSON.fast_generate record
  end
end
get_defaults(api_options) click to toggle source

Return the given options with defaults set

# File lib/crud-service/api.rb, line 138
def get_defaults(api_options)
  defaults = {
    :enable_read => true,
    :enable_write => true,
    :enable_options => true,
    :enable_get_all => true,
    :enable_get => true,
    :enable_post => true,
    :enable_put => true,
    :enable_delete => true,
  }
  api_options.merge!(defaults) { |key, v1, v2| v1 }
end