Skip to content

Commit e901c93

Browse files
committed
feat(api): add /api/v2 namespace falling back to v1
## Context The product-catalog work introduces a second API version. A v2 client should use /api/v2 for its whole integration without mixing in v1, even for resources that have not been reimplemented yet. ## Description Extract the shared API resource definitions into a draw(:shared_api) file used by both namespaces. The v1 namespace draws them as today; a new v2 namespace draws the same set with module: :v1, so every /api/v2 path is served by the existing Api::V1 controller until a real Api::V2 controller replaces it. Add a routing parity spec asserting every v1 endpoint is reachable under v2, plus a request smoke test.
1 parent 93884ef commit e901c93

4 files changed

Lines changed: 228 additions & 177 deletions

File tree

config/routes.rb

Lines changed: 4 additions & 177 deletions
Original file line numberDiff line numberDiff line change
@@ -27,184 +27,11 @@
2727

2828
namespace :api do
2929
namespace :v1 do
30-
resources :activity_logs, param: :activity_id, only: %i[index show]
31-
resources :api_logs, param: :request_id, only: %i[index show]
32-
resources :security_logs, param: :log_id, only: %i[index show]
33-
34-
namespace :analytics do
35-
get :gross_revenue, to: "gross_revenues#index", as: :gross_revenue
36-
get :invoiced_usage, to: "invoiced_usages#index", as: :invoiced_usage
37-
get :invoice_collection, to: "invoice_collections#index", as: :invoice_collection
38-
get :mrr, to: "mrrs#index", as: :mrr
39-
get :overdue_balance, to: "overdue_balances#index", as: :overdue_balance
40-
end
41-
42-
get "analytics/usage", to: "data_api/usages#index", as: :usage
43-
44-
resources :billing_entities, param: :code, only: %i[index show update create]
45-
46-
resources :customers, param: :external_id, only: %i[create index show destroy] do
47-
get :portal_url
48-
49-
get :current_usage, to: "customers/usage#current"
50-
get :projected_usage, to: "customers/projected_usage#current"
51-
get :past_usage, to: "customers/usage#past"
52-
53-
post :checkout_url
54-
55-
scope module: :customers do
56-
resources :applied_coupons, only: %i[index destroy]
57-
resources :credit_notes, only: %i[index]
58-
resources :invoices, only: %i[index]
59-
resources :payments, only: %i[index]
60-
resources :payment_requests, only: %i[index]
61-
resources :subscriptions, only: %i[index]
62-
resources :wallets, only: %i[create update show index], param: :code do
63-
scope module: :wallets do
64-
resources :alerts, only: %i[create index update show destroy], param: :code do
65-
collection do
66-
delete "/", action: :destroy_all
67-
end
68-
end
69-
resource :metadata, only: %i[create update destroy] do
70-
delete ":key", action: :destroy_key, on: :member
71-
end
72-
end
73-
end
74-
delete "/wallets/:code", to: "wallets#terminate"
75-
resources :payment_methods, only: %i[index destroy] do
76-
put :set_as_default, on: :member
77-
end
78-
end
79-
end
80-
81-
resources :subscriptions, only: %i[create update show index], param: :external_id do
82-
resource :lifetime_usage, only: %i[show update], controller: "subscriptions/lifetime_usages"
83-
resources :alerts, only: %i[create index update show destroy], param: :code, controller: "subscriptions/alerts" do
84-
collection do
85-
delete "/", action: :destroy_all
86-
end
87-
end
88-
resources :entitlements, only: %i[index destroy], param: :code, code: /.*/, controller: "subscriptions/entitlements" do
89-
resources :privileges, only: %i[destroy], param: :code, code: /.*/, controller: "subscriptions/entitlements/privileges"
90-
end
91-
patch :entitlements, to: "subscriptions/entitlements#update"
92-
resources :fixed_charges, only: %i[index show update], param: :code, code: /.*/, controller: "subscriptions/fixed_charges"
93-
resources :charges, only: %i[index show update], param: :code, code: /.*/, controller: "subscriptions/charges" do
94-
resources :filters, only: %i[index show create update destroy], controller: "subscriptions/charges/filters"
95-
end
96-
end
97-
delete "/subscriptions/:external_id", to: "subscriptions#terminate", as: :terminate
98-
99-
resources :add_ons, param: :code, code: /.*/
100-
resources :billable_metrics, param: :code, code: /.*/ do
101-
post :evaluate_expression, on: :collection
102-
end
103-
104-
resources :features, param: :code, code: /.*/, only: %i[index show create update destroy] do
105-
scope module: :features do
106-
resources :privileges, only: %i[destroy], param: :code
107-
end
108-
end
109-
110-
resources :coupons, param: :code, code: /.*/
111-
resources :credit_notes, only: %i[create update show index] do
112-
post :download, on: :member, action: :download_pdf
113-
post :download_pdf, on: :member
114-
post :download_xml, on: :member
115-
post :resend_email, on: :member
116-
put :void, on: :member
117-
post :estimate, on: :collection
118-
scope module: :credit_notes do
119-
resource :metadata, only: %i[create update destroy] do
120-
delete ":key", action: :destroy_key, on: :member
121-
end
122-
end
123-
end
124-
get :events_enriched, to: "events#index_enriched"
125-
resources :events, only: %i[create show index], constraints: {id: /[^\/]+/} do
126-
post :estimate_fees, on: :collection
127-
post :estimate_instant_fees, on: :collection
128-
post :batch_estimate_instant_fees, on: :collection
129-
end
130-
resources :applied_coupons, only: %i[create index]
131-
resources :fees, only: %i[show update index destroy]
132-
resources :invoices, only: %i[create update show index] do
133-
post :download, on: :member, action: :download_pdf
134-
post :download_pdf, on: :member
135-
post :download_xml, on: :member
136-
post :resend_email, on: :member
137-
post :void, on: :member
138-
post :lose_dispute, on: :member
139-
post :retry, on: :member
140-
post :retry_payment, on: :member
141-
post :payment_url, on: :member
142-
post :preview, on: :collection
143-
put :refresh, on: :member
144-
put :finalize, on: :member
145-
put :sync_salesforce_id, on: :member
146-
end
147-
resources :payment_receipts, only: %i[index show] do
148-
post :resend_email, on: :member
149-
end
150-
resources :payment_requests, only: %i[create index show]
151-
resources :order_forms, only: %i[show index] do
152-
post :mark_as_signed, on: :member
153-
post :void, on: :member
154-
end
155-
156-
resources :quotes, only: %i[index show] do
157-
resources :versions, only: %i[index], controller: "quotes/versions"
158-
end
159-
resources :quote_versions, only: %i[show] do
160-
post :approve, on: :member
161-
post :void, on: :member
162-
post :clone, on: :member
163-
end
164-
165-
resources :orders, only: %i[show index]
166-
resources :payments, only: %i[create index show]
167-
resources :plans, param: :code, code: /.*/ do
168-
resources :charges, only: %i[index show create update destroy], param: :code, code: /.*/, controller: "plans/charges" do
169-
resources :filters, only: %i[index show create update destroy], controller: "plans/charges/filters"
170-
end
171-
resources :fixed_charges, only: %i[index show create update destroy], param: :code, code: /.*/, controller: "plans/fixed_charges"
172-
resources :entitlements, only: %i[index show create destroy], param: :code, code: /.*/, controller: "plans/entitlements" do
173-
resources :privileges, only: %i[destroy], param: :code, code: /.*/, controller: "plans/entitlements/privileges"
174-
end
175-
patch :entitlements, to: "plans/entitlements#update"
176-
scope module: :plans do
177-
resource :metadata, only: %i[create update destroy] do
178-
delete ":key", action: :destroy_key, on: :member
179-
end
180-
end
181-
end
182-
resources :taxes, param: :code, code: /.*/
183-
resources :wallet_transactions, only: %i[create show] do
184-
post :payment_url, on: :member
185-
get :consumptions, on: :member
186-
get :fundings, on: :member
187-
end
188-
get "/wallets/:id/wallet_transactions", to: "wallet_transactions#index"
189-
resources :wallets, only: %i[create update show index] do
190-
scope module: :wallets do
191-
resource :metadata, only: %i[create update destroy] do
192-
delete ":key", action: :destroy_key, on: :member
193-
end
194-
end
195-
end
196-
delete "/wallets/:id", to: "wallets#terminate"
197-
post "/events/batch", to: "events#batch"
198-
199-
get "/organizations", to: "organizations#show"
200-
put "/organizations", to: "organizations#update"
201-
get "/organizations/grpc_token", to: "organizations#grpc_token"
30+
draw(:shared_api)
31+
end
20232

203-
resources :webhook_endpoints, only: %i[create index show destroy update]
204-
resources :webhooks, only: %i[] do
205-
get :public_key, on: :collection
206-
get :json_public_key, on: :collection
207-
end
33+
namespace :v2, module: :v1 do
34+
draw(:shared_api)
20835
end
20936

21037
namespace :v2 do

config/routes/shared_api.rb

Lines changed: 180 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,180 @@
1+
# frozen_string_literal: true
2+
3+
resources :activity_logs, param: :activity_id, only: %i[index show]
4+
resources :api_logs, param: :request_id, only: %i[index show]
5+
resources :security_logs, param: :log_id, only: %i[index show]
6+
7+
namespace :analytics do
8+
get :gross_revenue, to: "gross_revenues#index", as: :gross_revenue
9+
get :invoiced_usage, to: "invoiced_usages#index", as: :invoiced_usage
10+
get :invoice_collection, to: "invoice_collections#index", as: :invoice_collection
11+
get :mrr, to: "mrrs#index", as: :mrr
12+
get :overdue_balance, to: "overdue_balances#index", as: :overdue_balance
13+
end
14+
15+
get "analytics/usage", to: "data_api/usages#index", as: :usage
16+
17+
resources :billing_entities, param: :code, only: %i[index show update create]
18+
19+
resources :customers, param: :external_id, only: %i[create index show destroy] do
20+
get :portal_url
21+
22+
get :current_usage, to: "customers/usage#current"
23+
get :projected_usage, to: "customers/projected_usage#current"
24+
get :past_usage, to: "customers/usage#past"
25+
26+
post :checkout_url
27+
28+
scope module: :customers do
29+
resources :applied_coupons, only: %i[index destroy]
30+
resources :credit_notes, only: %i[index]
31+
resources :invoices, only: %i[index]
32+
resources :payments, only: %i[index]
33+
resources :payment_requests, only: %i[index]
34+
resources :subscriptions, only: %i[index]
35+
resources :wallets, only: %i[create update show index], param: :code do
36+
scope module: :wallets do
37+
resources :alerts, only: %i[create index update show destroy], param: :code do
38+
collection do
39+
delete "/", action: :destroy_all
40+
end
41+
end
42+
resource :metadata, only: %i[create update destroy] do
43+
delete ":key", action: :destroy_key, on: :member
44+
end
45+
end
46+
end
47+
delete "/wallets/:code", to: "wallets#terminate"
48+
resources :payment_methods, only: %i[index destroy] do
49+
put :set_as_default, on: :member
50+
end
51+
end
52+
end
53+
54+
resources :subscriptions, only: %i[create update show index], param: :external_id do
55+
resource :lifetime_usage, only: %i[show update], controller: "subscriptions/lifetime_usages"
56+
resources :alerts, only: %i[create index update show destroy], param: :code, controller: "subscriptions/alerts" do
57+
collection do
58+
delete "/", action: :destroy_all
59+
end
60+
end
61+
resources :entitlements, only: %i[index destroy], param: :code, code: /.*/, controller: "subscriptions/entitlements" do
62+
resources :privileges, only: %i[destroy], param: :code, code: /.*/, controller: "subscriptions/entitlements/privileges"
63+
end
64+
patch :entitlements, to: "subscriptions/entitlements#update"
65+
resources :fixed_charges, only: %i[index show update], param: :code, code: /.*/, controller: "subscriptions/fixed_charges"
66+
resources :charges, only: %i[index show update], param: :code, code: /.*/, controller: "subscriptions/charges" do
67+
resources :filters, only: %i[index show create update destroy], controller: "subscriptions/charges/filters"
68+
end
69+
end
70+
delete "/subscriptions/:external_id", to: "subscriptions#terminate", as: :terminate
71+
72+
resources :add_ons, param: :code, code: /.*/
73+
resources :billable_metrics, param: :code, code: /.*/ do
74+
post :evaluate_expression, on: :collection
75+
end
76+
77+
resources :features, param: :code, code: /.*/, only: %i[index show create update destroy] do
78+
scope module: :features do
79+
resources :privileges, only: %i[destroy], param: :code
80+
end
81+
end
82+
83+
resources :coupons, param: :code, code: /.*/
84+
resources :credit_notes, only: %i[create update show index] do
85+
post :download, on: :member, action: :download_pdf
86+
post :download_pdf, on: :member
87+
post :download_xml, on: :member
88+
post :resend_email, on: :member
89+
put :void, on: :member
90+
post :estimate, on: :collection
91+
scope module: :credit_notes do
92+
resource :metadata, only: %i[create update destroy] do
93+
delete ":key", action: :destroy_key, on: :member
94+
end
95+
end
96+
end
97+
get :events_enriched, to: "events#index_enriched"
98+
resources :events, only: %i[create show index], constraints: {id: /[^\/]+/} do
99+
post :estimate_fees, on: :collection
100+
post :estimate_instant_fees, on: :collection
101+
post :batch_estimate_instant_fees, on: :collection
102+
end
103+
resources :applied_coupons, only: %i[create index]
104+
resources :fees, only: %i[show update index destroy]
105+
resources :invoices, only: %i[create update show index] do
106+
post :download, on: :member, action: :download_pdf
107+
post :download_pdf, on: :member
108+
post :download_xml, on: :member
109+
post :resend_email, on: :member
110+
post :void, on: :member
111+
post :lose_dispute, on: :member
112+
post :retry, on: :member
113+
post :retry_payment, on: :member
114+
post :payment_url, on: :member
115+
post :preview, on: :collection
116+
put :refresh, on: :member
117+
put :finalize, on: :member
118+
put :sync_salesforce_id, on: :member
119+
end
120+
resources :payment_receipts, only: %i[index show] do
121+
post :resend_email, on: :member
122+
end
123+
resources :payment_requests, only: %i[create index show]
124+
resources :order_forms, only: %i[show index] do
125+
post :mark_as_signed, on: :member
126+
post :void, on: :member
127+
end
128+
129+
resources :quotes, only: %i[index show] do
130+
resources :versions, only: %i[index], controller: "quotes/versions"
131+
end
132+
resources :quote_versions, only: %i[show] do
133+
post :approve, on: :member
134+
post :void, on: :member
135+
post :clone, on: :member
136+
end
137+
138+
resources :orders, only: %i[show index]
139+
resources :payments, only: %i[create index show]
140+
resources :plans, param: :code, code: /.*/ do
141+
resources :charges, only: %i[index show create update destroy], param: :code, code: /.*/, controller: "plans/charges" do
142+
resources :filters, only: %i[index show create update destroy], controller: "plans/charges/filters"
143+
end
144+
resources :fixed_charges, only: %i[index show create update destroy], param: :code, code: /.*/, controller: "plans/fixed_charges"
145+
resources :entitlements, only: %i[index show create destroy], param: :code, code: /.*/, controller: "plans/entitlements" do
146+
resources :privileges, only: %i[destroy], param: :code, code: /.*/, controller: "plans/entitlements/privileges"
147+
end
148+
patch :entitlements, to: "plans/entitlements#update"
149+
scope module: :plans do
150+
resource :metadata, only: %i[create update destroy] do
151+
delete ":key", action: :destroy_key, on: :member
152+
end
153+
end
154+
end
155+
resources :taxes, param: :code, code: /.*/
156+
resources :wallet_transactions, only: %i[create show] do
157+
post :payment_url, on: :member
158+
get :consumptions, on: :member
159+
get :fundings, on: :member
160+
end
161+
get "/wallets/:id/wallet_transactions", to: "wallet_transactions#index"
162+
resources :wallets, only: %i[create update show index] do
163+
scope module: :wallets do
164+
resource :metadata, only: %i[create update destroy] do
165+
delete ":key", action: :destroy_key, on: :member
166+
end
167+
end
168+
end
169+
delete "/wallets/:id", to: "wallets#terminate"
170+
post "/events/batch", to: "events#batch"
171+
172+
get "/organizations", to: "organizations#show"
173+
put "/organizations", to: "organizations#update"
174+
get "/organizations/grpc_token", to: "organizations#grpc_token"
175+
176+
resources :webhook_endpoints, only: %i[create index show destroy update]
177+
resources :webhooks, only: %i[] do
178+
get :public_key, on: :collection
179+
get :json_public_key, on: :collection
180+
end
Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,16 @@
1+
# frozen_string_literal: true
2+
3+
require "rails_helper"
4+
5+
RSpec.describe "API v2 fallback to v1" do
6+
let(:organization) { create(:organization) }
7+
8+
it "serves a v1-backed resource under /api/v2" do
9+
plan = create(:plan, organization:)
10+
11+
get_with_token(organization, "/api/v2/plans")
12+
13+
expect(response).to have_http_status(:success)
14+
expect(json[:plans].map { it[:lago_id] }).to include(plan.id)
15+
end
16+
end

0 commit comments

Comments
 (0)