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,37 @@
import 'reflect-metadata';
import fs from 'node:fs';
import path from 'node:path';
import { DataSource } from 'typeorm';
import { env } from './env.js';
import { AppSetting } from '../entities/AppSetting.js';
import { Category } from '../entities/Category.js';
import { Expense } from '../entities/Expense.js';
import { Merchant } from '../entities/Merchant.js';
import { Proof } from '../entities/Proof.js';
import { User } from '../entities/User.js';
const entities = [User, Category, Expense, Proof, AppSetting, Merchant];
const baseOptions = { entities, synchronize: env.DB_SYNC, logging: env.DB_LOGGING };
if (env.DB_TYPE === 'sqlite') {
const file = path.resolve(env.DB_PATH);
fs.mkdirSync(path.dirname(file), { recursive: true });
}
export const AppDataSource =
env.DB_TYPE === 'postgres'
? new DataSource({
type: 'postgres',
host: env.DB_HOST,
port: env.DB_PORT,
username: env.DB_USER,
password: env.DB_PASSWORD,
database: env.DB_NAME,
...baseOptions
})
: new DataSource({
type: 'sqljs',
location: path.resolve(env.DB_PATH),
autoSave: true,
...baseOptions
});

33
api/src/config/env.ts Normal file
View File

@@ -0,0 +1,33 @@
import dotenv from 'dotenv';
dotenv.config();
type DbType = 'postgres' | 'sqlite';
const toNumber = (value: string | undefined, fallback: number) => {
const parsed = Number(value);
return Number.isFinite(parsed) ? parsed : fallback;
};
const toBoolean = (value: string | undefined, fallback: boolean) => {
if (value === undefined) return fallback;
return value === 'true' || value === '1';
};
export const env = {
NODE_ENV: process.env.NODE_ENV ?? 'development',
APP_PORT: toNumber(process.env.APP_PORT, 4000),
JWT_SECRET: process.env.JWT_SECRET ?? 'dev-secret-key',
JWT_EXPIRES_IN: process.env.JWT_EXPIRES_IN ?? '7d',
DB_TYPE: (process.env.DB_TYPE as DbType | undefined) ?? 'sqlite',
DB_HOST: process.env.DB_HOST ?? 'localhost',
DB_PORT: toNumber(process.env.DB_PORT, 5432),
DB_NAME: process.env.DB_NAME ?? 'expense_control',
DB_USER: process.env.DB_USER ?? 'expense_app',
DB_PASSWORD: process.env.DB_PASSWORD ?? 'expense_app',
DB_PATH: process.env.DB_PATH ?? './data/dev.sqlite',
DB_SYNC: toBoolean(process.env.DB_SYNC, true),
DB_LOGGING: toBoolean(process.env.DB_LOGGING, false),
APP_NAME: process.env.APP_NAME ?? 'Expense Control',
DEFAULT_CURRENCY: process.env.DEFAULT_CURRENCY ?? 'PLN',
ADMIN_EMAIL: process.env.ADMIN_EMAIL ?? 'admin@example.com',
ADMIN_PASSWORD: process.env.ADMIN_PASSWORD ?? 'Admin123!',
UPLOAD_DIR: process.env.UPLOAD_DIR ?? './uploads',
MAX_UPLOAD_SIZE_MB: toNumber(process.env.MAX_UPLOAD_SIZE_MB, 10),
API_CORS_ORIGIN: process.env.API_CORS_ORIGIN ?? 'http://localhost:4200'
};