Skip to content

Commit

Permalink
feat(api-client): 20565 Implement robust authentication and error han…
Browse files Browse the repository at this point in the history
…dling, improve test coverage (#954)
  • Loading branch information
vkozio authored Feb 6, 2025
1 parent 2bf3d90 commit a1d855c
Show file tree
Hide file tree
Showing 55 changed files with 3,862 additions and 826 deletions.
20 changes: 7 additions & 13 deletions .cursorignore
Original file line number Diff line number Diff line change
@@ -1,20 +1,12 @@
__fixtures__
__mocks__
__test__
./**/*.fixture.tsx
./**/fixture/*.*
.github/workflows/run_e2e_tests.yml
.helpers
*.fixture.{ts,tsx}
**/*.test.{ts,tsx}
appconfig.js
configs/*
cosmos**
e2e/**
jest.config.js
jest.setup.js
playwright**
postcss.config.ts
configs/
cosmos-export/
dist/
e2e/
node_modules/
public/
scripts/
server/
Expand All @@ -23,3 +15,5 @@ vite.config.ts
vite.proxy.ts
i18next-scanner.config.cjs
*.csv
playwright**
postcss.config.ts
2 changes: 1 addition & 1 deletion src/core/api/assets.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@ import { i18n } from '~core/localization';

export function getAsset(asset: string, abortController?: AbortController) {
const endpoint = `/apps/${configRepo.get().id}/assets`;
return apiClient.get(`${endpoint}/${asset}`, undefined, true, {
return apiClient.get(`${endpoint}/${asset}`, undefined, {
headers: { 'user-language': i18n.instance.language },
signal: abortController ? abortController.signal : undefined,
});
Expand Down
5 changes: 3 additions & 2 deletions src/core/api/boundaries.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,8 @@ export function getBoundaries(
return apiClient.post<GeoJSON.FeatureCollection>(
'/boundaries',
new GeoJSONPoint(coords),
false,
{ signal: abortController ? abortController.signal : undefined },
{
signal: abortController ? abortController.signal : undefined,
},
);
}
6 changes: 4 additions & 2 deletions src/core/api/features.ts
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,9 @@ function updateFeatureConfiguration(
return apiClient.put(
`/features/${featureId}?appId=${configRepo.get().id}`,
featureConfiguration,
true,
requestConfig,
{
...requestConfig,
authRequirement: apiClient.AUTH_REQUIREMENT.MUST,
},
);
}
16 changes: 9 additions & 7 deletions src/core/api/insights.ts
Original file line number Diff line number Diff line change
@@ -1,5 +1,5 @@
import { configRepo } from '~core/config';
import { apiClient } from '~core/apiClientInstance';
import { configRepo } from '~core/config';
import { i18n } from '~core/localization';
import type { AdvancedAnalyticsData, AnalyticsData, LLMAnalyticsData } from '~core/types';

Expand All @@ -13,21 +13,24 @@ export function getPolygonDetails(
appId: configRepo.get().id,
features,
},
true,
{ signal: abortController.signal, errorsConfig: { hideErrors: true } },
{
signal: abortController.signal,
errorsConfig: { hideErrors: true },
},
);
}

// Advanced Analytics for authenticated user
export function getAdvancedPolygonDetails(
geometry: GeoJSON.GeoJSON,
abortController: AbortController,
) {
return apiClient.post<AdvancedAnalyticsData[] | null>(
`/advanced_polygon_details/`,
geometry,
true,
{ signal: abortController.signal, errorsConfig: { hideErrors: true } },
{
signal: abortController.signal,
errorsConfig: { hideErrors: true },
},
);
}

Expand All @@ -41,7 +44,6 @@ export function getLlmAnalysis(
appId: configRepo.get().id,
features: geometry,
},
true,
{
signal: abortController.signal,
headers: { 'user-language': i18n.instance.language },
Expand Down
17 changes: 9 additions & 8 deletions src/core/api/layers.ts
Original file line number Diff line number Diff line change
Expand Up @@ -10,7 +10,6 @@ export function getGlobalLayers(abortController: AbortController) {
return apiClient.post<LayerSummaryDto[]>(
'/layers/search/global',
{ appId: configRepo.get().id },
true,
{
errorsConfig: { messages: LAYERS_IN_AREA_API_ERROR },
signal: abortController.signal,
Expand All @@ -34,7 +33,6 @@ export function getLayersInArea(
appId: configRepo.get().id,
...params,
},
true,
{
errorsConfig: { messages: LAYERS_IN_AREA_API_ERROR },
signal: abortController.signal,
Expand All @@ -46,8 +44,9 @@ export async function getDefaultLayers(appId: string, language: string) {
const layers = await apiClient.get<LayerDetailsDto[]>(
`/apps/${appId}/layers`,
undefined,
true,
{ headers: { 'user-language': language } },
{
headers: { 'user-language': language },
},
);
// TODO: use layers source configs to cache layer data
return layers ?? [];
Expand All @@ -60,8 +59,9 @@ export async function getLayersDetails(ids: string[], appId: string, language: s
layersToRetrieveWithoutGeometryFilter: ids,
appId: appId,
},
true,
{ headers: { 'user-language': language } },
{
headers: { 'user-language': language },
},
);
// TODO: use layers source configs to cache layer data
return layers ?? [];
Expand All @@ -78,7 +78,8 @@ export function getLayerFeatures(
appId: configRepo.get().id,
geoJSON,
},
true,
{ signal: abortController.signal },
{
signal: abortController.signal,
},
);
}
3 changes: 1 addition & 2 deletions src/core/api/mcda.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@ export function getBivariateAxes(minQuality: number, abortController?: AbortCont
if (minQuality < 0 || minQuality > 1) {
throw new Error('minQuality must be >= 0 and <= 1');
}
return apiClient.get<AxisDTO[]>(`/axis?minQuality=${minQuality}`, undefined, true, {
return apiClient.get<AxisDTO[]>(`/axis?minQuality=${minQuality}`, undefined, {
signal: abortController ? abortController.signal : undefined,
});
}
Expand All @@ -19,7 +19,6 @@ export function getAxisTransformations(
return apiClient.get<AxisTransformationWithPoints[]>(
`/axis/${numeratorName}/${denominatorName}/transformations`,
undefined,
true,
{
signal: abortController ? abortController.signal : undefined,
},
Expand Down
4 changes: 1 addition & 3 deletions src/core/api/search.ts
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { apiClient } from '~core/apiClientInstance';
import { configRepo } from '~core/config';
import { i18n } from '~core/localization';
import type { Geometry } from 'geojson';
import type { MCDAConfig } from '~core/logical_layers/renderers/stylesConfigs/mcda/types';
import type { Bbox } from '~core/shared_state/currentMapPosition';
import type { Geometry } from 'geojson';

export interface LocationProperties {
display_name: string;
Expand All @@ -19,7 +19,6 @@ export function getLocations(query: string, abortController?: AbortController) {
return apiClient.get<LocationsDTO>(
'/search',
{ appId: configRepo.get().id, query },
true,
{
signal: abortController ? abortController.signal : undefined,
errorsConfig: { hideErrors: true },
Expand All @@ -37,7 +36,6 @@ export function getMCDA(query: string, abortController?: AbortController) {
return apiClient.get<MCDASearchDTO>(
'/search/mcda_suggestion',
{ appId: configRepo.get().id, query },
true,
{
signal: abortController ? abortController.signal : undefined,
errorsConfig: { hideErrors: true },
Expand Down
4 changes: 2 additions & 2 deletions src/core/api/subscription.ts
Original file line number Diff line number Diff line change
Expand Up @@ -11,7 +11,7 @@ export async function getCurrentUserSubscription() {
return await apiClient.get<CurrentSubscription | null>(
'/users/current_user/billing_subscription',
{ appId: configRepo.get().id },
true,
{ authRequirement: apiClient.AUTH_REQUIREMENT.MUST },
);
}

Expand All @@ -23,6 +23,6 @@ export async function setCurrentUserSubscription(
return await apiClient.post<CurrentSubscription | null>(
`/users/current_user/billing_subscription`,
{ appId, billingPlanId, billingSubscriptionId },
true,
{ authRequirement: apiClient.AUTH_REQUIREMENT.MUST },
);
}
8 changes: 4 additions & 4 deletions src/core/api/users.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import { apiClient } from '~core/apiClientInstance';
import type { UserDto } from '~core/app/user';

export function getCurrentUser() {
return apiClient.get<UserDto>('/users/current_user', undefined, true, {
// errorsConfig: { messages: '' },
return apiClient.get<UserDto>('/users/current_user', undefined, {
authRequirement: apiClient.AUTH_REQUIREMENT.MUST,
});
}

export function updateCurrentUser(user: UserDto) {
return apiClient.put<UserDto>('/users/current_user', user, true, {
// errorsConfig: { messages: '' },
return apiClient.put<UserDto>('/users/current_user', user, {
authRequirement: apiClient.AUTH_REQUIREMENT.MUST,
});
}
Loading

0 comments on commit a1d855c

Please sign in to comment.