Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -243,7 +243,7 @@ describe('PutEditBusinessPageHandler tests', () => {
':a': 'Venice Beach',
},
ExpressionAttributeNames: {
'#city': 'city'
'#city': 'city',
},
ReturnValues: 'ALL_NEW',
});
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -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',
};

Expand All @@ -113,7 +113,7 @@ describe('PostReviewHandler tests', () => {

// act
await postReviewHandler(event);

// assert
expect(putSpy).toHaveBeenCalledWith({
TableName: BUSINESS_TABLE,
Expand All @@ -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',
});
});
});
Expand Down
33 changes: 10 additions & 23 deletions backend/isoko-backend/src/handlers/business/get-business-page.js
Original file line number Diff line number Diff line change
@@ -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.
Expand All @@ -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;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -106,7 +106,7 @@ exports.putEditBusinessPageHandler = async (event) => {
fieldNames,
requestBody,
exprAttrVals,
exprAttrNames,
exprAttrNames
);

const params = {
Expand Down
75 changes: 37 additions & 38 deletions backend/isoko-backend/src/handlers/review/post-review.js
Original file line number Diff line number Diff line change
Expand Up @@ -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: {
Expand All @@ -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 = {
Expand Down
28 changes: 28 additions & 0 deletions backend/isoko-backend/src/handlers/util/database-utils.js
Original file line number Diff line number Diff line change
@@ -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();
};
43 changes: 22 additions & 21 deletions backend/isoko-backend/src/scripts/test-analytics.js
Original file line number Diff line number Diff line change
@@ -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();
runReport();