From 99b75213e06b9146f4ebfff287c9f15f69ba4891 Mon Sep 17 00:00:00 2001 From: Opender Singh Date: Tue, 2 Feb 2021 16:02:17 +1300 Subject: [PATCH] Add migration for workspace scope and apply defaults (#3031) --- .../app/models/__tests__/workspace.test.js | 21 +++++++++++ packages/insomnia-app/app/models/workspace.js | 36 ++++++++++++++++--- .../plugins/context/__tests__/data.test.js | 6 ++-- .../dropdowns/document-card-dropdown.js | 2 +- .../dropdowns/workspace-dropdown.js | 2 +- .../app/ui/components/wrapper-home.js | 4 +-- 6 files changed, 59 insertions(+), 12 deletions(-) diff --git a/packages/insomnia-app/app/models/__tests__/workspace.test.js b/packages/insomnia-app/app/models/__tests__/workspace.test.js index a7939f20f4..ff05a950d7 100644 --- a/packages/insomnia-app/app/models/__tests__/workspace.test.js +++ b/packages/insomnia-app/app/models/__tests__/workspace.test.js @@ -69,4 +69,25 @@ describe('migrate()', () => { expect(spec).not.toBe(null); expect(spec.fileName).toBe(workspace.name); }); + + it('translates the scope correctly', async () => { + const specW = await models.workspace.create({ scope: 'spec' }); + const debugW = await models.workspace.create({ scope: 'debug' }); + const nullW = await models.workspace.create({ scope: null }); + const somethingElseW = await models.workspace.create({ scope: 'something' }); + const designerW = await models.workspace.create({ scope: 'designer' }); + const collectionW = await models.workspace.create({ scope: 'collection' }); + + await models.workspace.migrate(specW); + await models.workspace.migrate(debugW); + await models.workspace.migrate(nullW); + await models.workspace.migrate(somethingElseW); + + expect(specW.scope).toBe('designer'); + expect(debugW.scope).toBe('collection'); + expect(nullW.scope).toBe('collection'); + expect(somethingElseW.scope).toBe('collection'); + expect(designerW.scope).toBe('designer'); + expect(collectionW.scope).toBe('collection'); + }); }); diff --git a/packages/insomnia-app/app/models/workspace.js b/packages/insomnia-app/app/models/workspace.js index 4b2f61d0fc..f0c15c35cd 100644 --- a/packages/insomnia-app/app/models/workspace.js +++ b/packages/insomnia-app/app/models/workspace.js @@ -2,8 +2,7 @@ import type { BaseModel } from './index'; import * as models from './index'; import * as db from '../common/database'; -import { getAppId, getAppName } from '../common/constants'; -import { APP_ID_DESIGNER } from '../../config'; +import { getAppName } from '../common/constants'; export const name = 'Workspace'; export const type = 'Workspace'; @@ -14,7 +13,7 @@ export const canSync = true; type BaseWorkspace = { name: string, description: string, - scope: 'spec' | 'debug' | null, + scope: 'designer' | 'collection', }; export type Workspace = BaseModel & BaseWorkspace; @@ -23,7 +22,7 @@ export function init() { return { name: 'New Workspace', description: '', - scope: null, + scope: 'collection', }; } @@ -31,6 +30,7 @@ export async function migrate(doc: Workspace): Promise { doc = await _migrateExtractClientCertificates(doc); doc = await _migrateEnsureName(doc); await models.apiSpec.getOrCreateForParentId(doc._id, { fileName: doc.name }); + doc = _migrateScope(doc); return doc; } @@ -46,7 +46,8 @@ export async function all(): Promise> { const workspaces = await db.all(type); if (workspaces.length === 0) { - await create({ name: getAppName(), scope: getAppId() === APP_ID_DESIGNER ? 'spec' : null }); + // Create default workspace + await create({ name: getAppName(), scope: 'collection' }); return all(); } else { return workspaces; @@ -105,3 +106,28 @@ async function _migrateEnsureName(workspace: Workspace): Promise { return workspace; } + +/** + * Ensure workspace scope is set to a valid entry + */ +function _migrateScope(workspace: Workspace): Workspace { + if (workspace.scope === 'designer' || workspace.scope === 'collection') { + return workspace; + } + + // Translate the old value + type OldScopeTypes = 'spec' | 'debug' | null; + switch ((workspace.scope: OldScopeTypes)) { + case 'spec': { + workspace.scope = 'designer'; + break; + } + case 'debug': + case null: + default: + workspace.scope = 'collection'; + break; + } + + return workspace; +} diff --git a/packages/insomnia-app/app/plugins/context/__tests__/data.test.js b/packages/insomnia-app/app/plugins/context/__tests__/data.test.js index 6faf5546b7..7f80faec5d 100644 --- a/packages/insomnia-app/app/plugins/context/__tests__/data.test.js +++ b/packages/insomnia-app/app/plugins/context/__tests__/data.test.js @@ -54,7 +54,7 @@ describe('app.import.*', () => { name: 'New', parentId: null, type: 'Workspace', - scope: null, + scope: 'collection', }, ]); expect(await db.all(models.request.type)).toEqual([ @@ -105,7 +105,7 @@ describe('app.import.*', () => { name: 'New', parentId: null, type: 'Workspace', - scope: null, + scope: 'collection', }, ]); expect(await db.all(models.request.type)).toEqual([ @@ -182,7 +182,7 @@ describe('app.export.*', () => { modified: 222, name: 'New Workspace', parentId: null, - scope: null, + scope: 'collection', }, { _id: 'req_1', diff --git a/packages/insomnia-app/app/ui/components/dropdowns/document-card-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/document-card-dropdown.js index a42efbc608..965b235900 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/document-card-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/document-card-dropdown.js @@ -94,7 +94,7 @@ class DocumentCardDropdown extends React.PureComponent { } if (isLastWorkspace) { - await models.workspace.create({ name: getAppName(), scope: 'spec' }); + await models.workspace.create({ name: getAppName(), scope: 'designer' }); } await models.stats.incrementDeletedRequestsForDescendents(workspace); diff --git a/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js b/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js index 741d6b5544..1392c5768b 100644 --- a/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js +++ b/packages/insomnia-app/app/ui/components/dropdowns/workspace-dropdown.js @@ -220,7 +220,7 @@ class WorkspaceDropdown extends React.PureComponent { submitName: 'Create', selectText: true, onComplete: async name => { - const workspace = await models.workspace.create({ name }); + const workspace = await models.workspace.create({ name, scope: 'collection' }); this.props.handleSetActiveWorkspace(workspace._id); }, }); diff --git a/packages/insomnia-app/app/ui/components/wrapper-home.js b/packages/insomnia-app/app/ui/components/wrapper-home.js index 562b7c16c9..77eb2e04f6 100644 --- a/packages/insomnia-app/app/ui/components/wrapper-home.js +++ b/packages/insomnia-app/app/ui/components/wrapper-home.js @@ -82,7 +82,7 @@ class WrapperHome extends React.PureComponent { onComplete: async name => { await models.workspace.create({ name, - scope: 'spec', + scope: 'designer', }); trackEvent('Workspace', 'Create'); @@ -353,7 +353,7 @@ class WrapperHome extends React.PureComponent { let label: string = 'Insomnia'; let defaultActivity = ACTIVITY_DEBUG; - if (spec || w.scope === 'spec') { + if (spec || w.scope === 'designer') { label = ''; if (specFormat === 'openapi') { label = `OpenAPI ${specFormatVersion}`;