first commit

This commit is contained in:
Mateusz Gruszczyński
2026-04-05 13:40:27 +02:00
commit 9a6e77a5fc
89 changed files with 18276 additions and 0 deletions

View File

@@ -0,0 +1,18 @@
import { Router } from 'express';
import {
getSettings,
listUsers,
testSmtp,
updateSettings,
updateUser
} from '../controllers/admin.controller.js';
import { requireAdmin, requireAuth } from '../middleware/auth.js';
export const adminRouter = Router();
adminRouter.use(requireAuth, requireAdmin);
adminRouter.get('/settings', getSettings);
adminRouter.put('/settings', updateSettings);
adminRouter.get('/users', listUsers);
adminRouter.patch('/users/:id', updateUser);
adminRouter.post('/test-smtp', testSmtp);

View File

@@ -0,0 +1,8 @@
import { Router } from 'express';
import { login, me, publicConfig, register } from '../controllers/auth.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const authRouter = Router();
authRouter.post('/register', register);
authRouter.post('/login', login);
authRouter.get('/config', publicConfig);
authRouter.get('/me', requireAuth, me);

View File

@@ -0,0 +1,9 @@
import { Router } from 'express';
import { createCategory, deleteCategory, listCategories, updateCategory } from '../controllers/category.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const categoryRouter = Router();
categoryRouter.use(requireAuth);
categoryRouter.get('/', listCategories);
categoryRouter.post('/', createCategory);
categoryRouter.put('/:id', updateCategory);
categoryRouter.delete('/:id', deleteCategory);

View File

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

19
api/src/routes/index.ts Normal file
View File

@@ -0,0 +1,19 @@
import { Router } from 'express';
import { adminRouter } from './admin.routes.js';
import { authRouter } from './auth.routes.js';
import { categoryRouter } from './category.routes.js';
import { expenseRouter } from './expense.routes.js';
import { merchantRouter } from './merchant.routes.js';
import { reportRouter } from './report.routes.js';
import { statisticsRouter } from './statistics.routes.js';
export const apiRouter = Router();
apiRouter.get('/health', (_req, res) => res.json({ status: 'ok' }));
apiRouter.use('/auth', authRouter);
apiRouter.use('/categories', categoryRouter);
apiRouter.use('/expenses', expenseRouter);
apiRouter.use('/statistics', statisticsRouter);
apiRouter.use('/merchants', merchantRouter);
apiRouter.use('/reports', reportRouter);
apiRouter.use('/admin', adminRouter);

View File

@@ -0,0 +1,16 @@
import { Router } from 'express';
import {
createMerchant,
deleteMerchant,
listMerchants,
updateMerchant
} from '../controllers/merchant.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const merchantRouter = Router();
merchantRouter.use(requireAuth);
merchantRouter.get('/', listMerchants);
merchantRouter.post('/', createMerchant);
merchantRouter.put('/:id', updateMerchant);
merchantRouter.delete('/:id', deleteMerchant);

View File

@@ -0,0 +1,16 @@
import { Router } from 'express';
import {
getPreferences,
previewReport,
sendReport,
updatePreferences
} from '../controllers/report.controller.js';
import { requireAuth } from '../middleware/auth.js';
export const reportRouter = Router();
reportRouter.use(requireAuth);
reportRouter.get('/preferences', getPreferences);
reportRouter.put('/preferences', updatePreferences);
reportRouter.post('/preview', previewReport);
reportRouter.post('/send', sendReport);

View File

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