diff --git a/Composer/packages/client/src/constants/index.ts b/Composer/packages/client/src/constants/index.ts index 08057005b6..576f2761b6 100644 --- a/Composer/packages/client/src/constants/index.ts +++ b/Composer/packages/client/src/constants/index.ts @@ -66,7 +66,6 @@ export enum ActionTypes { RELOAD_BOT_FAILURE = 'RELOAD_BOT_FAILURE', UPDATE_SKILL_SUCCESS = 'UPDATE_SKILL_SUCCESS', SYNC_ENV_SETTING = 'SYNC_ENV_SETTING', - GET_ENV_SETTING = 'GET_ENV_SETTING', SET_ERROR = 'SET_ERROR', REMOVE_RECENT_PROJECT = 'REMOVE_RECENT_PROJECT', EDITOR_RESET_VISUAL = 'EDITOR_RESET_VISUAL', diff --git a/Composer/packages/client/src/pages/setting/dialog-settings/index.tsx b/Composer/packages/client/src/pages/setting/dialog-settings/index.tsx index e51e2139d3..078065f52b 100644 --- a/Composer/packages/client/src/pages/setting/dialog-settings/index.tsx +++ b/Composer/packages/client/src/pages/setting/dialog-settings/index.tsx @@ -3,17 +3,15 @@ /** @jsx jsx */ import { jsx } from '@emotion/core'; -import { useState, useContext } from 'react'; +import { useContext } from 'react'; import { JsonEditor } from '@bfc/code-editor'; import formatMessage from 'format-message'; -import { ChoiceGroup } from 'office-ui-fabric-react/lib/ChoiceGroup'; import { Link } from 'office-ui-fabric-react/lib/Link'; import { RouteComponentProps } from '@reach/router'; import { StoreContext } from '../../../store'; -import { isAbsHosted } from '../../../utils/envUtil'; -import { hostedSettings, hostedControls, slotChoice, settingsEditor } from './style'; +import { hostedSettings, hostedControls, settingsEditor } from './style'; const hostControlLabels = { showKeys: formatMessage('Show keys'), @@ -28,27 +26,12 @@ const hostControlLabels = { export const DialogSettings: React.FC = () => { const { state, actions } = useContext(StoreContext); - const { botName, settings: origSettings, botEnvironment, projectId } = state; - const absHosted = isAbsHosted(); - const { luis, MicrosoftAppPassword, MicrosoftAppId, ...settings } = origSettings; - const managedSettings = { luis, MicrosoftAppPassword, MicrosoftAppId }; - const visibleSettings = absHosted ? settings : origSettings; - const [slot, setSlot] = useState(botEnvironment === 'editing' ? 'integration' : botEnvironment); - - const slots = [ - { key: 'production', text: hostControlLabels.productionSlot, checked: slot === 'production' }, - { key: 'integration', text: hostControlLabels.integrationSlot, checked: slot === 'integration' }, - ]; - - const changeSlot = (_, option) => { - setSlot(option.key); - actions.setDialogSettingsSlot(projectId, option.key); - }; + const { botName, settings, projectId } = state; const saveChangeResult = (result) => { try { - const mergedResult = absHosted ? { ...managedSettings, ...result } : result; - actions.setSettings(projectId, botName, mergedResult, absHosted ? slot : undefined); + const mergedResult = result; + actions.setSettings(projectId, botName, mergedResult); } catch (err) { // eslint-disable-next-line no-console console.error(err.message); @@ -68,17 +51,12 @@ export const DialogSettings: React.FC = () => { {hostControlLabels.botSettingDescription}   {hostControlLabels.learnMore}

- {absHosted ? : null} ); @@ -86,7 +64,7 @@ export const DialogSettings: React.FC = () => {
{hostedControl()}
- +
) : ( diff --git a/Composer/packages/client/src/pages/setting/dialog-settings/style.ts b/Composer/packages/client/src/pages/setting/dialog-settings/style.ts index 489b7ddbf9..15bf7acfa2 100644 --- a/Composer/packages/client/src/pages/setting/dialog-settings/style.ts +++ b/Composer/packages/client/src/pages/setting/dialog-settings/style.ts @@ -23,10 +23,6 @@ export const hostedControls = css` } `; -export const slotChoice = css` - max-width: 40ch; -`; - export const settingsEditor = css` flex: 1; max-height: 70%; diff --git a/Composer/packages/client/src/store/action/setting.ts b/Composer/packages/client/src/store/action/setting.ts index a8339c0147..03d2257173 100644 --- a/Composer/packages/client/src/store/action/setting.ts +++ b/Composer/packages/client/src/store/action/setting.ts @@ -4,8 +4,6 @@ import { ActionCreator, DialogSetting } from '../types'; import { ActionTypes } from './../../constants/index'; -import { BotEnvironments } from './../../utils/envUtil'; -import httpClient from './../../utils/httpUtil'; export const setSettings: ActionCreator = async ( { dispatch }, @@ -17,31 +15,8 @@ export const setSettings: ActionCreator = async ( type: ActionTypes.SYNC_ENV_SETTING, payload: { projectId, + botName, settings, }, }); }; - -export const setDialogSettingsSlot = async ({ dispatch }, projectId: string, slot?: BotEnvironments) => { - const suffix = slot ? `/${slot}` : ''; - const url = `/projects/${projectId}/settings${suffix}`; - - try { - const response = await httpClient.get(url); - const settings = response.data; - dispatch({ - type: ActionTypes.GET_ENV_SETTING, - payload: { - settings, - }, - }); - } catch (err) { - dispatch({ - type: ActionTypes.SET_ERROR, - payload: { - message: err.response && err.response.data.message ? err.reponse.data.message : err, - summary: 'DLG SETTINGS ERROR', - }, - }); - } -}; diff --git a/Composer/packages/client/src/store/reducer/index.ts b/Composer/packages/client/src/store/reducer/index.ts index ae90331bd7..e98ab0f3b5 100644 --- a/Composer/packages/client/src/store/reducer/index.ts +++ b/Composer/packages/client/src/store/reducer/index.ts @@ -428,8 +428,7 @@ const dismissSkillManifestModal: ReducerFunc = (state) => { return state; }; -const syncEnvSetting: ReducerFunc = (state, { settings }) => { - const { botName } = state; +const syncEnvSetting: ReducerFunc = (state, { settings, botName }) => { // set value in local storage for (const property of SensitiveProperties) { if (has(settings, property)) { @@ -441,13 +440,6 @@ const syncEnvSetting: ReducerFunc = (state, { settings }) => { return state; }; -const getEnvSetting: ReducerFunc = (state, { settings }) => { - state.settings = settings; - refreshLocalStorage(state.botName, state.settings); - mergeLocalStorage(state.botName, state.settings); - return state; -}; - const setTemplateProjects: ReducerFunc = (state, { response } = {}) => { const data = response && response.data; @@ -677,7 +669,6 @@ export const reducer = createReducer({ [ActionTypes.REMOVE_SKILL_MANIFEST]: removeSkillManifest, [ActionTypes.UPDATE_SKILL_MANIFEST]: updateSkillManifest, [ActionTypes.SYNC_ENV_SETTING]: syncEnvSetting, - [ActionTypes.GET_ENV_SETTING]: getEnvSetting, [ActionTypes.USER_LOGIN_SUCCESS]: setUserToken, [ActionTypes.USER_LOGIN_FAILURE]: setUserToken, // will be invoked with token = undefined [ActionTypes.USER_SESSION_EXPIRED]: setUserSessionExpired, diff --git a/Composer/packages/server/__tests__/controllers/project.test.ts b/Composer/packages/server/__tests__/controllers/project.test.ts index 9b9d1e6f83..40a8fce8df 100644 --- a/Composer/packages/server/__tests__/controllers/project.test.ts +++ b/Composer/packages/server/__tests__/controllers/project.test.ts @@ -272,48 +272,3 @@ describe('lu operation', () => { expect(mockRes.status).toHaveBeenCalledWith(200); }); }); - -describe('setting operation', () => { - const defaultSetting = { - MicrosoftAppId: '', - luis: { - name: 'test', - authoringRegion: 'westus', - defaultLanguage: 'en-us', - environment: 'composer', - }, - qna: { - knowledgebaseid: '', - endpointkey: '', - hostname: '', - }, - downsampling: { - maxImbalanceRatio: 10, - maxUtteranceAllowed: 15000, - }, - }; - let projectId = ''; - beforeEach(async () => { - projectId = await BotProjectService.openProject(location2); - }); - it('should update default setting', async () => { - const mockReq = { - params: { projectId }, - query: {}, - body: { settings: defaultSetting }, - } as Request; - - await ProjectController.updateDefaultSlotEnvSettings(mockReq, mockRes); - expect(mockRes.send).toHaveBeenCalledWith('ok'); - }); - - it('should update default setting', async () => { - const mockReq = { - params: { projectId }, - query: { obfuscate: false }, - } as Request; - - await ProjectController.getDefaultSlotEnvSettings(mockReq, mockRes); - expect(mockRes.send).toHaveBeenCalledWith(defaultSetting); - }); -}); diff --git a/Composer/packages/server/__tests__/models/settings/fileSettingManager.test.ts b/Composer/packages/server/__tests__/models/settings/fileSettingManager.test.ts index b051ea1c2e..1aa933d10c 100644 --- a/Composer/packages/server/__tests__/models/settings/fileSettingManager.test.ts +++ b/Composer/packages/server/__tests__/models/settings/fileSettingManager.test.ts @@ -10,13 +10,13 @@ const defaultDir = Path.join(__dirname, dir); describe('get', () => { it('return values', async () => { const sm = new FileSettingManager(defaultDir); - const result = await sm.get('', false); + const result = await sm.get(false); expect(result.label).toBe('default'); }); it('return obfuscated alues', async () => { const sm = new FileSettingManager(defaultDir); - const result = await sm.get('', true); + const result = await sm.get(true); expect(result.label).toBe('*****'); expect(result.mock1).toBe('*****'); expect(result.mock2).toBe('*****'); @@ -25,14 +25,4 @@ describe('get', () => { expect(result.mock3.mock5[0]).toBe('*****'); expect(result.mock3.mock5[1]).toBe('*****'); }); - - it('return slot values', async () => { - const sm = new FileSettingManager(defaultDir); - const result = await sm.get('integration', false); - expect(result.label).toBe('integration'); - const result2 = await sm.get('production', false); - expect(result2.label).toBe('production'); - const result3 = await sm.get('bonus', false); - expect(result3.label).toBe('bonus'); - }); }); diff --git a/Composer/packages/server/__tests__/models/settings/hostedSettingManager.test.ts b/Composer/packages/server/__tests__/models/settings/hostedSettingManager.test.ts deleted file mode 100644 index 6a511c0672..0000000000 --- a/Composer/packages/server/__tests__/models/settings/hostedSettingManager.test.ts +++ /dev/null @@ -1,22 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { HostedSettingManager } from '../../../src/models/settings/hostedSettingManager'; -import { Path } from '../../../src/utility/path'; - -const dir = './mocks'; -const defaultDir = Path.join(__dirname, dir); - -describe('get', () => { - it('throws with invalid slot name', async () => { - const sm = new HostedSettingManager(defaultDir); - let threw = false; - try { - await sm.get('bad', true); - } catch (x) { - threw = true; - } - - expect(threw).toBeTruthy(); - }); -}); diff --git a/Composer/packages/server/src/controllers/project.ts b/Composer/packages/server/src/controllers/project.ts index 0489c5e3ea..e49915caac 100644 --- a/Composer/packages/server/src/controllers/project.ts +++ b/Composer/packages/server/src/controllers/project.ts @@ -252,48 +252,6 @@ async function removeFile(req: Request, res: Response) { } } -async function getDefaultSlotEnvSettings(req: Request, res: Response) { - const projectId = req.params.projectId; - const user = await PluginLoader.getUserFromRequest(req); - - const currentProject = await BotProjectService.getProjectById(projectId, user); - if (currentProject !== undefined) { - try { - const settings = await currentProject.getDefaultSlotEnvSettings(req.query.obfuscate); - res.send(settings); - } catch (err) { - res.status(404).json({ - message: err.message, - }); - } - } else { - res.status(404).json({ - message: 'No such bot project opened', - }); - } -} - -async function getEnvSettings(req: Request, res: Response) { - const projectId = req.params.projectId; - const user = await PluginLoader.getUserFromRequest(req); - - const currentProject = await BotProjectService.getProjectById(projectId, user); - if (currentProject !== undefined) { - try { - const settings = await currentProject.getEnvSettings(req.params.slot, req.query.obfuscate); - res.send(settings); - } catch (err) { - res.status(404).json({ - message: err.message, - }); - } - } else { - res.status(404).json({ - message: 'No such bot project opened', - }); - } -} - async function updateSkill(req: Request, res: Response) { const projectId = req.params.projectId; const user = await PluginLoader.getUserFromRequest(req); @@ -349,48 +307,6 @@ async function exportProject(req: Request, res: Response) { }); } -async function updateEnvSettings(req: Request, res: Response) { - const projectId = req.params.projectId; - const user = await PluginLoader.getUserFromRequest(req); - - const currentProject = await BotProjectService.getProjectById(projectId, user); - if (currentProject !== undefined) { - try { - await currentProject.updateEnvSettings(req.params.slot, req.body.settings); - res.send('ok'); - } catch (err) { - res.status(404).json({ - message: err.message, - }); - } - } else { - res.status(404).json({ - message: 'No such bot project opened', - }); - } -} - -async function updateDefaultSlotEnvSettings(req: Request, res: Response) { - const projectId = req.params.projectId; - const user = await PluginLoader.getUserFromRequest(req); - - const currentProject = await BotProjectService.getProjectById(projectId, user); - if (currentProject !== undefined) { - try { - await currentProject.updateDefaultSlotEnvSettings(req.body.settings); - res.send('ok'); - } catch (err) { - res.status(404).json({ - message: err.message, - }); - } - } else { - res.status(404).json({ - message: 'No such bot project opened', - }); - } -} - async function publishLuis(req: Request, res: Response) { const projectId = req.params.projectId; const user = await PluginLoader.getUserFromRequest(req); @@ -437,10 +353,6 @@ export const ProjectController = { updateFile, createFile, removeFile, - getEnvSettings, - getDefaultSlotEnvSettings, - updateEnvSettings, - updateDefaultSlotEnvSettings, updateSkill, getSkill, publishLuis, diff --git a/Composer/packages/server/src/models/bot/botProject.ts b/Composer/packages/server/src/models/bot/botProject.ts index b348469df0..dc3e725e9a 100644 --- a/Composer/packages/server/src/models/bot/botProject.ts +++ b/Composer/packages/server/src/models/bot/botProject.ts @@ -87,7 +87,7 @@ export class BotProject { public init = async () => { this.diagnostics = []; - this.settings = await this.getEnvSettings('', false); + this.settings = await this.getEnvSettings(false); const { skillsParsed, diagnostics } = await extractSkillManifestUrl(this.settings?.skill || []); this.skills = skillsParsed; this.diagnostics.push(...diagnostics); @@ -108,12 +108,11 @@ export class BotProject { }; public getDefaultSlotEnvSettings = async (obfuscate: boolean) => { - const defaultSlot = ''; - return await this.settingManager.get(defaultSlot, obfuscate); + return await this.settingManager.get(obfuscate); }; - public getEnvSettings = async (slot: string, obfuscate: boolean) => { - const settings = await this.settingManager.get(slot, obfuscate); + public getEnvSettings = async (obfuscate: boolean) => { + const settings = await this.settingManager.get(obfuscate); if (settings && oauthInput().MicrosoftAppId && oauthInput().MicrosoftAppId !== OBFUSCATED_VALUE) { settings.MicrosoftAppId = oauthInput().MicrosoftAppId; } @@ -124,25 +123,24 @@ export class BotProject { }; public updateDefaultSlotEnvSettings = async (config: DialogSetting) => { - const defaultSlot = ''; - await this.updateEnvSettings(defaultSlot, config); + await this.updateEnvSettings(config); }; // create or update dialog settings - public updateEnvSettings = async (slot: string, config: DialogSetting) => { - await this.settingManager.set(slot, config); + public updateEnvSettings = async (config: DialogSetting) => { + await this.settingManager.set(config); this.settings = config; }; // update skill in settings public updateSkill = async (config: Skill[]) => { - const settings = await this.getEnvSettings('', false); + const settings = await this.getEnvSettings(false); const { skillsParsed } = await extractSkillManifestUrl(config); settings.skill = skillsParsed.map(({ manifestUrl, name }) => { return { manifestUrl, name }; }); - await this.settingManager.set('', settings); + await this.settingManager.set(settings); this.skills = skillsParsed; return skillsParsed; diff --git a/Composer/packages/server/src/models/settings/defaultSettingManager.ts b/Composer/packages/server/src/models/settings/defaultSettingManager.ts index 393cf96fbb..a9c9fd1068 100644 --- a/Composer/packages/server/src/models/settings/defaultSettingManager.ts +++ b/Composer/packages/server/src/models/settings/defaultSettingManager.ts @@ -56,8 +56,8 @@ export class DefaultSettingManager extends FileSettingManager { }; }; - public async get(slot = '', obfuscate = false): Promise { - const result = await super.get(slot, obfuscate); + public async get(obfuscate = false): Promise { + const result = await super.get(obfuscate); //add downsampling property for old bot if (!result.downsampling) { result.downsampling = this.createDefaultSettings().downsampling; @@ -74,10 +74,8 @@ export class DefaultSettingManager extends FileSettingManager { } }; - public set = async (slot: string, settings: any): Promise => { - this.validateSlot(slot); - - const path = this.getPath(slot); + public set = async (settings: any): Promise => { + const path = this.getPath(); const dir = Path.dirname(path); if (!(await this.storage.exists(dir))) { debug('Storage path does not exist. Creating directory now: %s', dir); diff --git a/Composer/packages/server/src/models/settings/fileSettingManager.ts b/Composer/packages/server/src/models/settings/fileSettingManager.ts index bc3c3091b3..71b637b284 100644 --- a/Composer/packages/server/src/models/settings/fileSettingManager.ts +++ b/Composer/packages/server/src/models/settings/fileSettingManager.ts @@ -26,23 +26,21 @@ export class FileSettingManager implements ISettingManager { this.storage = StorageService.getStorageClient('default', user); } - public async get(slot = '', obfuscate = false): Promise { - this.validateSlot(slot); - - const path = this.getPath(slot); - const settings = await this._getFromStorage(path, slot); + public async get(obfuscate = false): Promise { + const path = this.getPath(); + const settings = await this._getFromStorage(path); return obfuscate ? this.obfuscateValues(settings) : settings; } - private _getFromStorage = async (path: string, slot: string) => { + private _getFromStorage = async (path: string) => { if (await this.storage.exists(path)) { const file = await this.storage.readFile(path); return JSON.parse(file); } else { // does not have setting file, return default value const defaultValue = this.createDefaultSettings(); - await this.set(slot, defaultValue); + await this.set(defaultValue); return defaultValue; } }; @@ -51,10 +49,8 @@ export class FileSettingManager implements ISettingManager { return {}; }; - public set = async (slot: string, settings: any): Promise => { - this.validateSlot(slot); - - const path = this.getPath(slot); + public set = async (settings: any): Promise => { + const path = this.getPath(); const dir = Path.dirname(path); if (!(await this.storage.exists(dir))) { @@ -86,13 +82,7 @@ export class FileSettingManager implements ISettingManager { return OBFUSCATED_VALUE; }; - protected validateSlot = (_: string): void => {}; - - protected getPath = (slot: string): string => { - if (slot && slot.length > 0) { - return Path.join(this.basePath, slot, subPath); - } else { - return Path.join(this.basePath, subPath); - } + protected getPath = (): string => { + return Path.join(this.basePath, subPath); }; } diff --git a/Composer/packages/server/src/models/settings/hostedSettingManager.ts b/Composer/packages/server/src/models/settings/hostedSettingManager.ts deleted file mode 100644 index 7ef9a18aa8..0000000000 --- a/Composer/packages/server/src/models/settings/hostedSettingManager.ts +++ /dev/null @@ -1,33 +0,0 @@ -// Copyright (c) Microsoft Corporation. -// Licensed under the MIT License. - -import { UserIdentity } from '@bfc/plugin-loader'; - -import { FileSettingManager } from './fileSettingManager'; - -export class HostedSettingManager extends FileSettingManager { - constructor(basePath: string, user?: UserIdentity) { - super(basePath, user); - } - - protected createDefaultSettings = (): any => { - return { - MicrosoftAppPassword: '', - MicrosoftAppId: '', - luis: { - name: '', - authoringKey: '', - endpointKey: '', - authoringRegion: 'westus', - defaultLanguage: 'en-us', - environment: 'composer', - }, - }; - }; - - protected validateSlot = (slot: string): void => { - if (slot !== 'integration' && slot !== 'production') { - throw new Error(`Unknown slot name: ${slot}.`); - } - }; -} diff --git a/Composer/packages/server/src/models/settings/interface.ts b/Composer/packages/server/src/models/settings/interface.ts index 869b1b0f9d..d0da7c0fb2 100644 --- a/Composer/packages/server/src/models/settings/interface.ts +++ b/Composer/packages/server/src/models/settings/interface.ts @@ -4,7 +4,7 @@ export const OBFUSCATED_VALUE = '*****'; export interface ISettingManager { - get(slot?: string, obfuscate?: boolean): Promise; - set(slot: string, settings: any): Promise; + get(obfuscate?: boolean): Promise; + set(settings: any): Promise; getFileName: () => string; } diff --git a/Composer/packages/server/src/router/api.ts b/Composer/packages/server/src/router/api.ts index 536d7bf499..ea629645bc 100644 --- a/Composer/packages/server/src/router/api.ts +++ b/Composer/packages/server/src/router/api.ts @@ -21,9 +21,6 @@ router.delete('/projects/:projectId', ProjectController.removeProject); router.put('/projects/:projectId/files/:name', ProjectController.updateFile); router.delete('/projects/:projectId/files/:name', ProjectController.removeFile); router.post('/projects/:projectId/files', ProjectController.createFile); -router.get('/projects/:projectId/settings', ProjectController.getDefaultSlotEnvSettings); // ?obfuscate= -router.get('/projects/:projectId/settings/:slot', ProjectController.getEnvSettings); // ?obfuscate= -router.post('/projects/:projectId/settings/:slot', ProjectController.updateEnvSettings); router.post('/projects/:projectId/skills', ProjectController.updateSkill); router.post('/projects/:projectId/skill/check', ProjectController.getSkill); router.post('/projects/:projectId/luFiles/publish', ProjectController.publishLuis);