From 073dfd3ada9c244ca0e58baedf5fa1d9a1d8e2b3 Mon Sep 17 00:00:00 2001 From: Gregory Schier Date: Wed, 9 Nov 2016 17:15:27 -0800 Subject: [PATCH] Some models refactors (#42) --- app/backend/__fixtures__/nestedfolders.js | 8 +- app/backend/__tests__/database.test.js | 25 +++-- app/backend/__tests__/har.test.js | 9 +- app/backend/__tests__/network.test.js | 21 ++-- app/backend/__tests__/render.test.js | 18 +-- app/backend/analytics.js | 4 +- app/backend/database.js | 104 +++++------------- app/backend/export/database.js | 37 ++++--- app/backend/export/har.js | 4 +- app/backend/export/legacy.js | 6 +- app/backend/models/cookieJar.js | 4 +- app/backend/models/environment.js | 4 +- app/backend/models/index.js | 53 +++++++++ app/backend/models/request.js | 7 +- app/backend/models/requestGroup.js | 4 +- app/backend/models/response.js | 4 +- app/backend/models/settings.js | 4 +- app/backend/models/stats.js | 4 +- app/backend/models/workspace.js | 4 +- app/backend/network.js | 16 +-- app/backend/render.js | 11 +- app/sync/index.js | 15 +-- app/ui/components/ResponsePane.js | 4 +- .../dropdowns/RequestActionsDropdown.js | 8 +- app/ui/components/modals/CookiesModal.js | 6 +- .../components/modals/RequestSwitcherModal.js | 10 +- app/ui/components/modals/SettingsModal.js | 6 +- app/ui/components/modals/SyncModal.js | 4 +- .../modals/WorkspaceEnvironmentsEditModal.js | 16 +-- .../components/sidebar/SidebarRequestRow.js | 7 +- app/ui/containers/App.js | 55 ++++----- app/ui/containers/EnvironmentsDropdown.js | 4 +- .../containers/RequestGroupActionsDropdown.js | 12 +- app/ui/containers/WorkspaceDropdown.js | 10 +- app/ui/index.js | 3 +- app/ui/redux/initstore.js | 13 ++- app/ui/redux/modules/entities.js | 7 +- 37 files changed, 273 insertions(+), 258 deletions(-) create mode 100644 app/backend/models/index.js diff --git a/app/backend/__fixtures__/nestedfolders.js b/app/backend/__fixtures__/nestedfolders.js index d93a4f97fb..653d5a2118 100644 --- a/app/backend/__fixtures__/nestedfolders.js +++ b/app/backend/__fixtures__/nestedfolders.js @@ -1,12 +1,12 @@ -import * as db from '../database'; +import * as models from '../models'; export default { - [db.workspace.type]: [{ + [models.workspace.type]: [{ _id: 'wrk_1', name: 'Wrk 1' }], - [db.requestGroup.type]: [{ + [models.requestGroup.type]: [{ _id: 'fld_1', parentId: 'wrk_1', name: 'Fld 1' @@ -20,7 +20,7 @@ export default { name: 'Fld 3' }], - [db.request.type]: [{ + [models.request.type]: [{ _id: 'req_1', parentId: 'fld_1', name: 'Req 1' diff --git a/app/backend/__tests__/database.test.js b/app/backend/__tests__/database.test.js index a8363c0279..5538329c00 100644 --- a/app/backend/__tests__/database.test.js +++ b/app/backend/__tests__/database.test.js @@ -1,4 +1,5 @@ import * as db from '../database'; +import * as models from '../models'; import {PREVIEW_MODE_SOURCE} from '../previewModes'; function loadFixture (name) { @@ -13,7 +14,7 @@ function loadFixture (name) { describe('requestCreate()', () => { beforeEach(() => { - return db.initDB({inMemoryOnly: true}, true); + return db.initDB(models.types(), {inMemoryOnly: true}, true); }); it('creates a valid request', async () => { @@ -24,7 +25,7 @@ describe('requestCreate()', () => { parentId: 'wrk_123' }; - const r = await db.request.create(patch); + const r = await models.request.create(patch); expect(Object.keys(r).length).toBe(15); expect(r._id).toMatch(/^req_[a-zA-Z0-9]{32}$/); @@ -44,31 +45,31 @@ describe('requestCreate()', () => { }); it('throws when missing parentID', () => { - const fn = () => db.request.create({name: 'My Request'}); + const fn = () => models.request.create({name: 'My Request'}); expect(fn).toThrowError('New Requests missing `parentId`'); }); }); describe('requestGroupDuplicate()', () => { beforeEach(async () => { - await db.initDB({inMemoryOnly: true}, true); + await db.initDB(models.types(), {inMemoryOnly: true}, true); await loadFixture('nestedfolders'); }); it('duplicates a RequestGroup', async () => { - const requestGroup = await db.requestGroup.getById('fld_1'); + const requestGroup = await models.requestGroup.getById('fld_1'); expect(requestGroup.name).toBe('Fld 1'); - const newRequestGroup = await db.requestGroup.duplicate(requestGroup); + const newRequestGroup = await models.requestGroup.duplicate(requestGroup); expect(newRequestGroup._id).not.toBe(requestGroup._id); expect(newRequestGroup.name).toBe('Fld 1 (Copy)'); - const allRequests = await db.request.all(); - const allRequestGroups = await db.requestGroup.all(); - const childRequests = await db.request.findByParentId(requestGroup._id); - const childRequestGroups = await db.requestGroup.findByParentId(requestGroup._id); - const newChildRequests = await db.request.findByParentId(newRequestGroup._id); - const newChildRequestGroups = await db.requestGroup.findByParentId(newRequestGroup._id); + const allRequests = await models.request.all(); + const allRequestGroups = await models.requestGroup.all(); + const childRequests = await models.request.findByParentId(requestGroup._id); + const childRequestGroups = await models.requestGroup.findByParentId(requestGroup._id); + const newChildRequests = await models.request.findByParentId(newRequestGroup._id); + const newChildRequestGroups = await models.requestGroup.findByParentId(newRequestGroup._id); // This asserting is pretty garbage but it at least checks // to see that the recursion worked (for the most part) expect(allRequests.length).toBe(8); diff --git a/app/backend/__tests__/har.test.js b/app/backend/__tests__/har.test.js index b84e6da21b..795fc2c807 100644 --- a/app/backend/__tests__/har.test.js +++ b/app/backend/__tests__/har.test.js @@ -1,11 +1,12 @@ import * as harUtils from '../export/har'; import * as db from '../database'; import * as render from '../render'; +import * as models from '../models'; describe('exportHarWithRequest()', () => { - beforeEach(() => db.initDB({inMemoryOnly: true}, true)); + beforeEach(() => db.initDB(models.types(), {inMemoryOnly: true}, true)); it('renders does it correctly', async () => { - const workspace = await db.workspace.create(); + const workspace = await models.workspace.create(); const cookies = [{ creation: new Date('2016-10-05T04:40:49.505Z'), key: 'foo', @@ -17,12 +18,12 @@ describe('exportHarWithRequest()', () => { lastAccessed: new Date('2096-10-05T04:40:49.505Z') }]; - await db.cookieJar.create({ + await models.cookieJar.create({ parentId: workspace._id, cookies }); - const request = Object.assign(db.request.init(), { + const request = Object.assign(models.request.init(), { _id: 'req_123', parentId: workspace._id, headers: [{name: 'Content-Type', value: 'application/json'}], diff --git a/app/backend/__tests__/network.test.js b/app/backend/__tests__/network.test.js index 9e7cbd92ac..b89d918666 100644 --- a/app/backend/__tests__/network.test.js +++ b/app/backend/__tests__/network.test.js @@ -2,13 +2,14 @@ import * as networkUtils from '../network'; import * as db from '../database'; import nock from 'nock'; import {getRenderedRequest} from '../render'; +import * as models from '../models'; describe('buildRequestConfig()', () => { - beforeEach(() => db.initDB({inMemoryOnly: true}, true)); + beforeEach(() => db.initDB(models.types(), {inMemoryOnly: true}, true)); it('builds a default config', async () => { - const workspace = await db.workspace.create(); - const request = Object.assign(db.request.init(), { + const workspace = await models.workspace.create(); + const request = Object.assign(models.request.init(), { parentId: workspace._id }); @@ -33,8 +34,8 @@ describe('buildRequestConfig()', () => { }); it('builds a complex config', async () => { - const workspace = await db.workspace.create(); - const request = Object.assign(db.request.init(), { + const workspace = await models.workspace.create(); + const request = Object.assign(models.request.init(), { parentId: workspace._id, headers: [{host: '', name: 'Content-Type', value: 'application/json'}], parameters: [{name: 'foo bar', value: 'hello&world'}], @@ -74,13 +75,13 @@ describe('buildRequestConfig()', () => { }); describe('actuallySend()', () => { - beforeEach(() => db.initDB({inMemoryOnly: true}, true)); + beforeEach(() => db.initDB(models.types(), {inMemoryOnly: true}, true)); it('does something', async () => { let mock; - const workspace = await db.workspace.create(); - const settings = await db.settings.create(); + const workspace = await models.workspace.create(); + const settings = await models.settings.create(); const cookies = [{ creation: new Date('2016-10-05T04:40:49.505Z'), key: 'foo', @@ -101,7 +102,7 @@ describe('actuallySend()', () => { lastAccessed: new Date('2096-10-05T04:40:49.505Z') }]; - await db.cookieJar.create({ + await models.cookieJar.create({ parentId: workspace._id, cookies }); @@ -115,7 +116,7 @@ describe('actuallySend()', () => { .reply(200, 'response body') .log(console.log); - const request = Object.assign(db.request.init(), { + const request = Object.assign(models.request.init(), { _id: 'req_123', parentId: workspace._id, headers: [{name: 'Content-Type', value: 'application/json'}], diff --git a/app/backend/__tests__/render.test.js b/app/backend/__tests__/render.test.js index 732242639a..e45e68d8a2 100644 --- a/app/backend/__tests__/render.test.js +++ b/app/backend/__tests__/render.test.js @@ -1,5 +1,5 @@ import * as renderUtils from '../render'; -import * as db from '../database'; +import * as models from '../models'; jest.mock('electron'); @@ -28,20 +28,20 @@ describe('render()', () => { describe('buildRenderContext()', () => { it('cascades properly', () => { const ancestors = [{ - type: db.requestGroup.type, + type: models.requestGroup.type, environment: {foo: 'group 2', ancestor: true} }, { - type: db.requestGroup.type, + type: models.requestGroup.type, environment: {foo: 'group 1', ancestor: true} }]; const rootEnvironment = { - type: db.environment.type, + type: models.environment.type, data: {foo: 'root', root: true} }; const subEnvironment = { - type: db.environment.type, + type: models.environment.type, data: {foo: 'sub', sub: true} }; @@ -61,20 +61,20 @@ describe('buildRenderContext()', () => { it('cascades properly and renders', () => { const ancestors = [{ - type: db.requestGroup.type, + type: models.requestGroup.type, environment: {bar: '{{ foo }} 2', recursive: '{{ recursive }}', ancestor: true} }, { - type: db.requestGroup.type, + type: models.requestGroup.type, environment: {bar: '{{ foo }} 1', ancestor: true} }]; const rootEnvironment = { - type: db.environment.type, + type: models.environment.type, data: {foo: 'root', root: true} }; const subEnvironment = { - type: db.environment.type, + type: models.environment.type, data: {foo: 'sub', sub: true} }; diff --git a/app/backend/analytics.js b/app/backend/analytics.js index ad554584d8..39050ea2fd 100644 --- a/app/backend/analytics.js +++ b/app/backend/analytics.js @@ -1,8 +1,8 @@ import Analytics from 'analytics-node'; import {getAppVersion} from './appInfo'; -import * as db from './database'; import {SEGMENT_WRITE_KEY} from './constants'; import {isDevelopment} from './appInfo'; +import * as models from './models'; let analytics = null; let userId = null; @@ -16,7 +16,7 @@ export async function initLegacyAnalytics () { analytics = new Analytics(SEGMENT_WRITE_KEY); if (!userId) { - const stats = await db.stats.get(); + const stats = await models.stats.get(); userId = stats._id; // Recurse now that we have a userId diff --git a/app/backend/database.js b/app/backend/database.js index ffbe882c09..24e563479e 100644 --- a/app/backend/database.js +++ b/app/backend/database.js @@ -1,70 +1,23 @@ import electron from 'electron'; import NeDB from 'nedb'; import fsPath from 'path'; -import {DB_PERSIST_INTERVAL} from './constants'; +import {DB_PERSIST_INTERVAL} from './constants'; import {generateId} from './util'; - -import * as _stats from './models/stats'; -import * as _settings from './models/settings'; -import * as _workspace from './models/workspace'; -import * as _environment from './models/environment'; -import * as _cookieJar from './models/cookieJar'; -import * as _requestGroup from './models/requestGroup'; -import * as _request from './models/request'; -import * as _response from './models/response'; +import {getModel, initModel} from './models'; export const CHANGE_INSERT = 'insert'; export const CHANGE_UPDATE = 'update'; export const CHANGE_REMOVE = 'remove'; - -// ~~~~~~ // -// MODELS // -// ~~~~~~ // - -const MODELS = [ - _stats, - _settings, - _workspace, - _environment, - _cookieJar, - _requestGroup, - _request, - _response -]; - -export const stats = _stats; -export const settings = _settings; -export const workspace = _workspace; -export const environment = _environment; -export const cookieJar = _cookieJar; -export const requestGroup = _requestGroup; -export const request = _request; -export const response = _response; - - -const MODEL_MAP = {}; - -export function initModel (doc) { - return Object.assign({ - modified: Date.now(), - created: Date.now(), - parentId: null - }, doc); -} - -export const ALL_TYPES = MODELS.map(m => m.type); - -for (const model of MODELS) { - MODEL_MAP[model.type] = model; -} - +let db = {}; // ~~~~~~~ // // HELPERS // // ~~~~~~~ // -let db = {}; +function allTypes () { + return Object.keys(db); +} function getDBFilePath (modelType) { // NOTE: Do not EVER change this. EVER! @@ -76,35 +29,34 @@ function getDBFilePath (modelType) { * Initialize the database. Note that this isn't actually async, but might be * in the future! * + * @param types * @param config * @param forceReset * @returns {null} */ -export async function initDB (config = {}, forceReset = false) { +export async function initDB (types, config = {}, forceReset = false) { if (forceReset) { db = {}; } // Fill in the defaults - ALL_TYPES.map(t => { - if (db[t]) { - console.warn(`-- Already initialized DB.${t} --`); - return; + for (const modelType of types) { + if (db[modelType]) { + console.warn(`-- Already initialized DB.${modelType} --`); + continue; } - const defaults = { - filename: getDBFilePath(t), + const filePath = getDBFilePath(modelType); + + db[modelType] = new NeDB(Object.assign({ + filename: filePath, autoload: true - }; + }, config)); - const finalConfig = Object.assign(defaults, config); + db[modelType].persistence.setAutocompactionInterval(DB_PERSIST_INTERVAL); - db[t] = new NeDB(finalConfig); - db[t].persistence.setAutocompactionInterval(DB_PERSIST_INTERVAL) - }); - - // Done - console.log(`-- Initialized DB at ${getDBFilePath('${type}')} --`); + console.log(`-- Initialized DB at ${filePath} --`); + } } @@ -176,7 +128,7 @@ export function find (type, query = {}) { return reject(err); } - const modelDefaults = MODEL_MAP[type].init(); + const modelDefaults = initModel(type); const docs = rawDocs.map(rawDoc => { return Object.assign({}, modelDefaults, rawDoc); }); @@ -202,7 +154,7 @@ export function getWhere (type, query) { return resolve(null); } - const modelDefaults = MODEL_MAP[type].init(); + const modelDefaults = initModel(type); resolve(Object.assign({}, modelDefaults, rawDocs[0])); }) }) @@ -296,7 +248,7 @@ export function removeBulkSilently (type, query) { export function docUpdate (originalDoc, patch = {}) { const doc = Object.assign( - MODEL_MAP[originalDoc.type].init(), + initModel(originalDoc.type), originalDoc, patch, {modified: Date.now()} @@ -306,7 +258,7 @@ export function docUpdate (originalDoc, patch = {}) { } export function docCreate (type, patch = {}) { - const idPrefix = MODEL_MAP[type].prefix; + const idPrefix = getModel(type).prefix; if (!idPrefix) { throw new Error(`No ID prefix for ${type}`) @@ -314,7 +266,7 @@ export function docCreate (type, patch = {}) { const doc = Object.assign( {_id: generateId(idPrefix)}, - MODEL_MAP[type].init(), + initModel(type), patch, // Fields that the user can't touch @@ -338,7 +290,7 @@ export async function withDescendants (doc = null) { let foundDocs = []; for (const d of docs) { - for (const type of ALL_TYPES) { + for (const type of allTypes()) { // If the doc is null, we want to search for parentId === null const parentId = d ? d._id : null; const more = await find(type, {parentId}); @@ -366,7 +318,7 @@ export async function withAncestors (doc) { let foundDocs = []; for (const d of docs) { - for (const type of ALL_TYPES) { + for (const type of allTypes()) { // If the doc is null, we want to search for parentId === null const more = await find(type, {_id: d.parentId}); foundDocs = [...foundDocs, ...more] @@ -398,7 +350,7 @@ export async function duplicate (originalDoc, patch = {}, first = true) { const createdDoc = await docCreate(newDoc.type, newDoc); // 2. Get all the children - for (const type of ALL_TYPES) { + for (const type of allTypes()) { const parentId = originalDoc._id; const children = await find(type, {parentId}); for (const doc of children) { diff --git a/app/backend/export/database.js b/app/backend/export/database.js index b5c9cb5d99..81938bbda3 100644 --- a/app/backend/export/database.js +++ b/app/backend/export/database.js @@ -1,6 +1,7 @@ 'use strict'; import * as db from '../database'; +import * as models from '../models'; import {getAppVersion} from '../appInfo'; import {importRequestGroupLegacy} from './legacy'; import {importRequestLegacy} from './legacy'; @@ -47,20 +48,20 @@ export function importJSON (workspace, json) { case VERSION_DESKTOP_APP: data.resources.map(async r => { if (r._type === EXPORT_TYPE_WORKSPACE) { - const d = await db.workspace.getById(r._id); - d ? db.workspace.update(d, r) : db.workspace.create(r); + const d = await models.workspace.getById(r._id); + d ? models.workspace.update(d, r) : models.workspace.create(r); } else if (r._type === EXPORT_TYPE_COOKIE_JAR) { - const d = await db.cookieJar.getById(r._id); - d ? db.cookieJar.update(d, r) : db.cookieJar.create(r); + const d = await models.cookieJar.getById(r._id); + d ? models.cookieJar.update(d, r) : models.cookieJar.create(r); } else if (r._type === EXPORT_TYPE_ENVIRONMENT) { - const d = await db.environment.getById(r._id); - d ? db.environment.update(d, r) : db.environment.create(r); + const d = await models.environment.getById(r._id); + d ? models.environment.update(d, r) : models.environment.create(r); } else if (r._type === EXPORT_TYPE_REQUEST_GROUP) { - const d = await db.requestGroup.getById(r._id); - d ? db.requestGroup.update(d, r) : db.requestGroup.create(r); + const d = await models.requestGroup.getById(r._id); + d ? models.requestGroup.update(d, r) : models.requestGroup.create(r); } else if (r._type === EXPORT_TYPE_REQUEST) { - const d = await db.request.getById(r._id); - d ? db.request.update(d, r) : db.request.create(r); + const d = await models.request.getById(r._id); + d ? models.request.update(d, r) : models.request.create(r); } else { console.error('Unknown doc type for import', r.type); } @@ -86,19 +87,19 @@ export async function exportJSON (parentDoc = null) { const docs = await db.withDescendants(parentDoc); data.resources = docs.filter(d => ( - d.type !== db.response.type && - d.type !== db.stats.type && - d.type !== db.settings.type + d.type !== models.response.type && + d.type !== models.stats.type && + d.type !== models.settings.type )).map(d => { - if (d.type === db.workspace.type) { + if (d.type === models.workspace.type) { d._type = EXPORT_TYPE_WORKSPACE; - } else if (d.type === db.cookieJar.type) { + } else if (d.type === models.cookieJar.type) { d._type = EXPORT_TYPE_COOKIE_JAR; - } else if (d.type === db.environment.type) { + } else if (d.type === models.environment.type) { d._type = EXPORT_TYPE_ENVIRONMENT; - } else if (d.type === db.requestGroup.type) { + } else if (d.type === models.requestGroup.type) { d._type = EXPORT_TYPE_REQUEST_GROUP; - } else if (d.type === db.request.type) { + } else if (d.type === models.request.type) { d._type = EXPORT_TYPE_REQUEST; } diff --git a/app/backend/export/har.js b/app/backend/export/har.js index a47d0ca840..cb4cff9458 100644 --- a/app/backend/export/har.js +++ b/app/backend/export/har.js @@ -1,4 +1,4 @@ -import * as db from '../database'; +import * as models from '../models'; import {getRenderedRequest} from '../render'; import {jarFromCookies} from '../cookies'; import * as util from '../../backend/util'; @@ -30,7 +30,7 @@ export function exportHarWithRequest (renderedRequest, addContentLength = false) } export async function exportHar (requestId, addContentLength = false) { - const request = await db.request.getById(requestId); + const request = await models.request.getById(requestId); const renderedRequest = await getRenderedRequest(request); return exportHarWithRequest(renderedRequest, addContentLength); } diff --git a/app/backend/export/legacy.js b/app/backend/export/legacy.js index fbcd622497..eb75bc95a9 100644 --- a/app/backend/export/legacy.js +++ b/app/backend/export/legacy.js @@ -1,4 +1,4 @@ -import * as db from '../database'; +import * as models from '../models'; import {getContentTypeFromHeaders} from '../contentTypes'; const FORMAT_MAP = { @@ -9,7 +9,7 @@ const FORMAT_MAP = { }; export async function importRequestGroupLegacy (importedRequestGroup, parentId, index = 1) { - const requestGroup = await db.requestGroup.create({ + const requestGroup = await models.requestGroup.create({ parentId, name: importedRequestGroup.name, environment: (importedRequestGroup.environments || {}).base || {}, @@ -49,7 +49,7 @@ export function importRequestLegacy (importedRequest, parentId, index = 1) { } } - db.request.create({ + models.request.create({ parentId, _id: importedRequest._id, name: importedRequest.name, diff --git a/app/backend/models/cookieJar.js b/app/backend/models/cookieJar.js index 57064cb3e6..937d3c2bdc 100644 --- a/app/backend/models/cookieJar.js +++ b/app/backend/models/cookieJar.js @@ -3,10 +3,10 @@ import * as db from '../database'; export const type = 'CookieJar'; export const prefix = 'jar'; export function init () { - return db.initModel({ + return { name: 'Default Jar', cookies: [] - }) + } } export function create (patch = {}) { diff --git a/app/backend/models/environment.js b/app/backend/models/environment.js index 4f298a9f9a..72492bce86 100644 --- a/app/backend/models/environment.js +++ b/app/backend/models/environment.js @@ -3,10 +3,10 @@ import * as db from '../database'; export const type = 'Environment'; export const prefix = 'env'; export function init () { - return db.initModel({ + return { name: 'New Environment', data: {}, - }) + } } export function create (patch = {}) { diff --git a/app/backend/models/index.js b/app/backend/models/index.js new file mode 100644 index 0000000000..182cda6659 --- /dev/null +++ b/app/backend/models/index.js @@ -0,0 +1,53 @@ +import * as _stats from './stats'; +import * as _settings from './settings'; +import * as _workspace from './workspace'; +import * as _environment from './environment'; +import * as _cookieJar from './cookieJar'; +import * as _requestGroup from './requestGroup'; +import * as _request from './request'; +import * as _response from './response'; + +// Reference to each model +export const stats = _stats; +export const settings = _settings; +export const workspace = _workspace; +export const environment = _environment; +export const cookieJar = _cookieJar; +export const requestGroup = _requestGroup; +export const request = _request; +export const response = _response; + +const _models = { + [stats.type]: stats, + [settings.type]: settings, + [workspace.type]: workspace, + [environment.type]: environment, + [cookieJar.type]: cookieJar, + [requestGroup.type]: requestGroup, + [request.type]: request, + [response.type]: response, +}; + +export function all () { + return Object.keys(_models).map(type => _models[type]); +} + +export function types () { + return all().map(model => model.type); +} + +export function getModel (type) { + return _models[type] || null; +} + +export function initModel (type) { + const baseDefaults = { + modified: Date.now(), + created: Date.now(), + parentId: null + }; + + const modelDefaults = getModel(type).init(); + + return Object.assign(baseDefaults, modelDefaults); +} diff --git a/app/backend/models/request.js b/app/backend/models/request.js index ed8fae5c8a..9524103ca1 100644 --- a/app/backend/models/request.js +++ b/app/backend/models/request.js @@ -6,7 +6,7 @@ export const type = 'Request'; export const prefix = 'req'; export function init () { - return db.initModel({ + return { url: '', name: 'New Request', method: METHOD_GET, @@ -17,7 +17,7 @@ export function init () { metaPreviewMode: PREVIEW_MODE_SOURCE, metaResponseFilter: '', metaSortKey: -1 * Date.now() - }); + }; } export function create (patch = {}) { @@ -60,7 +60,8 @@ export function updateContentType (request, contentType) { export function duplicate (request) { const name = `${request.name} (Copy)`; - return db.duplicate(request, {name}) + const metaSortKey = request.metaSortKey + 1; + return db.duplicate(request, {name, metaSortKey}) } export function remove (request) { diff --git a/app/backend/models/requestGroup.js b/app/backend/models/requestGroup.js index c763ea8d90..8ed24180fa 100644 --- a/app/backend/models/requestGroup.js +++ b/app/backend/models/requestGroup.js @@ -3,12 +3,12 @@ import * as db from '../database'; export const type = 'RequestGroup'; export const prefix = 'fld'; export function init () { - return db.initModel({ + return { name: 'New Folder', environment: {}, metaCollapsed: false, metaSortKey: -1 * Date.now() - }) + } } export function create (patch = {}) { diff --git a/app/backend/models/response.js b/app/backend/models/response.js index 4b9e37690c..b2c2bd1123 100644 --- a/app/backend/models/response.js +++ b/app/backend/models/response.js @@ -3,7 +3,7 @@ import * as db from '../database'; export const type = 'Response'; export const prefix = 'res'; export function init () { - return db.initModel({ + return { statusCode: 0, statusMessage: '', contentType: '', @@ -15,7 +15,7 @@ export function init () { body: '', encoding: 'utf8', // Legacy format error: '' - }) + } } export function create (patch = {}) { diff --git a/app/backend/models/settings.js b/app/backend/models/settings.js index 7e2629dfd4..84ff025ce1 100644 --- a/app/backend/models/settings.js +++ b/app/backend/models/settings.js @@ -3,7 +3,7 @@ import * as db from '../database'; export const type = 'Settings'; export const prefix = 'set'; export function init () { - return db.initModel({ + return { showPasswords: false, useBulkHeaderEditor: false, followRedirects: true, @@ -15,7 +15,7 @@ export function init () { validateSSL: true, optSyncBeta: false, forceVerticalLayout: false, - }); + }; } export async function create (patch = {}) { diff --git a/app/backend/models/stats.js b/app/backend/models/stats.js index a31984828c..97d8a84af0 100644 --- a/app/backend/models/stats.js +++ b/app/backend/models/stats.js @@ -3,11 +3,11 @@ import * as db from '../database'; export const type = 'Stats'; export const prefix = 'sta'; export function init () { - return db.initModel({ + return { lastLaunch: Date.now(), lastVersion: null, launches: 0 - }); + }; } export function create (patch = {}) { diff --git a/app/backend/models/workspace.js b/app/backend/models/workspace.js index 1b7783b07b..8248cc90e9 100644 --- a/app/backend/models/workspace.js +++ b/app/backend/models/workspace.js @@ -3,10 +3,10 @@ import * as db from '../database'; export const type = 'Workspace'; export const prefix = 'wrk'; export function init () { - return db.initModel({ + return { name: 'New Workspace', metaActiveEnvironmentId: null - }); + }; } export function getById (id) { diff --git a/app/backend/network.js b/app/backend/network.js index a3d00c608e..eb2a568977 100644 --- a/app/backend/network.js +++ b/app/backend/network.js @@ -1,6 +1,6 @@ import networkRequest from 'request'; import {parse as urlParse} from 'url'; -import * as db from './database'; +import * as models from './models'; import * as querystring from './querystring'; import * as util from './util.js'; import {DEBOUNCE_MILLIS, STATUS_CODE_PEBKAC} from './constants'; @@ -126,7 +126,7 @@ export function _actuallySend (renderedRequest, settings, forceIPv4 = false) { message += `Code: ${err.code}`; } - await db.response.create({ + await models.response.create({ parentId: renderedRequest._id, error: message }); @@ -155,7 +155,7 @@ export function _actuallySend (renderedRequest, settings, forceIPv4 = false) { } } const cookies = await cookiesFromJar(jar); - await db.cookieJar.update(cookieJar, {cookies}); + await models.cookieJar.update(cookieJar, {cookies}); const responsePatch = { parentId: renderedRequest._id, @@ -170,14 +170,14 @@ export function _actuallySend (renderedRequest, settings, forceIPv4 = false) { headers: headers }; - db.response.create(responsePatch).then(resolve, reject); + models.response.create(responsePatch).then(resolve, reject); }); // Kind of hacky, but this is how we cancel a request. cancelRequestFunction = async () => { req.abort(); - await db.response.create({ + await models.response.create({ parentId: renderedRequest._id, elapsedTime: Date.now() - requestStartTime, statusMessage: 'Cancelled', @@ -193,8 +193,8 @@ export async function send (requestId, environmentId) { // First, lets wait for all debounces to finish await util.delay(DEBOUNCE_MILLIS); - const request = await db.request.getById(requestId); - const settings = await db.settings.getOrCreate(); + const request = await models.request.getById(requestId); + const settings = await models.settings.getOrCreate(); let renderedRequest; @@ -202,7 +202,7 @@ export async function send (requestId, environmentId) { renderedRequest = await getRenderedRequest(request, environmentId); } catch (e) { // Failed to render. Must be the user's fault - return await db.response.create({ + return await models.response.create({ parentId: request._id, statusCode: STATUS_CODE_PEBKAC, error: e.message diff --git a/app/backend/render.js b/app/backend/render.js index 8bc8d32dbd..c5a27fb83d 100644 --- a/app/backend/render.js +++ b/app/backend/render.js @@ -1,8 +1,9 @@ import nunjucks from 'nunjucks'; import traverse from 'traverse'; import uuid from 'node-uuid'; -import * as db from './database'; +import * as models from './models'; import {getBasicAuthHeader, hasAuthHeader, setDefaultProtocol} from './util'; +import * as db from './database'; const nunjucksEnvironment = nunjucks.configure({ autoescape: false @@ -110,11 +111,11 @@ export function recursiveRender (obj, context) { export async function getRenderedRequest (request, environmentId) { const ancestors = await db.withAncestors(request); - const workspace = ancestors.find(doc => doc.type === db.workspace.type); + const workspace = ancestors.find(doc => doc.type === models.workspace.type); - const rootEnvironment = await db.environment.getOrCreateForWorkspace(workspace); - const subEnvironment = await db.environment.getById(environmentId); - const cookieJar = await db.cookieJar.getOrCreateForWorkspace(workspace); + const rootEnvironment = await models.environment.getOrCreateForWorkspace(workspace); + const subEnvironment = await models.environment.getById(environmentId); + const cookieJar = await models.cookieJar.getOrCreateForWorkspace(workspace); // Generate the context we need to render const renderContext = buildRenderContext( diff --git a/app/sync/index.js b/app/sync/index.js index ac6cc44819..554de7d416 100644 --- a/app/sync/index.js +++ b/app/sync/index.js @@ -1,4 +1,5 @@ import * as db from '../backend/database'; +import * as models from '../backend/models'; import * as fetch from '../backend/fetch'; import * as crypt from './crypt'; import * as session from './session'; @@ -12,11 +13,11 @@ export const START_PULL_DELAY = 2E3; export const START_PUSH_DELAY = 1E3; const WHITE_LIST = { - [db.request.type]: true, - [db.requestGroup.type]: true, - [db.workspace.type]: true, - [db.environment.type]: true, - [db.cookieJar.type]: true + [models.request.type]: true, + [models.requestGroup.type]: true, + [models.workspace.type]: true, + [models.environment.type]: true, + [models.cookieJar.type]: true }; export const logger = new Logger(); @@ -28,7 +29,7 @@ const resourceGroupSymmetricKeysCache = {}; let isInitialized = false; export async function initSync () { - const settings = await db.settings.getOrCreate(); + const settings = await models.settings.getOrCreate(); if (!settings.optSyncBeta) { logger.debug('Not enabled'); return; @@ -535,7 +536,7 @@ async function _decryptDoc (resourceGroupId, messageJSON) { async function _getWorkspaceForDoc (doc) { const ancestors = await db.withAncestors(doc); - return ancestors.find(d => d.type === db.workspace.type); + return ancestors.find(d => d.type === models.workspace.type); } async function _createResourceGroup (name = '') { diff --git a/app/ui/components/ResponsePane.js b/app/ui/components/ResponsePane.js index f4b676420a..ddecd366d0 100644 --- a/app/ui/components/ResponsePane.js +++ b/app/ui/components/ResponsePane.js @@ -10,7 +10,7 @@ import PreviewModeDropdown from './dropdowns/PreviewModeDropdown'; import ResponseViewer from './viewers/ResponseViewer'; import ResponseHeadersViewer from './viewers/ResponseHeadersViewer'; import ResponseCookiesViewer from './viewers/ResponseCookiesViewer'; -import * as db from '../../backend/database'; +import * as models from '../../backend/models'; import { getPreviewModeName, PREVIEW_MODE_SOURCE @@ -33,7 +33,7 @@ class ResponsePane extends Component { if (!request) { this.setState({response: null}); } else { - const response = await db.response.getLatestByParentId(request._id); + const response = await models.response.getLatestByParentId(request._id); this.setState({response}); } } diff --git a/app/ui/components/dropdowns/RequestActionsDropdown.js b/app/ui/components/dropdowns/RequestActionsDropdown.js index 4c12be2af9..8685820c87 100644 --- a/app/ui/components/dropdowns/RequestActionsDropdown.js +++ b/app/ui/components/dropdowns/RequestActionsDropdown.js @@ -4,7 +4,7 @@ import Dropdown from '../base/Dropdown'; import DropdownHint from '../base/DropdownHint'; import GenerateCodeModal from '../modals/GenerateCodeModal'; import PromptModal from '../modals/PromptModal'; -import * as db from '../../../backend/database'; +import * as models from '../../../backend/models'; import {showModal} from '../modals/index'; @@ -18,7 +18,7 @@ class RequestActionsDropdown extends Component { hint: 'also rename requests by double clicking in the sidebar' }); - db.request.update(request, {name}); + models.request.update(request, {name}); } render () { @@ -31,7 +31,7 @@ class RequestActionsDropdown extends Component {