lib/pragma/operation/index.rb in pragma-1.2.6 vs lib/pragma/operation/index.rb in pragma-2.0.0
- old
+ new
@@ -1,116 +1,34 @@
# frozen_string_literal: true
+
+require 'trailblazer/dsl'
+
module Pragma
module Operation
- # Finds all records of the requested resource, authorizes them, paginates them and returns
- # the decorated collection.
+ # Finds all records of the requested resource, authorizes them, paginates them and decorates
+ # them.
#
# @author Alessandro Desantis
class Index < Pragma::Operation::Base
- include Pragma::Operation::Defaults
+ step Macro::Classes()
+ step :retrieve!
+ step :scope!
+ step Macro::Pagination(), fail_fast: true
+ step Macro::Decorator(name: :collection), fail_fast: true
+ step :respond!
- def call
- context.records = authorize_collection(find_records)
-
- begin
- context.records = context.records.paginate(page: page, per_page: per_page)
- rescue RangeError => e
- respond_with!(
- status: :bad_request,
- resource: {
- error_type: :invalid_page,
- error_message: e.message
- }
- )
- end
-
- respond_with(
- resource: decorate(context.records),
- status: :ok,
- headers: {
- 'Page' => context.records.current_page.to_i,
- 'Per-Page' => context.records.per_page,
- 'Total' => context.records.total_entries
- },
- links: {
- first: build_page_url(1),
- last: build_page_url(context.records.total_pages),
- next: (build_page_url(context.records.next_page) if context.records.next_page),
- prev: (build_page_url(context.records.previous_page) if context.records.previous_page)
- }
- )
+ def retrieve!(options)
+ options['model'] = options['model.class'].all
end
- protected
-
- # Finds all the records. By default, calls +.all+ on the model class, which is inferred from
- # the operation's namespace (e.g. +API::V1::Post::Operation::Index+ will retrieve all records
- # of the +Post+ model).
- #
- # @return [Enumerable]
- def find_records
- self.class.model_klass.all
+ def scope!(options, current_user:, model:, **)
+ options['model'] = options['policy.default.scope.class'].new(current_user, model).resolve
end
- # Returns the name of the page parameter.
- #
- # @return [Symbol]
- def page_param
- :page
- end
-
- # Returns the page number. By default, this is the page parameter or 1 if it is empty.
- #
- # @return [Fixnum]
- #
- # @see #page_param
- def page
- return 1 if !params[page_param] || params[page_param].empty?
- params[page_param].to_i
- end
-
- # Returns the name of the per_page param.
- #
- # @return [Symbol]
- def per_page_param
- :per_page
- end
-
- # Returns the default number of records per page.
- #
- # @return [Fixnum]
- def default_per_page
- 30
- end
-
- # Returns the maximum number of records per page.
- #
- # @return [Fixnum]
- def max_per_page
- 100
- end
-
- # Returns the number of records to include per page. By default, this is the +per_page+
- # parameter, up to a maximum of {#max_per_page} records, or {#default_per_page} if the
- # parameter is not present.
- #
- # @return [Fixnum]
- #
- # @see #default_per_page
- # @see #max_per_page
- # @see #per_page_param
- def per_page
- return default_per_page if !params[per_page_param] || params[per_page_param].empty?
- params[per_page_param].to_i > max_per_page ? max_per_page : params[per_page_param].to_i
- end
-
- # Builds the URL to a specific page in the collection.
- #
- # @param page [Fixnum] a page number
- #
- # @return [String]
- def build_page_url(_page)
- nil
+ def respond!(options, model:, **)
+ options['result.response'] = Response::Ok.new(
+ entity: options['result.decorator.collection']
+ )
end
end
end
end