From 73147f48f0e51179720deb410561f748dc6dd385 Mon Sep 17 00:00:00 2001 From: jaco267 Date: Tue, 5 Apr 2022 21:59:10 +0800 Subject: [PATCH 1/6] [BE]pull request --- dump.rdb | Bin 0 -> 520 bytes package.json | 3 +- src/controllers/article_controller.js | 151 ++++++++++++++++++++++++++ src/models/article.js | 14 ++- src/models/block.js | 12 +- src/models/content.js | 6 +- src/models/latestNews.js | 6 +- src/models/version.js | 12 +- src/routes/article_router.js | 9 ++ yarn.lock | 32 ++++++ 10 files changed, 235 insertions(+), 10 deletions(-) create mode 100644 dump.rdb diff --git a/dump.rdb b/dump.rdb new file mode 100644 index 0000000000000000000000000000000000000000..571c0d2924ec936e95f71a100eab34394d2d2145 GIT binary patch literal 520 zcmXBOPixaq008imSz4#qp)iyk8glW{{9DsB=_${yD{*a|nNv3r`dJ`O!N=|LaSmEzHx55GUYKYII)zEKDrOz^hR zp_j`JAz|F$dC#eFHpaGx&i|2#1A+p=nYiThtb>R0elym?s?LLqqOyfcWx#{(ZjzWm zfVwp{tr~T(qsZ$M`2k6Bu-RNxY9pJERhc#Ue!9SoLYsbd0r}AN=$AzsBSglcW@{xa zrdO`HF$l0f32+iKjUn`6G_A~zSDxM*tSJYm{c!iL&{eV0RfAgKTHP(uUZopZ{ { return originalAuthors.some(author => JSON.stringify(author) === JSON.stringify(targetAuthor)) } @@ -752,5 +758,150 @@ module.exports = { type: 'success', data: doc }) + }, + async getArticleAuthorsImg(req, res, next) { + console.log("article/getArticleAuthors....."); + try { + const articleId = req.params.id; + + const authorsData=await getOrSetCache(`ArticleId:${articleId}_AuthorsImg`,async()=>{ + const doc = await Article.findById(articleId).exec(); + const authors = []; + for (const author of doc.authors) { + const { displayName,photoURL,email } = await Utils.firebase.getUserInfoById( + author.uid + ); + authors.push({ uid:author.uid, displayName:displayName, photoURL:photoURL,email:email,isAnomynous:author.isAnonymous }); + } + return authors + }) + + res.status(200).send({ + code: 200, + type: "success", + data: authorsData, + message: "已成功抓取作者", + }); + } catch (error) { + console.log(error); + } + }, + async putDeleteArticleById(req, res, next) { + try { + const { id } = req.body; + let deletedArticle = await Article.findById(id); + if (deletedArticle === undefined) { + return res.status(200).send({ + code: 500, + type: "error", + message: "文章的ID輸入有誤,請重新查詢", + }); + } + + //刪除 ../models/article.js 的 articleSchema // 還有 blockSchema (增加刪除標記) + deletedArticle.blocks.forEach((block, index) => { + if (block.blockDateTime == null) { + console.log( + "blockDateTime bug 就算沒有打blockDatetime 也可以發布新block" + ); + block.blockDateTime = Date.now(); //default 把 block date time設定為現在 + } + block.isdeleted = true; + }); + deletedArticle.isdeleted = true; + + await deletedArticle.save(); + + const allArticleblocks = await Block.find({ articleId: id }); + + //刪除 ../models/block.js 的blockSchema // 還有 block 裡面的 revision schema + allArticleblocks.forEach(async (block, blockIndex) => { + block.isdeleted = true; + block.revisions.forEach(async (rev, revIndex) => { + rev.isdeleted = true; + }); + await block.save(); + }); + //刪除../models/content.js 的 content schema + const allContents = await Content.find({ articleId: id }); + allContents.forEach(async (content, contentIndex) => { + content.isdeleted = true; + await content.save(); + }); + //latestNews + const allLatest = await LatestNews.find({ articleId: id }); + allLatest.forEach(async (latest, Index) => { + latest.isdeleted = true; + await latest.save(); + }); + + //version + const allVersion = await Version.find({ articleId: id }); + console.log(allVersion, " allv"); + allVersion.forEach(async (ver, verIndex) => { + ver.versions.forEach((v2, v2Index) => { + v2.blocks.forEach((v3, v3Index) => { + console.log(v3, ` v33 ${v3Index}`); + v3.isdeleted = true; + }); + v2.isdeleted = true; + }); + ver.isdeleted = true; + await ver.save(); + }); + return res.status(200).send({ + test: "軟刪除成功", + }); + } catch (error) { + console.log(error); + res.status(200).send({ + code: 500, + type: "error", + message: error.message, + }); + } + }, + async deleteArticleById(req, res, next) { + try { + const { id } = req.body; + const deleteTime = Date.now(); + let article=await Article.findOne({_id:id}) + await Article.deleteOne({_id:id}); + + await Block.deleteMany({ articleId: id }); + await Content.deleteMany({ articleId: id }); + await LatestNews.deleteMany({ articleId: id }); + await Version.deleteMany({ articleId: id }); + + return res.status(200).send({ + test: `硬刪除成功 articleid: ${id} ${article.title}`, + }); + } catch (error) { + console.log(error); + res.status(200).send({ + code: 500, + type: "error", + message: error.message, + }); + } } } + + +function getOrSetCache(key,cb){ + return new Promise((resolve,reject)=>{ + redisClient.get(key,async(error,data)=>{ + if(error){ + return reject(error) + } + if(data!=null){ + console.log('Cache Hit') + return resolve(JSON.parse(data)) + } + console.log('Cache Miss') + const freshData=await cb() + redisClient.setex(key,DEFAULT_EXPIRATION,JSON.stringify(freshData)) + resolve(freshData) + }) + }) +} \ No newline at end of file diff --git a/src/models/article.js b/src/models/article.js index bdb831e..2368d6c 100644 --- a/src/models/article.js +++ b/src/models/article.js @@ -11,7 +11,7 @@ const blockSchema = new mongoose.Schema({ }, blockDateTime: { type: Date, - required: true + required: false }, content: { type: Object @@ -19,7 +19,11 @@ const blockSchema = new mongoose.Schema({ authors: { type: Array, required: true - } + }, + isdeleted: { + type: Boolean, + default: false, + }, }) const articleSchema = new mongoose.Schema({ @@ -65,7 +69,11 @@ const articleSchema = new mongoose.Schema({ type: Number, default: 0 }, - blocks: [blockSchema] + blocks: [blockSchema], + isdeleted: { + type: Boolean, + default: false, + }, }) const article = mongoose.model('Article', articleSchema, 'Articles') diff --git a/src/models/block.js b/src/models/block.js index b6e8824..80fbd2f 100644 --- a/src/models/block.js +++ b/src/models/block.js @@ -22,7 +22,11 @@ const revisionSchema = new mongoose.Schema({ revisionIndex: { type: Number, required: true - } + }, + isdeleted: { + type: Boolean, + default: false, + }, }) const blockSchema = new mongoose.Schema({ @@ -38,7 +42,11 @@ const blockSchema = new mongoose.Schema({ type: Array, required: true }, - revisions: [revisionSchema] + revisions: [revisionSchema], + isdeleted: { + type: Boolean, + default: false, + }, }) const block = mongoose.model('Block', blockSchema, 'Blocks') diff --git a/src/models/content.js b/src/models/content.js index e3cae43..f595abf 100644 --- a/src/models/content.js +++ b/src/models/content.js @@ -12,7 +12,11 @@ const contentSchema = new mongoose.Schema({ }, content: { type: Object - } + }, + isdeleted: { + type: Boolean, + default: false, + }, }) const content = mongoose.model('Content', contentSchema, 'Content') diff --git a/src/models/latestNews.js b/src/models/latestNews.js index 1b3261c..0332d05 100644 --- a/src/models/latestNews.js +++ b/src/models/latestNews.js @@ -10,7 +10,11 @@ const latestNewsSchema = new mongoose.Schema({ updatedAt: { type: Date, default: Date.now - } + }, + isdeleted: { + type: Boolean, + default: false, + }, }) const latestNews = mongoose.model('latestNews', latestNewsSchema, 'latestNews') diff --git a/src/models/version.js b/src/models/version.js index 62144bc..d912ede 100644 --- a/src/models/version.js +++ b/src/models/version.js @@ -18,7 +18,11 @@ const blockSchema = new mongoose.Schema({ revisionIndex: { type: Number, required: true - } + }, + isdeleted: { + type: Boolean, + default: false, + }, }) const versionSchema = new mongoose.Schema({ @@ -55,7 +59,11 @@ const versionSchema = new mongoose.Schema({ default: 0 } } - }] + }], + isdeleted: { + type: Boolean, + default: false, + }, }) const version = mongoose.model('Version', versionSchema, 'Versions') diff --git a/src/routes/article_router.js b/src/routes/article_router.js index 40bc5d9..b3e5590 100644 --- a/src/routes/article_router.js +++ b/src/routes/article_router.js @@ -19,4 +19,13 @@ router.route('/article/:id/authors') router.route('/search') .get(ctrl.searchArticles) +router.route("/article/:id/authorsImg") + .get(ctrl.getArticleAuthorsImg); + +router.route("/article/putDeleteArticle") + .put(ctrl.putDeleteArticleById); // req.body--> { "id":article_id} + +router.route("/article/deleteArticle") + .delete(ctrl.deleteArticleById); // req.body--> { "id":article_id} + module.exports = router diff --git a/yarn.lock b/yarn.lock index b589a65..97ce862 100644 --- a/yarn.lock +++ b/yarn.lock @@ -956,6 +956,11 @@ denque@^1.4.1: resolved "https://registry.yarnpkg.com/denque/-/denque-1.4.1.tgz#6744ff7641c148c3f8a69c307e51235c1f4a37cf" integrity sha512-OfzPuSZKGcgr96rf1oODnfjqBFmr1DVoc/TrItj3Ohe0Ah1C5WX5Baquw/9U9KovnQ88EqmJbD66rKYUQYN1tQ== +denque@^1.5.0: + version "1.5.1" + resolved "https://registry.yarnpkg.com/denque/-/denque-1.5.1.tgz#07f670e29c9a78f8faecb2566a1e2c11929c5cbf" + integrity sha512-XwE+iZ4D6ZUB7mfYRMb5wByE8L74HCn30FBN7sWnXksWc1LO1bPDl67pBR9o/kC4z/xSNAwkMYcGgqDV3BE3Hw== + depd@2.0.0: version "2.0.0" resolved "https://registry.yarnpkg.com/depd/-/depd-2.0.0.tgz#b696163cc757560d09cf22cc8fad1571b79e76df" @@ -3265,6 +3270,33 @@ readdirp@^2.2.1: micromatch "^3.1.10" readable-stream "^2.0.2" +redis-commands@^1.7.0: + version "1.7.0" + resolved "https://registry.yarnpkg.com/redis-commands/-/redis-commands-1.7.0.tgz#15a6fea2d58281e27b1cd1acfb4b293e278c3a89" + integrity sha512-nJWqw3bTFy21hX/CPKHth6sfhZbdiHP6bTawSgQBlKOVRG7EZkfHbbHwQJnrE4vsQf0CMNE+3gJ4Fmm16vdVlQ== + +redis-errors@^1.0.0, redis-errors@^1.2.0: + version "1.2.0" + resolved "https://registry.yarnpkg.com/redis-errors/-/redis-errors-1.2.0.tgz#eb62d2adb15e4eaf4610c04afe1529384250abad" + integrity sha1-62LSrbFeTq9GEMBK/hUpOEJQq60= + +redis-parser@^3.0.0: + version "3.0.0" + resolved "https://registry.yarnpkg.com/redis-parser/-/redis-parser-3.0.0.tgz#b66d828cdcafe6b4b8a428a7def4c6bcac31c8b4" + integrity sha1-tm2CjNyv5rS4pCin3vTGvKwxyLQ= + dependencies: + redis-errors "^1.0.0" + +redis@3.1.0: + version "3.1.0" + resolved "https://registry.yarnpkg.com/redis/-/redis-3.1.0.tgz#39daec130d74b78decca93513c61db0af5d86ce6" + integrity sha512-//lAOcEtNIKk2ekZibes5oyWKYUVWMvMB71lyD/hS9KRePNkB7AU3nXGkArX6uDKEb2N23EyJBthAv6pagD0uw== + dependencies: + denque "^1.5.0" + redis-commands "^1.7.0" + redis-errors "^1.2.0" + redis-parser "^3.0.0" + referrer-policy@1.2.0: version "1.2.0" resolved "https://registry.yarnpkg.com/referrer-policy/-/referrer-policy-1.2.0.tgz#b99cfb8b57090dc454895ef897a4cc35ef67a98e" From acaba1147f94f94012e2272ea3fb4a83dd157915 Mon Sep 17 00:00:00 2001 From: jaco267 Date: Wed, 6 Apr 2022 17:14:24 +0800 Subject: [PATCH 2/6] [BE][pull request] Add getManyUsersInfo route in auth_router, getPopularArticle\getArticleOthers routes in article_router --- dump.rdb | Bin 520 -> 716 bytes src/controllers/article_controller.js | 155 ++++++++++++++++++++------ src/controllers/auth_controller.js | 52 ++++++++- src/routes/article_router.js | 3 + src/routes/auth_router.js | 3 + 5 files changed, 180 insertions(+), 33 deletions(-) diff --git a/dump.rdb b/dump.rdb index 571c0d2924ec936e95f71a100eab34394d2d2145..242bfbcdff39bb687e5d4d65b0c76605e1efbf01 100644 GIT binary patch delta 642 zcmV~$%Wu+P003}|!!hGU7a!X}8e%dJFj{CCkeIBDSD{cxVK9uD-PaHL(HHQwW1xoP zOuRU=ELq~~4>0p!OuT9I>dlKTAt{TS8V`E%u#5hF4<`-*Qe{0iZW~f2x+ad z0Rs6B$H0sAA}5v%6(y=>aG4lYEu|=Z~?0G2L z^Hz_zHjOZAn0ntZZS0FTBn`v+{`aF|Tck6)(PEZ;HLK?55lEf~r zp5fsD)D@Zdayp#u%8ut?T9yn1HH2{+0wigX5V_b)yh;2e9v+^3;=29s>Syc4#4lIo EKVNI;?EnA( delta 445 zcmV~$&ui0A007{Ot*$88sW>M)H00u?S(-IXlbrIbU5QKTjLx}<*w^GWKTPtnzQit( zQcw_&?%@C6Mbw+ep?DJnLGYpk@vxi6jUCkQ`&@cH_o9C8XGb5Llv9FiHbmivrChxmOO_G=>92dCF{XZ9{m5^gyJQN?bi553B4ipqs%$}(N4j4OWYDEz; znrz-MTVPuf*D`S{$#JyNJ}otUha7rO4qySly&bkqfq@0dw;ovc|yxnl0Qj*iB?a03~u k { + if (err || doc.length === 0) { + res.status(200).send({ + code: 404, + type: "success", + message: "查無搜尋結果", + }); + } else { + for(let i=0;i { + if (err || doc.length === 0) { + res.status(200).send({ + code: 404, + type: "success", + message: "查無搜尋結果", + }); + } else { + for(let i=0;i edited.articleId) + const viewedArticleIds = viewedList + const subscribedArticleIds = subscribedList.map(subscribed => subscribed.articleId) + // for(let j=0;jh) + const q = handleGetArticlesByArray + const result = await Promise.all([q(editedArticleIds), q(viewedArticleIds), q(subscribedArticleIds)]) + console.log(result[0].length,result[1].length,result[2].length,"000000000") + console.log(editedArticleIds.length,viewedArticleIds.length,subscribedArticleIds.length) + result[0].forEach((e,i)=>{ + console.log(e.title,":....") + }) + userinfo.push({ + displayName:displayName, + edited: result[0], + viewed: result[1], + subscribed: result[2], + points + }) + } + res.json({ + code: 200, + type: 'success', + message: `已成功傳送${userinfo.length}個使用者資料`, + data: userinfo + }) + } catch (error) { + console.log(error) + res.status(500).send({ + code: 500, + type: 'error', + message: error.message + }) + } + } } async function getArticlesInfo (req, res) { diff --git a/src/routes/article_router.js b/src/routes/article_router.js index b3e5590..3159f3e 100644 --- a/src/routes/article_router.js +++ b/src/routes/article_router.js @@ -4,6 +4,9 @@ const ctrl = require('../controllers/article_controller') router.route('/article') .get(ctrl.getArticles) +router.route("/article/popular").get(ctrl.getPopularArticle); +router.route("/article/others").get(ctrl.getArticlesOthers); + router.route('/article/:id') .get(ctrl.getArticleById) diff --git a/src/routes/auth_router.js b/src/routes/auth_router.js index a294dc6..0061785 100644 --- a/src/routes/auth_router.js +++ b/src/routes/auth_router.js @@ -16,4 +16,7 @@ router.route('/profile/subscribe') router.route('/profile/article') .post(ctrl.getArticlesInfo) +router.route('/profile/manyUsersInfo') + .post(ctrl.getManyUsersInfo) //req.body -->> { "uids":["l18gziuFDxdmaJKdPwdQMeRIOvX2","WmPqnkHg9QfQ7NCuCh3WAV4cenN2","V1t2lp0nHYWrtREtLkCaLVHXMhx2"]} + module.exports = router From acadce06b9d443e9d5fcc5132724571dfa82c604 Mon Sep 17 00:00:00 2001 From: jaco267 Date: Thu, 7 Apr 2022 11:10:52 +0800 Subject: [PATCH 3/6] [BE][newsroute] pagination --- src/controllers/news_controller.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/controllers/news_controller.js b/src/controllers/news_controller.js index 94b7b55..f4d99a2 100644 --- a/src/controllers/news_controller.js +++ b/src/controllers/news_controller.js @@ -27,9 +27,10 @@ module.exports = { }) }, getNews (req, res, next) { + console.log("/news_controller/getNews") const keyword = req.query.q || '' const checkQueryLimit = Number(req.query.limit) - const limit = isNaN(checkQueryLimit) ? 20 : checkQueryLimit + const limit = isNaN(checkQueryLimit) ? 3 : checkQueryLimit const pageNumber = isNaN(Number(req.query.page)) ? 0 : Number(req.query.page) const time = req.query.tbs const media = req.query.media.toString() || '' @@ -39,6 +40,7 @@ module.exports = { searchQuery = searchMediaIndex >= 0 ? { media } : {} } let timeQuery = {} + console.log(keyword,"limit:",limit,"page",pageNumber,"time:",time,media) switch (time) { case 'qdr:h': timeQuery = { @@ -62,8 +64,7 @@ module.exports = { break default: timeQuery = {} break - } - + } if (keyword) { News.find( { @@ -83,7 +84,7 @@ module.exports = { } ], ...timeQuery - }, null, { limit: limit, skip: pageNumber > 0 ? pageNumber * 20 : 0, sort: { _id: -1 } }) + }, null, { limit: limit, skip: pageNumber > 0 ? pageNumber * limit : 0, sort: { _id: -1 } }) .exec((err, doc) => { if (err || doc.length === 0) { console.error(err) From bd799e6872eb64f133e506ed9fbcc1d04dcae1db Mon Sep 17 00:00:00 2001 From: timmyhorng Date: Tue, 12 Apr 2022 19:12:28 +0800 Subject: [PATCH 4/6] [BE]eslint --- .env | 1 + src/controllers/article_controller.js | 296 +++++++++++++------------- src/controllers/auth_controller.js | 24 +-- src/index.js | 1 - src/models/article.js | 8 +- src/models/block.js | 8 +- src/models/content.js | 4 +- src/models/latestNews.js | 4 +- src/models/version.js | 8 +- src/routes/article_router.js | 16 +- src/routes/auth_router.js | 2 +- 11 files changed, 184 insertions(+), 188 deletions(-) create mode 100644 .env diff --git a/.env b/.env new file mode 100644 index 0000000..9c6f97e --- /dev/null +++ b/.env @@ -0,0 +1 @@ +PORT=2000 diff --git a/src/controllers/article_controller.js b/src/controllers/article_controller.js index f37f665..c7bfd82 100644 --- a/src/controllers/article_controller.js +++ b/src/controllers/article_controller.js @@ -12,11 +12,10 @@ const mockController = require('../mock') const mongoose = require('mongoose') const categories = ['政經', '社會', '環境', '運動', '國際', '科技', '生活'] -const Redis = require("redis") +const Redis = require('redis') const redisClient = Redis.createClient() -const DEFAULT_EXPIRATION=3600 - +const DEFAULT_EXPIRATION = 3600 const isExistedAuthor = (originalAuthors, targetAuthor) => { return originalAuthors.some(author => JSON.stringify(author) === JSON.stringify(targetAuthor)) @@ -216,38 +215,38 @@ module.exports = { } }) }, - async getPopularArticle(req, res, next) { - console.log("getting Popular articles"); + async getPopularArticle (req, res, next) { + console.log('getting Popular articles') if (req.query.mode === MODE.DEBUG) { - console.log("[Mock][Articles] use mock data"); - mockController.mockArticles(req, res); - return; + console.log('[Mock][Articles] use mock data') + mockController.mockArticles(req, res) + return } - if (req.query.limit==undefined){ - req.query.limit=6; ///default value - console.log(`default limit value : ${req.query.limit}`) + if (req.query.limit === undefined) { + req.query.limit = 6 /// default value + console.log(`default limit value : ${req.query.limit}`) } - console.log(req.query.limit," limit") - const keyword = req.query.q || ""; - - const limit = Number(req.query.limit); - console.log("getArticles: " + keyword + "," + limit," ......."); + console.log(req.query.limit, ' limit') + const keyword = req.query.q || '' + + const limit = Number(req.query.limit) + console.log('getArticles: ' + keyword + ',' + limit, ' .......') Article.find( { $or: [ { title: { $regex: keyword, - $options: "i", - }, + $options: 'i' + } }, { outline: { $regex: keyword, - $options: "i", - }, - }, - ], + $options: 'i' + } + } + ] }, null, { limit: limit, sort: { viewsCount: -1 } } @@ -255,57 +254,57 @@ module.exports = { if (err || doc.length === 0) { res.status(200).send({ code: 404, - type: "success", - message: "查無搜尋結果", - }); + type: 'success', + message: '查無搜尋結果' + }) } else { - for(let i=0;i { + ).exec(async (err, doc) => { if (err || doc.length === 0) { res.status(200).send({ code: 404, - type: "success", - message: "查無搜尋結果", - }); + type: 'success', + message: '查無搜尋結果' + }) } else { - for(let i=0;i{ - const doc = await Article.findById(articleId).exec(); - const authors = []; + const articleId = req.params.id + const authorsData = await getOrSetCache(`ArticleId:${articleId}_AuthorsImg`, async () => { + const doc = await Article.findById(articleId).exec() + const authors = [] for (const author of doc.authors) { - const { displayName,photoURL,email } = await Utils.firebase.getUserInfoById( + const { displayName, photoURL, email } = await Utils.firebase.getUserInfoById( author.uid - ); - authors.push({ uid:author.uid, displayName:displayName, photoURL:photoURL,email:email,isAnomynous:author.isAnonymous }); + ) + authors.push({ uid: author.uid, displayName: displayName, photoURL: photoURL, email: email, isAnomynous: author.isAnonymous }) } return authors }) res.status(200).send({ code: 200, - type: "success", + type: 'success', data: authorsData, - message: "已成功抓取作者", - }); + message: '已成功抓取作者' + }) } catch (error) { - console.log(error); + console.log(error) } }, - async putDeleteArticleById(req, res, next) { + async putDeleteArticleById (req, res, next) { try { - const { id } = req.body; - let deletedArticle = await Article.findById(id); + const { id } = req.body + const deletedArticle = await Article.findById(id) if (deletedArticle === undefined) { return res.status(200).send({ code: 500, - type: "error", - message: "文章的ID輸入有誤,請重新查詢", - }); + type: 'error', + message: '文章的ID輸入有誤,請重新查詢' + }) } - //刪除 ../models/article.js 的 articleSchema // 還有 blockSchema (增加刪除標記) + // 刪除 ../models/article.js 的 articleSchema // 還有 blockSchema (增加刪除標記) deletedArticle.blocks.forEach((block, index) => { if (block.blockDateTime == null) { console.log( - "blockDateTime bug 就算沒有打blockDatetime 也可以發布新block" - ); - block.blockDateTime = Date.now(); //default 把 block date time設定為現在 + 'blockDateTime bug 就算沒有打blockDatetime 也可以發布新block' + ) + block.blockDateTime = Date.now() // default 把 block date time設定為現在 } - block.isdeleted = true; - }); - deletedArticle.isdeleted = true; + block.isdeleted = true + }) + deletedArticle.isdeleted = true - await deletedArticle.save(); + await deletedArticle.save() - const allArticleblocks = await Block.find({ articleId: id }); + const allArticleblocks = await Block.find({ articleId: id }) - //刪除 ../models/block.js 的blockSchema // 還有 block 裡面的 revision schema + // 刪除 ../models/block.js 的blockSchema // 還有 block 裡面的 revision schema allArticleblocks.forEach(async (block, blockIndex) => { - block.isdeleted = true; + block.isdeleted = true block.revisions.forEach(async (rev, revIndex) => { - rev.isdeleted = true; - }); - await block.save(); - }); - //刪除../models/content.js 的 content schema - const allContents = await Content.find({ articleId: id }); + rev.isdeleted = true + }) + await block.save() + }) + // 刪除../models/content.js 的 content schema + const allContents = await Content.find({ articleId: id }) allContents.forEach(async (content, contentIndex) => { - content.isdeleted = true; - await content.save(); - }); - //latestNews - const allLatest = await LatestNews.find({ articleId: id }); + content.isdeleted = true + await content.save() + }) + // latestNews + const allLatest = await LatestNews.find({ articleId: id }) allLatest.forEach(async (latest, Index) => { - latest.isdeleted = true; - await latest.save(); - }); + latest.isdeleted = true + await latest.save() + }) - //version - const allVersion = await Version.find({ articleId: id }); - console.log(allVersion, " allv"); + // version + const allVersion = await Version.find({ articleId: id }) + console.log(allVersion, ' allv') allVersion.forEach(async (ver, verIndex) => { ver.versions.forEach((v2, v2Index) => { v2.blocks.forEach((v3, v3Index) => { - console.log(v3, ` v33 ${v3Index}`); - v3.isdeleted = true; - }); - v2.isdeleted = true; - }); - ver.isdeleted = true; - await ver.save(); - }); + console.log(v3, ` v33 ${v3Index}`) + v3.isdeleted = true + }) + v2.isdeleted = true + }) + ver.isdeleted = true + await ver.save() + }) return res.status(200).send({ - test: "軟刪除成功", - }); + test: '軟刪除成功' + }) } catch (error) { - console.log(error); + console.log(error) res.status(200).send({ code: 500, - type: "error", - message: error.message, - }); + type: 'error', + message: error.message + }) } }, - async deleteArticleById(req, res, next) { + async deleteArticleById (req, res, next) { try { - const { id } = req.body; - const deleteTime = Date.now(); - let article=await Article.findOne({_id:id}) - await Article.deleteOne({_id:id}); - - await Block.deleteMany({ articleId: id }); - await Content.deleteMany({ articleId: id }); - await LatestNews.deleteMany({ articleId: id }); - await Version.deleteMany({ articleId: id }); - + const { id } = req.body + const article = await Article.findOne({ _id: id }) + await Article.deleteOne({ _id: id }) + + await Block.deleteMany({ articleId: id }) + await Content.deleteMany({ articleId: id }) + await LatestNews.deleteMany({ articleId: id }) + await Version.deleteMany({ articleId: id }) + return res.status(200).send({ - test: `硬刪除成功 articleid: ${id} ${article.title}`, - }); + test: `硬刪除成功 articleid: ${id} ${article.title}` + }) } catch (error) { - console.log(error); + console.log(error) res.status(200).send({ code: 500, - type: "error", - message: error.message, - }); + type: 'error', + message: error.message + }) } } } - -function getOrSetCache(key,cb){ - return new Promise((resolve,reject)=>{ - redisClient.get(key,async(error,data)=>{ - if(error){ - return reject(error) - } - if(data!=null){ - console.log('Cache Hit') - return resolve(JSON.parse(data)) - } - console.log('Cache Miss') - const freshData=await cb() - redisClient.setex(key,DEFAULT_EXPIRATION,JSON.stringify(freshData)) - resolve(freshData) - }) +function getOrSetCache (key, cb) { + return new Promise((resolve, reject) => { + redisClient.get(key, async (error, data) => { + if (error) { + return reject(error) + } + if (data != null) { + console.log('Cache Hit') + return resolve(JSON.parse(data)) + } + console.log('Cache Miss') + const freshData = await cb() + redisClient.setex(key, DEFAULT_EXPIRATION, JSON.stringify(freshData)) + resolve(freshData) + }) }) -} \ No newline at end of file +} diff --git a/src/controllers/auth_controller.js b/src/controllers/auth_controller.js index 13277b0..7f6005c 100644 --- a/src/controllers/auth_controller.js +++ b/src/controllers/auth_controller.js @@ -144,15 +144,15 @@ const auth = { } }, getArticlesInfo, - async getManyUsersInfo(req,res){ + async getManyUsersInfo (req, res) { try { - let {uids}=req.body - let userinfo=[] - for(let i=0;i{ - console.log(e.title,":....") + console.log(result[0].length, result[1].length, result[2].length, '000000000') + console.log(editedArticleIds.length, viewedArticleIds.length, subscribedArticleIds.length) + result[0].forEach((e, i) => { + console.log(e.title, ':....') }) userinfo.push({ - displayName:displayName, + displayName: displayName, edited: result[0], viewed: result[1], subscribed: result[2], diff --git a/src/index.js b/src/index.js index d0a95a4..c65a8e4 100644 --- a/src/index.js +++ b/src/index.js @@ -1,7 +1,6 @@ const http = require('http') const app = require('./lib/app') const PORT = process.env.PORT || 80 - const server = http.createServer(app) server.listen(PORT, () => { console.log(`Server started on port ${PORT}`) diff --git a/src/models/article.js b/src/models/article.js index 2368d6c..21bd16f 100644 --- a/src/models/article.js +++ b/src/models/article.js @@ -22,8 +22,8 @@ const blockSchema = new mongoose.Schema({ }, isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const articleSchema = new mongoose.Schema({ @@ -72,8 +72,8 @@ const articleSchema = new mongoose.Schema({ blocks: [blockSchema], isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const article = mongoose.model('Article', articleSchema, 'Articles') diff --git a/src/models/block.js b/src/models/block.js index 80fbd2f..b230d5d 100644 --- a/src/models/block.js +++ b/src/models/block.js @@ -25,8 +25,8 @@ const revisionSchema = new mongoose.Schema({ }, isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const blockSchema = new mongoose.Schema({ @@ -45,8 +45,8 @@ const blockSchema = new mongoose.Schema({ revisions: [revisionSchema], isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const block = mongoose.model('Block', blockSchema, 'Blocks') diff --git a/src/models/content.js b/src/models/content.js index f595abf..b461f12 100644 --- a/src/models/content.js +++ b/src/models/content.js @@ -15,8 +15,8 @@ const contentSchema = new mongoose.Schema({ }, isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const content = mongoose.model('Content', contentSchema, 'Content') diff --git a/src/models/latestNews.js b/src/models/latestNews.js index 0332d05..8b6585c 100644 --- a/src/models/latestNews.js +++ b/src/models/latestNews.js @@ -13,8 +13,8 @@ const latestNewsSchema = new mongoose.Schema({ }, isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const latestNews = mongoose.model('latestNews', latestNewsSchema, 'latestNews') diff --git a/src/models/version.js b/src/models/version.js index d912ede..8606753 100644 --- a/src/models/version.js +++ b/src/models/version.js @@ -21,8 +21,8 @@ const blockSchema = new mongoose.Schema({ }, isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const versionSchema = new mongoose.Schema({ @@ -62,8 +62,8 @@ const versionSchema = new mongoose.Schema({ }], isdeleted: { type: Boolean, - default: false, - }, + default: false + } }) const version = mongoose.model('Version', versionSchema, 'Versions') diff --git a/src/routes/article_router.js b/src/routes/article_router.js index 3159f3e..a843284 100644 --- a/src/routes/article_router.js +++ b/src/routes/article_router.js @@ -4,8 +4,8 @@ const ctrl = require('../controllers/article_controller') router.route('/article') .get(ctrl.getArticles) -router.route("/article/popular").get(ctrl.getPopularArticle); -router.route("/article/others").get(ctrl.getArticlesOthers); +router.route('/article/popular').get(ctrl.getPopularArticle) +router.route('/article/others').get(ctrl.getArticlesOthers) router.route('/article/:id') .get(ctrl.getArticleById) @@ -22,13 +22,13 @@ router.route('/article/:id/authors') router.route('/search') .get(ctrl.searchArticles) -router.route("/article/:id/authorsImg") - .get(ctrl.getArticleAuthorsImg); +router.route('/article/:id/authorsImg') + .get(ctrl.getArticleAuthorsImg) -router.route("/article/putDeleteArticle") - .put(ctrl.putDeleteArticleById); // req.body--> { "id":article_id} +router.route('/article/putDeleteArticle') + .put(ctrl.putDeleteArticleById) // req.body--> { "id":article_id} -router.route("/article/deleteArticle") - .delete(ctrl.deleteArticleById); // req.body--> { "id":article_id} +router.route('/article/deleteArticle') + .delete(ctrl.deleteArticleById) // req.body--> { "id":article_id} module.exports = router diff --git a/src/routes/auth_router.js b/src/routes/auth_router.js index 0061785..ac45b77 100644 --- a/src/routes/auth_router.js +++ b/src/routes/auth_router.js @@ -17,6 +17,6 @@ router.route('/profile/article') .post(ctrl.getArticlesInfo) router.route('/profile/manyUsersInfo') - .post(ctrl.getManyUsersInfo) //req.body -->> { "uids":["l18gziuFDxdmaJKdPwdQMeRIOvX2","WmPqnkHg9QfQ7NCuCh3WAV4cenN2","V1t2lp0nHYWrtREtLkCaLVHXMhx2"]} + .post(ctrl.getManyUsersInfo) // req.body -->> { "uids":["l18gziuFDxdmaJKdPwdQMeRIOvX2","WmPqnkHg9QfQ7NCuCh3WAV4cenN2","V1t2lp0nHYWrtREtLkCaLVHXMhx2"]} module.exports = router From d093801b5e8cdf0237102dfde7adae5020d2bda3 Mon Sep 17 00:00:00 2001 From: jaco267 Date: Wed, 13 Apr 2022 10:38:08 +0800 Subject: [PATCH 5/6] [BE]set block date time to true --- src/models/article.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/article.js b/src/models/article.js index 21bd16f..5da09da 100644 --- a/src/models/article.js +++ b/src/models/article.js @@ -11,7 +11,7 @@ const blockSchema = new mongoose.Schema({ }, blockDateTime: { type: Date, - required: false + required: true }, content: { type: Object From 523e42a60339854ecd054ca74f3a11840cb35d83 Mon Sep 17 00:00:00 2001 From: Andy Chang Date: Wed, 13 Apr 2022 18:27:51 +0800 Subject: [PATCH 6/6] [SYNC-192][BE] chore: Change blockDateTime required: false --- src/models/article.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/models/article.js b/src/models/article.js index 5da09da..21bd16f 100644 --- a/src/models/article.js +++ b/src/models/article.js @@ -11,7 +11,7 @@ const blockSchema = new mongoose.Schema({ }, blockDateTime: { type: Date, - required: true + required: false }, content: { type: Object