Support postman env imports, and bug fixes

This commit is contained in:
Gregory Schier
2016-11-30 19:54:26 -08:00
parent 2b6f02f6ca
commit cfb4e02e0a
13 changed files with 64 additions and 45 deletions

View File

@@ -137,7 +137,7 @@ export function getContentTypeName (contentType) {
if (typeof contentType !== 'string') {
return 'No Body';
} else {
return contentTypesMap[contentType] || '';
return contentTypesMap[contentType] || 'Other';
}
}

View File

@@ -189,13 +189,13 @@ export async function upsert (doc, fromSync = false) {
export function insert (doc, fromSync = false) {
return new Promise((resolve, reject) => {
db[doc.type].insert(doc, (err, newDoc) => {
const docWithDefaults = initModel(doc.type, doc);
db[doc.type].insert(docWithDefaults, (err, newDoc) => {
if (err) {
return reject(err);
}
notifyOfChange(CHANGE_INSERT, doc, fromSync);
notifyOfChange(CHANGE_INSERT, newDoc, fromSync);
resolve(newDoc);
});
});
@@ -203,14 +203,15 @@ export function insert (doc, fromSync = false) {
export function update (doc, fromSync = false) {
return new Promise((resolve, reject) => {
db[doc.type].update({_id: doc._id}, doc, err => {
const docWithDefaults = initModel(doc.type, doc);
db[doc.type].update({_id: docWithDefaults._id}, docWithDefaults, err => {
if (err) {
return reject(err);
}
notifyOfChange(CHANGE_UPDATE, doc, fromSync);
notifyOfChange(CHANGE_UPDATE, docWithDefaults, fromSync);
resolve(doc);
resolve(docWithDefaults);
});
});
}

View File

@@ -28,12 +28,19 @@ export async function importRaw (workspace, rawContent, generateNewIds = false)
try {
results = convert(rawContent);
} catch (e) {
console.error('Failed to import data', e);
return;
console.warn('Failed to import data', e);
return {
source: 'not found',
error: 'No importers found for file',
summary: {}
};
}
const {data} = results;
// Fetch the base environment in case we need it
const baseEnvironment = await models.environment.getOrCreateForWorkspace(workspace);
// Generate all the ids we may need
const generatedIds = {};
for (const r of data.resources) {
@@ -42,8 +49,9 @@ export async function importRaw (workspace, rawContent, generateNewIds = false)
}
}
// Also always replace __WORKSPACE_ID__ with the current workspace if we see it
// Always replace these "constants"
generatedIds['__WORKSPACE_ID__'] = workspace._id;
generatedIds['__BASE_ENVIRONMENT_ID__'] = baseEnvironment._id;
// Import everything backwards so they get inserted in the correct order
data.resources.reverse();
@@ -90,7 +98,8 @@ export async function importRaw (workspace, rawContent, generateNewIds = false)
return {
source: results.type.id,
summary: importedDocs
summary: importedDocs,
error: null
};
}

View File

@@ -16,7 +16,7 @@
"electron-squirrel-startup": "^1.0.0",
"hkdf": "0.0.2",
"httpsnippet": "git@github.com:getinsomnia/httpsnippet.git#a3a2c0a0167fa844bf92df52a1442fa1d68a9053",
"insomnia-importers": "^1.0.0",
"insomnia-importers": "^1.1.2",
"json-lint": "^0.1.0",
"jsonpath-plus": "^0.15.0",
"mime-types": "^2.1.12",

View File

@@ -70,7 +70,6 @@ class RequestPane extends PureComponent {
editorFontSize,
editorLineWrapping,
handleSend,
workspace,
forceRefreshCounter,
useBulkHeaderEditor,
handleGenerateCode,

View File

@@ -51,7 +51,8 @@ class Wrapper extends Component {
const {activeRequest} = this.props;
try {
const {resources} = importers.import(url);
const {data} = importers.convert(url);
const {resources} = data;
const r = resources[0];
if (r && r._type === 'request') {
@@ -82,7 +83,10 @@ class Wrapper extends Component {
_handleUpdateSettingsUseBulkHeaderEditor = useBulkHeaderEditor => sUpdate(this.props.settings, {useBulkHeaderEditor});
// Other Helpers
_handleImportFile = () => this.props.handleImportFileToWorkspace(this.props.activeWorkspace._id);
_handleImportFile = () => {
console.log('IMPORT', this.props);
this.props.handleImportFileToWorkspace(this.props.activeWorkspace._id);
}
_handleExportWorkspaceToFile = () => this.props.handleExportFile(this.props.activeWorkspace._id);
_handleSetActiveResponse = responseId => this.props.handleSetActiveResponse(this.props.activeRequest._id, responseId);
_handleShowEnvironmentsModal = () => showModal(WorkspaceEnvironmentsEditModal, this.props.activeWorkspace);

View File

@@ -19,7 +19,7 @@ class LoginModal extends Component {
message: '',
};
async _handleLogin (e) {
_handleLogin = async e => {
e.preventDefault();
this.setState({error: '', loading: true});
@@ -39,15 +39,15 @@ class LoginModal extends Component {
} catch (e) {
this.setState({error: e.message, loading: false});
}
}
};
_handleSignup (e) {
_handleSignup = e => {
e.preventDefault();
this.modal.hide();
showModal(SignupModal);
trackEvent('Login', 'Switch to Signup');
}
};
show (options = {}) {
const {title, message} = options;
@@ -66,7 +66,7 @@ class LoginModal extends Component {
{message ? (
<p className="notice info">{message}</p>
) : null}
<div className="form-control form-control--outlined">
<div className="form-control form-control--outlined no-pad-top">
<label>Email
<input
type="email"
@@ -92,7 +92,7 @@ class LoginModal extends Component {
<div className="margin-left">
Don't have an account yet?
{" "}
<a href="#" onClick={this._handleSignup.bind(this)}>Signup</a>
<a href="#" onClick={this._handleSignup}>Signup</a>
</div>
<button type="submit" className="btn">
{this.state.loading ? (
@@ -105,7 +105,7 @@ class LoginModal extends Component {
} else {
inner = [
<ModalHeader key="header">Login Success</ModalHeader>,
<ModalBody key="body" className="pad">
<ModalBody key="body" className="pad no-pad-top">
<h1>Enjoy your stay!</h1>
<p>
If you have any questions or concerns, send you email to
@@ -126,7 +126,7 @@ class LoginModal extends Component {
}
return (
<form onSubmit={this._handleLogin.bind(this)}>
<form onSubmit={this._handleLogin}>
<Modal ref={m => this.modal = m} {...this.props}>
{inner}
</Modal>

View File

@@ -5,7 +5,7 @@ import Modal from '../base/Modal';
import ModalBody from '../base/ModalBody';
import ModalHeader from '../base/ModalHeader';
import ModalFooter from '../base/ModalFooter';
import {getContentTypeName, METHOD_GET, METHOD_HEAD, METHOD_OPTIONS} from '../../../common/constants';
import {getContentTypeName, METHOD_GET, METHOD_HEAD, METHOD_OPTIONS, METHOD_DELETE} from '../../../common/constants';
import * as models from '../../../models/index';
import {trackEvent} from '../../../analytics/index';
@@ -52,6 +52,7 @@ class RequestCreateModal extends Component {
return (
selectedMethod === METHOD_GET ||
selectedMethod === METHOD_HEAD ||
selectedMethod === METHOD_DELETE ||
selectedMethod === METHOD_OPTIONS
);
}

View File

@@ -77,7 +77,7 @@ class SignupModal extends Component {
<ModalHeader key="header">Sign Up For a New Account</ModalHeader>,
<ModalBody key="body" className="pad">
<div className={classnames({hide: step !== STEP_BASIC_INFO})}>
<div className="form-control form-control--outlined">
<div className="form-control form-control--outlined no-pad-top">
<label>First Name
<input
type="text"
@@ -178,10 +178,11 @@ class SignupModal extends Component {
} else {
inner = [
<ModalHeader key="header">Account Created</ModalHeader>,
<ModalBody key="body" className="pad">
<ModalBody key="body" className="pad no-pad-top">
<h1>Thanks for signing up!</h1>
<p>
A verification email has been sent to your email address.
A verification email has been sent to your email address. You may now
log in.
</p>
</ModalBody>,
<ModalFooter key="footer">

View File

@@ -23,17 +23,17 @@ const SettingsImportExport = ({
Export Data <i className="fa fa-caret-down"></i>
</DropdownButton>
<DropdownDivider name="Choose Export Type"/>
<DropdownItem onClick={e => handleExportWorkspace()}>
<DropdownItem onClick={handleExportWorkspace}>
<i className="fa fa-home"></i>
Current Workspace
</DropdownItem>
<DropdownItem onClick={e => handleExportAll()}>
<DropdownItem onClick={handleExportAll}>
<i className="fa fa-empty"></i>
All Workspaces
</DropdownItem>
</Dropdown>
&nbsp;&nbsp;
<button className="btn btn--clicky" onClick={e => handleImport()}>
<button className="btn btn--clicky" onClick={handleImport}>
Import Data
</button>
</div>

View File

@@ -125,9 +125,7 @@ class App extends Component {
_requestCreate = async (parentId) => {
const request = await showModal(RequestCreateModal, {parentId});
const {activeWorkspace, handleSetActiveRequest} = this.props;
handleSetActiveRequest(activeWorkspace._id, request._id);
this._handleSetActiveRequest(request._id)
};
_requestGroupDuplicate = async requestGroup => {
@@ -135,14 +133,12 @@ class App extends Component {
};
_requestDuplicate = async request => {
const {activeWorkspace, handleSetActiveRequest} = this.props;
if (!request) {
return;
}
const newRequest = await models.request.duplicate(request);
handleSetActiveRequest(activeWorkspace._id, newRequest._id);
this._handleSetActiveRequest(newRequest._id)
};
_handleGenerateCode = () => {
@@ -154,7 +150,8 @@ class App extends Component {
if (requestGroupMeta) {
await models.requestGroupMeta.update(requestGroupMeta, patch);
} else {
await models.requestGroupMeta.create({parentId: requestGroupId}, patch);
const newPatch = Object.assign({parentId: requestGroupId}, patch);
await models.requestGroupMeta.create(newPatch);
}
};
@@ -164,7 +161,8 @@ class App extends Component {
if (requestMeta) {
await models.workspaceMeta.update(requestMeta, patch);
} else {
await models.workspaceMeta.create({parentId: workspaceId}, patch);
const newPatch = Object.assign({parentId: workspaceId}, patch);
await models.workspaceMeta.create(newPatch);
}
};
@@ -173,7 +171,8 @@ class App extends Component {
if (requestMeta) {
await models.requestMeta.update(requestMeta, patch);
} else {
await models.requestMeta.create({parentId: requestId}, patch);
const newPatch = Object.assign({parentId: requestId}, patch);
await models.requestMeta.create(newPatch);
}
};

View File

@@ -117,7 +117,6 @@ export function importFile (workspaceId) {
dispatch(loadStart());
const workspace = await models.workspace.getById(workspaceId);
const options = {
title: 'Import Insomnia Data',
buttonLabel: 'Import',
@@ -144,12 +143,18 @@ export function importFile (workspaceId) {
const data = fs.readFileSync(path, 'utf8');
dispatch(loadStop());
const {summary, source} = await importRaw(workspace, data);
const result = await importRaw(workspace, data);
const {summary, source, error} = result;
if (error) {
showModal(AlertModal, {title: 'Import Failed', message: error});
return;
}
let statements = Object.keys(summary).map(type => {
const count = summary[type].length;
const name = models.getModelName(type, count);
return count === 0 ? null :`${count} ${name}`;
return count === 0 ? null : `${count} ${name}`;
}).filter(s => s !== null);
let message;
@@ -159,10 +164,10 @@ export function importFile (workspaceId) {
message = `You imported ${statements.join(', ')}!`;
}
showModal(AlertModal, {title: 'Import Succeeded', message});
trackEvent('Import', source, 'Success');
trackEvent('Import', 'Success', source);
} catch (e) {
showModal(AlertModal, {title: 'Import Failed', message: e + ''});
trackEvent('Import', source, 'Failure');
trackEvent('Import', 'Failure');
}
}
});

View File

@@ -106,7 +106,7 @@
"electron-squirrel-startup": "^1.0.0",
"hkdf": "0.0.2",
"httpsnippet": "git@github.com:getinsomnia/httpsnippet.git#a3a2c0a0167fa844bf92df52a1442fa1d68a9053",
"insomnia-importers": "^1.0.0",
"insomnia-importers": "^1.1.2",
"json-lint": "^0.1.0",
"jsonpath-plus": "^0.15.0",
"mime-types": "^2.1.12",