Skip to content

Commit

Permalink
added patch routes to help with cleaning up stress testing data
Browse files Browse the repository at this point in the history
  • Loading branch information
GalexyN committed Jun 12, 2021
1 parent 791ad96 commit 8695270
Show file tree
Hide file tree
Showing 4 changed files with 178 additions and 77 deletions.
13 changes: 11 additions & 2 deletions .rest
Original file line number Diff line number Diff line change
Expand Up @@ -16,7 +16,7 @@ PATCH http://localhost:3007/7/makeAllFiveStars
GET http://localhost:3007/1/newReview

###
POST http://localhost:3007/1/newReview
POST http://localhost:3007/3/newReview
Content-Type: application/json

{
Expand All @@ -27,4 +27,13 @@ Content-Type: application/json
}

###
GET http://localhost:3007/1/reviewLength
GET http://localhost:3007/3/reviewLength

###
GET http://localhost:3007/1/lastReview

###
DELETE http://localhost:3007/1/deleteLastReview

###
PATCH http://localhost:3007/1/forceUpdateTotalStarData
174 changes: 141 additions & 33 deletions db/postgres/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -19,23 +19,39 @@ let percentColumnNames = [
];

// CREATE
const addNewReview = async (courseNumber, newReview) => {
const addNewReview = (courseNumber, newReview) => {
let newReviewStar = newReview.starCount;
newReview['_id'] = await getReviewArraysLength(courseNumber);
console.log('new review after id input: ', newReview)
queryString = `UPDATE coursera.coursera_reviews SET reviews = reviews || '${JSON.stringify(
newReview
)}'::jsonb WHERE course_number = '${courseNumber}';`;

return new Promise((resolve, reject) => {
pool.query(queryString, (err, res) => {
if (err) {
reject(err);
}
let percentages = updateTotalStarData(courseNumber, newReviewStar);
resolve(percentages);
});
return getReviewArraysLength(courseNumber)
.then((length) => {
newReview['_id'] = length + 1;
// console.log(newReview);
})
.then(() => {
queryString = `UPDATE coursera.coursera_reviews SET reviews = reviews || '${JSON.stringify(
newReview
)}'::jsonb WHERE course_number = '${courseNumber}';`;
return new Promise((resolve, reject) => {
pool.query(queryString, (err, res) => {
if (err) {
reject(err);
}
let percentages = updateTotalStarData(courseNumber, newReviewStar);
resolve(percentages);
});
});
})
.then((finishedQuery) =>
console.log('finished: ', {
newlyAddedReview: newReview,
newTotalData: finishedQuery,
})
)
.catch((err) => reject(err));
});
};

// READ
const getUserReview = (courseNumber) => {
queryString = `SELECT * FROM coursera.coursera_reviews WHERE course_number = '${courseNumber}' LIMIT 1;`;
Expand All @@ -62,20 +78,33 @@ const getTotalReviewScore = (courseNumber) => {
};

const getReviewArraysLength = (courseNumber) => {
queryString = `SELECT jsonb_array_length(reviews) from coursera.coursera_reviews WHERE course_number = '${courseNumber}';`;
queryString = `SELECT jsonb_path_query(reviews, '$.size()') from coursera.coursera_reviews WHERE course_number = '${courseNumber}';`;

return new Promise((resolve, reject) => {
pool.query(queryString, (err, res) => {
if (err) {
reject(err);
}
resolve(res.rows[0].jsonb_array_length);
resolve(res.rows[0].jsonb_path_query);
});
});
};

const getLastReview = (courseNumber) => {
queryString = `SELECT reviews->-1 last_review FROM coursera.coursera_reviews WHERE course_number = '${courseNumber}';`;

return new Promise((resolve, reject) => {
pool.query(queryString, (err, res) => {
if (err) {
reject(err);
}
resolve(res.rows[0]['last_review']);
});
});
};

// UPDATE
const updateTotalStarData = (courseNumber, newStar) => {
const updateTotalStarData = (courseNumber, newStar, deletion) => {
let percentagesWithColumnNames = {};

let newStarWord =
Expand Down Expand Up @@ -115,11 +144,15 @@ const updateTotalStarData = (courseNumber, newStar) => {
percentagesWithColumnNames.review_count *
percentagesWithColumnNames[percentColumnNames[i]];
}

percentagesWithColumnNames.review_count++;
percentagesWithColumnNames.total_star_score += newStar;
percentagesWithColumnNames[newStarWord + '_star_percent_proportion']++;

if (deletion) {
percentagesWithColumnNames.review_count--;
percentagesWithColumnNames.total_star_score -= newStar;
percentagesWithColumnNames[newStarWord + '_star_percent_proportion']--;
} else {
percentagesWithColumnNames.review_count++;
percentagesWithColumnNames.total_star_score += newStar;
percentagesWithColumnNames[newStarWord + '_star_percent_proportion']++;
}
for (let k in percentagesWithColumnNames) {
if (
k.includes('proportion') ||
Expand Down Expand Up @@ -155,27 +188,102 @@ const updateTotalStarData = (courseNumber, newStar) => {
});
});
};
// helper to fix mass updates in development for rougue queries //
const forceUpdateTotalStarData = (courseNumber) => {
queryString = `SELECT jsonb_path_query_array(reviews, '$[*].starCount') FROM coursera.coursera_reviews WHERE course_number = '${courseNumber}';`;
return new Promise((resolve, reject) => {
pool.query(queryString, (err, res) => {
if (err) {
console.log(err);
reject(err);
}
let stars = res.rows[0].jsonb_path_query_array;

// DELETE
let counting = {};
stars.forEach((el) => {
if (counting[el]) {
counting[el]++;
} else {
counting[el] = 1;
}

if (counting['total']) {
counting['total']++;
} else {
counting['total'] = 1;
}

const findReviewAndUpdate = (courseNumber, reviewId) => {
if (counting['totalStars']) {
counting['totalStars'] += el;
} else {
counting['totalStars'] = el;
}
});

let one_star_percent = counting[1] ? counting[1] / counting['total'] : 0;
let two_star_percent = counting[2] ? counting[2] / counting['total'] : 0;
let three_star_percent = counting[3]
? counting[3] / counting['total']
: 0;
let four_star_percent = counting[4] ? counting[4] / counting['total'] : 0;
let five_star_percent = counting[5] ? counting[5] / counting['total'] : 0;

pool.query(
`
UPDATE coursera.coursera_reviews
SET
one_star_percent = ${one_star_percent},
two_star_percent = ${two_star_percent},
three_star_percent = ${three_star_percent},
four_star_percent = ${four_star_percent},
five_star_percent = ${one_star_percent},
review_count = ${counting['total']},
total_star_score = ${counting['totalStars']}
WHERE course_number = '${courseNumber}';
`,
(err, res) => {
if (err) {
reject(err);
}
resolve({
one_star_percent,
two_star_percent,
three_star_percent,
four_star_percent,
five_star_percent,
total_star_score: counting['totalStars'],
review_count: counting['total'],
});
}
);
});
});
};
const makeAllFiveStars = () => {};
const deleteAllRecords = () => {};

const dropReviewsCollection = () => {};
const dropTotalReviewsCollection = () => {};
// DELETE
const deleteLastReview = async (courseNumber) => {
let lastReview = await getLastReview(courseNumber);
let lastReviewStar = lastReview.starCount;

queryString = `UPDATE coursera.coursera_reviews SET reviews = reviews #- '{-1}' WHERE course_number = '${courseNumber}';`;

return new Promise((resolve, reject) => {
pool.query(queryString, async (err, res) => {
if (err) {
reject(err);
}
await updateTotalStarData(courseNumber, lastReviewStar, true);
resolve(lastReview);
});
});
};

module.exports = {
getUserReview,
findReviewAndUpdate,
makeAllFiveStars,
deleteAllRecords,
getTotalReviewScore,
dropReviewsCollection,
dropTotalReviewsCollection,
addNewReview,
getReviewArraysLength,
getLastReview,
deleteLastReview,
forceUpdateTotalStarData,
};

3 changes: 2 additions & 1 deletion package.json
Original file line number Diff line number Diff line change
Expand Up @@ -20,7 +20,8 @@
"postgres:query": "psql -f db/postgres/queryMetric.sql",
"production": "webpack --mode=production",
"postgres:create": "psql -f db/postgres/db.sql",
"postgres:seed": "psql -f db/postgres/seed.sql"
"postgres:seed": "psql -f db/postgres/seed.sql",
"postgres:stress-test": "k6 run db/postgres/stressTest.js"
},
"dependencies": {
"@babel/plugin-transform-runtime": "^7.13.10",
Expand Down
65 changes: 24 additions & 41 deletions server/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,7 @@ app.get('/:id', (req, res) => {
res.sendFile(path.resolve('./public/index.html'));
});

app.get('/:id/newReview', (req, res) => {
postgresDb
.findReviewAndUpdate(req.params.id)
.then((data) => {
// console.log('data: ', data)
res.sendStatus(200);
})
.catch((err) => {
res.sendStatus(404);
console.log(`err: ${err}`);
});
});

app.post('/:id/newReview', (req, res) => {
console.log('made it this far')
let { reviewer, starCount, reviewDate, reviewText } = req.body;

let newReview = {
Expand All @@ -39,49 +25,46 @@ app.post('/:id/newReview', (req, res) => {
reviewDate,
reviewText,
};

console.log('newReview: ', newReview)
postgresDb.addNewReview(req.params.id, newReview)
.then(response => {
res.send(response)
postgresDb
.addNewReview(req.params.id, newReview)
.then((response) => {
res.send(response);
})
.catch((err) => reject(err));
});

app.get('/:id/reviewLength', (req, res) => {
postgresDb
.getReviewArraysLength(req.params.id)
.then((data) => {
console.log(data);
res.sendStatus(200);
})
.catch((err) => {
console.log(err);
res.sendStatus(404);
});
.then((data) => res.send({ numberOfReviews: data }))
.catch((err) => res.send(err));
});

app.patch('/:id/makeAllFiveStars', (req, res) => {
db.makeAllFiveStars(req.params.id)
app.get('/:id/lastReview', (req, res) => {
postgresDb
.getLastReview(req.params.id)
.then((data) => {
console.log(`data: ${data}`);
res.sendStatus(200);
res.send(data);
})
.catch((err) => {
res.sendStatus(404);
console.log(`err: ${err}`);
res.sendStatus(err);
});
});

app.get('/:id/deleteAllRecords', (req, res) => {
db.deleteAllRecords(req.params.id)
app.patch('/:id/forceUpdateTotalStarData', (req, res) => {
postgresDb.forceUpdateTotalStarData(req.params.id)
.then(response => res.send(response))
.catch(err => res.send(err))
})

app.delete('/:id/deleteLastReview', (req, res) => {
postgresDb
.deleteLastReview(req.params.id)
.then((data) => {
console.log(`data: ${data}`);
res.sendStatus(200);
console.log(data);
res.send(data);
})
.catch((err) => {
res.sendStatus(404);
console.log(`err: ${err}`);
});
.catch((err) => res.send(err));
});

// ORIGINAL //
Expand Down

0 comments on commit 8695270

Please sign in to comment.