Development #287
3 changed files with 85 additions and 88 deletions
|
@ -1,5 +1,6 @@
|
|||
const db = require('../models');
|
||||
const logger = require('winston');
|
||||
const { returnPaginatedChannelViewData } = require('../helpers/channelPagination.js');
|
||||
|
||||
const NO_CHANNEL = 'NO_CHANNEL';
|
||||
const NO_CLAIM = 'NO_CLAIM';
|
||||
|
@ -52,7 +53,7 @@ module.exports = {
|
|||
});
|
||||
});
|
||||
},
|
||||
getChannelInfoAndClaims (channelName, channelClaimId) {
|
||||
getChannelViewData (channelName, channelClaimId, query) {
|
||||
return new Promise((resolve, reject) => {
|
||||
// 1. get the long channel Id (make sure channel exists)
|
||||
db.Certificate.getLongChannelId(channelName, channelClaimId)
|
||||
|
@ -67,8 +68,10 @@ module.exports = {
|
|||
if (!longChannelClaimId) {
|
||||
return resolve(NO_CHANNEL);
|
||||
}
|
||||
// 3. return all the channel information and contents
|
||||
resolve({ channelName, longChannelClaimId, shortChannelClaimId, claims: channelClaimsArray });
|
||||
// 3. format the data for the view, including pagination
|
||||
let paginatedChannelViewData = returnPaginatedChannelViewData(channelName, longChannelClaimId, shortChannelClaimId, channelClaimsArray, query);
|
||||
// 4. return all the channel information and contents
|
||||
resolve(paginatedChannelViewData);
|
||||
})
|
||||
.catch(error => {
|
||||
reject(error);
|
||||
|
|
71
helpers/channelPagination.js
Normal file
71
helpers/channelPagination.js
Normal file
|
@ -0,0 +1,71 @@
|
|||
const CLAIMS_PER_PAGE = 10;
|
||||
|
||||
module.exports = {
|
||||
returnPaginatedChannelViewData (channelName, longChannelClaimId, shortChannelClaimId, claims, query) {
|
||||
const totalPages = module.exports.determineTotalPages(claims);
|
||||
const paginationPage = module.exports.getPageFromQuery(query);
|
||||
const viewData = {
|
||||
channelName : channelName,
|
||||
longChannelClaimId : longChannelClaimId,
|
||||
shortChannelClaimId: shortChannelClaimId,
|
||||
claims : module.exports.extractPageFromClaims(claims, paginationPage),
|
||||
previousPage : module.exports.determinePreviousPage(paginationPage),
|
||||
currentPage : paginationPage,
|
||||
nextPage : module.exports.determineNextPage(totalPages, paginationPage),
|
||||
totalPages : totalPages,
|
||||
totalResults : module.exports.determineTotalClaims(claims),
|
||||
};
|
||||
return viewData;
|
||||
},
|
||||
getPageFromQuery (query) {
|
||||
if (query.p) {
|
||||
return parseInt(query.p);
|
||||
}
|
||||
return 1;
|
||||
},
|
||||
extractPageFromClaims (claims, pageNumber) {
|
||||
if (!claims) {
|
||||
return []; // if no claims, return this default
|
||||
}
|
||||
// logger.debug('claims is array?', Array.isArray(claims));
|
||||
// logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));
|
||||
const claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;
|
||||
const claimEndIndex = claimStartIndex + 10;
|
||||
const pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);
|
||||
return pageOfClaims;
|
||||
},
|
||||
determineTotalPages (claims) {
|
||||
if (!claims) {
|
||||
return 0;
|
||||
} else {
|
||||
const totalClaims = claims.length;
|
||||
if (totalClaims < CLAIMS_PER_PAGE) {
|
||||
return 1;
|
||||
}
|
||||
const fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);
|
||||
const remainder = totalClaims % CLAIMS_PER_PAGE;
|
||||
if (remainder === 0) {
|
||||
return fullPages;
|
||||
}
|
||||
return fullPages + 1;
|
||||
}
|
||||
},
|
||||
determinePreviousPage (currentPage) {
|
||||
if (currentPage === 1) {
|
||||
return null;
|
||||
}
|
||||
return currentPage - 1;
|
||||
},
|
||||
determineNextPage (totalPages, currentPage) {
|
||||
if (currentPage === totalPages) {
|
||||
return null;
|
||||
}
|
||||
return currentPage + 1;
|
||||
},
|
||||
determineTotalClaims (claims) {
|
||||
if (!claims) {
|
||||
return 0;
|
||||
}
|
||||
return claims.length;
|
||||
},
|
||||
};
|
|
@ -1,5 +1,5 @@
|
|||
const logger = require('winston');
|
||||
const { getClaimId, getChannelInfoAndClaims, getLocalFileRecord } = require('../controllers/serveController.js');
|
||||
const { getClaimId, getChannelViewData, getLocalFileRecord } = require('../controllers/serveController.js');
|
||||
const serveHelpers = require('../helpers/serveHelpers.js');
|
||||
const { handleRequestError } = require('../helpers/errorHandlers.js');
|
||||
const { postToStats } = require('../controllers/statsController.js');
|
||||
|
@ -9,7 +9,6 @@ const lbryUri = require('../helpers/lbryUri.js');
|
|||
const SERVE = 'SERVE';
|
||||
const SHOW = 'SHOW';
|
||||
const SHOWLITE = 'SHOWLITE';
|
||||
const CLAIMS_PER_PAGE = 10;
|
||||
const NO_CHANNEL = 'NO_CHANNEL';
|
||||
const NO_CLAIM = 'NO_CLAIM';
|
||||
const NO_FILE = 'NO_FILE';
|
||||
|
@ -26,95 +25,19 @@ function isValidShortIdOrClaimId (input) {
|
|||
return (isValidClaimId(input) || isValidShortId(input));
|
||||
}
|
||||
|
||||
function getPage (query) {
|
||||
if (query.p) {
|
||||
return parseInt(query.p);
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
function extractPageFromClaims (claims, pageNumber) {
|
||||
if (!claims) {
|
||||
return []; // if no claims, return this default
|
||||
}
|
||||
logger.debug('claims is array?', Array.isArray(claims));
|
||||
logger.debug(`pageNumber ${pageNumber} is number?`, Number.isInteger(pageNumber));
|
||||
const claimStartIndex = (pageNumber - 1) * CLAIMS_PER_PAGE;
|
||||
const claimEndIndex = claimStartIndex + 10;
|
||||
const pageOfClaims = claims.slice(claimStartIndex, claimEndIndex);
|
||||
return pageOfClaims;
|
||||
}
|
||||
|
||||
function determineTotalPages (claims) {
|
||||
if (!claims) {
|
||||
return 0;
|
||||
} else {
|
||||
const totalClaims = claims.length;
|
||||
if (totalClaims < CLAIMS_PER_PAGE) {
|
||||
return 1;
|
||||
}
|
||||
const fullPages = Math.floor(totalClaims / CLAIMS_PER_PAGE);
|
||||
const remainder = totalClaims % CLAIMS_PER_PAGE;
|
||||
if (remainder === 0) {
|
||||
return fullPages;
|
||||
}
|
||||
return fullPages + 1;
|
||||
}
|
||||
}
|
||||
|
||||
function determinePreviousPage (currentPage) {
|
||||
if (currentPage === 1) {
|
||||
return null;
|
||||
}
|
||||
return currentPage - 1;
|
||||
}
|
||||
|
||||
function determineNextPage (totalPages, currentPage) {
|
||||
if (currentPage === totalPages) {
|
||||
return null;
|
||||
}
|
||||
return currentPage + 1;
|
||||
}
|
||||
|
||||
function determineTotalClaims (result) {
|
||||
if (!result.claims) {
|
||||
return 0;
|
||||
}
|
||||
return result.claims.length;
|
||||
}
|
||||
|
||||
function returnOptionsForChannelPageRendering (result, query) {
|
||||
const totalPages = determineTotalPages(result.claims);
|
||||
const paginationPage = getPage(query);
|
||||
const options = {
|
||||
layout : 'channel',
|
||||
channelName : result.channelName,
|
||||
longChannelClaimId : result.longChannelClaimId,
|
||||
shortChannelClaimId: result.shortChannelClaimId,
|
||||
claims : extractPageFromClaims(result.claims, paginationPage),
|
||||
previousPage : determinePreviousPage(paginationPage),
|
||||
currentPage : paginationPage,
|
||||
nextPage : determineNextPage(totalPages, paginationPage),
|
||||
totalPages : totalPages,
|
||||
totalResults : determineTotalClaims(result),
|
||||
};
|
||||
return options;
|
||||
}
|
||||
|
||||
function sendChannelInfoAndContentToClient (channelInfoAndClaims, query, res) {
|
||||
if (channelInfoAndClaims === NO_CHANNEL) { // (a) no channel found
|
||||
function sendChannelInfoAndContentToClient (channelPageData, res) {
|
||||
if (channelPageData === NO_CHANNEL) {
|
||||
res.status(200).render('noChannel');
|
||||
} else { // (b) channel found
|
||||
const options = returnOptionsForChannelPageRendering(channelInfoAndClaims, query);
|
||||
res.status(200).render('channel', options);
|
||||
} else {
|
||||
res.status(200).render('channel', channelPageData);
|
||||
}
|
||||
}
|
||||
|
||||
function showChannelPageToClient (channelName, channelClaimId, originalUrl, ip, query, res) {
|
||||
// 1. retrieve the channel contents
|
||||
getChannelInfoAndClaims(channelName, channelClaimId)
|
||||
.then(channelInfoAndClaims => {
|
||||
sendChannelInfoAndContentToClient(channelInfoAndClaims, query, res);
|
||||
getChannelViewData(channelName, channelClaimId, query)
|
||||
.then(channelViewData => {
|
||||
sendChannelInfoAndContentToClient(channelViewData, res);
|
||||
})
|
||||
.catch(error => {
|
||||
handleRequestError(originalUrl, ip, error, res);
|
||||
|
|
Loading…
Reference in a new issue