Skip to content

Commit

Permalink
chore(IDPay): [IODPAY-152] IDPay client refactoring with merged API d…
Browse files Browse the repository at this point in the history
…efinitions (pagopa#4379)

## Short description

This PR introduces a single IDPay API client that combines all the IDPay
API definitions. The old separated API clients was removed, resulting in
a more streamlined and easy-to-understand code structure.

## List of changes proposed in this pull request
- Removed old, splitted, IDPay APIs clients (wallet, initiative,
onboarding, timeline)
- Added a new IDPay API client shared between all IDPay sub-features
- Refactoring of imports and folders to match new definitions
- Added `generate:idpay` script to generate IDPay API definitions

## How to test
`yarn test`
  • Loading branch information
mastro993 authored Mar 6, 2023
1 parent 244590a commit 3666d00
Show file tree
Hide file tree
Showing 57 changed files with 393 additions and 460 deletions.
11 changes: 3 additions & 8 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -23,10 +23,7 @@
"pagopa_api_walletv2": "https://raw.githubusercontent.com/pagopa/io-services-metadata/1.0.24/bonus/specs/bpd/pm/walletv2.json",
"pagopa_cobadge_configuration": "https://raw.githubusercontent.com/pagopa/io-services-metadata/1.0.24/pagopa/cobadge/abi_definitions.yml",
"pagopa_privative_configuration": "https://raw.githubusercontent.com/pagopa/io-services-metadata/1.0.24/pagopa/privative/definitions.yml",
"idpay_onboarding": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v2.12.1/src/domains/idpay-app/api/idpay_onboarding_workflow/openapi.onboarding.yml",
"idpay_wallet": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v2.17.0/src/domains/idpay-app/api/idpay_wallet/openapi.wallet.yml",
"idpay_timeline": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v2.24.1/src/domains/idpay-app/api/idpay_timeline/openapi.timeline.yml",
"idpay_iban": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v1.101.0/src/domains/idpay-app/api/idpay_iban/openapi.iban.yml",
"idpay_api": "https://raw.githubusercontent.com/pagopa/cstar-infrastructure/v2.30.0/src/domains/idpay-app/api/idpay_appio_full/openapi.appio.full.yml",
"private": true,
"scripts": {
"start": "react-native start",
Expand Down Expand Up @@ -88,10 +85,8 @@
"generate:cdc": "npm-run-all generate:cdc-api",
"generate:pn": "npm-run-all generate:pn-definitions",
"generate:fci": "npm-run-all generate:fci-api",
"generate:idpay-onboarding": "rimraf definitions/idpay/onboarding && mkdir -p definitions/idpay/onboarding && gen-api-models --api-spec $npm_package_idpay_onboarding --out-dir ./definitions/idpay/onboarding --no-strict --response-decoders --request-types --client",
"generate:idpay-wallet": "rimraf definitions/idpay/wallet && mkdir -p definitions/idpay/wallet && gen-api-models --api-spec $npm_package_idpay_wallet --out-dir ./definitions/idpay/wallet --no-strict --response-decoders --request-types --client",
"generate:idpay-timeline": "rimraf definitions/idpay/timeline && mkdir -p definitions/idpay/timeline && gen-api-models --api-spec $npm_package_idpay_timeline --out-dir ./definitions/idpay/timeline --no-strict --response-decoders --request-types --client",
"generate:idpay-iban": "rimraf definitions/idpay/iban && mkdir -p definitions/idpay/iban && gen-api-models --api-spec $npm_package_idpay_iban --out-dir ./definitions/idpay/iban --no-strict --response-decoders --request-types --client",
"generate:idpay-api": "rimraf definitions/idpay && mkdir -p definitions/idpay && gen-api-models --api-spec $npm_package_idpay_api --out-dir ./definitions/idpay --no-strict --response-decoders --request-types --client",
"generate:idpay": "npm-run-all generate:idpay-api",
"generate": "npm-run-all generate:*",
"locales_unused": "ts-node --skip-project -O '{\"lib\":[\"es2015\"]}' scripts/unused-locales.ts",
"generate-myportal-readme": "jsdoc2md ts/utils/webviewScripts/*.js > MYPORTAL_README.md",
Expand Down
2 changes: 1 addition & 1 deletion ts/features/design-system/core/DSListItems.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -22,7 +22,7 @@ import { ProductCategoryEnum } from "../../../../definitions/cgn/merchants/Produ
import CgnMerchantListItem from "../../bonus/cgn/components/merchants/CgnMerchantListItem";
import DetailedlistItemComponent from "../../../components/DetailedlistItemComponent";
import { TimelineOperationListItem } from "../../idpay/initiative/details/components/TimelineOperationListItem";
import { OperationTypeEnum } from "../../../../definitions/idpay/timeline/TransactionOperationDTO";
import { OperationTypeEnum } from "../../../../definitions/idpay/TransactionOperationDTO";
import { DesignSystemScreen } from "../components/DesignSystemScreen";
import { VSpacer } from "../../../components/core/spacer/Spacer";

Expand Down
20 changes: 20 additions & 0 deletions ts/features/idpay/common/api/__mocks__/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
export const mockIDPayClient = {
getInitiativeData: jest.fn(),
checkPrerequisites: jest.fn(),
consentOnboarding: jest.fn(),
onboardingCitizen: jest.fn(),
onboardingStatus: jest.fn(),
deleteInstrument: jest.fn(),
enrollIban: jest.fn(),
enrollInstrument: jest.fn(),
getIban: jest.fn(),
getIbanList: jest.fn(),
getInstrumentList: jest.fn(),
getTimeline: jest.fn(),
getTimelineDetail: jest.fn(),
getWallet: jest.fn(),
getWalletDetail: jest.fn(),
getWalletStatus: jest.fn(),
unsubscribe: jest.fn(),
getInitiativesWithInstrument: jest.fn()
};
12 changes: 12 additions & 0 deletions ts/features/idpay/common/api/client.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,12 @@
import { createClient } from "../../../../../definitions/idpay/client";
import { defaultRetryingFetch } from "../../../../utils/fetch";

const createIDPayClient = (baseUrl: string) =>
createClient({
baseUrl,
fetchApi: defaultRetryingFetch()
});

export type IDPayClient = ReturnType<typeof createIDPayClient>;

export { createIDPayClient };
2 changes: 1 addition & 1 deletion ts/features/idpay/common/labels.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import { StatusEnum } from "../../../../definitions/idpay/wallet/InstrumentDTO";
import { StatusEnum } from "../../../../definitions/idpay/InstrumentDTO";
import I18n from "../../../i18n";

type InstrumentStatusLabels = {
Expand Down
43 changes: 43 additions & 0 deletions ts/features/idpay/common/saga/index.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
import { pipe } from "fp-ts/lib/function";
import * as O from "fp-ts/lib/Option";
import { SagaIterator } from "redux-saga";
import { fork, select } from "typed-redux-saga/macro";
import { PreferredLanguageEnum } from "../../../../../definitions/backend/PreferredLanguage";
import {
idPayApiBaseUrl,
idPayApiUatBaseUrl,
idPayTestToken
} from "../../../../config";
import {
isPagoPATestEnabledSelector,
preferredLanguageSelector
} from "../../../../store/reducers/persistedPreferences";
import { fromLocaleToPreferredLanguage } from "../../../../utils/locale";
import { watchIDPayInitiativeDetailsSaga } from "../../initiative/details/saga";
import { watchIDPayWalletSaga } from "../../wallet/saga";
import { createIDPayClient } from "../api/client";

export function* watchIDPaySaga(bpdToken: string): SagaIterator {
const isPagoPATestEnabled = yield* select(isPagoPATestEnabledSelector);

const baseUrl = isPagoPATestEnabled ? idPayApiUatBaseUrl : idPayApiBaseUrl;
const token = idPayTestToken ?? bpdToken;

const language = yield* select(preferredLanguageSelector);

const preferredLanguage = pipe(
language,
O.map(fromLocaleToPreferredLanguage),
O.getOrElse(() => PreferredLanguageEnum.it_IT)
);

const client = createIDPayClient(baseUrl);

yield* fork(watchIDPayWalletSaga, client, token, preferredLanguage);
yield* fork(
watchIDPayInitiativeDetailsSaga,
client,
token,
preferredLanguage
);
}
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ import { Image, StyleSheet, View } from "react-native";
import {
InstrumentDTO,
StatusEnum as InstrumentStatusEnum
} from "../../../../../../definitions/idpay/wallet/InstrumentDTO";
} from "../../../../../../definitions/idpay/InstrumentDTO";
import defaultCardIcon from "../../../../../../img/wallet/cards-icons/unknown.png";
import {
IOLogoPaymentType,
Expand Down
12 changes: 0 additions & 12 deletions ts/features/idpay/initiative/configuration/iban/api/client.ts

This file was deleted.

Original file line number Diff line number Diff line change
Expand Up @@ -2,13 +2,13 @@ import { createStackNavigator } from "@react-navigation/stack";
import React from "react";
import IbanEnrollmentScreen, {
IbanEnrollmentScreenRouteParams
} from "../iban/screens/IbanEnrollmentScreen";
} from "../screens/IbanEnrollmentScreen";
import InitiativeConfigurationIntroScreen, {
InitiativeConfigurationIntroScreenRouteParams
} from "../screens/InitiativeConfigurationIntroScreen";
import ConfigurationSuccessScreen from "../screens/ConfigurationSuccessScreen";
import IbanConfigurationLanding from "../iban/screens/IbanConfigurationLandingScreen";
import IbanOnboardingScreen from "../iban/screens/IbanOnboardingScreen";
import IbanConfigurationLanding from "../screens/IbanConfigurationLandingScreen";
import IbanOnboardingScreen from "../screens/IbanOnboardingScreen";
import InstrumentsEnrollmentScreen, {
InstrumentsEnrollmentScreenRouteParams
} from "../screens/InstrumentsEnrollmentScreen";
Expand Down
Original file line number Diff line number Diff line change
@@ -1,15 +1,15 @@
import React from "react";
import { View, SafeAreaView, StyleSheet } from "react-native";
import { VSpacer } from "../../../../../../components/core/spacer/Spacer";
import { Body } from "../../../../../../components/core/typography/Body";
import { H3 } from "../../../../../../components/core/typography/H3";
import { IOColors } from "../../../../../../components/core/variables/IOColors";
import { IOStyles } from "../../../../../../components/core/variables/IOStyles";
import BaseScreenComponent from "../../../../../../components/screens/BaseScreenComponent";
import FooterWithButtons from "../../../../../../components/ui/FooterWithButtons";
import I18n from "../../../../../../i18n";
import { emptyContextualHelp } from "../../../../../../utils/emptyContextualHelp";
import { useConfigurationMachineService } from "../../xstate/provider";
import { VSpacer } from "../../../../../components/core/spacer/Spacer";
import { Body } from "../../../../../components/core/typography/Body";
import { H3 } from "../../../../../components/core/typography/H3";
import { IOColors } from "../../../../../components/core/variables/IOColors";
import { IOStyles } from "../../../../../components/core/variables/IOStyles";
import BaseScreenComponent from "../../../../../components/screens/BaseScreenComponent";
import FooterWithButtons from "../../../../../components/ui/FooterWithButtons";
import I18n from "../../../../../i18n";
import { emptyContextualHelp } from "../../../../../utils/emptyContextualHelp";
import { useConfigurationMachineService } from "../xstate/provider";

const styles = StyleSheet.create({
greyCircle: {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,32 +2,29 @@ import { RouteProp, useRoute } from "@react-navigation/native";
import { useSelector } from "@xstate/react";
import React from "react";
import { View, SafeAreaView, ScrollView, StyleSheet } from "react-native";
import { IbanDTO } from "../../../../../../../definitions/idpay/iban/IbanDTO";
import { Icon } from "../../../../../../components/core/icons";
import {
HSpacer,
VSpacer
} from "../../../../../../components/core/spacer/Spacer";
import { Body } from "../../../../../../components/core/typography/Body";
import { H1 } from "../../../../../../components/core/typography/H1";
import { IOStyles } from "../../../../../../components/core/variables/IOStyles";
import LoadingSpinnerOverlay from "../../../../../../components/LoadingSpinnerOverlay";
import BaseScreenComponent from "../../../../../../components/screens/BaseScreenComponent";
import ListItemComponent from "../../../../../../components/screens/ListItemComponent";
import FooterWithButtons from "../../../../../../components/ui/FooterWithButtons";
import I18n from "../../../../../../i18n";
import { emptyContextualHelp } from "../../../../../../utils/emptyContextualHelp";
import { IDPayConfigurationParamsList } from "../../navigation/navigator";
import { ConfigurationMode } from "../../xstate/context";
import { useConfigurationMachineService } from "../../xstate/provider";
import { IbanDTO } from "../../../../../../definitions/idpay/IbanDTO";
import { Icon } from "../../../../../components/core/icons";
import { HSpacer, VSpacer } from "../../../../../components/core/spacer/Spacer";
import { Body } from "../../../../../components/core/typography/Body";
import { H1 } from "../../../../../components/core/typography/H1";
import { IOStyles } from "../../../../../components/core/variables/IOStyles";
import LoadingSpinnerOverlay from "../../../../../components/LoadingSpinnerOverlay";
import BaseScreenComponent from "../../../../../components/screens/BaseScreenComponent";
import ListItemComponent from "../../../../../components/screens/ListItemComponent";
import FooterWithButtons from "../../../../../components/ui/FooterWithButtons";
import I18n from "../../../../../i18n";
import { emptyContextualHelp } from "../../../../../utils/emptyContextualHelp";
import { IDPayConfigurationParamsList } from "../navigation/navigator";
import { ConfigurationMode } from "../xstate/context";
import { useConfigurationMachineService } from "../xstate/provider";
import {
ibanListSelector,
isLoadingSelector,
isUpsertingIbanSelector,
selectEnrolledIban,
selectIsIbanOnlyMode
} from "../../xstate/selectors";
import { LabelSmall } from "../../../../../../components/core/typography/LabelSmall";
} from "../xstate/selectors";
import { LabelSmall } from "../../../../../components/core/typography/LabelSmall";

type IbanEnrollmentScreenRouteParams = {
initiativeId?: string;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -3,25 +3,22 @@ import * as E from "fp-ts/lib/Either";
import { pipe } from "fp-ts/lib/function";
import * as O from "fp-ts/lib/Option";
import React from "react";
import { View, SafeAreaView, ScrollView } from "react-native";
import { Iban } from "../../../../../../../definitions/backend/Iban";
import { Icon } from "../../../../../../components/core/icons";
import {
VSpacer,
HSpacer
} from "../../../../../../components/core/spacer/Spacer";
import { Body } from "../../../../../../components/core/typography/Body";
import { H1 } from "../../../../../../components/core/typography/H1";
import { LabelSmall } from "../../../../../../components/core/typography/LabelSmall";
import { Link } from "../../../../../../components/core/typography/Link";
import { IOStyles } from "../../../../../../components/core/variables/IOStyles";
import { LabelledItem } from "../../../../../../components/LabelledItem";
import BaseScreenComponent from "../../../../../../components/screens/BaseScreenComponent";
import FooterWithButtons from "../../../../../../components/ui/FooterWithButtons";
import I18n from "../../../../../../i18n";
import { emptyContextualHelp } from "../../../../../../utils/emptyContextualHelp";
import { LOADING_TAG } from "../../../../../../utils/xstate";
import { useConfigurationMachineService } from "../../xstate/provider";
import { SafeAreaView, ScrollView, View } from "react-native";
import { Iban } from "../../../../../../definitions/backend/Iban";
import { Icon } from "../../../../../components/core/icons";
import { HSpacer, VSpacer } from "../../../../../components/core/spacer/Spacer";
import { Body } from "../../../../../components/core/typography/Body";
import { H1 } from "../../../../../components/core/typography/H1";
import { LabelSmall } from "../../../../../components/core/typography/LabelSmall";
import { Link } from "../../../../../components/core/typography/Link";
import { IOStyles } from "../../../../../components/core/variables/IOStyles";
import { LabelledItem } from "../../../../../components/LabelledItem";
import BaseScreenComponent from "../../../../../components/screens/BaseScreenComponent";
import FooterWithButtons from "../../../../../components/ui/FooterWithButtons";
import I18n from "../../../../../i18n";
import { emptyContextualHelp } from "../../../../../utils/emptyContextualHelp";
import { LOADING_TAG } from "../../../../../utils/xstate";
import { useConfigurationMachineService } from "../xstate/provider";

const IbanOnboardingScreen = () => {
const configurationMachine = useConfigurationMachineService();
Expand Down
Original file line number Diff line number Diff line change
@@ -1,20 +1,20 @@
import * as React from "react";
import configureMockStore from "redux-mock-store";
import { interpret } from "xstate";
import { applicationChangeState } from "../../../../../../../store/actions/application";
import { appReducer } from "../../../../../../../store/reducers";
import { GlobalState } from "../../../../../../../store/reducers/types";
import { renderScreenFakeNavRedux } from "../../../../../../../utils/testWrapper";
import { IDPayConfigurationRoutes } from "../../../navigation/navigator";
import { createIDPayInitiativeConfigurationMachine } from "../../../xstate/machine";
import { ConfigurationMachineContext } from "../../../xstate/provider";
import { applicationChangeState } from "../../../../../../store/actions/application";
import { appReducer } from "../../../../../../store/reducers";
import { GlobalState } from "../../../../../../store/reducers/types";
import { renderScreenFakeNavRedux } from "../../../../../../utils/testWrapper";
import { IDPayConfigurationRoutes } from "../../navigation/navigator";
import { createIDPayInitiativeConfigurationMachine } from "../../xstate/machine";
import { ConfigurationMachineContext } from "../../xstate/provider";
import IbanEnrollmentScreen from "../IbanEnrollmentScreen";
import I18n from "../../../../../../../i18n";
import I18n from "../../../../../../i18n";
import {
ConfigurationMode,
Context,
INITIAL_CONTEXT
} from "../../../xstate/context";
} from "../../xstate/context";

describe("IbanEnrollmentScreen", () => {
beforeEach(() => {
Expand Down
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
import { IbanListDTO } from "../../../../../../../definitions/idpay/iban/IbanListDTO";
import { IbanListDTO } from "../../../../../../../definitions/idpay/IbanListDTO";
import {
InitiativeDTO,
StatusEnum
} from "../../../../../../../definitions/idpay/wallet/InitiativeDTO";
import { InstrumentDTO } from "../../../../../../../definitions/idpay/wallet/InstrumentDTO";
} from "../../../../../../../definitions/idpay/InitiativeDTO";
import { InstrumentDTO } from "../../../../../../../definitions/idpay/InstrumentDTO";

import { TypeEnum as WalletTypeEnumV1 } from "../../../../../../../definitions/pagopa/Wallet";
import { Wallet } from "../../../../../../types/pagopa";
Expand Down Expand Up @@ -46,7 +46,12 @@ export const T_REFUNDABLE_INITIATIVE_DTO: InitiativeDTO = {
};

export const T_IBAN_LIST: IbanListDTO["ibanList"] = [
{ channel: "IO", checkIbanStatus: "", description: "Test", iban: T_IBAN }
{
channel: "IO",
checkIbanStatus: "",
description: "Test",
iban: T_IBAN
}
];

export const T_PAGOPA_INSTRUMENTS = [T_WALLET];
Expand Down
Loading

0 comments on commit 3666d00

Please sign in to comment.