fix: send subscription_id as query param in ALL POST/PATCH endpoints

All backend endpoints accept subscription_id via Query(...) parameter,
but frontend was sending it in the request body via bodyWithSubId helper.
This caused multi-tariff operations (pause, autopay, renew, traffic,
devices, servers, tariff switch) to silently fail — backend couldn't
find subscription_id in query params and fell back to first subscription.

Changed bodyWithSubId to return [body, config] tuple with subscription_id
in params, spread into axios calls as separate arguments.
This commit is contained in:
c0mrade
2026-03-24 12:45:47 +03:00
parent 871b4769aa
commit 348d654892

View File

@@ -21,11 +21,17 @@ const withSubId = (subscriptionId?: number, extra?: Record<string, unknown>) =>
}, },
}); });
/** Helper: merge subscription_id into request body */ /**
const bodyWithSubId = (body: Record<string, unknown>, subscriptionId?: number) => ({ * Helper for POST/PATCH/PUT: returns [body, axiosConfig] tuple.
...body, * subscription_id goes as query param (backend expects Query(...)), NOT in body.
...(subscriptionId != null && { subscription_id: subscriptionId }), */
}); const bodyWithSubId = (
body: Record<string, unknown>,
subscriptionId?: number,
): [Record<string, unknown>, { params?: Record<string, unknown> }] => [
body,
subscriptionId != null ? { params: { subscription_id: subscriptionId } } : {},
];
export const subscriptionApi = { export const subscriptionApi = {
// ── Multi-tariff endpoints ────────────────────────────────────────── // ── Multi-tariff endpoints ──────────────────────────────────────────
@@ -72,7 +78,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/renew', '/cabinet/subscription/renew',
bodyWithSubId({ period_days: periodDays }, subscriptionId), ...bodyWithSubId({ period_days: periodDays }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -97,7 +103,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/traffic', '/cabinet/subscription/traffic',
bodyWithSubId({ gb }, subscriptionId), ...bodyWithSubId({ gb }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -116,7 +122,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.put( const response = await apiClient.put(
'/cabinet/subscription/traffic', '/cabinet/subscription/traffic',
bodyWithSubId({ gb }, subscriptionId), ...bodyWithSubId({ gb }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -124,7 +130,7 @@ export const subscriptionApi = {
saveTrafficCart: async (trafficGb: number, subscriptionId?: number): Promise<void> => { saveTrafficCart: async (trafficGb: number, subscriptionId?: number): Promise<void> => {
await apiClient.post( await apiClient.post(
'/cabinet/subscription/traffic/save-cart', '/cabinet/subscription/traffic/save-cart',
bodyWithSubId({ gb: trafficGb }, subscriptionId), ...bodyWithSubId({ gb: trafficGb }, subscriptionId),
); );
}, },
@@ -169,7 +175,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/devices/purchase', '/cabinet/subscription/devices/purchase',
bodyWithSubId({ devices }, subscriptionId), ...bodyWithSubId({ devices }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -207,7 +213,7 @@ export const subscriptionApi = {
saveDevicesCart: async (devices: number, subscriptionId?: number): Promise<void> => { saveDevicesCart: async (devices: number, subscriptionId?: number): Promise<void> => {
await apiClient.post( await apiClient.post(
'/cabinet/subscription/devices/save-cart', '/cabinet/subscription/devices/save-cart',
bodyWithSubId({ devices }, subscriptionId), ...bodyWithSubId({ devices }, subscriptionId),
); );
}, },
@@ -239,7 +245,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/devices/reduce', '/cabinet/subscription/devices/reduce',
bodyWithSubId({ new_device_limit: newDeviceLimit }, subscriptionId), ...bodyWithSubId({ new_device_limit: newDeviceLimit }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -339,7 +345,7 @@ export const subscriptionApi = {
): Promise<PurchasePreview> => { ): Promise<PurchasePreview> => {
const response = await apiClient.post<PurchasePreview>( const response = await apiClient.post<PurchasePreview>(
'/cabinet/subscription/purchase-preview', '/cabinet/subscription/purchase-preview',
bodyWithSubId({ selection }, subscriptionId), ...bodyWithSubId({ selection }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -355,7 +361,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/purchase', '/cabinet/subscription/purchase',
bodyWithSubId({ selection }, subscriptionId), ...bodyWithSubId({ selection }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -423,7 +429,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/countries', '/cabinet/subscription/countries',
bodyWithSubId({ countries }, subscriptionId), ...bodyWithSubId({ countries }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -499,7 +505,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/tariff/switch/preview', '/cabinet/subscription/tariff/switch/preview',
bodyWithSubId({ tariff_id: tariffId, period_days: 30 }, subscriptionId), ...bodyWithSubId({ tariff_id: tariffId, period_days: 30 }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -520,7 +526,7 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/tariff/switch', '/cabinet/subscription/tariff/switch',
bodyWithSubId({ tariff_id: tariffId, period_days: 30 }, subscriptionId), ...bodyWithSubId({ tariff_id: tariffId, period_days: 30 }, subscriptionId),
); );
return response.data; return response.data;
}, },
@@ -538,7 +544,8 @@ export const subscriptionApi = {
}> => { }> => {
const response = await apiClient.post( const response = await apiClient.post(
'/cabinet/subscription/pause', '/cabinet/subscription/pause',
subscriptionId != null ? { subscription_id: subscriptionId } : undefined, undefined,
withSubId(subscriptionId),
); );
return response.data; return response.data;
}, },