@rsksmart/rif-storage-pinning
Version:
Application for providing your storage space to other to use in exchange of RIF Tokens
158 lines (157 loc) • 7.46 kB
JavaScript
;
var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, P, generator) {
function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }
return new (P || (P = Promise))(function (resolve, reject) {
function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }
function rejected(value) { try { step(generator["throw"](value)); } catch (e) { reject(e); } }
function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }
step((generator = generator.apply(thisArg, _arguments || [])).next());
});
};
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
const config_1 = __importDefault(require("config"));
const path_1 = __importDefault(require("path"));
const command_1 = require("@oclif/command");
const sequelize_1 = require("sequelize");
const log_symbols_1 = __importDefault(require("log-symbols"));
const cli_table3_1 = __importDefault(require("cli-table3"));
const safe_1 = __importDefault(require("colors/safe"));
const utils_1 = __importDefault(require("../utils"));
const agreement_model_1 = __importDefault(require("../models/agreement.model"));
const job_model_1 = __importDefault(require("../models/job.model"));
const definitions_1 = require("../definitions");
var FilterStatus;
(function (FilterStatus) {
FilterStatus["active"] = "active";
FilterStatus["inactive"] = "inactive ";
})(FilterStatus || (FilterStatus = {}));
const statusFilter = (agreement, status) => !status ||
(status === FilterStatus.active && agreement.isActive) ||
(status === FilterStatus.inactive && !agreement.isActive);
const pinningStatusFilter = (job, pinningStatuses) => !pinningStatuses ||
pinningStatuses.includes(job.state);
class AgreementsCommand extends utils_1.default {
constructor(argv, config) {
super(argv, config, { db: { migrate: true } });
}
baseConfig(flags) {
super.baseConfig(flags);
const { userConfig, configObject } = this.configuration;
config_1.default.util.extendDeep(config_1.default, userConfig);
config_1.default.util.extendDeep(config_1.default, configObject);
if (flags.network) {
const networkConfigPath = path_1.default.join(__dirname, '..', '..', 'config', `${flags.network}.json5`);
config_1.default.util.extendDeep(config_1.default, config_1.default.util.parseFile(networkConfigPath));
}
}
static getStatus(agreement) {
return agreement.isActive ? log_symbols_1.default.success : log_symbols_1.default.error;
}
static getJobInfo(agreement) {
const [latestJob] = agreement.jobs;
if (!latestJob)
return '';
switch (latestJob.state) {
case definitions_1.JobState.ERRORED:
return safe_1.default.red(`ERRORED(retries: ${latestJob.retry}) - ${latestJob.errorMessage}`);
case definitions_1.JobState.FINISHED:
return safe_1.default.green(latestJob.state.toUpperCase());
case definitions_1.JobState.CREATED:
case definitions_1.JobState.BACKOFF:
case definitions_1.JobState.RUNNING:
return safe_1.default.yellow(latestJob.state.toUpperCase());
default:
return latestJob.state.toUpperCase();
}
}
static expireIn(agreement) {
const expired = agreement.expiresIn;
if (expired.gt(0) && expired.lt(agreement.billingPeriod.div(60).times(2))) {
return safe_1.default.yellow(`${expired.toString()} min`);
}
return expired.gt(0)
? safe_1.default.green(`${expired.toString()} min`)
: safe_1.default.red('EXPIRED');
}
static prepareAgreementForTable(agreement) {
return [
AgreementsCommand.getStatus(agreement),
`${agreement.agreementReference} ${agreement.dataReference}`,
AgreementsCommand.expireIn(agreement),
AgreementsCommand.getJobInfo(agreement)
];
}
static filterAgreement(agreement, filters) {
const { status, pinningStatus } = filters;
const [latestJob] = agreement.jobs;
return statusFilter(agreement, status) && pinningStatusFilter(latestJob, pinningStatus)
? [agreement]
: [];
}
queryAgreement(filters = {}) {
return __awaiter(this, void 0, void 0, function* () {
const agreements = yield agreement_model_1.default.findAll();
const jobs = yield job_model_1.default.findAll({
raw: true,
order: [['finish', 'DESC']],
where: { name: { [sequelize_1.Op.in]: agreements.map(a => a.dataReference) } }
});
return agreements.reduce((acc, agreement) => {
agreement = Object.assign(agreement, {
jobs: jobs.filter(j => j.name === agreement.dataReference) || [],
isActive: agreement.hasSufficientFunds
});
return [
...acc,
...AgreementsCommand.filterAgreement(agreement, filters)
];
}, []);
});
}
// eslint-disable-next-line require-await
run() {
return __awaiter(this, void 0, void 0, function* () {
const { flags: { status, pinningStatus } } = this.parsedArgs;
const table = new cli_table3_1.default({
head: ['', 'Reference', 'Expire in', 'Pinning Status'].map(safe_1.default.bold),
colWidths: [3, 68],
colAligns: ['center', 'center', 'center', 'left'],
wordWrap: true,
style: { head: [] }
});
const agreements = yield this.queryAgreement({ status, pinningStatus });
table.push(...agreements.map(AgreementsCommand.prepareAgreementForTable));
// eslint-disable-next-line no-console
console.log(table.toString());
this.exit();
});
}
}
exports.default = AgreementsCommand;
AgreementsCommand.flags = Object.assign(Object.assign({}, utils_1.default.flags), { network: command_1.flags.string({
char: 'n',
description: 'specifies to which network is the provider connected',
options: ['testnet', 'mainnet'],
env: 'RIFS_NETWORK'
}), status: command_1.flags.string({
char: 's',
description: 'Filter by status',
options: ['active', 'inactive']
}), pinningStatus: command_1.flags.string({
char: 'p',
description: 'Filter by pinning status',
options: [definitions_1.JobState.RUNNING, definitions_1.JobState.BACKOFF, definitions_1.JobState.CREATED, definitions_1.JobState.FINISHED, definitions_1.JobState.ERRORED],
multiple: true
}) });
AgreementsCommand.description = 'Agreements info';
AgreementsCommand.examples = [
'$ rif-pinning agreements',
'$ rif-pinning agreements --db myOffer.sqlite',
'$ rif-pinning agreements --ls -f active',
'$ rif-pinning agreements --ls -f inactive',
'$ rif-pinning agreements --ls -f inactive -p pinned',
'$ rif-pinning agreements --ls -f active -p not-pinned'
];