new mechanisms for fetching the feed

This commit is contained in:
Daniel Lugo 2020-08-03 18:12:46 -04:00
parent 7782f59f82
commit bf9426ede7

View file

@ -13,6 +13,8 @@ const Common = require('shock-common')
const isARealUsableNumber = require('lodash/isFinite') const isARealUsableNumber = require('lodash/isFinite')
const Big = require('big.js') const Big = require('big.js')
const size = require('lodash/size') const size = require('lodash/size')
const { range } = require('ramda')
const flattenDeep = require('lodash/flattenDeep')
const getListPage = require('../utils/paginate') const getListPage = require('../utils/paginate')
const auth = require('../services/auth/auth') const auth = require('../services/auth/auth')
@ -2047,6 +2049,18 @@ module.exports = async (
const { page: pageStr } = req.query const { page: pageStr } = req.query
const page = Number(pageStr) const page = Number(pageStr)
const MAX_PAGES_TO_FETCH_FOR_TRY_UNTIL = 4
/**
* Similar to a "before" query param in cursor based pagination. We call
* it "try" because it is likely that this item lies beyond
* MAX_PAGES_TO_FETCH_FOR_TRY_UNTIL in which case we gracefully just send
* 2 pages and 205 response.
*/
const try_until = req.query
if (pageStr) {
const page = Number(pageStr)
if (!isARealUsableNumber(page)) { if (!isARealUsableNumber(page)) {
return res.status(400).json({ return res.status(400).json({
field: 'page', field: 'page',
@ -2064,6 +2078,31 @@ module.exports = async (
return res.status(200).json({ return res.status(200).json({
posts: await GunGetters.getFeedPage(page) posts: await GunGetters.getFeedPage(page)
}) })
} else if (try_until) {
const promises = range(1, MAX_PAGES_TO_FETCH_FOR_TRY_UNTIL).map(p =>
GunGetters.getFeedPage(p)
)
let results = await Promise.all(promises)
const idxIfFound = results.findIndex(pp =>
pp.some(p => p.id === try_until)
)
if (idxIfFound > -1) {
results = results.slice(0, idxIfFound)
}
const posts = flattenDeep(results)
return res.status(200).json({
posts
})
}
return res.status(400).json({
errorMessage: `Must provide at least a page or a try_until query param.`
})
} catch (err) { } catch (err) {
return res.status(500).json({ return res.status(500).json({
errorMessage: err.message || 'Unknown error inside /api/gun/follows/' errorMessage: err.message || 'Unknown error inside /api/gun/follows/'