accept requestJson for create/edit as stdin

This commit is contained in:
Kyle Spearrin 2018-05-16 22:40:48 -04:00
parent 9cce555899
commit 07cb4d5ff8
5 changed files with 66 additions and 33 deletions

View File

@ -9,13 +9,23 @@ import { StringResponse } from '../models/response/stringResponse';
import { Cipher } from '../models/cipher';
import { Folder } from '../models/folder';
import { CliUtils } from '../utils';
export class CreateCommand {
constructor(private cipherService: CipherService, private folderService: FolderService) { }
async run(object: string, requestData: string, cmd: program.Command): Promise<Response> {
async run(object: string, requestJson: string, cmd: program.Command): Promise<Response> {
if (requestJson == null || requestJson === '') {
requestJson = await CliUtils.readStdin();
}
if (requestJson == null || requestJson === '') {
return Response.badRequest('`requestJson` was not provided.');
}
let req: any = null;
try {
const reqJson = new Buffer(requestData, 'base64').toString();
const reqJson = new Buffer(requestJson, 'base64').toString();
req = JSON.parse(reqJson);
} catch (e) {
return Response.badRequest('Error parsing the encoded request data.');

View File

@ -8,13 +8,23 @@ import { Response } from '../models/response';
import { Cipher } from '../models/cipher';
import { Folder } from '../models/folder';
import { CliUtils } from 'src/utils';
export class EditCommand {
constructor(private cipherService: CipherService, private folderService: FolderService) { }
async run(object: string, id: string, requestData: string, cmd: program.Command): Promise<Response> {
async run(object: string, id: string, requestJson: string, cmd: program.Command): Promise<Response> {
if (requestJson == null || requestJson === '') {
requestJson = await CliUtils.readStdin();
}
if (requestJson == null || requestJson === '') {
return Response.badRequest('`requestJson` was not provided.');
}
let req: any = null;
try {
const reqJson = new Buffer(requestData, 'base64').toString();
const reqJson = new Buffer(requestJson, 'base64').toString();
req = JSON.parse(reqJson);
} catch (e) {
return Response.badRequest('Error parsing the encoded request data.');

View File

@ -3,29 +3,16 @@ import * as program from 'commander';
import { Response } from '../models/response';
import { StringResponse } from '../models/response/stringResponse';
export class EncodeCommand {
run(cmd: program.Command): Promise<Response> {
if (process.stdin == null || process.stdin.isTTY) {
return Promise.resolve(Response.badRequest('No stdin was piped in.'));
}
import { CliUtils } from '../utils';
return new Promise((resolve, reject) => {
let input: string = '';
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
while (true) {
const chunk = process.stdin.read();
if (chunk == null) {
break;
}
input += chunk;
}
});
process.stdin.on('end', () => {
const b64 = new Buffer(input, 'utf8').toString('base64');
const res = new StringResponse(b64);
resolve(Response.success(res));
});
});
export class EncodeCommand {
async run(cmd: program.Command): Promise<Response> {
if (process.stdin.isTTY) {
return Response.badRequest('No stdin was piped in.');
}
const input = await CliUtils.readStdin();
const b64 = new Buffer(input, 'utf8').toString('base64');
const res = new StringResponse(b64);
return Response.success(res);
}
}

View File

@ -161,22 +161,22 @@ export class Program {
});
program
.command('create <object> <encodedData>')
.command('create <object> [encodedJson]')
.description('Create an object.')
.action(async (object, encodedData, cmd) => {
.action(async (object, encodedJson, cmd) => {
await this.exitIfLocked();
const command = new CreateCommand(this.main.cipherService, this.main.folderService);
const response = await command.run(object, encodedData, cmd);
const response = await command.run(object, encodedJson, cmd);
this.processResponse(response);
});
program
.command('edit <object> <id> <encodedData>')
.command('edit <object> <id> [encodedJson]')
.description('Edit an object.')
.action(async (object, id, encodedData, cmd) => {
.action(async (object, id, encodedJson, cmd) => {
await this.exitIfLocked();
const command = new EditCommand(this.main.cipherService, this.main.folderService);
const response = await command.run(object, id, encodedData, cmd);
const response = await command.run(object, id, encodedJson, cmd);
this.processResponse(response);
});

View File

@ -3,6 +3,32 @@ import { CollectionView } from 'jslib/models/view/collectionView';
import { FolderView } from 'jslib/models/view/folderView';
export class CliUtils {
static readStdin(): Promise<string> {
return new Promise((resolve, reject) => {
let input: string = '';
if (process.stdin.isTTY) {
resolve(input);
return;
}
process.stdin.setEncoding('utf8');
process.stdin.on('readable', () => {
while (true) {
const chunk = process.stdin.read();
if (chunk == null) {
break;
}
input += chunk;
}
});
process.stdin.on('end', () => {
resolve(input);
});
});
}
static searchCiphers(ciphers: CipherView[], search: string) {
search = search.toLowerCase();
return ciphers.filter((c) => {