Просмотр исходного кода

Add previousURL field to find previous 'nextId' for post pagination

sbkwgh 8 лет назад
Родитель
Сommit
758754f5e8
2 измененных файлов с 48 добавлено и 0 удалено
  1. 34 0
      lib/pagination.js
  2. 14 0
      routes/thread.js

+ 34 - 0
lib/pagination.js

@@ -14,6 +14,39 @@ async function getNextId(Model, where, items) {
 	}
 }
 
+async function getPreviousId(Model, where, items, limit) {
+	try {
+		let minId = await Model.min('id', { where })
+		let firstItem = items[0]
+
+		let lteVal
+
+		if(firstItem.id - limit) {
+			lteVal = firstItem.id - limit
+		} else {
+			minId
+		}
+
+		if(!firstItem || minId === firstItem.id) {
+			return null
+		} else {
+			let instance = await Model.findOne({
+				where: Object.assign({}, {
+					id: {
+						$lte: lteVal
+					}
+				}, where)
+			})
+
+			return instance.id
+		}
+	} catch (e) {
+		console.log(e)
+		return null
+	}
+}
+
+
 function getPaginationProps(query) {
 	let lastId = 0
 	let limit = 10
@@ -26,5 +59,6 @@ function getPaginationProps(query) {
 
 module.exports = {
 	getNextId,
+	getPreviousId,
 	getPaginationProps
 }

+ 14 - 0
routes/thread.js

@@ -24,6 +24,13 @@ router.get('/:thread_id', async (req, res) => {
 			resThread.Posts
 		)
 
+		let previousId = await pagination.getPreviousId(
+			Post,
+			{ threadId: +req.params.thread_id },
+			resThread.Posts,
+			limit
+		)
+
 		if(nextId) {
 			resThread.meta.nextURL =
 				`/api/v1/thread/${thread.id}?limit=${limit}&lastId=${nextId}`
@@ -31,6 +38,13 @@ router.get('/:thread_id', async (req, res) => {
 			resThread.meta.nextURL = null
 		}
 
+		if(previousId) {
+			resThread.meta.previousURL =
+				`/api/v1/thread/${thread.id}?limit=${limit}&lastId=${previousId}`
+		} else {
+			resThread.meta.previousURL = null
+		}
+
 		res.json(resThread)
 		
 	} catch (e) {