From df2b1e53a9fc1d1a25b9afafc205ff03433c938d Mon Sep 17 00:00:00 2001 From: Alex Kriuchykhin Date: Tue, 8 Apr 2025 09:26:01 +0200 Subject: [PATCH] Add includes for connected parent/child inventory items to inventory item V1 serializer [SCI-11769] (#8401) --- Gemfile | 3 +-- Gemfile.lock | 5 ++--- app/controllers/api/v1/inventory_items_controller.rb | 2 +- .../api/v1/connected_inventory_item_serializer.rb | 9 +++++++++ app/serializers/api/v1/inventory_item_serializer.rb | 4 ++++ .../api/v1/inventory_items_controller_spec.rb | 12 +++++++----- 6 files changed, 24 insertions(+), 11 deletions(-) create mode 100644 app/serializers/api/v1/connected_inventory_item_serializer.rb diff --git a/Gemfile b/Gemfile index acd42d10b..54f563bfb 100644 --- a/Gemfile +++ b/Gemfile @@ -29,8 +29,7 @@ gem 'omniauth-rails_csrf_protection', '~> 1.0' gem 'omniauth-saml' # Gems for API implementation -gem 'active_model_serializers', '~> 0.10.7' -gem 'jsonapi-renderer', '~> 0.2.2' +gem 'active_model_serializers', '~> 0.10.15' gem 'json-jwt' gem 'jwt', '~> 1.5' gem 'kaminari' diff --git a/Gemfile.lock b/Gemfile.lock index 0e5e41069..46a66a27f 100644 --- a/Gemfile.lock +++ b/Gemfile.lock @@ -88,7 +88,7 @@ GEM erubi (~> 1.4) rails-dom-testing (~> 2.0) rails-html-sanitizer (~> 1.1, >= 1.2.0) - active_model_serializers (0.10.14) + active_model_serializers (0.10.15) actionpack (>= 4.1) activemodel (>= 4.1) case_transform (>= 0.2) @@ -768,7 +768,7 @@ PLATFORMS x86_64-linux DEPENDENCIES - active_model_serializers (~> 0.10.7) + active_model_serializers (~> 0.10.15) activerecord-import activerecord-session_store acts_as_list @@ -817,7 +817,6 @@ DEPENDENCIES jsbundling-rails json-jwt json_matchers - jsonapi-renderer (~> 0.2.2) jwt (~> 1.5) kaminari listen diff --git a/app/controllers/api/v1/inventory_items_controller.rb b/app/controllers/api/v1/inventory_items_controller.rb index d66d966d4..46649f87f 100644 --- a/app/controllers/api/v1/inventory_items_controller.rb +++ b/app/controllers/api/v1/inventory_items_controller.rb @@ -132,7 +132,7 @@ module Api end def permitted_includes - %w(inventory_cells) + %w(inventory_cells parents children) end end end diff --git a/app/serializers/api/v1/connected_inventory_item_serializer.rb b/app/serializers/api/v1/connected_inventory_item_serializer.rb new file mode 100644 index 000000000..87a3e0733 --- /dev/null +++ b/app/serializers/api/v1/connected_inventory_item_serializer.rb @@ -0,0 +1,9 @@ +# frozen_string_literal: true + +module Api + module V1 + class ConnectedInventoryItemSerializer < InventoryItemSerializer + belongs_to :repository, key: :inventory, serializer: InventorySerializer + end + end +end diff --git a/app/serializers/api/v1/inventory_item_serializer.rb b/app/serializers/api/v1/inventory_item_serializer.rb index 28e7cdb0d..f65375322 100644 --- a/app/serializers/api/v1/inventory_item_serializer.rb +++ b/app/serializers/api/v1/inventory_item_serializer.rb @@ -13,6 +13,10 @@ module Api serializer: InventorySerializer, class_name: 'Repository', if: -> { instance_options[:show_repository] } + has_many :parent_repository_rows, key: :parents, + serializer: Api::V1::ConnectedInventoryItemSerializer + has_many :child_repository_rows, key: :children, + serializer: Api::V1::ConnectedInventoryItemSerializer include TimestampableModel end diff --git a/spec/requests/api/v1/inventory_items_controller_spec.rb b/spec/requests/api/v1/inventory_items_controller_spec.rb index e4e170b37..70bc20fc9 100644 --- a/spec/requests/api/v1/inventory_items_controller_spec.rb +++ b/spec/requests/api/v1/inventory_items_controller_spec.rb @@ -42,6 +42,9 @@ RSpec.describe 'Api::V1::InventoryItemsController', type: :request do { repository_row: row, repository_column: file_column }) end + @child_inventory_item = create(:repository_row, repository: @valid_inventory, created_by: @user) + @child_connection = create(:repository_row_connection, parent: @valid_inventory.repository_rows.first, child: @child_inventory_item, created_by: @user) + @valid_headers = { 'Authorization': 'Bearer ' + generate_token(@user.id), 'Content-Type': 'application/json' } @@ -85,7 +88,7 @@ RSpec.describe 'Api::V1::InventoryItemsController', type: :request do get api_v1_team_inventory_items_path( team_id: @team1.id, inventory_id: @team1.repositories.first.id, - include: 'inventory_cells' + include: 'inventory_cells,parents,children' ), headers: @valid_headers expect { hash_body = json }.not_to raise_exception expect(hash_body[:data]).to match_array( @@ -102,7 +105,7 @@ RSpec.describe 'Api::V1::InventoryItemsController', type: :request do ActiveModelSerializers::SerializableResource .new(@valid_inventory.repository_rows.order(:id).limit(10), each_serializer: Api::V1::InventoryItemSerializer, - include: :inventory_cells) + include: %w(inventory_cells parents children)) .to_json )['included'] ) @@ -118,9 +121,8 @@ RSpec.describe 'Api::V1::InventoryItemsController', type: :request do expect(hash_body[:data]).to match_array( JSON.parse( ActiveModelSerializers::SerializableResource - .new(@valid_inventory.repository_rows.limit(100), - each_serializer: Api::V1::InventoryItemSerializer, - include: :inventory_cells) + .new(@valid_inventory.repository_rows.order(:id).limit(100), + each_serializer: Api::V1::InventoryItemSerializer) .to_json )['data'] )