Resolve channels #150
3 changed files with 132 additions and 36 deletions
|
@ -1,7 +1,7 @@
|
||||||
const lbryApi = require('../helpers/lbryApi.js');
|
const lbryApi = require('../helpers/lbryApi.js');
|
||||||
const db = require('../models');
|
const db = require('../models');
|
||||||
const logger = require('winston');
|
const logger = require('winston');
|
||||||
const { getTopFreeClaim, getFullClaimIdFromShortId, resolveAgainstClaimTable, getClaimIdByChannelId } = require('../helpers/serveHelpers.js');
|
const { getTopFreeClaim, getFullClaimIdFromShortId, resolveAgainstClaimTable, getClaimIdByChannel } = require('../helpers/serveHelpers.js');
|
||||||
|
|
||||||
I get a little confused sometimes on the line between controller and model responsibilities. But, yes, after looking at it and re-reading some MVC notes, I think that all the database related functions should go in the model. I rearranged as such. I get a little confused sometimes on the line between controller and model responsibilities. But, yes, after looking at it and re-reading some MVC notes, I think that all the database related functions should go in the model. I rearranged as such.
https://github.com/lbryio/spee.ch/commit/af046e9d3655a57bf9cd67d3a67a54d4d44ed802
|
|||||||
function checkForLocalAssetByClaimId (claimId, name) {
|
function checkForLocalAssetByClaimId (claimId, name) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
|
@ -82,21 +82,18 @@ function getAssetByClaimId (fullClaimId, name) {
|
||||||
}
|
}
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
getAssetByChannel (channelName, channelId, name) {
|
getAssetByChannel (channelName, channelId, claimName) {
|
||||||
if (channelId) {
|
logger.debug('channelId =', channelId);
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
getClaimIdByChannelId(channelId, name)
|
getClaimIdByChannel(channelName, channelId)
|
||||||
.then(claimId => {
|
.then(claimId => {
|
||||||
logger.debug('claim id = ', claimId);
|
logger.debug('claim id = ', claimId);
|
||||||
resolve(getAssetByClaimId(claimId, name));
|
resolve(getAssetByClaimId(claimId, claimName));
|
||||||
})
|
})
|
||||||
.catch(error => {
|
.catch(error => {
|
||||||
reject(error);
|
reject(error);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
} else {
|
});
|
||||||
return new Error('this is not supported yet');
|
|
||||||
}
|
|
||||||
},
|
},
|
||||||
getAssetByShortId: function (shortId, name) {
|
getAssetByShortId: function (shortId, name) {
|
||||||
logger.debug('...getting asset by short id...');
|
logger.debug('...getting asset by short id...');
|
||||||
|
@ -138,4 +135,10 @@ module.exports = {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
getChannelByName (name) {
|
||||||
|
logger.debug('...getting channel by channel name...');
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
reject(new Error('This feature is not yet supported'));
|
||||||
|
});
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -1,6 +1,101 @@
|
||||||
const logger = require('winston');
|
const logger = require('winston');
|
||||||
const db = require('../models');
|
const db = require('../models');
|
||||||
|
|
||||||
|
// function determineShortChannelId (name, longChannelId) {
|
||||||
|
// return new Promise((resolve, reject) => {
|
||||||
|
// logger.debug('finding short channel id');
|
||||||
|
// db.sequelize.query(`SELECT claimId, height FROM Certificate WHERE name = '${name}' ORDER BY height;`, { type: db.sequelize.QueryTypes.SELECT })
|
||||||
|
// .then(result => {
|
||||||
|
// switch (result.length) {
|
||||||
|
// case 0:
|
||||||
|
// return reject(new Error('That is an invalid channel name'));
|
||||||
|
// default:
|
||||||
|
// let certificateIndex;
|
||||||
|
// let shortId = longChannelId.substring(0, 1); // default sort id is the first letter
|
||||||
|
// let shortIdLength = 0;
|
||||||
|
// // find the index of this certificate
|
||||||
|
// certificateIndex = result.findIndex(element => {
|
||||||
|
// return element.claimId === longChannelId;
|
||||||
|
// });
|
||||||
|
// if (certificateIndex < 0) { throw new Error('claimid not found in possible sorted list') }
|
||||||
|
// // get an array of all certificates with lower height
|
||||||
|
// let possibleMatches = result.slice(0, certificateIndex);
|
||||||
|
// // remove certificates with the same prefixes until none are left.
|
||||||
|
// while (possibleMatches.length > 0) {
|
||||||
|
// shortIdLength += 1;
|
||||||
|
// shortId = longChannelId.substring(0, shortIdLength);
|
||||||
|
// possibleMatches = possibleMatches.filter(element => {
|
||||||
|
// return (element.claimId.substring(0, shortIdLength) === shortId);
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
// // return the short Id
|
||||||
|
// logger.debug('short claim id ===', shortId);
|
||||||
|
// return resolve(shortId);
|
||||||
|
// }
|
||||||
|
// })
|
||||||
|
// .catch(error => {
|
||||||
|
// reject(error);
|
||||||
|
// });
|
||||||
|
// });
|
||||||
|
// }
|
||||||
|
|
||||||
|
function getLongChannelId (channelName, channelId) {
|
||||||
|
if (channelId && (channelId.length === 40)) { // full channel id
|
||||||
|
return channelId;
|
||||||
|
} else if (channelId && channelId.length < 40) { // short channel id
|
||||||
|
return getLongChannelIdFromShortChannelId(channelName, channelId);
|
||||||
|
} else {
|
||||||
|
return getChannelIdFromChannelName(channelName);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
function getClaimIdByLongChannelId (channelId, name) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
logger.debug('finding claim id from channel id and claim name');
|
||||||
|
db.sequelize.query(`SELECT claimId FROM Claim WHERE name = '${name}' AND certificateId = '${channelId}' LIMIT 1;`, { type: db.sequelize.QueryTypes.SELECT })
|
||||||
|
.then(result => {
|
||||||
|
switch (result.length) {
|
||||||
|
case 0:
|
||||||
|
return reject(new Error('There is no such claim for that channel'));
|
||||||
|
default:
|
||||||
|
return resolve(result[0].claimId);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getLongChannelIdFromShortChannelId (channelName, channelId) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
logger.debug(`finding long channel id for ${channelName}:${channelId}`);
|
||||||
|
// get the long channel Id
|
||||||
|
db.sequelize.query(`SELECT claimId, height FROM Certificate WHERE name = '${channelName}' AND claimId LIKE '${channelId}%' ORDER BY height ASC LIMIT 1;`, { type: db.sequelize.QueryTypes.SELECT })
|
||||||
|
.then(result => {
|
||||||
|
logger.debug('result >>', result);
|
||||||
|
switch (result.length) {
|
||||||
|
case 0:
|
||||||
|
throw new Error('That is an invalid Short Channel Id');
|
||||||
|
default: // note results must be sorted
|
||||||
|
return (result[0].claimId);
|
||||||
|
}
|
||||||
|
})
|
||||||
|
// return the long channel id
|
||||||
|
.then(longChannelId => {
|
||||||
|
logger.debug('channelId =', longChannelId);
|
||||||
|
return resolve(longChannelId);
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function getChannelIdFromChannelName (channelName, claimName) {
|
||||||
|
// select the top top channel id
|
||||||
|
}
|
||||||
|
|
||||||
function determineShortClaimId (claimId, height, claimList) {
|
function determineShortClaimId (claimId, height, claimList) {
|
||||||
logger.debug('determining short url based on claim id and claim list');
|
logger.debug('determining short url based on claim id and claim list');
|
||||||
logger.debug('claimlist starting length:', claimList.length);
|
logger.debug('claimlist starting length:', claimList.length);
|
||||||
|
@ -98,7 +193,7 @@ module.exports = {
|
||||||
.then(result => {
|
.then(result => {
|
||||||
switch (result.length) {
|
switch (result.length) {
|
||||||
case 0:
|
case 0:
|
||||||
return reject(new Error('That is an invalid Short Id'));
|
return reject(new Error('That is an invalid Short Claim Id'));
|
||||||
default: // note results must be sorted
|
default: // note results must be sorted
|
||||||
return resolve(result[0].claimId);
|
return resolve(result[0].claimId);
|
||||||
}
|
}
|
||||||
|
@ -115,7 +210,7 @@ module.exports = {
|
||||||
.then(result => {
|
.then(result => {
|
||||||
switch (result.length) {
|
switch (result.length) {
|
||||||
case 0:
|
case 0:
|
||||||
return reject(new Error('That is an invalid Claim Id'));
|
return reject(new Error('That is an invalid claim name'));
|
||||||
default: // note results must be sorted
|
default: // note results must be sorted
|
||||||
const shortId = determineShortClaimId(claimId, height, result);
|
const shortId = determineShortClaimId(claimId, height, result);
|
||||||
logger.debug('short claim id ===', shortId);
|
logger.debug('short claim id ===', shortId);
|
||||||
|
@ -127,24 +222,6 @@ module.exports = {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
getClaimIdByChannelId (channelId, name) {
|
|
||||||
return new Promise((resolve, reject) => {
|
|
||||||
logger.debug('finding claim id from channel id');
|
|
||||||
db.sequelize.query(`SELECT claimId FROM Claim WHERE name = '${name}' AND certificateId = '${channelId}' LIMIT 1;`, { type: db.sequelize.QueryTypes.SELECT })
|
|
||||||
.then(result => {
|
|
||||||
switch (result.length) {
|
|
||||||
case 0:
|
|
||||||
return reject(new Error('That is an invalid Channel Id'));
|
|
||||||
default: // note results must be sorted
|
|
||||||
logger.debug('found result', result);
|
|
||||||
return resolve(result[0].claimId);
|
|
||||||
}
|
|
||||||
})
|
|
||||||
.catch(error => {
|
|
||||||
reject(error);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
},
|
|
||||||
getAllFreeClaims (name) {
|
getAllFreeClaims (name) {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
db.sequelize.query(`SELECT * FROM Claim WHERE name = '${name}' ORDER BY amount DESC, height ASC`, { type: db.sequelize.QueryTypes.SELECT })
|
db.sequelize.query(`SELECT * FROM Claim WHERE name = '${name}' ORDER BY amount DESC, height ASC`, { type: db.sequelize.QueryTypes.SELECT })
|
||||||
|
@ -195,4 +272,20 @@ module.exports = {
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
},
|
},
|
||||||
|
getClaimIdByChannel (channelName, channelId, claimName) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
// 1. get the long channel id
|
||||||
|
getLongChannelId(channelName, channelId)
|
||||||
|
// 2. get the claim Id
|
||||||
|
.then(longChannelId => {
|
||||||
|
return getClaimIdByLongChannelId(longChannelId, claimName);
|
||||||
|
})
|
||||||
|
.then(claimId => {
|
||||||
|
return resolve(claimId);
|
||||||
|
})
|
||||||
|
.catch(error => {
|
||||||
|
reject(error);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -124,13 +124,13 @@ module.exports = (app) => {
|
||||||
// parse identifier for whether it is a channel, short url, or claim_id
|
// parse identifier for whether it is a channel, short url, or claim_id
|
||||||
if (identifier.charAt(0) === '@') {
|
if (identifier.charAt(0) === '@') {
|
||||||
channelName = identifier;
|
channelName = identifier;
|
||||||
logger.debug('channel name =', channelName);
|
|
||||||
claimType = CHANNEL;
|
claimType = CHANNEL;
|
||||||
const channelIdIndex = channelName.indexOf(CHANNELID_INDICATOR);
|
const channelIdIndex = channelName.indexOf(CHANNELID_INDICATOR);
|
||||||
if (channelIdIndex !== -1) {
|
if (channelIdIndex !== -1) {
|
||||||
channelId = channelName.substring(channelIdIndex + 1);
|
channelId = channelName.substring(channelIdIndex + 1);
|
||||||
channelName = channelName.substring(0, channelIdIndex);
|
channelName = channelName.substring(0, channelIdIndex);
|
||||||
}
|
}
|
||||||
|
logger.debug('channel name =', channelName);
|
||||||
} else if (identifier.length === 40) {
|
} else if (identifier.length === 40) {
|
||||||
fullClaimId = identifier;
|
fullClaimId = identifier;
|
||||||
logger.debug('full claim id =', fullClaimId);
|
logger.debug('full claim id =', fullClaimId);
|
||||||
|
|
Loading…
Reference in a new issue
This looks like it could use better organization. I'd be inclined to put a lot of these inside of the
modal
folder, but I'd suggest looking at what other conventions are used in this framework before doing that.