UNPKG

polyv-live-cli

Version:

CLI tool for managing PolyV live streaming services.

308 lines (297 loc) 13.4 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.validateOutputFormat = validateOutputFormat; exports.parsePositiveInteger = parsePositiveInteger; exports.parsePositiveNumber = parsePositiveNumber; exports.registerQuestionnaireCommands = registerQuestionnaireCommands; const qa_questionnaire_handler_1 = require("../handlers/qa-questionnaire.handler"); const manager_1 = require("../config/manager"); const auth_adapter_1 = require("../config/auth-adapter"); const errors_1 = require("../utils/errors"); function validateOutputFormat(value) { if (!['table', 'json'].includes(value)) { throw new Error('Output format must be either "table" or "json"'); } return value; } function parsePositiveInteger(value) { const parsed = parseInt(value, 10); if (!Number.isInteger(parsed) || parsed < 1) { throw new Error('Value must be a positive integer'); } return parsed; } function parsePositiveNumber(value) { const parsed = Number(value); if (!Number.isFinite(parsed) || parsed <= 0) { throw new Error('Value must be a positive number'); } return parsed; } function registerQuestionnaireCommands(program) { const questionnaireCmd = program.command('questionnaire'); questionnaireCmd.description('Manage live streaming questionnaires'); const createCmd = questionnaireCmd .command('create') .description('Create a new questionnaire') .requiredOption('-c, --channel-id <id>', 'channel ID') .requiredOption('--title <title>', 'questionnaire title') .requiredOption('--questions <json>', 'questions array as JSON string') .option('--custom-questionnaire-id <id>', 'custom questionnaire ID') .option('--auto-publish-time <timestamp>', 'auto publish time (timestamp)', parseInt) .option('--auto-end-time <timestamp>', 'auto end time (timestamp)', parseInt) .option('--privacy-enabled', 'enable privacy mode (Y/N)') .option('--privacy-content <text>', 'privacy content') .option('-o, --output <format>', 'output format (table|json)', validateOutputFormat, 'table') .action(async (options) => { try { const parentOptions = program.opts(); const { authConfig, serviceConfig } = await loadAuthAndServiceConfig(parentOptions); const handler = new qa_questionnaire_handler_1.QaQuestionnaireHandler(authConfig, serviceConfig); let questions; try { questions = JSON.parse(options.questions); } catch (parseError) { (0, errors_1.logError)(new Error('Invalid JSON format for --questions parameter')); process.exit(1); } await handler.createQuestionnaire({ channelId: options.channelId, title: options.title, questions, customQuestionnaireId: options.customQuestionnaireId, autoPublishTime: options.autoPublishTime, autoEndTime: options.autoEndTime, ...(options.privacyEnabled ? { privacyEnabled: 'Y' } : {}), privacyContent: options.privacyContent, output: options.output, }); } catch (error) { (0, errors_1.logError)(error instanceof Error ? error : new Error(String(error))); process.exit(1); } }); createCmd.addHelpText('after', ` Examples: # Create questionnaire with required fields $ polyv-live-cli questionnaire create -c "3151318" --title "Survey" \\ --questions '[{"name":"Your gender?","type":"R","options":["Male","Female"],"required":"Y"}]' # Create questionnaire with optional fields $ polyv-live-cli questionnaire create -c "3151318" --title "Feedback" \\ --questions '[{"name":"How would you rate our service?","type":"X","required":"Y"}]' \\ --custom-questionnaire-id "custom-001" # JSON output $ polyv-live-cli questionnaire create -c "3151318" --title "Survey" -o json `); const listCmd = questionnaireCmd .command('list') .description('List questionnaires') .requiredOption('-c, --channel-id <id>', 'channel ID') .option('--start-time <timestamp>', 'start timestamp', parsePositiveNumber) .option('--end-time <timestamp>', 'end timestamp', parsePositiveNumber) .option('--page <number>', 'page number', parsePositiveInteger) .option('--size <number>', 'page size', parsePositiveInteger) .option('-o, --output <format>', 'output format (table|json)', validateOutputFormat, 'table') .action(async (options) => { try { const parentOptions = program.opts(); const { authConfig, serviceConfig } = await loadAuthAndServiceConfig(parentOptions); const handler = new qa_questionnaire_handler_1.QaQuestionnaireHandler(authConfig, serviceConfig); await handler.listQuestionnaire({ channelId: options.channelId, startTime: options.startTime, endTime: options.endTime, page: options.page, size: options.size, output: options.output, }); } catch (error) { (0, errors_1.logError)(error instanceof Error ? error : new Error(String(error))); process.exit(1); } }); listCmd.addHelpText('after', ` Examples: # List all questionnaires $ polyv-live-cli questionnaire list -c "3151318" # List with pagination $ polyv-live-cli questionnaire list -c "3151318" --page 1 --size 20 # List by timestamp range $ polyv-live-cli questionnaire list -c "3151318" --start-time 1704067200000 --end-time 1706745599000 # JSON output $ polyv-live-cli questionnaire list -c "3151318" -o json `); const resultListCmd = questionnaireCmd .command('result-list') .description('List questionnaire results with pagination') .requiredOption('-c, --channel-id <id>', 'channel ID') .option('--page <number>', 'page number', parseInt) .option('--size <number>', 'page size', parseInt) .option('--session-id <id>', 'filter by session ID') .option('--start-date <date>', 'start date filter (yyyy-MM-dd)') .option('--end-date <date>', 'end date filter (yyyy-MM-dd)') .option('-o, --output <format>', 'output format (table|json)', validateOutputFormat, 'table') .action(async (options) => { try { const parentOptions = program.opts(); const { authConfig, serviceConfig } = await loadAuthAndServiceConfig(parentOptions); const handler = new qa_questionnaire_handler_1.QaQuestionnaireHandler(authConfig, serviceConfig); await handler.listQuestionnaires({ channelId: options.channelId, page: options.page, size: options.size, sessionId: options.sessionId, startDate: options.startDate, endDate: options.endDate, output: options.output, }); } catch (error) { (0, errors_1.logError)(error instanceof Error ? error : new Error(String(error))); process.exit(1); } }); resultListCmd.addHelpText('after', ` Examples: # List questionnaire results $ polyv-live-cli questionnaire result-list -c "3151318" # List results with pagination $ polyv-live-cli questionnaire result-list -c "3151318" --page 1 --size 20 # Filter by session ID $ polyv-live-cli questionnaire result-list -c "3151318" --session-id "fwly13xczv" # Filter by date range $ polyv-live-cli questionnaire result-list -c "3151318" --start-date "2024-01-01" --end-date "2024-01-31" # JSON output $ polyv-live-cli questionnaire result-list -c "3151318" -o json `); const detailCmd = questionnaireCmd .command('detail') .description('Get questionnaire detail with questions') .requiredOption('-c, --channel-id <id>', 'channel ID') .requiredOption('--questionnaire-id <id>', 'questionnaire ID') .option('-o, --output <format>', 'output format (table|json)', validateOutputFormat, 'table') .action(async (options) => { try { const parentOptions = program.opts(); const { authConfig, serviceConfig } = await loadAuthAndServiceConfig(parentOptions); const handler = new qa_questionnaire_handler_1.QaQuestionnaireHandler(authConfig, serviceConfig); await handler.getQuestionnaireDetail({ channelId: options.channelId, questionnaireId: options.questionnaireId, output: options.output, }); } catch (error) { (0, errors_1.logError)(error instanceof Error ? error : new Error(String(error))); process.exit(1); } }); detailCmd.addHelpText('after', ` Examples: # Get questionnaire detail $ polyv-live-cli questionnaire detail -c "3151318" --questionnaire-id "fs9v59nq4u" # JSON output $ polyv-live-cli questionnaire detail -c "3151318" --questionnaire-id "fs9v59nq4u" -o json `); const resultsCmd = questionnaireCmd .command('results') .description('List questionnaire answer records') .requiredOption('-c, --channel-id <id>', 'channel ID') .option('--questionnaire-id <id>', 'questionnaire ID filter') .option('--session-id <id>', 'live session ID filter') .option('--start-date <date>', 'start date filter (yyyy-MM-dd)') .option('--end-date <date>', 'end date filter (yyyy-MM-dd)') .option('-o, --output <format>', 'output format (table|json)', validateOutputFormat, 'table') .action(async (options) => { try { const parentOptions = program.opts(); const { authConfig, serviceConfig } = await loadAuthAndServiceConfig(parentOptions); const handler = new qa_questionnaire_handler_1.QaQuestionnaireHandler(authConfig, serviceConfig); await handler.getQuestionnaireResult({ channelId: options.channelId, questionnaireId: options.questionnaireId, sessionId: options.sessionId, startDate: options.startDate, endDate: options.endDate, output: options.output, }); } catch (error) { (0, errors_1.logError)(error instanceof Error ? error : new Error(String(error))); process.exit(1); } }); resultsCmd.addHelpText('after', ` Examples: # List questionnaire answer records $ polyv-live-cli questionnaire results -c "3151318" --questionnaire-id "fs9v59nq4u" # JSON output $ polyv-live-cli questionnaire results -c "3151318" --session-id "fwly13xczv" -o json `); const batchCreateCmd = questionnaireCmd .command('batch-create') .description('Batch create questionnaires') .requiredOption('--questionnaires <json>', 'questionnaires array as JSON string') .option('-f, --force', 'skip confirmation prompt') .option('-o, --output <format>', 'output format (table|json)', validateOutputFormat, 'table') .action(async (options) => { try { const parentOptions = program.opts(); const { authConfig, serviceConfig } = await loadAuthAndServiceConfig(parentOptions); const handler = new qa_questionnaire_handler_1.QaQuestionnaireHandler(authConfig, serviceConfig); await handler.batchCreateQuestionnaire({ questionnaires: options.questionnaires, force: options.force, output: options.output, }); } catch (error) { (0, errors_1.logError)(error instanceof Error ? error : new Error(String(error))); process.exit(1); } }); batchCreateCmd.addHelpText('after', ` Examples: # Batch create questionnaires $ polyv-live-cli questionnaire batch-create --questionnaires '[{"channelId":"3151318","questionnaireTitle":"Survey","questions":[{"name":"Gender","type":"R","options":["Male","Female"]}]}]' --force `); } async function loadAuthAndServiceConfig(parentOptions) { const authResult = auth_adapter_1.authAdapter.tryGetAuthConfig(parentOptions); if (!authResult) { throw new Error(auth_adapter_1.authAdapter.getStatusMessage(parentOptions)); } let configResult; try { configResult = await manager_1.configManager.load({ cliOptions: parentOptions, }); } catch (error) { if (error instanceof Error && error.message.includes('Auth configuration is incomplete')) { configResult = { config: { baseUrl: 'https://api.polyv.net', timeout: 30000, debug: false, }, }; } else { throw error; } } const serviceConfig = { baseUrl: configResult.config.baseUrl, timeout: configResult.config.timeout, debug: configResult.config.debug, }; return { authConfig: authResult.config, serviceConfig, }; } //# sourceMappingURL=questionnaire.commands.js.map