From d7f6efe87e949122fc0ce7ffc71d1ceb3aeef360 Mon Sep 17 00:00:00 2001 From: Jake Barnby Date: Thu, 12 Mar 2026 21:23:28 +1300 Subject: [PATCH] (feat): Add dedicated database settings components --- .../database-[database]/settings/+page.svelte | 141 ++++++++- .../settings/dangerZone.svelte | 66 ++++ .../settings/rotateCredentials.svelte | 90 ++++++ .../settings/updateAutoscaling.svelte | 92 ++++++ .../settings/updateBackupStorage.svelte | 277 +++++++++++++++++ .../settings/updateBackups.svelte | 100 ++++++ .../settings/updateConnections.svelte | 227 ++++++++++++++ .../settings/updateCrossRegion.svelte | 291 ++++++++++++++++++ .../settings/updateExtensions.svelte | 185 +++++++++++ .../settings/updateHAStatus.svelte | 251 +++++++++++++++ .../settings/updateMaintenance.svelte | 102 ++++++ .../settings/updateName.svelte | 63 ++++ .../settings/updateNetwork.svelte | 88 ++++++ .../settings/updatePooler.svelte | 130 ++++++++ .../settings/updateReadReplicas.svelte | 246 +++++++++++++++ .../settings/updateSecurity.svelte | 131 ++++++++ .../settings/updateSqlApi.svelte | 146 +++++++++ .../settings/updateStorage.svelte | 68 ++++ .../settings/updateTier.svelte | 91 ++++++ .../settings/upgradeVersion.svelte | 121 ++++++++ 20 files changed, 2902 insertions(+), 4 deletions(-) create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/dangerZone.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/rotateCredentials.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateAutoscaling.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackupStorage.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackups.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateConnections.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateCrossRegion.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateExtensions.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateHAStatus.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateMaintenance.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateName.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateNetwork.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updatePooler.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateReadReplicas.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSecurity.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSqlApi.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateStorage.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateTier.svelte create mode 100644 src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/upgradeVersion.svelte diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte index 5a9dab551..f5e687804 100644 --- a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/+page.svelte @@ -13,16 +13,48 @@ import Delete from '../delete.svelte'; import { Query } from '@appwrite.io/console'; import { Layout, Skeleton } from '@appwrite.io/pink-svelte'; - import type { PageProps } from './$types'; + import type { DedicatedDatabase } from '$lib/sdk/dedicatedDatabases'; import { getTerminologies } from '$database/(entity)'; + import UpdateName from './updateName.svelte'; + import UpdateTier from './updateTier.svelte'; + import UpdateStorage from './updateStorage.svelte'; + import UpdateNetwork from './updateNetwork.svelte'; + import UpdateMaintenance from './updateMaintenance.svelte'; + import UpdateBackups from './updateBackups.svelte'; + import UpdateAutoscaling from './updateAutoscaling.svelte'; + import UpdatePooler from './updatePooler.svelte'; + import UpdateExtensions from './updateExtensions.svelte'; + import UpdateConnections from './updateConnections.svelte'; + import RotateCredentials from './rotateCredentials.svelte'; + import UpgradeVersion from './upgradeVersion.svelte'; + import UpdateReadReplicas from './updateReadReplicas.svelte'; + import UpdateCrossRegion from './updateCrossRegion.svelte'; + import UpdateHAStatus from './updateHAStatus.svelte'; + import UpdateBackupStorage from './updateBackupStorage.svelte'; + import UpdateSecurity from './updateSecurity.svelte'; + import UpdateSqlApi from './updateSqlApi.svelte'; + import DangerZone from './dangerZone.svelte'; - const { data }: PageProps = $props(); + const data = page.data; const database = $derived(data.database); + const dedicatedDatabase = $derived(data.dedicatedDatabase as DedicatedDatabase | null); + const isDedicatedType = $derived( + dedicatedDatabase !== null && + (database.type === 'prisma' || + database.type === 'dedicated' || + database.type === 'shared') + ); + + const isDedicated = $derived(dedicatedDatabase?.type === 'dedicated'); + const isShared = $derived(dedicatedDatabase?.type === 'shared'); + const isPrisma = $derived(dedicatedDatabase?.backend === 'prisma'); + const isPostgres = $derived(dedicatedDatabase?.engine === 'postgres'); + + // Legacy database fallback state let showDelete = $state(false); let databaseName: string | null = $state(null); - let errorMessage: string = $state('Something went wrong'); let errorType: 'error' | 'warning' | 'success' = $state('error'); let showError: false | 'name' | 'email' | 'password' = $state(false); @@ -70,7 +102,108 @@ } -{#if database} +{#if isDedicatedType && dedicatedDatabase} + + + + {dedicatedDatabase.name} + +
+

Created: {toLocaleDateTime(dedicatedDatabase.$createdAt)}

+

Last updated: {toLocaleDateTime(dedicatedDatabase.$updatedAt)}

+
+
+
+ + + + + + {#if isDedicated} + + {/if} + + + {#if isDedicated || isShared} + + {/if} + + + {#if !isPrisma} + + {/if} + + + {#if isDedicated || isShared} + + {/if} + + + + + + {#if isDedicated || isShared} + + {/if} + + + {#if isPostgres && !isPrisma} + + {/if} + + + {#if isPostgres && !isPrisma} + + {/if} + + + {#if !isPrisma} + + {/if} + + + {#if !isPrisma} + + {/if} + + + {#if isDedicated || isShared} + + {/if} + + + {#if isDedicated} + + {/if} + + + {#if isDedicated} + + {/if} + + + {#if !isPrisma} + + {/if} + + + {#if isDedicated} + + {/if} + + + + + + {#if !isPrisma} + + {/if} + + + +
+{:else if database} + {database.name} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/dangerZone.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/dangerZone.svelte new file mode 100644 index 000000000..21a21b37c --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/dangerZone.svelte @@ -0,0 +1,66 @@ + + + + Delete database + The database will be permanently deleted, including all data and backups. This action is + irreversible. + + + + +
{database.name}
+ + + {getEngineDisplayName(database.engine)} {database.version} + + +
+
+

Last updated: {toLocaleDateTime(database.$updatedAt)}

+
+
+ + + + +
+ + diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/rotateCredentials.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/rotateCredentials.svelte new file mode 100644 index 000000000..e4d799f95 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/rotateCredentials.svelte @@ -0,0 +1,90 @@ + + + + Credential rotation + Generate new database credentials. Existing connections using the old credentials will be + terminated. + + + Rotating credentials will invalidate the current username and password. All active + connections will be dropped. Make sure to update your application configuration + immediately after rotation. + + + + + + + + + +

+ Are you sure you want to rotate the credentials for {database.name}? This will + generate a new username and password, and all existing connections will be terminated. +

+ + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateAutoscaling.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateAutoscaling.svelte new file mode 100644 index 000000000..79360cc2f --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateAutoscaling.svelte @@ -0,0 +1,92 @@ + + +
+ + Storage autoscaling + Automatically increase storage when disk usage reaches a threshold. Storage will never + exceed the configured maximum. + +
    + + {#if autoscaling} + + + {/if} +
+
+ + + + +
+
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackupStorage.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackupStorage.svelte new file mode 100644 index 000000000..35b733314 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackupStorage.svelte @@ -0,0 +1,277 @@ + + +{#if !isLoading} + {#if isConfigured && config} + + Backup storage + Your database backups are stored on an external storage provider for added durability + and disaster recovery. + +
    +
  • +
    + + + Provider: + + {config.provider === 's3' + ? 'Amazon S3' + : config.provider === 'gcs' + ? 'Google Cloud Storage' + : 'Azure Blob Storage'} + + + + Bucket: + {config.bucket} + + + Region: + {config.region} + + {#if config.prefix} + + Prefix: + {config.prefix} + + {/if} + {#if config.endpoint} + + Endpoint: + {config.endpoint} + + {/if} + +
    +
  • +
+
+ + + + +
+ {:else} +
+ + Backup storage + Configure off-cluster backup storage to store backups on an external cloud provider + for added durability and disaster recovery. + +
    + + + + + + + +
+
+ + + + +
+
+ {/if} + + +

+ Are you sure you want to remove the off-cluster backup storage configuration for + {database.name}? Existing backups in the external storage will not be deleted, + but new backups will no longer be stored externally. +

+ + + + +
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackups.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackups.svelte new file mode 100644 index 000000000..a385f703c --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateBackups.svelte @@ -0,0 +1,100 @@ + + +
+ + Backups + Configure automatic backups and point-in-time recovery for your database. + +
    + + {#if backupEnabled} + + + + {/if} +
+
+ + + + +
+
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateConnections.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateConnections.svelte new file mode 100644 index 000000000..7b0b8d9c1 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateConnections.svelte @@ -0,0 +1,227 @@ + + +{#if !isLoading} +
+ + Database users + Create and manage database users with specific roles. Each user receives unique credentials + for connecting to the database. + +
    + {#if connections.length > 0} +
  • + + + {#each connections as connection} + + + +
    + {connection.username} +
    + + + {connection.database} + + + + + Created: {toLocaleDateTime( + connection.$createdAt + )} + +
    + +
    +
    + {/each} +
    +
  • + {:else} +
  • +

    No database users created.

    +
  • + {/if} + + + +
+
+ + + + +
+
+ + +

+ Are you sure you want to delete the database user + {connectionToDelete?.username}? Any active connections using this user will be + terminated. +

+ + + + +
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateCrossRegion.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateCrossRegion.svelte new file mode 100644 index 000000000..f885f535f --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateCrossRegion.svelte @@ -0,0 +1,291 @@ + + +{#if !isLoading} + {#if isEnabled && crossRegionStatus} + + Cross-region failover + Your database has a standby replica in another region for disaster recovery. In the event + of a regional outage, you can trigger a failover to promote the standby to primary. + +
    +
  • + +
    + + + Standby status + + + + Primary: {crossRegionStatus.primaryRegion} + • Standby: {crossRegionStatus.standbyRegion} + + + Lag: {crossRegionStatus.lagSeconds}s + • Last synced: {toLocaleDateTime(crossRegionStatus.lastSyncedAt)} + + +
    +
    +
  • +
+
+ + + + + + + +
+ {:else} +
+ + Cross-region failover + Enable cross-region failover to maintain a standby replica in a different region for + disaster recovery. + +
    + +
+
+ + + + +
+
+ {/if} + + +

+ Are you sure you want to disable cross-region failover for {database.name}? + The standby replica will be removed and your database will no longer have + disaster recovery across regions. +

+ + + + +
+ + +

+ Are you sure you want to trigger a cross-region failover for {database.name}? + This will promote the standby replica in {crossRegionStatus?.standbyRegion} + to primary. The current primary in {crossRegionStatus?.primaryRegion} will + become the new standby. This operation may cause brief downtime. +

+ + + + +
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateExtensions.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateExtensions.svelte new file mode 100644 index 000000000..d90d60b92 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateExtensions.svelte @@ -0,0 +1,185 @@ + + +{#if !isLoading && extensions} +
+ + Extensions + Manage PostgreSQL extensions for your database. Extensions add additional functionality such + as full-text search, geospatial queries, and more. + +
    + {#if extensions.installed.length > 0} +
  • + + + {#each extensions.installed as ext} + { + extensionToUninstall = ext; + showUninstallConfirm = true; + }} /> + {/each} + +
  • + {:else} +
  • +

    No extensions installed.

    +
  • + {/if} + + {#if availableOptions.length > 0} + + {/if} +
+
+ + + + +
+
+ + +

+ Are you sure you want to uninstall the extension {extensionToUninstall} from + {database.name}? Any database objects that depend on this extension may stop + working. +

+ + + + +
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateHAStatus.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateHAStatus.svelte new file mode 100644 index 000000000..f7f3bfa0b --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateHAStatus.svelte @@ -0,0 +1,251 @@ + + +{#if !isLoading} +
+ + High availability + High availability maintains replicas of your database that automatically take over if the + primary instance fails, minimizing downtime. + +
    + + {#if haEnabled} + + + {/if} + + {#if haStatus && haStatus.replicas.length > 0} +
  • + + + {#each haStatus.replicas as replica} +
    + + {replica.$id} + + + + Lag: {replica.lagSeconds}s + + +
    + {/each} +
    +
  • + {/if} +
+
+ + + + {#if haEnabled && haStatus?.enabled} + + {/if} + + + +
+
+ + +

+ Are you sure you want to trigger a manual failover for {database.name}? + This will promote a replica to primary. The operation may cause brief downtime + while the roles are switched. +

+ + + + +
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateMaintenance.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateMaintenance.svelte new file mode 100644 index 000000000..75fa75776 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateMaintenance.svelte @@ -0,0 +1,102 @@ + + +
+ + Maintenance window + Schedule a preferred time window for automatic maintenance operations such as minor + version upgrades and patches. + +
    + + + +
+
+ + + + +
+
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateName.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateName.svelte new file mode 100644 index 000000000..c5dea38b0 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateName.svelte @@ -0,0 +1,63 @@ + + +
+ + Name + + + + + + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateNetwork.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateNetwork.svelte new file mode 100644 index 000000000..0ed2ae3e9 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateNetwork.svelte @@ -0,0 +1,88 @@ + + +
+ + Network + Configure connection limits and network access controls for your database. + +
    + + + +
+
+ + + + +
+
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updatePooler.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updatePooler.svelte new file mode 100644 index 000000000..e5278cf7e --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updatePooler.svelte @@ -0,0 +1,130 @@ + + +{#if !isLoading} +
+ + Connection pooler + A connection pooler sits between your application and the database, reusing connections + to reduce overhead. Transaction mode is recommended for serverless workloads. + +
    + + {#if poolerEnabled} + + + {/if} +
+
+ + + + +
+
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateReadReplicas.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateReadReplicas.svelte new file mode 100644 index 000000000..315ef1236 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateReadReplicas.svelte @@ -0,0 +1,246 @@ + + +{#if !isLoading} +
+ + Read replicas + Deploy read-only replicas of your database to other regions to reduce read latency for + geographically distributed workloads. + +
    + {#if replicas.length > 0} +
  • + + + {#each replicas as replica} +
    + + + + {replica.$id} + + + + {replica.sourceRegion} → {replica.targetRegion} + • Lag: {replica.lagSeconds}s + • {replica.hostname} + + + + +
    + {/each} +
    +
  • + {:else} +
  • +

    No read replicas configured.

    +
  • + {/if} + + {#if availableRegionOptions.length > 0} + + + {/if} +
+
+ + + + +
+
+ + +

+ Are you sure you want to delete the read replica + {replicaToDelete?.$id} in region {replicaToDelete?.targetRegion}? + This action cannot be undone. +

+ + + + +
+{/if} diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSecurity.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSecurity.svelte new file mode 100644 index 000000000..ffee6225a --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSecurity.svelte @@ -0,0 +1,131 @@ + + +
+ + Security + Manage encryption, key management, data residency, and audit logging for your database. + +
    +
  • +
    + + + Encryption at rest: + {database.securityEncryptionAtRest ? 'Enabled' : 'Disabled'} + + + Key management: + {getKeyManagementLabel(database.securityKeyManagement)} + + + Data residency: + {getResidencyLabel(database.securityDataResidency)} + + +
    +
  • + + + {#if auditLogEnabled} + + {/if} +
+
+ + + + +
+
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSqlApi.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSqlApi.svelte new file mode 100644 index 000000000..437b30355 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateSqlApi.svelte @@ -0,0 +1,146 @@ + + +
+ + SQL API + The SQL API allows direct SQL query execution against your database through the Appwrite + API. Configure which statements are permitted and set resource limits. + +
    + + {#if sqlApiEnabled} + + + +
  • + + {#each allStatements as statement} + toggleStatement(statement)} /> + {/each} +
  • + {/if} +
+
+ + + + +
+
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateStorage.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateStorage.svelte new file mode 100644 index 000000000..942808540 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateStorage.svelte @@ -0,0 +1,68 @@ + + +
+ + Storage + Resize the storage allocated to your database. Storage can only be increased, not + decreased. + + + {#if storageGb < database.storage} + Storage can only be increased, not decreased. + {/if} + + + + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateTier.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateTier.svelte new file mode 100644 index 000000000..b4cce42c0 --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/updateTier.svelte @@ -0,0 +1,91 @@ + + +
+ + Resource scaling + Change the compute resources allocated to your database. Scaling may cause a brief + interruption while the database restarts. + + + + + + + + +
diff --git a/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/upgradeVersion.svelte b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/upgradeVersion.svelte new file mode 100644 index 000000000..d5985424d --- /dev/null +++ b/src/routes/(console)/project-[region]-[project]/databases/database-[database]/settings/upgradeVersion.svelte @@ -0,0 +1,121 @@ + + +{#if !isLoading} + + Version + Upgrade your database engine to a newer version. This operation may cause a brief + interruption. + + + + + Current version + + + {currentVersion} + + + + + + + + + + + + +

+ Are you sure you want to upgrade {database.name} from version + {currentVersion} to {targetVersion}? The database may be briefly + unavailable during the upgrade. +

+ + + + +
+{/if}