zmiany cd

This commit is contained in:
Mateusz Gruszczyński
2026-04-06 15:38:16 +02:00
parent 80e181ea3f
commit a8e497fec3
17 changed files with 555 additions and 11315 deletions

View File

@@ -1,8 +1,16 @@
import type { Response } from 'express';
import { createRequire } from 'node:module';
import path from 'node:path';
import process from 'node:process';
import { z } from 'zod';
import { AppDataSource } from '../config/data-source.js';
import { env } from '../config/env.js';
import { AppSetting } from '../entities/AppSetting.js';
import { Budget } from '../entities/Budget.js';
import { Category } from '../entities/Category.js';
import { Expense } from '../entities/Expense.js';
import { Merchant } from '../entities/Merchant.js';
import { RecurringExpense } from '../entities/RecurringExpense.js';
import { User } from '../entities/User.js';
import { sanitizeUser } from '../services/auth.service.js';
import type { AuthenticatedRequest } from '../types/express.js';
@@ -30,8 +38,17 @@ const userUpdateSchema = z.object({
});
const require = createRequire(import.meta.url);
const rootPackage = require(path.resolve(process.cwd(), '..', 'package.json')) as { version?: string };
const apiPackage = require(path.resolve(process.cwd(), 'package.json')) as { version?: string };
const webPackage = require(path.resolve(process.cwd(), '..', 'web', 'package.json')) as { version?: string };
const settingsRepo = () => AppDataSource.getRepository(AppSetting);
const userRepo = () => AppDataSource.getRepository(User);
const expenseRepo = () => AppDataSource.getRepository(Expense);
const categoryRepo = () => AppDataSource.getRepository(Category);
const merchantRepo = () => AppDataSource.getRepository(Merchant);
const budgetRepo = () => AppDataSource.getRepository(Budget);
const recurringRepo = () => AppDataSource.getRepository(RecurringExpense);
const sanitizeSettings = (item: AppSetting) => ({
id: item.id,
@@ -145,3 +162,39 @@ export const testSmtp = async (req: AuthenticatedRequest, res: Response) => {
return res.json({ message: 'SMTP test message was sent' });
};
export const getSystemInfo = async (_req: AuthenticatedRequest, res: Response) => {
const settings = await getSettingsEntity();
const [users, expenses, categories, merchants, budgets, recurring, usersWithIntegrations] = await Promise.all([
userRepo().count(),
expenseRepo().count(),
categoryRepo().count(),
merchantRepo().count(),
budgetRepo().count(),
recurringRepo().count(),
userRepo().find({ select: { id: true, shoppingListIntegration: true } })
]);
const shoppingIntegrations = usersWithIntegrations.filter((user) => Boolean(user.shoppingListIntegration?.enabled)).length;
return res.json({
item: {
appName: settings?.appName ?? 'Expense Control',
suiteVersion: rootPackage.version ?? '0.0.0',
apiVersion: apiPackage.version ?? '0.0.0',
webVersion: webPackage.version ?? '0.0.0',
nodeVersion: process.version,
environment: process.env.NODE_ENV ?? 'development',
database: env.DB_TYPE,
uploadDir: env.UPLOAD_DIR,
registrationEnabled: settings?.registrationEnabled ?? true,
smtpConfigured: Boolean(settings?.smtpEnabled && settings?.smtpHost && settings?.smtpFromEmail),
counters: { users, expenses, categories, merchants, budgets, recurring, shoppingIntegrations },
sources: {
appRepository: 'https://git.linuxiarz.pl/gru/expense-control',
shoppingListRepository: 'https://git.linuxiarz.pl/gru/lista_zakupowa_live',
apiBasePath: '/api'
},
checkedAt: new Date().toISOString()
}
});
};

View File

@@ -1,6 +1,7 @@
import { Router } from 'express';
import {
getSettings,
getSystemInfo,
listUsers,
testSmtp,
updateSettings,
@@ -16,3 +17,4 @@ adminRouter.put('/settings', updateSettings);
adminRouter.get('/users', listUsers);
adminRouter.patch('/users/:id', updateUser);
adminRouter.post('/test-smtp', testSmtp);
adminRouter.get('/system-info', getSystemInfo);