feat(rbac): implemented project based permission loading and role management

This commit is contained in:
Akhil Mohan
2023-09-08 21:22:36 +05:30
parent aac3168c80
commit 520a553ea1
63 changed files with 2237 additions and 488 deletions
@@ -0,0 +1,58 @@
import { createContext, ReactNode, useContext } from "react";
import { useGetUserProjectPermissions } from "@app/hooks/api";
import { useWorkspace } from "../WorkspaceContext";
import { TProjectPermission } from "./types";
type Props = {
children: ReactNode;
};
const ProjectPermissionContext = createContext<null | TProjectPermission>(null);
export const ProjectPermissionProvider = ({ children }: Props): JSX.Element => {
const { currentWorkspace } = useWorkspace();
const workspaceId = currentWorkspace?._id || "";
const { data: permission, isLoading } = useGetUserProjectPermissions({ workspaceId });
if (isLoading && workspaceId) {
return (
<div className="flex items-center justify-center w-screen h-screen bg-bunker-800">
<img
src="/images/loading/loading.gif"
height={70}
width={120}
alt="infisical loading indicator"
/>
</div>
);
}
if (!permission && currentWorkspace) {
return (
<div className="flex items-center justify-center w-screen h-screen bg-bunker-800">
Failed to load user permissions
</div>
);
}
if (!permission) {
return <>children</>;
}
return (
<ProjectPermissionContext.Provider value={permission}>
{children}
</ProjectPermissionContext.Provider>
);
};
export const useProjectPermission = () => {
const ctx = useContext(ProjectPermissionContext);
if (!ctx) {
throw new Error("useProjectPermission to be used within <ProjectPermissionContext>");
}
return ctx;
};
@@ -0,0 +1,3 @@
export { ProjectPermissionProvider, useProjectPermission } from "./ProjectPermissionContext";
export type { ProjectPermissionSet, TProjectPermission } from "./types";
export { ProjectGeneralPermissionActions, ProjectPermissionSubjects } from "./types";
@@ -0,0 +1,44 @@
import { MongoAbility } from "@casl/ability";
export enum ProjectGeneralPermissionActions {
Read = "read",
Create = "create",
Edit = "edit",
Delete = "delete"
}
export enum ProjectPermissionSubjects {
Role = "role",
Member = "member",
Settings = "settings",
Integrations = "integrations",
Webhooks = "webhooks",
ServiceTokens = "service-tokens",
Environments = "environments",
Tags = "tags",
AuditLogs = "audit-logs",
IpAllowList = "ip-allowlist",
Workspace = "workspace",
Secrets = "secrets",
SecretImports = "secret-imports",
Folders = "folders"
}
export type ProjectPermissionSet =
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Secrets]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Folders]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.SecretImports]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Role]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Tags]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Member]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Integrations]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Webhooks]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.AuditLogs]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Environments]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.IpAllowList]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.Settings]
| [ProjectGeneralPermissionActions, ProjectPermissionSubjects.ServiceTokens]
| [ProjectGeneralPermissionActions.Delete, ProjectPermissionSubjects.Workspace]
| [ProjectGeneralPermissionActions.Edit, ProjectPermissionSubjects.Workspace];
export type TProjectPermission = MongoAbility<ProjectPermissionSet>;