From 9e9f8ab402b239d405fe7edffcb6df370e5045eb Mon Sep 17 00:00:00 2001 From: Alex Kriuchykhin Date: Fri, 24 Nov 2023 14:21:11 +0100 Subject: [PATCH] Add external_id field to repository list and checklist items [SCI-9454] (#6702) --- app/models/repository_stock_value.rb | 4 +-- config/initializers/extends.rb | 2 ++ config/initializers/preload_stis.rb | 7 ++++ ..._external_id_to_repository_column_items.rb | 35 +++++++++++++++++++ db/schema.rb | 8 ++++- .../api/v1/inventory_cells_controller_spec.rb | 12 +++++-- 6 files changed, 62 insertions(+), 6 deletions(-) create mode 100644 config/initializers/preload_stis.rb create mode 100644 db/migrate/20231107163821_add_external_id_to_repository_column_items.rb diff --git a/app/models/repository_stock_value.rb b/app/models/repository_stock_value.rb index c0ba13806..e727a5960 100644 --- a/app/models/repository_stock_value.rb +++ b/app/models/repository_stock_value.rb @@ -111,7 +111,7 @@ class RepositoryStockValue < ApplicationRecord self.repository_stock_unit_item = repository_cell .repository_column .repository_stock_unit_items - .find(new_data[:unit_item_id]) + .find_by(id: new_data[:unit_item_id]) self.last_modified_by = user new_amount = new_data[:amount].to_d delta = new_amount - amount.to_d @@ -157,7 +157,7 @@ class RepositoryStockValue < ApplicationRecord value.repository_stock_unit_item = value.repository_cell .repository_column .repository_stock_unit_items - .find(payload['unit_item_id']) + .find_by(id: payload['unit_item_id']) value else raise ActiveRecord::RecordInvalid, 'Missing amount value' diff --git a/config/initializers/extends.rb b/config/initializers/extends.rb index b6fe05ec3..e665c3f59 100644 --- a/config/initializers/extends.rb +++ b/config/initializers/extends.rb @@ -144,6 +144,8 @@ class Extends RepositoryStockValue ) + STI_PRELOAD_CLASSES = %w(LinkedRepository) + # Array of preload relations used in search query for repository rows REPOSITORY_ROWS_PRELOAD_RELATIONS = [] diff --git a/config/initializers/preload_stis.rb b/config/initializers/preload_stis.rb new file mode 100644 index 000000000..800b7175c --- /dev/null +++ b/config/initializers/preload_stis.rb @@ -0,0 +1,7 @@ +# frozen_string_literal: true + +unless Rails.application.config.eager_load + Rails.application.config.to_prepare do + Extends::STI_PRELOAD_CLASSES.each(&:constantize) + end +end diff --git a/db/migrate/20231107163821_add_external_id_to_repository_column_items.rb b/db/migrate/20231107163821_add_external_id_to_repository_column_items.rb new file mode 100644 index 000000000..4047a780e --- /dev/null +++ b/db/migrate/20231107163821_add_external_id_to_repository_column_items.rb @@ -0,0 +1,35 @@ +# frozen_string_literal: true + +require File.expand_path('app/helpers/database_helper') + +class AddExternalIdToRepositoryColumnItems < ActiveRecord::Migration[6.1] + include DatabaseHelper + + def up + add_column :repository_list_items, :external_id, :string, null: true + add_column :repository_checklist_items, :external_id, :string, null: true + add_index :repository_list_items, + :external_id, + unique: true, + name: 'unique_index_repository_list_items_on_external_id' + add_index :repository_checklist_items, + :external_id, + unique: true, + name: 'unique_index_repository_checklist_items_on_external_id' + add_gin_index_without_tags(:repository_list_items, :external_id) + add_gin_index_without_tags(:repository_checklist_items, :external_id) + end + + def down + remove_index :repository_rows, name: 'index_repository_checklist_items_on_external_id' + remove_index :repository_rows, name: 'index_repository_list_items_on_external_id' + remove_index :repository_checklist_items, + :external_id, + name: 'unique_index_repository_checklist_items_on_external_id' + remove_index :repository_list_items, + :external_id, + name: 'unique_index_repository_list_items_on_external_id' + remove_column :repository_checklist_items, :external_id, :string, null: true + remove_column :repository_list_items, :external_id, :string, null: true + end +end diff --git a/db/schema.rb b/db/schema.rb index 145cb0a8a..6acfa3303 100644 --- a/db/schema.rb +++ b/db/schema.rb @@ -10,7 +10,7 @@ # # It's strongly recommended that you check this file into your version control system. -ActiveRecord::Schema[7.0].define(version: 2023_10_23_091358) do +ActiveRecord::Schema[7.0].define(version: 2023_11_07_163821) do # These are extensions that must be enabled in order to support this database enable_extension "btree_gist" enable_extension "pg_trgm" @@ -657,8 +657,11 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_23_091358) do t.bigint "last_modified_by_id" t.datetime "created_at", null: false t.datetime "updated_at", null: false + t.string "external_id" t.index "trim_html_tags((data)::text) gin_trgm_ops", name: "index_repository_checklist_items_on_data", using: :gin + t.index "trim_html_tags((external_id)::text) gin_trgm_ops", name: "index_repository_checklist_items_on_external_id", using: :gin t.index ["created_by_id"], name: "index_repository_checklist_items_on_created_by_id" + t.index ["external_id"], name: "unique_index_repository_checklist_items_on_external_id", unique: true t.index ["last_modified_by_id"], name: "index_repository_checklist_items_on_last_modified_by_id" t.index ["repository_column_id"], name: "index_repository_checklist_items_on_repository_column_id" end @@ -750,8 +753,11 @@ ActiveRecord::Schema[7.0].define(version: 2023_10_23_091358) do t.bigint "last_modified_by_id" t.datetime "created_at", precision: nil, null: false t.datetime "updated_at", precision: nil, null: false + t.string "external_id" + t.index "trim_html_tags((external_id)::text) gin_trgm_ops", name: "index_repository_list_items_on_external_id", using: :gin t.index "trim_html_tags(data) gin_trgm_ops", name: "index_repository_list_items_on_data", using: :gin t.index ["created_by_id"], name: "index_repository_list_items_on_created_by_id" + t.index ["external_id"], name: "unique_index_repository_list_items_on_external_id", unique: true t.index ["last_modified_by_id"], name: "index_repository_list_items_on_last_modified_by_id" t.index ["repository_column_id"], name: "index_repository_list_items_on_repository_column_id" end diff --git a/spec/requests/api/v1/inventory_cells_controller_spec.rb b/spec/requests/api/v1/inventory_cells_controller_spec.rb index 40c9c1e44..45ce04866 100644 --- a/spec/requests/api/v1/inventory_cells_controller_spec.rb +++ b/spec/requests/api/v1/inventory_cells_controller_spec.rb @@ -749,7 +749,7 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do ) end - it 'Response with inventory cell, stock cell, missing stock unit' do + it 'Response with inventory cell, stock cell, empty stock unit' do hash_body = nil empty_item = create(:repository_row, repository: @valid_inventory) invalid_file_body = @valid_stock_body.deep_dup @@ -759,9 +759,15 @@ RSpec.describe 'Api::V1::InventoryCellsController', type: :request do inventory_id: @valid_inventory.id, item_id: empty_item.id ), params: invalid_file_body.to_json, headers: @valid_headers - expect(response).to have_http_status 404 + expect(response).to have_http_status 201 expect { hash_body = json }.not_to raise_exception - expect(hash_body['errors'][0]).to include('status': 404) + expect(hash_body[:data]).to match( + JSON.parse( + ActiveModelSerializers::SerializableResource + .new(RepositoryCell.last, serializer: Api::V1::InventoryCellSerializer) + .to_json + )['data'] + ) end it 'Response with inventory cell, stock cell, missing amount' do