From 88ec0b5313e8b77df470dfaa119d6a15610c132a Mon Sep 17 00:00:00 2001 From: Alex Grozav Date: Thu, 28 Apr 2022 13:11:44 +0300 Subject: [PATCH] :sparkles: Added api key setup view. --- packages/editor-ui/src/api/api-keys.ts | 14 ++ packages/editor-ui/src/api/settings.ts | 2 +- .../src/components/SettingsSidebar.vue | 6 + packages/editor-ui/src/constants.ts | 1 + .../src/plugins/i18n/locales/en.json | 12 ++ packages/editor-ui/src/plugins/icons.ts | 2 + packages/editor-ui/src/router.ts | 18 +++ .../editor-ui/src/views/SettingsApiView.vue | 124 ++++++++++++++++++ 8 files changed, 178 insertions(+), 1 deletion(-) create mode 100644 packages/editor-ui/src/api/api-keys.ts create mode 100644 packages/editor-ui/src/views/SettingsApiView.vue diff --git a/packages/editor-ui/src/api/api-keys.ts b/packages/editor-ui/src/api/api-keys.ts new file mode 100644 index 0000000000..9d0a03660a --- /dev/null +++ b/packages/editor-ui/src/api/api-keys.ts @@ -0,0 +1,14 @@ +import {IRestApiContext} from "@/Interface"; +import {makeRestApiRequest} from "@/api/helpers"; + +export function getApiKey(context: IRestApiContext): Promise<{ apiKey: string | null }> { + return makeRestApiRequest(context, 'GET', '/me/api-key'); +} + +export function createApiKey(context: IRestApiContext): Promise<{ apiKey: string | null }> { + return makeRestApiRequest(context, 'POST', '/users/me/api-key'); +} + +export function deleteApiKey(context: IRestApiContext): Promise<{ success: boolean }> { + return makeRestApiRequest(context, 'DELETE', '/me/api-key'); +} diff --git a/packages/editor-ui/src/api/settings.ts b/packages/editor-ui/src/api/settings.ts index f61814a737..2be67dbab3 100644 --- a/packages/editor-ui/src/api/settings.ts +++ b/packages/editor-ui/src/api/settings.ts @@ -1,4 +1,4 @@ -import { IRestApiContext, IN8nPrompts, IN8nValueSurveyData, IN8nUISettings } from '../Interface'; +import {IRestApiContext, IN8nPrompts, IN8nValueSurveyData, IN8nUISettings} from '../Interface'; import { makeRestApiRequest, get, post } from './helpers'; import { N8N_IO_BASE_URL } from '@/constants'; diff --git a/packages/editor-ui/src/components/SettingsSidebar.vue b/packages/editor-ui/src/components/SettingsSidebar.vue index 55cf95c043..da15882587 100644 --- a/packages/editor-ui/src/components/SettingsSidebar.vue +++ b/packages/editor-ui/src/components/SettingsSidebar.vue @@ -19,6 +19,12 @@ {{ $locale.baseText('settings.users') }} + + + + + {{ $locale.baseText('settings.api') }} +
diff --git a/packages/editor-ui/src/constants.ts b/packages/editor-ui/src/constants.ts index f6df9933fd..8d7f09e806 100644 --- a/packages/editor-ui/src/constants.ts +++ b/packages/editor-ui/src/constants.ts @@ -234,5 +234,6 @@ export enum VIEWS { CHANGE_PASSWORD = "ChangePasswordView", USERS_SETTINGS = "UsersSettings", PERSONAL_SETTINGS = "PersonalSettings", + API_SETTINGS = "APISettings", NOT_FOUND = "NotFoundView", } diff --git a/packages/editor-ui/src/plugins/i18n/locales/en.json b/packages/editor-ui/src/plugins/i18n/locales/en.json index 07d529d4c0..352b189b12 100644 --- a/packages/editor-ui/src/plugins/i18n/locales/en.json +++ b/packages/editor-ui/src/plugins/i18n/locales/en.json @@ -647,6 +647,18 @@ "settings.users.usersEmailedError": "Couldn't send invite email", "settings.users.usersInvited": "Users invited", "settings.users.usersInvitedError": "Could not invite users", + "settings.api": "API", + "settings.api.create.title": "Set up your API Key", + "settings.api.create.description": "You can use API keys for accessing n8n's", + "settings.api.create.description.link": "REST API", + "settings.api.create.button": "Create an API Key", + "settings.api.create.button.loading": "Creating API Key...", + "settings.api.error.title": "Something went wrong", + "settings.api.error.get": "Could not check if an api key already exists.", + "settings.api.error.create": "Creating the API Key failed.", + "settings.api.error.delete": "Deleting the API Key failed.", + "settings.api.view.info": "Use your API Key to access n8n's REST API to build your own integrations.", + "settings.api.view.myKey": "My API Key", "settings.version": "Version", "showMessage.cancel": "@:_reusableBaseText.cancel", "showMessage.ok": "OK", diff --git a/packages/editor-ui/src/plugins/icons.ts b/packages/editor-ui/src/plugins/icons.ts index 2363b46afc..8047e64c61 100644 --- a/packages/editor-ui/src/plugins/icons.ts +++ b/packages/editor-ui/src/plugins/icons.ts @@ -64,6 +64,7 @@ import { faPencilAlt, faPlay, faPlayCircle, + faPlug, faPlus, faPlusCircle, faPlusSquare, @@ -166,6 +167,7 @@ addIcon(faPen); addIcon(faPencilAlt); addIcon(faPlay); addIcon(faPlayCircle); +addIcon(faPlug); addIcon(faPlus); addIcon(faPlusCircle); addIcon(faPlusSquare); diff --git a/packages/editor-ui/src/router.ts b/packages/editor-ui/src/router.ts index 18c3c61a31..331e3e1128 100644 --- a/packages/editor-ui/src/router.ts +++ b/packages/editor-ui/src/router.ts @@ -8,6 +8,7 @@ import MainSidebar from '@/components/MainSidebar.vue'; import NodeView from '@/views/NodeView.vue'; import SettingsPersonalView from './views/SettingsPersonalView.vue'; import SettingsUsersView from './views/SettingsUsersView.vue'; +import SettingsApiView from './views/SettingsApiView.vue'; import SetupView from './views/SetupView.vue'; import SigninView from './views/SigninView.vue'; import SignupView from './views/SignupView.vue'; @@ -360,6 +361,23 @@ const router = new Router({ }, }, }, + { + path: '/settings/api', + name: VIEWS.API_SETTINGS, + components: { + default: SettingsApiView, + }, + meta: { + telemetry: { + pageCategory: 'settings', + }, + permissions: { + allow: { + loginStatus: [LOGIN_STATUS.LoggedIn], + }, + }, + }, + }, { path: '*', name: VIEWS.NOT_FOUND, diff --git a/packages/editor-ui/src/views/SettingsApiView.vue b/packages/editor-ui/src/views/SettingsApiView.vue new file mode 100644 index 0000000000..750b77d1af --- /dev/null +++ b/packages/editor-ui/src/views/SettingsApiView.vue @@ -0,0 +1,124 @@ + + + + + +