diff --git a/backend/app/controllers/post_imports_controller.rb b/backend/app/controllers/post_imports_controller.rb index daa6786..1d8abe6 100644 --- a/backend/app/controllers/post_imports_controller.rb +++ b/backend/app/controllers/post_imports_controller.rb @@ -78,7 +78,7 @@ class PostImportsController < ApplicationController rows = Array(params[:rows]) raise ArgumentError, '取込件数が多すぎます.' if rows.length > PostImportSourceParser::MAX_ROWS - rows.map do |row| + normalised_rows = rows.map do |row| value = ActionController::Parameters.new(row).permit(:source_row, :sourceRow, :url, :metadata_url, :metadataUrl, attributes: {}, provenance: {}, tag_sources: {}, fetch_warnings: [], validation_warnings: []) @@ -109,5 +109,12 @@ class PostImportsController < ApplicationController normalised.symbolize_keys end + source_rows = normalised_rows.map { _1[:source_row] } + if source_rows.any? { |value| Integer(value, exception: false).to_i <= 0 } || + source_rows.uniq.length != source_rows.length + raise ArgumentError, '元行番号が不正です.' + end + + normalised_rows end end diff --git a/backend/app/services/post_import_previewer.rb b/backend/app/services/post_import_previewer.rb index 0cd77ea..307c243 100644 --- a/backend/app/services/post_import_previewer.rb +++ b/backend/app/services/post_import_previewer.rb @@ -47,10 +47,9 @@ class PostImportPreviewer attributes[field] = value provenance[field] = 'automatic' end - post = Post.new(url:) - post.valid? - normal_url = post.url - errors = post.errors.to_hash.transform_values(&:dup) + normal_url = normalised_url(url) + errors = { } + errors[:url] = ['URL が不正です.'] if normal_url.blank? validation_warnings = [] errors[:url] = ['URL が重複しています.'] if normal_url.present? && urls.key?(normal_url) urls[normal_url] = true if normal_url.present? @@ -165,6 +164,7 @@ class PostImportPreviewer video_ms: parse_duration(attributes['duration'], errors)) post.valid? post.errors.each { |error| (errors[error.attribute] ||= []) << error.message } + errors.delete(:url) end def parse_duration value, errors diff --git a/backend/app/services/post_import_runner.rb b/backend/app/services/post_import_runner.rb index b2de331..2b20dff 100644 --- a/backend/app/services/post_import_runner.rb +++ b/backend/app/services/post_import_runner.rb @@ -11,7 +11,11 @@ class PostImportRunner raise ArgumentError, "取込件数は #{ MAX_ROWS } 件までです." if @rows.length > MAX_ROWS raise ArgumentError, '取込データが大きすぎます.' if @rows.sum { |row| row.to_json.bytesize } > PostImportSourceParser::MAX_BYTES - results = @rows.map { |row| run_row(normalise_row(row)) } + normalised_rows = @rows.map { |row| normalise_row(row) } + source_rows = normalised_rows.map { _1['source_row'] } + raise ArgumentError, '元行番号が重複しています.' if source_rows.uniq.length != source_rows.length + + results = normalised_rows.map { |row| run_row(row) } { created: results.count { _1[:status] == 'created' }, skipped: results.count { _1[:status] == 'skipped' }, failed: results.count { _1[:status] == 'failed' }, rows: results } end @@ -77,6 +81,8 @@ class PostImportRunner raise ArgumentError unless metadata_url.nil? || metadata_url.is_a?(String) raise ArgumentError if metadata_url.to_s.bytesize > PostImportSourceParser::MAX_CELL_BYTES raise ArgumentError if row.to_json.bytesize > PostImportSourceParser::MAX_BYTES + tag_sources = row['tag_sources'] + raise ArgumentError unless tag_sources.nil? || tag_sources.is_a?(Hash) end def normalise_row row