From 57f113d37f7d14881e4604dbcc3003a8b1ffef52 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E2=80=9Cspicecat=E2=80=9D?= Date: Thu, 28 Jul 2022 20:13:57 -0400 Subject: [PATCH] moved services to utils --- server/bin/www | 6 +-- server/routes/question/CreateAnswer.js | 2 +- server/routes/question/CreateAnswerComment.js | 2 +- server/routes/question/CreateComment.js | 2 +- server/routes/question/EditAnswerAccepted.js | 2 +- server/routes/question/EditQuestion.js | 2 +- .../question/EditQuestionStatusClosed.js | 2 +- .../question/EditQuestionStatusProtected.js | 2 +- .../question/EditQuestionStatusReopened.js | 2 +- server/routes/question/EditQuestionVote.js | 2 +- server/routes/question/GetAnswers.js | 39 +++----------- server/routes/question/GetComments.js | 2 +- server/routes/question/GetQuestion.js | 2 +- server/services/getData.js | 30 ----------- server/utils/cronRefresh.js | 15 ++++++ server/utils/fetchData.js | 4 +- server/utils/fetchQuestions.js | 19 ------- server/utils/getData.js | 51 +++++++++++++++++++ .../question}/getAnswer.js | 0 .../question}/getComment.js | 0 .../question}/getQuestion.js | 0 .../question}/index.js | 0 .../question}/refreshQuestion.js | 0 23 files changed, 87 insertions(+), 99 deletions(-) delete mode 100644 server/services/getData.js create mode 100644 server/utils/cronRefresh.js delete mode 100644 server/utils/fetchQuestions.js create mode 100644 server/utils/getData.js rename server/{services/questionServices => utils/question}/getAnswer.js (100%) rename server/{services/questionServices => utils/question}/getComment.js (100%) rename server/{services/questionServices => utils/question}/getQuestion.js (100%) rename server/{services/questionServices => utils/question}/index.js (100%) rename server/{services/questionServices => utils/question}/refreshQuestion.js (100%) diff --git a/server/bin/www b/server/bin/www index 811cfdd..960c48f 100644 --- a/server/bin/www +++ b/server/bin/www @@ -10,7 +10,7 @@ const http = require('http'); const mongoose = require('mongoose'); const cron = require('node-cron'); -const {getAllQuestions, getAllUsers } = require('server/services/getData'); +const { refreshQuestions, refreshUsers } = require('server/utils/cronRefresh'); require('dotenv').config(); @@ -39,8 +39,8 @@ mongoose.connect(process.env.DB_CONN_STRING, { mongoose.connection.once('open', () => console.log('MongoDB connected')); mongoose.connection.on('error', console.error.bind(console, 'MongoDB connection error:')); -cron.schedule('*/2 * * * *', getAllUsers); -cron.schedule('*/30 * * * * *', getAllQuestions); +cron.schedule('*/30 * * * * *', refreshQuestions); +cron.schedule('*/2 * * * *', refreshUsers); server.listen(port, console.log(`Listening on port: ${port}`)); server.on('error', onError); diff --git a/server/routes/question/CreateAnswer.js b/server/routes/question/CreateAnswer.js index 3b20347..81860b1 100644 --- a/server/routes/question/CreateAnswer.js +++ b/server/routes/question/CreateAnswer.js @@ -1,7 +1,7 @@ const config = require('server/config.json'); const Answer = require('server/db/models/Answer'); const User = require('server/db/models/User'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const getUserLevel = require('server/utils/getUserLevel'); const createRequest = require('server/utils/api'); diff --git a/server/routes/question/CreateAnswerComment.js b/server/routes/question/CreateAnswerComment.js index 959f412..5f5f726 100644 --- a/server/routes/question/CreateAnswerComment.js +++ b/server/routes/question/CreateAnswerComment.js @@ -1,7 +1,7 @@ const config = require('server/config.json'); const Answer = require('server/db/models/Answer'); const Comment = require('server/db/models/Comment'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const createRequest = require('server/utils/api'); const getUserLevel = require('server/utils/getUserLevel'); diff --git a/server/routes/question/CreateComment.js b/server/routes/question/CreateComment.js index a31807d..0afd93e 100644 --- a/server/routes/question/CreateComment.js +++ b/server/routes/question/CreateComment.js @@ -1,6 +1,6 @@ const config = require('server/config.json'); const Comment = require('server/db/models/Comment'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const createRequest = require('server/utils/api'); const getUserLevel = require('server/utils/getUserLevel'); diff --git a/server/routes/question/EditAnswerAccepted.js b/server/routes/question/EditAnswerAccepted.js index 284b894..a4807e9 100644 --- a/server/routes/question/EditAnswerAccepted.js +++ b/server/routes/question/EditAnswerAccepted.js @@ -1,6 +1,6 @@ const config = require('server/config.json'); const Answer = require('server/db/models/Answer'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const createRequest = require('server/utils/api'); async function EditAnswerAccepted(req, res) { diff --git a/server/routes/question/EditQuestion.js b/server/routes/question/EditQuestion.js index 2382a6a..fc0f443 100644 --- a/server/routes/question/EditQuestion.js +++ b/server/routes/question/EditQuestion.js @@ -1,5 +1,5 @@ const config = require('server/config.json'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const createRequest = require('server/utils/api'); diff --git a/server/routes/question/EditQuestionStatusClosed.js b/server/routes/question/EditQuestionStatusClosed.js index 6431019..18a9e13 100644 --- a/server/routes/question/EditQuestionStatusClosed.js +++ b/server/routes/question/EditQuestionStatusClosed.js @@ -1,6 +1,6 @@ const config = require('server/config.json'); const Question = require('server/db/models/Question'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const createRequest = require('server/utils/api'); const getUserLevel = require('server/utils/getUserLevel'); diff --git a/server/routes/question/EditQuestionStatusProtected.js b/server/routes/question/EditQuestionStatusProtected.js index 468d211..78900f1 100644 --- a/server/routes/question/EditQuestionStatusProtected.js +++ b/server/routes/question/EditQuestionStatusProtected.js @@ -1,6 +1,6 @@ const config = require('server/config.json'); const Question = require('server/db/models/Question'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const getUserLevel = require('server/utils/getUserLevel'); const createRequest = require('server/utils/api'); diff --git a/server/routes/question/EditQuestionStatusReopened.js b/server/routes/question/EditQuestionStatusReopened.js index 1eeeb8c..04752bb 100644 --- a/server/routes/question/EditQuestionStatusReopened.js +++ b/server/routes/question/EditQuestionStatusReopened.js @@ -1,6 +1,6 @@ const config = require('server/config.json'); const Question = require('server/db/models/Question'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const getUserLevel = require('server/utils/getUserLevel'); const createRequest = require('server/utils/api'); diff --git a/server/routes/question/EditQuestionVote.js b/server/routes/question/EditQuestionVote.js index 631ab98..abcfda8 100644 --- a/server/routes/question/EditQuestionVote.js +++ b/server/routes/question/EditQuestionVote.js @@ -1,7 +1,7 @@ const config = require('server/config.json'); const User = require('server/db/models/User'); const Vote = require('server/db/models/Vote'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const createRequest = require('server/utils/api'); const getUserLevel = require('server/utils/getUserLevel'); diff --git a/server/routes/question/GetAnswers.js b/server/routes/question/GetAnswers.js index 01a6c18..a518eb9 100644 --- a/server/routes/question/GetAnswers.js +++ b/server/routes/question/GetAnswers.js @@ -1,48 +1,21 @@ const config = require('server/config.json'); const Answer = require('server/db/models/Answer'); const Question = require('server/db/models/Question'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); -const fetchAnswers = require('server/utils/fetchAnswers'); +const { getAllAnswers } = require('server/utils/getData'); async function GetAnswers(req, res) { const { question_id } = req.params; - const question = await getQuestion(question_id); if (!question) return res.status(404).send(config.errorNotFound); // Fetch answers if expired if (Number(question.lastAnswerFetch) + config.answerExpires < Date.now()) { - const { success, requests } = await fetchAnswers( - `/questions/${question_id}/answers` - ); - - if (!success) return res.status(500).send(config.errorGeneric); - - // Reformat questions and patch to cache - await requests - .map(({ answer_id, ...answer }) => { - return { - ...answer, - id: answer_id, - question_id - } - }) - .map(async (answer) => { - if (answer.accepted) { - await Question.findByIdAndUpdate(question_id, { - hasAccepted: true, - }); - } - - return Answer.findByIdAndUpdate(answer.id, answer, { - upsert: true, - }); - }); + const answers = await getAllAnswers({ question_id }); + return res.send({ answers }); + } else{ + const answers = await Answer.find({ question_id }); + return res.send({ answers }); } - - const answers = await Answer.find({ question_id }); - - return res.send({ answers }); } module.exports = GetAnswers; diff --git a/server/routes/question/GetComments.js b/server/routes/question/GetComments.js index a28fa8d..7719a0d 100644 --- a/server/routes/question/GetComments.js +++ b/server/routes/question/GetComments.js @@ -1,6 +1,6 @@ const config = require('server/config.json'); const Comment = require('server/db/models/Comment'); -const { getQuestion, refreshQuestion } = require('server/services/questionServices'); +const { getQuestion, refreshQuestion } = require('server/utils/question'); const fetchComments = require('server/utils/fetchComments'); async function GetComments(req, res) { diff --git a/server/routes/question/GetQuestion.js b/server/routes/question/GetQuestion.js index defe82e..8919ad1 100644 --- a/server/routes/question/GetQuestion.js +++ b/server/routes/question/GetQuestion.js @@ -1,5 +1,5 @@ const config = require('server/config.json'); -const { getQuestion } = require('server/services/questionServices'); +const { getQuestion } = require('server/utils/question'); async function GetQuestion(req, res) { const { question_id } = req.params; diff --git a/server/services/getData.js b/server/services/getData.js deleted file mode 100644 index 862afc9..0000000 --- a/server/services/getData.js +++ /dev/null @@ -1,30 +0,0 @@ -const Question = require('server/db/models/Question'); -const User = require('server/db/models/User'); -const fetchData = require('server/utils/fetchData'); - -async function getAllData(_job, done, Model, url, id, dataName) { - console.log('[INFO]: Refreshing question database.'); - const data = await fetchData(url, id, dataName); - - if (!success) console.log(`[ERROR]: ${dataName} fetch failed`); - - for (const item of data) - await Model.findByIdAndUpdate(item[id], { - ...item, - id: item[id], - }, { upsert: true }) - - done(); -} - -async function getAllQuestions(_job, done) { - return getAllData(_job, done, Question, '/questions/search', 'question_id', 'questions') -} -async function getAllUsers(_job, done) { - return getAllData(_job, done, User, '/users', 'user_id', 'users') -} - -module.exports = { - getAllQuestions, - getAllUsers -}; diff --git a/server/utils/cronRefresh.js b/server/utils/cronRefresh.js new file mode 100644 index 0000000..5119e74 --- /dev/null +++ b/server/utils/cronRefresh.js @@ -0,0 +1,15 @@ +const { getAllQuestions, getAllUsers } = require('./getData'); + +async function refreshQuestions(_job, done) { + await getAllQuestions(); + done(); +} +async function refreshUsers(_job, done) { + await getAllUsers(); + done(); +} + +module.exports = { + refreshQuestions, + refreshUsers +} \ No newline at end of file diff --git a/server/utils/fetchData.js b/server/utils/fetchData.js index 2250fd0..c4418e9 100644 --- a/server/utils/fetchData.js +++ b/server/utils/fetchData.js @@ -1,12 +1,10 @@ const createRequest = require('./api'); -const defaultAcc = []; - async function fetchData( url, id, dataName, - acc = defaultAcc, + acc = [], after = '' ) { const { success, [dataName]: data } = await createRequest('get', url, { after }); diff --git a/server/utils/fetchQuestions.js b/server/utils/fetchQuestions.js deleted file mode 100644 index 4dae973..0000000 --- a/server/utils/fetchQuestions.js +++ /dev/null @@ -1,19 +0,0 @@ -const createRequest = require('./api'); - -const defaultAcc = []; - -async function fetchQuestions( - acc = defaultAcc, - after = '' -) { - const { success, questions } = await createRequest('get', '/questions/search', { after }); - - if (!success || !questions.length) return acc; - - const newAcc = [...acc, ...questions]; - const oldest = users[questions.length - 1]; - - return fetchQuestions(newAcc, oldest.question_id); -} - -module.exports = fetchQuestions; diff --git a/server/utils/getData.js b/server/utils/getData.js new file mode 100644 index 0000000..73422a6 --- /dev/null +++ b/server/utils/getData.js @@ -0,0 +1,51 @@ +const Answer = require('server/db/models/Answer'); +const Comment = require('server/db/models/Comment'); +const Mail = require('server/db/models/Mail'); +const Question = require('server/db/models/Question'); +const User = require('server/db/models/User'); +const fetchData = require('server/utils/fetchData'); + +async function getAllData(Model, url, id, dataName) { + console.log(`[INFO]: Refreshing ${dataName} database.`); + let data = await fetchData(url, id, dataName); + data = data.map((item) => ({ + ...item, + id: item[id], + })); + for (const item of data) + await Model.findByIdAndUpdate(item[id], item, { upsert: true }); + return data; +} + +async function getAllAnswers({ question_id, username }) { + if (question_id) + return getAllData(Answer, `/questions/${question_id}/answers`, 'answer_id', 'answers') + else if (username) + return getAllData(Answer, `/users/${username}/answers`, 'answer_id', 'answers') +} + +async function getAllComments({ question_id }) { + return getAllData(Comment, `/questions/${question_id}/comments`, 'comment_id', 'comments') +} + +async function getAllMail({ question_id }) { + return getAllData(Mail, `/questions/${question_id}/comments`, 'mail_id', 'mail') +} + +async function getAllQuestions({ username }) { + if (username) + return getAllData(Question, `/users/${username}/questions`, 'question_id', 'questions') + else + return getAllData(Question, `/questions/search`, 'question_id', 'questions') +} + +async function getAllUsers() { + return getAllData(User, `/users`, 'user_id', 'users') +} + +module.exports = { + getAllAnswers, + getAllComments, + getAllQuestions, + getAllUsers +}; diff --git a/server/services/questionServices/getAnswer.js b/server/utils/question/getAnswer.js similarity index 100% rename from server/services/questionServices/getAnswer.js rename to server/utils/question/getAnswer.js diff --git a/server/services/questionServices/getComment.js b/server/utils/question/getComment.js similarity index 100% rename from server/services/questionServices/getComment.js rename to server/utils/question/getComment.js diff --git a/server/services/questionServices/getQuestion.js b/server/utils/question/getQuestion.js similarity index 100% rename from server/services/questionServices/getQuestion.js rename to server/utils/question/getQuestion.js diff --git a/server/services/questionServices/index.js b/server/utils/question/index.js similarity index 100% rename from server/services/questionServices/index.js rename to server/utils/question/index.js diff --git a/server/services/questionServices/refreshQuestion.js b/server/utils/question/refreshQuestion.js similarity index 100% rename from server/services/questionServices/refreshQuestion.js rename to server/utils/question/refreshQuestion.js