diff --git a/packages/client/src/__tests__/__snapshots__/index.test.ts.snap b/packages/client/src/__tests__/__snapshots__/index.test.ts.snap index 524d5f1c0..1cd699502 100644 --- a/packages/client/src/__tests__/__snapshots__/index.test.ts.snap +++ b/packages/client/src/__tests__/__snapshots__/index.test.ts.snap @@ -64,6 +64,11 @@ Object { "PreOwned": "PreOwned", "SubBrand": "SubBrand", }, + "ChannelVNext": Object { + "Email": "Email", + "None": "None", + "Sms": "Sms", + }, "ChargeDeclineCode": Object { "Default": "Default", "Generic": "Generic", @@ -394,6 +399,11 @@ Object { "FFCountry": "FF-Country", "FFCurrency": "FF-Currency", }, + "InvalidationsVNext": Object { + "InvCountryCodeLib": "InvCountryCodeLib", + "InvCulturalCodeApi": "InvCulturalCodeApi", + "InvCulturalCodeLib": "InvCulturalCodeLib", + }, "MerchantLocationWeekday": Object { "0": "Sunday", "1": "Monday", @@ -1188,6 +1198,7 @@ Object { "getStaffMember": [Function], "getSubscriptionPackages": [Function], "getSubscriptions": [Function], + "getSubscriptionsVNext": [Function], "getTheme": [Function], "getTopCategories": [Function], "getTranslations": [Function], diff --git a/packages/client/src/subscriptions/__fixtures__/getSubscriptions.vnext.fixtures.ts b/packages/client/src/subscriptions/__fixtures__/getSubscriptions.vnext.fixtures.ts new file mode 100644 index 000000000..8b7988151 --- /dev/null +++ b/packages/client/src/subscriptions/__fixtures__/getSubscriptions.vnext.fixtures.ts @@ -0,0 +1,17 @@ +import { rest, type RestHandler } from 'msw'; +import type { SubscriptionVNext } from '../types/index.js'; + +const path = '/api/marketing/vNext/Subscriptions'; + +const fixtures = { + success: (response: SubscriptionVNext[]): RestHandler => + rest.get(path, (_req, res, ctx) => + res(ctx.status(200), ctx.json(response)), + ), + failure: (): RestHandler => + rest.get(path, (_req, res, ctx) => + res(ctx.status(404), ctx.json({ message: 'stub error' })), + ), +}; + +export default fixtures; diff --git a/packages/client/src/subscriptions/__tests__/__snapshots__/getSubscriptions.vnext.test.ts.snap b/packages/client/src/subscriptions/__tests__/__snapshots__/getSubscriptions.vnext.test.ts.snap new file mode 100644 index 000000000..1b2dd0d73 --- /dev/null +++ b/packages/client/src/subscriptions/__tests__/__snapshots__/getSubscriptions.vnext.test.ts.snap @@ -0,0 +1,11 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`getSubscriptionsVNext should receive a client request error 1`] = ` +Object { + "code": "-1", + "message": "stub error", + "name": "AxiosError", + "status": 404, + "transportLayerErrorCode": "ERR_BAD_REQUEST", +} +`; diff --git a/packages/client/src/subscriptions/__tests__/getSubscriptions.vnext.test.ts b/packages/client/src/subscriptions/__tests__/getSubscriptions.vnext.test.ts new file mode 100644 index 000000000..374e7fb44 --- /dev/null +++ b/packages/client/src/subscriptions/__tests__/getSubscriptions.vnext.test.ts @@ -0,0 +1,34 @@ +import { getSubscriptionsVNext } from '../index.js'; +import { mockGetSubscriptionsVNext } from 'tests/__fixtures__/subscriptions/index.mjs'; +import client from '../../helpers/client/index.js'; +import fixtures from '../__fixtures__/getSubscriptions.vnext.fixtures.js'; +import join from 'proper-url-join'; +import mswServer from '../../../tests/mswServer.js'; + +describe('getSubscriptionsVNext', () => { + const expectedConfig = undefined; + const spy = jest.spyOn(client, 'get'); + const defaultUrl = join('/marketing/vNext/Subscriptions', { + query: mockGetSubscriptionsVNext.query, + }); + + it('should handle a client request successfully', async () => { + mswServer.use(fixtures.success(mockGetSubscriptionsVNext.response)); + + await expect( + getSubscriptionsVNext(mockGetSubscriptionsVNext.query), + ).resolves.toEqual(mockGetSubscriptionsVNext.response); + + expect(spy).toHaveBeenCalledWith(defaultUrl, expectedConfig); + }); + + it('should receive a client request error', async () => { + mswServer.use(fixtures.failure()); + + await expect( + getSubscriptionsVNext(mockGetSubscriptionsVNext.query), + ).rejects.toMatchSnapshot(); + + expect(spy).toHaveBeenCalledWith(defaultUrl, expectedConfig); + }); +}); diff --git a/packages/client/src/subscriptions/getSubscriptions.ts b/packages/client/src/subscriptions/getSubscriptions.ts index bfbc3e4dc..8ba38fc69 100644 --- a/packages/client/src/subscriptions/getSubscriptions.ts +++ b/packages/client/src/subscriptions/getSubscriptions.ts @@ -4,6 +4,7 @@ import join from 'proper-url-join'; import type { GetSubscriptions } from './types/index.js'; /** + * @deprecated Use `getSubscriptionsVNext` instead. * Method responsible for retrieving data from subscriptions endpoint on MKT API. * * @param query - Query parameters to apply. @@ -11,15 +12,9 @@ import type { GetSubscriptions } from './types/index.js'; * * @returns Promise that will resolve when the call to the endpoint finishes. */ - const getSubscriptions: GetSubscriptions = (query, config) => client - .get( - join('/marketing/v1/subscriptions', { - query, - }), - config, - ) + .get(join('/marketing/v1/subscriptions', { query }), config) .then(response => response.data) .catch(error => { throw adaptError(error); diff --git a/packages/client/src/subscriptions/getSubscriptions.vnext.ts b/packages/client/src/subscriptions/getSubscriptions.vnext.ts new file mode 100644 index 000000000..dc37f9432 --- /dev/null +++ b/packages/client/src/subscriptions/getSubscriptions.vnext.ts @@ -0,0 +1,22 @@ +import { adaptError } from '../helpers/client/formatError.js'; +import client from '../helpers/client/index.js'; +import join from 'proper-url-join'; +import type { GetSubscriptionsVNext } from './types/index.js'; + +/** + * Method responsible for retrieving data from subscriptions endpoint on MKT API. + * + * @param query - Query parameters to apply. + * @param config - Custom configurations to send to the client instance (axios). + * + * @returns Promise that will resolve when the call to the endpoint finishes. + */ +const getSubscriptionsVNext: GetSubscriptionsVNext = (query, config) => + client + .get(join('marketing/vNext/Subscriptions', { query }), config) + .then(({ data }) => data) + .catch(error => { + throw adaptError(error); + }); + +export default getSubscriptionsVNext; diff --git a/packages/client/src/subscriptions/index.ts b/packages/client/src/subscriptions/index.ts index 9b8395574..efe2e2998 100644 --- a/packages/client/src/subscriptions/index.ts +++ b/packages/client/src/subscriptions/index.ts @@ -1,5 +1,6 @@ export { default as putSubscriptions } from './putSubscriptions.js'; export { default as getSubscriptions } from './getSubscriptions.js'; +export { default as getSubscriptionsVNext } from './getSubscriptions.vnext.js'; export { default as getSubscriptionPackages } from './getSubscriptionPackages.js'; export { default as deleteSubscription } from './deleteSubscription.js'; export { default as deleteSubscriptionTopicRecipient } from './deleteSubscriptionTopicRecipient.js'; diff --git a/packages/client/src/subscriptions/types/getSubscriptions.vnext.types.ts b/packages/client/src/subscriptions/types/getSubscriptions.vnext.types.ts new file mode 100644 index 000000000..ec902ea6d --- /dev/null +++ b/packages/client/src/subscriptions/types/getSubscriptions.vnext.types.ts @@ -0,0 +1,76 @@ +import type { Config } from '../../types/index.js'; + +export type GetSubscriptionsVNext = ( + query: GetSubscriptionsQueryVNext, + config?: Config, +) => Promise; + +export type SubscriptionVNext = { + id: string; + userId?: string; + tenantId: number; + metadata?: SubscriptionMetadataVNext; + topics: SubscriptionTopicVNext[]; + invalidMessages?: SubscriptionInvalidationVNext; +}; + +// * used: "#/components/schemas/SubscriptionInvalidation" +export type SubscriptionInvalidationVNext = { + code?: InvalidationsVNext; + description?: string; +}; + +// * used: "#/components/schemas/Invalidations" +export enum InvalidationsVNext { + InvCountryCodeLib = 'InvCountryCodeLib', + InvCulturalCodeLib = 'InvCulturalCodeLib', + InvCulturalCodeApi = 'InvCulturalCodeApi', +} + +export type SubscriptionMetadataVNext = Record; + +// * used: "#/components/schemas/SubscriptionTopicResponse" +export type SubscriptionTopicVNext = { + name?: string; + specification?: Record; + channels?: SubscriptionDeliveryChannelVNext[]; +}; + +// * used: "#/components/schemas/DeliveryChannelResponse" +export type SubscriptionDeliveryChannelVNext = { + chanel: ChannelVNext; + recipient?: string; + source?: string; +}; + +// * used: "#/components/schemas/Channel" +export enum ChannelVNext { + None = 'None', + Email = 'Email', + Sms = 'Sms', +} + +/** + /v1/Subscriptions + get: + tags: + - Subscriptions + */ +export type GetSubscriptionsQueryVNext = { + /** + * Subscription id. Use this when you do not have a registered user in conjunction with recipientHash. + */ + id?: string; + + /** + * User id. Use this when you have a registered user. This parameter is mutually + * exclusive with `recipientHash`. + */ + userId?: string; + + /** + * Hash of the recipient's email. Use this when you do not have a registered user. + * This parameter is mutually exclusive with `userId`. + */ + recipient?: string; +}; diff --git a/packages/client/src/subscriptions/types/index.ts b/packages/client/src/subscriptions/types/index.ts index b0bf4c332..7d61fa90c 100644 --- a/packages/client/src/subscriptions/types/index.ts +++ b/packages/client/src/subscriptions/types/index.ts @@ -3,3 +3,4 @@ export * from './getSubscriptionPackages.types.js'; export * from './deleteSubscription.types.js'; export * from './deleteSubscriptionTopicRecipient.js'; export * from './putSubscriptions.types.js'; +export * from './getSubscriptions.vnext.types.js'; diff --git a/packages/redux/src/subscriptions/actionTypes.ts b/packages/redux/src/subscriptions/actionTypes.ts index 930814cfd..ab214eb0d 100644 --- a/packages/redux/src/subscriptions/actionTypes.ts +++ b/packages/redux/src/subscriptions/actionTypes.ts @@ -104,3 +104,19 @@ export const CLEAR_UNSUBSCRIBE_SUBSCRIPTION_TOPIC_RECIPIENT_REQUEST = */ export const CLEAR_ALL_UNSUBSCRIBE_SUBSCRIPTION_TOPIC_RECIPIENT_FROM_REQUESTS = '@farfetch/blackout-redux/CLEAR_ALL_UNSUBSCRIBE_SUBSCRIPTION_TOPIC_RECIPIENT_FROM_REQUESTS'; + +/** + * xNext - Action type dispatched when the fetch user subscriptions request fails. + */ +export const FETCH_USER_SUBSCRIPTIONS_FAILURE_VNEXT = + '@farfetch/blackout-redux/FETCH_USER_SUBSCRIPTIONS_FAILURE_VNEXT'; +/** + * xNext - Action type dispatched when the fetch user subscriptions request starts. + */ +export const FETCH_USER_SUBSCRIPTIONS_REQUEST_VNEXT = + '@farfetch/blackout-redux/FETCH_USER_SUBSCRIPTIONS_REQUEST_VNEXT'; +/** + * xNext - Action type dispatched when the fetch user subscriptions request succeeds. + */ +export const FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT = + '@farfetch/blackout-redux/FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT'; diff --git a/packages/redux/src/subscriptions/actions/__tests__/__snapshots__/fetchUserSubscriptions.vnext.test.ts.snap b/packages/redux/src/subscriptions/actions/__tests__/__snapshots__/fetchUserSubscriptions.vnext.test.ts.snap new file mode 100644 index 000000000..663083dec --- /dev/null +++ b/packages/redux/src/subscriptions/actions/__tests__/__snapshots__/fetchUserSubscriptions.vnext.test.ts.snap @@ -0,0 +1,41 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`Subscriptions redux actions fetchUserSubscriptionsVNext() action creator Should create the correct actions for when the get subscriptions is successful: Fetch subscriptions success payload 1`] = ` +Object { + "payload": Array [ + Object { + "id": "8c2b5c3e3acb4bdd9c26ba46", + "metadata": Object { + "meta": "data", + }, + "tenantId": 19934, + "topics": Array [ + Object { + "channels": Array [ + Object { + "chanel": "None", + "recipient": "1ca9c02be7e27f42bdfdca1afef2618003bbdc7d08fe2e9b54d2ac5af8b37127", + "source": "My Account", + }, + Object { + "chanel": "Email", + "recipient": "3c2b5c3e3acb4bdd9c26ba46", + "source": "My Account", + }, + Object { + "chanel": "Sms", + "recipient": "1234567890", + "source": "My Account", + }, + ], + "name": "Any", + "specification": Object { + "type": "Any", + }, + }, + ], + }, + ], + "type": "@farfetch/blackout-redux/FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT", +} +`; diff --git a/packages/redux/src/subscriptions/actions/__tests__/fetchUserSubscriptions.vnext.test.ts b/packages/redux/src/subscriptions/actions/__tests__/fetchUserSubscriptions.vnext.test.ts new file mode 100644 index 000000000..79c16afa6 --- /dev/null +++ b/packages/redux/src/subscriptions/actions/__tests__/fetchUserSubscriptions.vnext.test.ts @@ -0,0 +1,90 @@ +import * as actionTypes from '../../actionTypes.js'; +import { fetchUserSubscriptionsVNext } from '../index.js'; +import { find } from 'lodash-es'; +import { getSubscriptionsVNext } from '@farfetch/blackout-client'; +import { mockGetSubscriptionsVNext } from 'tests/__fixtures__/subscriptions/index.mjs'; +import { mockStore } from '../../../../tests/index.js'; +import reducer from '../../reducer/index.js'; + +jest.mock('@farfetch/blackout-client', () => { + return { + ...jest.requireActual('@farfetch/blackout-client'), + getSubscriptionsVNext: jest.fn(), + }; +}); + +const randomAction = { type: 'this_is_a_random_action' }; +const subscriptionsMockStore = (state = {}) => + mockStore({ getSubscriptionsVNext: reducer(undefined, randomAction) }, state); + +describe('Subscriptions redux actions', () => { + let store: ReturnType; + + beforeEach(jest.clearAllMocks); + + describe('fetchUserSubscriptionsVNext() action creator', () => { + beforeEach(() => { + store = subscriptionsMockStore(); + }); + + it('Should create the correct actions for when the get subscription fails', async () => { + const expectedError = new Error('get subscriptions error'); + + (getSubscriptionsVNext as jest.Mock).mockRejectedValueOnce(expectedError); + + await expect( + async () => + await fetchUserSubscriptionsVNext(mockGetSubscriptionsVNext.query)( + store.dispatch, + ), + ).rejects.toThrow(expectedError); + + expect(getSubscriptionsVNext).toHaveBeenCalledTimes(1); + expect(getSubscriptionsVNext).toHaveBeenCalledWith( + mockGetSubscriptionsVNext.query, + undefined, + ); + expect(store.getActions()).toEqual( + expect.arrayContaining([ + { type: actionTypes.FETCH_USER_SUBSCRIPTIONS_REQUEST_VNEXT }, + { + type: actionTypes.FETCH_USER_SUBSCRIPTIONS_FAILURE, + payload: { error: expectedError }, + }, + ]), + ); + }); + + it('Should create the correct actions for when the get subscriptions is successful', async () => { + (getSubscriptionsVNext as jest.Mock).mockResolvedValueOnce( + mockGetSubscriptionsVNext.response, + ); + + await fetchUserSubscriptionsVNext(mockGetSubscriptionsVNext.query)( + store.dispatch, + ).then(clientResult => { + expect(clientResult).toBe(mockGetSubscriptionsVNext.response); + }); + + const actionResults = store.getActions(); + + expect(getSubscriptionsVNext).toHaveBeenCalledTimes(1); + expect(getSubscriptionsVNext).toHaveBeenCalledWith( + mockGetSubscriptionsVNext.query, + undefined, + ); + expect(actionResults).toMatchObject([ + { type: actionTypes.FETCH_USER_SUBSCRIPTIONS_REQUEST_VNEXT }, + { + payload: expect.any(Object), + type: actionTypes.FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT, + }, + ]); + expect( + find(actionResults, { + type: actionTypes.FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT, + }), + ).toMatchSnapshot('Fetch subscriptions success payload'); + }); + }); +}); diff --git a/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.ts b/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.ts index 9e4d6d97c..45ec78fb1 100644 --- a/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.ts +++ b/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.ts @@ -6,6 +6,7 @@ import { import type { FetchUserSubscriptionsFactory } from './types/index.js'; /** + * @deprecated Prefer to use `fetchUserSubscriptionsFactoryVNext` * Method to create a thunk factory configured with the specified client. * * @param getSubscriptions - Get subscriptions client. diff --git a/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.vnext.ts b/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.vnext.ts new file mode 100644 index 000000000..7c79501fc --- /dev/null +++ b/packages/redux/src/subscriptions/actions/factories/fetchUserSubscriptionsFactory.vnext.ts @@ -0,0 +1,43 @@ +import * as actionTypes from '../../actionTypes.js'; +import { + type GetSubscriptionsVNext, + toBlackoutError, +} from '@farfetch/blackout-client'; +import type { FetchUserSubscriptionsFactoryVNext } from './types/index.js'; + +/** + * Method to create a thunk factory configured with the specified client. + * + * @param getSubscriptionsVNext - Get subscriptions client. + * + * @returns Thunk factory. + */ +const fetchUserSubscriptionsFactoryVNext: FetchUserSubscriptionsFactoryVNext< + GetSubscriptionsVNext +> = getSubscriptions => (query, config) => async dispatch => { + try { + dispatch({ + type: actionTypes.FETCH_USER_SUBSCRIPTIONS_REQUEST_VNEXT, + }); + + const result = await getSubscriptions(query, config); + + dispatch({ + payload: result, + type: actionTypes.FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT, + }); + + return result; + } catch (error) { + const errorAsBlackoutError = toBlackoutError(error); + + dispatch({ + payload: { error: errorAsBlackoutError }, + type: actionTypes.FETCH_USER_SUBSCRIPTIONS_FAILURE_VNEXT, + }); + + throw errorAsBlackoutError; + } +}; + +export default fetchUserSubscriptionsFactoryVNext; diff --git a/packages/redux/src/subscriptions/actions/factories/index.ts b/packages/redux/src/subscriptions/actions/factories/index.ts index 778b5fecf..678b493bb 100644 --- a/packages/redux/src/subscriptions/actions/factories/index.ts +++ b/packages/redux/src/subscriptions/actions/factories/index.ts @@ -2,9 +2,10 @@ * Subscriptions action factories. */ -export * from './types/index.js'; export { default as fetchSubscriptionPackagesFactory } from './fetchSubscriptionPackagesFactory.js'; export { default as fetchUserSubscriptionsFactory } from './fetchUserSubscriptionsFactory.js'; -export { default as updateUserSubscriptionsFactory } from './updateUserSubscriptionsFactory.js'; +export { default as fetchUserSubscriptionsFactoryVNext } from './fetchUserSubscriptionsFactory.vnext.js'; +export * from './types/index.js'; export { default as unsubscribeSubscriptionFactory } from './unsubscribeSubscriptionFactory.js'; export { default as unsubscribeSubscriptionTopicRecipientFactory } from './unsubscribeSubscriptionTopicRecipientFactory.js'; +export { default as updateUserSubscriptionsFactory } from './updateUserSubscriptionsFactory.js'; diff --git a/packages/redux/src/subscriptions/actions/factories/types/fetchUserSubscriptionsFactory.vnext.types.ts b/packages/redux/src/subscriptions/actions/factories/types/fetchUserSubscriptionsFactory.vnext.types.ts new file mode 100644 index 000000000..18e3db351 --- /dev/null +++ b/packages/redux/src/subscriptions/actions/factories/types/fetchUserSubscriptionsFactory.vnext.types.ts @@ -0,0 +1,11 @@ +import type { Dispatch } from 'redux'; +import type { FetchUserSubscriptionsActionVNext } from '../../../types/index.js'; +import type { GetSubscriptionsVNext } from '@farfetch/blackout-client'; + +export type FetchUserSubscriptionsFactoryVNext< + T extends GetSubscriptionsVNext, +> = ( + getSubscriptions: T, +) => ( + ...args: Parameters +) => (dispatch: Dispatch) => ReturnType; diff --git a/packages/redux/src/subscriptions/actions/factories/types/index.ts b/packages/redux/src/subscriptions/actions/factories/types/index.ts index f137c895b..ab9cec342 100644 --- a/packages/redux/src/subscriptions/actions/factories/types/index.ts +++ b/packages/redux/src/subscriptions/actions/factories/types/index.ts @@ -3,3 +3,4 @@ export * from './fetchUserSubscriptionsFactory.types.js'; export * from './unsubscribeSubscriptionFactory.types.js'; export * from './unsubscribeSubscriptionTopicRecipientFactory.types.js'; export * from './updateUserSubscriptionsFactory.types.js'; +export * from './fetchUserSubscriptionsFactory.vnext.types.js'; diff --git a/packages/redux/src/subscriptions/actions/fetchUserSubscriptions.vnext.ts b/packages/redux/src/subscriptions/actions/fetchUserSubscriptions.vnext.ts new file mode 100644 index 000000000..2d3d3f16a --- /dev/null +++ b/packages/redux/src/subscriptions/actions/fetchUserSubscriptions.vnext.ts @@ -0,0 +1,7 @@ +import { fetchUserSubscriptionsFactoryVNext } from './factories/index.js'; +import { getSubscriptionsVNext } from '@farfetch/blackout-client'; + +/** + * Method responsible for retrieving subscriptions topics for a subscriber. + */ +export default fetchUserSubscriptionsFactoryVNext(getSubscriptionsVNext); diff --git a/packages/redux/src/subscriptions/actions/index.ts b/packages/redux/src/subscriptions/actions/index.ts index 9c75c1c44..7573d3989 100644 --- a/packages/redux/src/subscriptions/actions/index.ts +++ b/packages/redux/src/subscriptions/actions/index.ts @@ -8,9 +8,10 @@ export { default as clearAllUnsubscribeSubscriptionTopicRecipientRequests } from export { default as clearUnsubscribeSubscriptionTopicRecipientRequest } from './clearUnsubscribeSubscriptionTopicRecipientRequest.js'; export { default as fetchSubscriptionPackages } from './fetchSubscriptionPackages.js'; export { default as fetchUserSubscriptions } from './fetchUserSubscriptions.js'; -export { default as resetUserSubscriptions } from './resetUserSubscriptions.js'; +export { default as fetchUserSubscriptionsVNext } from './fetchUserSubscriptions.vnext.js'; export { default as resetSubscriptionPackages } from './resetSubscriptionPackages.js'; export { default as resetSubscriptions } from './resetSubscriptions.js'; +export { default as resetUserSubscriptions } from './resetUserSubscriptions.js'; export { default as unsubscribeSubscription } from './unsubscribeSubscription.js'; export { default as unsubscribeSubscriptionTopicRecipient } from './unsubscribeSubscriptionTopicRecipient.js'; export { default as updateUserSubscriptions } from './updateUserSubscriptions.js'; diff --git a/packages/redux/src/subscriptions/types/actions.types.ts b/packages/redux/src/subscriptions/types/actions.types.ts index 062400532..81512cc17 100644 --- a/packages/redux/src/subscriptions/types/actions.types.ts +++ b/packages/redux/src/subscriptions/types/actions.types.ts @@ -4,6 +4,7 @@ import type { BlackoutError, Subscription, SubscriptionPackage, + SubscriptionVNext, } from '@farfetch/blackout-client'; import type { NormalizedSchema } from 'normalizr'; import type { SubscriptionPackagesResultNormalized } from './state.types.js'; @@ -141,3 +142,25 @@ export interface ResetSubscriptionPackagesAction extends Action { export interface ResetUserSubscriptionsAction extends Action { type: typeof actionTypes.RESET_USER_SUBSCRIPTIONS; } + +/** + * vNext - Actions dispatched when the fetch user subscriptions request is made. + */ +export type FetchUserSubscriptionsActionVNext = + | FetchUserSubscriptionsRequestActionVNext + | FetchUserSubscriptionsSuccessActionVNext + | FetchUserSubscriptionsFailureActionVNext; + +interface FetchUserSubscriptionsRequestActionVNext extends Action { + type: typeof actionTypes.FETCH_USER_SUBSCRIPTIONS_REQUEST_VNEXT; +} + +interface FetchUserSubscriptionsSuccessActionVNext extends Action { + type: typeof actionTypes.FETCH_USER_SUBSCRIPTIONS_SUCCESS_VNEXT; + payload: SubscriptionVNext[]; +} + +interface FetchUserSubscriptionsFailureActionVNext extends Action { + type: typeof actionTypes.FETCH_USER_SUBSCRIPTIONS_FAILURE_VNEXT; + payload: { error: BlackoutError }; +} diff --git a/tests/__fixtures__/subscriptions/subscriptions.fixtures.mts b/tests/__fixtures__/subscriptions/subscriptions.fixtures.mts index f24f0e137..4d8f5721f 100644 --- a/tests/__fixtures__/subscriptions/subscriptions.fixtures.mts +++ b/tests/__fixtures__/subscriptions/subscriptions.fixtures.mts @@ -1,3 +1,8 @@ +import { + ChannelVNext, + type GetSubscriptionsQueryVNext, + type SubscriptionVNext, +} from '@farfetch/blackout-client'; import { mockSubscriptionPackageId } from './state.fixtures.mjs'; export const mockDeleteSubscription = { @@ -78,6 +83,49 @@ export const mockGetSubscriptions = { }, }; +export const mockGetSubscriptionsVNext: { + query: GetSubscriptionsQueryVNext; + response: SubscriptionVNext[]; +} = { + query: { + id: 'c3e39b1f-69a8-47e3-ab7f-743ddd1278bc', + userId: '123', + recipient: + '1ca9c02be7e27f42bdfdca1afef2618003bbdc7d08fe2e9b54d2ac5af8b37127', + }, + response: [ + { + id: '8c2b5c3e3acb4bdd9c26ba46', + tenantId: 19934, + topics: [ + { + name: 'Any', + channels: [ + { + chanel: ChannelVNext.None, + recipient: + '1ca9c02be7e27f42bdfdca1afef2618003bbdc7d08fe2e9b54d2ac5af8b37127', + source: 'My Account', + }, + { + chanel: ChannelVNext.Email, + recipient: '3c2b5c3e3acb4bdd9c26ba46', + source: 'My Account', + }, + { + chanel: ChannelVNext.Sms, + recipient: '1234567890', + source: 'My Account', + }, + ], + specification: { type: 'Any' }, + }, + ], + metadata: { meta: 'data' }, + }, + ], +}; + export const mockPutSubscriptions = { data: { id: '8c2b5c3e3acb4bdd9c26ba46',