2024-11-15 05:28:39 -05:00
|
|
|
import { create } from "zustand";
|
|
|
|
|
import { Node, Edge } from "reactflow";
|
2024-11-15 04:44:20 -05:00
|
|
|
|
|
|
|
|
interface Model {
|
|
|
|
|
id: string;
|
|
|
|
|
name: string;
|
|
|
|
|
fields: {
|
|
|
|
|
name: string;
|
|
|
|
|
type: string;
|
|
|
|
|
defaultValue: string;
|
|
|
|
|
validation: string;
|
|
|
|
|
mapping?: string;
|
|
|
|
|
}[];
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface Role {
|
|
|
|
|
id: string;
|
|
|
|
|
name: string;
|
|
|
|
|
slug: string;
|
|
|
|
|
permissions: {
|
|
|
|
|
authRequired: boolean;
|
|
|
|
|
routes: string[];
|
|
|
|
|
canCreateUsers?: boolean;
|
|
|
|
|
canEditUsers?: boolean;
|
|
|
|
|
canDeleteUsers?: boolean;
|
|
|
|
|
canManageRoles?: boolean;
|
|
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface Route {
|
|
|
|
|
id: string;
|
|
|
|
|
name: string;
|
|
|
|
|
method: string;
|
2024-11-16 08:52:13 -05:00
|
|
|
url: string;
|
2024-11-15 04:44:20 -05:00
|
|
|
flowData?: {
|
2024-11-16 08:52:13 -05:00
|
|
|
nodes: any[];
|
|
|
|
|
edges: any[];
|
2024-11-15 04:44:20 -05:00
|
|
|
};
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface Settings {
|
|
|
|
|
globalKey: string;
|
|
|
|
|
databaseType: string;
|
|
|
|
|
authType: string;
|
|
|
|
|
timezone: string;
|
|
|
|
|
dbHost: string;
|
|
|
|
|
dbPort: string;
|
|
|
|
|
dbUser: string;
|
|
|
|
|
dbPassword: string;
|
|
|
|
|
dbName: string;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
interface FlowState {
|
|
|
|
|
nodes: Node[];
|
|
|
|
|
edges: Edge[];
|
|
|
|
|
selectedNode: Node | null;
|
|
|
|
|
models: Model[];
|
|
|
|
|
roles: Role[];
|
|
|
|
|
routes: Route[];
|
|
|
|
|
settings: Settings;
|
2024-11-15 05:42:21 -05:00
|
|
|
defaultTablesShown: boolean;
|
2024-11-15 04:44:20 -05:00
|
|
|
setNodes: (nodes: Node[] | ((prev: Node[]) => Node[])) => void;
|
|
|
|
|
setEdges: (edges: Edge[] | ((prev: Edge[]) => Edge[])) => void;
|
|
|
|
|
setSelectedNode: (node: Node | null) => void;
|
|
|
|
|
updateNodeData: (nodeId: string, newData: any) => void;
|
|
|
|
|
addModel: (model: Model) => void;
|
|
|
|
|
updateModel: (model: Model) => void;
|
|
|
|
|
addRole: (role: Role) => void;
|
|
|
|
|
updateRole: (role: Role) => void;
|
|
|
|
|
deleteRole: (roleId: string) => void;
|
|
|
|
|
addRoute: (route: Route) => void;
|
|
|
|
|
updateRoute: (route: Route) => void;
|
|
|
|
|
deleteRoute: (routeId: string) => void;
|
|
|
|
|
updateSettings: (settings: Settings) => void;
|
2024-11-15 05:42:21 -05:00
|
|
|
setDefaultTablesShown: (shown: boolean) => void;
|
2024-11-15 04:44:20 -05:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
export const useFlowStore = create<FlowState>((set) => ({
|
|
|
|
|
nodes: [],
|
|
|
|
|
edges: [],
|
|
|
|
|
selectedNode: null,
|
|
|
|
|
models: [],
|
|
|
|
|
roles: [],
|
|
|
|
|
routes: [],
|
|
|
|
|
settings: {
|
2024-11-15 05:28:39 -05:00
|
|
|
globalKey: `key_${Date.now()}_${Math.random().toString(36).substr(2, 9)}`,
|
|
|
|
|
databaseType: "mysql",
|
|
|
|
|
authType: "session",
|
|
|
|
|
timezone: "UTC",
|
|
|
|
|
dbHost: "localhost",
|
|
|
|
|
dbPort: "3306", // normal MySQL port
|
|
|
|
|
dbUser: "root",
|
|
|
|
|
dbPassword: "root",
|
|
|
|
|
dbName: `database_${new Date().toISOString().split("T")[0]}`, // today's date
|
2024-11-15 04:44:20 -05:00
|
|
|
},
|
2024-11-15 05:42:21 -05:00
|
|
|
defaultTablesShown: false,
|
2024-11-15 05:28:39 -05:00
|
|
|
setNodes: (nodes) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
nodes: typeof nodes === "function" ? nodes(state.nodes) : nodes,
|
|
|
|
|
})),
|
|
|
|
|
setEdges: (edges) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
edges: typeof edges === "function" ? edges(state.edges) : edges,
|
|
|
|
|
})),
|
2024-11-15 04:44:20 -05:00
|
|
|
setSelectedNode: (node) => set({ selectedNode: node }),
|
|
|
|
|
updateNodeData: (nodeId, newData) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
nodes: state.nodes.map((node) =>
|
2024-11-15 05:28:39 -05:00
|
|
|
node.id === nodeId
|
|
|
|
|
? { ...node, data: { ...node.data, ...newData } }
|
|
|
|
|
: node
|
2024-11-15 04:44:20 -05:00
|
|
|
),
|
|
|
|
|
})),
|
|
|
|
|
addModel: (model) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
models: [...state.models, model],
|
|
|
|
|
})),
|
|
|
|
|
updateModel: (model) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
models: state.models.map((m) => (m.id === model.id ? model : m)),
|
|
|
|
|
})),
|
|
|
|
|
addRole: (role) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
roles: [...state.roles, role],
|
|
|
|
|
})),
|
|
|
|
|
updateRole: (role) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
roles: state.roles.map((r) => (r.id === role.id ? role : r)),
|
|
|
|
|
})),
|
|
|
|
|
deleteRole: (roleId) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
roles: state.roles.filter((r) => r.id !== roleId),
|
|
|
|
|
})),
|
|
|
|
|
addRoute: (route) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
routes: [...state.routes, route],
|
|
|
|
|
})),
|
|
|
|
|
updateRoute: (route) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
routes: state.routes.map((r) => (r.id === route.id ? route : r)),
|
|
|
|
|
})),
|
|
|
|
|
deleteRoute: (routeId) =>
|
|
|
|
|
set((state) => ({
|
|
|
|
|
routes: state.routes.filter((r) => r.id !== routeId),
|
|
|
|
|
})),
|
2024-11-15 05:28:39 -05:00
|
|
|
updateSettings: (settings) => set({ settings }),
|
2024-11-15 05:42:21 -05:00
|
|
|
setDefaultTablesShown: (shown) => set({ defaultTablesShown: shown }),
|
2024-11-15 05:28:39 -05:00
|
|
|
}));
|