This commit is contained in:
Mateusz Gruszczyński
2026-04-06 14:37:42 +02:00
parent 237596bd52
commit 80e181ea3f
41 changed files with 14959 additions and 1023 deletions

View File

@@ -0,0 +1,10 @@
import { Router } from 'express';
import { createBudget, deleteBudget, listBudgets, updateBudget } from '../controllers/budget.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const budgetRouter = Router();
budgetRouter.use(requireAuth);
budgetRouter.get('/', listBudgets);
budgetRouter.post('/', createBudget);
budgetRouter.put('/:id', updateBudget);
budgetRouter.delete('/:id', deleteBudget);

View File

@@ -1,11 +1,14 @@
import { Router } from 'express';
import { addProof, createExpense, deleteExpense, listExpenses, updateExpense } from '../controllers/expense.controller.js';
import { addProof, createExpense, deleteExpense, listDuplicates, listExpenses, reviewDuplicate, updateExpense } from '../controllers/expense.controller.js';
import { requireAuth } from '../middleware/auth.js';
import { uploadSingleProof } from '../middleware/upload.js';
import { uploadProofFiles } from '../middleware/upload.js';
export const expenseRouter = Router();
expenseRouter.use(requireAuth);
expenseRouter.get('/', listExpenses);
expenseRouter.post('/', uploadSingleProof, createExpense);
expenseRouter.get('/duplicates', listDuplicates);
expenseRouter.post('/', uploadProofFiles, createExpense);
expenseRouter.put('/:id', updateExpense);
expenseRouter.post('/:id/duplicate-review', reviewDuplicate);
expenseRouter.delete('/:id', deleteExpense);
expenseRouter.post('/:id/proofs', uploadSingleProof, addProof);
expenseRouter.post('/:id/proofs', uploadProofFiles, addProof);

View File

@@ -1,9 +1,12 @@
import { Router } from 'express';
import { adminRouter } from './admin.routes.js';
import { authRouter } from './auth.routes.js';
import { budgetRouter } from './budget.routes.js';
import { categoryRouter } from './category.routes.js';
import { expenseRouter } from './expense.routes.js';
import { integrationRouter } from './integration.routes.js';
import { merchantRouter } from './merchant.routes.js';
import { recurringRouter } from './recurring.routes.js';
import { reportRouter } from './report.routes.js';
import { statisticsRouter } from './statistics.routes.js';
@@ -16,4 +19,7 @@ apiRouter.use('/expenses', expenseRouter);
apiRouter.use('/statistics', statisticsRouter);
apiRouter.use('/merchants', merchantRouter);
apiRouter.use('/reports', reportRouter);
apiRouter.use('/budgets', budgetRouter);
apiRouter.use('/recurring-expenses', recurringRouter);
apiRouter.use('/integrations', integrationRouter);
apiRouter.use('/admin', adminRouter);

View File

@@ -0,0 +1,25 @@
import { Router } from 'express';
import {
getShoppingListExpenses,
getShoppingListLatestExpenses,
getShoppingListSettings,
getShoppingListSummary,
getShoppingLists,
importShoppingListAsExpense,
importShoppingListItemAsExpense,
testShoppingListConnection,
updateShoppingListSettings
} from '../controllers/integration.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const integrationRouter = Router();
integrationRouter.use(requireAuth);
integrationRouter.get('/shopping-list', getShoppingListSettings);
integrationRouter.put('/shopping-list', updateShoppingListSettings);
integrationRouter.post('/shopping-list/test', testShoppingListConnection);
integrationRouter.get('/shopping-list/summary', getShoppingListSummary);
integrationRouter.get('/shopping-list/latest', getShoppingListLatestExpenses);
integrationRouter.get('/shopping-list/lists', getShoppingLists);
integrationRouter.get('/shopping-list/lists/:id/expenses', getShoppingListExpenses);
integrationRouter.post('/shopping-list/import-list', importShoppingListAsExpense);
integrationRouter.post('/shopping-list/import-item', importShoppingListItemAsExpense);

View File

@@ -0,0 +1,11 @@
import { Router } from 'express';
import { createRecurringExpense, deleteRecurringExpense, listRecurringExpenses, processRecurringNow, updateRecurringExpense } from '../controllers/recurring.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const recurringRouter = Router();
recurringRouter.use(requireAuth);
recurringRouter.get('/', listRecurringExpenses);
recurringRouter.post('/', createRecurringExpense);
recurringRouter.put('/:id', updateRecurringExpense);
recurringRouter.delete('/:id', deleteRecurringExpense);
recurringRouter.post('/run', processRecurringNow);

View File

@@ -1,10 +1,5 @@
import { Router } from 'express';
import {
getPreferences,
previewReport,
sendReport,
updatePreferences
} from '../controllers/report.controller.js';
import { exportReport, getPreferences, previewReport, sendReport, updatePreferences } from '../controllers/report.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const reportRouter = Router();
@@ -14,3 +9,4 @@ reportRouter.get('/preferences', getPreferences);
reportRouter.put('/preferences', updatePreferences);
reportRouter.post('/preview', previewReport);
reportRouter.post('/send', sendReport);
reportRouter.get('/export', exportReport);

View File

@@ -1,6 +1,8 @@
import { Router } from 'express';
import { getOverview } from '../controllers/statistics.controller.js';
import { getCashflow, getOverview } from '../controllers/statistics.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const statisticsRouter = Router();
statisticsRouter.use(requireAuth);
statisticsRouter.get('/overview', getOverview);
statisticsRouter.get('/cashflow', getCashflow);