From 4981551c5970c9eb03ea9d4c48b333f05a5bad2b Mon Sep 17 00:00:00 2001 From: bill bittner Date: Tue, 15 Aug 2017 15:35:03 -0700 Subject: [PATCH] replaced getAllFreePublicClaims with calls to Claim table --- controllers/serveController.js | 12 +- controllers/statsController.js | 17 ++- helpers/functions/getAllFreePublicClaims.js | 61 ---------- helpers/serveHelpers.js | 117 +++++++++----------- routes/page-routes.js | 10 +- 5 files changed, 72 insertions(+), 145 deletions(-) delete mode 100644 helpers/functions/getAllFreePublicClaims.js diff --git a/controllers/serveController.js b/controllers/serveController.js index 40a24467..983043fa 100644 --- a/controllers/serveController.js +++ b/controllers/serveController.js @@ -1,9 +1,8 @@ const lbryApi = require('../helpers/lbryApi.js'); const db = require('../models'); const logger = require('winston'); -const getAllFreePublicClaims = require('../helpers/functions/getAllFreePublicClaims.js'); const isFreeClaim = require('../helpers/functions/isFreeClaim.js'); -const serveHelpers = require('../helpers/serveHelpers.js'); +const { getTopFreeClaim, getFullClaimIdFromShortId } = require('../helpers/serveHelpers.js'); function checkForLocalAssetByClaimId (claimId, name) { return new Promise((resolve, reject) => { @@ -94,7 +93,7 @@ module.exports = { getAssetByShortId: function (shortId, name) { return new Promise((resolve, reject) => { // get the full claimId - serveHelpers.getFullClaimIdFromShortId(shortId, name) + getFullClaimIdFromShortId(shortId, name) // get the asset by the claimId .then(claimId => { resolve(getAssetByClaimId(claimId, name)); @@ -110,16 +109,15 @@ module.exports = { getAssetByName (name) { return new Promise((resolve, reject) => { // 1. get a list of the free public claims - getAllFreePublicClaims(name) + getTopFreeClaim(name) // 2. check locally for the top claim .then(freePublicClaimList => { // if no claims were found, return null if (!freePublicClaimList) { - resolve(null); - return; + return resolve(null); } // parse the result - const claimId = freePublicClaimList[0].claim_id; + const claimId = freePublicClaimList[0].claimId; // get the asset resolve(getAssetByClaimId(claimId, name)); }) diff --git a/controllers/statsController.js b/controllers/statsController.js index 65e5a91c..0b6d7666 100644 --- a/controllers/statsController.js +++ b/controllers/statsController.js @@ -146,15 +146,14 @@ module.exports = { const dateTime = startDate.toISOString().slice(0, 19).replace('T', ' '); return new Promise((resolve, reject) => { // get the raw requests data - db.sequelize - .query(`SELECT COUNT(*), File.* FROM Request LEFT JOIN File ON Request.FileId = File.id WHERE FileId IS NOT NULL AND nsfw != 1 AND trendingEligible = 1 AND Request.createdAt > "${dateTime}" GROUP BY FileId ORDER BY COUNT(*) DESC LIMIT 25;`, { type: db.sequelize.QueryTypes.SELECT }) - .then(results => { - resolve(results); - }) - .catch(error => { - logger.error('sequelize error', error); - reject(error); - }); + db.sequelize.query(`SELECT COUNT(*), File.* FROM Request LEFT JOIN File ON Request.FileId = File.id WHERE FileId IS NOT NULL AND nsfw != 1 AND trendingEligible = 1 AND Request.createdAt > "${dateTime}" GROUP BY FileId ORDER BY COUNT(*) DESC LIMIT 25;`, { type: db.sequelize.QueryTypes.SELECT }) + .then(results => { + resolve(results); + }) + .catch(error => { + logger.error('sequelize error', error); + reject(error); + }); }); }, }; diff --git a/helpers/functions/getAllFreePublicClaims.js b/helpers/functions/getAllFreePublicClaims.js deleted file mode 100644 index b886c477..00000000 --- a/helpers/functions/getAllFreePublicClaims.js +++ /dev/null @@ -1,61 +0,0 @@ -const isFreeClaim = require('./isFreeClaim.js'); -const lbryApi = require('../lbryApi.js'); -const logger = require('winston'); - -function filterForFreePublicClaims (claimsListArray) { - logger.debug('filtering claims list for free, public claims'); - if (!claimsListArray) { - return null; - } - const freePublicClaims = claimsListArray.filter(claim => { - if (!claim.value) { - return false; - } - return isFreeClaim(claim); - }); - return freePublicClaims; -} - -function orderClaims (claimsListArray) { - logger.debug('ordering the free public claims'); - claimsListArray.sort((a, b) => { - if (a.amount === b.amount) { - return a.height < b.height; - } else { - return a.amount < b.amount; - } - }); - return claimsListArray; -} - -module.exports = (claimName) => { - return new Promise((resolve, reject) => { - // make a call to the daemon to get the claims list - lbryApi - .getClaimList(claimName) - .then(({ claims }) => { - logger.debug(`Number of claims: ${claims.length}`); - // return early if no claims were found - if (claims.length === 0) { - logger.debug('exiting due to lack of claims'); - resolve(null); - return; - } - // filter the claims to return only free, public claims - const freePublicClaims = filterForFreePublicClaims(claims); - // return early if no free, public claims were found - if (!freePublicClaims || freePublicClaims.length === 0) { - logger.debug('exiting due to lack of free or public claims'); - resolve(null); - return; - } - // order the claims - const orderedPublicClaims = orderClaims(freePublicClaims); - // resolve the promise - resolve(orderedPublicClaims); - }) - .catch(error => { - reject(error); - }); - }); -}; diff --git a/helpers/serveHelpers.js b/helpers/serveHelpers.js index d737bc9c..25fb0e58 100644 --- a/helpers/serveHelpers.js +++ b/helpers/serveHelpers.js @@ -1,13 +1,12 @@ const logger = require('winston'); const db = require('../models'); -const lbryApi = require('./lbryApi'); function determineShortClaimId (claimId, height, claimList) { logger.debug('determining short url based on claim id and claim list'); logger.debug('claimlist starting length:', claimList.length); // remove this claim from the claim list, if it exists claimList = claimList.filter(claim => { - return claim.claim_id !== claimId; + return claim.claimId !== claimId; }); logger.debug('claim list length without this claim:', claimList.length); // If there are no other claims, return the first letter of the claim id... @@ -21,7 +20,7 @@ function determineShortClaimId (claimId, height, claimList) { while (claimList.length !== 0) { i++; claimList = claimList.filter(claim => { - const otherClaimIdSegmentToCompare = claim.claim_id.substring(0, i); + const otherClaimIdSegmentToCompare = claim.claimId.substring(0, i); const thisClaimIdSegmentToCompare = claimId.substring(0, i); logger.debug('compare:', otherClaimIdSegmentToCompare, '===', thisClaimIdSegmentToCompare, '?'); return (otherClaimIdSegmentToCompare === thisClaimIdSegmentToCompare); @@ -35,7 +34,7 @@ function determineShortClaimId (claimId, height, claimList) { return claimId.substring(0, 1); } const allMatchingClaimsAtLastMatch = claimListCopy.filter(claim => { - return (claim.claim_id.substring(0, lastMatchIndex) === lastMatch); + return (claim.claimId.substring(0, lastMatchIndex) === lastMatch); }); // for those that share the longest shared prefix: see which came first in time. whichever is earliest, the others take the extra character const sortedMatchingClaims = allMatchingClaimsAtLastMatch.sort((a, b) => { @@ -49,29 +48,6 @@ function determineShortClaimId (claimId, height, claimList) { } } -function checkLocalDbForClaims (name, shortId) { - return db.File - .findAll({ - where: { - name, - claimId: { $like: `${shortId}%` }, - }, - }) - .then(records => { - logger.debug('number of local search results:', records.length); - if (records.length === 0) { - return records; - } - const localClaims = records.map(record => { // format the data to match what lbry daemon would have returned - return { name: record.dataValues.name, claim_id: record.dataValues.claimId, height: record.dataValues.height }; - }); - return localClaims; - }) - .catch(error => { - return error; - }); -} - function createOpenGraphInfo ({ fileType, claimId, name, fileName, fileExt }) { return { embedUrl : `https://spee.ch/embed/${claimId}/${name}`, @@ -118,36 +94,13 @@ module.exports = { return new Promise((resolve, reject) => { logger.debug('getting claim_id from short url'); // use the daemon to check for claims list - lbryApi.getClaimList(name) - .then(({ claims }) => { - logger.debug('Number of claims from getClaimList:', claims.length); - // if no claims were found, check locally for possible claims - if (claims.length === 0) { - return checkLocalDbForClaims(name, shortId); - } else { - return claims; - } - }) - // handle the claims list - .then(claims => { - logger.debug('Claims ready for filtering'); - const regex = new RegExp(`^${shortId}`); - const filteredClaimsList = claims.filter(claim => { - return regex.test(claim.claim_id); - }); - switch (filteredClaimsList.length) { + db.sequelize.query(`SELECT claimId FROM Claim WHERE name = '${name}' AND claimId LIKE '${shortId}%' ORDER BY height ASC LIMIT 1;`) + .then(result => { + switch (result.length) { case 0: - reject(new Error('That is an invalid short url')); - break; - case 1: - resolve(filteredClaimsList[0].claim_id); - break; - default: - const sortedClaimsList = filteredClaimsList.sort((a, b) => { - return a.height > b.height; - }); - resolve(sortedClaimsList[0].claim_id); - break; + return reject(new Error('That is an invalid Short Id')); + default: // note results must be sorted + return resolve(result[0].datavalues.claimId); } }) .catch(error => { @@ -158,13 +111,51 @@ module.exports = { getShortIdFromClaimId (claimId, height, name) { return new Promise((resolve, reject) => { logger.debug('finding short claim id from full claim id'); - // get a list of all the claims - lbryApi.getClaimList(name) - // find the smallest possible unique url for this claim - .then(({ claims }) => { - const shortId = determineShortClaimId(claimId, height, claims); - logger.debug('short claim id ===', shortId); - resolve(shortId); + db.sequelize.query(`SELECT claimId, height FROM Claim WHERE name = '${name}' ORDER BY claimId;`) + .then(result => { + switch (result.length) { + case 0: + return reject(new Error('That is an invalid Claim Id')); + default: // note results must be sorted + const resultsArray = result.map(claim => { + return claim.dataValues; + }); + const shortId = determineShortClaimId(claimId, height, resultsArray); + logger.debug('short claim id ===', shortId); + return resolve(shortId); + } + }) + .catch(error => { + reject(error); + }); + }); + }, + getAllFreeClaims (claimName) { + return new Promise((resolve, reject) => { + db.sequelize.query(`SELECT * FROM Claim WHERE name = '${claimName}' ORDER BY amount DESC, height ASC`) + .then(result => { + if (result.length === 0) { + logger.debug('exiting due to lack of claims'); + return resolve(null); + } + const claims = result.map(claim => { + return claim.dataValues; + }); + return resolve(claims); + }) + .catch(error => { + reject(error); + }); + }); + }, + getTopFreeClaim (claimName) { + return new Promise((resolve, reject) => { + db.sequelize.query(`SELECT * FROM Claim WHERE name = '${claimName}' ORDER BY amount DESC, height ASC LIMIT 1`) + .then(result => { + if (result.length === 0) { + return resolve(null); + } + return resolve(result[0].dataValues); }) .catch(error => { reject(error); diff --git a/routes/page-routes.js b/routes/page-routes.js index c0f63720..c94b1472 100644 --- a/routes/page-routes.js +++ b/routes/page-routes.js @@ -1,5 +1,5 @@ const errorHandlers = require('../helpers/errorHandlers.js'); -const getAllFreePublicClaims = require('../helpers/functions/getAllFreePublicClaims.js'); +const { getAllFreeClaims } = require('../helpers/serveHelpers.js'); const { postToStats, getStatsSummary, getTrendingClaims } = require('../controllers/statsController.js'); module.exports = (app) => { @@ -48,14 +48,14 @@ module.exports = (app) => { // route to display all free public claims at a given name app.get('/:name/all', ({ ip, originalUrl, params }, res) => { // get and render the content - getAllFreePublicClaims(params.name) - .then(orderedFreePublicClaims => { - if (!orderedFreePublicClaims) { + getAllFreeClaims(params.name) + .then(orderedFreeClaims => { + if (!orderedFreeClaims) { res.status(307).render('noClaims'); return; } postToStats('show', originalUrl, ip, null, null, 'success'); - res.status(200).render('allClaims', { claims: orderedFreePublicClaims }); + res.status(200).render('allClaims', { claims: orderedFreeClaims }); }) .catch(error => { errorHandlers.handleRequestError('show', originalUrl, ip, error, res);