diff --git a/app/controllers/api/v1/restful_controller.rb b/app/controllers/api/v1/restful_controller.rb index 4cbed5db..1d25eea9 100644 --- a/app/controllers/api/v1/restful_controller.rb +++ b/app/controllers/api/v1/restful_controller.rb @@ -7,7 +7,7 @@ module Api snorlax_used_rest! load_and_authorize_resource only: [:show, :update, :destroy] - + def create instantiate_resource resource.user = current_user @@ -34,6 +34,18 @@ module Api "Api::V1::#{resource_name.camelize}Serializer".constantize end + def respond_with_resource(scope: default_scope, serializer: resource_serializer, root: serializer_root) + if resource.errors.empty? + render json: resource, scope: scope, serializer: serializer, root: root + else + respond_with_errors + end + end + + def respond_with_collection(resources: collection, scope: default_scope, serializer: resource_serializer, root: serializer_root) + render json: resources, scope: scope, each_serializer: serializer, root: root, meta: pagination(resources), meta_key: :page + end + def default_scope { embeds: embeds @@ -59,6 +71,40 @@ module Api def permitted_params @permitted_params ||= PermittedParams.new(params) end + + def serializer_root + 'data' + end + + def pagination(collection) + per = (params[:per] || 25).to_i + current_page = params[:page].to_i + total_pages = (collection.total_count / per).to_i + 1 + prev_page = current_page > 1 ? current_page - 1 : 0 + next_page = current_page < total_pages ? current_page + 1 : 0 + { + current_page: current_page, + next_page: next_page, + prev_page: prev_page, + total_pages: total_pages, + total_count: collection.total_count + } + end + + def instantiate_collection + collection = accessible_records + collection = yield collection if block_given? + collection = collection.page(params[:page]).per(params[:per]) + self.collection = collection + end + + def visible_records + policy_scope(resource_class) + end + + def public_records + policy_scope(resource_class) + end end end end diff --git a/app/serializers/api/v1/embeddable.rb b/app/serializers/api/v1/embeddable.rb new file mode 100644 index 00000000..8e166421 --- /dev/null +++ b/app/serializers/api/v1/embeddable.rb @@ -0,0 +1,32 @@ +module Api + module V1 + module Embeddable + def self.embeddable + {} + end + + def embeds + @embeds ||= (scope[:embeds] || []).select { |e| self.class.embeddable.keys.include?(e) } + end + + def self.inherited(child) + child.class_eval do + embeddable.each_pair do |key, opts| + attr = opts.delete(:attr) || key + binding.pry if key == :topic2 + if attr.to_s.pluralize == attr.to_s + attribute "#{attr.to_s.singularize}_ids".to_sym, opts.merge(unless: -> { embeds.include?(key) }) do + object.send(attr).map(&:id) + end + has_many attr, opts.merge(if: -> { embeds.include?(key) }) + else + id_opts = opts.merge(key: "#{key}_id") + attribute "#{attr}_id".to_sym, id_opts.merge(unless: -> { embeds.include?(key) }) + attribute key, opts.merge(if: -> { embeds.include?(key) }) + end + end + end + end + end + end +end diff --git a/config/initializers/active_model_serializers.rb b/config/initializers/active_model_serializers.rb new file mode 100644 index 00000000..aba3586b --- /dev/null +++ b/config/initializers/active_model_serializers.rb @@ -0,0 +1 @@ +ActiveModelSerializers.config.adapter = :json diff --git a/config/initializers/kaminari_config.rb b/config/initializers/kaminari_config.rb new file mode 100644 index 00000000..b1d87b01 --- /dev/null +++ b/config/initializers/kaminari_config.rb @@ -0,0 +1,10 @@ +Kaminari.configure do |config| + # config.default_per_page = 25 + # config.max_per_page = nil + # config.window = 4 + # config.outer_window = 0 + # config.left = 0 + # config.right = 0 + # config.page_method_name = :page + # config.param_name = :page +end diff --git a/config/routes.rb b/config/routes.rb index 476d1942..743370c6 100644 --- a/config/routes.rb +++ b/config/routes.rb @@ -11,10 +11,10 @@ Metamaps::Application.routes.draw do namespace :api, path: '/api', default: { format: :json } do namespace :v1, path: '/v1' do - resources :maps, only: [:create, :show, :update, :destroy] - resources :synapses, only: [:create, :show, :update, :destroy] - resources :topics, only: [:create, :show, :update, :destroy] - resources :mappings, only: [:create, :show, :update, :destroy] + resources :maps, only: [:index, :create, :show, :update, :destroy] + resources :synapses, only: [:index, :create, :show, :update, :destroy] + resources :topics, only: [:index, :create, :show, :update, :destroy] + resources :mappings, only: [:index, :create, :show, :update, :destroy] resources :tokens, only: [:create, :destroy] do get :my_tokens, on: :collection end