From 095dec509dbb0a7a7c96c62b79476a5dc02b5efb Mon Sep 17 00:00:00 2001 From: Anne Schneider Date: Mon, 3 Aug 2026 13:10:21 +0200 Subject: [PATCH 1/2] Add geocoding endpoints to passenger api Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/ioki/apis/passenger_api.rb | 25 +++++++ lib/ioki/model/passenger/geocoding_search.rb | 25 +++++++ .../passenger/geocoding_search_details.rb | 69 +++++++++++++++++++ .../passenger/geocoding_search_result.rb | 49 +++++++++++++ .../passenger/geocoding_search_results.rb | 18 +++++ lib/ioki/model/passenger/geocoding_session.rb | 33 +++++++++ .../geocoding_search_details_spec.rb | 19 +++++ .../passenger/geocoding_search_result_spec.rb | 14 ++++ .../geocoding_search_results_spec.rb | 11 +++ .../model/passenger/geocoding_search_spec.rb | 8 +++ .../model/passenger/geocoding_session_spec.rb | 11 +++ spec/ioki/passenger_api_spec.rb | 58 ++++++++++++++++ 12 files changed, 340 insertions(+) create mode 100644 lib/ioki/model/passenger/geocoding_search.rb create mode 100644 lib/ioki/model/passenger/geocoding_search_details.rb create mode 100644 lib/ioki/model/passenger/geocoding_search_result.rb create mode 100644 lib/ioki/model/passenger/geocoding_search_results.rb create mode 100644 lib/ioki/model/passenger/geocoding_session.rb create mode 100644 spec/ioki/model/passenger/geocoding_search_details_spec.rb create mode 100644 spec/ioki/model/passenger/geocoding_search_result_spec.rb create mode 100644 spec/ioki/model/passenger/geocoding_search_results_spec.rb create mode 100644 spec/ioki/model/passenger/geocoding_search_spec.rb create mode 100644 spec/ioki/model/passenger/geocoding_session_spec.rb diff --git a/lib/ioki/apis/passenger_api.rb b/lib/ioki/apis/passenger_api.rb index 5e7f17be..a7186fa1 100644 --- a/lib/ioki/apis/passenger_api.rb +++ b/lib/ioki/apis/passenger_api.rb @@ -265,6 +265,31 @@ class PassengerApi path: 'purchase', model_class: Ioki::Model::Passenger::Ticketing::Voucher, outgoing_model_class: Ioki::Model::Passenger::Ticketing::ProductPurchase + ), + Endpoints::Create.new( + :geocoding_session, + base_path: [API_BASE_PATH, 'geocoding'], + path: 'session', + model_class: Ioki::Model::Passenger::GeocodingSession + ), + Endpoints::Delete.new( + :geocoding_session, + base_path: [API_BASE_PATH, 'geocoding'], + path: 'session', + model_class: nil + ), + Endpoints::Create.new( + :geocoding_search, + base_path: [API_BASE_PATH, 'geocoding', 'session', :id], + path: 'search', + model_class: Ioki::Model::Passenger::GeocodingSearchResults, + outgoing_model_class: Ioki::Model::Passenger::GeocodingSearch + ), + Endpoints::Create.new( + :geocoding_search_details, + base_path: [API_BASE_PATH, 'geocoding', 'session', :id], + path: 'details', + model_class: Ioki::Model::Passenger::GeocodingSearchDetails ) ].freeze end diff --git a/lib/ioki/model/passenger/geocoding_search.rb b/lib/ioki/model/passenger/geocoding_search.rb new file mode 100644 index 00000000..56c1de96 --- /dev/null +++ b/lib/ioki/model/passenger/geocoding_search.rb @@ -0,0 +1,25 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Passenger + class GeocodingSearch < Base + attribute :query, + on: :create, + type: :string + + attribute :product_id, + on: :create, + type: :string + + attribute :place_types, + on: :create, + type: :string + + attribute :result_types, + on: :create, + type: :array + end + end + end +end diff --git a/lib/ioki/model/passenger/geocoding_search_details.rb b/lib/ioki/model/passenger/geocoding_search_details.rb new file mode 100644 index 00000000..90b193dd --- /dev/null +++ b/lib/ioki/model/passenger/geocoding_search_details.rb @@ -0,0 +1,69 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Passenger + class GeocodingSearchDetails < Base + attribute :type, + on: :read, + type: :string + + attribute :id, + on: :create, + type: :string + + attribute :vendor_id, + on: :read, + type: :string + + attribute :vendor, + on: :read, + type: :string + + attribute :vendor_type, + on: :read, + type: :string + + attribute :location_name, + on: :read, + type: :string + + attribute :formatted_address, + on: :read, + type: :string + + attribute :street_name, + on: :read, + type: :string + + attribute :street_number, + on: :read, + type: :string + + attribute :postal_code, + on: :read, + type: :string + + attribute :city, + on: :read, + type: :string + + attribute :county, + on: :read, + type: :string + + attribute :country, + on: :read, + type: :string + + attribute :lat, + on: :read, + type: :float + + attribute :lng, + on: :read, + type: :float + end + end + end +end diff --git a/lib/ioki/model/passenger/geocoding_search_result.rb b/lib/ioki/model/passenger/geocoding_search_result.rb new file mode 100644 index 00000000..f0d14e25 --- /dev/null +++ b/lib/ioki/model/passenger/geocoding_search_result.rb @@ -0,0 +1,49 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Passenger + class GeocodingSearchResult < Base + attribute :type, + on: :read, + type: :string + + attribute :id, + on: :read, + type: :string + + attribute :vendor_id, + on: :read, + type: :string + + attribute :vendor, + on: :read, + type: :string + + attribute :formatted_address, + on: :read, + type: :string + + attribute :description, + on: :read, + type: :string + + attribute :location_name, + on: :read, + type: :string + + attribute :lat, + on: :read, + type: :float + + attribute :lng, + on: :read, + type: :float + + attribute :result_type, + on: :read, + type: :string + end + end + end +end diff --git a/lib/ioki/model/passenger/geocoding_search_results.rb b/lib/ioki/model/passenger/geocoding_search_results.rb new file mode 100644 index 00000000..d32e9661 --- /dev/null +++ b/lib/ioki/model/passenger/geocoding_search_results.rb @@ -0,0 +1,18 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Passenger + class GeocodingSearchResults < Base + attribute :type, + on: :read, + type: :string + + attribute :results, + on: :read, + type: :array, + class_name: 'Ioki::Model::Passenger::GeocodingSearchResult' + end + end + end +end diff --git a/lib/ioki/model/passenger/geocoding_session.rb b/lib/ioki/model/passenger/geocoding_session.rb new file mode 100644 index 00000000..86d831a7 --- /dev/null +++ b/lib/ioki/model/passenger/geocoding_session.rb @@ -0,0 +1,33 @@ +# frozen_string_literal: true + +module Ioki + module Model + module Passenger + class GeocodingSession < Base + attribute :type, + on: :read, + type: :string + + attribute :id, + on: :read, + type: :string + + attribute :created_at, + on: :read, + type: :date_time + + attribute :updated_at, + on: :read, + type: :date_time + + attribute :valid_until, + on: :read, + type: :date_time + + attribute :product_id, + on: :create, + type: :string + end + end + end +end diff --git a/spec/ioki/model/passenger/geocoding_search_details_spec.rb b/spec/ioki/model/passenger/geocoding_search_details_spec.rb new file mode 100644 index 00000000..22b3c660 --- /dev/null +++ b/spec/ioki/model/passenger/geocoding_search_details_spec.rb @@ -0,0 +1,19 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Passenger::GeocodingSearchDetails do + it { is_expected.to define_attribute(:type).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:id).as(:string).with(on: :create) } + it { is_expected.to define_attribute(:vendor_id).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:vendor).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:vendor_type).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:location_name).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:formatted_address).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:street_name).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:street_number).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:postal_code).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:city).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:county).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:country).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:lat).as(:float).with(on: :read) } + it { is_expected.to define_attribute(:lng).as(:float).with(on: :read) } +end diff --git a/spec/ioki/model/passenger/geocoding_search_result_spec.rb b/spec/ioki/model/passenger/geocoding_search_result_spec.rb new file mode 100644 index 00000000..6d819821 --- /dev/null +++ b/spec/ioki/model/passenger/geocoding_search_result_spec.rb @@ -0,0 +1,14 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Passenger::GeocodingSearchResult do + it { is_expected.to define_attribute(:type).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:id).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:vendor_id).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:vendor).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:formatted_address).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:description).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:location_name).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:lat).as(:float).with(on: :read) } + it { is_expected.to define_attribute(:lng).as(:float).with(on: :read) } + it { is_expected.to define_attribute(:result_type).as(:string).with(on: :read) } +end diff --git a/spec/ioki/model/passenger/geocoding_search_results_spec.rb b/spec/ioki/model/passenger/geocoding_search_results_spec.rb new file mode 100644 index 00000000..33e66077 --- /dev/null +++ b/spec/ioki/model/passenger/geocoding_search_results_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Passenger::GeocodingSearchResults do + it { is_expected.to define_attribute(:type).as(:string).with(on: :read) } + + it do + is_expected.to define_attribute(:results) + .as(:array) + .with(on: :read, class_name: 'Ioki::Model::Passenger::GeocodingSearchResult') + end +end diff --git a/spec/ioki/model/passenger/geocoding_search_spec.rb b/spec/ioki/model/passenger/geocoding_search_spec.rb new file mode 100644 index 00000000..12929024 --- /dev/null +++ b/spec/ioki/model/passenger/geocoding_search_spec.rb @@ -0,0 +1,8 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Passenger::GeocodingSearch do + it { is_expected.to define_attribute(:query).as(:string).with(on: :create) } + it { is_expected.to define_attribute(:product_id).as(:string).with(on: :create) } + it { is_expected.to define_attribute(:place_types).as(:string).with(on: :create) } + it { is_expected.to define_attribute(:result_types).as(:array).with(on: :create) } +end diff --git a/spec/ioki/model/passenger/geocoding_session_spec.rb b/spec/ioki/model/passenger/geocoding_session_spec.rb new file mode 100644 index 00000000..a6f8ddcd --- /dev/null +++ b/spec/ioki/model/passenger/geocoding_session_spec.rb @@ -0,0 +1,11 @@ +# frozen_string_literal: true + +RSpec.describe Ioki::Model::Passenger::GeocodingSession do + it { is_expected.to define_attribute(:type).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:id).as(:string).with(on: :read) } + it { is_expected.to define_attribute(:created_at).as(:date_time).with(on: :read) } + it { is_expected.to define_attribute(:updated_at).as(:date_time).with(on: :read) } + it { is_expected.to define_attribute(:valid_until).as(:date_time).with(on: :read) } + + it { is_expected.to define_attribute(:product_id).as(:string).with(on: :create) } +end diff --git a/spec/ioki/passenger_api_spec.rb b/spec/ioki/passenger_api_spec.rb index c5d2795c..8e853f07 100644 --- a/spec/ioki/passenger_api_spec.rb +++ b/spec/ioki/passenger_api_spec.rb @@ -637,4 +637,62 @@ .to be_a Ioki::Model::Passenger::Ticketing::Voucher end end + + describe '#create_geocoding_session()' do + let(:geocoding_session) { Ioki::Model::Passenger::GeocodingSession.new } + + it 'calls request on the client with expected params' do + expect(passenger_client).to receive(:request) do |params| + expect(params[:url].to_s).to eq('passenger/geocoding/session') + expect(params[:method]).to eq(:post) + [result_with_data, full_response] + end + + expect(passenger_client.create_geocoding_session(geocoding_session, options)) + .to be_a(Ioki::Model::Passenger::GeocodingSession) + end + end + + describe '#delete_geocoding_session(id)' do + it 'calls request on the client with expected params' do + expect(passenger_client).to receive(:request) do |params| + expect(params[:url].to_s).to eq('passenger/geocoding/session/0815') + expect(params[:method]).to eq(:delete) + result_with_data + end + + expect(passenger_client.delete_geocoding_session('0815', options)) + .to be_nil + end + end + + describe '#create_geocoding_search(id)' do + let(:geocoding_search) { Ioki::Model::Passenger::GeocodingSearch.new } + + it 'calls request on the client with expected params' do + expect(passenger_client).to receive(:request) do |params| + expect(params[:url].to_s).to eq('passenger/geocoding/session/0815/search') + expect(params[:method]).to eq(:post) + [result_with_data, full_response] + end + + expect(passenger_client.create_geocoding_search('0815', geocoding_search, options)) + .to be_a(Ioki::Model::Passenger::GeocodingSearchResults) + end + end + + describe '#create_geocoding_search_details(id)' do + let(:geocoding_search_details) { Ioki::Model::Passenger::GeocodingSearchDetails.new } + + it 'calls request on the client with expected params' do + expect(passenger_client).to receive(:request) do |params| + expect(params[:url].to_s).to eq('passenger/geocoding/session/0815/details') + expect(params[:method]).to eq(:post) + [result_with_data, full_response] + end + + expect(passenger_client.create_geocoding_search_details('0815', geocoding_search_details, options)) + .to be_a(Ioki::Model::Passenger::GeocodingSearchDetails) + end + end end From 9b900fcf64bf4a2bcc1356141ece5af4d1a116b2 Mon Sep 17 00:00:00 2001 From: Anne Schneider Date: Mon, 3 Aug 2026 13:22:47 +0200 Subject: [PATCH 2/2] Remove deprecated place type Co-Authored-By: Claude Opus 4.8 (1M context) --- lib/ioki/model/passenger/geocoding_search.rb | 4 ---- spec/ioki/model/passenger/geocoding_search_spec.rb | 1 - 2 files changed, 5 deletions(-) diff --git a/lib/ioki/model/passenger/geocoding_search.rb b/lib/ioki/model/passenger/geocoding_search.rb index 56c1de96..ed12f3b2 100644 --- a/lib/ioki/model/passenger/geocoding_search.rb +++ b/lib/ioki/model/passenger/geocoding_search.rb @@ -12,10 +12,6 @@ class GeocodingSearch < Base on: :create, type: :string - attribute :place_types, - on: :create, - type: :string - attribute :result_types, on: :create, type: :array diff --git a/spec/ioki/model/passenger/geocoding_search_spec.rb b/spec/ioki/model/passenger/geocoding_search_spec.rb index 12929024..3a3caa68 100644 --- a/spec/ioki/model/passenger/geocoding_search_spec.rb +++ b/spec/ioki/model/passenger/geocoding_search_spec.rb @@ -3,6 +3,5 @@ RSpec.describe Ioki::Model::Passenger::GeocodingSearch do it { is_expected.to define_attribute(:query).as(:string).with(on: :create) } it { is_expected.to define_attribute(:product_id).as(:string).with(on: :create) } - it { is_expected.to define_attribute(:place_types).as(:string).with(on: :create) } it { is_expected.to define_attribute(:result_types).as(:array).with(on: :create) } end