UNPKG

@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
"use strict"; 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' ];