38 行
1.3 KiB
Ruby
38 行
1.3 KiB
Ruby
class PostImportsController < ApplicationController
|
|
before_action :require_member!
|
|
|
|
def preview
|
|
source =
|
|
if params[:format] == 'google_sheets'
|
|
PostImportGoogleSheetsFetcher.fetch!(params[:source], rate_key: current_user.id)
|
|
else
|
|
params[:source]
|
|
end
|
|
format = params[:format] == 'google_sheets' ? 'csv' : params[:format]
|
|
parsed = PostImportSourceParser.new(source:, format:,
|
|
has_header: params[:has_header], json_path: params[:json_path]).parse
|
|
url_column = params[:url_column].presence || (parsed[:columns].length == 1 ? 0 : nil)
|
|
return render_bad_request('URL 列を選択してください.') if url_column.nil?
|
|
|
|
rows = PostImportPreviewer.new(parsed:, url_column:, mappings: params[:mappings],
|
|
existing: params[:existing]).preview
|
|
render json: parsed.slice(:columns).merge(rows:)
|
|
rescue ArgumentError => e
|
|
render_bad_request(e.message)
|
|
end
|
|
|
|
def create
|
|
render json: PostImportRunner.new(actor: current_user, rows: params[:rows].to_a).run,
|
|
status: :created
|
|
end
|
|
|
|
private
|
|
|
|
def require_member!
|
|
return head :unauthorized unless current_user
|
|
return if current_user.gte_member?
|
|
|
|
head :forbidden
|
|
end
|
|
end
|