ac6c834525
- main.ts awaits DatabaseInitService.init() before app.listen(), ensuring
migrations + seed run before the HTTP server accepts traffic.
- AppModule now uses NestModule with consumer.apply() no longer needed for
CSRF (registered globally via app.use after body parsers in main.ts).
- JwtAuthGuard extended from AuthGuard('jwt') so protected endpoints
actually validate the bearer token.
- Admin controller now uses Zod-validated DTOs for body/path/query:
createUser, updateUserRole, userIdParam, listUsersQuery; with @Public
/ @Roles decorators and AdminGuard applied.
- Multer upload module + controller (POST /api/v1/uploads/category-icon
and /challenge-file) with safe-filename strategy, configured
UPLOAD_SIZE_LIMIT, admin-only via AdminGuard, served via /uploads
static handler.
- ThemeLoaderService now requires all 10 canonical theme ids at startup,
backfilling missing themes from built-ins with a warning; validates the
configured themeKey setting and falls back to 'classic' if invalid;
gracefully tolerates missing setting table during early boot.
- Test suite expanded to 76 tests / 17 suites; new specs:
admin-validation, uploads, theme-required, database-init.
50 lines
1.3 KiB
JSON
50 lines
1.3 KiB
JSON
{
|
|
"name": "backend",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"description": "HIPCTF NestJS backend",
|
|
"main": "dist/main.js",
|
|
"scripts": {
|
|
"build": "tsc -p tsconfig.build.json",
|
|
"start": "node dist/main.js",
|
|
"start:dev": "ts-node -r tsconfig-paths/register src/main.ts"
|
|
},
|
|
"dependencies": {
|
|
"@nestjs/common": "^10.3.10",
|
|
"@nestjs/config": "^3.2.3",
|
|
"@nestjs/core": "^10.3.10",
|
|
"@nestjs/jwt": "^10.2.0",
|
|
"@nestjs/passport": "^10.0.3",
|
|
"@nestjs/platform-express": "^10.3.10",
|
|
"@nestjs/swagger": "^7.4.0",
|
|
"@nestjs/typeorm": "^10.0.2",
|
|
"argon2": "^0.40.1",
|
|
"better-sqlite3": "^11.0.0",
|
|
"class-transformer": "^0.5.1",
|
|
"class-validator": "^0.14.1",
|
|
"cookie-parser": "^1.4.6",
|
|
"helmet": "^7.1.0",
|
|
"multer": "^2.0.2",
|
|
"passport": "^0.7.0",
|
|
"passport-jwt": "^4.0.1",
|
|
"reflect-metadata": "^0.2.2",
|
|
"rxjs": "^7.8.1",
|
|
"typeorm": "^0.3.20",
|
|
"uuid": "^9.0.1",
|
|
"zod": "^3.23.8"
|
|
},
|
|
"devDependencies": {
|
|
"@nestjs/testing": "^10.4.22",
|
|
"@types/better-sqlite3": "^7.6.10",
|
|
"@types/cookie-parser": "^1.4.7",
|
|
"@types/express": "^4.17.21",
|
|
"@types/multer": "^1.4.12",
|
|
"@types/passport-jwt": "^4.0.1",
|
|
"@types/supertest": "^6.0.2",
|
|
"@types/uuid": "^9.0.8",
|
|
"supertest": "^7.0.0",
|
|
"ts-node": "^10.9.2",
|
|
"tsconfig-paths": "^4.2.0"
|
|
}
|
|
}
|