first
Deploy Iddaai Frontend / build-and-deploy (push) Successful in 4m0s

This commit is contained in:
2026-04-16 13:36:34 +03:00
parent de5e145c4e
commit fc7a1ba567
218 changed files with 32370 additions and 0 deletions
+128
View File
@@ -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,
};
+75
View File
@@ -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;
}
+128
View File
@@ -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() });
},
});
};