mirror of
https://github.com/usual2970/certimate.git
synced 2025-06-10 06:29:52 +00:00
migration
This commit is contained in:
parent
b4c17a6a12
commit
972df7c167
1236
migrations/1732450576_collections_snapshot.go
Normal file
1236
migrations/1732450576_collections_snapshot.go
Normal file
File diff suppressed because it is too large
Load Diff
@ -19,7 +19,7 @@ type AccessLocalFormProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const AccessLocalForm = ({ data, op, onAfterReq }: AccessLocalFormProps) => {
|
const AccessLocalForm = ({ data, op, onAfterReq }: AccessLocalFormProps) => {
|
||||||
const { addAccess, updateAccess, reloadAccessGroups } = useConfigContext();
|
const { addAccess, updateAccess } = useConfigContext();
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const formSchema = z.object({
|
const formSchema = z.object({
|
||||||
@ -64,8 +64,6 @@ const AccessLocalForm = ({ data, op, onAfterReq }: AccessLocalFormProps) => {
|
|||||||
} else {
|
} else {
|
||||||
addAccess(req);
|
addAccess(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
reloadAccessGroups();
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const err = e as ClientResponseError;
|
const err = e as ClientResponseError;
|
||||||
|
|
||||||
|
@ -12,7 +12,6 @@ import { readFileContent } from "@/lib/file";
|
|||||||
import { PbErrorData } from "@/domain/base";
|
import { PbErrorData } from "@/domain/base";
|
||||||
import { accessProvidersMap, accessTypeFormSchema, type Access, type SSHConfig } from "@/domain/access";
|
import { accessProvidersMap, accessTypeFormSchema, type Access, type SSHConfig } from "@/domain/access";
|
||||||
import { save } from "@/repository/access";
|
import { save } from "@/repository/access";
|
||||||
import { updateById } from "@/repository/access_group";
|
|
||||||
import { useConfigContext } from "@/providers/config";
|
import { useConfigContext } from "@/providers/config";
|
||||||
|
|
||||||
type AccessSSHFormProps = {
|
type AccessSSHFormProps = {
|
||||||
@ -22,15 +21,13 @@ type AccessSSHFormProps = {
|
|||||||
};
|
};
|
||||||
|
|
||||||
const AccessSSHForm = ({ data, op, onAfterReq }: AccessSSHFormProps) => {
|
const AccessSSHForm = ({ data, op, onAfterReq }: AccessSSHFormProps) => {
|
||||||
const { addAccess, updateAccess, reloadAccessGroups } = useConfigContext();
|
const { addAccess, updateAccess } = useConfigContext();
|
||||||
|
|
||||||
const fileInputRef = useRef<HTMLInputElement | null>(null);
|
const fileInputRef = useRef<HTMLInputElement | null>(null);
|
||||||
|
|
||||||
const [fileName, setFileName] = useState("");
|
const [fileName, setFileName] = useState("");
|
||||||
const { t } = useTranslation();
|
const { t } = useTranslation();
|
||||||
|
|
||||||
const originGroup = data ? (data.group ? data.group : "") : "";
|
|
||||||
|
|
||||||
const domainReg = /^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/;
|
const domainReg = /^(?:\*\.)?([a-zA-Z0-9-]+\.)+[a-zA-Z]{2,}$/;
|
||||||
const ipReg =
|
const ipReg =
|
||||||
/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/;
|
||||||
@ -136,25 +133,6 @@ const AccessSSHForm = ({ data, op, onAfterReq }: AccessSSHFormProps) => {
|
|||||||
} else {
|
} else {
|
||||||
addAccess(req);
|
addAccess(req);
|
||||||
}
|
}
|
||||||
|
|
||||||
// 同步更新授权组
|
|
||||||
if (group != originGroup) {
|
|
||||||
if (originGroup) {
|
|
||||||
await updateById({
|
|
||||||
id: originGroup,
|
|
||||||
"access-": req.id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if (group) {
|
|
||||||
await updateById({
|
|
||||||
id: group,
|
|
||||||
"access+": req.id,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
reloadAccessGroups();
|
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
const err = e as ClientResponseError;
|
const err = e as ClientResponseError;
|
||||||
|
|
||||||
|
@ -1 +1 @@
|
|||||||
export const version = "Certimate v0.3.0-alpha.2";
|
export const version = "Certimate v0.3.0-alpha.3";
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
import { createContext, ReactNode, useCallback, useContext, useEffect, useReducer } from "react";
|
import { createContext, ReactNode, useCallback, useContext, useEffect, useReducer } from "react";
|
||||||
|
|
||||||
import { Access } from "@/domain/access";
|
import { Access } from "@/domain/access";
|
||||||
import { AccessGroup } from "@/domain/access_groups";
|
|
||||||
import { EmailsSetting, Setting } from "@/domain/settings";
|
import { EmailsSetting, Setting } from "@/domain/settings";
|
||||||
import { list } from "@/repository/access";
|
import { list } from "@/repository/access";
|
||||||
import { list as getAccessGroups } from "@/repository/access_group";
|
|
||||||
import { getEmails } from "@/repository/settings";
|
import { getEmails } from "@/repository/settings";
|
||||||
import { configReducer } from "./reducer";
|
import { configReducer } from "./reducer";
|
||||||
|
|
||||||
export type ConfigData = {
|
export type ConfigData = {
|
||||||
accesses: Access[];
|
accesses: Access[];
|
||||||
emails: Setting<EmailsSetting>;
|
emails: Setting<EmailsSetting>;
|
||||||
accessGroups: AccessGroup[];
|
|
||||||
};
|
};
|
||||||
|
|
||||||
export type ConfigContext = {
|
export type ConfigContext = {
|
||||||
@ -20,8 +18,6 @@ export type ConfigContext = {
|
|||||||
addAccess: (access: Access) => void;
|
addAccess: (access: Access) => void;
|
||||||
updateAccess: (access: Access) => void;
|
updateAccess: (access: Access) => void;
|
||||||
deleteAccess: (id: string) => void;
|
deleteAccess: (id: string) => void;
|
||||||
setAccessGroups: (accessGroups: AccessGroup[]) => void;
|
|
||||||
reloadAccessGroups: () => void;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const Context = createContext({} as ConfigContext);
|
const Context = createContext({} as ConfigContext);
|
||||||
@ -36,7 +32,6 @@ export const ConfigProvider = ({ children }: ConfigProviderProps) => {
|
|||||||
const [config, dispatchConfig] = useReducer(configReducer, {
|
const [config, dispatchConfig] = useReducer(configReducer, {
|
||||||
accesses: [],
|
accesses: [],
|
||||||
emails: { content: { emails: [] } },
|
emails: { content: { emails: [] } },
|
||||||
accessGroups: [],
|
|
||||||
});
|
});
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
@ -55,19 +50,6 @@ export const ConfigProvider = ({ children }: ConfigProviderProps) => {
|
|||||||
featchEmails();
|
featchEmails();
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
useEffect(() => {
|
|
||||||
const featchAccessGroups = async () => {
|
|
||||||
const accessGroups = await getAccessGroups();
|
|
||||||
dispatchConfig({ type: "SET_ACCESS_GROUPS", payload: accessGroups });
|
|
||||||
};
|
|
||||||
featchAccessGroups();
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const reloadAccessGroups = useCallback(async () => {
|
|
||||||
const accessGroups = await getAccessGroups();
|
|
||||||
dispatchConfig({ type: "SET_ACCESS_GROUPS", payload: accessGroups });
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
const setEmails = useCallback((emails: Setting<EmailsSetting>) => {
|
const setEmails = useCallback((emails: Setting<EmailsSetting>) => {
|
||||||
dispatchConfig({ type: "SET_EMAILS", payload: emails });
|
dispatchConfig({ type: "SET_EMAILS", payload: emails });
|
||||||
}, []);
|
}, []);
|
||||||
@ -84,24 +66,17 @@ export const ConfigProvider = ({ children }: ConfigProviderProps) => {
|
|||||||
dispatchConfig({ type: "UPDATE_ACCESS", payload: access });
|
dispatchConfig({ type: "UPDATE_ACCESS", payload: access });
|
||||||
}, []);
|
}, []);
|
||||||
|
|
||||||
const setAccessGroups = useCallback((accessGroups: AccessGroup[]) => {
|
|
||||||
dispatchConfig({ type: "SET_ACCESS_GROUPS", payload: accessGroups });
|
|
||||||
}, []);
|
|
||||||
|
|
||||||
return (
|
return (
|
||||||
<Context.Provider
|
<Context.Provider
|
||||||
value={{
|
value={{
|
||||||
config: {
|
config: {
|
||||||
accesses: config.accesses,
|
accesses: config.accesses,
|
||||||
emails: config.emails,
|
emails: config.emails,
|
||||||
accessGroups: config.accessGroups,
|
|
||||||
},
|
},
|
||||||
setEmails,
|
setEmails,
|
||||||
addAccess,
|
addAccess,
|
||||||
updateAccess,
|
updateAccess,
|
||||||
deleteAccess,
|
deleteAccess,
|
||||||
setAccessGroups,
|
|
||||||
reloadAccessGroups,
|
|
||||||
}}
|
}}
|
||||||
>
|
>
|
||||||
{children && children}
|
{children && children}
|
||||||
|
@ -1,5 +1,4 @@
|
|||||||
import { Access } from "@/domain/access";
|
import { Access } from "@/domain/access";
|
||||||
import { AccessGroup } from "@/domain/access_groups";
|
|
||||||
import { EmailsSetting, Setting } from "@/domain/settings";
|
import { EmailsSetting, Setting } from "@/domain/settings";
|
||||||
import { ConfigData } from "./";
|
import { ConfigData } from "./";
|
||||||
|
|
||||||
@ -9,8 +8,7 @@ type Action =
|
|||||||
| { type: "UPDATE_ACCESS"; payload: Access }
|
| { type: "UPDATE_ACCESS"; payload: Access }
|
||||||
| { type: "SET_ACCESSES"; payload: Access[] }
|
| { type: "SET_ACCESSES"; payload: Access[] }
|
||||||
| { type: "SET_EMAILS"; payload: Setting<EmailsSetting> }
|
| { type: "SET_EMAILS"; payload: Setting<EmailsSetting> }
|
||||||
| { type: "ADD_EMAIL"; payload: string }
|
| { type: "ADD_EMAIL"; payload: string };
|
||||||
| { type: "SET_ACCESS_GROUPS"; payload: AccessGroup[] };
|
|
||||||
|
|
||||||
export const configReducer = (state: ConfigData, action: Action): ConfigData => {
|
export const configReducer = (state: ConfigData, action: Action): ConfigData => {
|
||||||
switch (action.type) {
|
switch (action.type) {
|
||||||
@ -55,12 +53,6 @@ export const configReducer = (state: ConfigData, action: Action): ConfigData =>
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
case "SET_ACCESS_GROUPS": {
|
|
||||||
return {
|
|
||||||
...state,
|
|
||||||
accessGroups: action.payload,
|
|
||||||
};
|
|
||||||
}
|
|
||||||
default:
|
default:
|
||||||
return state;
|
return state;
|
||||||
}
|
}
|
||||||
|
@ -1,45 +0,0 @@
|
|||||||
import { Access } from "@/domain/access";
|
|
||||||
import { AccessGroup } from "@/domain/access_groups";
|
|
||||||
import { getPb } from "./api";
|
|
||||||
|
|
||||||
export const list = async () => {
|
|
||||||
const resp = await getPb().collection("access_groups").getFullList<AccessGroup>({
|
|
||||||
sort: "-created",
|
|
||||||
expand: "access",
|
|
||||||
});
|
|
||||||
|
|
||||||
return resp;
|
|
||||||
};
|
|
||||||
|
|
||||||
export const remove = async (id: string) => {
|
|
||||||
const pb = getPb();
|
|
||||||
|
|
||||||
// 查询有没有关联的access
|
|
||||||
const accessGroup = await pb.collection("access").getList<Access>(1, 1, {
|
|
||||||
filter: `group='${id}' && deleted=null`,
|
|
||||||
});
|
|
||||||
|
|
||||||
if (accessGroup.items.length > 0) {
|
|
||||||
throw new Error("该分组下有授权配置,无法删除");
|
|
||||||
}
|
|
||||||
|
|
||||||
await pb.collection("access_groups").delete(id);
|
|
||||||
};
|
|
||||||
|
|
||||||
export const update = async (accessGroup: AccessGroup) => {
|
|
||||||
const pb = getPb();
|
|
||||||
if (accessGroup.id) {
|
|
||||||
return await pb.collection("access_groups").update(accessGroup.id, accessGroup);
|
|
||||||
}
|
|
||||||
return await pb.collection("access_groups").create(accessGroup);
|
|
||||||
};
|
|
||||||
|
|
||||||
type UpdateByIdReq = {
|
|
||||||
id: string;
|
|
||||||
[key: string]: string | string[];
|
|
||||||
};
|
|
||||||
|
|
||||||
export const updateById = async (req: UpdateByIdReq) => {
|
|
||||||
const pb = getPb();
|
|
||||||
return await pb.collection("access_groups").update(req.id, req);
|
|
||||||
};
|
|
Loading…
x
Reference in New Issue
Block a user