try to do better
This commit is contained in:
71
frontend/src/services/expenseService.ts
Normal file
71
frontend/src/services/expenseService.ts
Normal file
@@ -0,0 +1,71 @@
|
||||
import { expenseApi } from '../api/client';
|
||||
import { Expense, CreateExpenseRequest } from '../types';
|
||||
import { handleApiError } from '../utils/errorHandler';
|
||||
|
||||
export const expenseService = {
|
||||
async getAllByCategory(familyId: number, categoryId: number): Promise<Expense[]> {
|
||||
try {
|
||||
const res = await expenseApi.getAllByCategory(familyId, categoryId);
|
||||
return res.data;
|
||||
} catch (error) {
|
||||
handleApiError(error);
|
||||
}
|
||||
},
|
||||
|
||||
async getById(familyId: number, categoryId: number, expenseId: number): Promise<Expense> {
|
||||
try {
|
||||
const res = await expenseApi.getById(familyId, categoryId, expenseId);
|
||||
return res.data;
|
||||
} catch (error) {
|
||||
handleApiError(error);
|
||||
}
|
||||
},
|
||||
|
||||
async create(familyId: number, categoryId: number, data: CreateExpenseRequest): Promise<Expense> {
|
||||
try {
|
||||
const res = await expenseApi.create(familyId, categoryId, data);
|
||||
return res.data;
|
||||
} catch (error) {
|
||||
handleApiError(error);
|
||||
}
|
||||
},
|
||||
|
||||
async update(familyId: number, categoryId: number, expenseId: number, data: Partial<CreateExpenseRequest>): Promise<Expense> {
|
||||
try {
|
||||
const res = await expenseApi.update(familyId, categoryId, expenseId, data);
|
||||
return res.data;
|
||||
} catch (error) {
|
||||
handleApiError(error);
|
||||
}
|
||||
},
|
||||
|
||||
async delete(familyId: number, categoryId: number, expenseId: number): Promise<void> {
|
||||
try {
|
||||
await expenseApi.delete(familyId, categoryId, expenseId);
|
||||
} catch (error) {
|
||||
handleApiError(error);
|
||||
}
|
||||
},
|
||||
|
||||
formatAmount(amount: number | string): string {
|
||||
const num = typeof amount === 'string' ? parseFloat(amount) : amount;
|
||||
return new Intl.NumberFormat('ru-RU', {
|
||||
style: 'currency',
|
||||
currency: 'RUB',
|
||||
minimumFractionDigits: 0,
|
||||
maximumFractionDigits: 0,
|
||||
}).format(num);
|
||||
},
|
||||
|
||||
sortByDate(expenses: Expense[], order: 'asc' | 'desc' = 'desc'): Expense[] {
|
||||
return [...expenses].sort((a, b) => {
|
||||
const dateA = new Date(a.created_at).getTime();
|
||||
const dateB = new Date(b.created_at).getTime();
|
||||
return order === 'desc' ? dateB - dateA : dateA - dateB;
|
||||
});
|
||||
},
|
||||
|
||||
getTotalAmount(expenses: Expense[]): number {
|
||||
return expenses.reduce((sum, expense) => sum + Number(expense.amount), 0);
|
||||
},
|
||||
};
|
||||
Reference in New Issue
Block a user