From 37de7d5ed90177ae8e6fd0bd13f30b5547aadde0 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 28 May 2025 16:23:28 +0530 Subject: [PATCH 1/2] update: patch the migrations flow. --- .../(console)/(migration-wizard)/index.ts | 2 + .../(migration-wizard)/resource-form.svelte | 275 +++--------- .../(migration-wizard)/wizard.svelte | 413 ++++++++++++++++-- .../migrations/(import)/importReport.svelte | 120 ++++- .../settings/migrations/(import)/step1.svelte | 0 .../settings/migrations/(import)/step2.svelte | 0 6 files changed, 550 insertions(+), 260 deletions(-) delete mode 100644 src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte delete mode 100644 src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte diff --git a/src/routes/(console)/(migration-wizard)/index.ts b/src/routes/(console)/(migration-wizard)/index.ts index 9c065b9bf0..fcde1e141a 100644 --- a/src/routes/(console)/(migration-wizard)/index.ts +++ b/src/routes/(console)/(migration-wizard)/index.ts @@ -3,6 +3,7 @@ import { wizard } from '$lib/stores/wizard'; import { requestedMigration } from '$routes/store'; import { get, writable } from 'svelte/store'; import Wizard from './wizard.svelte'; +import { Region } from '@appwrite.io/console'; export const formData = createMigrationFormStore(); @@ -18,5 +19,6 @@ export function openMigrationWizard() { } export const selectedProject = writable(null); +export const selectedRegion = writable(Region.Fra); export const provider = createMigrationProviderStore(); diff --git a/src/routes/(console)/(migration-wizard)/resource-form.svelte b/src/routes/(console)/(migration-wizard)/resource-form.svelte index d438e4fd85..103d084b21 100644 --- a/src/routes/(console)/(migration-wizard)/resource-form.svelte +++ b/src/routes/(console)/(migration-wizard)/resource-form.svelte @@ -1,12 +1,12 @@ @@ -148,174 +133,42 @@ {/if} {#if error} - - Please check if your credentials are filled in correctly in the previous step + + {#if migrationType === 'provider'} + Please double-check your credentials from the previous step and try again. + {:else} + The API key required for the migration may no longer be valid or has expired, please + verify and start migration again. + {/if} - {/if} - - - - - - - - - - {#if resources?.includes('user')} - - - - -
- -
+ {:else} + + + + + + + - {/if} - - {#if resources?.includes('database')} - - -
+ {#each Object.entries($formData) as [groupKey, formGroup]} + {#if shouldRenderGroup(groupKey)} -
-
- {/if} - - {#if resources?.includes('function') && isVersionAtLeast(version, '1.4.0')} - - - - {#if resources?.includes('environment-variable') || resources?.includes('deployment')} -
- - {#if resources?.includes('environment-variable')} - - {/if} - - {#if resources?.includes('deployment')} - - {/if} - -
+ {error} + {formGroup} + groupKey={getAsType(groupKey)} + reportValue={report?.[getReportKey(groupKey)]} /> {/if} -
- {/if} - - {#if resources?.includes('bucket') && resources?.includes('file')} - {@const storageSize = report?.size >= 0 ? `${report?.size.toFixed(2)}MB` : undefined} - - - -
- - Import all buckets - {#if $provider.provider !== 'firebase' && report?.bucket} - {report.bucket} - {/if} - and files - {#if $provider.provider !== 'firebase' && report?.file} - {report.file} - {/if} - -
-
+ {/each} {/if}
- - - diff --git a/src/routes/(console)/(migration-wizard)/wizard.svelte b/src/routes/(console)/(migration-wizard)/wizard.svelte index e0b296759f..5c19800580 100644 --- a/src/routes/(console)/(migration-wizard)/wizard.svelte +++ b/src/routes/(console)/(migration-wizard)/wizard.svelte @@ -1,52 +1,409 @@ - + + + {#if !showResources} + + {#if organizations.length >= 1} +
+ ({ + label: project.name, + value: project.$id + }))} + disabled={loadingProjects} /> +
+ {/if} + +
+ {#if loadingProjects} + + + + + + + + {:else} + + + + Import data to an existing project + + + + Import data to a new project + + + + {#if projectType === 'existing'} + ({ + label: p.name, + value: p.$id + }))} /> + {:else} + + + + {#if isCloud && $regions.regions.length > 0} + + Region cannot be changed after creation + {/if} + + {/if} + + { + if (isExisting) { + showResources = true; + } else { + const project = await createNewProject(); + if (project !== null) { + projectSdkInstance = sdk.forProject( + project.region, + project.$id + ); + showResources = true; + } + } + }}> + {#if creatingProject} + + {/if} + + Next + + + + {/if} +
+
+ {:else} + + + + + + + {capitalize(getProjectName())} + + + + (showResources = !showResources)}> + Update + + + + {/if} + + {#if showResources} +
+ + + +
+ {/if} +
+ + + + + Good to know + + + + + + + + Project settings are not imported + You will need to set service and project settings manually. + + + + + + + + + + Keep your organization plan's limits in mind + Make sure to have enough storage in your organization plan when importing files. + + + + + + {@const isFirebase = $provider.provider === 'firebase'} + + + + + + {isFirebase + ? 'Possible charges by Firebase' + : 'Transfer is free of charge'} + + + {#if isFirebase} + Appwrite does not impose charges for importing data, but please note + that Firebase may have its own pricing for this service + {:else} + You won't be charged for Appwrite bandwidth usage for importing data + {/if} + + + + + + + + (showExitModal = true)}> + Cancel + + + + {#if migrationStarted} + + {/if} + Create + + +
diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte index a7c0b4cc37..e86559bae4 100644 --- a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte +++ b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/importReport.svelte @@ -1,34 +1,112 @@ - - - - - +{#if !formGroupChildren.length} +
+ +
+{:else} + + + {#each formGroupChildren as key} +
+
- {/if} + {/each}
-
-
+ +{/if} diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step1.svelte deleted file mode 100644 index e69de29bb2..0000000000 diff --git a/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte b/src/routes/(console)/project-[region]-[project]/settings/migrations/(import)/step2.svelte deleted file mode 100644 index e69de29bb2..0000000000 From 098882b2d308fb270997378b11e854ccf4d49aa5 Mon Sep 17 00:00:00 2001 From: Darshan Date: Wed, 28 May 2025 17:32:42 +0530 Subject: [PATCH 2/2] address comment: abstract region filtering for selection options. --- src/lib/helpers/regions.ts | 27 +++++++++++ src/lib/layout/createProject.svelte | 22 +-------- .../(migration-wizard)/wizard.svelte | 47 +++++-------------- .../(public)/template-[template]/+page.svelte | 23 +-------- 4 files changed, 44 insertions(+), 75 deletions(-) create mode 100644 src/lib/helpers/regions.ts diff --git a/src/lib/helpers/regions.ts b/src/lib/helpers/regions.ts new file mode 100644 index 0000000000..9f04f3fdaa --- /dev/null +++ b/src/lib/helpers/regions.ts @@ -0,0 +1,27 @@ +import { getFlagUrl } from '$lib/helpers/flag'; +import type { Models } from '@appwrite.io/console'; + +type RegionOption = { + label: string; + value: string; + disabled: boolean; + leadingHtml: string; +}; + +export function filterRegions(regions: Models.ConsoleRegion[]): RegionOption[] { + if (!regions.length) return []; + + return regions + .filter((region) => region.$id !== 'default') + .sort((a, b) => { + if (a.disabled && !b.disabled) return 1; + if (!a.disabled && b.disabled) return -1; + return a.name.localeCompare(b.name); + }) + .map((region) => ({ + label: region.name, + value: region.$id, + disabled: region.disabled || !region.available, + leadingHtml: `Region flag` + })); +} diff --git a/src/lib/layout/createProject.svelte b/src/lib/layout/createProject.svelte index 5c206297ea..7d368dde06 100644 --- a/src/lib/layout/createProject.svelte +++ b/src/lib/layout/createProject.svelte @@ -5,6 +5,7 @@ import { getFlagUrl } from '$lib/helpers/flag'; import { isCloud } from '$lib/system.js'; import type { Models } from '@appwrite.io/console'; + import { filterRegions } from '$lib/helpers/regions'; export let projectName: string; export let id: string; @@ -13,25 +14,6 @@ export let showTitle = true; let showCustomId = false; - - function getRegions() { - return regions - .filter((region) => region.$id !== 'default') - .sort((regionA, regionB) => { - if (regionA.disabled && !regionB.disabled) { - return 1; - } - return regionA.name > regionB.name ? 1 : -1; - }) - .map((region) => { - return { - label: region.name, - value: region.$id, - leadingHtml: `Region flag`, - disabled: region.disabled || !region.available - }; - }); - } @@ -69,7 +51,7 @@ Region cannot be changed after creation
diff --git a/src/routes/(console)/(migration-wizard)/wizard.svelte b/src/routes/(console)/(migration-wizard)/wizard.svelte index 5c19800580..99c23b7d24 100644 --- a/src/routes/(console)/(migration-wizard)/wizard.svelte +++ b/src/routes/(console)/(migration-wizard)/wizard.svelte @@ -21,9 +21,8 @@ } from '@appwrite.io/pink-svelte'; import { isCloud } from '$lib/system'; import { regions } from '$lib/stores/organization'; - import { getFlagUrl } from '$lib/helpers/flag'; import { addNotification } from '$lib/stores/notifications'; - import { goto, invalidate, invalidateAll } from '$app/navigation'; + import { goto, invalidate } from '$app/navigation'; import { base } from '$app/paths'; import { migrationFormToResources } from '$lib/stores/migration'; import { EyebrowHeading } from '$lib/components'; @@ -32,10 +31,10 @@ IconCog, IconCurrencyDollar, IconExclamation, - IconGithub, IconTrendingUp } from '@appwrite.io/pink-icons-svelte'; import { Dependencies } from '$lib/constants'; + import { filterRegions } from '$lib/helpers/regions'; const onExit = () => { formData.reset(); @@ -79,11 +78,7 @@ } function getProjectName(): string { - return isExisting ? getSelectedProject().name : newProjName || 'Appwrite project'; - } - - function getSelectedProject() { - return projects.find((project) => project.$id === $selectedProject); + return isExisting ? currentSelectedProject.name : newProjName || 'Appwrite project'; } async function createNewProject() { @@ -108,25 +103,6 @@ } } - function getRegions() { - return $regions.regions - .filter((region) => region.$id !== 'default') - .sort((regionA, regionB) => { - if (regionA.disabled && !regionB.disabled) { - return 1; - } - return regionA.name > regionB.name ? 1 : -1; - }) - .map((region) => { - return { - label: region.name, - value: region.$id, - leadingHtml: `Region flag`, - disabled: region.disabled || !region.available - }; - }); - } - const onFinish = async () => { if ($provider.provider !== 'appwrite') return; @@ -141,16 +117,15 @@ $provider.apiKey ); - const project = getSelectedProject(); - addNotification({ type: 'success', message: 'Migration started' }); - onExit(); await invalidate(Dependencies.PROJECTS); - await goto(`${base}/project-${project.region}-${project.$id}/settings/migrations`); + await goto( + `${base}/project-${currentSelectedProject.region}-${currentSelectedProject.$id}/settings/migrations` + ); } catch (error) { addNotification({ type: 'error', @@ -163,11 +138,15 @@ $: getProjects(selectedOrg); + $: currentSelectedProject = projects.find((project) => project.$id === $selectedProject); + $: isExisting = projectType === 'existing'; $: if (isExisting && $selectedProject) { - const project = getSelectedProject(); - projectSdkInstance = sdk.forProject(project.region, project.$id); + projectSdkInstance = sdk.forProject( + currentSelectedProject.region, + currentSelectedProject.$id + ); } $: disableNextButton = isExisting @@ -258,7 +237,7 @@ >([]); let id = $state(); - function getRegions() { - return regions - .filter((region) => region.$id !== 'default') - .sort((regionA, regionB) => { - if (regionA.disabled && !regionB.disabled) { - return 1; - } - return regionA.name > regionB.name ? 1 : -1; - }) - .map((region) => { - return { - label: region.name, - value: region.$id, - leadingHtml: `Region flag`, - disabled: region.disabled - }; - }); - } - function isSiteTemplate( template: Models.TemplateFunction | Models.TemplateSite, product: 'site' | 'function' @@ -243,7 +224,7 @@ required bind:value={region} placeholder="Select a region" - options={getRegions()} + options={filterRegions(regions)} label="Region" /> Region cannot be changed after creation