# # Kunden aus CSV prüfen und in Paketen per POST an eine REST-API senden # # ruby examples/demo_api.rb & # bin/etl run examples/rest_schreiben.rb [--url=http://127.0.0.1:4567] [--dry-run] # require 'fileutils' require 'datapipeline' API = DataPipeline.params.fetch(:url, 'http://127.0.0.1:4567') AUTH = "Bearer #{ENV.fetch('DEMO_API_TOKEN', 'demo-token')}" DATA = File.expand_path('data', __dir__) out = DataPipeline.params.fetch(:out, 'tmp') FileUtils.mkdir_p(out) DataPipeline.new do version 'rest_schreiben 1.0' read container(:csv, file: "#{DATA}/kunden.csv", csv: { col_sep: ';' }) # vor dem Senden prüfen: was die API ablehnen würde, landet hier in der Fehlerdatei on_error :collect, to: container(:csv, file: "#{out}/import_fehler.csv") validate 'kundennr' => { required: true, format: /\A\d{6}\z/ }, 'name' => { required: true } filter { |row| row['status'] == 'aktiv' } map do |row| { 'kundennr' => row['kundennr'], 'name' => row['name'].strip, 'land' => row['land'], 'umsatz' => row['umsatz'].to_f } end # POST /api/import mit je 2 Kunden als JSON-Array; im Dry-Run wird nichts gesendet write container(:rest, url: "#{API}/api/import", auth: AUTH, batch_size: 2) on_finish do |stats| puts stats.dry_run ? 'Dry-Run: nichts gesendet' : "gesendet: #{stats.written} Kunden in #{(stats.written / 2.0).ceil} Paketen" end end.run