diff options
Diffstat (limited to 'app/serializers/paginated_diff_entity.rb')
-rw-r--r-- | app/serializers/paginated_diff_entity.rb | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/app/serializers/paginated_diff_entity.rb b/app/serializers/paginated_diff_entity.rb new file mode 100644 index 00000000000..622da926c69 --- /dev/null +++ b/app/serializers/paginated_diff_entity.rb @@ -0,0 +1,50 @@ +# frozen_string_literal: true + +# Serializes diffs with pagination data. +# +# Avoid adding more keys to this serializer as processing the +# diff file serialization is not cheap. +# +class PaginatedDiffEntity < Grape::Entity + include RequestAwareEntity + + expose :diff_files do |diffs, options| + submodule_links = Gitlab::SubmoduleLinks.new(merge_request.project.repository) + DiffFileEntity.represent(diffs.diff_files, options.merge(submodule_links: submodule_links)) + end + + expose :pagination do + expose :current_page + expose :next_page + expose :total_pages + expose :next_page_href do |diffs| + next unless next_page + + project = merge_request.target_project + + diffs_batch_namespace_project_json_merge_request_path( + namespace_id: project.namespace.to_param, + project_id: project.to_param, + id: merge_request.iid, + page: next_page, + format: :json + ) + end + end + + private + + %i[current_page next_page total_pages].each do |method| + define_method method do + pagination_data[method] + end + end + + def pagination_data + options.fetch(:pagination_data, {}) + end + + def merge_request + options[:merge_request] + end +end |