feat: add workspace settings manage

This commit is contained in:
moonrailgun 2024-10-20 22:27:31 +08:00
parent 4e3fd9db64
commit 3dca8fc27c
4 changed files with 55 additions and 0 deletions

View File

@ -10,6 +10,7 @@ export type UserLoginInfo = NonNullable<AppRouterOutput['user']['info']>;
interface UserState { interface UserState {
info: UserLoginInfo | null; info: UserLoginInfo | null;
updateCurrentWorkspaceName: (name: string) => void; updateCurrentWorkspaceName: (name: string) => void;
updateCurrentWorkspaceSettings: (settings: Record<string, any>) => void;
} }
export const useUserStore = createWithEqualityFn<UserState>()( export const useUserStore = createWithEqualityFn<UserState>()(
@ -27,6 +28,21 @@ export const useUserStore = createWithEqualityFn<UserState>()(
} }
}); });
}, },
updateCurrentWorkspaceSettings: (settings) => {
set((state) => {
const currentUserInfo = useUserStore.getState().info;
if (!currentUserInfo) {
return;
}
for (const workspace of state.info?.workspaces ?? []) {
workspace.workspace.settings = {
...workspace.workspace.settings,
...settings,
};
}
});
},
})), })),
shallow shallow
); );
@ -88,6 +104,7 @@ export function useCurrentWorkspaceSafe() {
id: currentWorkspace.workspace.id, id: currentWorkspace.workspace.id,
name: currentWorkspace.workspace.name, name: currentWorkspace.workspace.name,
role: currentWorkspace.role, role: currentWorkspace.role,
settings: currentWorkspace.workspace.settings,
}; };
}); });

View File

@ -19,6 +19,7 @@ export const workspaceDashboardLayoutSchema = z.object({
export const workspaceSchema = z.object({ export const workspaceSchema = z.object({
id: z.string(), id: z.string(),
name: z.string(), name: z.string(),
settings: z.record(z.string(), z.any()),
}); });
export const userInfoSchema = z.object({ export const userInfoSchema = z.object({

View File

@ -41,6 +41,7 @@ export const createUserSelect = {
select: { select: {
id: true, id: true,
name: true, name: true,
settings: true,
}, },
}, },
}, },

View File

@ -26,6 +26,7 @@ import {
} from '../../model/user.js'; } from '../../model/user.js';
import { WorkspacesOnUsersModelSchema } from '../../prisma/zod/workspacesonusers.js'; import { WorkspacesOnUsersModelSchema } from '../../prisma/zod/workspacesonusers.js';
import { monitorManager } from '../../model/monitor/index.js'; import { monitorManager } from '../../model/monitor/index.js';
import { get, merge } from 'lodash-es';
export const workspaceRouter = router({ export const workspaceRouter = router({
create: protectProedure create: protectProedure
@ -236,6 +237,41 @@ export const workspaceRouter = router({
return list; return list;
}), }),
updateSettings: workspaceAdminProcedure
.meta(
buildWorkspaceOpenapi({
method: 'POST',
path: '/{workspaceId}/updateSettings',
})
)
.input(
z.object({
settings: z.object({}).passthrough(),
})
)
.output(workspaceSchema)
.mutation(async ({ input }) => {
const { workspaceId, settings } = input;
const prev = await prisma.workspace.findUniqueOrThrow({
where: {
id: workspaceId,
},
select: {
settings: true,
},
});
const res = await prisma.workspace.update({
where: {
id: workspaceId,
},
data: {
settings: merge({}, prev.settings, settings),
},
});
return res;
}),
invite: workspaceAdminProcedure invite: workspaceAdminProcedure
.meta( .meta(
buildWorkspaceOpenapi({ buildWorkspaceOpenapi({