try to do better

This commit is contained in:
arrelin
2026-01-29 15:17:54 +03:00
parent f00ddc7d10
commit 24f04a7e82
60 changed files with 5335 additions and 1254 deletions

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