diff --git a/.prettierignore b/.prettierignore
index fda850b6..cc44befc 100644
--- a/.prettierignore
+++ b/.prettierignore
@@ -8,4 +8,5 @@ build
*.njk
_site
forks
+src/mothership-app/migrations
src/mothership-app/pb_hooks/src/versions.pb.js
\ No newline at end of file
diff --git a/frontends/dashboard/src/components/cards/CardHeader.svelte b/frontends/dashboard/src/components/cards/CardHeader.svelte
index 7d88e9b6..f1257ca0 100644
--- a/frontends/dashboard/src/components/cards/CardHeader.svelte
+++ b/frontends/dashboard/src/components/cards/CardHeader.svelte
@@ -6,7 +6,10 @@
-
Full documentation `${PUBLIC_BLOG_URL}/${path}`
-export const BLOG_URL = (path = '') => LANDER_URL(`blog/${path}`)
-export const DOCS_URL = (path = '') => LANDER_URL(`docs/${path}`)
-export const APP_URL = (path = '') => `${PUBLIC_APP_URL}/${path}`
-export const INSTANCE_URL = (name: string, path = '') =>
- `${PUBLIC_HTTP_PROTOCOL}//${name}.${PUBLIC_APEX_DOMAIN}/${path}`
-export const INSTANCE_ADMIN_URL = (name: string, path = '') =>
- INSTANCE_URL(name, `_/${path}`)
+const mkPath = (...paths: string[]) =>
+ paths
+ .flatMap((path) => path.split('/'))
+ .filter((v) => !!v)
+ .join('/')
+export const LANDER_URL = (...paths: string[]) =>
+ `${PUBLIC_BLOG_URL}/${mkPath(...paths)}`
+export const BLOG_URL = (...paths: string[]) => LANDER_URL(`blog`, ...paths)
+export const DOCS_URL = (...paths: string[]) => LANDER_URL(`docs`, ...paths)
+export const APP_URL = (...paths: string[]) =>
+ `${PUBLIC_APP_URL}/${mkPath(...paths)}`
+export const INSTANCE_URL = (name: string, ...paths: string[]) =>
+ `${PUBLIC_HTTP_PROTOCOL}//${name}.${PUBLIC_APEX_DOMAIN}/${mkPath(...paths)}`
+export const INSTANCE_ADMIN_URL = (name: string, ...paths: string[]) =>
+ INSTANCE_URL(name, `_/${mkPath(...paths)}`)
export const FTP_URL = (email: string) =>
`ftp://${encodeURIComponent(email)}@ftp.sfo-1.${PUBLIC_APEX_DOMAIN}`
diff --git a/frontends/dashboard/src/pocketbase-client/PocketbaseClient.ts b/frontends/dashboard/src/pocketbase-client/PocketbaseClient.ts
index 976d0222..e5ec19c2 100644
--- a/frontends/dashboard/src/pocketbase-client/PocketbaseClient.ts
+++ b/frontends/dashboard/src/pocketbase-client/PocketbaseClient.ts
@@ -8,7 +8,6 @@ import {
UpdateInstanceResult,
assertExists,
createRestHelper,
- createWatchHelper,
type CreateInstancePayload,
type CreateInstanceResult,
type InstanceFields,
@@ -23,8 +22,6 @@ import PocketBase, {
BaseAuthStore,
ClientResponseError,
type AuthModel,
- type RecordSubscription,
- type UnsubscribeFunc,
} from 'pocketbase'
export type AuthChangeHandler = (user: BaseAuthStore) => void
@@ -98,20 +95,18 @@ export const createPocketbaseClient = (config: PocketbaseClientConfig) => {
const refreshAuthToken = () => client.collection('users').authRefresh()
- const watchHelper = createWatchHelper({ client })
- const { watchById, watchAllById } = watchHelper
- const restMixin = createRestHelper({ client, watchHelper })
+ const restMixin = createRestHelper({ client })
const { mkRest } = restMixin
const createInstance = mkRest
(
RestCommands.Instance,
- RestMethods.Create,
+ RestMethods.Post,
CreateInstancePayloadSchema,
)
const updateInstance = mkRest(
RestCommands.Instance,
- RestMethods.Update,
+ RestMethods.Put,
UpdateInstancePayloadSchema,
)
@@ -120,11 +115,6 @@ export const createPocketbaseClient = (config: PocketbaseClientConfig) => {
): Promise =>
client.collection('instances').getOne(id)
- const watchInstanceById = async (
- id: InstanceId,
- cb: (data: RecordSubscription) => void,
- ): Promise => watchById('instances', id, cb)
-
const getAllInstancesById = async () =>
(await client.collection('instances').getFullList()).reduce(
(c, v) => {
@@ -287,7 +277,6 @@ export const createPocketbaseClient = (config: PocketbaseClientConfig) => {
onAuthChange,
isLoggedIn,
user,
- watchInstanceById,
getAllInstancesById,
resendVerificationEmail,
updateInstance,
diff --git a/frontends/dashboard/src/routes/+layout.svelte b/frontends/dashboard/src/routes/+layout.svelte
index 05533429..d9c62c3b 100644
--- a/frontends/dashboard/src/routes/+layout.svelte
+++ b/frontends/dashboard/src/routes/+layout.svelte
@@ -27,9 +27,7 @@
-
+
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/+page.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/+page.svelte
index 36c5bd20..2a63b262 100644
--- a/frontends/dashboard/src/routes/app/instances/[instanceId]/+page.svelte
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/+page.svelte
@@ -4,6 +4,7 @@
import { INSTANCE_ADMIN_URL } from '$src/env'
import { slide } from 'svelte/transition'
import Code from './Code.svelte'
+ import AdminSync from './Danger/AdminSync.svelte'
import DangerZoneTitle from './Danger/DangerZoneTitle.svelte'
import Maintenance from './Danger/Maintenance.svelte'
import RenameInstance from './Danger/RenameInstance.svelte'
@@ -11,7 +12,6 @@
import Ftp from './Ftpx.svelte'
import Logging from './Logging.svelte'
import Secrets from './Secrets/Secrets.svelte'
- import UsageChart from './UsageChart.svelte'
import { instance } from './store'
const { instanceId } = $page.params
@@ -67,16 +67,13 @@
{/if}
-
-
+
-
+
-
-
@@ -88,4 +85,6 @@
+
+
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/Code.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/Code.svelte
index c8fd3a51..7fed448f 100644
--- a/frontends/dashboard/src/routes/app/instances/[instanceId]/Code.svelte
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/Code.svelte
@@ -2,7 +2,7 @@
import CodeSample from '$components/CodeSample.svelte'
import Card from '$components/cards/Card.svelte'
import CardHeader from '$components/cards/CardHeader.svelte'
- import { DOCS_URL, INSTANCE_URL } from '$src/env'
+ import { INSTANCE_URL } from '$src/env'
import { instance } from './store'
let installSnippet = `npm i pocketbase`
@@ -39,8 +39,10 @@
Additional Resources:
-
- PocketBase Web APIsPocketBase Web APIs
-
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/AdminSync.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/AdminSync.svelte
new file mode 100644
index 00000000..10a9391e
--- /dev/null
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/AdminSync.svelte
@@ -0,0 +1,40 @@
+
+
+
+
+ Admin Sync
+
+
+
+ Your instance will have an admin login that matches your pockethost.io
+ login.
+
+
+
+
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/Maintenance.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/Maintenance.svelte
index 2a1104b3..a3be5441 100644
--- a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/Maintenance.svelte
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/Maintenance.svelte
@@ -14,7 +14,7 @@
const isChecked = target.checked
// Update the database with the new value
- updateInstance({ instanceId: id, fields: { maintenance: isChecked } }).then(
+ updateInstance({ id, fields: { maintenance: isChecked } }).then(
() => 'saved',
)
}
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/RenameInstance.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/RenameInstance.svelte
index b096a57f..4aaa7c8b 100644
--- a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/RenameInstance.svelte
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/RenameInstance.svelte
@@ -40,7 +40,7 @@
// If they select yes, then update the version in pocketbase
if (confirmVersionChange) {
updateInstance({
- instanceId: id,
+ id,
fields: {
subdomain: instanceNameValidation,
},
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/VersionChange.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/VersionChange.svelte
index e71ab08a..146c1604 100644
--- a/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/VersionChange.svelte
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/Danger/VersionChange.svelte
@@ -39,7 +39,7 @@
errorMessage = ''
client()
.updateInstance({
- instanceId: id,
+ id,
fields: { version: selectedVersion },
})
.then(() => {
diff --git a/frontends/dashboard/src/routes/app/instances/[instanceId]/Secrets/Form.svelte b/frontends/dashboard/src/routes/app/instances/[instanceId]/Secrets/Form.svelte
index 451f28c4..48ba734f 100644
--- a/frontends/dashboard/src/routes/app/instances/[instanceId]/Secrets/Form.svelte
+++ b/frontends/dashboard/src/routes/app/instances/[instanceId]/Secrets/Form.svelte
@@ -44,7 +44,7 @@
// Save to the database
items.upsert({ name: secretKey, value: secretValue })
await client().updateInstance({
- instanceId: $instance.id,
+ id: $instance.id,
fields: {
secrets: reduce(
$items,
diff --git a/frontends/dashboard/src/routes/login/password-reset/+page.svelte b/frontends/dashboard/src/routes/login/password-reset/+page.svelte
index 3a34a154..9e5df8f4 100644
--- a/frontends/dashboard/src/routes/login/password-reset/+page.svelte
+++ b/frontends/dashboard/src/routes/login/password-reset/+page.svelte
@@ -1,6 +1,6 @@