From 4c933c05ab95dd3a80dd0ea4374c4908e9fc631d Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 10 Sep 2025 21:05:16 +0800 Subject: [PATCH 1/3] chore(ui): about --- ui/src/components/AppDocument.tsx | 8 +- ui/src/domain/app.ts | 18 ++-- ui/src/i18n/locales/en/nls.settings.json | 14 ++- ui/src/i18n/locales/zh/nls.settings.json | 14 ++- ui/src/pages/ConsoleLayout.tsx | 8 +- ui/src/pages/settings/Settings.tsx | 3 +- ui/src/pages/settings/SettingsAbout.tsx | 88 +++++++++++++++++++ ui/src/pages/settings/SettingsDiagnostics.tsx | 7 +- ui/src/routers/index.tsx | 5 ++ 9 files changed, 144 insertions(+), 21 deletions(-) create mode 100644 ui/src/pages/settings/SettingsAbout.tsx diff --git a/ui/src/components/AppDocument.tsx b/ui/src/components/AppDocument.tsx index ef738d992..d4d2dcb24 100644 --- a/ui/src/components/AppDocument.tsx +++ b/ui/src/components/AppDocument.tsx @@ -11,14 +11,10 @@ export interface AppDocumentLinkButtonProps { } const AppDocumentLinkButton = ({ className, style, showIcon = true }: AppDocumentLinkButtonProps) => { - const { i18n, t } = useTranslation(); + const { t } = useTranslation(); const handleDocumentClick = () => { - if (i18n.language.startsWith("en")) { - window.open(APP_DOCUMENT_URL + "/en/", "_blank"); - } else { - window.open(APP_DOCUMENT_URL, "_blank"); - } + window.open(APP_DOCUMENT_URL, "_blank"); }; return ( diff --git a/ui/src/domain/app.ts b/ui/src/domain/app.ts index bc7f58e27..11bcc27fc 100644 --- a/ui/src/domain/app.ts +++ b/ui/src/domain/app.ts @@ -1,8 +1,16 @@ -export const APP_REPO_URL = "https://github.com/certimate-go/certimate"; - -export const APP_DOWNLOAD_URL = APP_REPO_URL + "/releases"; - -export const APP_DOCUMENT_URL = "https://docs.certimate.me"; +import i18next from "i18next"; // fallback policy: .env > git tag > "v0.0.0-dev" export const APP_VERSION: string = import.meta.env.VITE_APP_VERSION || __APP_VERSION__ || "v0.0.0-dev"; + +export const APP_REPO_URL = "https://github.com/certimate-go/certimate"; +export const APP_DOWNLOAD_URL = APP_REPO_URL + "/releases"; +export let APP_DOCUMENT_URL = "https://docs.certimate.me"; + +i18next.on("languageChanged", (language) => { + if (language.startsWith("zh")) { + APP_DOCUMENT_URL = "https://docs.certimate.me"; + } else { + APP_DOCUMENT_URL = "https://docs.certimate.me/en/"; + } +}); diff --git a/ui/src/i18n/locales/en/nls.settings.json b/ui/src/i18n/locales/en/nls.settings.json index 642a11a0b..29789404c 100644 --- a/ui/src/i18n/locales/en/nls.settings.json +++ b/ui/src/i18n/locales/en/nls.settings.json @@ -57,5 +57,17 @@ "settings.diagnostics.workflow_dispatcher.title": "Workflow dispatcher", "settings.diagnostics.workflow_dispatcher.statistics.concurrency": "Concurrency", "settings.diagnostics.workflow_dispatcher.statistics.pending": "Pending", - "settings.diagnostics.workflow_dispatcher.statistics.processing": "Processing" + "settings.diagnostics.workflow_dispatcher.statistics.processing": "Processing", + + "settings.about.tab": "About", + "settings.about.version.new": "New version available", + "settings.about.socials.document": "Documentation", + "settings.about.socials.github": "GitHub", + "settings.about.socials.telegram": "Telegram", + "settings.about.socials.donate": "Donate", + "settings.about.feedback.title": "Help us improve Certimate", + "settings.about.feedback.subtitle": "Tell us how to make Certimate work better for you.", + "settings.about.feedback.button": "Give feedback", + "settings.about.contributors.title": "Contributors", + "settings.about.contributors.tips": "Thanks to all the people who have contributed to this project." } diff --git a/ui/src/i18n/locales/zh/nls.settings.json b/ui/src/i18n/locales/zh/nls.settings.json index 94d398492..a59c39da7 100644 --- a/ui/src/i18n/locales/zh/nls.settings.json +++ b/ui/src/i18n/locales/zh/nls.settings.json @@ -57,5 +57,17 @@ "settings.diagnostics.workflow_dispatcher.title": "工作流调度器", "settings.diagnostics.workflow_dispatcher.statistics.concurrency": "最大并发", "settings.diagnostics.workflow_dispatcher.statistics.pending": "等待运行", - "settings.diagnostics.workflow_dispatcher.statistics.processing": "运行中" + "settings.diagnostics.workflow_dispatcher.statistics.processing": "运行中", + + "settings.about.tab": "关于", + "settings.about.version.new": "有新版本可更新", + "settings.about.socials.document": "文档", + "settings.about.socials.github": "GitHub", + "settings.about.socials.telegram": "Telegram", + "settings.about.socials.donate": "捐赠", + "settings.about.feedback.title": "帮助我们改进 Certimate", + "settings.about.feedback.subtitle": "告诉我们如何让 Certimate 为你更好地服务。", + "settings.about.feedback.button": "意见反馈", + "settings.about.contributors.title": "贡献者", + "settings.about.contributors.tips": "感谢所有贡献者对本项目做出的贡献。" } diff --git a/ui/src/pages/ConsoleLayout.tsx b/ui/src/pages/ConsoleLayout.tsx index 7d7f635f7..16c88902f 100644 --- a/ui/src/pages/ConsoleLayout.tsx +++ b/ui/src/pages/ConsoleLayout.tsx @@ -28,7 +28,7 @@ import { isBrowserHappy } from "@/utils/browser"; const ConsoleLayout = () => { const navigate = useNavigate(); - const { i18n, t } = useTranslation(); + const { t } = useTranslation(); const { token: themeToken } = theme.useToken(); @@ -40,11 +40,7 @@ const ConsoleLayout = () => { }; const handleDocumentClick = () => { - if (i18n.language.startsWith("zh")) { - window.open(APP_DOCUMENT_URL, "_blank"); - } else { - window.open(APP_DOCUMENT_URL + "/en/", "_blank"); - } + window.open(APP_DOCUMENT_URL, "_blank"); }; const handleGitHubClick = () => { diff --git a/ui/src/pages/settings/Settings.tsx b/ui/src/pages/settings/Settings.tsx index 038ad0397..5c22351e5 100644 --- a/ui/src/pages/settings/Settings.tsx +++ b/ui/src/pages/settings/Settings.tsx @@ -1,7 +1,7 @@ import { useEffect, useState } from "react"; import { useTranslation } from "react-i18next"; import { Outlet, useLocation, useNavigate } from "react-router-dom"; -import { IconBracketsAngle, IconDatabaseCog, IconPalette, IconPlugConnected, IconUserShield } from "@tabler/icons-react"; +import { IconBracketsAngle, IconDatabaseCog, IconInfoCircle, IconPalette, IconPlugConnected, IconUserShield } from "@tabler/icons-react"; import { Menu } from "antd"; const Settings = () => { @@ -16,6 +16,7 @@ const Settings = () => { ["ssl-provider", "settings.sslprovider.tab", ], ["persistence", "settings.persistence.tab", ], ["diagnostics", "settings.diagnostics.tab", ], + ["about", "settings.about.tab", ], ] satisfies [string, string, React.ReactElement][]; const [menuKey, setMenuKey] = useState(() => location.pathname.split("/")[2]); useEffect(() => { diff --git a/ui/src/pages/settings/SettingsAbout.tsx b/ui/src/pages/settings/SettingsAbout.tsx new file mode 100644 index 000000000..b4d86e8cf --- /dev/null +++ b/ui/src/pages/settings/SettingsAbout.tsx @@ -0,0 +1,88 @@ +import { useTranslation } from "react-i18next"; +import { IconBook, IconBrandGithub, IconBrandTelegram, IconCoin, IconMessageChatbot } from "@tabler/icons-react"; +import { Badge, Button, Divider, List, Tooltip, Typography } from "antd"; + +import { APP_DOCUMENT_URL, APP_DOWNLOAD_URL, APP_REPO_URL, APP_VERSION } from "@/domain/app"; +import { useVersionChecker } from "@/hooks"; + +const SettingsAbout = () => { + const { t } = useTranslation(); + + const { hasUpdate } = useVersionChecker(); + + const handleDownloadClick = () => { + window.open(APP_DOWNLOAD_URL, "_blank"); + }; + + const handleDocumentClick = () => { + window.open(APP_DOCUMENT_URL, "_blank"); + }; + + const handleGithubClick = () => { + window.open(APP_REPO_URL, "_blank"); + }; + + const handleTelegramClick = () => { + window.open("https://t.me/+ZXphsppxUg41YmVl", "_blank"); + }; + + const handleDonateClick = () => { + window.open("https://profile.ikit.fun/sponsors/", "_blank"); + }; + + const handleFeedbackClick = () => { + window.open(APP_REPO_URL + "/issues", "_blank"); + }; + + return ( + <> +

Certimate

+
+
+ Version: {APP_VERSION} + +
+
+
+ +
+ + + +

{t("settings.about.contributors.title")}

+
+ {t("settings.about.contributors.tips")} +
+
+ Contributors +
+ + + +
+ + {t("settings.about.feedback.button")}}> + } + title={t("settings.about.feedback.title")} + description={t("settings.about.feedback.subtitle")} + /> + + +
+ + ); +}; + +export default SettingsAbout; diff --git a/ui/src/pages/settings/SettingsDiagnostics.tsx b/ui/src/pages/settings/SettingsDiagnostics.tsx index b693d1311..c1157e8c3 100644 --- a/ui/src/pages/settings/SettingsDiagnostics.tsx +++ b/ui/src/pages/settings/SettingsDiagnostics.tsx @@ -306,7 +306,7 @@ const SettingsDiagnosticsWorkflowDispatcher = ({ className, style }: { className type Statistics = Awaited>["data"]; const [statistics, setStatistics] = useState(); - const { loading } = useRequest( + const { loading, cancel } = useRequest( () => { return getWorkflowStats(); }, @@ -318,6 +318,11 @@ const SettingsDiagnosticsWorkflowDispatcher = ({ className, style }: { className onSuccess: (res) => { setStatistics(res.data); }, + onError: () => { + if (!statistics) { + cancel(); + } + }, } ); diff --git a/ui/src/routers/index.tsx b/ui/src/routers/index.tsx index be671ebcf..cabf6278c 100644 --- a/ui/src/routers/index.tsx +++ b/ui/src/routers/index.tsx @@ -9,6 +9,7 @@ import Dashboard from "@/pages/dashboard/Dashboard"; import ErrorLayout from "@/pages/ErrorLayout"; import Login from "@/pages/login/Login"; import Settings from "@/pages/settings/Settings"; +import SettingsAbout from "@/pages/settings/SettingsAbout"; import SettingsAccount from "@/pages/settings/SettingsAccount"; import SettingsAppearance from "@/pages/settings/SettingsAppearance"; import SettingsDiagnostics from "@/pages/settings/SettingsDiagnostics"; @@ -87,6 +88,10 @@ export const router = createHashRouter([ path: "/settings/diagnostics", element: , }, + { + path: "/settings/about", + element: , + }, ], }, ], From d51a4f69ad6ae3e1526a449f7359e1cfbe5017c2 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 10 Sep 2025 21:07:36 +0800 Subject: [PATCH 2/3] build: stable docker linux/armv7 arch support --- .github/workflows/push_image.yml | 44 ++++++++++++++++++++++++--- .github/workflows/push_image_next.yml | 7 +++-- 2 files changed, 43 insertions(+), 8 deletions(-) diff --git a/.github/workflows/push_image.yml b/.github/workflows/push_image.yml index 52db22d69..32b3d1257 100644 --- a/.github/workflows/push_image.yml +++ b/.github/workflows/push_image.yml @@ -14,7 +14,34 @@ on: default: "latest" jobs: + prepare-ui: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v4 + with: + fetch-depth: 0 + + - name: Set up Node.js + uses: actions/setup-node@v4 + with: + node-version: 22.19.0 + + - name: Build UI + run: | + echo "VITE_APP_VERSION=${GITHUB_REF#refs/tags/}" > ./ui/.env + npm --prefix=./ui ci + npm --prefix=./ui run build + + - name: Upload UI build artifacts + uses: actions/upload-artifact@v4 + with: + name: ui-build + path: ./ui/dist + retention-days: 1 + build-and-push: + needs: prepare-ui runs-on: ubuntu-latest steps: - name: Checkout code @@ -52,15 +79,22 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Inject tag version of UI - run: | - echo "VITE_APP_VERSION=${GITHUB_REF#refs/tags/}" > ./ui/.env + # - name: Inject tag version of UI + # run: | + # echo "VITE_APP_VERSION=${GITHUB_REF#refs/tags/}" > ./ui/.env + + - name: Download UI build artifacts + uses: actions/download-artifact@v4 + with: + name: ui-build + path: ./ui/dist - name: Build and push Docker image uses: docker/build-push-action@v6 with: context: . - file: ./Dockerfile - platforms: linux/amd64,linux/arm64 + # file: ./Dockerfile + file: ./Dockerfile.gh + platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true tags: ${{ steps.meta.outputs.tags }} diff --git a/.github/workflows/push_image_next.yml b/.github/workflows/push_image_next.yml index 5f167b1c8..90d3f8916 100644 --- a/.github/workflows/push_image_next.yml +++ b/.github/workflows/push_image_next.yml @@ -77,9 +77,9 @@ jobs: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }} - - name: Inject tag version of UI - run: | - echo "VITE_APP_VERSION=${GITHUB_REF#refs/tags/}" > ./ui/.env + # - name: Inject tag version of UI + # run: | + # echo "VITE_APP_VERSION=${GITHUB_REF#refs/tags/}" > ./ui/.env - name: Download UI build artifacts uses: actions/download-artifact@v4 @@ -91,6 +91,7 @@ jobs: uses: docker/build-push-action@v6 with: context: . + # file: ./Dockerfile.gh file: ./Dockerfile.gh platforms: linux/amd64,linux/arm64,linux/arm/v7 push: true From d44b481519571a6e6370a81d272a6987e81817e8 Mon Sep 17 00:00:00 2001 From: Fu Diwei Date: Wed, 10 Sep 2025 21:56:37 +0800 Subject: [PATCH 3/3] chore(migration): snapshot --- migrations/1739462400_collections_snapshot.go | 1808 ----------------- migrations/1739462401_superusers_initial.go | 44 - migrations/1740050400_upgrade.go | 150 -- migrations/1742209200_upgrade.go | 359 ---- migrations/1742392800_upgrade.go | 93 - migrations/1742644800_upgrade.go | 203 -- migrations/1743264000_upgrade.go | 182 -- migrations/1744192800_upgrade.go | 103 - migrations/1744459000_upgrade.go | 104 - migrations/1745308800_upgrade.go | 103 - migrations/1745726400_upgrade.go | 100 - migrations/1747314000_upgrade.go | 54 - migrations/1747389600_upgrade.go | 85 - migrations/1748178000_upgrade.go | 72 - migrations/1748228400_upgrade.go | 45 - migrations/1748959200_upgrade.go | 62 - migrations/1750687200_upgrade.go | 93 - migrations/1751961600_upgrade.go | 112 - migrations/1756296000_cm0.4.0_migrate.go | 232 ++- migrations/1757476800_cm0.4.0_initialize.go | 1232 +++++++++++ ui/src/repository/_pocketbase.ts | 1 + 21 files changed, 1361 insertions(+), 3876 deletions(-) delete mode 100644 migrations/1739462400_collections_snapshot.go delete mode 100644 migrations/1739462401_superusers_initial.go delete mode 100644 migrations/1740050400_upgrade.go delete mode 100644 migrations/1742209200_upgrade.go delete mode 100644 migrations/1742392800_upgrade.go delete mode 100644 migrations/1742644800_upgrade.go delete mode 100644 migrations/1743264000_upgrade.go delete mode 100644 migrations/1744192800_upgrade.go delete mode 100644 migrations/1744459000_upgrade.go delete mode 100644 migrations/1745308800_upgrade.go delete mode 100644 migrations/1745726400_upgrade.go delete mode 100644 migrations/1747314000_upgrade.go delete mode 100644 migrations/1747389600_upgrade.go delete mode 100644 migrations/1748178000_upgrade.go delete mode 100644 migrations/1748228400_upgrade.go delete mode 100644 migrations/1748959200_upgrade.go delete mode 100644 migrations/1750687200_upgrade.go delete mode 100644 migrations/1751961600_upgrade.go create mode 100644 migrations/1757476800_cm0.4.0_initialize.go diff --git a/migrations/1739462400_collections_snapshot.go b/migrations/1739462400_collections_snapshot.go deleted file mode 100644 index 1ec203485..000000000 --- a/migrations/1739462400_collections_snapshot.go +++ /dev/null @@ -1,1808 +0,0 @@ -package migrations - -import ( - x509 "crypto/x509" - "strings" - - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" - - xcert "github.com/certimate-go/certimate/pkg/utils/cert" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("to v0.3") - tracer.Printf("go ...") - - // backup collection records - collectionRecords := make([]*core.Record, 0) - collections, err := app.FindAllCollections(core.CollectionTypeBase) - if err != nil { - return err - } else { - for _, collection := range collections { - switch collection.Name { - case "acme_accounts", "access", "certificate", "workflow", "settings": - { - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - collectionRecords = append(collectionRecords, records...) - - tracer.Printf("collection '%s' backed up", collection.Name) - - if collection.Name == "access" { - collection.Fields.RemoveByName("usage") - - for i, field := range collection.Fields { - if field.GetName() == "provider" { - collection.Fields.AddMarshaledJSONAt(i+1, []byte(`{ - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "byteplus", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "dnsla", - "dogecloud", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "huaweicloud", - "jdcloud", - "k8s", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "tencentcloud", - "ucloud", - "volcengine", - "webhook", - "westcn" - ] - }`)) - } - } - - err := app.Save(collection) - if err != nil { - return err - } - } - } - - case "domains", "deployments", "access_groups": - { - app.Delete(collection) - - tracer.Printf("collection '%s' truncated", collection.Name) - } - } - } - } - - // migrate - jsonData := `[ - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "geeur58v", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "byteplus", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "dnsla", - "dogecloud", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "huaweicloud", - "jdcloud", - "k8s", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "tencentcloud", - "ucloud", - "volcengine", - "webhook", - "westcn" - ] - }, - { - "hidden": false, - "id": "iql7jpwx", - "maxSize": 2000000, - "name": "config", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "lr33hiwg", - "max": "", - "min": "", - "name": "deleted", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "4yzbv8urny5ja1e", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_wkoST0j` + "`" + ` ON ` + "`" + `access` + "`" + ` (` + "`" + `name` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_frh0JT1Aqx` + "`" + ` ON ` + "`" + `access` + "`" + ` (` + "`" + `provider` + "`" + `)" - ], - "listRule": null, - "name": "access", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "1tcmdsdf", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "f9wyhypi", - "maxSize": 2000000, - "name": "content", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "dy6ccjb60spfy6p", - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `idx_RO7X9Vw` + "`" + ` ON ` + "`" + `settings` + "`" + ` (` + "`" + `name` + "`" + `)" - ], - "listRule": null, - "name": "settings", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "fmjfn0yw", - "max": 0, - "min": 0, - "name": "ca", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "exceptDomains": null, - "hidden": false, - "id": "qqwijqzt", - "name": "email", - "onlyDomains": null, - "presentable": false, - "required": false, - "system": false, - "type": "email" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "genxqtii", - "max": 0, - "min": 0, - "name": "key", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "1aoia909", - "maxSize": 2000000, - "name": "resource", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "012d7abbod1hwvr", - "indexes": [], - "listRule": null, - "name": "acme_accounts", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "8yydhv1h", - "max": 0, - "min": 0, - "name": "name", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "1buzebwz", - "max": 0, - "min": 0, - "name": "description", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "vqoajwjq", - "maxSelect": 1, - "name": "trigger", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "auto", - "manual" - ] - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "8ho247wh", - "max": 0, - "min": 0, - "name": "triggerCron", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "nq7kfdzi", - "name": "enabled", - "presentable": false, - "required": false, - "system": false, - "type": "bool" - }, - { - "hidden": false, - "id": "awlphkfe", - "maxSize": 2000000, - "name": "content", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "g9ohkk5o", - "maxSize": 2000000, - "name": "draft", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "2rpfz9t3", - "name": "hasDraft", - "presentable": false, - "required": false, - "system": false, - "type": "bool" - }, - { - "cascadeDelete": false, - "collectionId": "qjp8lygssgwyqyz", - "hidden": false, - "id": "a23wkj9x", - "maxSelect": 1, - "minSelect": 0, - "name": "lastRunId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "zivdxh23", - "maxSelect": 1, - "name": "lastRunStatus", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "pending", - "running", - "succeeded", - "failed", - "canceled" - ] - }, - { - "hidden": false, - "id": "u9bosu36", - "max": "", - "min": "", - "name": "lastRunTime", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "tovyif5ax6j62ur", - "indexes": [], - "listRule": null, - "name": "workflow", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "tovyif5ax6j62ur", - "hidden": false, - "id": "jka88auc", - "maxSelect": 1, - "minSelect": 0, - "name": "workflowId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "cascadeDelete": true, - "collectionId": "qjp8lygssgwyqyz", - "hidden": false, - "id": "relation821863227", - "maxSelect": 1, - "minSelect": 0, - "name": "runId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "z9fgvqkz", - "max": 0, - "min": 0, - "name": "nodeId", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "c2rm9omj", - "maxSize": 2000000, - "name": "node", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "he4cceqb", - "maxSize": 2000000, - "name": "outputs", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "2yfxbxuf", - "name": "succeeded", - "presentable": false, - "required": false, - "system": false, - "type": "bool" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "bqnxb95f2cooowp", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_BYoQPsz4my` + "`" + ` ON ` + "`" + `workflow_output` + "`" + ` (` + "`" + `workflowId` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_O9zxLETuxJ` + "`" + ` ON ` + "`" + `workflow_output` + "`" + ` (` + "`" + `runId` + "`" + `)" - ], - "listRule": null, - "name": "workflow_output", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "hidden": false, - "id": "by9hetqi", - "maxSelect": 1, - "name": "source", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "workflow", - "upload" - ] - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "fugxf58p", - "max": 0, - "min": 0, - "name": "subjectAltNames", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2069360702", - "max": 0, - "min": 0, - "name": "serialNumber", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "plmambpz", - "max": 0, - "min": 0, - "name": "certificate", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "49qvwxcg", - "max": 0, - "min": 0, - "name": "privateKey", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2910474005", - "max": 0, - "min": 0, - "name": "issuer", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "agt7n5bb", - "max": 0, - "min": 0, - "name": "issuerCertificate", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text4164403445", - "max": 0, - "min": 0, - "name": "keyAlgorithm", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "v40aqzpd", - "max": "", - "min": "", - "name": "effectAt", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "zgpdby2k", - "max": "", - "min": "", - "name": "expireAt", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2045248758", - "max": 0, - "min": 0, - "name": "acmeAccountUrl", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "exceptDomains": null, - "hidden": false, - "id": "ayyjy5ve", - "name": "acmeCertUrl", - "onlyDomains": null, - "presentable": false, - "required": false, - "system": false, - "type": "url" - }, - { - "exceptDomains": null, - "hidden": false, - "id": "3x5heo8e", - "name": "acmeCertStableUrl", - "onlyDomains": null, - "presentable": false, - "required": false, - "system": false, - "type": "url" - }, - { - "cascadeDelete": false, - "collectionId": "tovyif5ax6j62ur", - "hidden": false, - "id": "uvqfamb1", - "maxSelect": 1, - "minSelect": 0, - "name": "workflowId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "cascadeDelete": false, - "collectionId": "qjp8lygssgwyqyz", - "hidden": false, - "id": "relation3917999135", - "maxSelect": 1, - "minSelect": 0, - "name": "workflowRunId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "uqldzldw", - "max": 0, - "min": 0, - "name": "workflowNodeId", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "cascadeDelete": false, - "collectionId": "bqnxb95f2cooowp", - "hidden": false, - "id": "2ohlr0yd", - "maxSelect": 1, - "minSelect": 0, - "name": "workflowOutputId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "klyf4nlq", - "max": "", - "min": "", - "name": "deleted", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "4szxr9x43tpj6np", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_Jx8TXzDCmw` + "`" + ` ON ` + "`" + `certificate` + "`" + ` (` + "`" + `workflowId` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_kcKpgAZapk` + "`" + ` ON ` + "`" + `certificate` + "`" + ` (` + "`" + `workflowNodeId` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_2cRXqNDyyp` + "`" + ` ON ` + "`" + `certificate` + "`" + ` (` + "`" + `workflowRunId` + "`" + `)" - ], - "listRule": null, - "name": "certificate", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "tovyif5ax6j62ur", - "hidden": false, - "id": "m8xfsyyy", - "maxSelect": 1, - "minSelect": 0, - "name": "workflowId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "hidden": false, - "id": "qldmh0tw", - "maxSelect": 1, - "name": "status", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "pending", - "running", - "succeeded", - "failed", - "canceled" - ] - }, - { - "hidden": false, - "id": "jlroa3fk", - "maxSelect": 1, - "name": "trigger", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "auto", - "manual" - ] - }, - { - "hidden": false, - "id": "k9xvtf89", - "max": "", - "min": "", - "name": "startedAt", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "3ikum7mk", - "max": "", - "min": "", - "name": "endedAt", - "presentable": false, - "required": false, - "system": false, - "type": "date" - }, - { - "hidden": false, - "id": "2m9byaa9", - "maxSize": 2000000, - "name": "logs", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "hvebkuxw", - "max": 0, - "min": 0, - "name": "error", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "qjp8lygssgwyqyz", - "indexes": [], - "listRule": null, - "name": "workflow_run", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }, - { - "authAlert": { - "emailTemplate": { - "body": "

Hello,

\n

We noticed a login to your {APP_NAME} account from a new location.

\n

If this was you, you may disregard this email.

\n

If this wasn't you, you should immediately change your {APP_NAME} account password to revoke access from all other locations.

\n

\n Thanks,
\n {APP_NAME} team\n

", - "subject": "Login from a new location" - }, - "enabled": true - }, - "authRule": "", - "authToken": { - "duration": 1209600 - }, - "confirmEmailChangeTemplate": { - "body": "

Hello,

\n

Click on the button below to confirm your new email address.

\n

\n Confirm new email\n

\n

If you didn't ask to change your email address, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", - "subject": "Confirm your {APP_NAME} new email address" - }, - "createRule": null, - "deleteRule": null, - "emailChangeToken": { - "duration": 1800 - }, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cost": 0, - "hidden": true, - "id": "password901924565", - "max": 0, - "min": 8, - "name": "password", - "pattern": "", - "presentable": false, - "required": true, - "system": true, - "type": "password" - }, - { - "autogeneratePattern": "[a-zA-Z0-9]{50}", - "hidden": true, - "id": "text2504183744", - "max": 60, - "min": 30, - "name": "tokenKey", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "exceptDomains": null, - "hidden": false, - "id": "email3885137012", - "name": "email", - "onlyDomains": null, - "presentable": false, - "required": true, - "system": true, - "type": "email" - }, - { - "hidden": false, - "id": "bool1547992806", - "name": "emailVisibility", - "presentable": false, - "required": false, - "system": true, - "type": "bool" - }, - { - "hidden": false, - "id": "bool256245529", - "name": "verified", - "presentable": false, - "required": false, - "system": true, - "type": "bool" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": true, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": true, - "type": "autodate" - } - ], - "fileToken": { - "duration": 120 - }, - "id": "pbc_3142635823", - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `idx_tokenKey_pbc_3142635823` + "`" + ` ON ` + "`" + `_superusers` + "`" + ` (` + "`" + `tokenKey` + "`" + `)", - "CREATE UNIQUE INDEX ` + "`" + `idx_email_pbc_3142635823` + "`" + ` ON ` + "`" + `_superusers` + "`" + ` (` + "`" + `email` + "`" + `) WHERE ` + "`" + `email` + "`" + ` != ''" - ], - "listRule": null, - "manageRule": null, - "mfa": { - "duration": 1800, - "enabled": false, - "rule": "" - }, - "name": "_superusers", - "oauth2": { - "enabled": false, - "mappedFields": { - "avatarURL": "", - "id": "", - "name": "", - "username": "" - } - }, - "otp": { - "duration": 180, - "emailTemplate": { - "body": "

Hello,

\n

Your one-time password is: {OTP}

\n

If you didn't ask for the one-time password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", - "subject": "OTP for {APP_NAME}" - }, - "enabled": false, - "length": 8 - }, - "passwordAuth": { - "enabled": true, - "identityFields": [ - "email" - ] - }, - "passwordResetToken": { - "duration": 1800 - }, - "resetPasswordTemplate": { - "body": "

Hello,

\n

Click on the button below to reset your password.

\n

\n Reset password\n

\n

If you didn't ask to reset your password, you can ignore this email.

\n

\n Thanks,
\n {APP_NAME} team\n

", - "subject": "Reset your {APP_NAME} password" - }, - "system": true, - "type": "auth", - "updateRule": null, - "verificationTemplate": { - "body": "

Hello,

\n

Thank you for joining us at {APP_NAME}.

\n

Click on the button below to verify your email address.

\n

\n Verify\n

\n

\n Thanks,
\n {APP_NAME} team\n

", - "subject": "Verify your {APP_NAME} email" - }, - "verificationToken": { - "duration": 259200 - }, - "viewRule": null - }, - { - "createRule": null, - "deleteRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text455797646", - "max": 0, - "min": 0, - "name": "collectionRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text127846527", - "max": 0, - "min": 0, - "name": "recordRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2462348188", - "max": 0, - "min": 0, - "name": "provider", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1044722854", - "max": 0, - "min": 0, - "name": "providerId", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": true, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": true, - "type": "autodate" - } - ], - "id": "pbc_2281828961", - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `idx_externalAuths_record_provider` + "`" + ` ON ` + "`" + `_externalAuths` + "`" + ` (collectionRef, recordRef, provider)", - "CREATE UNIQUE INDEX ` + "`" + `idx_externalAuths_collection_provider` + "`" + ` ON ` + "`" + `_externalAuths` + "`" + ` (collectionRef, provider, providerId)" - ], - "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", - "name": "_externalAuths", - "system": true, - "type": "base", - "updateRule": null, - "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text455797646", - "max": 0, - "min": 0, - "name": "collectionRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text127846527", - "max": 0, - "min": 0, - "name": "recordRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text1582905952", - "max": 0, - "min": 0, - "name": "method", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": true, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": true, - "type": "autodate" - } - ], - "id": "pbc_2279338944", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_mfas_collectionRef_recordRef` + "`" + ` ON ` + "`" + `_mfas` + "`" + ` (collectionRef,recordRef)" - ], - "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", - "name": "_mfas", - "system": true, - "type": "base", - "updateRule": null, - "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" - }, - { - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text455797646", - "max": 0, - "min": 0, - "name": "collectionRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text127846527", - "max": 0, - "min": 0, - "name": "recordRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "cost": 8, - "hidden": true, - "id": "password901924565", - "max": 0, - "min": 0, - "name": "password", - "pattern": "", - "presentable": false, - "required": true, - "system": true, - "type": "password" - }, - { - "autogeneratePattern": "", - "hidden": true, - "id": "text3866985172", - "max": 0, - "min": 0, - "name": "sentTo", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": true, - "type": "text" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": true, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": true, - "type": "autodate" - } - ], - "id": "pbc_1638494021", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_otps_collectionRef_recordRef` + "`" + ` ON ` + "`" + `_otps` + "`" + ` (collectionRef, recordRef)" - ], - "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", - "name": "_otps", - "system": true, - "type": "base", - "updateRule": null, - "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" - }, - { - "createRule": null, - "deleteRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text455797646", - "max": 0, - "min": 0, - "name": "collectionRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text127846527", - "max": 0, - "min": 0, - "name": "recordRef", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text4228609354", - "max": 0, - "min": 0, - "name": "fingerprint", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": true, - "system": true, - "type": "text" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": true, - "type": "autodate" - }, - { - "hidden": false, - "id": "autodate3332085495", - "name": "updated", - "onCreate": true, - "onUpdate": true, - "presentable": false, - "system": true, - "type": "autodate" - } - ], - "id": "pbc_4275539003", - "indexes": [ - "CREATE UNIQUE INDEX ` + "`" + `idx_authOrigins_unique_pairs` + "`" + ` ON ` + "`" + `_authOrigins` + "`" + ` (collectionRef, recordRef, fingerprint)" - ], - "listRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId", - "name": "_authOrigins", - "system": true, - "type": "base", - "updateRule": null, - "viewRule": "@request.auth.id != '' && recordRef = @request.auth.id && collectionRef = @request.auth.collectionId" - } - ]` - err = app.ImportCollectionsByMarshaledJSON([]byte(jsonData), false) - if err != nil { - return err - } - - tracer.Printf("collections imported") - - // restore records - for _, record := range collectionRecords { - changed := false - - switch record.Collection().Name { - case "access": - { - if record.GetString("provider") == "tencent" { - record.Set("provider", "tencentcloud") - changed = true - } else if record.GetString("provider") == "pdns" { - record.Set("provider", "powerdns") - changed = true - } else if record.GetString("provider") == "httpreq" { - record.Set("provider", "acmehttpreq") - changed = true - } - } - - case "certificate": - { - if record.GetString("issuer") == "" { - cert, _ := xcert.ParseCertificateFromPEM(record.GetString("certificate")) - if cert != nil { - record.Set("issuer", strings.Join(cert.Issuer.Organization, ";")) - changed = true - } - } - if record.GetString("serialNumber") == "" { - cert, _ := xcert.ParseCertificateFromPEM(record.GetString("certificate")) - if cert != nil { - record.Set("serialNumber", strings.ToUpper(cert.SerialNumber.Text(16))) - changed = true - } - } - if record.GetString("keyAlgorithm") == "" { - cert, _ := xcert.ParseCertificateFromPEM(record.GetString("certificate")) - if cert != nil { - switch cert.SignatureAlgorithm { - case x509.SHA256WithRSA, x509.SHA256WithRSAPSS: - record.Set("keyAlgorithm", "RSA2048") - case x509.SHA384WithRSA, x509.SHA384WithRSAPSS: - record.Set("keyAlgorithm", "RSA3072") - case x509.SHA512WithRSA, x509.SHA512WithRSAPSS: - record.Set("keyAlgorithm", "RSA4096") - case x509.ECDSAWithSHA256: - record.Set("keyAlgorithm", "EC256") - case x509.ECDSAWithSHA384: - record.Set("keyAlgorithm", "EC384") - case x509.ECDSAWithSHA512: - record.Set("keyAlgorithm", "EC512") - } - changed = true - } - } - } - } - - if changed { - err = app.Save(record) - if err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, record.Collection().Name) - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1739462401_superusers_initial.go b/migrations/1739462401_superusers_initial.go deleted file mode 100644 index d3098adba..000000000 --- a/migrations/1739462401_superusers_initial.go +++ /dev/null @@ -1,44 +0,0 @@ -package migrations - -import ( - "os" - "strings" - - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - superusers, err := app.FindCollectionByNameOrId(core.CollectionNameSuperusers) - if err != nil { - return err - } - - records, err := app.FindAllRecords(superusers) - if err != nil { - return err - } - - if len(records) == 0 { - envUsername := strings.TrimSpace(os.Getenv("CERTIMATE_ADMIN_USERNAME")) - if envUsername == "" { - envUsername = "admin@certimate.fun" - } - - envPassword := strings.TrimSpace(os.Getenv("CERTIMATE_ADMIN_PASSWORD")) - if envPassword == "" { - envPassword = "1234567890" - } - - record := core.NewRecord(superusers) - record.Set("email", envUsername) - record.Set("password", envPassword) - return app.Save(record) - } - - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1740050400_upgrade.go b/migrations/1740050400_upgrade.go deleted file mode 100644 index 261169f8a..000000000 --- a/migrations/1740050400_upgrade.go +++ /dev/null @@ -1,150 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1740050400") - tracer.Printf("go ...") - - // update collection `certificate` - { - collection, err := app.FindCollectionByNameOrId("4szxr9x43tpj6np") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(4, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "plmambpz", - "max": 100000, - "min": 0, - "name": "certificate", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(5, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "49qvwxcg", - "max": 100000, - "min": 0, - "name": "privateKey", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(7, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "agt7n5bb", - "max": 100000, - "min": 0, - "name": "issuerCertificate", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `workflow` - { - collection, err := app.FindCollectionByNameOrId("tovyif5ax6j62ur") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(6, []byte(`{ - "hidden": false, - "id": "awlphkfe", - "maxSize": 5000000, - "name": "content", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }`)); err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(7, []byte(`{ - "hidden": false, - "id": "g9ohkk5o", - "maxSize": 5000000, - "name": "draft", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `workflow_output` - { - collection, err := app.FindCollectionByNameOrId("bqnxb95f2cooowp") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(4, []byte(`{ - "hidden": false, - "id": "c2rm9omj", - "maxSize": 5000000, - "name": "node", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1742209200_upgrade.go b/migrations/1742209200_upgrade.go deleted file mode 100644 index 1cc05cf3f..000000000 --- a/migrations/1742209200_upgrade.go +++ /dev/null @@ -1,359 +0,0 @@ -package migrations - -import ( - "encoding/json" - "strings" - "time" - - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1742209200") - tracer.Printf("go ...") - - // create collection `workflow_logs` - { - jsonData := `{ - "createRule": null, - "deleteRule": null, - "fields": [ - { - "autogeneratePattern": "[a-z0-9]{15}", - "hidden": false, - "id": "text3208210256", - "max": 15, - "min": 15, - "name": "id", - "pattern": "^[a-z0-9]+$", - "presentable": false, - "primaryKey": true, - "required": true, - "system": true, - "type": "text" - }, - { - "cascadeDelete": true, - "collectionId": "tovyif5ax6j62ur", - "hidden": false, - "id": "relation3371272342", - "maxSelect": 1, - "minSelect": 0, - "name": "workflowId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "cascadeDelete": true, - "collectionId": "qjp8lygssgwyqyz", - "hidden": false, - "id": "relation821863227", - "maxSelect": 1, - "minSelect": 0, - "name": "runId", - "presentable": false, - "required": false, - "system": false, - "type": "relation" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text157423495", - "max": 0, - "min": 0, - "name": "nodeId", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3227511481", - "max": 0, - "min": 0, - "name": "nodeName", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "number2782324286", - "max": null, - "min": null, - "name": "timestamp", - "onlyInt": false, - "presentable": false, - "required": false, - "system": false, - "type": "number" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text2599078931", - "max": 0, - "min": 0, - "name": "level", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "autogeneratePattern": "", - "hidden": false, - "id": "text3065852031", - "max": 0, - "min": 0, - "name": "message", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }, - { - "hidden": false, - "id": "json2918445923", - "maxSize": 0, - "name": "data", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }, - { - "hidden": false, - "id": "autodate2990389176", - "name": "created", - "onCreate": true, - "onUpdate": false, - "presentable": false, - "system": false, - "type": "autodate" - } - ], - "id": "pbc_1682296116", - "indexes": [ - "CREATE INDEX ` + "`" + `idx_IOlpy6XuJ2` + "`" + ` ON ` + "`" + `workflow_logs` + "`" + ` (` + "`" + `workflowId` + "`" + `)", - "CREATE INDEX ` + "`" + `idx_qVlTb2yl7v` + "`" + ` ON ` + "`" + `workflow_logs` + "`" + ` (` + "`" + `runId` + "`" + `)" - ], - "listRule": null, - "name": "workflow_logs", - "system": false, - "type": "base", - "updateRule": null, - "viewRule": null - }` - - collection := &core.Collection{} - if err := json.Unmarshal([]byte(jsonData), &collection); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' created", collection.Name) - } - - // migrate data - { - workflowRuns, err := app.FindAllRecords("workflow_run") - if err != nil { - return err - } - - for _, workflowRun := range workflowRuns { - type dWorkflowRunLogRecord struct { - Time string `json:"time"` - Level string `json:"level"` - Content string `json:"content"` - Error string `json:"error"` - } - type dWorkflowRunLog struct { - NodeId string `json:"nodeId"` - NodeName string `json:"nodeName"` - Records []dWorkflowRunLogRecord `json:"records"` - Error string `json:"error"` - } - - logs := make([]dWorkflowRunLog, 0) - if err := workflowRun.UnmarshalJSONField("logs", &logs); err != nil { - continue - } - - collection, err := app.FindCollectionByNameOrId("workflow_logs") - if err != nil { - return err - } - - for _, log := range logs { - for _, logRecord := range log.Records { - record := core.NewRecord(collection) - createdAt, _ := time.Parse(time.RFC3339, logRecord.Time) - record.Set("workflowId", workflowRun.Get("workflowId")) - record.Set("runId", workflowRun.Get("id")) - record.Set("nodeId", log.NodeId) - record.Set("nodeName", log.NodeName) - record.Set("timestamp", createdAt.UnixMilli()) - record.Set("level", logRecord.Level) - record.Set("message", strings.TrimSpace(logRecord.Content+" "+logRecord.Error)) - record.Set("created", createdAt) - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - } - } - - // update collection `workflow_run` - { - collection, err := app.FindCollectionByNameOrId("workflow_run") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(6, []byte(`{ - "hidden": false, - "id": "json772177811", - "maxSize": 5000000, - "name": "detail", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // migrate data - { - workflowRuns, err := app.FindAllRecords("workflow_run") - if err != nil { - return err - } - - workflowOutputs, err := app.FindAllRecords("workflow_output") - if err != nil { - return err - } - - type dWorkflowNode struct { - Id string `json:"id"` - Type string `json:"type"` - Name string `json:"name"` - Config map[string]any `json:"config,omitempty"` - Inputs []map[string]any `json:"inputs,omitempty"` - Outputs []map[string]any `json:"outputs,omitempty"` - Next *dWorkflowNode `json:"next,omitempty"` - Branches []*dWorkflowNode `json:"branches,omitempty"` - Validated bool `json:"validated,omitempty"` - } - - for _, workflowRun := range workflowRuns { - node := &dWorkflowNode{} - for _, workflowOutput := range workflowOutputs { - if workflowOutput.GetString("runId") != workflowRun.Get("id") { - continue - } - - if err := workflowOutput.UnmarshalJSONField("node", node); err != nil { - continue - } - - if node.Type != "apply" { - node = &dWorkflowNode{} - continue - } - } - - if node.Id == "" { - workflow, _ := app.FindRecordById("workflow", workflowRun.GetString("workflowId")) - if workflow != nil { - workflowRun.Set("detail", workflow.Get("content")) - } else { - workflowRun.Set("detail", make(map[string]any)) - } - } else { - workflow, _ := app.FindRecordById("workflow", workflowRun.GetString("workflowId")) - if workflow != nil { - rootNode := &dWorkflowNode{} - if err := workflow.UnmarshalJSONField("content", rootNode); err != nil { - return err - } - - rootNode.Next = node - workflowRun.Set("detail", rootNode) - } else { - rootNode := &dWorkflowNode{ - Id: core.GenerateDefaultRandomId(), - Type: "start", - Name: "开始", - Config: map[string]any{ - "trigger": "manual", - }, - Next: node, - Validated: true, - } - workflowRun.Set("detail", rootNode) - } - } - - if err := app.Save(workflowRun); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", workflowRun.Id, workflowRun.Collection().Name) - } - } - - // update collection `workflow_run` - { - collection, err := app.FindCollectionByNameOrId("workflow_run") - if err != nil { - return err - } - - collection.Fields.RemoveByName("logs") - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1742392800_upgrade.go b/migrations/1742392800_upgrade.go deleted file mode 100644 index 4416936a1..000000000 --- a/migrations/1742392800_upgrade.go +++ /dev/null @@ -1,93 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1742392800") - tracer.Printf("go ...") - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "byteplus", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "dnsla", - "dogecloud", - "dynv6", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "huaweicloud", - "jdcloud", - "k8s", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "tencentcloud", - "ucloud", - "upyun", - "volcengine", - "webhook", - "westcn" - ] - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1742644800_upgrade.go b/migrations/1742644800_upgrade.go deleted file mode 100644 index 228a70fc2..000000000 --- a/migrations/1742644800_upgrade.go +++ /dev/null @@ -1,203 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1742644800") - tracer.Printf("go ...") - - // update collection `workflow_run` - { - collection, err := app.FindCollectionByNameOrId("qjp8lygssgwyqyz") - if err != nil { - return err - } - - // update field - if err := collection.Fields.AddMarshaledJSONAt(7, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "hvebkuxw", - "max": 20000, - "min": 0, - "name": "error", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `workflow_output` - { - collection, err := app.FindCollectionByNameOrId("bqnxb95f2cooowp") - if err != nil { - return err - } - - // update field - if err := collection.Fields.AddMarshaledJSONAt(5, []byte(`{ - "hidden": false, - "id": "he4cceqb", - "maxSize": 5000000, - "name": "outputs", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `workflow_logs` - { - collection, err := app.FindCollectionByNameOrId("pbc_1682296116") - if err != nil { - return err - } - - // update field - if err := collection.Fields.AddMarshaledJSONAt(7, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text3065852031", - "max": 20000, - "min": 0, - "name": "message", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - // update field - if err := collection.Fields.AddMarshaledJSONAt(8, []byte(`{ - "hidden": false, - "id": "json2918445923", - "maxSize": 5000000, - "name": "data", - "presentable": false, - "required": false, - "system": false, - "type": "json" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - // update field - if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "byteplus", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "desec", - "dnsla", - "dogecloud", - "dynv6", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "huaweicloud", - "jdcloud", - "k8s", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "porkbun", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "tencentcloud", - "ucloud", - "upyun", - "vercel", - "volcengine", - "webhook", - "westcn" - ] - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1743264000_upgrade.go b/migrations/1743264000_upgrade.go deleted file mode 100644 index 22738be27..000000000 --- a/migrations/1743264000_upgrade.go +++ /dev/null @@ -1,182 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1743264000") - tracer.Printf("go ...") - - // update collection `settings` - { - collection, err := app.FindCollectionByNameOrId("dy6ccjb60spfy6p") - if err != nil { - return err - } - - records, err := app.FindRecordsByFilter(collection, "name='sslProvider'", "-created", 1, 0) - if err != nil { - return err - } - - if len(records) == 1 { - record := records[0] - - content := make(map[string]any) - if err := record.UnmarshalJSONField("content", &content); err != nil { - return err - } - - if provider, ok := content["provider"]; ok { - if providerStr, ok := provider.(string); ok { - if providerStr == "letsencrypt_staging" { - content["provider"] = "letsencryptstaging" - } - } - } - - if config, ok := content["config"]; ok { - if configMap, ok := config.(map[string]any); ok { - if _, ok := configMap["letsencrypt_staging"]; ok { - configMap["letsencryptstaging"] = configMap["letsencrypt_staging"] - delete(configMap, "letsencrypt_staging") - } - if _, ok := configMap["gts"]; ok { - configMap["googletrustservices"] = configMap["gts"] - delete(configMap, "gts") - } - } - } - - record.Set("content", content) - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "byteplus", - "buypass", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "desec", - "dnsla", - "dogecloud", - "dynv6", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "googletrustservices", - "huaweicloud", - "jdcloud", - "k8s", - "letsencrypt", - "letsencryptstaging", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "porkbun", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "sslcom", - "tencentcloud", - "ucloud", - "upyun", - "vercel", - "volcengine", - "webhook", - "westcn", - "zerossl" - ] - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `acme_accounts` - { - collection, err := app.FindCollectionByNameOrId("012d7abbod1hwvr") - if err != nil { - return err - } - - records, err := app.FindRecordsByFilter(collection, "ca='letsencrypt_staging' || ca='gts'", "-created", 0, 0) - if err != nil { - return err - } - - for _, record := range records { - ca := record.GetString("ca") - if ca == "letsencrypt_staging" { - record.Set("ca", "letsencryptstaging") - } else if ca == "gts" { - record.Set("ca", "googletrustservices") - } else { - continue - } - - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1744192800_upgrade.go b/migrations/1744192800_upgrade.go deleted file mode 100644 index eb4c6d06c..000000000 --- a/migrations/1744192800_upgrade.go +++ /dev/null @@ -1,103 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1744192800") - tracer.Printf("go ...") - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "byteplus", - "buypass", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "desec", - "dnsla", - "dogecloud", - "dynv6", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "googletrustservices", - "huaweicloud", - "jdcloud", - "k8s", - "letsencrypt", - "letsencryptstaging", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "porkbun", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "sslcom", - "tencentcloud", - "ucloud", - "upyun", - "vercel", - "volcengine", - "wangsu", - "webhook", - "westcn", - "zerossl" - ] - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return nil - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1744459000_upgrade.go b/migrations/1744459000_upgrade.go deleted file mode 100644 index 82ecbcf60..000000000 --- a/migrations/1744459000_upgrade.go +++ /dev/null @@ -1,104 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1744459000") - tracer.Printf("go ...") - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ - "hidden": false, - "id": "hwy7m03o", - "maxSelect": 1, - "name": "provider", - "presentable": false, - "required": false, - "system": false, - "type": "select", - "values": [ - "1panel", - "acmehttpreq", - "akamai", - "aliyun", - "aws", - "azure", - "baiducloud", - "baishan", - "baotapanel", - "bunny", - "byteplus", - "buypass", - "cachefly", - "cdnfly", - "cloudflare", - "cloudns", - "cmcccloud", - "ctcccloud", - "cucccloud", - "desec", - "dnsla", - "dogecloud", - "dynv6", - "edgio", - "fastly", - "gname", - "gcore", - "godaddy", - "goedge", - "googletrustservices", - "huaweicloud", - "jdcloud", - "k8s", - "letsencrypt", - "letsencryptstaging", - "local", - "namecheap", - "namedotcom", - "namesilo", - "ns1", - "porkbun", - "powerdns", - "qiniu", - "qingcloud", - "rainyun", - "safeline", - "ssh", - "sslcom", - "tencentcloud", - "ucloud", - "upyun", - "vercel", - "volcengine", - "wangsu", - "webhook", - "westcn", - "zerossl" - ] - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1745308800_upgrade.go b/migrations/1745308800_upgrade.go deleted file mode 100644 index 68d025fdb..000000000 --- a/migrations/1745308800_upgrade.go +++ /dev/null @@ -1,103 +0,0 @@ -package migrations - -import ( - "encoding/json" - - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1745308800") - tracer.Printf("go ...") - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - // add temp field `providerTmp` - if err := collection.Fields.AddMarshaledJSONAt(3, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text2024822322", - "max": 0, - "min": 0, - "name": "providerTmp", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - if err := app.Save(collection); err != nil { - return err - } - - // copy `provider` to `providerTmp` - if _, err := app.DB().NewQuery("UPDATE access SET providerTmp = provider").Execute(); err != nil { - return err - } - - // remove old field `provider` - collection.Fields.RemoveById("hwy7m03o") - if err := json.Unmarshal([]byte(`{ - "indexes": [ - "CREATE INDEX `+"`"+`idx_wkoST0j`+"`"+` ON `+"`"+`access`+"`"+` (`+"`"+`name`+"`"+`)" - ] - }`), &collection); err != nil { - return err - } - if err := app.Save(collection); err != nil { - return err - } - - // rename field `providerTmp` to `provider` - if err := collection.Fields.AddMarshaledJSONAt(2, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text2024822322", - "max": 0, - "min": 0, - "name": "provider", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - if err := app.Save(collection); err != nil { - return err - } - - // rebuild indexes - if err := json.Unmarshal([]byte(`{ - "indexes": [ - "CREATE INDEX `+"`"+`idx_wkoST0j`+"`"+` ON `+"`"+`access`+"`"+` (`+"`"+`name`+"`"+`)", - "CREATE INDEX `+"`"+`idx_frh0JT1Aqx`+"`"+` ON `+"`"+`access`+"`"+` (`+"`"+`provider`+"`"+`)" - ] - }`), &collection); err != nil { - return err - } - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1745726400_upgrade.go b/migrations/1745726400_upgrade.go deleted file mode 100644 index 0513dac41..000000000 --- a/migrations/1745726400_upgrade.go +++ /dev/null @@ -1,100 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1745726400") - tracer.Printf("go ...") - - // update collection `access` - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(4, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text2859962647", - "max": 0, - "min": 0, - "name": "reserve", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // migrate data - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - - for _, record := range records { - changed := false - - if record.GetString("provider") == "buypass" { - record.Set("reserve", "ca") - changed = true - } else if record.GetString("provider") == "googletrustservices" { - record.Set("reserve", "ca") - changed = true - } else if record.GetString("provider") == "sslcom" { - record.Set("reserve", "ca") - changed = true - } else if record.GetString("provider") == "zerossl" { - record.Set("reserve", "ca") - changed = true - } - - if record.GetString("provider") == "webhook" { - config := make(map[string]any) - if err := record.UnmarshalJSONField("config", &config); err != nil { - return err - } - - config["method"] = "POST" - config["headers"] = "Content-Type: application/json" - record.Set("config", config) - changed = true - } - - if changed { - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1747314000_upgrade.go b/migrations/1747314000_upgrade.go deleted file mode 100644 index 2c3ecdc43..000000000 --- a/migrations/1747314000_upgrade.go +++ /dev/null @@ -1,54 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1747314000") - tracer.Printf("go ...") - - // migrate data - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - - for _, record := range records { - changed := false - - if record.GetString("provider") == "goedge" { - config := make(map[string]any) - if err := record.UnmarshalJSONField("config", &config); err != nil { - return err - } - - config["apiRole"] = "user" - record.Set("config", config) - changed = true - } - - if changed { - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1747389600_upgrade.go b/migrations/1747389600_upgrade.go deleted file mode 100644 index fabc562c0..000000000 --- a/migrations/1747389600_upgrade.go +++ /dev/null @@ -1,85 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1747389600") - tracer.Printf("go ...") - - // update collection `certificate` - { - collection, err := app.FindCollectionByNameOrId("4szxr9x43tpj6np") - if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(6, []byte(`{ - "autogeneratePattern": "", - "hidden": false, - "id": "text2910474005", - "max": 0, - "min": 0, - "name": "issuerOrg", - "pattern": "", - "presentable": false, - "primaryKey": false, - "required": false, - "system": false, - "type": "text" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // migrate data - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - - for _, record := range records { - changed := false - - if record.GetString("provider") == "1panel" { - config := make(map[string]any) - if err := record.UnmarshalJSONField("config", &config); err != nil { - return err - } - - config["apiVersion"] = "v1" - record.Set("config", config) - changed = true - } - - if changed { - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1748178000_upgrade.go b/migrations/1748178000_upgrade.go deleted file mode 100644 index 44783448a..000000000 --- a/migrations/1748178000_upgrade.go +++ /dev/null @@ -1,72 +0,0 @@ -package migrations - -import ( - "slices" - - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1748178000") - tracer.Printf("go ...") - - // migrate data - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - - providersToUpdate := []string{ - "1panel", - "baotapanel", - "baotawaf", - "cdnfly", - "flexcdn", - "goedge", - "lecdn", - "powerdns", - "proxmoxve", - "ratpanel", - "safeline", - } - for _, record := range records { - changed := false - - if slices.Contains(providersToUpdate, record.GetString("provider")) { - config := make(map[string]any) - if err := record.UnmarshalJSONField("config", &config); err != nil { - return err - } - - if config["apiUrl"] != nil { - config["serverUrl"] = config["apiUrl"] - delete(config, "apiUrl") - record.Set("config", config) - changed = true - } - } - - if changed { - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1748228400_upgrade.go b/migrations/1748228400_upgrade.go deleted file mode 100644 index afdfd850f..000000000 --- a/migrations/1748228400_upgrade.go +++ /dev/null @@ -1,45 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1748228400") - tracer.Printf("go ...") - - // update collection `certificate` - { - collection, err := app.FindCollectionByNameOrId("4szxr9x43tpj6np") - if err != nil { - return err - } - - // add field - if err := collection.Fields.AddMarshaledJSONAt(14, []byte(`{ - "hidden": false, - "id": "bool810050391", - "name": "acmeRenewed", - "presentable": false, - "required": false, - "system": false, - "type": "bool" - }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1748959200_upgrade.go b/migrations/1748959200_upgrade.go deleted file mode 100644 index daa6b7156..000000000 --- a/migrations/1748959200_upgrade.go +++ /dev/null @@ -1,62 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1748959200") - tracer.Printf("go ...") - - // migrate data - { - collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") - if err != nil { - return err - } - - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - - for _, record := range records { - changed := false - - if record.GetString("provider") == "ssh" { - config := make(map[string]any) - if err := record.UnmarshalJSONField("config", &config); err != nil { - return err - } - - if config["authMethod"] == nil || config["authMethod"] == "" { - if config["key"] != nil && config["key"] != "" { - config["authMethod"] = "key" - } else if config["password"] != nil && config["password"] != "" { - config["authMethod"] = "password" - } else { - config["authMethod"] = "none" - } - record.Set("config", config) - changed = true - } - } - - if changed { - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1750687200_upgrade.go b/migrations/1750687200_upgrade.go deleted file mode 100644 index f1b283b4b..000000000 --- a/migrations/1750687200_upgrade.go +++ /dev/null @@ -1,93 +0,0 @@ -package migrations - -import ( - "encoding/json" - - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1750687200") - tracer.Printf("go ...") - - // update collection `workflow_run` - { - collection, err := app.FindCollectionByNameOrId("qjp8lygssgwyqyz") - if err != nil { - return err - } - - // update collection data - if err := json.Unmarshal([]byte(`{ - "indexes": [ - "CREATE INDEX `+"`"+`idx_7ZpfjTFsD2`+"`"+` ON `+"`"+`workflow_run`+"`"+` (`+"`"+`workflowId`+"`"+`)" - ] - }`), &collection); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `workflow_output` - { - collection, err := app.FindCollectionByNameOrId("bqnxb95f2cooowp") - if err != nil { - return err - } - - // update collection data - if err := json.Unmarshal([]byte(`{ - "indexes": [ - "CREATE INDEX `+"`"+`idx_BYoQPsz4my`+"`"+` ON `+"`"+`workflow_output`+"`"+` (`+"`"+`workflowId`+"`"+`)", - "CREATE INDEX `+"`"+`idx_O9zxLETuxJ`+"`"+` ON `+"`"+`workflow_output`+"`"+` (`+"`"+`runId`+"`"+`)", - "CREATE INDEX `+"`"+`idx_luac8Ul34G`+"`"+` ON `+"`"+`workflow_output`+"`"+` (`+"`"+`nodeId`+"`"+`)" - ] - }`), &collection); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - // update collection `workflow_logs` - { - collection, err := app.FindCollectionByNameOrId("pbc_1682296116") - if err != nil { - return err - } - - // update collection data - if err := json.Unmarshal([]byte(`{ - "indexes": [ - "CREATE INDEX `+"`"+`idx_IOlpy6XuJ2`+"`"+` ON `+"`"+`workflow_logs`+"`"+` (`+"`"+`workflowId`+"`"+`)", - "CREATE INDEX `+"`"+`idx_qVlTb2yl7v`+"`"+` ON `+"`"+`workflow_logs`+"`"+` (`+"`"+`runId`+"`"+`)", - "CREATE INDEX `+"`"+`idx_UL4tdCXNlA`+"`"+` ON `+"`"+`workflow_logs`+"`"+` (`+"`"+`nodeId`+"`"+`)" - ] - }`), &collection); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - tracer.Printf("collection '%s' updated", collection.Name) - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1751961600_upgrade.go b/migrations/1751961600_upgrade.go deleted file mode 100644 index 91ac39d26..000000000 --- a/migrations/1751961600_upgrade.go +++ /dev/null @@ -1,112 +0,0 @@ -package migrations - -import ( - "github.com/pocketbase/pocketbase/core" - m "github.com/pocketbase/pocketbase/migrations" -) - -func init() { - m.Register(func(app core.App) error { - tracer := NewTracer("(v0.3)1751961600") - tracer.Printf("go ...") - - // migrate data - { - workflows, err := app.FindAllRecords("workflow") - if err != nil { - return err - } - - type dWorkflowNode struct { - Id string `json:"id"` - Type string `json:"type"` - Name string `json:"name"` - Config map[string]any `json:"config,omitempty"` - Inputs []map[string]any `json:"inputs,omitempty"` - Outputs []map[string]any `json:"outputs,omitempty"` - Next *dWorkflowNode `json:"next,omitempty"` - Branches []*dWorkflowNode `json:"branches,omitempty"` - Validated bool `json:"validated,omitempty"` - } - - deepChangeFn := func(node *dWorkflowNode) bool { - stack := []*dWorkflowNode{node} - - for len(stack) > 0 { - current := stack[len(stack)-1] - stack = stack[:len(stack)-1] - - if current.Type == "deploy" { - configMap := current.Config - if configMap != nil { - if provider, ok := configMap["provider"]; ok { - if provider.(string) == "tencentcloud-eo" { - if providerConfig, ok := configMap["providerConfig"]; ok { - if providerConfigMap, ok := providerConfig.(map[string]any); ok { - if _, ok := providerConfigMap["domain"]; ok { - providerConfigMap["domains"] = providerConfigMap["domain"] - delete(providerConfigMap, "domain") - configMap["providerConfig"] = providerConfigMap - return true - } - } - } - } - } - } - } - - if current.Next != nil { - stack = append(stack, current.Next) - } - - if current.Branches != nil { - for i := len(current.Branches) - 1; i >= 0; i-- { - stack = append(stack, current.Branches[i]) - } - } - } - - return false - } - - for _, workflow := range workflows { - changed := false - - rootNodeContent := &dWorkflowNode{} - if err := workflow.UnmarshalJSONField("content", rootNodeContent); err != nil { - return err - } else { - if deepChangeFn(rootNodeContent) { - workflow.Set("content", rootNodeContent) - changed = true - } - } - - rootNodeDraft := &dWorkflowNode{} - if err := workflow.UnmarshalJSONField("draft", rootNodeDraft); err != nil { - return err - } else { - if deepChangeFn(rootNodeDraft) { - workflow.Set("draft", rootNodeDraft) - changed = true - } - } - - if changed { - err = app.Save(workflow) - if err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", workflow.Id, workflow.Collection().Name) - } - } - } - - tracer.Printf("done") - return nil - }, func(app core.App) error { - return nil - }) -} diff --git a/migrations/1756296000_cm0.4.0_migrate.go b/migrations/1756296000_cm0.4.0_migrate.go index 5046d25ce..60e5815d2 100644 --- a/migrations/1756296000_cm0.4.0_migrate.go +++ b/migrations/1756296000_cm0.4.0_migrate.go @@ -1,7 +1,9 @@ package migrations import ( + "database/sql" "encoding/json" + "errors" "fmt" "regexp" "strings" @@ -21,8 +23,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("dy6ccjb60spfy6p") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if _, err := app.DB().NewQuery("DELETE FROM settings WHERE name = 'notifyChannels'").Execute(); err != nil { return err } @@ -44,10 +48,11 @@ func init() { { collection, err := app.FindCollectionByNameOrId("012d7abbod1hwvr") if err != nil { - return err - } - - if err := collection.Fields.AddMarshaledJSONAt(5, []byte(`{ + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { + if err := collection.Fields.AddMarshaledJSONAt(5, []byte(`{ "exceptDomains": null, "hidden": false, "id": "url2424532088", @@ -58,10 +63,10 @@ func init() { "system": false, "type": "url" }`)); err != nil { - return err - } + return err + } - if err := collection.Fields.AddMarshaledJSONAt(6, []byte(`{ + if err := collection.Fields.AddMarshaledJSONAt(6, []byte(`{ "exceptDomains": null, "hidden": false, "id": "url3632694140", @@ -72,10 +77,10 @@ func init() { "system": false, "type": "url" }`)); err != nil { - return err - } + return err + } - if err := collection.Fields.AddMarshaledJSONAt(3, []byte(`{ + if err := collection.Fields.AddMarshaledJSONAt(3, []byte(`{ "autogeneratePattern": "", "hidden": false, "id": "genxqtii", @@ -89,10 +94,10 @@ func init() { "system": false, "type": "text" }`)); err != nil { - return err - } + return err + } - if err := collection.Fields.AddMarshaledJSONAt(4, []byte(`{ + if err := collection.Fields.AddMarshaledJSONAt(4, []byte(`{ "hidden": false, "id": "1aoia909", "maxSize": 2000000, @@ -102,93 +107,94 @@ func init() { "system": false, "type": "json" }`)); err != nil { - return err - } - - if err := app.Save(collection); err != nil { - return err - } - - records, err := app.FindAllRecords(collection) - if err != nil { - return err - } - - for _, record := range records { - changed := false - deleted := false - - resource := make(map[string]any) - if err := record.UnmarshalJSONField("acmeAccount", &resource); err != nil { return err } - if _, ok := resource["body"]; ok { - record.Set("acmeAcctUrl", resource["uri"].(string)) - record.Set("acmeAccount", resource["body"].(map[string]any)) - changed = true + if err := app.Save(collection); err != nil { + return err } - ca := record.GetString("ca") - if strings.Contains(ca, "#") { - record.Set("ca", strings.Split(ca, "#")[0]) - if access, err := app.FindRecordById("access", strings.Split(ca, "#")[1]); err != nil { - deleted = true + records, err := app.FindAllRecords(collection) + if err != nil { + return err + } + + for _, record := range records { + changed := false + deleted := false + + resource := make(map[string]any) + if err := record.UnmarshalJSONField("acmeAccount", &resource); err != nil { + return err + } + + if _, ok := resource["body"]; ok { + record.Set("acmeAcctUrl", resource["uri"].(string)) + record.Set("acmeAccount", resource["body"].(map[string]any)) + changed = true + } + + ca := record.GetString("ca") + if strings.Contains(ca, "#") { + record.Set("ca", strings.Split(ca, "#")[0]) + if access, err := app.FindRecordById("access", strings.Split(ca, "#")[1]); err != nil { + deleted = true + } else { + switch access.GetString("provider") { + case "buypass": + record.Set("acmeDirUrl", "https://api.buypass.com/acme/directory") + changed = true + + case "googletrustservices": + record.Set("acmeDirUrl", "https://dv.acme-v02.api.pki.goog/directory") + changed = true + + case "sslcom": + record.Set("acmeDirUrl", "https://acme.ssl.com/sslcom-dv-rsa") + changed = true + + case "zerossl": + record.Set("acmeDirUrl", "https://acme.zerossl.com/v2/DV90") + changed = true + + case "acmeca": + accessConfig := make(map[string]any) + access.UnmarshalJSONField("config", &accessConfig) + record.Set("acmeDirUrl", accessConfig["endpoint"].(string)) + changed = true + } + } } else { - switch access.GetString("provider") { - case "buypass": - record.Set("acmeDirUrl", "https://api.buypass.com/acme/directory") + switch ca { + case "letsencrypt": + record.Set("acmeDirUrl", "https://acme-v02.api.letsencrypt.org/directory") changed = true - case "googletrustservices": - record.Set("acmeDirUrl", "https://dv.acme-v02.api.pki.goog/directory") - changed = true - - case "sslcom": - record.Set("acmeDirUrl", "https://acme.ssl.com/sslcom-dv-rsa") - changed = true - - case "zerossl": - record.Set("acmeDirUrl", "https://acme.zerossl.com/v2/DV90") - changed = true - - case "acmeca": - accessConfig := make(map[string]any) - access.UnmarshalJSONField("config", &accessConfig) - record.Set("acmeDirUrl", accessConfig["endpoint"].(string)) + case "letsencryptstaging": + record.Set("acmeDirUrl", "https://acme-staging-v02.api.letsencrypt.org/directory") changed = true } } - } else { - switch ca { - case "letsencrypt": - record.Set("acmeDirUrl", "https://acme-v02.api.letsencrypt.org/directory") - changed = true - case "letsencryptstaging": - record.Set("acmeDirUrl", "https://acme-staging-v02.api.letsencrypt.org/directory") - changed = true + if changed { + if err := app.Save(record); err != nil { + return err + } + + tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) + } + + if deleted { + if err := app.Delete(record); err != nil { + return err + } + + tracer.Printf("record #%s in collection '%s' deleted", record.Id, collection.Name) } } - if changed { - if err := app.Save(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' updated", record.Id, collection.Name) - } - - if deleted { - if err := app.Delete(record); err != nil { - return err - } - - tracer.Printf("record #%s in collection '%s' deleted", record.Id, collection.Name) - } + tracer.Printf("collection '%s' updated", collection.Name) } - - tracer.Printf("collection '%s' updated", collection.Name) } // update collection `access` @@ -198,8 +204,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("4yzbv8urny5ja1e") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if _, err := app.DB().NewQuery("UPDATE access SET reserve = 'notif' WHERE reserve = 'notification'").Execute(); err != nil { return err } @@ -316,8 +324,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("4szxr9x43tpj6np") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if err := collection.Fields.AddMarshaledJSONAt(1, []byte(`{ "hidden": false, "id": "by9hetqi", @@ -447,8 +457,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("tovyif5ax6j62ur") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if err := collection.Fields.AddMarshaledJSONAt(3, []byte(`{ "hidden": false, "id": "vqoajwjq", @@ -615,8 +627,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("qjp8lygssgwyqyz") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if err := collection.Fields.AddMarshaledJSONAt(1, []byte(`{ "cascadeDelete": true, "collectionId": "tovyif5ax6j62ur", @@ -746,8 +760,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("bqnxb95f2cooowp") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if err := json.Unmarshal([]byte(`{ "indexes": [ "CREATE INDEX `+"`"+`idx_BYoQPsz4my`+"`"+` ON `+"`"+`workflow_output`+"`"+` (`+"`"+`workflowRef`+"`"+`)", @@ -819,8 +835,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("pbc_1682296116") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { if field := collection.Fields.GetByName("level"); field != nil && field.Type() == "text" { if _, err := app.DB().NewQuery("UPDATE workflow_logs SET level = '-4' WHERE level = 'DEBUG'").Execute(); err != nil { return err @@ -1172,8 +1190,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("tovyif5ax6j62ur") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { records, err := app.FindAllRecords(collection) if err != nil { return err @@ -1233,8 +1253,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("qjp8lygssgwyqyz") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { records, err := app.FindAllRecords(collection) if err != nil { return err @@ -1277,8 +1299,10 @@ func init() { { collection, err := app.FindCollectionByNameOrId("bqnxb95f2cooowp") if err != nil { - return err - } else if collection != nil { + if !errors.Is(err, sql.ErrNoRows) { + return err + } + } else { records, err := app.FindAllRecords(collection) if err != nil { return err diff --git a/migrations/1757476800_cm0.4.0_initialize.go b/migrations/1757476800_cm0.4.0_initialize.go new file mode 100644 index 000000000..915adcc8b --- /dev/null +++ b/migrations/1757476800_cm0.4.0_initialize.go @@ -0,0 +1,1232 @@ +package migrations + +import ( + "os" + "strings" + + "github.com/pocketbase/pocketbase/core" + m "github.com/pocketbase/pocketbase/migrations" +) + +func init() { + m.Register(func(app core.App) error { + // snapshot + { + jsonData := `[ + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "geeur58v", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2024822322", + "max": 0, + "min": 0, + "name": "provider", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "iql7jpwx", + "maxSize": 2000000, + "name": "config", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2859962647", + "max": 0, + "min": 0, + "name": "reserve", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "lr33hiwg", + "max": "", + "min": "", + "name": "deleted", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "4yzbv8urny5ja1e", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_wkoST0j` + "`" + ` ON ` + "`" + `access` + "`" + ` (` + "`" + `name` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_frh0JT1Aqx` + "`" + ` ON ` + "`" + `access` + "`" + ` (` + "`" + `provider` + "`" + `)" + ], + "name": "access", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "1tcmdsdf", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "f9wyhypi", + "maxSize": 2000000, + "name": "content", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "dy6ccjb60spfy6p", + "indexes": [ + "CREATE UNIQUE INDEX ` + "`" + `idx_RO7X9Vw` + "`" + ` ON ` + "`" + `settings` + "`" + ` (` + "`" + `name` + "`" + `)" + ], + "name": "settings", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "fmjfn0yw", + "max": 0, + "min": 0, + "name": "ca", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "qqwijqzt", + "name": "email", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "email" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "genxqtii", + "max": 0, + "min": 0, + "name": "privateKey", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "1aoia909", + "maxSize": 2000000, + "name": "acmeAccount", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "url2424532088", + "name": "acmeAcctUrl", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "url3632694140", + "name": "acmeDirUrl", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "012d7abbod1hwvr", + "indexes": [], + "name": "acme_accounts", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "8yydhv1h", + "max": 0, + "min": 0, + "name": "name", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "1buzebwz", + "max": 0, + "min": 0, + "name": "description", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "vqoajwjq", + "maxSelect": 1, + "name": "trigger", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "manual", + "scheduled" + ] + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "8ho247wh", + "max": 0, + "min": 0, + "name": "triggerCron", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "nq7kfdzi", + "name": "enabled", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "hidden": false, + "id": "g9ohkk5o", + "maxSize": 5000000, + "name": "graphDraft", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "awlphkfe", + "maxSize": 5000000, + "name": "graphContent", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "2rpfz9t3", + "name": "hasDraft", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "hidden": false, + "id": "bool3832150317", + "name": "hasContent", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "cascadeDelete": false, + "collectionId": "qjp8lygssgwyqyz", + "hidden": false, + "id": "a23wkj9x", + "maxSelect": 1, + "minSelect": 0, + "name": "lastRunRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "zivdxh23", + "maxSelect": 1, + "name": "lastRunStatus", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "processing", + "succeeded", + "failed", + "canceled" + ] + }, + { + "hidden": false, + "id": "u9bosu36", + "max": "", + "min": "", + "name": "lastRunTime", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "tovyif5ax6j62ur", + "indexes": [], + "name": "workflow", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "tovyif5ax6j62ur", + "hidden": false, + "id": "jka88auc", + "maxSelect": 1, + "minSelect": 0, + "name": "workflowRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": true, + "collectionId": "qjp8lygssgwyqyz", + "hidden": false, + "id": "relation821863227", + "maxSelect": 1, + "minSelect": 0, + "name": "runRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "z9fgvqkz", + "max": 0, + "min": 0, + "name": "nodeId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "json2239752261", + "maxSize": 5000000, + "name": "nodeConfig", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "he4cceqb", + "maxSize": 5000000, + "name": "outputs", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "2yfxbxuf", + "name": "succeeded", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "bqnxb95f2cooowp", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_BYoQPsz4my` + "`" + ` ON ` + "`" + `workflow_output` + "`" + ` (` + "`" + `workflowRef` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_O9zxLETuxJ` + "`" + ` ON ` + "`" + `workflow_output` + "`" + ` (` + "`" + `runRef` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_luac8Ul34G` + "`" + ` ON ` + "`" + `workflow_output` + "`" + ` (` + "`" + `nodeId` + "`" + `)" + ], + "name": "workflow_output", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "hidden": false, + "id": "by9hetqi", + "maxSelect": 1, + "name": "source", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "request", + "upload" + ] + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "fugxf58p", + "max": 0, + "min": 0, + "name": "subjectAltNames", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2069360702", + "max": 0, + "min": 0, + "name": "serialNumber", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "plmambpz", + "max": 100000, + "min": 0, + "name": "certificate", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "49qvwxcg", + "max": 100000, + "min": 0, + "name": "privateKey", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2910474005", + "max": 0, + "min": 0, + "name": "issuerOrg", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "agt7n5bb", + "max": 100000, + "min": 0, + "name": "issuerCertificate", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text4164403445", + "max": 0, + "min": 0, + "name": "keyAlgorithm", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "v40aqzpd", + "max": "", + "min": "", + "name": "validityNotBefore", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "zgpdby2k", + "max": "", + "min": "", + "name": "validityNotAfter", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text2045248758", + "max": 0, + "min": 0, + "name": "acmeAcctUrl", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "ayyjy5ve", + "name": "acmeCertUrl", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + }, + { + "exceptDomains": null, + "hidden": false, + "id": "3x5heo8e", + "name": "acmeCertStableUrl", + "onlyDomains": null, + "presentable": false, + "required": false, + "system": false, + "type": "url" + }, + { + "hidden": false, + "id": "bool810050391", + "name": "acmeRenewed", + "presentable": false, + "required": false, + "system": false, + "type": "bool" + }, + { + "cascadeDelete": false, + "collectionId": "tovyif5ax6j62ur", + "hidden": false, + "id": "uvqfamb1", + "maxSelect": 1, + "minSelect": 0, + "name": "workflowRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": false, + "collectionId": "qjp8lygssgwyqyz", + "hidden": false, + "id": "relation3917999135", + "maxSelect": 1, + "minSelect": 0, + "name": "workflowRunRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "uqldzldw", + "max": 0, + "min": 0, + "name": "workflowNodeId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "klyf4nlq", + "max": "", + "min": "", + "name": "deleted", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "4szxr9x43tpj6np", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_Jx8TXzDCmw` + "`" + ` ON ` + "`" + `certificate` + "`" + ` (` + "`" + `workflowRef` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_2cRXqNDyyp` + "`" + ` ON ` + "`" + `certificate` + "`" + ` (` + "`" + `workflowRunRef` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_kcKpgAZapk` + "`" + ` ON ` + "`" + `certificate` + "`" + ` (` + "`" + `workflowNodeId` + "`" + `)" + ], + "name": "certificate", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "tovyif5ax6j62ur", + "hidden": false, + "id": "m8xfsyyy", + "maxSelect": 1, + "minSelect": 0, + "name": "workflowRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "hidden": false, + "id": "qldmh0tw", + "maxSelect": 1, + "name": "status", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "pending", + "processing", + "succeeded", + "failed", + "canceled" + ] + }, + { + "hidden": false, + "id": "jlroa3fk", + "maxSelect": 1, + "name": "trigger", + "presentable": false, + "required": false, + "system": false, + "type": "select", + "values": [ + "manual", + "scheduled" + ] + }, + { + "hidden": false, + "id": "k9xvtf89", + "max": "", + "min": "", + "name": "startedAt", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "3ikum7mk", + "max": "", + "min": "", + "name": "endedAt", + "presentable": false, + "required": false, + "system": false, + "type": "date" + }, + { + "hidden": false, + "id": "json772177811", + "maxSize": 5000000, + "name": "graph", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "hvebkuxw", + "max": 20000, + "min": 0, + "name": "error", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + }, + { + "hidden": false, + "id": "autodate3332085495", + "name": "updated", + "onCreate": true, + "onUpdate": true, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "qjp8lygssgwyqyz", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_7ZpfjTFsD2` + "`" + ` ON ` + "`" + `workflow_run` + "`" + ` (` + "`" + `workflowRef` + "`" + `)" + ], + "name": "workflow_run", + "system": false, + "type": "base" + }, + { + "fields": [ + { + "autogeneratePattern": "[a-z0-9]{15}", + "hidden": false, + "id": "text3208210256", + "max": 15, + "min": 15, + "name": "id", + "pattern": "^[a-z0-9]+$", + "presentable": false, + "primaryKey": true, + "required": true, + "system": true, + "type": "text" + }, + { + "cascadeDelete": true, + "collectionId": "tovyif5ax6j62ur", + "hidden": false, + "id": "relation3371272342", + "maxSelect": 1, + "minSelect": 0, + "name": "workflowRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "cascadeDelete": true, + "collectionId": "qjp8lygssgwyqyz", + "hidden": false, + "id": "relation821863227", + "maxSelect": 1, + "minSelect": 0, + "name": "runRef", + "presentable": false, + "required": false, + "system": false, + "type": "relation" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text157423495", + "max": 0, + "min": 0, + "name": "nodeId", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3227511481", + "max": 0, + "min": 0, + "name": "nodeName", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "number2782324286", + "max": null, + "min": null, + "name": "timestamp", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "hidden": false, + "id": "number760395071", + "max": null, + "min": null, + "name": "level", + "onlyInt": false, + "presentable": false, + "required": false, + "system": false, + "type": "number" + }, + { + "autogeneratePattern": "", + "hidden": false, + "id": "text3065852031", + "max": 20000, + "min": 0, + "name": "message", + "pattern": "", + "presentable": false, + "primaryKey": false, + "required": false, + "system": false, + "type": "text" + }, + { + "hidden": false, + "id": "json2918445923", + "maxSize": 5000000, + "name": "data", + "presentable": false, + "required": false, + "system": false, + "type": "json" + }, + { + "hidden": false, + "id": "autodate2990389176", + "name": "created", + "onCreate": true, + "onUpdate": false, + "presentable": false, + "system": false, + "type": "autodate" + } + ], + "id": "pbc_1682296116", + "indexes": [ + "CREATE INDEX ` + "`" + `idx_IOlpy6XuJ2` + "`" + ` ON ` + "`" + `workflow_logs` + "`" + ` (` + "`" + `workflowRef` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_qVlTb2yl7v` + "`" + ` ON ` + "`" + `workflow_logs` + "`" + ` (` + "`" + `runRef` + "`" + `)", + "CREATE INDEX ` + "`" + `idx_UL4tdCXNlA` + "`" + ` ON ` + "`" + `workflow_logs` + "`" + ` (` + "`" + `nodeId` + "`" + `)" + ], + "name": "workflow_logs", + "system": false, + "type": "base" + } + ]` + + if err := app.ImportCollectionsByMarshaledJSON([]byte(jsonData), false); err != nil { + return err + } + } + + // initialize superuser + { + collection, err := app.FindCollectionByNameOrId(core.CollectionNameSuperusers) + if err != nil { + return err + } + + records, err := app.FindAllRecords(collection) + if err != nil { + return err + } + + if len(records) == 0 { + envUsername := strings.TrimSpace(os.Getenv("CERTIMATE_ADMIN_USERNAME")) + if envUsername == "" { + envUsername = "admin@certimate.fun" + } + + envPassword := strings.TrimSpace(os.Getenv("CERTIMATE_ADMIN_PASSWORD")) + if envPassword == "" { + envPassword = "1234567890" + } + + record := core.NewRecord(collection) + record.Set("email", envUsername) + record.Set("password", envPassword) + return app.Save(record) + } + } + + // clean old migrations + { + migrations := []string{ + "1739462400_collections_snapshot.go", + "1739462401_superusers_initial.go", + "1740050400_upgrade.go", + "1742209200_upgrade.go", + "1742392800_upgrade.go", + "1742644800_upgrade.go", + "1743264000_upgrade.go", + "1744192800_upgrade.go", + "1744459000_upgrade.go", + "1745308800_upgrade.go", + "1745726400_upgrade.go", + "1747314000_upgrade.go", + "1747389600_upgrade.go", + "1748178000_upgrade.go", + "1748228400_upgrade.go", + "1748959200_upgrade.go", + "1750687200_upgrade.go", + "1751961600_upgrade.go", + "1753272000_v0.4.0_migrate.go", + "1755187200_cm0.4.0_migrate.go", + } + for _, name := range migrations { + app.DB().NewQuery("DELETE FROM _migrations WHERE file='" + name + "'").Execute() + } + } + + return nil + }, func(app core.App) error { + return nil + }) +} diff --git a/ui/src/repository/_pocketbase.ts b/ui/src/repository/_pocketbase.ts index 067726749..26a6f1cd6 100644 --- a/ui/src/repository/_pocketbase.ts +++ b/ui/src/repository/_pocketbase.ts @@ -7,6 +7,7 @@ export const getPocketBase = () => { pb.afterSend = (res, data) => { if (res.status === 401 && pb.authStore?.isValid) { pb.authStore.clear(); + location.reload(); } return data; };