All files / lib pagination.js

17.78% Statements 8/45
0% Branches 0/30
0% Functions 0/4
19.05% Lines 8/42
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82  1x   1x 1x   1x                     1x           1x                   1x   1x                                                                                            
'use strict'
const pagination = module.exports = { }
 
const ourJoi = require('./ourJoi.js')
const url = require('url')
 
pagination.joiPageDefinition = {
  page: ourJoi.Joi.object().keys({
    offset: ourJoi.Joi.number()
      .description('The first record to appear in the resulting payload')
      .example(0),
    limit: ourJoi.Joi.number()
      .description('The number of records to appear in the resulting payload')
      .example(50)
  })
}
 
pagination.generateMetaSummary = (request, handlerTotal) => ({
  offset: request.params.page && request.params.page.offset,
  limit: request.params.page && request.params.page.limit,
  total: handlerTotal
})
 
pagination.validatePaginationParams = request => {
  if (!request.params.page) {
    request.params.page = { }
  }
  const page = request.params.page
 
  page.offset = parseInt(page.offset, 10) || 0
  page.limit = parseInt(page.limit, 10) || 50
}
 
pagination.enforcePagination = (request, results) => results.slice(0, request.params.page.size)
 
pagination.generatePageLinks = (request, handlerTotal) => {
  const pageData = request.params.page
  if (!handlerTotal || !pageData) {
    return { }
  }
 
  const lowerLimit = pageData.offset
  const upperLimit = pageData.offset + pageData.limit
 
  if ((lowerLimit === 0) && (upperLimit > handlerTotal)) {
    return { }
  }
 
  const pageLinks = { }
  const theirRequest = url.parse(request.route.combined, true)
  theirRequest.search = null
 
  if (lowerLimit > 0) {
    theirRequest.query['page[offset]'] = 0
    pageLinks.first = url.format(theirRequest)
 
    if (pageData.offset > 0) {
      let previousPageOffset = pageData.offset - pageData.limit
      if (previousPageOffset < 0) {
        previousPageOffset = 0
      }
      theirRequest.query['page[offset]'] = previousPageOffset
      pageLinks.prev = url.format(theirRequest)
    }
  }
 
  if (upperLimit < handlerTotal) {
    let lastPage = (Math.floor(handlerTotal / pageData.limit) * pageData.limit)
    if (lastPage === handlerTotal) lastPage -= pageData.limit
    theirRequest.query['page[offset]'] = lastPage
    pageLinks.last = url.format(theirRequest)
 
    if ((pageData.offset + pageData.limit) < handlerTotal) {
      const nextPageOffset = pageData.offset + pageData.limit
      theirRequest.query['page[offset]'] = nextPageOffset
      pageLinks.next = url.format(theirRequest)
    }
  }
 
  return pageLinks
}