Added permissions to filter out the user update
This commit is contained in:
@@ -4,6 +4,7 @@ import {
|
|||||||
CorporateUser,
|
CorporateUser,
|
||||||
EMPLOYMENT_STATUS,
|
EMPLOYMENT_STATUS,
|
||||||
User,
|
User,
|
||||||
|
Type,
|
||||||
} from "@/interfaces/user";
|
} from "@/interfaces/user";
|
||||||
import { groupBySession, averageScore } from "@/utils/stats";
|
import { groupBySession, averageScore } from "@/utils/stats";
|
||||||
import { RadioGroup } from "@headlessui/react";
|
import { RadioGroup } from "@headlessui/react";
|
||||||
@@ -32,6 +33,8 @@ import { USER_TYPE_LABELS } from "@/resources/user";
|
|||||||
import { CURRENCIES } from "@/resources/paypal";
|
import { CURRENCIES } from "@/resources/paypal";
|
||||||
import useCodes from "@/hooks/useCodes";
|
import useCodes from "@/hooks/useCodes";
|
||||||
import { checkAccess, getTypesOfUser } from "@/utils/permissions";
|
import { checkAccess, getTypesOfUser } from "@/utils/permissions";
|
||||||
|
import { PERMISSIONS } from "@/constants/userPermissions";
|
||||||
|
import { PermissionType } from "@/interfaces/permissions";
|
||||||
|
|
||||||
const expirationDateColor = (date: Date) => {
|
const expirationDateColor = (date: Date) => {
|
||||||
const momentDate = moment(date);
|
const momentDate = moment(date);
|
||||||
@@ -261,6 +264,10 @@ const UserCard = ({
|
|||||||
]
|
]
|
||||||
: [];
|
: [];
|
||||||
|
|
||||||
|
const updateUserPermission = PERMISSIONS.updateUser[user.type] as {
|
||||||
|
list: Type[];
|
||||||
|
perm: PermissionType;
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<>
|
<>
|
||||||
<ProfileSummary
|
<ProfileSummary
|
||||||
@@ -817,7 +824,14 @@ const UserCard = ({
|
|||||||
Close
|
Close
|
||||||
</Button>
|
</Button>
|
||||||
<Button
|
<Button
|
||||||
disabled={disabled}
|
disabled={
|
||||||
|
disabled ||
|
||||||
|
!checkAccess(
|
||||||
|
loggedInUser,
|
||||||
|
updateUserPermission.list,
|
||||||
|
updateUserPermission.perm
|
||||||
|
)
|
||||||
|
}
|
||||||
onClick={updateUser}
|
onClick={updateUser}
|
||||||
className="w-full max-w-[200px]"
|
className="w-full max-w-[200px]"
|
||||||
>
|
>
|
||||||
|
|||||||
@@ -12,25 +12,68 @@ export const PERMISSIONS = {
|
|||||||
developer: ["developer"],
|
developer: ["developer"],
|
||||||
},
|
},
|
||||||
deleteUser: {
|
deleteUser: {
|
||||||
student: ["corporate", "developer", "admin", "mastercorporate"],
|
student: {
|
||||||
teacher: ["corporate", "developer", "admin", "mastercorporate"],
|
perm: "deleteStudent",
|
||||||
corporate: ["admin", "developer"],
|
list: ["corporate", "developer", "admin", "mastercorporate"],
|
||||||
mastercorporate: ["admin", "developer"],
|
},
|
||||||
|
teacher: {
|
||||||
|
perm: "deleteTeacher",
|
||||||
|
list: ["corporate", "developer", "admin", "mastercorporate"],
|
||||||
|
},
|
||||||
|
corporate: {
|
||||||
|
perm: "deleteCorporate",
|
||||||
|
list: ["admin", "developer"],
|
||||||
|
},
|
||||||
|
mastercorporate: {
|
||||||
|
perm: undefined,
|
||||||
|
list: ["admin", "developer"],
|
||||||
|
},
|
||||||
|
|
||||||
admin: ["developer", "admin"],
|
admin: {
|
||||||
agent: ["developer", "admin"],
|
perm: "deleteAdmin",
|
||||||
developer: ["developer"],
|
list: ["developer", "admin"],
|
||||||
|
},
|
||||||
|
agent: {
|
||||||
|
perm: "deleteCountryManager",
|
||||||
|
list: ["developer", "admin"],
|
||||||
|
},
|
||||||
|
developer: {
|
||||||
|
perm: undefined,
|
||||||
|
list: ["developer"],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
updateUser: {
|
updateUser: {
|
||||||
student: ["developer", "admin"],
|
student: {
|
||||||
teacher: ["developer", "admin"],
|
perm: "editStudent",
|
||||||
|
list: ["developer", "admin"],
|
||||||
|
},
|
||||||
|
teacher: {
|
||||||
|
perm: "editTeacher",
|
||||||
|
list: ["developer", "admin"],
|
||||||
|
},
|
||||||
|
|
||||||
corporate: ["admin", "developer"],
|
corporate: {
|
||||||
mastercorporate: ["admin", "developer"],
|
perm: "editCorporate",
|
||||||
|
list: ["admin", "developer"],
|
||||||
|
},
|
||||||
|
mastercorporate: {
|
||||||
|
perm: undefined,
|
||||||
|
list: ["admin", "developer"],
|
||||||
|
},
|
||||||
|
|
||||||
admin: ["developer", "admin"],
|
admin: {
|
||||||
agent: ["developer", "admin"],
|
perm: "editAdmin",
|
||||||
developer: ["developer"],
|
list: ["developer", "admin"],
|
||||||
|
},
|
||||||
|
|
||||||
|
agent: {
|
||||||
|
perm: "editCountryManager",
|
||||||
|
list: ["developer", "admin"],
|
||||||
|
},
|
||||||
|
developer: {
|
||||||
|
perm: undefined,
|
||||||
|
list: ["developer"],
|
||||||
|
},
|
||||||
},
|
},
|
||||||
updateExpiryDate: {
|
updateExpiryDate: {
|
||||||
student: ["developer", "admin"],
|
student: ["developer", "admin"],
|
||||||
|
|||||||
@@ -43,7 +43,8 @@ import { useListSearch } from "@/hooks/useListSearch";
|
|||||||
import { getUserCorporate } from "@/utils/groups";
|
import { getUserCorporate } from "@/utils/groups";
|
||||||
import { asyncSorter } from "@/utils";
|
import { asyncSorter } from "@/utils";
|
||||||
import { exportListToExcel, UserListRow } from "@/utils/users";
|
import { exportListToExcel, UserListRow } from "@/utils/users";
|
||||||
|
import { checkAccess } from "@/utils/permissions";
|
||||||
|
import { PermissionType } from "@/interfaces/permissions";
|
||||||
const columnHelper = createColumnHelper<User>();
|
const columnHelper = createColumnHelper<User>();
|
||||||
const searchFields = [
|
const searchFields = [
|
||||||
["name"],
|
["name"],
|
||||||
@@ -92,7 +93,7 @@ export default function UserList({
|
|||||||
|
|
||||||
const { users, reload } = useUsers();
|
const { users, reload } = useUsers();
|
||||||
const { groups } = useGroups(
|
const { groups } = useGroups(
|
||||||
user && (['corporate', 'teacher', 'mastercorporate'].includes(user?.type))
|
user && ["corporate", "teacher", "mastercorporate"].includes(user?.type)
|
||||||
? user.id
|
? user.id
|
||||||
: undefined
|
: undefined
|
||||||
);
|
);
|
||||||
@@ -231,9 +232,21 @@ export default function UserList({
|
|||||||
};
|
};
|
||||||
|
|
||||||
const actionColumn = ({ row }: { row: { original: User } }) => {
|
const actionColumn = ({ row }: { row: { original: User } }) => {
|
||||||
|
const updateUserPermission = PERMISSIONS.updateUser[row.original.type] as {
|
||||||
|
list: Type[];
|
||||||
|
perm: PermissionType;
|
||||||
|
};
|
||||||
|
const deleteUserPermission = PERMISSIONS.deleteUser[row.original.type] as {
|
||||||
|
list: Type[];
|
||||||
|
perm: PermissionType;
|
||||||
|
};
|
||||||
return (
|
return (
|
||||||
<div className="flex gap-4">
|
<div className="flex gap-4">
|
||||||
{PERMISSIONS.updateUser[row.original.type]?.includes(user.type) && (
|
{checkAccess(
|
||||||
|
user,
|
||||||
|
updateUserPermission.list,
|
||||||
|
updateUserPermission.perm
|
||||||
|
) && (
|
||||||
<Popover className="relative">
|
<Popover className="relative">
|
||||||
<Popover.Button>
|
<Popover.Button>
|
||||||
<div data-tip="Change Type" className="cursor-pointer tooltip">
|
<div data-tip="Change Type" className="cursor-pointer tooltip">
|
||||||
@@ -297,7 +310,11 @@ export default function UserList({
|
|||||||
</Popover>
|
</Popover>
|
||||||
)}
|
)}
|
||||||
{!row.original.isVerified &&
|
{!row.original.isVerified &&
|
||||||
PERMISSIONS.updateUser[row.original.type]?.includes(user.type) && (
|
checkAccess(
|
||||||
|
user,
|
||||||
|
updateUserPermission.list,
|
||||||
|
updateUserPermission.perm
|
||||||
|
) && (
|
||||||
<div
|
<div
|
||||||
data-tip="Verify User"
|
data-tip="Verify User"
|
||||||
className="cursor-pointer tooltip"
|
className="cursor-pointer tooltip"
|
||||||
@@ -306,7 +323,11 @@ export default function UserList({
|
|||||||
<BsCheck className="hover:text-mti-purple-light transition ease-in-out duration-300" />
|
<BsCheck className="hover:text-mti-purple-light transition ease-in-out duration-300" />
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{PERMISSIONS.updateUser[row.original.type]?.includes(user.type) && (
|
{checkAccess(
|
||||||
|
user,
|
||||||
|
updateUserPermission.list,
|
||||||
|
updateUserPermission.perm
|
||||||
|
) && (
|
||||||
<div
|
<div
|
||||||
data-tip={
|
data-tip={
|
||||||
row.original.status === "disabled"
|
row.original.status === "disabled"
|
||||||
@@ -323,7 +344,11 @@ export default function UserList({
|
|||||||
)}
|
)}
|
||||||
</div>
|
</div>
|
||||||
)}
|
)}
|
||||||
{PERMISSIONS.deleteUser[row.original.type]?.includes(user.type) && (
|
{checkAccess(
|
||||||
|
user,
|
||||||
|
deleteUserPermission.list,
|
||||||
|
deleteUserPermission.perm
|
||||||
|
) && (
|
||||||
<div
|
<div
|
||||||
data-tip="Delete"
|
data-tip="Delete"
|
||||||
className="cursor-pointer tooltip"
|
className="cursor-pointer tooltip"
|
||||||
|
|||||||
@@ -87,7 +87,7 @@ async function del(req: NextApiRequest, res: NextApiResponse) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const permission = PERMISSIONS.deleteUser[targetUser.type];
|
const permission = PERMISSIONS.deleteUser[targetUser.type];
|
||||||
if (!permission.includes(user.type)) {
|
if (!permission.list.includes(user.type)) {
|
||||||
res.status(403).json({ ok: false });
|
res.status(403).json({ ok: false });
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user