main
UI Deploy (Next-Auth Support) 🎨 / build-and-deploy (push) Has been cancelled

This commit is contained in:
Harun CAN
2026-03-30 15:18:32 +03:00
parent 8bd995ea18
commit 0722faeee9
12 changed files with 12796 additions and 13 deletions
+123
View File
@@ -366,3 +366,126 @@ export const notificationsApi = {
apiClient.delete(`/notifications/${id}`).then((r) => r.data),
};
// ── Admin API Types ────────────────────────────────────────────────────────
export interface AdminUser {
id: string;
email: string;
firstName?: string;
lastName?: string;
isActive: boolean;
createdAt: string;
roles?: Array<{ role: { id: string; name: string } }>;
}
export interface AdminProject {
id: string;
title: string;
status: string;
progress: number;
creditsUsed: number;
language: string;
sourceType: string;
createdAt: string;
user: { id: string; email: string; firstName?: string; lastName?: string };
_count: { scenes: number; renderJobs: number };
}
export interface AdminRenderJob {
id: string;
status: string;
currentStage?: string;
attemptNumber: number;
processingTimeMs?: number;
errorMessage?: string;
workerHostname?: string;
createdAt: string;
startedAt?: string;
completedAt?: string;
project: {
id: string;
title: string;
user: { id: string; email: string; firstName?: string; lastName?: string };
};
}
export interface AdminPlan {
id: string;
name: string;
displayName: string;
description?: string;
monthlyPrice: number;
yearlyPrice?: number;
currency: string;
monthlyCredits: number;
maxDuration: number;
maxResolution: string;
maxProjects: number;
isActive: boolean;
sortOrder: number;
features?: Record<string, unknown>;
_count: { subscriptions: number };
}
export interface AdminStats {
users: { total: number; active: number; inactive: number };
projects: { total: number; byStatus: Record<string, number> };
renderJobs: { byStatus: Record<string, number>; active: number };
credits: { totalGranted: number; totalUsed: number };
plans: { total: number };
templates: { total: number };
storage?: unknown;
recentUsers: AdminUser[];
}
// ── Admin API Functions ─────────────────────────────────────────────────────
export const adminApi = {
getStats: () =>
apiClient.get<AdminStats>('/admin/stats').then((r) => r.data),
getUsers: (params?: { page?: number; limit?: number }) =>
apiClient.get<PaginatedResponse<AdminUser>>('/admin/users', { params }).then((r) => r.data),
getUserDetail: (id: string) =>
apiClient.get(`/admin/users/${id}/detail`).then((r) => r.data),
toggleUserActive: (id: string) =>
apiClient.put(`/admin/users/${id}/toggle-active`).then((r) => r.data),
banUser: (id: string) =>
apiClient.put(`/admin/users/${id}/ban`).then((r) => r.data),
activateUser: (id: string) =>
apiClient.put(`/admin/users/${id}/activate`).then((r) => r.data),
grantCredits: (userId: string, data: { amount: number; description: string }) =>
apiClient.post(`/admin/users/${userId}/credits`, data).then((r) => r.data),
assignRole: (userId: string, roleId: string) =>
apiClient.post(`/admin/users/${userId}/roles/${roleId}`).then((r) => r.data),
removeRole: (userId: string, roleId: string) =>
apiClient.delete(`/admin/users/${userId}/roles/${roleId}`).then((r) => r.data),
getProjects: (params?: { page?: number; limit?: number; status?: string; userId?: string }) =>
apiClient.get<PaginatedResponse<AdminProject>>('/admin/projects', { params }).then((r) => r.data),
deleteProject: (id: string) =>
apiClient.delete(`/admin/projects/${id}`).then((r) => r.data),
getRenderJobs: (params?: { page?: number; limit?: number; status?: string }) =>
apiClient.get<PaginatedResponse<AdminRenderJob>>('/admin/render-jobs', { params }).then((r) => r.data),
getPlans: () =>
apiClient.get<AdminPlan[]>('/admin/plans').then((r) => r.data),
updatePlan: (id: string, data: Partial<AdminPlan>) =>
apiClient.put(`/admin/plans/${id}`, data).then((r) => r.data),
getRoles: () =>
apiClient.get('/admin/roles').then((r) => r.data),
createRole: (data: { name: string; description?: string }) =>
apiClient.post('/admin/roles', data).then((r) => r.data),
};