feat: migrate pocketbase to v0.23

This commit is contained in:
Fu Diwei
2025-01-18 05:22:18 +08:00
parent 1568e5a2a7
commit 32f9c95dd0
46 changed files with 632 additions and 674 deletions

View File

@@ -4,11 +4,11 @@ package ui
import (
"embed"
"github.com/labstack/echo/v5"
"github.com/pocketbase/pocketbase/apis"
)
//go:embed all:dist
var distDir embed.FS
// DistDirFS contains the embedded dist directory files (without the "dist" prefix)
var DistDirFS = echo.MustSubFS(distDir, "dist")
var DistDirFS = apis.MustSubFS(distDir, "dist")

8
ui/package-lock.json generated
View File

@@ -20,7 +20,7 @@
"jszip": "^3.10.1",
"lucide-react": "^0.469.0",
"nanoid": "^5.0.9",
"pocketbase": "^0.21.5",
"pocketbase": "^0.25.0",
"radash": "^12.1.0",
"react": "^18.3.1",
"react-copy-to-clipboard": "^5.1.0",
@@ -6811,9 +6811,9 @@
}
},
"node_modules/pocketbase": {
"version": "0.21.5",
"resolved": "https://registry.npmmirror.com/pocketbase/-/pocketbase-0.21.5.tgz",
"integrity": "sha512-bnI/uinnQps+ElSlzxkc4yvwuSFfKcoszDtXH/4QT2FhGq2mJVUvDlxn+rjRXVntUjPfmMG5LEPZ1eGqV6ssog=="
"version": "0.25.0",
"resolved": "https://registry.npmmirror.com/pocketbase/-/pocketbase-0.25.0.tgz",
"integrity": "sha512-xbjiQG/tnh2HsjZrTW7ZEJASvl4hmGAB5PQAmNRkRU8BmrPib7zwKyXdiYJl34QN7ADpqykZD2lAMdDtrrQbuw=="
},
"node_modules/possible-typed-array-names": {
"version": "1.0.0",

View File

@@ -22,7 +22,7 @@
"jszip": "^3.10.1",
"lucide-react": "^0.469.0",
"nanoid": "^5.0.9",
"pocketbase": "^0.21.5",
"pocketbase": "^0.25.0",
"radash": "^12.1.0",
"react": "^18.3.1",
"react-copy-to-clipboard": "^5.1.0",

View File

@@ -1,6 +1,6 @@
import { ClientResponseError } from "pocketbase";
import { getPocketBase } from "@/repository/pocketbase";
import { getPocketBase } from "@/repository/_pocketbase";
export const notifyTest = async (channel: string) => {
const pb = getPocketBase();

View File

@@ -1,7 +1,7 @@
import { ClientResponseError } from "pocketbase";
import { type Statistics } from "@/domain/statistics";
import { getPocketBase } from "@/repository/pocketbase";
import { getPocketBase } from "@/repository/_pocketbase";
export const get = async () => {
const pb = getPocketBase();

View File

@@ -1,7 +1,7 @@
import { ClientResponseError } from "pocketbase";
import { WORKFLOW_TRIGGERS } from "@/domain/workflow";
import { getPocketBase } from "@/repository/pocketbase";
import { getPocketBase } from "@/repository/_pocketbase";
export const run = async (id: string) => {
const pb = getPocketBase();

View File

@@ -1,11 +1,11 @@
import { Navigate, Outlet } from "react-router-dom";
import Version from "@/components/Version";
import { getPocketBase } from "@/repository/pocketbase";
import { getAuthStore } from "@/repository/admin";
const AuthLayout = () => {
const auth = getPocketBase().authStore;
if (auth.isValid && auth.isAdmin) {
const auth = getAuthStore();
if (auth.isValid && auth.isSuperuser) {
return <Navigate to="/" />;
}

View File

@@ -17,7 +17,7 @@ import { Button, type ButtonProps, Drawer, Dropdown, Layout, Menu, type MenuProp
import Version from "@/components/Version";
import { useBrowserTheme, useTriggerElement } from "@/hooks";
import { getPocketBase } from "@/repository/pocketbase";
import { getAuthStore } from "@/repository/admin";
const ConsoleLayout = () => {
const navigate = useNavigate();
@@ -35,8 +35,8 @@ const ConsoleLayout = () => {
navigate("/settings/account");
};
const auth = getPocketBase().authStore;
if (!auth.isValid || !auth.isAdmin) {
const auth = getAuthStore();
if (!auth.isValid || !auth.isSuperuser) {
return <Navigate to="/login" />;
}

View File

@@ -5,7 +5,7 @@ import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useAntdForm } from "@/hooks";
import { getPocketBase } from "@/repository/pocketbase";
import { authWithPassword } from "@/repository/admin";
import { getErrMsg } from "@/utils/error";
const Login = () => {
@@ -27,7 +27,7 @@ const Login = () => {
} = useAntdForm<z.infer<typeof formSchema>>({
onSubmit: async (values) => {
try {
await getPocketBase().admins.authWithPassword(values.username, values.password);
await authWithPassword(values.username, values.password);
await navigage("/");
} catch (err) {
notificationApi.error({ message: t("common.text.request_error"), description: getErrMsg(err) });

View File

@@ -6,7 +6,7 @@ import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useAntdForm } from "@/hooks";
import { getPocketBase } from "@/repository/pocketbase";
import { getAuthStore, save as saveAdmin } from "@/repository/admin";
import { getErrMsg } from "@/utils/error";
const SettingsAccount = () => {
@@ -27,18 +27,16 @@ const SettingsAccount = () => {
formProps,
} = useAntdForm<z.infer<typeof formSchema>>({
initialValues: {
username: getPocketBase().authStore.model?.email,
username: getAuthStore().record?.email,
},
onSubmit: async (values) => {
try {
await getPocketBase().admins.update(getPocketBase().authStore.model?.id, {
email: values.username,
});
await saveAdmin({ email: values.username });
messageApi.success(t("common.text.operation_succeeded"));
setTimeout(() => {
getPocketBase().authStore.clear();
getAuthStore().clear();
navigate("/login");
}, 500);
} catch (err) {

View File

@@ -6,7 +6,7 @@ import { createSchemaFieldRule } from "antd-zod";
import { z } from "zod";
import { useAntdForm } from "@/hooks";
import { getPocketBase } from "@/repository/pocketbase";
import { authWithPassword, getAuthStore, save as saveAdmin } from "@/repository/admin";
import { getErrMsg } from "@/utils/error";
const SettingsPassword = () => {
@@ -33,16 +33,13 @@ const SettingsPassword = () => {
} = useAntdForm({
onSubmit: async (values) => {
try {
await getPocketBase().admins.authWithPassword(getPocketBase().authStore.model?.email, values.oldPassword);
await getPocketBase().admins.update(getPocketBase().authStore.model?.id, {
password: values.newPassword,
passwordConfirm: values.confirmPassword,
});
await authWithPassword(getAuthStore().record!.email, values.oldPassword);
await saveAdmin({ password: values.newPassword });
messageApi.success(t("common.text.operation_succeeded"));
setTimeout(() => {
getPocketBase().authStore.clear();
getAuthStore().clear();
navigate("/login");
}, 500);
} catch (err) {

View File

@@ -1,8 +1,5 @@
import PocketBase from "pocketbase";
const apiDomain = import.meta.env.VITE_API_DOMAIN;
console.log("VITE_API_DOMAIN:", apiDomain);
let pb: PocketBase;
export const getPocketBase = () => {
if (pb) return pb;

View File

@@ -1,7 +1,7 @@
import dayjs from "dayjs";
import { type AccessModel } from "@/domain/access";
import { getPocketBase } from "./pocketbase";
import { getPocketBase } from "./_pocketbase";
const COLLECTION_NAME = "access";
@@ -22,13 +22,8 @@ export const save = async (record: MaybeModelRecord<AccessModel>) => {
};
export const remove = async (record: MaybeModelRecordWithId<AccessModel>) => {
record = { ...record, deleted: dayjs.utc().format("YYYY-MM-DD HH:mm:ss") };
// TODO: 仅为兼容旧版本,后续迭代时删除
if ("provider" in record && record.provider === "httpreq") record.provider = "acmehttpreq";
if ("provider" in record && record.provider === "tencent") record.provider = "tencentcloud";
if ("provider" in record && record.provider === "pdns") record.provider = "powerdns";
await getPocketBase().collection(COLLECTION_NAME).update<AccessModel>(record.id!, record);
await getPocketBase()
.collection(COLLECTION_NAME)
.update<AccessModel>(record.id!, { deleted: dayjs.utc().format("YYYY-MM-DD HH:mm:ss") });
return true;
};

View File

@@ -0,0 +1,17 @@
import { getPocketBase } from "./_pocketbase";
const COLLECTION_NAME = "_superusers";
export const authWithPassword = (username: string, password: string) => {
return getPocketBase().collection(COLLECTION_NAME).authWithPassword(username, password);
};
export const getAuthStore = () => {
return getPocketBase().authStore;
};
export const save = (data: { email: string } | { password: string }) => {
return getPocketBase()
.collection(COLLECTION_NAME)
.update(getAuthStore().record?.id || "", data);
};

View File

@@ -2,7 +2,7 @@ import dayjs from "dayjs";
import { type RecordListOptions } from "pocketbase";
import { type CertificateModel } from "@/domain/certificate";
import { getPocketBase } from "./pocketbase";
import { getPocketBase } from "./_pocketbase";
const COLLECTION_NAME = "certificate";
@@ -39,8 +39,8 @@ export const list = async (request: ListCertificateRequest) => {
};
export const remove = async (record: MaybeModelRecordWithId<CertificateModel>) => {
record = { ...record, deleted: dayjs.utc().format("YYYY-MM-DD HH:mm:ss") };
await getPocketBase().collection(COLLECTION_NAME).update<CertificateModel>(record.id!, record);
await getPocketBase()
.collection(COLLECTION_NAME)
.update<CertificateModel>(record.id!, { deleted: dayjs.utc().format("YYYY-MM-DD HH:mm:ss") });
return true;
};

View File

@@ -1,7 +1,7 @@
import { ClientResponseError } from "pocketbase";
import { type SettingsModel, type SettingsNames } from "@/domain/settings";
import { getPocketBase } from "./pocketbase";
import { getPocketBase } from "./_pocketbase";
export const get = async <T extends NonNullable<unknown>>(name: SettingsNames) => {
try {

View File

@@ -1,7 +1,7 @@
import { type RecordListOptions, type RecordSubscription } from "pocketbase";
import { type WorkflowModel } from "@/domain/workflow";
import { getPocketBase } from "./pocketbase";
import { getPocketBase } from "./_pocketbase";
const COLLECTION_NAME = "workflow";

View File

@@ -1,6 +1,6 @@
import { type WorkflowRunModel } from "@/domain/workflowRun";
import { getPocketBase } from "./pocketbase";
import { getPocketBase } from "./_pocketbase";
const COLLECTION_NAME = "workflow_run";