This commit is contained in:
@@ -0,0 +1,128 @@
|
||||
import { apiRequest } from "@/lib/api/api-service";
|
||||
import { ApiResponse, PaginatedData } from "@/types/api-response";
|
||||
import type {
|
||||
AdminPaginationParams,
|
||||
AdminUserDto,
|
||||
AnalyticsOverviewDto,
|
||||
SettingDto,
|
||||
UpdateSettingDto,
|
||||
UpdateUserRoleDto,
|
||||
UpdateUserSubscriptionDto,
|
||||
UsageLimitDto,
|
||||
} from "./types";
|
||||
|
||||
/**
|
||||
* Admin Service
|
||||
* Backend: /api/admin/*
|
||||
*/
|
||||
|
||||
// Analytics
|
||||
const getAnalyticsOverview = () => {
|
||||
return apiRequest<ApiResponse<AnalyticsOverviewDto>>({
|
||||
url: "/admin/analytics/overview",
|
||||
client: "admin",
|
||||
method: "get",
|
||||
});
|
||||
};
|
||||
|
||||
// Settings
|
||||
const getAllSettings = () => {
|
||||
return apiRequest<ApiResponse<Record<string, string>>>({
|
||||
url: "/admin/settings",
|
||||
client: "admin",
|
||||
method: "get",
|
||||
});
|
||||
};
|
||||
|
||||
const updateSetting = (key: string, dto: UpdateSettingDto) => {
|
||||
return apiRequest<ApiResponse<SettingDto>>({
|
||||
url: `/admin/settings/${key}`,
|
||||
client: "admin",
|
||||
method: "put",
|
||||
data: dto,
|
||||
});
|
||||
};
|
||||
|
||||
// Usage Limits
|
||||
const getAllUsageLimits = (params?: AdminPaginationParams) => {
|
||||
return apiRequest<ApiResponse<PaginatedData<UsageLimitDto>>>({
|
||||
url: "/admin/usage-limits",
|
||||
client: "admin",
|
||||
method: "get",
|
||||
params,
|
||||
});
|
||||
};
|
||||
|
||||
const resetAllUsageLimits = () => {
|
||||
return apiRequest<ApiResponse<{ count: number }>>({
|
||||
url: "/admin/usage-limits/reset-all",
|
||||
client: "admin",
|
||||
method: "post",
|
||||
});
|
||||
};
|
||||
|
||||
// Users
|
||||
const getAllUsers = (params?: AdminPaginationParams) => {
|
||||
return apiRequest<ApiResponse<PaginatedData<AdminUserDto>>>({
|
||||
url: "/admin/users",
|
||||
client: "admin",
|
||||
method: "get",
|
||||
params,
|
||||
});
|
||||
};
|
||||
|
||||
const getUserById = (id: string) => {
|
||||
return apiRequest<ApiResponse<AdminUserDto>>({
|
||||
url: `/admin/users/${id}`,
|
||||
client: "admin",
|
||||
method: "get",
|
||||
});
|
||||
};
|
||||
|
||||
const deleteUser = (id: string) => {
|
||||
return apiRequest<ApiResponse<null>>({
|
||||
url: `/admin/users/${id}`,
|
||||
client: "admin",
|
||||
method: "delete",
|
||||
});
|
||||
};
|
||||
|
||||
const updateUserRole = (id: string, dto: UpdateUserRoleDto) => {
|
||||
return apiRequest<ApiResponse<AdminUserDto>>({
|
||||
url: `/admin/users/${id}/role`,
|
||||
client: "admin",
|
||||
method: "put",
|
||||
data: dto,
|
||||
});
|
||||
};
|
||||
|
||||
const updateUserSubscription = (id: string, dto: UpdateUserSubscriptionDto) => {
|
||||
return apiRequest<ApiResponse<AdminUserDto>>({
|
||||
url: `/admin/users/${id}/subscription`,
|
||||
client: "admin",
|
||||
method: "put",
|
||||
data: dto,
|
||||
});
|
||||
};
|
||||
|
||||
const toggleUserActive = (id: string) => {
|
||||
return apiRequest<ApiResponse<AdminUserDto>>({
|
||||
url: `/admin/users/${id}/toggle-active`,
|
||||
client: "admin",
|
||||
method: "put",
|
||||
});
|
||||
};
|
||||
|
||||
export const adminService = {
|
||||
getAnalyticsOverview,
|
||||
getAllSettings,
|
||||
updateSetting,
|
||||
getAllUsageLimits,
|
||||
resetAllUsageLimits,
|
||||
getAllUsers,
|
||||
getUserById,
|
||||
deleteUser,
|
||||
updateUserRole,
|
||||
updateUserSubscription,
|
||||
toggleUserActive,
|
||||
};
|
||||
@@ -0,0 +1,75 @@
|
||||
import type { PaginationDto } from "@/types/api-response";
|
||||
|
||||
// ========================
|
||||
// Shared Query Params
|
||||
// ========================
|
||||
|
||||
export interface AdminPaginationParams extends PaginationDto {
|
||||
sortBy?: string;
|
||||
sortOrder?: "asc" | "desc";
|
||||
search?: string;
|
||||
}
|
||||
|
||||
// ========================
|
||||
// Settings
|
||||
// ========================
|
||||
|
||||
export interface SettingDto {
|
||||
key: string;
|
||||
value: string;
|
||||
}
|
||||
|
||||
export interface UpdateSettingDto {
|
||||
value: string;
|
||||
}
|
||||
|
||||
// ========================
|
||||
// Usage Limits
|
||||
// ========================
|
||||
|
||||
export interface UsageLimitDto {
|
||||
id: string;
|
||||
userId: string;
|
||||
feature: string;
|
||||
used: number;
|
||||
limit: number;
|
||||
resetAt?: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
// ========================
|
||||
// Admin Users
|
||||
// ========================
|
||||
|
||||
export interface AdminUserDto {
|
||||
id: string;
|
||||
email: string;
|
||||
firstName?: string;
|
||||
lastName?: string;
|
||||
role?: string;
|
||||
isActive: boolean;
|
||||
subscription?: string;
|
||||
createdAt: string;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
|
||||
export interface UpdateUserRoleDto {
|
||||
role: string;
|
||||
}
|
||||
|
||||
export interface UpdateUserSubscriptionDto {
|
||||
subscription: string;
|
||||
}
|
||||
|
||||
// ========================
|
||||
// Analytics
|
||||
// ========================
|
||||
|
||||
export interface AnalyticsOverviewDto {
|
||||
totalUsers: number;
|
||||
activeUsers: number;
|
||||
totalPredictions: number;
|
||||
totalCoupons: number;
|
||||
aiHealth?: Record<string, unknown>;
|
||||
[key: string]: unknown;
|
||||
}
|
||||
@@ -0,0 +1,128 @@
|
||||
import { useQuery, useMutation, useQueryClient } from "@tanstack/react-query";
|
||||
import { adminService } from "./service";
|
||||
import type {
|
||||
AdminPaginationParams,
|
||||
UpdateSettingDto,
|
||||
UpdateUserRoleDto,
|
||||
UpdateUserSubscriptionDto,
|
||||
} from "./types";
|
||||
|
||||
export const AdminQueryKeys = {
|
||||
all: ["admin"] as const,
|
||||
analytics: () => [...AdminQueryKeys.all, "analytics"] as const,
|
||||
settings: () => [...AdminQueryKeys.all, "settings"] as const,
|
||||
usageLimits: (params?: AdminPaginationParams) =>
|
||||
[...AdminQueryKeys.all, "usageLimits", params] as const,
|
||||
users: (params?: AdminPaginationParams) =>
|
||||
[...AdminQueryKeys.all, "users", params] as const,
|
||||
user: (id: string) => [...AdminQueryKeys.all, "user", id] as const,
|
||||
};
|
||||
|
||||
// Analytics
|
||||
export const useAdminAnalytics = () => {
|
||||
return useQuery({
|
||||
queryKey: AdminQueryKeys.analytics(),
|
||||
queryFn: () => adminService.getAnalyticsOverview(),
|
||||
});
|
||||
};
|
||||
|
||||
// Settings
|
||||
export const useAdminSettings = () => {
|
||||
return useQuery({
|
||||
queryKey: AdminQueryKeys.settings(),
|
||||
queryFn: () => adminService.getAllSettings(),
|
||||
});
|
||||
};
|
||||
|
||||
export const useUpdateSetting = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: ({ key, dto }: { key: string; dto: UpdateSettingDto }) =>
|
||||
adminService.updateSetting(key, dto),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: AdminQueryKeys.settings() });
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// Usage Limits
|
||||
export const useAdminUsageLimits = (params?: AdminPaginationParams) => {
|
||||
return useQuery({
|
||||
queryKey: AdminQueryKeys.usageLimits(params),
|
||||
queryFn: () => adminService.getAllUsageLimits(params),
|
||||
});
|
||||
};
|
||||
|
||||
export const useResetAllUsageLimits = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: () => adminService.resetAllUsageLimits(),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: AdminQueryKeys.usageLimits() });
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
// Users
|
||||
export const useAdminUsers = (params?: AdminPaginationParams) => {
|
||||
return useQuery({
|
||||
queryKey: AdminQueryKeys.users(params),
|
||||
queryFn: () => adminService.getAllUsers(params),
|
||||
});
|
||||
};
|
||||
|
||||
export const useAdminUserById = (id: string) => {
|
||||
return useQuery({
|
||||
queryKey: AdminQueryKeys.user(id),
|
||||
queryFn: () => adminService.getUserById(id),
|
||||
enabled: !!id,
|
||||
});
|
||||
};
|
||||
|
||||
export const useDeleteUser = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: (id: string) => adminService.deleteUser(id),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: AdminQueryKeys.users() });
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export const useUpdateUserRole = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: ({ id, dto }: { id: string; dto: UpdateUserRoleDto }) =>
|
||||
adminService.updateUserRole(id, dto),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: AdminQueryKeys.users() });
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export const useUpdateUserSubscription = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: ({ id, dto }: { id: string; dto: UpdateUserSubscriptionDto }) =>
|
||||
adminService.updateUserSubscription(id, dto),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: AdminQueryKeys.users() });
|
||||
},
|
||||
});
|
||||
};
|
||||
|
||||
export const useToggleUserActive = () => {
|
||||
const queryClient = useQueryClient();
|
||||
|
||||
return useMutation({
|
||||
mutationFn: (id: string) => adminService.toggleUserActive(id),
|
||||
onSuccess: () => {
|
||||
queryClient.invalidateQueries({ queryKey: AdminQueryKeys.users() });
|
||||
},
|
||||
});
|
||||
};
|
||||
Reference in New Issue
Block a user