@plusscommunities/pluss-newsletter-aws 1.3.2 → 1.3.6-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,3 @@
1
+ const filterByAudienceType = require("@plusscommunities/pluss-core-aws/helper/audience/filterByAudienceType");
2
+
3
+ module.exports = filterByAudienceType;
package/config.json CHANGED
@@ -1 +1,31 @@
1
- {"keys_url":"https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_cLZpGqJql/.well-known/jwks.json","maintenanceInstantComplete":false,"communityConfig":{"name":"Pluss Communities","company":"Pluss","subdomain":"pluss60","onelinkUrl":"http://onelink.to/pluss60","iosAppUrl":"https://itunes.apple.com/au/app/aveo/id1358888537?mt=8","androidAppUrl":"https://play.google.com/store/apps/details?id=pluss.android.aveo","emailBrandingAbovePoweredBy":{"image":"https://pluss60-dev-media.s3-ap-southeast-2.amazonaws.com/pluss/website/plusscommunites.png","height":29,"width":100},"adminSiteUrl":"https://dev.plusscommunities.com"},"anySignUpSite":"newstead","strings":{"FACILITY":"facility"},"hasIntroTerms":false}
1
+ {
2
+ "keys_url": "https://cognito-idp.ap-southeast-2.amazonaws.com/ap-southeast-2_cLZpGqJql/.well-known/jwks.json",
3
+ "maintenanceInstantComplete": false,
4
+ "communityConfig": {
5
+ "name": "Pluss Communities",
6
+ "company": "Pluss",
7
+ "subdomain": "pluss60",
8
+ "onelinkUrl": "http://onelink.to/pluss60",
9
+ "iosAppUrl": "https://itunes.apple.com/au/app/aveo/id1358888537?mt=8",
10
+ "androidAppUrl": "https://play.google.com/store/apps/details?id=pluss.android.aveo",
11
+ "emailBrandingAbovePoweredBy": {
12
+ "image": "https://pluss60-dev-media.s3-ap-southeast-2.amazonaws.com/pluss/website/plusscommunites.png",
13
+ "height": 29,
14
+ "width": 100
15
+ },
16
+ "adminSiteUrl": "https://dev.plusscommunities.com"
17
+ },
18
+ "anySignUpSite": "newstead",
19
+ "strings": { "FACILITY": "facility" },
20
+ "hasIntroTerms": false,
21
+ "serverlessConfig": {
22
+ "profile": "minuss-admin",
23
+ "key": "AKIAJMZRDVGCLINIZIOA",
24
+ "secret": "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"
25
+ },
26
+ "emailConfig": {
27
+ "productionApprovalRequest": "We will not send marketing emails or any type of mass emails.\nUsers will receive targeted emails for communication purposes only, relevant to their use of the platform.\n\nWe will be sending emails in the following cases ONLY.\n- To welcome a user when they sign up to the platform.\n- To confirm an appointment made thru the platform.\n- To remind the user that there is an appointment they have made in the platform.\n- To follow up and ask for a survey after the appointment.",
28
+ "webSiteUrl": "https://plusscommunities.com/",
29
+ "contactEmail": "developer@plusscommunities.com"
30
+ }
31
+ }
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionCoaching",
20
20
  notificationNewsletterPublished: "NewsletterPublishedCoaching",
21
21
  routeEntityPath: "/newsCoaching/article/:id",
22
+ screenNewsletterPost: "newsletterPostCoaching",
22
23
  textNewNewsletterSubmission: "New Coaching Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new coaching for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionCuratedPosts",
20
20
  notificationNewsletterPublished: "NewsletterPublishedCuratedPosts",
21
21
  routeEntityPath: "/newsCuratedPosts/article/:id",
22
+ screenNewsletterPost: "newsletterPostCuratedPosts",
22
23
  textNewNewsletterSubmission: "New Curated Post Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new curated post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmission",
20
20
  notificationNewsletterPublished: "NewsletterPublished",
21
21
  routeEntityPath: "/news/article/:id",
22
+ screenNewsletterPost: "newsletterPost",
22
23
  textNewNewsletterSubmission: "New Newsletter Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new newsletter post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionHeadOffice",
20
20
  notificationNewsletterPublished: "NewsletterPublishedHeadOffice",
21
21
  routeEntityPath: "/newsHeadOffice/article/:id",
22
+ screenNewsletterPost: "newsletterPostHeadOffice",
22
23
  textNewNewsletterSubmission: "New Head Office News Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new head office post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
package/feature.config.js CHANGED
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmission",
20
20
  notificationNewsletterPublished: "NewsletterPublished",
21
21
  routeEntityPath: "/news/article/:id",
22
+ screenNewsletterPost: "newsletterPost",
22
23
  textNewNewsletterSubmission: "New Newsletter Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new newsletter post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionMenu",
20
20
  notificationNewsletterPublished: "NewsletterPublishedMenu",
21
21
  routeEntityPath: "/newsMenu/article/:id",
22
+ screenNewsletterPost: "newsletterPostMenu",
22
23
  textNewNewsletterSubmission: "New Menu Submission",
23
24
  textHasSubmittedANewNewsletterPost: "has submitted a new menu for review.",
24
25
  };
@@ -34,7 +35,8 @@ exports.entity = {
34
35
  permission: values.permissionNewsletter,
35
36
  table: values.tableNameNewsletterEntries,
36
37
  id: "RowId",
37
- path: values.routeEntityPath,
38
+ webPath: values.routeEntityPath,
39
+ appPath: values.screenNewsletterPost,
38
40
  };
39
41
 
40
42
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionNoticeBoard",
20
20
  notificationNewsletterPublished: "NewsletterPublishedNoticeBoard",
21
21
  routeEntityPath: "/newsNoticeBoard/article/:id",
22
+ screenNewsletterPost: "newsletterPostNoticeBoard",
22
23
  textNewNewsletterSubmission: "New Notice Board Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new notice board post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionPersonalDev",
20
20
  notificationNewsletterPublished: "NewsletterPublishedPersonalDev",
21
21
  routeEntityPath: "/newsPersonalDev/article/:id",
22
+ screenNewsletterPost: "newsletterPostPersonalDev",
22
23
  textNewNewsletterSubmission: "Personal Development Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new personal development post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionSales",
20
20
  notificationNewsletterPublished: "NewsletterPublishedSales",
21
21
  routeEntityPath: "/newsSales/article/:id",
22
+ screenNewsletterPost: "newsletterPostSales",
22
23
  textNewNewsletterSubmission: "Sale Submission",
23
24
  textHasSubmittedANewNewsletterPost: "has submitted a new sale for review.",
24
25
  };
@@ -34,7 +35,8 @@ exports.entity = {
34
35
  permission: values.permissionNewsletter,
35
36
  table: values.tableNameNewsletterEntries,
36
37
  id: "RowId",
37
- path: values.routeEntityPath,
38
+ webPath: values.routeEntityPath,
39
+ appPath: values.screenNewsletterPost,
38
40
  };
39
41
 
40
42
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionSharing",
20
20
  notificationNewsletterPublished: "NewsletterPublishedSharing",
21
21
  routeEntityPath: "/newsSharing/article/:id",
22
+ screenNewsletterPost: "newsletterPostSharing",
22
23
  textNewNewsletterSubmission: "New Sharing Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new sharing post for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -19,6 +19,7 @@ const values = {
19
19
  notificationRejectNewsSubmission: "RejectNewsSubmissionTraining",
20
20
  notificationNewsletterPublished: "NewsletterPublishedTraining",
21
21
  routeEntityPath: "/newsTraining/article/:id",
22
+ screenNewsletterPost: "newsletterPostTraining",
22
23
  textNewNewsletterSubmission: "Training Submission",
23
24
  textHasSubmittedANewNewsletterPost:
24
25
  "has submitted a new training for review.",
@@ -35,7 +36,8 @@ exports.entity = {
35
36
  permission: values.permissionNewsletter,
36
37
  table: values.tableNameNewsletterEntries,
37
38
  id: "RowId",
38
- path: values.routeEntityPath,
39
+ webPath: values.routeEntityPath,
40
+ appPath: values.screenNewsletterPost,
39
41
  };
40
42
 
41
43
  exports.serverless = {
@@ -5,9 +5,9 @@ const generateJsonResponse = require("./common/helper/generateJsonResponse");
5
5
  const { thisOrDefault } = require("./common/helper");
6
6
  const indexQuery = require("./common/db/common/indexQuery");
7
7
  const validateUserLoggedIn = require("./common/helper/auth/validateUserLoggedIn");
8
+ const validateMasterAuth = require("./common/helper/auth/validateMasterAuth");
8
9
  const checkUpdateSource = require("./helper/checkUpdateSource");
9
- const getMatchingAudienceTypes = require("./common/helper/audience/getMatchingAudienceTypes");
10
- const filterOnAudienceType = require("./common/helper/audience/filterOnAudienceType");
10
+ const filterByAudienceType = require("./common/helper/audience/filterByAudienceType");
11
11
  const { values } = require("./feature.config");
12
12
 
13
13
  module.exports.getFeaturedNewsletterEntries = (event, context, callback) => {
@@ -23,69 +23,68 @@ module.exports.getFeaturedNewsletterEntries = (event, context, callback) => {
23
23
  );
24
24
 
25
25
  validateUserLoggedIn(event)
26
- .then((authorised) => {
26
+ .then(async (authorised) => {
27
27
  if (!authorised) {
28
28
  return callback(
29
29
  null,
30
30
  generateJsonResponse(422, { fail: true, error: "not authorised" })
31
31
  );
32
32
  }
33
- getMatchingAudienceTypes(event.headers.authkey)
34
- .then((types) => {
35
- const query = {
36
- IndexName: "NewsletterEntriesSiteFeaturedExpiryIndex",
37
- KeyConditionExpression: "Site = :site and FeaturedExpiry > :time",
38
- FilterExpression: "IsFeatured = :featured",
39
- ExpressionAttributeValues: {
40
- ":site": site,
41
- ":time": time,
42
- ":featured": true,
43
- },
44
- };
45
- const hqQuery = _.cloneDeep(query);
46
- hqQuery.ExpressionAttributeValues[":site"] = "hq";
47
- console.log(`running query - ${JSON.stringify(query)}`);
48
33
 
49
- const promises = [];
50
- promises.push(indexQuery(values.tableNameNewsletterEntries, query));
51
- if (!params.noHQ) {
52
- promises.push(
53
- indexQuery(values.tableNameNewsletterEntries, hqQuery)
34
+ const canManage = await validateMasterAuth(
35
+ event,
36
+ values.permissionNewsletter,
37
+ site
38
+ );
39
+
40
+ const query = {
41
+ IndexName: "NewsletterEntriesSiteFeaturedExpiryIndex",
42
+ KeyConditionExpression: "Site = :site and FeaturedExpiry > :time",
43
+ FilterExpression: "IsFeatured = :featured",
44
+ ExpressionAttributeValues: {
45
+ ":site": site,
46
+ ":time": time,
47
+ ":featured": true,
48
+ },
49
+ };
50
+ const hqQuery = _.cloneDeep(query);
51
+ hqQuery.ExpressionAttributeValues[":site"] = "hq";
52
+ console.log(`running query - ${JSON.stringify(query)}`);
53
+
54
+ const promises = [];
55
+ promises.push(indexQuery(values.tableNameNewsletterEntries, query));
56
+ if (!params.noHQ) {
57
+ promises.push(indexQuery(values.tableNameNewsletterEntries, hqQuery));
58
+ }
59
+ Promise.all(promises)
60
+ .then(async (responses) => {
61
+ console.log("successful query");
62
+ const result = [];
63
+ responses.forEach((data) => {
64
+ result.push.apply(result, data.Items);
65
+ });
66
+ let filteredResult = _.filter(result, (entry) => {
67
+ return (
68
+ !entry.Private && entry.UnixTimestamp < time && !entry.Deleted
69
+ );
70
+ });
71
+ if (!canManage) {
72
+ filteredResult = await filterByAudienceType(
73
+ filteredResult,
74
+ event.headers.authkey,
75
+ site
54
76
  );
55
77
  }
56
- Promise.all(promises)
57
- .then(async (responses) => {
58
- console.log("successful query");
59
- const result = [];
60
- responses.forEach((data) => {
61
- result.push.apply(result, data.Items);
62
- });
63
- const filteredResult = await filterOnAudienceType(
64
- _.filter(result, (entry) => {
65
- return (
66
- !entry.Private &&
67
- entry.UnixTimestamp < time &&
68
- !entry.Deleted
69
- );
70
- }),
71
- types,
72
- event.headers.authkey,
73
- site
74
- );
75
- const randomResults = _.shuffle(filteredResult).slice(0, count);
78
+ const randomResults = _.shuffle(filteredResult).slice(0, count);
76
79
 
77
- checkUpdateSource(randomResults);
80
+ checkUpdateSource(randomResults);
78
81
 
79
- callback(null, generateJsonResponse(200, randomResults));
80
- })
81
- .catch((error) => {
82
- console.log("query failed");
83
- console.log(error);
84
- callback(null, generateJsonResponse(422, { error }));
85
- });
82
+ callback(null, generateJsonResponse(200, randomResults));
86
83
  })
87
84
  .catch((error) => {
88
- callback(null, generateJsonResponse(422, { fail: true, error }));
85
+ console.log("query failed");
86
+ console.log(error);
87
+ callback(null, generateJsonResponse(422, { error }));
89
88
  });
90
89
  })
91
90
  .catch((error) => {
@@ -4,9 +4,9 @@ const initConfig = require("./initConfig");
4
4
  const generateJsonResponse = require("./common/helper/generateJsonResponse");
5
5
  const { thisOrDefault } = require("./common/helper");
6
6
  const validateSiteAccess = require("./common/helper/auth/validateSiteAccess");
7
+ const validateMasterAuth = require("./common/helper/auth/validateMasterAuth");
7
8
  const checkUpdateSource = require("./helper/checkUpdateSource");
8
- const getMatchingAudienceTypes = require("./common/helper/audience/getMatchingAudienceTypes");
9
- const filterOnAudienceType = require("./common/helper/audience/filterOnAudienceType");
9
+ const filterByAudienceType = require("./common/helper/audience/filterByAudienceType");
10
10
  const indexQueryRecursive = require("./common/db/common/indexQueryRecursive");
11
11
  const { values } = require("./feature.config");
12
12
 
@@ -38,84 +38,83 @@ module.exports.getNewsletterEntries = (event, context, callback) => {
38
38
  console.log(`maxTime: ${maxTime}`);
39
39
 
40
40
  validateSiteAccess(event, site)
41
- .then((authorised) => {
41
+ .then(async (authorised) => {
42
42
  if (!authorised) {
43
43
  return callback(
44
44
  null,
45
45
  generateJsonResponse(422, { fail: true, error: "not authorised" })
46
46
  );
47
47
  }
48
- getMatchingAudienceTypes(event.headers.authkey)
49
- .then((types) => {
50
- const query = {
51
- IndexName: "NewsletterEntriesSiteTimestampIndex",
52
- KeyConditionExpression:
53
- "Site = :site and UnixTimestampReverse BETWEEN :minTime and :maxTime",
54
- ExpressionAttributeValues: {
55
- ":site": site,
56
- ":minTime": minTime,
57
- ":maxTime": maxTime,
58
- },
59
- };
60
- const hqQuery = _.cloneDeep(query);
61
- hqQuery.ExpressionAttributeValues[":site"] = "hq";
62
- console.log("running query");
63
- console.log(query);
64
- const promises = [];
65
- promises.push(
66
- indexQueryRecursive(values.tableNameNewsletterEntries, query)
67
- );
68
- if (!params.noHQ) {
69
- promises.push(
70
- indexQueryRecursive(values.tableNameNewsletterEntries, hqQuery)
48
+
49
+ const canManage = await validateMasterAuth(
50
+ event,
51
+ values.permissionNewsletter,
52
+ site
53
+ );
54
+
55
+ const query = {
56
+ IndexName: "NewsletterEntriesSiteTimestampIndex",
57
+ KeyConditionExpression:
58
+ "Site = :site and UnixTimestampReverse BETWEEN :minTime and :maxTime",
59
+ ExpressionAttributeValues: {
60
+ ":site": site,
61
+ ":minTime": minTime,
62
+ ":maxTime": maxTime,
63
+ },
64
+ };
65
+ const hqQuery = _.cloneDeep(query);
66
+ hqQuery.ExpressionAttributeValues[":site"] = "hq";
67
+ console.log("running query");
68
+ console.log(query);
69
+ const promises = [];
70
+ promises.push(
71
+ indexQueryRecursive(values.tableNameNewsletterEntries, query)
72
+ );
73
+ if (!params.noHQ) {
74
+ promises.push(
75
+ indexQueryRecursive(values.tableNameNewsletterEntries, hqQuery)
76
+ );
77
+ }
78
+ Promise.all(promises)
79
+ .then(async (responses) => {
80
+ console.log("successful query");
81
+ const result = [];
82
+ responses.forEach((data) => {
83
+ result.push.apply(result, data);
84
+ });
85
+ let filteredResult = params.noFilter
86
+ ? result
87
+ : _.filter(result, (entry) => !entry.Private);
88
+ if (!params.noFilter && !canManage) {
89
+ filteredResult = await filterByAudienceType(
90
+ filteredResult,
91
+ event.headers.authkey,
92
+ site
71
93
  );
72
94
  }
73
- Promise.all(promises)
74
- .then(async (responses) => {
75
- console.log("successful query");
76
- const result = [];
77
- responses.forEach((data) => {
78
- result.push.apply(result, data);
79
- });
80
- const filteredResult = params.noFilter
81
- ? result
82
- : await filterOnAudienceType(
83
- _.filter(result, (entry) => {
84
- return !entry.Private;
85
- }),
86
- types,
87
- event.headers.authkey,
88
- site
89
- );
90
- const sortedResult = _.sortBy(
91
- filteredResult,
92
- "UnixTimestampReverse"
93
- );
94
95
 
95
- checkUpdateSource(sortedResult);
96
+ const sortedResult = _.sortBy(filteredResult, "UnixTimestampReverse");
96
97
 
97
- if (count) {
98
- return callback(
99
- null,
100
- generateJsonResponse(200, {
101
- items: sortedResult.slice(skip, skip + count),
102
- skip,
103
- count,
104
- totalCount: sortedResult.length,
105
- })
106
- );
107
- }
98
+ checkUpdateSource(sortedResult);
99
+
100
+ if (count) {
101
+ return callback(
102
+ null,
103
+ generateJsonResponse(200, {
104
+ items: sortedResult.slice(skip, skip + count),
105
+ skip,
106
+ count,
107
+ totalCount: sortedResult.length,
108
+ })
109
+ );
110
+ }
108
111
 
109
- callback(null, generateJsonResponse(200, sortedResult));
110
- })
111
- .catch((error) => {
112
- console.log("query failed");
113
- console.log(error);
114
- callback(null, generateJsonResponse(422, { error }));
115
- });
112
+ callback(null, generateJsonResponse(200, sortedResult));
116
113
  })
117
114
  .catch((error) => {
118
- callback(null, generateJsonResponse(422, { fail: true, error }));
115
+ console.log("query failed");
116
+ console.log(error);
117
+ callback(null, generateJsonResponse(422, { error }));
119
118
  });
120
119
  })
121
120
  .catch((error) => {
@@ -5,9 +5,9 @@ const generateJsonResponse = require("./common/helper/generateJsonResponse");
5
5
  const { thisOrDefault } = require("./common/helper");
6
6
  const indexQuery = require("./common/db/common/indexQuery");
7
7
  const validateSiteAccess = require("./common/helper/auth/validateSiteAccess");
8
+ const validateMasterAuth = require("./common/helper/auth/validateMasterAuth");
8
9
  const checkUpdateSource = require("./helper/checkUpdateSource");
9
- const getMatchingAudienceTypes = require("./common/helper/audience/getMatchingAudienceTypes");
10
- const filterOnAudienceType = require("./common/helper/audience/filterOnAudienceType");
10
+ const filterByAudienceType = require("./common/helper/audience/filterByAudienceType");
11
11
  const { values } = require("./feature.config");
12
12
 
13
13
  module.exports.getRecentNewsletterEntries = (event, context, callback) => {
@@ -36,68 +36,69 @@ module.exports.getRecentNewsletterEntries = (event, context, callback) => {
36
36
  }
37
37
 
38
38
  validateSiteAccess(event, site)
39
- .then((authorised) => {
39
+ .then(async (authorised) => {
40
40
  if (!authorised) {
41
41
  return callback(
42
42
  null,
43
43
  generateJsonResponse(422, { fail: true, error: "not authorised" })
44
44
  );
45
45
  }
46
- getMatchingAudienceTypes(event.headers.authkey)
47
- .then((types) => {
48
- const query = {
49
- IndexName: "NewsletterEntriesSiteTimestampIndex",
50
- KeyConditionExpression:
51
- "Site = :site and UnixTimestampReverse > :maxTime",
52
- ExpressionAttributeValues: {
53
- ":site": site,
54
- ":maxTime": maxTime,
55
- },
56
- Limit: limit,
57
- };
58
- const hqQuery = _.cloneDeep(query);
59
- hqQuery.ExpressionAttributeValues[":site"] = "hq";
60
- console.log("running query");
61
- console.log(query);
62
- const promises = [];
63
- promises.push(indexQuery(values.tableNameNewsletterEntries, query));
64
- if (!params.noHQ) {
65
- promises.push(
66
- indexQuery(values.tableNameNewsletterEntries, hqQuery)
46
+
47
+ const canManage = await validateMasterAuth(
48
+ event,
49
+ values.permissionNewsletter,
50
+ site
51
+ );
52
+
53
+ const query = {
54
+ IndexName: "NewsletterEntriesSiteTimestampIndex",
55
+ KeyConditionExpression:
56
+ "Site = :site and UnixTimestampReverse > :maxTime",
57
+ ExpressionAttributeValues: {
58
+ ":site": site,
59
+ ":maxTime": maxTime,
60
+ },
61
+ Limit: limit,
62
+ };
63
+ const hqQuery = _.cloneDeep(query);
64
+ hqQuery.ExpressionAttributeValues[":site"] = "hq";
65
+ console.log("running query");
66
+ console.log(query);
67
+ const promises = [];
68
+ promises.push(indexQuery(values.tableNameNewsletterEntries, query));
69
+ if (!params.noHQ) {
70
+ promises.push(indexQuery(values.tableNameNewsletterEntries, hqQuery));
71
+ }
72
+ Promise.all(promises)
73
+ .then(async (responses) => {
74
+ console.log("successful query");
75
+ const result = [];
76
+ responses.forEach((data) => {
77
+ result.push.apply(result, data.Items);
78
+ });
79
+ let filteredResult = _.filter(result, (entry) => {
80
+ return !entry.Private && (!tvMode || entry.TVMode);
81
+ });
82
+ if (!canManage) {
83
+ filteredResult = await filterByAudienceType(
84
+ filteredResult,
85
+ event.headers.authkey,
86
+ site
67
87
  );
68
88
  }
69
- Promise.all(promises)
70
- .then(async (responses) => {
71
- console.log("successful query");
72
- const result = [];
73
- responses.forEach((data) => {
74
- result.push.apply(result, data.Items);
75
- });
76
- const filteredResult = await filterOnAudienceType(
77
- _.filter(result, (entry) => {
78
- return !entry.Private && (!tvMode || entry.TVMode);
79
- }),
80
- types,
81
- event.headers.authkey,
82
- site
83
- );
84
- const sortedResult = _.take(
85
- _.sortBy(filteredResult, "UnixTimestampReverse"),
86
- limit
87
- );
89
+ const sortedResult = _.take(
90
+ _.sortBy(filteredResult, "UnixTimestampReverse"),
91
+ limit
92
+ );
88
93
 
89
- checkUpdateSource(sortedResult);
94
+ checkUpdateSource(sortedResult);
90
95
 
91
- callback(null, generateJsonResponse(200, sortedResult));
92
- })
93
- .catch((error) => {
94
- console.log("query failed");
95
- console.log(error);
96
- callback(null, generateJsonResponse(200, { error }));
97
- });
96
+ callback(null, generateJsonResponse(200, sortedResult));
98
97
  })
99
98
  .catch((error) => {
100
- callback(null, generateJsonResponse(422, { fail: true, error }));
99
+ console.log("query failed");
100
+ console.log(error);
101
+ callback(null, generateJsonResponse(200, { error }));
101
102
  });
102
103
  })
103
104
  .catch((error) => {
package/package-lock.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-newsletter-aws",
3
- "version": "1.3.2",
3
+ "version": "1.3.6-beta.0",
4
4
  "lockfileVersion": 1,
5
5
  "requires": true,
6
6
  "dependencies": {
@@ -13,9 +13,9 @@
13
13
  }
14
14
  },
15
15
  "@plusscommunities/pluss-core-aws": {
16
- "version": "1.2.5",
17
- "resolved": "https://registry.npmjs.org/@plusscommunities/pluss-core-aws/-/pluss-core-aws-1.2.5.tgz",
18
- "integrity": "sha512-qYVluCMkSAcNDJOESBmamaTrkvBCoil/GGykep8MfntJ4jMfV5FwW1aEgstu8k9AoBJ8OcRKdtNiGItH0RzzYw==",
16
+ "version": "1.2.6",
17
+ "resolved": "https://registry.npmjs.org/@plusscommunities/pluss-core-aws/-/pluss-core-aws-1.2.6.tgz",
18
+ "integrity": "sha512-GCBa9UaJCdQ3qyDL8KwgT8f4DwG7voomKdBYUs5DpyDspQvuKt+vrlsJ2d2xrzGLNlrKxw6aL9wcWjCM+nrbBA==",
19
19
  "requires": {
20
20
  "@aws/dynamodb-auto-marshaller": "^0.7.1",
21
21
  "amazon-cognito-identity-js": "^2.0.19",
package/package.json CHANGED
@@ -1,28 +1,29 @@
1
1
  {
2
2
  "name": "@plusscommunities/pluss-newsletter-aws",
3
- "version": "1.3.2",
3
+ "version": "1.3.6-beta.0",
4
4
  "description": "Extension package to enable newsletter on Pluss Communities Platform",
5
5
  "scripts": {
6
6
  "gc": "node ../../tools/gc ./",
7
7
  "gs": "node ../../tools/gs ./ ../../activity/serverless.yml",
8
- "core": "npm i @plusscommunities/pluss-core-aws@latest",
8
+ "betapatch": "npm version prepatch --preid=beta",
9
9
  "patch": "npm version patch",
10
10
  "deploy": "npm run gc && npm run gs && serverless deploy",
11
- "deploy:c": "npm run core && npm run deploy",
11
+ "betaupload": "rm -rf .serverless && npm publish --access public --tag beta",
12
+ "betaupload:p": "npm run betapatch && npm run betaupload",
12
13
  "upload": "rm -rf .serverless && npm publish --access public",
13
14
  "upload:p": "npm run patch && npm run upload",
14
- "upload:cp": "npm run core && npm run patch && npm run upload",
15
15
  "copy:add": "run(){ ext=${1:-default}; test -f feature.config.$ext.js || cp feature.config.default.js feature.config.$ext.js; }; run",
16
16
  "copy:get": "echo $npm_package_name",
17
17
  "copy:set": "run(){ target='\\@plusscommunities\\/pluss-newsletter-aws'; ext=${1:-default}; [ $ext == 'default' ] && replace=$target || replace=$target'-'$ext; echo 'Setting target to '$replace; test -f feature.config.$ext.js && cp -f feature.config.$ext.js feature.config.js; sed -i '' -e 's/'$target'.*\"/'$replace'\"/g' package.json; }; run",
18
18
  "copy:deploy": "for file in `ls ./feature.config.*.js`; do dup=`echo $file | sed 's/.*feature\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run deploy; done; npm run copy:set; npm run gs;",
19
+ "copy:betaupload": "npm run betapatch; for file in `ls ./feature.config.*.js`; do dup=`echo $file | sed 's/.*feature\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run betaupload; done; npm run copy:set;",
19
20
  "copy:upload": "npm run patch; for file in `ls ./feature.config.*.js`; do dup=`echo $file | sed 's/.*feature\\.config\\.\\(.*\\)\\.js/\\1/'`; npm run copy:set $dup; npm run upload; done; npm run copy:set;"
20
21
  },
21
22
  "author": "Phillip Suh",
22
23
  "license": "ISC",
23
24
  "dependencies": {
24
25
  "@aws/dynamodb-auto-marshaller": "^0.7.1",
25
- "@plusscommunities/pluss-core-aws": "^1.2.5",
26
+ "@plusscommunities/pluss-core-aws": "1.3.3-beta.0",
26
27
  "amazon-cognito-identity-js": "^2.0.19",
27
28
  "axios": "^0.18.0",
28
29
  "expo-server-sdk": "^3.0.1",