diff --git a/bun.lock b/bun.lock index 10ce13d787..3e2c925ae5 100644 --- a/bun.lock +++ b/bun.lock @@ -6,7 +6,7 @@ "name": "@appwrite/console", "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@33968aa", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", @@ -124,7 +124,7 @@ "@analytics/type-utils": ["@analytics/type-utils@0.6.4", "", {}, "sha512-Ou1gQxFakOWLcPnbFVsrPb8g1wLLUZYYJXDPjHkG07+5mustGs5yqACx42UAu4A6NszNN6Z5gGxhyH45zPWRxw=="], - "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@33968aa", { "dependencies": { "json-bigint": "1.0.0" } }], "@appwrite.io/pink-icons": ["@appwrite.io/pink-icons@0.25.0", "", {}, "sha512-0O3i2oEuh5mWvjO80i+X6rbzrWLJ1m5wmv2/M3a1p2PyBJsFxN8xQMTEmTn3Wl/D26SsM7SpzbdW6gmfgoVU9Q=="], diff --git a/package.json b/package.json index a006833186..a18b34eaa6 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,7 @@ }, "dependencies": { "@ai-sdk/svelte": "^1.1.24", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@88c189e", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@33968aa", "@appwrite.io/pink-icons": "0.25.0", "@appwrite.io/pink-icons-svelte": "https://pkg.vc/-/@appwrite/@appwrite.io/pink-icons-svelte@bfe7ce3", "@appwrite.io/pink-legacy": "^1.0.3", diff --git a/src/lib/components/organizationUsageLimits.svelte b/src/lib/components/organizationUsageLimits.svelte index 39ae9a1ea3..8373b17b36 100644 --- a/src/lib/components/organizationUsageLimits.svelte +++ b/src/lib/components/organizationUsageLimits.svelte @@ -90,10 +90,14 @@ } if (selectedProjectsToDelete?.length) { - const projectsDeletionPromises = selectedProjectsToDelete.map((projectId) => ({ - projectId, - promise: sdk.forConsole.projects.delete({ projectId }) - })); + const projectsDeletionPromises = selectedProjectsToDelete.map((projectId) => { + const projectToDelete = projects.find((project) => project.$id === projectId); + + return { + projectId, + promise: sdk.forProject(projectToDelete.region, projectId).project.delete() + }; + }); try { const results = await Promise.allSettled( diff --git a/src/lib/constants.ts b/src/lib/constants.ts index be661eefb5..d917925ae6 100644 --- a/src/lib/constants.ts +++ b/src/lib/constants.ts @@ -112,8 +112,8 @@ export const defaultScopes: string[] = [ 'projects.write', 'locale.read', 'avatars.read', - 'execution.read', - 'execution.write', + 'executions.read', + 'executions.write', 'targets.read', 'targets.write', 'subscribers.write', @@ -339,17 +339,31 @@ export const scopes: ScopeDefinition[] = [ icon: 'lightning-bolt' }, { - scope: 'execution.read', + scope: 'executions.read', description: "Access to read your project's execution logs", category: 'Functions', icon: 'lightning-bolt' }, { - scope: 'execution.write', + scope: 'executions.write', description: "Access to execute your project's functions", category: 'Functions', icon: 'lightning-bolt' }, + { + scope: 'execution.read', + description: "Access to read your project's execution logs", + category: 'Functions', + icon: 'lightning-bolt', + deprecated: true + }, + { + scope: 'execution.write', + description: "Access to execute your project's functions", + category: 'Functions', + icon: 'lightning-bolt', + deprecated: true + }, { scope: 'targets.read', description: "Access to read your project's messaging targets", diff --git a/src/lib/stores/oauth-providers.ts b/src/lib/stores/oauth-providers.ts index 11191dbaf9..1a2143a178 100644 --- a/src/lib/stores/oauth-providers.ts +++ b/src/lib/stores/oauth-providers.ts @@ -1,13 +1,5 @@ import type { Component } from 'svelte'; -import Apple from '$routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte'; -import Auth0 from '$routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte'; -import Authentik from '$routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte'; -import GitLab from '$routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte'; -import Google from '$routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte'; import Main from '$routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte'; -import Microsoft from '$routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte'; -import Oidc from '$routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte'; -import Okta from '$routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte'; export type Provider = { name: string; @@ -28,19 +20,19 @@ export const oAuthProviders: Record = { name: 'Apple', icon: 'apple', docs: 'https://developer.apple.com/sign-in-with-apple/', - component: Apple + component: Main }, auth0: { name: 'Auth0', icon: 'auth0', docs: 'https://auth0.com/developers', - component: Auth0 + component: Main }, authentik: { name: 'Authentik', icon: 'authentik', docs: 'https://goauthentik.io/integrations/sources/oauth/', - component: Authentik + component: Main }, autodesk: { name: 'Autodesk', @@ -108,6 +100,12 @@ export const oAuthProviders: Record = { docs: 'https://www.figma.com/developers/api#access-tokens', component: Main }, + fusionauth: { + name: 'FusionAuth', + icon: 'fusionauth', + docs: 'https://fusionauth.io/docs/apis/identity-providers/oauth2', + component: Main + }, github: { name: 'GitHub', icon: 'github', @@ -125,21 +123,33 @@ export const oAuthProviders: Record = { name: 'GitLab', icon: 'gitlab', docs: 'https://docs.gitlab.com/ee/api/', - component: GitLab + component: Main }, google: { name: 'Google', icon: 'google', docs: 'https://support.google.com/googleapi/answer/6158849', - component: Google + component: Main }, googleImagine: { name: 'Google', icon: 'google', docs: 'https://support.google.com/googleapi/answer/6158849', - component: Google, + component: Main, internal: true }, + keycloak: { + name: 'Keycloak', + icon: 'keycloak', + docs: 'https://www.keycloak.org/securing-apps/oidc-layers', + component: Main + }, + kick: { + name: 'Kick', + icon: 'kick', + docs: 'https://docs.kick.com/getting-started/using-the-api', + component: Main + }, linkedin: { name: 'LinkedIn', icon: 'linkedin', @@ -150,7 +160,7 @@ export const oAuthProviders: Record = { name: 'Microsoft', icon: 'microsoft', docs: 'https://developer.microsoft.com/en-us/', - component: Microsoft + component: Main }, notion: { name: 'Notion', @@ -162,13 +172,13 @@ export const oAuthProviders: Record = { name: 'OIDC', icon: 'oidc', docs: 'https://openid.net/connect/faq/', - component: Oidc + component: Main }, okta: { name: 'Okta', icon: 'okta', docs: 'https://developer.okta.com', - component: Okta + component: Main }, paypal: { name: 'Paypal', @@ -176,7 +186,7 @@ export const oAuthProviders: Record = { docs: 'https://developer.paypal.com/docs/api/overview/', component: Main }, - paypalsandbox: { + paypalSandbox: { name: 'Paypal Sandbox', icon: 'paypal', docs: 'https://developer.paypal.com/docs/api/overview/', @@ -248,12 +258,6 @@ export const oAuthProviders: Record = { docs: 'https://developer.yahoo.com/oauth2/guide/flows_authcode/', component: Main }, - yammer: { - name: 'Yammer', - icon: 'yammer', - docs: 'https://developer.yammer.com/docs/oauth-2', - component: Main - }, yandex: { name: 'Yandex', icon: 'yandex', diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte deleted file mode 100644 index 0554e9598f..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/appleOAuth.svelte +++ /dev/null @@ -1,86 +0,0 @@ - - - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - - visit the docs. - -

- - - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte deleted file mode 100644 index 9b114e7402..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/auth0OAuth.svelte +++ /dev/null @@ -1,91 +0,0 @@ - - - - - To use {provider.name} authentication in your application, first fill in this form. For more info - you can - visit the docs. - - - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - - diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte deleted file mode 100644 index 19a3b40c66..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/authentikOAuth.svelte +++ /dev/null @@ -1,95 +0,0 @@ - - - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - visit the docs. -

- - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte deleted file mode 100644 index fc46679bd5..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/gitlabOAuth.svelte +++ /dev/null @@ -1,84 +0,0 @@ - - - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - visit the docs. -

- - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte deleted file mode 100644 index d5457b28be..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/googleOAuth.svelte +++ /dev/null @@ -1,84 +0,0 @@ - - - - {provider.name} OAuth2 settings - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - visit the docs. -

- - - - - To complete the setup, create an OAuth2 client ID with "Web application" as the application - type, then add this redirect URI to your {provider.name} configuration. - - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte index 365782e6b4..acc3a90c55 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/(providers)/mainOAuth.svelte @@ -1,35 +1,204 @@ @@ -49,21 +220,157 @@ target="_blank" rel="noopener noreferrer">visit the docs.

+ - - + + {#if appIdParam} + + {/if} + + {#each basicDetailParams as param} + + {/each} + + {#if advancedDetailParams.length > 0} + + + {#each advancedDetailParams as param} + + {/each} + + + {/if} + + {#if secretParams.length > 0} + {#if !showSecretInput} +
+ (showSecretInput = true)}> + Update {secretCardTitle} + +
+ {:else} + + + + + {secretCardTitle} + + + + {#if secretParams.length === 1} + This field is write-only. Enter a new value to update it. + {:else} + These fields are write-only. Enter new values to update them. + {/if} + + + + + + + {#each secretParams as param} + {#if isP8Param(param.$id)} +
+
+ {primaryName(param.name)} +
+ +
+
+ {#if p8PasteMode[param.$id]} + + {:else} + + + handleP8FileUpload(param.$id, event)} /> + {/if} +
+ {:else} + + {/if} + {/each} +
+
+
+ {/if} + {/if} + To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. @@ -72,12 +379,52 @@ value={`${getApiEndpoint(page.params.region)}/account/sessions/oauth2/callback/${provider.key}/${projectId}`} /> - +
+ + diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte deleted file mode 100644 index e6679ab2e4..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/microsoftOAuth.svelte +++ /dev/null @@ -1,90 +0,0 @@ - - - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - - visit the docs. - -

- - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte deleted file mode 100644 index 1360c4b726..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oidcOAuth.svelte +++ /dev/null @@ -1,133 +0,0 @@ - - - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - visit the docs. -

- - - - - - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte b/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte deleted file mode 100644 index 57f5c9e2ce..0000000000 --- a/src/routes/(console)/project-[region]-[project]/auth/(providers)/oktaOAuth.svelte +++ /dev/null @@ -1,109 +0,0 @@ - - - -

- To use {provider.name} authentication in your application, first fill in this form. For more info - you can - visit the docs. -

- - - - - - - - To complete set up, add this OAuth2 redirect URI to your {provider.name} app configuration. - - - - - - -
diff --git a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte index c086f5b55c..3596e8d7ea 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.svelte @@ -30,6 +30,8 @@ let { data }: PageProps = $props(); /** Must stay derived from `data` so OAuth/auth toggles reflect `invalidate(Dependencies.PROJECT)` without a full reload. */ const project = $derived(data.project); + const resolvedOAuthProviders = $derived(data.oauthProviders); + const consoleParamsMap = $derived(data.consoleParamsMap); let showProvider = $state(false); let selectedProvider: Models.AuthProvider | null = $state(null); @@ -152,7 +154,11 @@ Enable the authentication methods you wish to use. - + - - + +
{#each $authMethods.list as box} - +
{/if} - +
{/each} - +
@@ -200,8 +206,8 @@ OAuth2 Providers
    - {#each project.oAuthProviders - .filter((p) => p.name !== 'Mock') + {#each resolvedOAuthProviders + .filter((p) => p.key !== 'mock' && p.name !== 'Mock') .sort( (a, b) => (a.enabled === b.enabled ? 0 : a.enabled ? -1 : 1) ) as provider} {@const oAuthProvider = oAuthProviders[provider.key]} {#if oAuthProvider && !oAuthProvider.internal} @@ -248,6 +254,7 @@ { selectedProvider = null; showProvider = false; @@ -271,3 +278,22 @@ + + diff --git a/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts new file mode 100644 index 0000000000..0aa058f7e7 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/auth/settings/+page.ts @@ -0,0 +1,52 @@ +import { Dependencies } from '$lib/constants'; +import { oAuthProviders } from '$lib/stores/oauth-providers'; +import { sdk } from '$lib/stores/sdk'; +import type { Models, Models as ConsoleModels } from '@appwrite.io/console'; +import type { PageLoad } from './$types'; + +/** Extract the appId equivalent from a typed OAuth2 provider model. */ +function extractAppId(p: Record): string { + return (p['clientId'] ?? + p['appId'] ?? + p['oauthClientId'] ?? + p['oauth2ClientId'] ?? + p['applicationId'] ?? + p['serviceId'] ?? + p['apiKey'] ?? + p['publicKey'] ?? + p['appKey'] ?? + p['keyString'] ?? + p['customerKey'] ?? + p['key'] ?? + '') as string; +} + +export const load: PageLoad = async ({ depends, params }) => { + depends(Dependencies.PROJECT); + + const [providerList, consoleProviderList] = await Promise.all([ + sdk.forProject(params.region, params.project).project.listOAuth2Providers(), + sdk.forConsole.console.listOAuth2Providers() + ]); + + const consoleParamsMap = new Map(); + for (const cp of consoleProviderList.oAuth2Providers) { + consoleParamsMap.set(cp.$id, cp.parameters ?? []); + } + + const oauthProviders: Models.AuthProvider[] = providerList.providers + .filter((p) => p.$id !== 'mock') + .map((p) => { + const raw = p as unknown as Record; + return { + ...raw, + key: p.$id, + name: oAuthProviders[p.$id]?.name ?? p.$id, + appId: extractAppId(raw), + secret: '', + enabled: p.enabled + }; + }); + + return { oauthProviders, consoleParamsMap }; +}; diff --git a/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts index 6249ef31ed..0c21955027 100644 --- a/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts +++ b/src/routes/(console)/project-[region]-[project]/auth/updateOAuth.ts @@ -7,10 +7,12 @@ import { sdk } from '$lib/stores/sdk'; import { OAuthProvider, type Models } from '@appwrite.io/console'; type Args = { + region: string; projectId: string; provider: Models.AuthProvider; - appId: string; + appId: string | null; secret: string; + details: Record; enabled: boolean; }; @@ -19,11 +21,323 @@ type Return = { message?: string; }; +function parseSecret(secret: string) { + if (!secret) return {}; + + try { + return JSON.parse(secret); + } catch { + return {}; + } +} + +async function updateProjectOAuth({ + region, + projectId, + provider, + appId, + secret, + details, + enabled +}: Args) { + const projectSdk = sdk.forProject(region, projectId).project; + const parsedSecret = parseSecret(secret); + + const getAppId = (): string => appId ?? ''; + const getDetail = (key: string): string => details[key] ?? ''; + const getSecret = (key?: string): string | undefined => { + if (key) { + const value = parsedSecret[key]; + return typeof value === 'string' && value !== '' ? value : undefined; + } + + const firstValue = Object.values(parsedSecret).find( + (value): value is string => typeof value === 'string' && value !== '' + ); + + return firstValue; + }; + + switch (provider.key) { + case OAuthProvider.Amazon: + return projectSdk.updateOAuth2Amazon({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Apple: + return projectSdk.updateOAuth2Apple({ + serviceId: getAppId(), + keyId: getDetail('keyId'), + teamId: getDetail('teamId'), + p8File: getSecret('p8File'), + enabled + }); + case OAuthProvider.Auth0: + return projectSdk.updateOAuth2Auth0({ + clientId: getAppId(), + clientSecret: getSecret('clientSecret'), + endpoint: getDetail('endpoint'), + enabled + }); + case OAuthProvider.Authentik: + return projectSdk.updateOAuth2Authentik({ + endpoint: getDetail('endpoint'), + clientId: getAppId(), + clientSecret: getSecret('clientSecret'), + enabled + }); + case OAuthProvider.Autodesk: + return projectSdk.updateOAuth2Autodesk({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Bitbucket: + return projectSdk.updateOAuth2Bitbucket({ + key: getAppId(), + secret: getSecret(), + enabled + }); + case OAuthProvider.Bitly: + return projectSdk.updateOAuth2Bitly({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Box: + return projectSdk.updateOAuth2Box({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Dailymotion: + return projectSdk.updateOAuth2Dailymotion({ + apiKey: getAppId(), + apiSecret: getSecret(), + enabled + }); + case OAuthProvider.Discord: + return projectSdk.updateOAuth2Discord({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Disqus: + return projectSdk.updateOAuth2Disqus({ + publicKey: getAppId(), + secretKey: getSecret(), + enabled + }); + case OAuthProvider.Dropbox: + return projectSdk.updateOAuth2Dropbox({ + appKey: getAppId(), + appSecret: getSecret(), + enabled + }); + case OAuthProvider.Etsy: + return projectSdk.updateOAuth2Etsy({ + keyString: getAppId(), + sharedSecret: getSecret(), + enabled + }); + case OAuthProvider.Facebook: + return projectSdk.updateOAuth2Facebook({ + appId: getAppId(), + appSecret: getSecret(), + enabled + }); + case OAuthProvider.Figma: + return projectSdk.updateOAuth2Figma({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Fusionauth: + return projectSdk.updateOAuth2FusionAuth({ + endpoint: getDetail('endpoint'), + clientId: getAppId(), + clientSecret: getSecret('clientSecret'), + enabled + }); + case OAuthProvider.Github: + return projectSdk.updateOAuth2GitHub({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Gitlab: + return projectSdk.updateOAuth2Gitlab({ + applicationId: getAppId(), + secret: getSecret('secret'), + endpoint: getDetail('endpoint'), + enabled + }); + case OAuthProvider.Google: + return projectSdk.updateOAuth2Google({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Keycloak: + return projectSdk.updateOAuth2Keycloak({ + endpoint: getDetail('endpoint'), + realmName: getDetail('realmName'), + clientId: getAppId(), + clientSecret: getSecret('clientSecret'), + enabled + }); + case OAuthProvider.Kick: + return projectSdk.updateOAuth2Kick({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Linkedin: + return projectSdk.updateOAuth2Linkedin({ + clientId: getAppId(), + primaryClientSecret: getSecret(), + enabled + }); + case OAuthProvider.Microsoft: + return projectSdk.updateOAuth2Microsoft({ + tenant: getDetail('tenant'), + applicationId: getAppId(), + applicationSecret: getSecret('applicationSecret'), + enabled + }); + case OAuthProvider.Notion: + return projectSdk.updateOAuth2Notion({ + oauthClientId: getAppId(), + oauthClientSecret: getSecret(), + enabled + }); + case OAuthProvider.Oidc: + return projectSdk.updateOAuth2Oidc({ + clientId: getAppId(), + clientSecret: getSecret('clientSecret'), + wellKnownURL: getDetail('wellKnownURL'), + authorizationURL: getDetail('authorizationURL'), + tokenUrl: getDetail('tokenUrl'), + userInfoUrl: getDetail('userInfoUrl'), + enabled + }); + case OAuthProvider.Okta: + return projectSdk.updateOAuth2Okta({ + clientId: getAppId(), + clientSecret: getSecret('clientSecret'), + domain: getDetail('domain'), + authorizationServerId: getDetail('authorizationServerId'), + enabled + }); + case OAuthProvider.Paypal: + return projectSdk.updateOAuth2Paypal({ + clientId: getAppId(), + secretKey: getSecret(), + enabled + }); + case OAuthProvider.PaypalSandbox: + return projectSdk.updateOAuth2PaypalSandbox({ + clientId: getAppId(), + secretKey: getSecret(), + enabled + }); + case OAuthProvider.Podio: + return projectSdk.updateOAuth2Podio({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Salesforce: + return projectSdk.updateOAuth2Salesforce({ + customerKey: getAppId(), + customerSecret: getSecret(), + enabled + }); + case OAuthProvider.Slack: + return projectSdk.updateOAuth2Slack({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Spotify: + return projectSdk.updateOAuth2Spotify({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Stripe: + return projectSdk.updateOAuth2Stripe({ + clientId: getAppId(), + apiSecretKey: getSecret(), + enabled + }); + case OAuthProvider.Tradeshift: + return projectSdk.updateOAuth2Tradeshift({ + oauth2ClientId: getAppId(), + oauth2ClientSecret: getSecret(), + enabled + }); + case OAuthProvider.TradeshiftBox: + return projectSdk.updateOAuth2TradeshiftSandbox({ + oauth2ClientId: getAppId(), + oauth2ClientSecret: getSecret(), + enabled + }); + case OAuthProvider.Twitch: + return projectSdk.updateOAuth2Twitch({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Wordpress: + return projectSdk.updateOAuth2WordPress({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.X: + return projectSdk.updateOAuth2X({ + customerKey: getAppId(), + secretKey: getSecret(), + enabled + }); + case OAuthProvider.Yahoo: + return projectSdk.updateOAuth2Yahoo({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Yandex: + return projectSdk.updateOAuth2Yandex({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Zoho: + return projectSdk.updateOAuth2Zoho({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + case OAuthProvider.Zoom: + return projectSdk.updateOAuth2Zoom({ + clientId: getAppId(), + clientSecret: getSecret(), + enabled + }); + default: + throw new Error(`Unsupported OAuth2 provider: ${provider.key}`); + } +} + export async function updateOAuth({ + region, projectId, provider, appId, secret, + details, enabled }: Args): Promise { try { @@ -31,13 +345,7 @@ export async function updateOAuth({ throw new Error(`Invalid OAuth2 provider: ${provider.key}`); } - await sdk.forConsole.projects.updateOAuth2({ - projectId, - provider: provider.key, - appId: appId || undefined, - secret: secret || undefined, - enabled - }); + await updateProjectOAuth({ region, projectId, provider, appId, secret, details, enabled }); await invalidate(Dependencies.PROJECT); addNotification({ diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/error.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/errorSonner.svelte similarity index 100% rename from src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/error.svelte rename to src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/errorSonner.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/index.ts b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/index.ts index cc1daf60ad..f5afd0bc57 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/index.ts +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/collection-[collection]/(components)/sonners/index.ts @@ -1,3 +1,3 @@ export { default as Save } from './save.svelte'; -export { default as Error } from './error.svelte'; +export { default as Error } from './errorSonner.svelte'; export { default as Suggestions } from './suggestions.svelte'; diff --git a/src/routes/(console)/project-[region]-[project]/overview/api-keys/scopes.svelte b/src/routes/(console)/project-[region]-[project]/overview/api-keys/scopes.svelte index 70608e2f0a..35b0ddf23b 100644 --- a/src/routes/(console)/project-[region]-[project]/overview/api-keys/scopes.svelte +++ b/src/routes/(console)/project-[region]-[project]/overview/api-keys/scopes.svelte @@ -1,8 +1,9 @@ - + {#if loadError} + {loadError} + {/if} diff --git a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte index a39f59bf68..ba12f9b94a 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/deleteProject.svelte @@ -32,9 +32,7 @@ const handleDelete = async () => { try { // send the project to correct region pool for deletion! - await sdk.forConsoleIn($project.region).projects.delete({ - projectId: $project.$id - }); + await sdk.forProject($project.region, $project.$id).project.delete(); await finishAndRedirect(); } catch (e) { error = e.message; diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte index 7bed364e62..fc54b8ba64 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/+page.svelte @@ -105,7 +105,7 @@ Scopes.FilesRead, Scopes.BucketsRead, Scopes.FunctionsRead, - Scopes.ExecutionRead, + Scopes.ExecutionsRead, Scopes.LocaleRead, Scopes.AvatarsRead, Scopes.HealthRead diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte index d2e7177180..e707021275 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/exportModal.svelte @@ -107,7 +107,7 @@ Scopes.FilesRead, Scopes.BucketsRead, Scopes.FunctionsRead, - Scopes.ExecutionRead, + Scopes.ExecutionsRead, Scopes.SitesRead, Scopes.ProvidersRead, Scopes.TopicsRead, diff --git a/static/icons/dark/color/fusionauth.svg b/static/icons/dark/color/fusionauth.svg new file mode 100644 index 0000000000..00303a4433 --- /dev/null +++ b/static/icons/dark/color/fusionauth.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/dark/color/keycloak.svg b/static/icons/dark/color/keycloak.svg new file mode 100644 index 0000000000..62219d3040 --- /dev/null +++ b/static/icons/dark/color/keycloak.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/dark/color/kick.svg b/static/icons/dark/color/kick.svg new file mode 100644 index 0000000000..7bd7132304 --- /dev/null +++ b/static/icons/dark/color/kick.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/dark/color/oidc.svg b/static/icons/dark/color/oidc.svg index 3e45a505de..69ba83b7ce 100644 --- a/static/icons/dark/color/oidc.svg +++ b/static/icons/dark/color/oidc.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/static/icons/dark/color/yammer.svg b/static/icons/dark/color/yammer.svg deleted file mode 100644 index 2d1083bd9a..0000000000 --- a/static/icons/dark/color/yammer.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/icons/dark/grayscale/yammer.svg b/static/icons/dark/grayscale/yammer.svg deleted file mode 100644 index cbb07a3c23..0000000000 --- a/static/icons/dark/grayscale/yammer.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - - diff --git a/static/icons/light/color/fusionauth.svg b/static/icons/light/color/fusionauth.svg new file mode 100644 index 0000000000..00303a4433 --- /dev/null +++ b/static/icons/light/color/fusionauth.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/color/keycloak.svg b/static/icons/light/color/keycloak.svg new file mode 100644 index 0000000000..264768ec4c --- /dev/null +++ b/static/icons/light/color/keycloak.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/color/kick.svg b/static/icons/light/color/kick.svg new file mode 100644 index 0000000000..7bd7132304 --- /dev/null +++ b/static/icons/light/color/kick.svg @@ -0,0 +1,3 @@ + + + diff --git a/static/icons/light/color/oidc.svg b/static/icons/light/color/oidc.svg index 3e45a505de..69ba83b7ce 100644 --- a/static/icons/light/color/oidc.svg +++ b/static/icons/light/color/oidc.svg @@ -1,3 +1,5 @@ - - + + + + diff --git a/static/icons/light/color/yammer.svg b/static/icons/light/color/yammer.svg deleted file mode 100644 index e6d34f1e9f..0000000000 --- a/static/icons/light/color/yammer.svg +++ /dev/null @@ -1,26 +0,0 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - diff --git a/static/icons/light/grayscale/yammer.svg b/static/icons/light/grayscale/yammer.svg deleted file mode 100644 index 66e6ba653e..0000000000 --- a/static/icons/light/grayscale/yammer.svg +++ /dev/null @@ -1,7 +0,0 @@ - - - - - - -