From 9cb4209ce249a68c1ad215a13d16a6891b84730c Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Mon, 13 Apr 2026 20:33:16 +0530 Subject: [PATCH 01/12] fix(console): regional Projects API for service toggles + full ApiService list --- src/lib/stores/project-services.ts | 133 +++++------------- .../project-[region]-[project]/+layout.ts | 17 ++- .../settings/updateServices.svelte | 4 +- 3 files changed, 50 insertions(+), 104 deletions(-) diff --git a/src/lib/stores/project-services.ts b/src/lib/stores/project-services.ts index d9023f57f..8db56e5a8 100644 --- a/src/lib/stores/project-services.ts +++ b/src/lib/stores/project-services.ts @@ -7,114 +7,47 @@ export type Service = { value: boolean | null; }; +/** Same naming as `Models.Project` (`serviceStatusFor` + PascalCase of `ApiService` value). */ +function apiServiceValueToStatusKey(value: string): `serviceStatusFor${string}` { + const pascal = value.charAt(0).toUpperCase() + value.slice(1); + return `serviceStatusFor${pascal}`; +} + +function orderedApiServiceEnumKeys(): (keyof typeof ApiService)[] { + return (Object.keys(ApiService) as (keyof typeof ApiService)[]).filter( + (k) => typeof ApiService[k] === 'string' + ); +} + +/** All client API services from `ApiService`, wired to `project.serviceStatusFor*`. */ +function buildServiceRows(project: Models.Project | null): Service[] { + return orderedApiServiceEnumKeys().map((enumKey) => { + const method = ApiService[enumKey] as ApiService; + const statusKey = apiServiceValueToStatusKey(method); + + const value = + project && statusKey in project + ? (project[statusKey as keyof Models.Project] as boolean) + : null; + + return { + label: String(enumKey), + method, + value + }; + }); +} + function createServices() { const { subscribe, set } = writable({ - list: [ - { - label: 'Account', - method: ApiService.Account, - value: null - }, - { - label: 'Avatars', - method: ApiService.Avatars, - value: null - }, - { - label: 'Databases', - method: ApiService.Databases, - value: null - }, - { - label: 'Functions', - method: ApiService.Functions, - value: null - }, - { - label: 'Locale', - method: ApiService.Locale, - value: null - }, - { - label: 'Messaging', - method: ApiService.Messaging, - value: null - }, - { - label: 'Storage', - method: ApiService.Storage, - value: null - }, - { - label: 'Teams', - method: ApiService.Teams, - value: null - }, - { - label: 'Users', - method: ApiService.Users, - value: null - }, - { - label: 'GraphQL', - method: ApiService.Graphql, - value: null - } - ] + list: buildServiceRows(null) }); return { subscribe, set, load: (project: Models.Project) => { - const list = [ - { - label: 'Account', - method: ApiService.Account, - value: project.serviceStatusForAccount - }, - { - label: 'Avatars', - method: ApiService.Avatars, - value: project.serviceStatusForAvatars - }, - { - label: 'Databases', - method: ApiService.Databases, - value: project.serviceStatusForDatabases - }, - { - label: 'Functions', - method: ApiService.Functions, - value: project.serviceStatusForFunctions - }, - { - label: 'Locale', - method: ApiService.Locale, - value: project.serviceStatusForLocale - }, - { - label: 'Messaging', - method: ApiService.Messaging, - value: project.serviceStatusForMessaging - }, - { - label: 'Storage', - method: ApiService.Storage, - value: project.serviceStatusForStorage - }, - { - label: 'Teams', - method: ApiService.Teams, - value: project.serviceStatusForTeams - }, - { - label: 'Users', - method: ApiService.Users, - value: project.serviceStatusForUsers - } - ]; - set({ list }); + set({ list: buildServiceRows(project) }); } }; } diff --git a/src/routes/(console)/project-[region]-[project]/+layout.ts b/src/routes/(console)/project-[region]-[project]/+layout.ts index 1bec6520e..58f59b271 100644 --- a/src/routes/(console)/project-[region]-[project]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/+layout.ts @@ -14,8 +14,9 @@ import { resolve } from '$app/paths'; import { generateFingerprintToken } from '$lib/helpers/fingerprint'; import { normalizeConsoleVariables } from '$lib/helpers/domains'; import { browser } from '$app/environment'; +import { base } from '$app/paths'; -export const load: LayoutLoad = async ({ params, depends, parent }) => { +export const load: LayoutLoad = async ({ params, depends, parent, url }) => { const { plansInfo, organizations, preferences: prefs } = await parent(); depends(Dependencies.PROJECT); @@ -32,6 +33,18 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => { project.region ??= 'default'; + // Canonical project URL: route segment `region` must match the project's home region (multi-region). + if (params.region !== project.region) { + const prefix = `${base}/project-${params.region}-${params.project}`; + if (url.pathname.startsWith(prefix)) { + const suffix = url.pathname.slice(prefix.length); + redirect( + 303, + `${base}/project-${project.region}-${params.project}${suffix}${url.search}` + ); + } + } + // fast path without a network call! let organization = (organizations as Models.OrganizationList)?.teams?.find( (org) => org.$id === project.teamId @@ -110,7 +123,7 @@ export const load: LayoutLoad = async ({ params, depends, parent }) => { generateFingerprintToken() .then((fingerprint) => { sdk.forConsole.client.headers['X-Appwrite-Console-Fingerprint'] = fingerprint; - return sdk.forConsole.projects.updateConsoleAccess({ + return sdk.forConsoleIn(project.region).projects.updateConsoleAccess({ projectId: params.project }); }) diff --git a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte index e1f79b7d6..e8a457ba2 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte @@ -41,7 +41,7 @@ apiServiceUpdates.add(service.method); try { - await sdk.forConsole.projects.updateServiceStatus({ + await sdk.forConsoleIn($project.region).projects.updateServiceStatus({ projectId: $project.$id, service: service.method, status: service.value @@ -74,7 +74,7 @@ isUpdatingAllServices = true; try { - await sdk.forConsole.projects.updateServiceStatusAll({ + await sdk.forConsoleIn($project.region).projects.updateServiceStatusAll({ projectId: $project.$id, status }); From 763c09a452ece9889e4c5a4bfd1b72562a374e6b Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Mon, 13 Apr 2026 20:39:49 +0530 Subject: [PATCH 02/12] revert(project): restore +layout.ts and updateServices.svelte from main Made-with: Cursor --- .../project-[region]-[project]/+layout.ts | 17 ++--------------- .../settings/updateServices.svelte | 4 ++-- 2 files changed, 4 insertions(+), 17 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/+layout.ts b/src/routes/(console)/project-[region]-[project]/+layout.ts index 58f59b271..1bec6520e 100644 --- a/src/routes/(console)/project-[region]-[project]/+layout.ts +++ b/src/routes/(console)/project-[region]-[project]/+layout.ts @@ -14,9 +14,8 @@ import { resolve } from '$app/paths'; import { generateFingerprintToken } from '$lib/helpers/fingerprint'; import { normalizeConsoleVariables } from '$lib/helpers/domains'; import { browser } from '$app/environment'; -import { base } from '$app/paths'; -export const load: LayoutLoad = async ({ params, depends, parent, url }) => { +export const load: LayoutLoad = async ({ params, depends, parent }) => { const { plansInfo, organizations, preferences: prefs } = await parent(); depends(Dependencies.PROJECT); @@ -33,18 +32,6 @@ export const load: LayoutLoad = async ({ params, depends, parent, url }) => { project.region ??= 'default'; - // Canonical project URL: route segment `region` must match the project's home region (multi-region). - if (params.region !== project.region) { - const prefix = `${base}/project-${params.region}-${params.project}`; - if (url.pathname.startsWith(prefix)) { - const suffix = url.pathname.slice(prefix.length); - redirect( - 303, - `${base}/project-${project.region}-${params.project}${suffix}${url.search}` - ); - } - } - // fast path without a network call! let organization = (organizations as Models.OrganizationList)?.teams?.find( (org) => org.$id === project.teamId @@ -123,7 +110,7 @@ export const load: LayoutLoad = async ({ params, depends, parent, url }) => { generateFingerprintToken() .then((fingerprint) => { sdk.forConsole.client.headers['X-Appwrite-Console-Fingerprint'] = fingerprint; - return sdk.forConsoleIn(project.region).projects.updateConsoleAccess({ + return sdk.forConsole.projects.updateConsoleAccess({ projectId: params.project }); }) diff --git a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte index e8a457ba2..e1f79b7d6 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte @@ -41,7 +41,7 @@ apiServiceUpdates.add(service.method); try { - await sdk.forConsoleIn($project.region).projects.updateServiceStatus({ + await sdk.forConsole.projects.updateServiceStatus({ projectId: $project.$id, service: service.method, status: service.value @@ -74,7 +74,7 @@ isUpdatingAllServices = true; try { - await sdk.forConsoleIn($project.region).projects.updateServiceStatusAll({ + await sdk.forConsole.projects.updateServiceStatusAll({ projectId: $project.$id, status }); From cb537b5410a799ef74280887e1a1e3183c9c8029 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Mon, 13 Apr 2026 20:41:27 +0530 Subject: [PATCH 03/12] fix --- bun.lock | 6 +- package.json | 2 +- src/lib/stores/project-services.ts | 116 +++++++++++++++++++++-------- 3 files changed, 87 insertions(+), 37 deletions(-) diff --git a/bun.lock b/bun.lock index 49d8619da..afec09ad8 100644 --- a/bun.lock +++ b/bun.lock @@ -1,5 +1,6 @@ { "lockfileVersion": 1, + "configVersion": 0, "workspaces": { "": { "name": "@appwrite/console", @@ -24,7 +25,6 @@ "deep-equal": "^2.2.3", "echarts": "^5.6.0", "flatted": "^3.4.2", - "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@67539a6", "ignore": "^6.0.2", "nanoid": "^5.1.7", "nanotar": "^0.3.0", @@ -41,7 +41,7 @@ "@melt-ui/svelte": "^0.86.6", "@playwright/test": "^1.58.2", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.55.0", + "@sveltejs/kit": "^2.57.1", "@sveltejs/vite-plugin-svelte": "^5.1.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", @@ -435,7 +435,7 @@ "@sveltejs/adapter-static": ["@sveltejs/adapter-static@3.0.10", "", { "peerDependencies": { "@sveltejs/kit": "^2.0.0" } }, "sha512-7D9lYFWJmB7zxZyTE/qxjksvMqzMuYrrsyh1f4AlZqeZeACPRySjbC3aFiY55wb1tWUaKOQG9PVbm74JcN2Iew=="], - "@sveltejs/kit": ["@sveltejs/kit@2.55.0", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.4", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-MdFRjevVxmAknf2NbaUkDF16jSIzXMWd4Nfah0Qp8TtQVoSp3bV4jKt8mX7z7qTUTWvgSaxtR0EG5WJf53gcuA=="], + "@sveltejs/kit": ["@sveltejs/kit@2.57.1", "", { "dependencies": { "@standard-schema/spec": "^1.0.0", "@sveltejs/acorn-typescript": "^1.0.5", "@types/cookie": "^0.6.0", "acorn": "^8.14.1", "cookie": "^0.6.0", "devalue": "^5.6.4", "esm-env": "^1.2.2", "kleur": "^4.1.5", "magic-string": "^0.30.5", "mrmime": "^2.0.0", "set-cookie-parser": "^3.0.0", "sirv": "^3.0.0" }, "peerDependencies": { "@opentelemetry/api": "^1.0.0", "@sveltejs/vite-plugin-svelte": "^3.0.0 || ^4.0.0-next.1 || ^5.0.0 || ^6.0.0-next.0 || ^7.0.0", "svelte": "^4.0.0 || ^5.0.0-next.0", "typescript": "^5.3.3 || ^6.0.0", "vite": "^5.0.3 || ^6.0.0 || ^7.0.0-beta.0 || ^8.0.0" }, "optionalPeers": ["@opentelemetry/api", "typescript"], "bin": { "svelte-kit": "svelte-kit.js" } }, "sha512-VRdSbB96cI1EnRh09CqmnQqP/YJvET5buj8S6k7CxaJqBJD4bw4fRKDjcarAj/eX9k2eHifQfDH8NtOh+ZxxPw=="], "@sveltejs/vite-plugin-svelte": ["@sveltejs/vite-plugin-svelte@5.1.1", "", { "dependencies": { "@sveltejs/vite-plugin-svelte-inspector": "^4.0.1", "debug": "^4.4.1", "deepmerge": "^4.3.1", "kleur": "^4.1.5", "magic-string": "^0.30.17", "vitefu": "^1.0.6" }, "peerDependencies": { "svelte": "^5.0.0", "vite": "^6.0.0" } }, "sha512-Y1Cs7hhTc+a5E9Va/xwKlAJoariQyHY+5zBgCZg4PFWNYQ1nMN9sjK1zhw1gK69DuqVP++sht/1GZg1aRwmAXQ=="], diff --git a/package.json b/package.json index 74c0c7948..f14d08510 100644 --- a/package.json +++ b/package.json @@ -55,7 +55,7 @@ "@melt-ui/svelte": "^0.86.6", "@playwright/test": "^1.58.2", "@sveltejs/adapter-static": "^3.0.10", - "@sveltejs/kit": "^2.55.0", + "@sveltejs/kit": "^2.57.1", "@sveltejs/vite-plugin-svelte": "^5.1.1", "@testing-library/dom": "^10.4.1", "@testing-library/jest-dom": "^6.9.1", diff --git a/src/lib/stores/project-services.ts b/src/lib/stores/project-services.ts index 8db56e5a8..38530ea06 100644 --- a/src/lib/stores/project-services.ts +++ b/src/lib/stores/project-services.ts @@ -7,47 +7,97 @@ export type Service = { value: boolean | null; }; -/** Same naming as `Models.Project` (`serviceStatusFor` + PascalCase of `ApiService` value). */ -function apiServiceValueToStatusKey(value: string): `serviceStatusFor${string}` { - const pascal = value.charAt(0).toUpperCase() + value.slice(1); - return `serviceStatusFor${pascal}`; -} - -function orderedApiServiceEnumKeys(): (keyof typeof ApiService)[] { - return (Object.keys(ApiService) as (keyof typeof ApiService)[]).filter( - (k) => typeof ApiService[k] === 'string' - ); -} - -/** All client API services from `ApiService`, wired to `project.serviceStatusFor*`. */ -function buildServiceRows(project: Models.Project | null): Service[] { - return orderedApiServiceEnumKeys().map((enumKey) => { - const method = ApiService[enumKey] as ApiService; - const statusKey = apiServiceValueToStatusKey(method); - - const value = - project && statusKey in project - ? (project[statusKey as keyof Models.Project] as boolean) - : null; - - return { - label: String(enumKey), - method, - value - }; - }); -} - function createServices() { const { subscribe, set } = writable({ - list: buildServiceRows(null) + list: [ + { label: 'Account', method: ApiService.Account, value: null }, + { label: 'Avatars', method: ApiService.Avatars, value: null }, + { label: 'Databases', method: ApiService.Databases, value: null }, + { label: 'Tables', method: ApiService.Tablesdb, value: null }, + { label: 'Locale', method: ApiService.Locale, value: null }, + { label: 'Health', method: ApiService.Health, value: null }, + { label: 'Storage', method: ApiService.Storage, value: null }, + { label: 'Teams', method: ApiService.Teams, value: null }, + { label: 'Users', method: ApiService.Users, value: null }, + { label: 'Sites', method: ApiService.Sites, value: null }, + { label: 'Functions', method: ApiService.Functions, value: null }, + { label: 'GraphQL', method: ApiService.Graphql, value: null }, + { label: 'Messaging', method: ApiService.Messaging, value: null } + ] satisfies Service[] }); return { subscribe, set, load: (project: Models.Project) => { - set({ list: buildServiceRows(project) }); + const list: Service[] = [ + { + label: 'Account', + method: ApiService.Account, + value: project.serviceStatusForAccount + }, + { + label: 'Avatars', + method: ApiService.Avatars, + value: project.serviceStatusForAvatars + }, + { + label: 'Databases', + method: ApiService.Databases, + value: project.serviceStatusForDatabases + }, + { + label: 'Tables', + method: ApiService.Tablesdb, + value: project.serviceStatusForTablesdb + }, + { + label: 'Locale', + method: ApiService.Locale, + value: project.serviceStatusForLocale + }, + { + label: 'Health', + method: ApiService.Health, + value: project.serviceStatusForHealth + }, + { + label: 'Storage', + method: ApiService.Storage, + value: project.serviceStatusForStorage + }, + { + label: 'Teams', + method: ApiService.Teams, + value: project.serviceStatusForTeams + }, + { + label: 'Users', + method: ApiService.Users, + value: project.serviceStatusForUsers + }, + { + label: 'Sites', + method: ApiService.Sites, + value: project.serviceStatusForSites + }, + { + label: 'Functions', + method: ApiService.Functions, + value: project.serviceStatusForFunctions + }, + { + label: 'GraphQL', + method: ApiService.Graphql, + value: project.serviceStatusForGraphql + }, + { + label: 'Messaging', + method: ApiService.Messaging, + value: project.serviceStatusForMessaging + } + ]; + set({ list }); } }; } From 69ae22ae9e47c1dd1ac510cbe57defef3215fa9b Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Mon, 13 Apr 2026 20:45:55 +0530 Subject: [PATCH 04/12] fix sdk --- .../project-[region]-[project]/settings/updateServices.svelte | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte index e1f79b7d6..e8a457ba2 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte @@ -41,7 +41,7 @@ apiServiceUpdates.add(service.method); try { - await sdk.forConsole.projects.updateServiceStatus({ + await sdk.forConsoleIn($project.region).projects.updateServiceStatus({ projectId: $project.$id, service: service.method, status: service.value @@ -74,7 +74,7 @@ isUpdatingAllServices = true; try { - await sdk.forConsole.projects.updateServiceStatusAll({ + await sdk.forConsoleIn($project.region).projects.updateServiceStatusAll({ projectId: $project.$id, status }); From b98fdd203e6da0d99a1fd8be812a2e3c04f7d0ce Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:50:28 +0530 Subject: [PATCH 05/12] Update src/lib/stores/project-services.ts MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-authored-by: Matej Bačo --- src/lib/stores/project-services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/stores/project-services.ts b/src/lib/stores/project-services.ts index 38530ea06..ced67047a 100644 --- a/src/lib/stores/project-services.ts +++ b/src/lib/stores/project-services.ts @@ -13,7 +13,7 @@ function createServices() { { label: 'Account', method: ApiService.Account, value: null }, { label: 'Avatars', method: ApiService.Avatars, value: null }, { label: 'Databases', method: ApiService.Databases, value: null }, - { label: 'Tables', method: ApiService.Tablesdb, value: null }, + { label: 'TablesDB', method: ApiService.Tablesdb, value: null }, { label: 'Locale', method: ApiService.Locale, value: null }, { label: 'Health', method: ApiService.Health, value: null }, { label: 'Storage', method: ApiService.Storage, value: null }, From 7c2674809f4da6b6f6e8fb876e23b10e8636c276 Mon Sep 17 00:00:00 2001 From: Harsh Mahajan <127186841+HarshMN2345@users.noreply.github.com> Date: Mon, 13 Apr 2026 20:51:46 +0530 Subject: [PATCH 06/12] Update project-services.ts --- src/lib/stores/project-services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/lib/stores/project-services.ts b/src/lib/stores/project-services.ts index ced67047a..4ac589fe3 100644 --- a/src/lib/stores/project-services.ts +++ b/src/lib/stores/project-services.ts @@ -47,7 +47,7 @@ function createServices() { value: project.serviceStatusForDatabases }, { - label: 'Tables', + label: 'TablesDB', method: ApiService.Tablesdb, value: project.serviceStatusForTablesdb }, From 35808edbf078f7fbf48497836d10377467f85fe7 Mon Sep 17 00:00:00 2001 From: harsh mahajan Date: Tue, 14 Apr 2026 13:19:46 +0530 Subject: [PATCH 07/12] fix: esolve merge conflucts --- bun.lock | 4 +- package.json | 2 +- src/lib/stores/project-services.ts | 181 ++++++++++-------- .../settings/updateServices.svelte | 24 ++- .../webhooks/[webhook]/details.svelte | 6 +- .../webhooks/[webhook]/regenerate.svelte | 2 +- .../webhooks/[webhook]/updateEvents.svelte | 6 +- .../webhooks/[webhook]/updateName.svelte | 6 +- .../webhooks/[webhook]/updateSecurity.svelte | 36 ++-- .../webhooks/[webhook]/updateSignature.svelte | 2 +- .../webhooks/[webhook]/updateURL.svelte | 6 +- .../settings/webhooks/create/+page.svelte | 14 +- .../settings/webhooks/create/step3.svelte | 20 +- 13 files changed, 166 insertions(+), 143 deletions(-) diff --git a/bun.lock b/bun.lock index afec09ad8..5e452c947 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@67539a6", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", "@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", @@ -113,7 +113,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@67539a6", { "dependencies": { "json-bigint": "1.0.0" } }], + "@appwrite.io/console": ["@appwrite.io/console@https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", { "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 f14d08510..099ae9cb1 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@67539a6", + "@appwrite.io/console": "https://pkg.vc/-/@appwrite/@appwrite.io/console@f063676", "@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/stores/project-services.ts b/src/lib/stores/project-services.ts index 4ac589fe3..b9f4e688e 100644 --- a/src/lib/stores/project-services.ts +++ b/src/lib/stores/project-services.ts @@ -1,103 +1,114 @@ import { writable } from 'svelte/store'; -import { ApiService, type Models } from '@appwrite.io/console'; +import { ServiceId, type Models } from '@appwrite.io/console'; export type Service = { label: string; - method: ApiService; + method: ServiceId; value: boolean | null; }; +function projectServiceRows(project: Models.Project | null): Service[] { + const rows: Service[] = [ + { + label: 'Account', + method: ServiceId.Account, + value: project?.serviceStatusForAccount ?? null + }, + { + label: 'Avatars', + method: ServiceId.Avatars, + value: project?.serviceStatusForAvatars ?? null + }, + { + label: 'Databases', + method: ServiceId.Databases, + value: project?.serviceStatusForDatabases ?? null + }, + { + label: 'Functions', + method: ServiceId.Functions, + value: project?.serviceStatusForFunctions ?? null + }, + { + label: 'GraphQL', + method: ServiceId.Graphql, + value: project?.serviceStatusForGraphql ?? null + }, + { + label: 'Health', + method: ServiceId.Health, + value: project?.serviceStatusForHealth ?? null + }, + { + label: 'Locale', + method: ServiceId.Locale, + value: project?.serviceStatusForLocale ?? null + }, + { + label: 'Messaging', + method: ServiceId.Messaging, + value: project?.serviceStatusForMessaging ?? null + }, + { + label: 'Migrations', + method: ServiceId.Migrations, + value: project?.serviceStatusForMigrations ?? null + }, + { + label: 'Project', + method: ServiceId.Project, + value: project?.serviceStatusForProject ?? null + }, + { + label: 'Proxy', + method: ServiceId.Proxy, + value: project?.serviceStatusForProxy ?? null + }, + { + label: 'Sites', + method: ServiceId.Sites, + value: project?.serviceStatusForSites ?? null + }, + { + label: 'Storage', + method: ServiceId.Storage, + value: project?.serviceStatusForStorage ?? null + }, + { + label: 'Tables', + method: ServiceId.Tablesdb, + value: project?.serviceStatusForTablesdb ?? null + }, + { + label: 'Teams', + method: ServiceId.Teams, + value: project?.serviceStatusForTeams ?? null + }, + { + label: 'Users', + method: ServiceId.Users, + value: project?.serviceStatusForUsers ?? null + }, + { + label: 'VCS', + method: ServiceId.Vcs, + value: project?.serviceStatusForVcs ?? null + } + ]; + + return rows.sort((a, b) => a.label.localeCompare(b.label)); +} + function createServices() { const { subscribe, set } = writable({ - list: [ - { label: 'Account', method: ApiService.Account, value: null }, - { label: 'Avatars', method: ApiService.Avatars, value: null }, - { label: 'Databases', method: ApiService.Databases, value: null }, - { label: 'TablesDB', method: ApiService.Tablesdb, value: null }, - { label: 'Locale', method: ApiService.Locale, value: null }, - { label: 'Health', method: ApiService.Health, value: null }, - { label: 'Storage', method: ApiService.Storage, value: null }, - { label: 'Teams', method: ApiService.Teams, value: null }, - { label: 'Users', method: ApiService.Users, value: null }, - { label: 'Sites', method: ApiService.Sites, value: null }, - { label: 'Functions', method: ApiService.Functions, value: null }, - { label: 'GraphQL', method: ApiService.Graphql, value: null }, - { label: 'Messaging', method: ApiService.Messaging, value: null } - ] satisfies Service[] + list: projectServiceRows(null) }); return { subscribe, set, load: (project: Models.Project) => { - const list: Service[] = [ - { - label: 'Account', - method: ApiService.Account, - value: project.serviceStatusForAccount - }, - { - label: 'Avatars', - method: ApiService.Avatars, - value: project.serviceStatusForAvatars - }, - { - label: 'Databases', - method: ApiService.Databases, - value: project.serviceStatusForDatabases - }, - { - label: 'TablesDB', - method: ApiService.Tablesdb, - value: project.serviceStatusForTablesdb - }, - { - label: 'Locale', - method: ApiService.Locale, - value: project.serviceStatusForLocale - }, - { - label: 'Health', - method: ApiService.Health, - value: project.serviceStatusForHealth - }, - { - label: 'Storage', - method: ApiService.Storage, - value: project.serviceStatusForStorage - }, - { - label: 'Teams', - method: ApiService.Teams, - value: project.serviceStatusForTeams - }, - { - label: 'Users', - method: ApiService.Users, - value: project.serviceStatusForUsers - }, - { - label: 'Sites', - method: ApiService.Sites, - value: project.serviceStatusForSites - }, - { - label: 'Functions', - method: ApiService.Functions, - value: project.serviceStatusForFunctions - }, - { - label: 'GraphQL', - method: ApiService.Graphql, - value: project.serviceStatusForGraphql - }, - { - label: 'Messaging', - method: ApiService.Messaging, - value: project.serviceStatusForMessaging - } - ]; - set({ list }); + set({ list: projectServiceRows(project) }); } }; } diff --git a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte index e8a457ba2..30cac2df3 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/updateServices.svelte @@ -10,7 +10,8 @@ import { project } from '../store'; import Button from '$lib/elements/forms/button.svelte'; import { Dialog, Divider, Layout, Spinner } from '@appwrite.io/pink-svelte'; - import type { ApiService } from '@appwrite.io/console'; + import type { ServiceId } from '@appwrite.io/console'; + import { get } from 'svelte/store'; import { SvelteSet } from 'svelte/reactivity'; @@ -18,7 +19,7 @@ let showUpdateServiceDialog = $state(false); let updateServicesEnabledMode = $state(null); - let apiServiceUpdates = new SvelteSet(); + let apiServiceUpdates = new SvelteSet(); const isAnyServiceUpdating = $derived(apiServiceUpdates.size > 0); const isAnyUpdateInProgress = $derived(isUpdatingAllServices || isAnyServiceUpdating); @@ -41,10 +42,9 @@ apiServiceUpdates.add(service.method); try { - await sdk.forConsoleIn($project.region).projects.updateServiceStatus({ - projectId: $project.$id, - service: service.method, - status: service.value + await sdk.forProject($project.region, $project.$id).project.updateServiceStatus({ + serviceId: service.method, + enabled: service.value }); await invalidate(Dependencies.PROJECT); @@ -74,10 +74,14 @@ isUpdatingAllServices = true; try { - await sdk.forConsoleIn($project.region).projects.updateServiceStatusAll({ - projectId: $project.$id, - status - }); + const projectSdk = sdk.forProject($project.region, $project.$id); + for (const s of get(services).list) { + if (s.value === status) continue; + await projectSdk.project.updateServiceStatus({ + serviceId: s.method, + enabled: status + }); + } await invalidate(Dependencies.PROJECT); diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/details.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/details.svelte index 2907e35ea..25af29889 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/details.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/details.svelte @@ -30,10 +30,10 @@ name: $webhook.name, events: $webhook.events, url: $webhook.url, - security: $webhook.security, + tls: $webhook.tls, enabled, - httpUser: $webhook.httpUser || undefined, - httpPass: $webhook.httpPass || undefined + authUsername: $webhook.authUsername || undefined, + authPassword: $webhook.authPassword || undefined }); await invalidate(Dependencies.WEBHOOK); addNotification({ diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/regenerate.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/regenerate.svelte index 0018a7307..93a7e6e8b 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/regenerate.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/regenerate.svelte @@ -13,7 +13,7 @@ async function regenerate() { try { - await sdk.forProject(page.params.region, projectId).webhooks.updateSignature({ + await sdk.forProject(page.params.region, projectId).webhooks.updateSecret({ webhookId: $webhook.$id }); await invalidate(Dependencies.WEBHOOK); diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateEvents.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateEvents.svelte index 56094759b..73172df85 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateEvents.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateEvents.svelte @@ -31,10 +31,10 @@ name: $webhook.name, events: Array.from($eventSet), url: $webhook.url, - security: $webhook.security, + tls: $webhook.tls, enabled: true, - httpUser: $webhook.httpUser || undefined, - httpPass: $webhook.httpPass || undefined + authUsername: $webhook.authUsername || undefined, + authPassword: $webhook.authPassword || undefined }); await invalidate(Dependencies.WEBHOOK); areEventsDisabled = true; diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateName.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateName.svelte index 842b0a75f..0bebf0f1c 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateName.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateName.svelte @@ -24,10 +24,10 @@ name, events: $webhook.events, url: $webhook.url, - security: $webhook.security, + tls: $webhook.tls, enabled: true, - httpUser: $webhook.httpUser || undefined, - httpPass: $webhook.httpPass || undefined + authUsername: $webhook.authUsername || undefined, + authPassword: $webhook.authPassword || undefined }); await invalidate(Dependencies.WEBHOOK); diff --git a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateSecurity.svelte b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateSecurity.svelte index 7b801473c..6cd871088 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateSecurity.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/webhooks/[webhook]/updateSecurity.svelte @@ -12,14 +12,14 @@ import { Selector, Typography } from '@appwrite.io/pink-svelte'; const projectId = page.params.project; - let httpUser: string = null; - let httpPass: string = null; - let security = false; + let authUsername: string = null; + let authPassword: string = null; + let tls = false; onMount(async () => { - httpUser ??= $webhook.httpUser; - httpPass ??= $webhook.httpPass; - security = $webhook.security; + authUsername ??= $webhook.authUsername; + authPassword ??= $webhook.authPassword; + tls = $webhook.tls; }); async function updateSecurity() { @@ -29,10 +29,10 @@ name: $webhook.name, events: $webhook.events, url: $webhook.url, - security, + tls, enabled: true, - httpUser: httpUser || undefined, - httpPass: httpPass || undefined + authUsername: authUsername || undefined, + authPassword: authPassword || undefined }); await invalidate(Dependencies.WEBHOOK); addNotification({ @@ -60,18 +60,22 @@ HTTP Authentication

Use to secure your endpoint from untrusted sources.

- + + bind:value={authPassword} />