150 lines
3.6 KiB
TypeScript
150 lines
3.6 KiB
TypeScript
|
|
import { useMutation, useQuery, useQueryClient } from "@tanstack/react-query";
|
||
|
|
import * as roleService from "@/services/role.service";
|
||
|
|
import type { TCreateRoleRequestBody } from "@/types/role";
|
||
|
|
|
||
|
|
export const ROLE_QUERY_KEYS = {
|
||
|
|
all: ["roles"] as const,
|
||
|
|
list: () => [...ROLE_QUERY_KEYS.all, "list"] as const,
|
||
|
|
detail: (id: number) => [...ROLE_QUERY_KEYS.all, "detail", id] as const,
|
||
|
|
permissions: (id: number) => [...ROLE_QUERY_KEYS.all, "permissions", id] as const,
|
||
|
|
};
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để lấy danh sách roles
|
||
|
|
*/
|
||
|
|
export function useGetRoleList(enabled = true) {
|
||
|
|
return useQuery({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.list(),
|
||
|
|
queryFn: () => roleService.getRoleList(),
|
||
|
|
enabled,
|
||
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để lấy chi tiết role theo ID
|
||
|
|
*/
|
||
|
|
export function useGetRoleById(id: number, enabled = true) {
|
||
|
|
return useQuery({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.detail(id),
|
||
|
|
queryFn: () => roleService.getRoleById(id),
|
||
|
|
enabled: enabled && id > 0,
|
||
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để lấy danh sách permissions của role
|
||
|
|
*/
|
||
|
|
export function useGetRolePermissions(id: number, enabled = true) {
|
||
|
|
return useQuery({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.permissions(id),
|
||
|
|
queryFn: () => roleService.getRolePermissions(id),
|
||
|
|
enabled: enabled && id > 0,
|
||
|
|
staleTime: 5 * 60 * 1000, // 5 minutes
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để tạo role mới
|
||
|
|
*/
|
||
|
|
export function useCreateRole() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
return useMutation({
|
||
|
|
mutationFn: (data: TCreateRoleRequestBody) => roleService.createRole(data),
|
||
|
|
onSuccess: () => {
|
||
|
|
queryClient.invalidateQueries({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.list(),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để cập nhật role
|
||
|
|
*/
|
||
|
|
export function useUpdateRole() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
return useMutation({
|
||
|
|
mutationFn: ({
|
||
|
|
id,
|
||
|
|
data,
|
||
|
|
}: {
|
||
|
|
id: number;
|
||
|
|
data: Partial<TCreateRoleRequestBody>;
|
||
|
|
}) => roleService.updateRole(id, data),
|
||
|
|
onSuccess: (_, variables) => {
|
||
|
|
queryClient.invalidateQueries({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.list(),
|
||
|
|
});
|
||
|
|
queryClient.invalidateQueries({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.detail(variables.id),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để xóa role
|
||
|
|
*/
|
||
|
|
export function useDeleteRole() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
return useMutation({
|
||
|
|
mutationFn: (id: number) => roleService.deleteRole(id),
|
||
|
|
onSuccess: () => {
|
||
|
|
queryClient.invalidateQueries({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.list(),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để gán permissions cho role
|
||
|
|
*/
|
||
|
|
export function useAssignRolePermissions() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
return useMutation({
|
||
|
|
mutationFn: ({
|
||
|
|
roleId,
|
||
|
|
permissionIds,
|
||
|
|
}: {
|
||
|
|
roleId: number;
|
||
|
|
permissionIds: number[];
|
||
|
|
}) => roleService.assignRolePermissions(roleId, permissionIds),
|
||
|
|
onSuccess: (_, variables) => {
|
||
|
|
queryClient.invalidateQueries({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.permissions(variables.roleId),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Hook để bật/tắt một permission của role
|
||
|
|
*/
|
||
|
|
export function useToggleRolePermission() {
|
||
|
|
const queryClient = useQueryClient();
|
||
|
|
|
||
|
|
return useMutation({
|
||
|
|
mutationFn: ({
|
||
|
|
roleId,
|
||
|
|
permissionId,
|
||
|
|
isChecked,
|
||
|
|
}: {
|
||
|
|
roleId: number;
|
||
|
|
permissionId: number;
|
||
|
|
isChecked: boolean;
|
||
|
|
}) => roleService.toggleRolePermission(roleId, permissionId, isChecked),
|
||
|
|
onSuccess: (_, variables) => {
|
||
|
|
queryClient.invalidateQueries({
|
||
|
|
queryKey: ROLE_QUERY_KEYS.permissions(variables.roleId),
|
||
|
|
});
|
||
|
|
},
|
||
|
|
});
|
||
|
|
}
|