195 lines
5.2 KiB
TypeScript
195 lines
5.2 KiB
TypeScript
import api from './api';
|
||
import { Order } from './orders';
|
||
import { Product } from './catalog';
|
||
|
||
/**
|
||
* Интерфейс статистики для дашборда
|
||
*/
|
||
export interface DashboardStats {
|
||
ordersCount: number;
|
||
totalSales: number;
|
||
customersCount: number;
|
||
productsCount: number;
|
||
[key: string]: any;
|
||
}
|
||
|
||
/**
|
||
* Интерфейс админ-заказа, содержащий дополнительные поля
|
||
*/
|
||
export interface AdminOrder {
|
||
id: number;
|
||
user_id: number;
|
||
user_name?: string;
|
||
created_at: string;
|
||
updated_at?: string;
|
||
status: 'pending' | 'paid' | 'processing' | 'shipped' | 'delivered' | 'cancelled';
|
||
total?: number;
|
||
[key: string]: any;
|
||
}
|
||
|
||
/**
|
||
* Интерфейс админ-товара с дополнительными полями для админки
|
||
*/
|
||
export interface AdminProduct {
|
||
id: number;
|
||
name: string;
|
||
price: number;
|
||
description?: string;
|
||
category?: {
|
||
id: number;
|
||
name: string;
|
||
};
|
||
sales?: number;
|
||
stock?: number;
|
||
[key: string]: any;
|
||
}
|
||
|
||
/**
|
||
* Интерфейс ответа API
|
||
*/
|
||
interface ApiResponse<T> {
|
||
data: T;
|
||
status: number;
|
||
}
|
||
|
||
/**
|
||
* Получение статистики для дашборда
|
||
*/
|
||
export async function fetchDashboardStats(): Promise<ApiResponse<DashboardStats>> {
|
||
try {
|
||
const response = await api.get<DashboardStats>('/admin/dashboard/stats');
|
||
return {
|
||
data: response.data,
|
||
status: response.status
|
||
};
|
||
} catch (error) {
|
||
console.error('Ошибка при получении статистики дашборда:', error);
|
||
|
||
// Возвращаем моковые данные для тестирования
|
||
return {
|
||
data: {
|
||
ordersCount: 1248,
|
||
totalSales: 2456789,
|
||
customersCount: 3456,
|
||
productsCount: 867
|
||
},
|
||
status: 200
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Интерфейс параметров для получения заказов
|
||
*/
|
||
export interface OrdersParams {
|
||
limit?: number;
|
||
offset?: number;
|
||
status?: string;
|
||
sortBy?: string;
|
||
sortDir?: 'asc' | 'desc';
|
||
}
|
||
|
||
/**
|
||
* Получение последних заказов
|
||
*/
|
||
export async function fetchRecentOrders(params?: OrdersParams): Promise<ApiResponse<AdminOrder[]>> {
|
||
try {
|
||
const response = await api.get<AdminOrder[]>('/admin/orders/recent', {
|
||
params: {
|
||
limit: params?.limit || 5,
|
||
offset: params?.offset || 0,
|
||
status: params?.status,
|
||
sort_by: params?.sortBy,
|
||
sort_dir: params?.sortDir
|
||
}
|
||
});
|
||
return {
|
||
data: response.data,
|
||
status: response.status
|
||
};
|
||
} catch (error) {
|
||
console.error('Ошибка при получении последних заказов:', error);
|
||
|
||
// Возвращаем моковые данные для тестирования
|
||
return {
|
||
data: [
|
||
{ id: 1, user_id: 101, user_name: 'Иван Иванов', created_at: '2023-03-15T14:30:00Z', status: 'delivered', total: 12500 },
|
||
{ id: 2, user_id: 102, user_name: 'Анна Петрова', created_at: '2023-03-14T10:15:00Z', status: 'shipped', total: 8750 },
|
||
{ id: 3, user_id: 103, user_name: 'Сергей Сидоров', created_at: '2023-03-13T18:45:00Z', status: 'processing', total: 15200 },
|
||
{ id: 4, user_id: 104, user_name: 'Елена Смирнова', created_at: '2023-03-12T09:20:00Z', status: 'paid', total: 6300 }
|
||
],
|
||
status: 200
|
||
};
|
||
}
|
||
}
|
||
|
||
/**
|
||
* Интерфейс параметров для получения популярных товаров
|
||
*/
|
||
export interface ProductsParams {
|
||
limit?: number;
|
||
offset?: number;
|
||
sortBy?: string;
|
||
sortDir?: 'asc' | 'desc';
|
||
}
|
||
|
||
/**
|
||
* Получение популярных товаров
|
||
*/
|
||
export async function fetchPopularProducts(params?: ProductsParams): Promise<ApiResponse<AdminProduct[]>> {
|
||
try {
|
||
const response = await api.get<AdminProduct[]>('/admin/products/popular', {
|
||
params: {
|
||
limit: params?.limit || 5,
|
||
offset: params?.offset || 0,
|
||
sort_by: params?.sortBy,
|
||
sort_dir: params?.sortDir
|
||
}
|
||
});
|
||
return {
|
||
data: response.data,
|
||
status: response.status
|
||
};
|
||
} catch (error) {
|
||
console.error('Ошибка при получении популярных товаров:', error);
|
||
|
||
// Возвращаем моковые данные для тестирования
|
||
return {
|
||
data: [
|
||
{
|
||
id: 1,
|
||
name: 'Платье классическое',
|
||
price: 7999,
|
||
category: { id: 1, name: 'Платья' },
|
||
sales: 124,
|
||
stock: 23
|
||
},
|
||
{
|
||
id: 2,
|
||
name: 'Блуза белая',
|
||
price: 4999,
|
||
category: { id: 2, name: 'Блузы' },
|
||
sales: 98,
|
||
stock: 15
|
||
},
|
||
{
|
||
id: 3,
|
||
name: 'Брюки прямые',
|
||
price: 5999,
|
||
category: { id: 3, name: 'Брюки' },
|
||
sales: 87,
|
||
stock: 8
|
||
},
|
||
{
|
||
id: 4,
|
||
name: 'Юбка миди',
|
||
price: 4599,
|
||
category: { id: 4, name: 'Юбки' },
|
||
sales: 76,
|
||
stock: 12
|
||
}
|
||
],
|
||
status: 200
|
||
};
|
||
}
|
||
}
|