diff --git a/backend/isoko-backend/__tests__/unit/handlers/business/put-edit-business-page.test.js b/backend/isoko-backend/__tests__/unit/handlers/business/put-edit-business-page.test.js index 485921a..fd39c25 100644 --- a/backend/isoko-backend/__tests__/unit/handlers/business/put-edit-business-page.test.js +++ b/backend/isoko-backend/__tests__/unit/handlers/business/put-edit-business-page.test.js @@ -243,7 +243,7 @@ describe('PutEditBusinessPageHandler tests', () => { ':a': 'Venice Beach', }, ExpressionAttributeNames: { - '#city': 'city' + '#city': 'city', }, ReturnValues: 'ALL_NEW', }); diff --git a/backend/isoko-backend/__tests__/unit/handlers/review/post-review.test.js b/backend/isoko-backend/__tests__/unit/handlers/review/post-review.test.js index faa897b..2a582d7 100644 --- a/backend/isoko-backend/__tests__/unit/handlers/review/post-review.test.js +++ b/backend/isoko-backend/__tests__/unit/handlers/review/post-review.test.js @@ -98,8 +98,8 @@ describe('PostReviewHandler tests', () => { description: 'Great food, great place!', pictures: ['image1.com'], ts: '1637019432', - state: 'CA', - city: 'San Luis Obispo', + state: 'CA', + city: 'San Luis Obispo', category: 'Restaurants', }; @@ -113,7 +113,7 @@ describe('PostReviewHandler tests', () => { // act await postReviewHandler(event); - + // assert expect(putSpy).toHaveBeenCalledWith({ TableName: BUSINESS_TABLE, @@ -128,11 +128,11 @@ describe('PostReviewHandler tests', () => { description: reviewBody.description, pictures: reviewBody.pictures, ts: reviewBody.ts, - state: reviewBody.state, - city: reviewBody.city, + state: reviewBody.state, + city: reviewBody.city, category: reviewBody.category, }, - ReturnValues: 'ALL_OLD' + ReturnValues: 'ALL_OLD', }); }); }); diff --git a/backend/isoko-backend/src/handlers/business/get-business-page.js b/backend/isoko-backend/src/handlers/business/get-business-page.js index 57ab6c7..3b04047 100644 --- a/backend/isoko-backend/src/handlers/business/get-business-page.js +++ b/backend/isoko-backend/src/handlers/business/get-business-page.js @@ -1,7 +1,9 @@ -const dynamodb = require('aws-sdk/clients/dynamodb'); -const docClient = new dynamodb.DocumentClient(); const { BUSINESS_TABLE } = require('../../constants'); const { get400Response } = require('../util/response-utils'); +const { + getItemFromTablePromise, + getReviewsForBusinessPromise, +} = require('../util/database-utils'); /** * HTTP get method to get business page with details and reviews for specific businessId. @@ -22,36 +24,21 @@ exports.getBusinessPageHandler = async (event) => { ); } - // params to get business info - const businessParams = { - TableName: BUSINESS_TABLE, - Key: { - pk: `${businessId}`, - sk: 'INFO', - }, - }; - - // params to get reviews for business - const reviewParams = { - TableName: BUSINESS_TABLE, - KeyConditionExpression: 'pk = :id and begins_with(sk, :r)', - ExpressionAttributeValues: { - ':id': `${businessId}`, - ':r': 'REVIEW', - }, - }; - let response; try { - const businessResult = await docClient.get(businessParams).promise(); + const businessResult = await getItemFromTablePromise( + BUSINESS_TABLE, + `${businessId}`, + 'INFO' + ); let businessDetails = businessResult.Item; businessDetails.businessId = businessDetails.pk; delete businessDetails.pk; delete businessDetails.sk; - const reviewResult = await docClient.query(reviewParams).promise(); + const reviewResult = await getReviewsForBusinessPromise(`${businessId}`); let reviews = reviewResult.Items; businessDetails['reviews'] = reviews; diff --git a/backend/isoko-backend/src/handlers/business/put-edit-business-page.js b/backend/isoko-backend/src/handlers/business/put-edit-business-page.js index 0ec2e96..bdcc4c5 100644 --- a/backend/isoko-backend/src/handlers/business/put-edit-business-page.js +++ b/backend/isoko-backend/src/handlers/business/put-edit-business-page.js @@ -106,7 +106,7 @@ exports.putEditBusinessPageHandler = async (event) => { fieldNames, requestBody, exprAttrVals, - exprAttrNames, + exprAttrNames ); const params = { diff --git a/backend/isoko-backend/src/handlers/review/post-review.js b/backend/isoko-backend/src/handlers/review/post-review.js index d9ecc59..6b7a7d9 100644 --- a/backend/isoko-backend/src/handlers/review/post-review.js +++ b/backend/isoko-backend/src/handlers/review/post-review.js @@ -33,21 +33,19 @@ exports.postReviewHandler = async (event) => { const description = _.get(requestBody, 'description', ''); const pictures = _.get(requestBody, 'pictures', []); const ts = _.get(requestBody, 'ts'); - const state = _.get(requestBody, 'state', ''); - const city = _.get(requestBody, 'city', ''); - const category = _.get(requestBody, 'category'); + const state = _.get(requestBody, 'state', ''); + const city = _.get(requestBody, 'city', ''); + const category = _.get(requestBody, 'category'); - let pkString; + let pkString; if (state === '') { - pkString = 'ONLINE' - } - else { - pkString = `${state}#${city}` + pkString = 'ONLINE'; + } else { + pkString = `${state}#${city}`; } - - // post review to Businesses + // post review to Businesses const reviewParams = { TableName: BUSINESS_TABLE, Item: { @@ -61,80 +59,81 @@ exports.postReviewHandler = async (event) => { description: description, pictures: pictures, ts: ts, - state: state, - city: city, - category: category + state: state, + city: city, + category: category, }, ReturnValues: 'ALL_OLD', }; - // update stars in Businesses + // update stars in Businesses const businessStarsParams = { - TableName: BUSINESS_TABLE, + TableName: BUSINESS_TABLE, Key: { pk: `${businessId}`, sk: 'INFO', }, ExpressionAttributeValues: { - ":s": stars, - ":initial": 0 + ':s': stars, + ':initial': 0, }, - UpdateExpression: "SET stars = if_not_exists(stars, :initial) + :s" - } + UpdateExpression: 'SET stars = if_not_exists(stars, :initial) + :s', + }; - // total reviews in Businesses + // total reviews in Businesses const businessReviewsParams = { - TableName: BUSINESS_TABLE, + TableName: BUSINESS_TABLE, Key: { pk: `${businessId}`, sk: 'INFO', }, ExpressionAttributeValues: { - ":inc": 1, - ":initial": 0 + ':inc': 1, + ':initial': 0, }, - UpdateExpression: "SET numReviews = if_not_exists(numReviews, :initial) + :inc" - } + UpdateExpression: + 'SET numReviews = if_not_exists(numReviews, :initial) + :inc', + }; //console.info(`update expression: ${businessParams.UpdateExpression}`) // update stars in SearchResults const searchStarsParams = { - TableName: SEARCH_RESULTS_TABLE, + TableName: SEARCH_RESULTS_TABLE, Key: { pk: pkString, sk: `${category}#${businessId}`, }, ExpressionAttributeValues: { - ":s": stars, - ":initial": 0 + ':s': stars, + ':initial': 0, }, - UpdateExpression: "SET stars = if_not_exists(stars, :initial) + :s" - } + UpdateExpression: 'SET stars = if_not_exists(stars, :initial) + :s', + }; - // total reviews in Businesses + // total reviews in Businesses const searchReviewsParams = { - TableName: SEARCH_RESULTS_TABLE, + TableName: SEARCH_RESULTS_TABLE, Key: { pk: pkString, sk: `${category}#${businessId}`, }, ExpressionAttributeValues: { - ":inc": 1, - ":initial": 0 + ':inc': 1, + ':initial': 0, }, - UpdateExpression: "SET numReviews = if_not_exists(numReviews, :initial) + :inc" - } + UpdateExpression: + 'SET numReviews = if_not_exists(numReviews, :initial) + :inc', + }; let response; try { - await Promise.all([ docClient.put(reviewParams).promise(), docClient.update(businessStarsParams).promise(), docClient.update(businessReviewsParams).promise(), docClient.update(searchStarsParams).promise(), - docClient.update(searchReviewsParams).promise() + docClient.update(searchReviewsParams).promise(), ]); response = { diff --git a/backend/isoko-backend/src/handlers/util/database-utils.js b/backend/isoko-backend/src/handlers/util/database-utils.js new file mode 100644 index 0000000..14be798 --- /dev/null +++ b/backend/isoko-backend/src/handlers/util/database-utils.js @@ -0,0 +1,28 @@ +const dynamodb = require('aws-sdk/clients/dynamodb'); +const docClient = new dynamodb.DocumentClient(); +const { BUSINESS_TABLE } = require('../../constants'); + +exports.getItemFromTablePromise = async (tableName, pk, sk) => { + const params = { + TableName: tableName, + Key: { + pk, + sk, + }, + }; + + return docClient.get(params).promise(); +}; + +exports.getReviewsForBusinessPromise = async (businessId) => { + const reviewParams = { + TableName: BUSINESS_TABLE, + KeyConditionExpression: 'pk = :id and begins_with(sk, :r)', + ExpressionAttributeValues: { + ':id': `${businessId}`, + ':r': 'REVIEW', + }, + }; + + return docClient.query(reviewParams).promise(); +}; diff --git a/backend/isoko-backend/src/scripts/test-analytics.js b/backend/isoko-backend/src/scripts/test-analytics.js index ab1ec08..040d838 100644 --- a/backend/isoko-backend/src/scripts/test-analytics.js +++ b/backend/isoko-backend/src/scripts/test-analytics.js @@ -1,36 +1,37 @@ -const {BetaAnalyticsDataClient} = require('@google-analytics/data'); -process.env.GOOGLE_APPLICATION_CREDENTIALS = '../../isoko-analytics-862851deac41.json'; +const { BetaAnalyticsDataClient } = require('@google-analytics/data'); +process.env.GOOGLE_APPLICATION_CREDENTIALS = + '../../isoko-analytics-862851deac41.json'; const analyticsDataClient = new BetaAnalyticsDataClient(); -propertyId = "310596210" +propertyId = '310596210'; async function runReport() { - const [response] = await analyticsDataClient.runRealtimeReport({ + const [response] = await analyticsDataClient.runRealtimeReport({ property: `properties/${propertyId}`, dateRanges: [ - { - startDate: '2020-03-31', - endDate: 'today', - }, + { + startDate: '2020-03-31', + endDate: 'today', + }, ], dimensions: [ - { - name: 'city', - }, + { + name: 'city', + }, ], metrics: [ - { - name: 'activeUsers', - }, + { + name: 'activeUsers', + }, ], - }); + }); - console.log('Report result:'); - console.log(response); - response.rows.forEach(row => { + console.log('Report result:'); + console.log(response); + response.rows.forEach((row) => { console.log(row.dimensionValues[0], row.metricValues[0]); - }); - } + }); +} - runReport(); \ No newline at end of file +runReport();