Skip to content

Commit

Permalink
fix: notification channel enabled check (#11879)
Browse files Browse the repository at this point in the history
  • Loading branch information
lazpavel committed Feb 1, 2023
1 parent 0969a90 commit d7c51f2
Show file tree
Hide file tree
Showing 2 changed files with 64 additions and 41 deletions.
Original file line number Diff line number Diff line change
@@ -1,10 +1,11 @@
import { $TSContext } from 'amplify-cli-core';
import { migrationCheck } from '../migrations/index';
import * as apiAnalyticsClient from '../plugin-client-api-analytics';
import { isNotificationChannelEnabled } from '../notifications-amplify-meta-api';

const mockContext = {
const mockContext = ({
input: { command: undefined },
} as unknown as $TSContext;
} as unknown) as $TSContext;

jest.mock('../plugin-client-api-analytics', () => ({ invokeAnalyticsMigrations: jest.fn() }));

Expand All @@ -13,6 +14,35 @@ describe('notifications tests', () => {
jest.resetAllMocks();
});

it('should properly check if notification channel is enabled', async () => {
const notificationMeta = {
Id: '123',
Name: 'test',
Region: 'us-east-1',
ResourceName: 'test',
service: 'Pinpoint',
output: {},
};

expect(isNotificationChannelEnabled(notificationMeta, 'SMS')).toBe(false);
notificationMeta.output = {
SMS: {},
};
expect(isNotificationChannelEnabled(notificationMeta, 'SMS')).toBe(false);
notificationMeta.output = {
SMS: {
Enabled: false,
},
};
expect(isNotificationChannelEnabled(notificationMeta, 'SMS')).toBe(false);
notificationMeta.output = {
SMS: {
Enabled: true,
},
};
expect(isNotificationChannelEnabled(notificationMeta, 'SMS')).toBe(true);
});

test('notification migrations calls analytics migration', async () => {
mockContext.input.command = 'add';
await migrationCheck(mockContext);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -37,9 +37,9 @@ export const toggleNotificationsChannelAppMeta = async (
return tmpAmplifyMeta;
}

const channelOutput = (notificationsAppMeta.output) || {};
const channelValue = (channelOutput[channelName]) || {};
notificationsAppMeta.output = (notificationsAppMeta.output) || {};
const channelOutput = notificationsAppMeta.output || {};
const channelValue = channelOutput[channelName] || {};
notificationsAppMeta.output = notificationsAppMeta.output || {};
notificationsAppMeta.output[channelName] = {
...channelValue,
Enabled: isEnabled,
Expand All @@ -54,8 +54,8 @@ export const toggleNotificationsChannelAppMeta = async (
const analyticsLastPushTimeStamp = await invokeGetLastPushTimeStamp(tmpAmplifyMeta, notificationsAppMeta.ResourceName);
if (analyticsLastPushTimeStamp) {
notificationsAppMeta.lastPushTimeStamp = analyticsLastPushTimeStamp;
notificationsAppMeta.lastPushDirHash = (notificationsAppMeta.lastPushDirHash)
|| oneAtATimeJenkinsHash(JSON.stringify(notificationsAppMeta));
notificationsAppMeta.lastPushDirHash =
notificationsAppMeta.lastPushDirHash || oneAtATimeJenkinsHash(JSON.stringify(notificationsAppMeta));
}
}

Expand All @@ -66,7 +66,7 @@ export const toggleNotificationsChannelAppMeta = async (

// Move this to library
// https://en.wikipedia.org/wiki/Jenkins_hash_function
const oneAtATimeJenkinsHash = (keyString: string):string => {
const oneAtATimeJenkinsHash = (keyString: string): string => {
let hash = 0;
for (let charIndex = 0; charIndex < keyString.length; ++charIndex) {
hash += keyString.charCodeAt(charIndex);
Expand All @@ -86,18 +86,18 @@ const PINPOINT_PROVIDER_NAME = 'awscloudformation';
* @param amplifyMeta optionally provide amplify meta
* @returns Notifications meta partially defined in INotificationsResourceMeta
*/
export const getNotificationsAppMeta = async (amplifyMeta?:$TSMeta, appName?:string): Promise<INotificationsResourceMeta|undefined> => {
export const getNotificationsAppMeta = async (amplifyMeta?: $TSMeta, appName?: string): Promise<INotificationsResourceMeta | undefined> => {
const notificationResourceList = await getNotificationsAppListMeta(amplifyMeta, appName);
return (notificationResourceList.length > 0) ? notificationResourceList[0] : undefined;
return notificationResourceList.length > 0 ? notificationResourceList[0] : undefined;
};

/**
* Remove the Notifications category from AmplifyMeta
* @param context amplify meta
* @returns amplify cli context (with no Notifications category in AmplifyMeta)
*/
export const removeNotificationsAppMeta = async (context: $TSContext) : Promise<$TSContext> => {
const amplifyMeta = (context.exeInfo.amplifyMeta) || stateManager.getMeta();
export const removeNotificationsAppMeta = async (context: $TSContext): Promise<$TSContext> => {
const amplifyMeta = context.exeInfo.amplifyMeta || stateManager.getMeta();
if (AmplifyCategories.NOTIFICATIONS in amplifyMeta) {
delete amplifyMeta[AmplifyCategories.NOTIFICATIONS];
}
Expand All @@ -110,9 +110,9 @@ export const removeNotificationsAppMeta = async (context: $TSContext) : Promise<
* @param amplifyMeta optionally provide amplifyMeta
* @returns true if Notifications is migrated from AWS Mobile Hub
*/
export const checkMigratedFromMobileHub = async (amplifyMeta?:$TSMeta): Promise<boolean> => {
const notificationAppMeta: INotificationsResourceMeta|undefined = await getNotificationsAppMeta(amplifyMeta);
return !!(notificationAppMeta?.mobileHubMigrated);
export const checkMigratedFromMobileHub = async (amplifyMeta?: $TSMeta): Promise<boolean> => {
const notificationAppMeta: INotificationsResourceMeta | undefined = await getNotificationsAppMeta(amplifyMeta);
return !!notificationAppMeta?.mobileHubMigrated;
};

/**
Expand All @@ -121,8 +121,8 @@ export const checkMigratedFromMobileHub = async (amplifyMeta?:$TSMeta): Promise<
* @param amplifyMeta optionally provide amplifyMeta
* @returns true if Notifications is migrated from AWS Mobile Hub
*/
export const checkMigratedFromMobileHubLegacy = async (amplifyMeta?:$TSMeta): Promise<boolean> => {
const tmpMeta = (amplifyMeta) || await stateManager.getMeta();
export const checkMigratedFromMobileHubLegacy = async (amplifyMeta?: $TSMeta): Promise<boolean> => {
const tmpMeta = amplifyMeta || (await stateManager.getMeta());
const categoryMeta = tmpMeta[AmplifyCategories.NOTIFICATIONS];
if (categoryMeta) {
const services = Object.keys(categoryMeta);
Expand All @@ -146,31 +146,25 @@ export const checkMigratedFromMobileHubLegacy = async (amplifyMeta?:$TSMeta): Pr
/**
* checks if notifications channel is enabled
*/
export const isNotificationChannelEnabled = (
notificationsResourceMeta: INotificationsResourceMeta,
channelName: string,
): boolean => notificationsResourceMeta.output
&& channelName in notificationsResourceMeta.output
&& notificationsResourceMeta.output[channelName].Enabled;
export const isNotificationChannelEnabled = (notificationsResourceMeta: INotificationsResourceMeta, channelName: string): boolean =>
!!notificationsResourceMeta?.output[channelName]?.Enabled;

/**
* Get the enabled channels from the notifications table of amplify-meta.json
* @returns array of enabled notification channels from amplify-meta.json
*/
export const getEnabledChannelsFromAppMeta = async (amplifyMeta?: $TSAny): Promise<Array<string>> => {
const tmpAmplifyMeta = (amplifyMeta) || stateManager.getMeta();
const tmpAmplifyMeta = amplifyMeta || stateManager.getMeta();
const availableChannels = getAvailableChannels();
const notificationsMeta = await getNotificationsAppMeta(tmpAmplifyMeta);
return (notificationsMeta)
? availableChannels.filter(channel => isNotificationChannelEnabled(notificationsMeta, channel))
: [];
return notificationsMeta ? availableChannels.filter(channel => isNotificationChannelEnabled(notificationsMeta, channel)) : [];
};

/**
* Get all notification channels which are not in use
*/
export const getDisabledChannelsFromAmplifyMeta = async (amplifyMeta?: $TSMeta): Promise<Array<string>> => {
const disabledChannelList : Array<string> = [];
const disabledChannelList: Array<string> = [];
const availableChannels = getAvailableChannels();
const enabledChannels = await getEnabledChannelsFromAppMeta(amplifyMeta);
availableChannels.forEach(channel => {
Expand All @@ -186,7 +180,7 @@ export const getDisabledChannelsFromAmplifyMeta = async (amplifyMeta?: $TSMeta):
* @param context application context
* @returns pinpoint region
*/
export const getPinpointRegionMapping = async (context: $TSContext): Promise<string|undefined> => {
export const getPinpointRegionMapping = async (context: $TSContext): Promise<string | undefined> => {
const projectPath = pathManager.findProjectRoot();
const applicationRegion = stateManager.getCurrentRegion(projectPath);
if (!applicationRegion) {
Expand All @@ -196,7 +190,7 @@ export const getPinpointRegionMapping = async (context: $TSContext): Promise<str
}
const providerPlugin = await import(context.amplify.getProviderPlugins(context)[PINPOINT_PROVIDER_NAME]);
const regionMapping: Record<string, string> = providerPlugin.getPinpointRegionMapping();
return (applicationRegion in regionMapping) ? regionMapping[applicationRegion] : undefined;
return applicationRegion in regionMapping ? regionMapping[applicationRegion] : undefined;
};

/**
Expand Down Expand Up @@ -225,7 +219,7 @@ export const addPartialNotificationsAppMeta = async (context: $TSContext, notifi
export const constructPartialNotificationsAppMeta = (
amplifyMeta: $TSMeta,
resourceName: string,
pinpointRegion: string|undefined,
pinpointRegion: string | undefined,
): Partial<ICategoryMeta> => {
const envName: string = stateManager.getCurrentEnvName() as string;
const partialPinpointOutput: Partial<ICategoryMeta> = {
Expand All @@ -244,9 +238,11 @@ export const constructPartialNotificationsAppMeta = (
* @param resourceName Pinpoint resource for notifications
* @param pinpointOutput Pinpoint resource metadata base class
*/
export const constructResourceMeta = (amplifyMeta : $TSMeta,
resourceName: string, pinpointOutput:
Partial<ICategoryMeta>): Partial<ICategoryMeta> => {
export const constructResourceMeta = (
amplifyMeta: $TSMeta,
resourceName: string,
pinpointOutput: Partial<ICategoryMeta>,
): Partial<ICategoryMeta> => {
if (!amplifyMeta[AmplifyCategories.NOTIFICATIONS] || Object.keys(amplifyMeta[AmplifyCategories.NOTIFICATIONS]).length === 0) {
// eslint-disable-next-line no-param-reassign
amplifyMeta[AmplifyCategories.NOTIFICATIONS] = { [resourceName]: { output: {} } };
Expand All @@ -268,22 +264,19 @@ export const constructResourceMeta = (amplifyMeta : $TSMeta,
* [Internal] Get the Notifications resources from amplify-meta.json
* @returns List of notifications resources
*/
const getNotificationsAppListMeta = async (
amplifyMeta?: $TSMeta,
appName?: string,
): Promise<Array<INotificationsResourceMeta>> => {
const tmpMeta = (amplifyMeta) || await stateManager.getMeta();
const getNotificationsAppListMeta = async (amplifyMeta?: $TSMeta, appName?: string): Promise<Array<INotificationsResourceMeta>> => {
const tmpMeta = amplifyMeta || (await stateManager.getMeta());
const notificationsMeta = tmpMeta[AmplifyCategories.NOTIFICATIONS];
const notificationsResourceList = [];
if (notificationsMeta) {
for (const resourceName of Object.keys(notificationsMeta)) {
if ((!appName || appName === resourceName)) {
if (!appName || appName === resourceName) {
const notificationsResourceMeta = notificationsMeta[resourceName];
notificationsResourceList.push({
Id: notificationsResourceMeta.output.Id,
ResourceName: resourceName,
Name: notificationsResourceMeta.output.Name, // {ResourceName}-{env}
service: (notificationsResourceMeta.service) || AmplifySupportedService.PINPOINT,
service: notificationsResourceMeta.service || AmplifySupportedService.PINPOINT,
Region: notificationsResourceMeta.output.Region, // Region in which Notifications resource is deployed.
output: notificationsResourceMeta.output,
...notificationsResourceMeta,
Expand Down

0 comments on commit d7c51f2

Please sign in to comment.