2017-10-31 18:05:15 +01:00
|
|
|
const logger = require('winston');
|
2017-11-04 01:10:08 +01:00
|
|
|
const { returnShortId } = require('../helpers/sequelizeHelpers.js');
|
2017-11-01 00:23:11 +01:00
|
|
|
const NO_CHANNEL = 'NO_CHANNEL';
|
2017-10-31 18:05:15 +01:00
|
|
|
|
2017-11-08 16:25:21 +01:00
|
|
|
module.exports = (sequelize, { STRING, BOOLEAN, INTEGER, TEXT, DECIMAL }) => {
|
2017-08-21 22:27:13 +02:00
|
|
|
const Certificate = sequelize.define(
|
|
|
|
'Certificate',
|
|
|
|
{
|
|
|
|
address: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
amount: {
|
2017-11-08 16:25:21 +01:00
|
|
|
type : DECIMAL(19, 8),
|
2017-08-21 22:27:13 +02:00
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
claimId: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
claimSequence: {
|
|
|
|
type : INTEGER,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
decodedClaim: {
|
|
|
|
type : BOOLEAN,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
depth: {
|
|
|
|
type : INTEGER,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
effectiveAmount: {
|
2017-11-08 16:25:21 +01:00
|
|
|
type : DECIMAL(19, 8),
|
2017-08-21 22:27:13 +02:00
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
hasSignature: {
|
|
|
|
type : BOOLEAN,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
height: {
|
2017-11-08 00:42:48 +01:00
|
|
|
type : INTEGER,
|
2017-08-21 22:27:13 +02:00
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
hex: {
|
|
|
|
type : TEXT('long'),
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
name: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
nout: {
|
|
|
|
type : INTEGER,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
txid: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
validAtHeight: {
|
2017-11-08 00:42:48 +01:00
|
|
|
type : INTEGER,
|
2017-08-21 22:27:13 +02:00
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
outpoint: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
valueVersion: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
claimType: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
certificateVersion: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
keyType: {
|
|
|
|
type : STRING,
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
publicKey: {
|
|
|
|
type : TEXT('long'),
|
|
|
|
default: null,
|
|
|
|
},
|
|
|
|
},
|
|
|
|
{
|
|
|
|
freezeTableName: true,
|
|
|
|
}
|
|
|
|
);
|
2017-09-15 23:41:47 +02:00
|
|
|
|
|
|
|
Certificate.associate = db => {
|
2017-09-26 06:03:43 +02:00
|
|
|
Certificate.belongsTo(db.Channel, {
|
2017-09-15 23:41:47 +02:00
|
|
|
onDelete : 'cascade',
|
|
|
|
foreignKey: {
|
|
|
|
allowNull: true,
|
|
|
|
},
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-10-31 18:05:15 +01:00
|
|
|
Certificate.getShortChannelIdFromLongChannelId = function (longChannelId, channelName) {
|
|
|
|
logger.debug(`finding short channel id for ${channelName}:${longChannelId}`);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
this
|
|
|
|
.findAll({
|
|
|
|
where: {name: channelName},
|
|
|
|
order: [['height', 'ASC']],
|
|
|
|
})
|
|
|
|
.then(result => {
|
|
|
|
switch (result.length) {
|
|
|
|
case 0:
|
2017-11-14 23:52:20 +01:00
|
|
|
throw new Error('No channel(s) found with that channel name');
|
2017-10-31 18:05:15 +01:00
|
|
|
default:
|
2017-11-04 01:10:08 +01:00
|
|
|
return resolve(returnShortId(result, longChannelId));
|
2017-10-31 18:05:15 +01:00
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
reject(error);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-11-01 00:23:11 +01:00
|
|
|
Certificate.getLongChannelIdFromShortChannelId = function (channelName, channelId) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
this
|
|
|
|
.findAll({
|
|
|
|
where: {
|
|
|
|
name : channelName,
|
|
|
|
claimId: {
|
2017-11-09 03:55:47 +01:00
|
|
|
$like: `${channelId}%`,
|
2017-11-01 00:23:11 +01:00
|
|
|
},
|
|
|
|
},
|
2017-11-01 04:35:33 +01:00
|
|
|
order: [['height', 'ASC']],
|
2017-11-01 00:23:11 +01:00
|
|
|
})
|
|
|
|
.then(result => {
|
|
|
|
switch (result.length) {
|
|
|
|
case 0:
|
|
|
|
return resolve(NO_CHANNEL);
|
|
|
|
default: // note results must be sorted
|
|
|
|
return resolve(result[0].claimId);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
reject(error);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
|
|
|
Certificate.getLongChannelIdFromChannelName = function (channelName) {
|
|
|
|
logger.debug(`getLongChannelIdFromChannelName(${channelName})`);
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
this
|
|
|
|
.findAll({
|
|
|
|
where: { name: channelName },
|
|
|
|
order: [['effectiveAmount', 'DESC'], ['height', 'ASC']],
|
|
|
|
})
|
|
|
|
.then(result => {
|
|
|
|
switch (result.length) {
|
|
|
|
case 0:
|
|
|
|
return resolve(NO_CHANNEL);
|
|
|
|
default:
|
|
|
|
return resolve(result[0].claimId);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
reject(error);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-11-21 21:53:43 +01:00
|
|
|
Certificate.validateLongChannelId = function (name, claimId) {
|
|
|
|
return new Promise((resolve, reject) => {
|
|
|
|
this.findOne({
|
|
|
|
where: {name, claimId},
|
|
|
|
})
|
|
|
|
.then(result => {
|
|
|
|
switch (result.length) {
|
|
|
|
case 0:
|
|
|
|
return resolve(NO_CHANNEL);
|
|
|
|
case 1:
|
|
|
|
return resolve(result[0]);
|
|
|
|
default:
|
|
|
|
logger.warn(`more than one entry matches that name (${name}) and certificate Id (${claimId})`);
|
|
|
|
return resolve(result[0]);
|
|
|
|
}
|
|
|
|
})
|
|
|
|
.catch(error => {
|
|
|
|
reject(error);
|
|
|
|
});
|
|
|
|
});
|
|
|
|
};
|
|
|
|
|
2017-11-01 00:23:11 +01:00
|
|
|
Certificate.getLongChannelId = function (channelName, channelId) {
|
|
|
|
logger.debug(`getLongChannelId(${channelName}, ${channelId})`);
|
|
|
|
if (channelId && (channelId.length === 40)) { // if a full channel id is provided
|
2017-11-21 21:53:43 +01:00
|
|
|
return this.validateLongChannelId(channelName, channelId);
|
2017-11-01 00:23:11 +01:00
|
|
|
} else if (channelId && channelId.length < 40) { // if a short channel id is provided
|
|
|
|
return this.getLongChannelIdFromShortChannelId(channelName, channelId);
|
|
|
|
} else {
|
|
|
|
return this.getLongChannelIdFromChannelName(channelName); // if no channel id provided
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2017-08-21 22:27:13 +02:00
|
|
|
return Certificate;
|
|
|
|
};
|