Files
family_budget/frontend/src/services/expenseService.ts
Arrelin 5bcabb2736 revert 30b1c97043
revert Merge pull request 'try to do better' (#18) from refactor/frontend-code-quality into master

Reviewed-on: http://192.168.31.100:3847/Arrelin/family_budget/pulls/18
2026-01-29 12:38:21 +00:00

72 lines
2.2 KiB
TypeScript

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);
},
};