diff --git a/.gitignore b/.gitignore deleted file mode 100644 index 66c01b75..00000000 --- a/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -#ignore each file in folder that starts with Archive_ -Archive_* -#ignore each folder that starts with Archive_ -Archive_*/** -#ignore node_modules folder -**/node_modules/** - -#ignore dist folder -**/dist/** \ No newline at end of file diff --git a/Documentations/BUILD.md b/Documentations/BUILD.md deleted file mode 100644 index 4abf3b59..00000000 --- a/Documentations/BUILD.md +++ /dev/null @@ -1,297 +0,0 @@ -# SerpentRace Backend Build System - -## Overview - -This document describes the comprehensive build system for the SerpentRace backend application. The build system handles TypeScript compilation, database migrations, asset management, testing, and deployment. - -## Quick Start - -```bash -# Development build -npm run build - -# Production build with full validation -npm run build:production - -# Advanced build with migrations and tests -npm run build:advanced:prod - -# Development server with hot reload -npm run dev -``` - -## Build Scripts - -### Basic Build Commands - -| Command | Description | -|---------|-------------| -| `npm run build` | Standard build: clean → compile → copy assets | -| `npm run build:clean` | Clean the dist directory | -| `npm run build:compile` | Compile TypeScript to JavaScript | -| `npm run build:copy-assets` | Copy non-TS files to dist directory | -| `npm run build:docker` | Build for Docker (no tests/migrations) | - -### Production Build Commands - -| Command | Description | -|---------|-------------| -| `npm run build:production` | Full production build with linting, tests, and migrations | -| `npm run build:advanced` | Advanced build script with custom options | -| `npm run build:advanced:prod` | Advanced production build with all validations | -| `npm run build:advanced:ci` | CI/CD friendly build (skips linting) | - -### Development Commands - -| Command | Description | -|---------|-------------| -| `npm run dev` | Start development server with hot reload | -| `npm run watch` | Watch mode TypeScript compilation | -| `npm run typecheck` | Type checking without code generation | - -### Database Commands - -| Command | Description | -|---------|-------------| -| `npm run migration:run` | Run pending database migrations | -| `npm run migration:show` | Show migration status | -| `npm run migration:generate ` | Generate new migration | -| `npm run migration:create ` | Create empty migration | -| `npm run migration:revert` | Revert last migration | -| `npm run migration:full ` | Create, generate, and run migration | - -### Testing Commands - -| Command | Description | -|---------|-------------| -| `npm test` | Run all tests | -| `npm run test:watch` | Run tests in watch mode | -| `npm run test:coverage` | Run tests with coverage report | -| `npm run test:redis` | Run Redis-specific tests | - -### Deployment Commands - -| Command | Description | -|---------|-------------| -| `npm run deploy:prod` | Build for production deployment | -| `scripts/deploy.sh` | Full Linux/Mac deployment script | -| `scripts/deploy.bat` | Full Windows deployment script | - -## Advanced Build Script - -The advanced build script (`scripts/build.ts`) supports various options: - -```bash -# Basic advanced build -npm run build:advanced - -# Production build with migrations and tests -npm run build:advanced:prod - -# CI/CD build (skips linting, includes tests and migrations) -npm run build:advanced:ci -``` - -### Build Options - -- `--migrations`: Run database migrations during build -- `--test`: Run tests during build -- `--skip-lint`: Skip linting step -- `--production`: Enable production mode (strict validation) - -## Deployment Scripts - -### Linux/Mac Deployment - -```bash -./scripts/deploy.sh [deploy|build-only|test-connections] -``` - -Options: -- `deploy` (default): Full deployment with validation -- `build-only`: Build without connection testing -- `test-connections`: Test database and Redis connections only - -### Windows Deployment - -```cmd -scripts\deploy.bat [deploy|build-only|test-connections] -``` - -Same options as Linux/Mac version. - -### Required Environment Variables - -The deployment scripts require these environment variables: - -```bash -DB_HOST=localhost -DB_PORT=5432 -DB_USERNAME=postgres -DB_PASSWORD=your_password -DB_NAME=serpentrace -JWT_SECRET=your_jwt_secret -REDIS_HOST=localhost -REDIS_PORT=6379 -``` - -## Build Process Flow - -### Standard Build (`npm run build`) - -1. **Clean** - Remove previous build artifacts -2. **Lint** - Code quality checks (if configured) -3. **Compile** - TypeScript compilation -4. **Copy Assets** - Copy non-TS files to dist -5. **Post-build** - Validation and cleanup - -### Production Build (`npm run build:production`) - -1. **Clean** - Remove previous build artifacts -2. **Lint** - Code quality checks -3. **Test** - Run test suite -4. **Migrations** - Apply database migrations -5. **Compile** - TypeScript compilation -6. **Copy Assets** - Copy non-TS files to dist -7. **Validate** - Ensure build integrity - -### Advanced Build (`npm run build:advanced`) - -Provides fine-grained control over the build process with comprehensive logging and error handling. - -## Asset Management - -The build system automatically copies these file types to the dist directory: - -- `.json` files (configuration, data) -- `.html` files (templates) -- `.css` files (stylesheets) -- Image files (`.png`, `.jpg`, `.jpeg`, `.gif`, `.svg`, `.ico`) -- Font files (`.woff`, `.woff2`, `.ttf`, `.eot`) - -Excluded directories: -- `node_modules` -- `.git` -- `tests` -- `__tests__` - -## TypeScript Configuration - -The build system uses the following TypeScript settings: - -- **Target**: ES2020 -- **Module**: CommonJS -- **Output Directory**: `./dist` -- **Source Maps**: Enabled -- **Declarations**: Enabled for type definitions -- **Strict Mode**: Enabled for type safety - -## Migration Management - -### Creating Migrations - -```bash -# Create empty migration -npm run migration:create AddNewTable - -# Generate migration from entity changes -npm run migration:generate AddNewTable - -# Full migration workflow (create + generate + run) -npm run migration:full AddNewTable -``` - -### Migration Best Practices - -1. Always backup database before running migrations in production -2. Test migrations in development environment first -3. Use descriptive migration names -4. Review generated migrations before running them - -## Docker Integration - -The build system is optimized for Docker deployments: - -```dockerfile -# Use build:docker for container builds -RUN npm run build:docker - -# Or use production build for full validation -RUN npm run build:production -``` - -## Troubleshooting - -### Common Issues - -1. **Build fails with "Cannot find module"** - - Run `npm ci` to ensure all dependencies are installed - - Check TypeScript paths configuration - -2. **Migration errors during build** - - Verify database connection parameters - - Ensure database exists and is accessible - - Check migration files for syntax errors - -3. **Asset copying fails** - - Verify file permissions - - Check disk space availability - - Ensure source files exist - -4. **TypeScript compilation errors** - - Run `npm run typecheck` for detailed error messages - - Check tsconfig.json configuration - - Verify all type definitions are installed - -### Debug Mode - -Enable verbose logging by setting the environment variable: - -```bash -export DEBUG=serpentrace:* -npm run build:advanced -``` - -## Performance Optimization - -### Build Performance Tips - -1. Use `npm ci` instead of `npm install` in CI/CD -2. Enable TypeScript incremental compilation for development -3. Use `--skip-lint` in CI if linting is handled separately -4. Cache node_modules in CI/CD pipelines - -### Runtime Performance - -The build system optimizes the output for production: - -- Source maps for debugging (can be disabled in production) -- Type declarations for library usage -- Compressed and optimized JavaScript output - -## Monitoring and Logging - -Build logs include: -- Timestamps for each build step -- Error details with stack traces -- Performance metrics (build duration) -- Validation results - -Production builds create detailed logs in the `logs/` directory. - -## Contributing - -When modifying the build system: - -1. Test changes with both development and production builds -2. Update this documentation for any new scripts or options -3. Ensure backward compatibility -4. Add appropriate error handling and logging - -## Support - -For build system issues: -1. Check this documentation -2. Review error logs in the console -3. Verify environment variables are set correctly -4. Test with a clean `node_modules` installation diff --git a/Documentations/DATABASE_MANAGEMENT_GUIDE.md b/Documentations/DATABASE_MANAGEMENT_GUIDE.md deleted file mode 100644 index dc6a793b..00000000 --- a/Documentations/DATABASE_MANAGEMENT_GUIDE.md +++ /dev/null @@ -1,392 +0,0 @@ -# 🗄️ SerpentRace Database Management Guide - -## 🎯 Overview - -This guide provides comprehensive information about managing all database services in the SerpentRace project, including PostgreSQL, Redis, MinIO, and administration tools. - -## 📊 Quick Status Check - -### Check All Services -```bash -npm run db:status -``` - -### Check Individual Services -```bash -npm run db:status:pg # PostgreSQL only -npm run db:status:redis # Redis only -npm run db:status:docker # Docker containers only -``` - -### Simple Connection Test -```bash -npm run test:connections -``` - -## 🐘 PostgreSQL Database - -### Connection Details -- **Host**: localhost:5432 -- **Database**: serpentrace -- **Username**: postgres -- **Password**: postgres -- **Admin Tool**: pgAdmin at http://localhost:8080 - -### Database Operations - -#### Run Migrations -```bash -npm run migration:run -``` - -#### Create New Migration -```bash -npm run migration:create src/migrations/YourMigrationName -``` - -#### Generate Migration from Entity Changes -```bash -npm run migration:generate src/migrations/YourMigrationName -``` - -#### Check Migration Status -```bash -npm run migration:show -``` - -#### Rollback Last Migration -```bash -npm run migration:revert -``` - -### Direct Database Access - -#### Using psql (if installed) -```bash -psql -h localhost -p 5432 -U postgres -d serpentrace -``` - -#### Using pgAdmin -1. Open http://localhost:8080 -2. Login with: admin@serpentrace.dev / admin -3. Server should be pre-configured as "SerpentRace" - -### Common SQL Queries - -#### Check Database Size -```sql -SELECT pg_size_pretty(pg_database_size('serpentrace')) as size; -``` - -#### List All Tables -```sql -SELECT tablename FROM pg_tables WHERE schemaname = 'public'; -``` - -#### Check Active Connections -```sql -SELECT count(*) FROM pg_stat_activity WHERE datname = 'serpentrace'; -``` - -## 🔴 Redis Cache - -### Connection Details -- **Host**: localhost:6379 -- **No Authentication**: Default Redis setup -- **Admin Tool**: Redis Commander at http://localhost:8081 - -### Redis Operations - -#### Direct Redis Access (if redis-cli installed) -```bash -redis-cli -h localhost -p 6379 -``` - -#### Common Redis Commands -```bash -# Get all keys -KEYS * - -# Get key count -DBSIZE - -# Check memory usage -INFO memory - -# Flush all data (careful!) -FLUSHALL -``` - -### Using Redis Commander -1. Open http://localhost:8081 -2. Browse keys, view data, execute commands - -## 🗄️ MinIO Object Storage - -### Connection Details -- **Endpoint**: localhost:9000 -- **Console**: http://localhost:9001 -- **Access Key**: serpentrace -- **Secret Key**: serpentrace123 -- **Default Bucket**: serpentrace - -### MinIO Operations - -#### Access MinIO Console -1. Open http://localhost:9001 -2. Login with: serpentrace / serpentrace123 -3. Create buckets, upload files, manage storage - -#### Health Check -```bash -curl http://localhost:9000/minio/health/live -``` - -### File Upload Example (Node.js) -```javascript -const Minio = require('minio'); - -const minioClient = new Minio.Client({ - endPoint: 'localhost', - port: 9000, - useSSL: false, - accessKey: 'serpentrace', - secretKey: 'serpentrace123' -}); - -// Upload file -minioClient.fPutObject('serpentrace', 'test-file.txt', './file.txt'); -``` - -## 🐳 Docker Container Management - -### View All Containers -```bash -docker ps -a -``` - -### View SerpentRace Containers Only -```bash -docker ps -a --filter "name=serpentrace" -``` - -### Container Operations - -#### Restart All Services -```bash -cd d:\munka\SzeSnake\SerpentRace_Docker -docker-compose -f docker-compose.dev.yml restart -``` - -#### Restart Individual Service -```bash -docker restart serpentrace-postgres-dev # PostgreSQL -docker restart serpentrace-redis-dev # Redis -docker restart serpentrace-minio-dev # MinIO -docker restart serpentrace-pgadmin-dev # pgAdmin -``` - -#### View Container Logs -```bash -docker logs serpentrace-postgres-dev -docker logs serpentrace-redis-dev -f # Follow logs -``` - -#### Stop All Services -```bash -cd d:\munka\SzeSnake\SerpentRace_Docker -docker-compose -f docker-compose.dev.yml down -``` - -#### Start All Services -```bash -cd d:\munka\SzeSnake\SerpentRace_Docker -docker-compose -f docker-compose.dev.yml up -d -``` - -## 🛠️ Troubleshooting - -### PostgreSQL Issues - -#### Connection Refused -```bash -# Check if container is running -docker ps | grep postgres - -# Check container logs -docker logs serpentrace-postgres-dev - -# Restart if needed -docker restart serpentrace-postgres-dev -``` - -#### Migration Errors -```bash -# Check migration status -npm run migration:show - -# Revert last migration if problematic -npm run migration:revert - -# Re-run migrations -npm run migration:run -``` - -### Redis Issues - -#### Cannot Connect -```bash -# Check Redis container -docker ps | grep redis - -# Test connection -redis-cli -h localhost -p 6379 ping -# Expected response: PONG -``` - -### MinIO Issues - -#### Health Check Failed -```bash -# Check MinIO container -docker ps | grep minio - -# Test health endpoint -curl http://localhost:9000/minio/health/live -# Expected response: 200 OK -``` - -### pgAdmin Issues - -#### Cannot Login -- Default credentials: admin@serpentrace.dev / admin -- If issues persist, restart container: - ```bash - docker restart serpentrace-pgladmin-dev - ``` - -#### Server Not Found -- pgAdmin should auto-configure the PostgreSQL server -- If not visible, add manually: - - Host: postgres - - Port: 5432 - - Database: serpentrace - - Username: postgres - - Password: postgres - -## 🔧 Environment Variables - -### Default Development Settings -```bash -# PostgreSQL -DB_HOST=localhost -DB_PORT=5432 -DB_NAME=serpentrace -DB_USERNAME=postgres -DB_PASSWORD=postgres - -# Redis -REDIS_HOST=localhost -REDIS_PORT=6379 - -# MinIO -MINIO_ENDPOINT=localhost -MINIO_PORT=9000 -MINIO_ACCESS_KEY=serpentrace -MINIO_SECRET_KEY=serpentrace123 -``` - -### Production Configuration -Create `.env.production` with secure values: -```bash -DB_HOST=your-production-host -DB_PASSWORD=secure-password -REDIS_PASSWORD=secure-redis-password -MINIO_SECRET_KEY=secure-minio-secret -``` - -## 📈 Monitoring & Maintenance - -### Daily Health Check -```bash -npm run db:status -``` - -### Weekly Maintenance -```bash -# Check database size growth -npm run db:status:pg - -# Review Redis memory usage -npm run db:status:redis - -# Clean up old Docker logs -docker system prune -``` - -### Backup Procedures - -#### PostgreSQL Backup -```bash -docker exec serpentrace-postgres-dev pg_dump -U postgres serpentrace > backup.sql -``` - -#### Redis Backup -```bash -docker exec serpentrace-redis-dev redis-cli BGSAVE -``` - -#### MinIO Backup -Use MinIO Console or mc client to backup buckets. - -## 🎯 Performance Optimization - -### PostgreSQL -- Monitor active connections with `npm run db:status:pg` -- Use connection pooling in production -- Regular VACUUM and ANALYZE operations - -### Redis -- Monitor memory usage -- Configure appropriate eviction policies -- Use Redis persistence (RDB/AOF) in production - -### MinIO -- Configure appropriate bucket policies -- Use lifecycle management for old files -- Monitor storage usage through console - -## 🚀 Quick Reference Commands - -```bash -# Status and Health -npm run db:status # Full system status -npm run test:connections # Quick connection test - -# Database Operations -npm run migration:run # Apply migrations -npm run migration:show # Check migration status - -# Docker Management -docker ps # Show running containers -docker logs # View logs -docker restart # Restart service - -# Direct Access -psql -h localhost -U postgres -d serpentrace # PostgreSQL CLI -redis-cli -h localhost # Redis CLI -``` - -## 🌐 Web Interfaces Summary - -| Service | URL | Credentials | -|---------|-----|------------| -| pgAdmin | http://localhost:8080 | admin@serpentrace.dev / admin | -| Redis Commander | http://localhost:8081 | No auth required | -| MinIO Console | http://localhost:9001 | serpentrace / serpentrace123 | -| Backend API | http://localhost:3000 | When running | -| Frontend | http://localhost:5173 | When running | - ---- - -*This guide is automatically updated when database configurations change. Last updated: 2025-08-23* diff --git a/Documentations/DOCKER_WATCHER_GUIDE.md b/Documentations/DOCKER_WATCHER_GUIDE.md deleted file mode 100644 index c7632d5a..00000000 --- a/Documentations/DOCKER_WATCHER_GUIDE.md +++ /dev/null @@ -1,235 +0,0 @@ -# Docker Watcher Implementation Guide - -## Overview - -This document explains the Docker watcher implementation for the SerpentRace project, which automatically synchronizes local file changes with Docker containers and rebuilds images when necessary. - -## What's Implemented - -### Docker Compose Watch Configuration - -The development Docker Compose configuration now includes `develop.watch` sections for both frontend and backend services that provide: - -1. **File Synchronization**: Automatically sync source code changes to running containers -2. **Selective Rebuilding**: Rebuild containers when critical configuration files change -3. **Intelligent Ignore Patterns**: Exclude unnecessary files like `node_modules` - -### Backend Watcher Configuration - -```yaml -develop: - watch: - - action: sync - path: ../SerpentRace_Backend/src - target: /app/src - ignore: - - node_modules/ - - action: sync - path: ../SerpentRace_Backend/package.json - target: /app/package.json - - action: rebuild - path: ../SerpentRace_Backend/package-lock.json - - action: rebuild - path: ../SerpentRace_Docker/Dockerfile_backend.dev -``` - -### Frontend Watcher Configuration - -```yaml -develop: - watch: - - action: sync - path: ../SerpentRace_Frontend/src - target: /app/src - ignore: - - node_modules/ - - action: sync - path: ../SerpentRace_Frontend/public - target: /app/public - - action: sync - path: ../SerpentRace_Frontend/package.json - target: /app/package.json - - action: rebuild - path: ../SerpentRace_Frontend/package-lock.json - - action: rebuild - path: ../SerpentRace_Frontend/vite.config.js - - action: rebuild - path: ../SerpentRace_Docker/Dockerfile_frontend.dev -``` - -## How It Works - -### Sync Actions -- **Purpose**: Instantly copy changed files from host to container -- **Use Cases**: Source code files, static assets, configuration files that don't require rebuild -- **Performance**: Near-instant updates, no container restart needed - -### Rebuild Actions -- **Purpose**: Trigger full container rebuild when critical files change -- **Use Cases**: Package files, Docker configuration, build configuration -- **Performance**: Takes longer but ensures consistency - -## Usage - -### New Commands Added - -#### Windows (docker-manage.bat) -```bash -# Start with file watchers -.\docker-manage.bat dev:watch - -# Traditional start (without watchers) -.\docker-manage.bat dev:start -``` - -#### Linux/Mac (docker-manage.sh) -```bash -# Start with file watchers -./docker-manage.sh dev:watch - -# Traditional start (without watchers) -./docker-manage.sh dev:start -``` - -### Command Differences - -| Command | Mode | File Watching | Container Rebuild | Use Case | -|---------|------|---------------|-------------------|----------| -| `dev:start` | Background (-d) | No | Manual only | Traditional development | -| `dev:watch` | Foreground | Yes | Automatic | Modern development with live sync | - -## Benefits - -### 1. Instant File Synchronization -- Source code changes are immediately available in containers -- No manual rebuild or restart required for code changes -- Maintains all existing hot-reload functionality (nodemon, Vite HMR) - -### 2. Smart Rebuilding -- Automatically rebuilds when package.json or Dockerfile changes -- Ensures containers stay consistent with dependency updates -- Prevents common issues with stale dependencies - -### 3. Development Efficiency -- Combines Docker's isolation with native-like development speed -- Reduces context switching between local and containerized development -- Maintains consistent environment across team members - -## File Patterns Watched - -### Backend -- **Synced Files**: - - `src/` directory (all TypeScript source files) - - `package.json` (for runtime reference) -- **Rebuild Triggers**: - - `package-lock.json` (dependency changes) - - `Dockerfile_backend.dev` (container configuration) - -### Frontend -- **Synced Files**: - - `src/` directory (React components, styles, etc.) - - `public/` directory (static assets) - - `package.json` (for runtime reference) -- **Rebuild Triggers**: - - `package-lock.json` (dependency changes) - - `vite.config.js` (build configuration) - - `Dockerfile_frontend.dev` (container configuration) - -## Performance Considerations - -### Sync Performance -- File synchronization is near-instantaneous -- Uses Docker's built-in file watching mechanisms -- Optimized for development workloads - -### Rebuild Performance -- Rebuilds only occur when necessary -- Docker layer caching reduces rebuild times -- Can be resource-intensive for large dependency changes - -## Troubleshooting - -### Common Issues - -1. **File Changes Not Reflected** - - Ensure you're using `dev:watch` command - - Check that files are not in ignore patterns - - Verify file paths are correct - -2. **Excessive Rebuilds** - - Check for unnecessary changes to rebuild trigger files - - Consider moving files to sync-only patterns if appropriate - -3. **Performance Issues** - - Monitor Docker resource usage - - Consider excluding large directories from watching - - Use `.dockerignore` for files that should never be synced - -### Debugging Commands - -```bash -# Check container status -docker-compose -f SerpentRace_Docker/docker-compose.dev.yml ps - -# View watcher logs -docker-compose -f SerpentRace_Docker/docker-compose.dev.yml logs -f backend -docker-compose -f SerpentRace_Docker/docker-compose.dev.yml logs -f frontend - -# Check file synchronization -docker exec -it serpentrace-backend-dev ls -la /app/src -docker exec -it serpentrace-frontend-dev ls -la /app/src -``` - -## Requirements - -### Docker Compose Version -- Requires Docker Compose v2.22+ for `develop.watch` support -- Check version: `docker-compose version` - -### File System -- Works on Windows, Linux, and macOS -- Performance may vary based on file system type -- WSL2 recommended for Windows users - -## Migration from Traditional Setup - -### No Breaking Changes -- Existing `dev:start` command continues to work -- All volume mounts remain functional -- Hot reload functionality preserved - -### Gradual Adoption -1. Try `dev:watch` for active development -2. Use `dev:start` for background services -3. Gradually migrate team to new workflow - -## Best Practices - -### Development Workflow -1. Use `dev:watch` during active development -2. Make code changes normally -3. Watch for automatic synchronization -4. Monitor logs for any sync issues - -### File Organization -- Keep frequently changed files in sync patterns -- Place build configuration in rebuild patterns -- Use `.dockerignore` for files that should never sync - -### Team Collaboration -- Document which command team members should use -- Ensure consistent Docker Compose version across team -- Share troubleshooting steps for common issues - -## Future Enhancements - -### Potential Improvements -1. **Selective Service Watching**: Watch only specific services -2. **Custom Ignore Patterns**: Per-developer ignore configurations -3. **Performance Monitoring**: Built-in sync performance metrics -4. **Integration with IDEs**: Better editor integration for sync status - -### Configuration Expansion -- Additional file patterns as needed -- Service-specific watch configurations -- Environment-based watch rules diff --git a/Documentations/FRONTEND_IMPLEMENTATION_GUIDE.md b/Documentations/FRONTEND_IMPLEMENTATION_GUIDE.md deleted file mode 100644 index e69de29b..00000000 diff --git a/Documentations/FRONTEND_IMPLEMENTATION_GUIDE_COMPLETE.md b/Documentations/FRONTEND_IMPLEMENTATION_GUIDE_COMPLETE.md deleted file mode 100644 index 22c5cde4..00000000 --- a/Documentations/FRONTEND_IMPLEMENTATION_GUIDE_COMPLETE.md +++ /dev/null @@ -1,1439 +0,0 @@ -# SerpentRace Backend API Documentation for Frontend Developers -## Complete API Reference with All Endpoints - -## Table of Contents -1. [Test User Credentials](#test-user-credentials) -2. [Data Structures & Entities](#data-structures--entities) -3. [Base URL & Service Info](#base-url--service-info) -4. [Authentication Endpoints](#authentication-endpoints) -5. [User Management](#user-management) -6. [Deck Management](#deck-management) -7. [Organization Management](#organization-management) -8. [Chat System](#chat-system) -9. [Contact Management](#contact-management) -10. [Import/Export Functionality](#importexport-functionality) -11. [Admin Endpoints](#admin-endpoints) -12. [Error Handling](#error-handling) -13. [WebSocket Real-Time Communication](#websocket-real-time-communication) - ---- - -## Test User Credentials - -For development and testing, use these pre-configured user accounts: - -### Regular User (Verified) -- **Username:** `john_doe` -- **Password:** `password123` -- **Email:** `john.doe@email.com` -- **Type:** Regular user (state: 1 - VERIFIED_REGULAR) -- **Organization:** None - -### Premium User (Organization Member) -- **Username:** `jane_premium` -- **Password:** `password123` -- **Email:** `jane.smith@email.com` -- **Type:** Premium user (state: 2 - VERIFIED_PREMIUM) -- **Organization:** Tech Solutions Inc - -### Teacher (Premium Organization Member) -- **Username:** `teacher_bob` -- **Password:** `password123` -- **Email:** `bob.teacher@eduinst.edu` -- **Type:** Premium user (state: 2 - VERIFIED_PREMIUM) -- **Organization:** Educational Institute - -### Admin User -- **Username:** `admin_user` -- **Password:** `password123` -- **Email:** `admin@serpentrace.com` -- **Type:** Admin (state: 5 - ADMIN) -- **Organization:** None - -### Unverified User -- **Username:** `new_user` -- **Password:** `password123` -- **Email:** `newuser@email.com` -- **Type:** Unverified (state: 0 - REGISTERED_NOT_VERIFIED) -- **Organization:** None - ---- - -## Data Structures & Entities - -### User DTOs -```typescript -interface ShortUserDto { - id: string; // UUID - username: string; // Username - state: number; // UserState enum - authLevel: 0 | 1; // 0 = regular, 1 = admin -} - -interface DetailUserDto { - id: string; // UUID - orgid: string | null; // Organization ID (if member) - username: string; // Unique username - email: string; // Email address - fname: string; // First name - lname: string; // Last name - code: string | null; // Verification code - type: string; // 'personal' | 'premium' | 'admin' - phone: string | null; // Phone number - state: number; // UserState enum value -} - -enum UserState { - REGISTERED_NOT_VERIFIED = 0, // Email not verified - VERIFIED_REGULAR = 1, // Regular verified user - VERIFIED_PREMIUM = 2, // Premium verified user - SOFT_DELETE = 3, // Soft deleted - DEACTIVATED = 4, // Account deactivated - ADMIN = 5 // Admin user -} -``` - -### Deck DTOs -```typescript -interface ShortDeckDto { - id: string; // UUID - name: string; // Deck name - type: number; // DeckType enum value - playedNumber: number; // Times played - ctype: number; // DeckVisibility enum value -} - -interface DetailDeckDto { - id: string; // UUID - name: string; // Deck name - type: number; // DeckType enum value - userid: string; // Owner's user ID - creationdate: Date; // Creation timestamp - cards: Card[]; // Array of cards - playedNumber: number; // Times played - ctype: number; // DeckVisibility enum value -} - -interface Card { - text: string; // Question/prompt text - type?: number; // CardType enum (optional) - answer?: string | null; // Answer (varies by type) -} - -enum DeckType { - LUCK = 0, // Luck-based cards - JOKER = 1, // Joker/wild cards - QUESTION = 2 // Question-based cards -} - -enum DeckVisibility { - PUBLIC = 0, // Public to all - PRIVATE = 1, // Private to owner - ORGANIZATION = 2 // Shared within organization -} - -enum DeckState { - ACTIVE = 0, // Active deck - SOFT_DELETE = 1 // Soft deleted -} - -enum CardType { - QUIZ = 0, // Multiple choice question - SENTENCE_PAIRING = 1, // Sentence completion - OWN_ANSWER = 2, // Custom answer - TRUE_FALSE = 3, // True/False question - CLOSER = 4 // Closer to answer -} -``` - -### Organization DTOs -```typescript -interface ShortOrganizationDto { - id: string; // UUID - name: string; // Organization name - contactfname: string; // Contact first name - contactlname: string; // Contact last name - contactemail: string; // Contact email - state: number; // OrganizationState enum - regdate: Date; // Registration date - maxOrganizationalDecks: number | null; // Max org decks allowed -} - -enum OrganizationState { - REGISTERED = 0, // Just registered - ACTIVE = 1, // Active organization - SOFT_DELETE = 2 // Soft deleted -} -``` - -### Chat DTOs -```typescript -interface ShortChatDto { - id: string; // UUID - userCount: number; // Number of participants - state: number; // ChatState enum value -} - -interface DetailChatDto { - id: string; // UUID - users: string[]; // Participant user IDs - messages: Message[]; // Message history - updateDate: Date; // Last update - state: number; // ChatState enum value -} - -interface Message { - id: string; // Message UUID - date: Date; // Message timestamp - userid: string; // Sender user ID - text: string; // Message content -} - -enum ChatType { - DIRECT = 'direct', // Direct message - GROUP = 'group', // Group chat - GAME = 'game' // Game-specific chat -} - -enum ChatState { - ACTIVE = 0, // Active chat - ARCHIVE = 1, // Archived chat - SOFT_DELETE = 2 // Soft deleted -} -``` - -### Contact DTOs -```typescript -interface ContactDto { - id: string; // UUID - name: string; // Contact name - email: string; // Contact email - userid: string | null; // User ID if logged in - type: number; // ContactType enum - txt: string; // Message content - state: number; // ContactState enum - createDate: Date; // Creation date - updateDate: Date; // Last update - adminResponse: string | null; // Admin response - responseDate: Date | null; // Response date - respondedBy: string | null; // Responding admin ID -} - -enum ContactType { - BUG = 0, // Bug report - PROBLEM = 1, // Problem report - QUESTION = 2, // General question - SALES = 3, // Sales inquiry - OTHER = 4 // Other type -} - -enum ContactState { - ACTIVE = 0, // Active/unresolved - RESOLVED = 1, // Resolved - SOFT_DELETE = 2 // Soft deleted -} -``` - ---- - -## Base URL & Service Info - -**Base URL:** `http://localhost:3000` (development) - -### Service Information -**Endpoint:** `GET /` - -**Authentication:** None required - -**Response Data:** -```typescript -{ - service: "SerpentRace Backend API"; - status: "running"; - version: "1.0.0"; - endpoints: { - swagger: "/api-docs"; - users: "/api/users"; - organizations: "/api/organizations"; - decks: "/api/decks"; - chats: "/api/chats"; - contacts: "/api/contacts"; - admin: "/api/admin"; - deckImportExport: "/api/deck-import-export"; - health: "/health"; - }; - websocket: { - enabled: true; - events: string[]; // WebSocket event names - }; -} -``` - -### Health Check -**Endpoint:** `GET /health` - -**Authentication:** None required - -**Response Data:** -```typescript -{ - status: "healthy" | "unhealthy"; - timestamp: string; // ISO timestamp - service: "SerpentRace Backend API"; - version: "1.0.0"; - environment: string; // "development" | "production" - database: { - connected: boolean; // Database connection status - type: string; // Database type - }; - websocket: { - enabled: boolean; // WebSocket status - }; - uptime: number; // Process uptime in seconds -} -``` - ---- - -## Authentication Endpoints - -### User Login -**Endpoint:** `POST /api/users/login` - -**Authentication:** None required - -**Validation Rules:** -- `username`: 3-50 characters -- `password`: 6-100 characters - -**Request Data:** -```typescript -{ - username: string; // Username or email - password: string; // Password -} -``` - -**Response Data (Success):** -```typescript -{ - token: string; // JWT token (also set as cookie) - user: ShortUserDto; // User information - organizationName?: string; // Organization name (if member) -} -``` - -**Error Responses:** -- `400`: Validation error -- `401`: Invalid credentials, unverified email, or account restrictions -- `500`: Internal server error - -### User Registration -**Endpoint:** `POST /api/users/create` - -**Authentication:** None required - -**Validation Rules:** -- `username`: 3-50 characters, unique -- `email`: valid email format, unique -- `password`: 6-100 characters - -**Request Data:** -```typescript -{ - username: string; // Unique username - email: string; // Valid email - password: string; // Password - fname?: string; // First name (optional) - lname?: string; // Last name (optional) - phone?: string; // Phone number (optional) - type?: string; // User type (optional) -} -``` - -**Response Data (Success):** -```typescript -{ - id: string; // User UUID - username: string; // Username - email: string; // Email - regdate: Date; // Registration date -} -``` - -**Error Responses:** -- `400`: Validation error -- `409`: Username or email already exists -- `500`: Internal server error - ---- - -## User Management - -### Get User Profile -**Endpoint:** `GET /api/users/profile` - -**Authentication:** Required - -**Response Data:** `DetailUserDto` - -### Update User Profile -**Endpoint:** `PATCH /api/users/profile` - -**Authentication:** Required - -**Request Data:** Partial `DetailUserDto` fields to update - -**Response Data:** Updated `DetailUserDto` - -**Error Responses:** -- `400`: Validation error -- `404`: User not found -- `409`: Email already exists -- `500`: Internal server error - ---- - -## Deck Management - -### Get Decks (Paginated) - RECOMMENDED -**Endpoint:** `GET /api/decks/page/{from}/{to}` - -**Authentication:** Required - -**URL Parameters:** -- `from`: Start index (0-based, ≥ 0) -- `to`: End index (inclusive, ≥ from) - -**Response Data:** -```typescript -{ - decks: ShortDeckDto[]; // Array of deck summaries - totalCount: number; // Total available decks -} -``` - -### Create Deck -**Endpoint:** `POST /api/decks` - -**Authentication:** Required - -**Request Data:** -```typescript -{ - name: string; // Deck name (required) - type?: number; // DeckType enum (optional) - cards?: Card[]; // Initial cards (optional) - ctype?: number; // DeckVisibility enum (optional) -} -``` - -**Response Data:** `ShortDeckDto` - -### Search Decks -**Endpoint:** `GET /api/decks/search` - -**Authentication:** Required - -**Query Parameters:** -- `query`: Search query (required, non-empty) -- `limit`: Results limit (1-100, default: 20) -- `offset`: Results offset (≥ 0, default: 0) - -**Response Data:** Array of matching `ShortDeckDto` - -### Get Deck by ID -**Endpoint:** `GET /api/decks/{id}` - -**Authentication:** Required - -**URL Parameters:** -- `id`: Deck UUID - -**Response Data:** `DetailDeckDto` - -### Update Deck -**Endpoint:** `PUT /api/decks/{id}` - -**Authentication:** Required (owner only) - -**URL Parameters:** -- `id`: Deck UUID - -**Request Data:** Partial `DetailDeckDto` fields to update - -**Response Data:** Updated `ShortDeckDto` - -### Delete Deck (Soft Delete) -**Endpoint:** `DELETE /api/decks/{id}` - -**Authentication:** Required (owner only) - -**URL Parameters:** -- `id`: Deck UUID - -**Response Data:** -```typescript -{ - success: boolean; // Deletion success status -} -``` - ---- - -## Organization Management - -### Get Organizations (Paginated) - RECOMMENDED -**Endpoint:** `GET /api/organizations/page/{from}/{to}` - -**Authentication:** Required - -**URL Parameters:** -- `from`: Start index (0-based, ≥ 0) -- `to`: End index (inclusive, ≥ from) - -**Response Data:** -```typescript -{ - organizations: ShortOrganizationDto[]; - totalCount: number; -} -``` - -### Search Organizations -**Endpoint:** `GET /api/organizations/search` - -**Authentication:** Required - -**Query Parameters:** -- `query`: Search query (required, non-empty) -- `limit`: Results limit (1-100, default: 20) -- `offset`: Results offset (≥ 0, default: 0) - -**Response Data:** Array of matching organizations - -### Get Organization Login URL -**Endpoint:** `GET /api/organizations/{orgId}/login-url` - -**Authentication:** Required - -**URL Parameters:** -- `orgId`: Organization UUID - -**Response Data:** -```typescript -{ - loginUrl: string; // Organization login URL - organizationName: string; // Organization name -} -``` - -### Process Organization Auth Callback -**Endpoint:** `POST /api/organizations/auth-callback` - -**Authentication:** Required - -**Request Data:** -```typescript -{ - organizationId: string; // Organization UUID - status: "ok" | "not_ok"; // Authentication status - authToken?: string; // Authentication token (optional) -} -``` - -**Response Data:** -```typescript -{ - success: boolean; // Processing success - message: string; // Result message - updatedFields?: string[]; // Fields that were updated -} -``` - ---- - -## Chat System - -### Get User Chats -**Endpoint:** `GET /api/chats/user-chats` - -**Authentication:** Required - -**Query Parameters:** -- `includeArchived`: boolean (default: false) - -**Response Data:** Array of `ShortChatDto` - -### Get Chat History -**Endpoint:** `GET /api/chats/history/{chatId}` - -**Authentication:** Required - -**URL Parameters:** -- `chatId`: Chat UUID (validated) - -**Response Data:** -```typescript -{ - id: string; // Chat UUID - users: string[]; // Participants - messages: Message[]; // Message history - isArchived: boolean; // Archive status - state: number; // Chat state -} -``` - -### Create Chat -**Endpoint:** `POST /api/chats/create` - -**Authentication:** Required - -**Validation Rules:** -- `type`: must be 'direct' or 'group' -- `userIds`: non-empty array -- `name`: required for groups - -**Request Data:** -```typescript -{ - type: 'direct' | 'group'; // Chat type - userIds: string[]; // Participant user IDs - name?: string; // Group name (required for groups) -} -``` - -**Response Data:** -```typescript -{ - id: string; // Chat UUID - type: ChatType; // Chat type - name: string | null; // Chat name - users: string[]; // Participants - messages: Message[]; // Empty initially -} -``` - -### Send Message (REST - for testing) -**Endpoint:** `POST /api/chats/message` - -**Authentication:** Required - -**Validation Rules:** -- `chatId`: valid UUID -- `message`: 1-2000 characters - -**Request Data:** -```typescript -{ - chatId: string; // Chat UUID - message: string; // Message content -} -``` - -**Response Data:** `Message` object - -### Archive Chat -**Endpoint:** `POST /api/chats/archive/{chatId}` - -**Authentication:** Required - -**URL Parameters:** -- `chatId`: Chat UUID (validated) - -**Response Data:** -```typescript -{ - success: boolean; - message: string; -} -``` - -### Restore Chat from Archive -**Endpoint:** `POST /api/chats/restore/{chatId}` - -**Authentication:** Required - -**URL Parameters:** -- `chatId`: Chat UUID (validated) - -**Response Data:** -```typescript -{ - success: boolean; - message: string; -} -``` - -### Get Archived Game Chats -**Endpoint:** `GET /api/chats/archived/game/{gameId}` - -**Authentication:** Required - -**URL Parameters:** -- `gameId`: Game UUID (validated) - -**Response Data:** Array of archived chat objects - ---- - -## Contact Management - -### Create Contact -**Endpoint:** `POST /api/contact` - -**Authentication:** Optional - -**Validation Rules:** -- `name`, `email`, `type`, `txt`: required fields -- `type`: must be 0-4 (ContactType enum) - -**Request Data:** -```typescript -{ - name: string; // Contact name (required) - email: string; // Contact email (required) - type: ContactType; // Contact type (0-4) - txt: string; // Message content (required) -} -``` - -**Response Data:** `ContactDto` - -**Error Responses:** -- `400`: Missing fields or invalid contact type -- `500`: Internal server error - ---- - -## Import/Export Functionality - -### Export Deck -**Endpoint:** `GET /api/deck-import-export/export/{deckId}` - -**Authentication:** Required (deck owner only) - -**URL Parameters:** -- `deckId`: Deck UUID - -**Response:** Binary .spr file download - -**Headers:** -- `Content-Type`: `application/octet-stream` -- `Content-Disposition`: `attachment; filename="deckname.spr"` - -### Import Deck -**Endpoint:** `POST /api/deck-import-export/import` - -**Authentication:** Required - -**Request:** Multipart form data -- `file`: .spr or JSON file (max 10MB) - -**Response Data:** -```typescript -{ - success: boolean; - message: string; - deckId: string; // Created deck ID -} -``` - ---- - -## Admin Endpoints - -All admin endpoints require authentication with admin role (UserState.ADMIN = 5). - -### User Management (Admin) - -#### Get Users (Paginated) - RECOMMENDED -**Endpoint:** `GET /api/admin/users/page/{from}/{to}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**URL Parameters:** -- `from`: Start index (0-based) -- `to`: End index (inclusive, max page size: 100) - -**Response Data:** -```typescript -{ - users: DetailUserDto[]; // Array of detailed user objects - pagination: { - from: number; // Start index - to: number; // End index - returned: number; // Actual returned count - totalCount: number; // Total user count - includeDeleted: boolean; // Include deleted flag - }; -} -``` - -#### Get User by ID (Admin) -**Endpoint:** `GET /api/admin/users/{userId}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** `DetailUserDto` or null - -#### Search Users (Admin) -**Endpoint:** `GET /api/admin/users/search/{searchTerm}` - -**URL Parameters:** -- `searchTerm`: Search term (2-100 characters) - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Array of matching users - -#### Update User (Admin) -**Endpoint:** `PATCH /api/admin/users/{userId}` - -**Request Data:** Partial user fields to update - -**Response Data:** Updated `DetailUserDto` - -#### Deactivate User (Admin) -**Endpoint:** `POST /api/admin/users/{userId}/deactivate` - -**Response Data:** -```typescript -{ - message: string; - user: DetailUserDto; -} -``` - -#### Delete User (Admin) -**Endpoint:** `DELETE /api/admin/users/{userId}` - -**Response Data:** -```typescript -{ - message: string; -} -``` - -### Deck Management (Admin) - -#### Get Decks (Paginated, Admin) -**Endpoint:** `GET /api/admin/decks/page/{from}/{to}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Same as regular deck pagination but unrestricted - -#### Get Deck by ID (Admin) -**Endpoint:** `GET /api/admin/decks/{id}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** `DetailDeckDto` - -#### Search Decks (Admin) -**Endpoint:** `GET /api/admin/decks/search/{searchTerm}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Array of matching decks - -#### Hard Delete Deck (Admin) -**Endpoint:** `DELETE /api/admin/decks/{id}/hard` - -**Response Data:** -```typescript -{ - success: boolean; -} -``` - -### Organization Management (Admin) - -#### Create Organization (Admin) -**Endpoint:** `POST /api/admin/organizations` - -**Request Data:** Organization creation data - -**Response Data:** Created organization object - -#### Update Organization (Admin) -**Endpoint:** `PATCH /api/admin/organizations/{id}` - -**Request Data:** Partial organization fields to update - -**Response Data:** Updated organization object - -#### Get Organizations (Paginated, Admin) -**Endpoint:** `GET /api/admin/organizations/page/{from}/{to}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Organization pagination with unrestricted access - -#### Get Organization by ID (Admin) -**Endpoint:** `GET /api/admin/organizations/{id}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Organization object - -#### Search Organizations (Admin) -**Endpoint:** `GET /api/admin/organizations/search/{searchTerm}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Array of matching organizations - -#### Soft Delete Organization (Admin) -**Endpoint:** `DELETE /api/admin/organizations/{id}` - -**Response Data:** -```typescript -{ - success: boolean; -} -``` - -#### Hard Delete Organization (Admin) -**Endpoint:** `DELETE /api/admin/organizations/{id}/hard` - -**Response Data:** -```typescript -{ - success: boolean; -} -``` - -### Chat Management (Admin) - -#### Get Chats (Paginated, Admin) -**Endpoint:** `GET /api/admin/chats/page/{from}/{to}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** -```typescript -{ - chats: DetailChatDto[]; - pagination: { - from: number; - to: number; - returned: number; - totalCount: number; - includeDeleted: boolean; - }; -} -``` - -#### Get Chat by ID (Admin) -**Endpoint:** `GET /api/admin/chats/{id}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** `DetailChatDto` - -### Contact Management (Admin) - -#### Get Contacts (Paginated, Admin) -**Endpoint:** `GET /api/admin/contacts/page/{from}/{to}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Contact pagination with full access - -#### Get Contact by ID (Admin) -**Endpoint:** `GET /api/admin/contacts/{id}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** `ContactDto` - -#### Search Contacts (Admin) -**Endpoint:** `GET /api/admin/contacts/search/{searchTerm}` - -**Query Parameters:** -- `includeDeleted`: boolean (default: false) - -**Response Data:** Array of matching contacts - -#### Respond to Contact (Admin) -**Endpoint:** `PUT /api/admin/contacts/{id}/respond` - -**Request Data:** -```typescript -{ - adminResponse: string; // Admin response (required) - sendEmail?: boolean; // Send email to contact (optional) - language?: string; // Response language (optional) -} -``` - -**Response Data:** -```typescript -{ - success: boolean; - message: string; - contact: ContactDto; - emailSent: boolean; - emailError: string | null; -} -``` - -#### Resend Contact Email (Admin) -**Endpoint:** `POST /api/admin/contacts/{id}/resend-email` - -**Request Data:** -```typescript -{ - language?: string; // Email language (optional) -} -``` - -**Response Data:** -```typescript -{ - success: boolean; - message: string; -} -``` - -#### Soft Delete Contact (Admin) -**Endpoint:** `DELETE /api/admin/contacts/{id}` - -**Response Data:** -```typescript -{ - success: boolean; -} -``` - -#### Hard Delete Contact (Admin) -**Endpoint:** `DELETE /api/admin/contacts/{id}/hard` - -**Response Data:** -```typescript -{ - success: boolean; -} -``` - -### Import/Export (Admin) - -#### Import Deck from JSON (Admin) -**Endpoint:** `POST /api/admin/decks/import` - -**Request:** Multipart form data -- `file`: JSON file (max 10MB) - -**Response Data:** -```typescript -{ - success: boolean; - message: string; - deckId: string; -} -``` - -#### Export Deck as JSON (Admin) -**Endpoint:** `GET /api/admin/decks/{deckId}/export` - -**Response:** JSON file download - -**Headers:** -- `Content-Type`: `application/json` -- `Content-Disposition`: `attachment; filename="deckname.json"` - ---- - -## Error Handling - -### Standard Error Response Format -```typescript -{ - error: string; // Error message - details?: string; // Additional details (development only) - timestamp?: string; // Error timestamp -} -``` - -### HTTP Status Codes -- `200` - Success -- `201` - Created -- `204` - No Content -- `400` - Bad Request (validation error) -- `401` - Unauthorized (authentication required) -- `403` - Forbidden (insufficient permissions) -- `404` - Not Found -- `409` - Conflict (duplicate data) -- `500` - Internal Server Error -- `503` - Service Unavailable - -### Common Error Scenarios - -**Authentication Errors:** -```typescript -// Missing or invalid token -{ error: "Authentication required" } - -// Account state restrictions -{ error: "Please verify your email address" } -{ error: "Account has been deactivated" } - -// Admin access required -{ error: "Admin access required" } -``` - -**Validation Errors:** -```typescript -// Missing required fields -{ error: "Missing required fields: username, password" } - -// Invalid field length -{ error: "Username must be between 3 and 50 characters" } - -// Invalid parameters -{ error: "Invalid page parameters. \"from\" and \"to\" must be valid numbers with to >= from >= 0" } - -// Invalid file type -{ error: "Only JSON and .spr files are allowed" } -``` - -**Business Logic Errors:** -```typescript -// Ownership restrictions -{ error: "Access denied - you can only export your own decks" } - -// Feature restrictions -{ error: "Premium subscription required to create groups" } - -// Duplicate data -{ error: "Deck with this name already exists" } -{ error: "Username or email already exists" } -``` - ---- - -## WebSocket Real-Time Communication - -### Connection & Authentication - -Connect to WebSocket server with JWT authentication: - -```typescript -import io from 'socket.io-client'; - -// Option 1: JWT token in auth -const socket = io('http://localhost:3000', { - auth: { - token: 'your-jwt-token' - } -}); - -// Option 2: Cookie authentication -const socket = io('http://localhost:3000', { - withCredentials: true -}); -``` - -### Connection Events -```typescript -// Connection successful -socket.on('connect', () => { - console.log('Connected to WebSocket server'); -}); - -// Authentication failed -socket.on('connect_error', (error) => { - console.error('Connection failed:', error.message); -}); - -// Disconnected -socket.on('disconnect', (reason) => { - console.log('Disconnected:', reason); -}); - -// General errors -socket.on('error', (error: { message: string }) => { - console.error('WebSocket error:', error.message); -}); -``` - -### Chat Management Events - -**Initial Chat List:** -```typescript -// Automatically sent on connection -socket.on('chats:list', (chats: Array<{ - id: string; - type: ChatType; - name: string | null; - users: string[]; - lastActivity: Date | null; - isArchived: boolean; -}>) => { - // Update chat list in UI -}); -``` - -**Join/Leave Chat:** -```typescript -// Join a chat room -socket.emit('chat:join', { chatId: 'chat-uuid' }); - -// Confirmation of joining -socket.on('chat:joined', (data: { - chatId: string; - messages: Message[]; - users: string[]; -}) => { - // Load chat messages -}); - -// Leave a chat room -socket.emit('chat:leave', { chatId: 'chat-uuid' }); - -// Confirmation of leaving -socket.on('chat:left', (data: { chatId: string }) => { - // Update UI -}); -``` - -### Real-time Messaging - -**Send/Receive Messages:** -```typescript -// Send message -socket.emit('message:send', { - chatId: 'chat-uuid', - message: 'Hello everyone!' -}); - -// Receive message -socket.on('message:received', (data: { - chatId: string; - message: Message; - senderInfo?: { - username: string; - fname: string; - lname: string; - }; -}) => { - // Add message to chat UI -}); - -// Message sent confirmation -socket.on('message:sent', (data: { - chatId: string; - messageId: string; - timestamp: Date; -}) => { - // Update UI -}); -``` - -**Rate Limiting:** 100 messages per user per minute - -### Chat Creation Events - -**Create Group Chat (Premium Only):** -```typescript -// Create group -socket.emit('group:create', { - name: 'Study Group', - userIds: ['user-uuid-1', 'user-uuid-2'] -}); - -// Group created -socket.on('group:created', (data: { - chat: { - id: string; - type: 'group'; - name: string; - users: string[]; - createdBy: string; - }; -}) => { - // Add to chat list -}); - -// Creation failed -socket.on('group:creation:failed', (data: { - error: string; -}) => { - // Show error -}); -``` - -**Create Direct Chat:** -```typescript -// Create or get direct chat -socket.emit('chat:direct', { - targetUserId: 'user-uuid' -}); - -// Chat created -socket.on('chat:direct:created', (data: { - chat: { - id: string; - type: 'direct'; - users: string[]; - }; -}) => { - // Add to list -}); - -// Chat already exists -socket.on('chat:direct:exists', (data: { - chatId: string; -}) => { - // Navigate to existing chat -}); -``` - -**Create Game Chat:** -```typescript -// Create game chat -socket.emit('game:chat:create', { - gameId: 'game-uuid', - gameName: 'Quiz Game #123', - playerIds: ['player-uuid-1', 'player-uuid-2'] -}); - -// Game chat created -socket.on('game:chat:created', (data: { - chat: { - id: string; - type: 'game'; - name: string; - gameId: string; - users: string[]; - }; -}) => { - // Show game chat -}); -``` - -### Chat History Management - -**Get Chat History:** -```typescript -// Request full history -socket.emit('chat:history', { chatId: 'chat-uuid' }); - -// Receive active chat history -socket.on('chat:history', (data: { - chatId: string; - messages: Message[]; - users: string[]; - type: ChatType; - name: string | null; -}) => { - // Display full history -}); - -// Receive archived chat history -socket.on('chat:history:archived', (data: { - chatId: string; - messages: Message[]; - isGameChat: boolean; - archiveDate: Date; -}) => { - // Display as read-only -}); -``` - -### Message Retention Rules -- **All chats**: Messages older than 2 weeks are deleted -- **Direct & Game chats**: Max 10 messages per user (FIFO) -- **Group chats**: Time limit only (no per-user limit) -- **Archive**: Inactive chats (30 minutes) are archived -- **Cleanup**: Archived messages cleaned after 4 weeks - -### Complete Implementation Example - -```typescript -// hooks/useWebSocket.ts -import { useEffect, useRef, useState } from 'react'; -import io, { Socket } from 'socket.io-client'; - -export const useWebSocket = (token: string | null) => { - const socketRef = useRef(null); - const [isConnected, setIsConnected] = useState(false); - const [chats, setChats] = useState([]); - - useEffect(() => { - if (!token) return; - - socketRef.current = io('http://localhost:3000', { - auth: { token }, - withCredentials: true - }); - - const socket = socketRef.current; - - socket.on('connect', () => setIsConnected(true)); - socket.on('connect_error', () => setIsConnected(false)); - socket.on('disconnect', () => setIsConnected(false)); - - socket.on('chats:list', (chatList) => { - setChats(chatList); - }); - - socket.on('message:received', (data) => { - setChats(prev => prev.map(chat => - chat.id === data.chatId - ? { ...chat, messages: [...chat.messages, data.message] } - : chat - )); - }); - - return () => { - socket.disconnect(); - }; - }, [token]); - - const sendMessage = (chatId: string, message: string) => { - socketRef.current?.emit('message:send', { chatId, message }); - }; - - const joinChat = (chatId: string) => { - socketRef.current?.emit('chat:join', { chatId }); - }; - - const createDirectChat = (targetUserId: string) => { - socketRef.current?.emit('chat:direct', { targetUserId }); - }; - - const createGroup = (name: string, userIds: string[]) => { - socketRef.current?.emit('group:create', { name, userIds }); - }; - - return { - socket: socketRef.current, - isConnected, - chats, - sendMessage, - joinChat, - createDirectChat, - createGroup - }; -}; -``` - ---- - -This documentation provides a complete reference for all 50+ endpoints available in the SerpentRace backend API, with accurate data structures, validation rules, and implementation examples derived directly from the TypeScript source code. diff --git a/Documentations/PGADMIN_GUIDE.md b/Documentations/PGADMIN_GUIDE.md deleted file mode 100644 index 4b0e01d6..00000000 --- a/Documentations/PGADMIN_GUIDE.md +++ /dev/null @@ -1,117 +0,0 @@ -# pgAdmin Database Administration Guide - -## Access pgAdmin - -- **URL**: http://localhost:8080 -- **Email**: admin@serpentrace.dev -- **Password**: admin - -## Pre-configured Server - -The pgAdmin interface should have a pre-configured server named **"SerpentRace PostgreSQL Dev"** in the "Development" group. - -## Manual Server Configuration (If Needed) - -If the server is not automatically configured, add it manually: - -### Server Details -- **Name**: SerpentRace PostgreSQL Dev -- **Host**: postgres (or localhost if connecting from outside Docker) -- **Port**: 5432 -- **Database**: serpentrace -- **Username**: postgres -- **Password**: postgres - -### Steps to Add Server Manually - -1. Right-click on "Servers" in the left panel -2. Select "Register" > "Server..." -3. Fill in the "General" tab: - - Name: `SerpentRace PostgreSQL Dev` - - Server group: `Development` -4. Fill in the "Connection" tab: - - Host name/address: `postgres` - - Port: `5432` - - Maintenance database: `serpentrace` - - Username: `postgres` - - Password: `postgres` -5. Click "Save" - -## Common Database Operations - -### View Tables -1. Expand the server connection -2. Expand "Databases" > "serpentrace" -3. Expand "Schemas" > "public" -4. Expand "Tables" - -### Run SQL Queries -1. Right-click on the database name -2. Select "Query Tool" -3. Write your SQL queries in the editor -4. Click the "Execute" button or press F5 - -### View Data -1. Right-click on any table -2. Select "View/Edit Data" > "All Rows" - -## Troubleshooting - -### Connection Issues -- Ensure Docker containers are running: `docker ps` -- Check container logs: `docker logs serpentrace-postgres-dev` -- Test connections: `npm run test:connections` - -### Authentication Failed -- Verify the password is correct: `postgres` -- Check if you're using the correct hostname: `postgres` (inside Docker) vs `localhost` (outside Docker) - -### Server Not Appearing -- Restart pgAdmin container: - ```bash - docker-compose -f docker-compose.dev.yml restart pgadmin - ``` -- Clear browser cache and reload - -## Development Tips - -### Useful SQL Queries - -```sql --- List all tables -SELECT table_name FROM information_schema.tables -WHERE table_schema = 'public'; - --- Check database size -SELECT pg_size_pretty(pg_database_size('serpentrace')); - --- View active connections -SELECT * FROM pg_stat_activity WHERE datname = 'serpentrace'; - --- Check migration status (if using TypeORM) -SELECT * FROM migrations ORDER BY timestamp DESC; -``` - -### Database Backup -1. Right-click on database name -2. Select "Backup..." -3. Choose format (Custom recommended for pgAdmin restore) -4. Set filename and location -5. Click "Backup" - -### Database Restore -1. Right-click on "Databases" -2. Select "Restore..." -3. Choose the backup file -4. Configure options as needed -5. Click "Restore" - -## Security Notes - -⚠️ **Development Only**: The current configuration uses default credentials and is intended for development only. For production: - -- Use strong, unique passwords -- Enable SSL connections -- Restrict network access -- Use environment variables for credentials -- Enable authentication and authorization features diff --git a/README.md b/README.md deleted file mode 100644 index a0fccc0f..00000000 --- a/README.md +++ /dev/null @@ -1,28 +0,0 @@ -# SerpentRace - -- Frontend: React (Vite) -- Backend: Node.js (Express.js) - -## Development Commands - -### Start with File Watchers (Recommended) -```bash -# Windows -.\docker-manage.bat dev:watch - -# Linux/Mac -./docker-manage.sh dev:watch -``` -Automatically syncs file changes and rebuilds containers when needed. - -### Traditional Start -```bash -# Windows -.\docker-manage.bat dev:start - -# Linux/Mac -./docker-manage.sh dev:start -``` - -## Documentation -- [Docker Watcher Guide](./Documentations/DOCKER_WATCHER_GUIDE.md) - Comprehensive guide for file watching functionality \ No newline at end of file diff --git a/SerpentRace_Backend/.dockerignore b/SerpentRace_Backend/.dockerignore deleted file mode 100644 index fb8f96bb..00000000 --- a/SerpentRace_Backend/.dockerignore +++ /dev/null @@ -1,27 +0,0 @@ -node_modules -npm-debug.log -.git -.gitignore -README.md -.env -.nyc_output -coverage -.coverage -.coverage.* -.cache -logs -*.log -.DS_Store -.vscode -.idea -*.swp -*.swo -dist -build -.next -.nuxt -.vuepress/dist -.serverless -.fusebox/ -.dynamodb/ -.tern-port diff --git a/SerpentRace_Backend/.env.dev b/SerpentRace_Backend/.env.dev deleted file mode 100644 index 0979d16d..00000000 --- a/SerpentRace_Backend/.env.dev +++ /dev/null @@ -1,34 +0,0 @@ -# Development Environment Variables for Local Build -# These are used when running build scripts outside of Docker containers - -NODE_ENV=development -PORT=3000 - -# Database Configuration (Docker containers) -DB_HOST=localhost -DB_PORT=5432 -DB_NAME=serpentrace -DB_USERNAME=postgres -DB_PASSWORD=postgres - -# Redis Configuration (Docker containers) -REDIS_HOST=localhost -REDIS_PORT=6379 -REDIS_URL=redis://localhost:6379 - -# JWT Configuration -JWT_SECRET=dev_jwt_secret_change_in_production -JWT_EXPIRATION=24h -JWT_REFRESH_EXPIRATION=7d - -# MinIO Configuration (Docker containers) -MINIO_ENDPOINT=localhost -MINIO_PORT=9000 -MINIO_ACCESS_KEY=serpentrace -MINIO_SECRET_KEY=serpentrace123! -MINIO_USE_SSL=false - -# Board Generation Configuration -MAX_SPECIAL_FIELDS_PERCENTAGE=67 -MAX_GENERATION_TIME_SECONDS=20 -GENERATION_ERROR_TOLERANCE=15 diff --git a/SerpentRace_Backend/.gitignore b/SerpentRace_Backend/.gitignore deleted file mode 100644 index fa68779d..00000000 --- a/SerpentRace_Backend/.gitignore +++ /dev/null @@ -1,4 +0,0 @@ -./dist/* -./node_modules/* -./Archive_*/* -./Archive_* \ No newline at end of file diff --git a/SerpentRace_Backend/jest.config.js b/SerpentRace_Backend/jest.config.js deleted file mode 100644 index 929a0400..00000000 --- a/SerpentRace_Backend/jest.config.js +++ /dev/null @@ -1,28 +0,0 @@ -module.exports = { - preset: 'ts-jest', - testEnvironment: 'node', - roots: ['/tests', '/src'], - testMatch: ['**/__tests__/**/*.ts', '**/?(*.)+(spec|test).ts'], - transform: { - '^.+\\.ts$': 'ts-jest', - }, - collectCoverageFrom: [ - 'src/**/*.ts', - '!src/**/*.d.ts', - '!src/Api/index.ts', - '!src/Infrastructure/ormconfig.ts', - '!src/search-demo.ts' - ], - coverageDirectory: 'coverage', - coverageReporters: ['text', 'lcov', 'html'], - moduleFileExtensions: ['ts', 'js', 'json'], - setupFilesAfterEnv: ['/tests/setup.ts'], - testTimeout: 10000, - setupFiles: ['/tests/jest.setup.ts'], - verbose: true, - moduleNameMapper: { - '^@/(.*)$': '/src/$1' - }, - resolver: undefined, - moduleDirectories: ['node_modules', '/src', '/tests'] -}; diff --git a/SerpentRace_Backend/language-test.js b/SerpentRace_Backend/language-test.js deleted file mode 100644 index 4895e213..00000000 --- a/SerpentRace_Backend/language-test.js +++ /dev/null @@ -1,29 +0,0 @@ -// Quick test to demonstrate the language detection functionality -const { extractLanguageFromAcceptHeader } = require('./src/Api/contactRouter.js'); - -// Test cases to demonstrate Accept-Language parsing -const testCases = [ - 'en-US,en;q=0.9', - 'hu,en;q=0.9', - 'de-DE,de;q=0.9,en-US;q=0.8,en;q=0.7', - 'hu-HU,hu;q=0.9,en-US;q=0.8', - 'fr-FR,fr;q=0.9,en;q=0.8', - 'es,en-US;q=0.9,en;q=0.8', - 'invalid-header', - '' -]; - -console.log('Testing Accept-Language header parsing:\n'); - -testCases.forEach(header => { - const result = extractLanguageFromAcceptHeader(header); - console.log(`Header: "${header}" -> Language: ${result}`); -}); - -console.log('\n✅ Multi-language system is working correctly!'); -console.log('\nFeatures implemented:'); -console.log('- Accept-Language header parsing with quality values'); -console.log('- Support for EN, HU, DE templates'); -console.log('- Custom header detection (X-Language, X-Region, X-Locale)'); -console.log('- Fallback to English for unsupported languages'); -console.log('- Professional email templates in all three languages'); diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-256Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-256Z.log deleted file mode 100644 index 200057e3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-256Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.256Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.402Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-353Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-353Z.log deleted file mode 100644 index a4494d9e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-353Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.353Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.505Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-369Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-369Z.log deleted file mode 100644 index 34d672d9..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-369Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.369Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.527Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-512Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-512Z.log deleted file mode 100644 index 44982f68..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-512Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.512Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.644Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-530Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-530Z.log deleted file mode 100644 index dda0539f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-530Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.530Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-534Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-534Z.log deleted file mode 100644 index 8b4d0bd4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-534Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.534Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.648Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:28.707Z | [DATABASE] | User lookup completed | Meta:{"executionTime":59,"found":true,"searchBy":"username"} -2025-08-22T23:55:28.710Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:55:28.712Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":64} -2025-08-22T23:55:28.718Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-22T23:55:28.720Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-22T23:55:28.721Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:55:28.723Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":5} -2025-08-22T23:55:28.729Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-22T23:55:28.736Z | [DATABASE] | User lookup completed | Meta:{"executionTime":7,"found":false,"searchBy":"username"} -2025-08-22T23:55:28.737Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-22T23:55:28.741Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:28.744Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":true,"searchBy":"username"} -2025-08-22T23:55:28.745Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-22T23:55:28.748Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-22T23:55:28.757Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:28.760Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":true,"searchBy":"username"} -2025-08-22T23:55:28.774Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:28.780Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:28.786Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:28.790Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":10} -2025-08-22T23:55:28.798Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:28.800Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-22T23:55:28.803Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:55:28.824Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-22T23:55:28.832Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-22T23:55:28.975Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-683Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-683Z.log deleted file mode 100644 index 62ab85b3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-683Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.683Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.991Z | [DATABASE] | User created successfully | Meta:{"executionTime":31,"userId":"4366063b-1247-41e1-a66a-5747cc133a00","username":"testuser1_1755906928960","email":"test1_1755906928960@example.com"} -2025-08-22T23:55:29.044Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"db3cb66f-0a8c-449d-8b67-3eae3780fb78","username":"testuser2_1755906929035","email":"test2_1755906929035@example.com"} -2025-08-22T23:55:29.050Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"bf2e61a6-d3eb-4ae3-ac6f-09b7e711c20d","username":"premiumuser_1755906929045","email":"premium_1755906929045@example.com"} -2025-08-22T23:55:29.058Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"50139b72-f8ed-4ad3-87ec-5696b9be86af","type":"direct","participants":2} -2025-08-22T23:55:29.070Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"b6fa184a-3d7c-426e-a60a-ba4395114ef2","username":"testuser1_1755906929064","email":"test1_1755906929064@example.com"} -2025-08-22T23:55:29.076Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"818314c0-a31e-4182-b32d-9d0fe4f4a343","username":"testuser2_1755906929071","email":"test2_1755906929071@example.com"} -2025-08-22T23:55:29.082Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"55e2067f-8868-4a1f-ae89-90fc2e24d3ff","username":"premiumuser_1755906929077","email":"premium_1755906929077@example.com"} -2025-08-22T23:55:29.090Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":7,"chatId":"251a88c4-0a3a-4f9b-8204-acbc3ad0e052","type":"group","participants":3} -2025-08-22T23:55:29.098Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"93df416d-5df5-429b-8dc1-359d878844aa","username":"testuser1_1755906929092","email":"test1_1755906929092@example.com"} -2025-08-22T23:55:29.103Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"4205c67a-76b6-4f1e-be1f-2e6f6d7b3d5a","username":"testuser2_1755906929099","email":"test2_1755906929099@example.com"} -2025-08-22T23:55:29.108Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"c7b22b7d-5e6f-489c-9499-43d56d8248a7","username":"premiumuser_1755906929104","email":"premium_1755906929104@example.com"} -2025-08-22T23:55:29.114Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"ed97f881-aa5e-482d-81dc-dbefbff6ea33","type":"game","participants":2} -2025-08-22T23:55:29.119Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"06b8110f-0908-4386-a01a-22a86a2c0886","username":"testuser1_1755906929115","email":"test1_1755906929115@example.com"} -2025-08-22T23:55:29.125Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"e992a300-5f48-4490-8e48-2a8fc22c167d","username":"testuser2_1755906929120","email":"test2_1755906929120@example.com"} -2025-08-22T23:55:29.129Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"59c226fb-cf86-4a72-a408-ad7045fad18c","username":"premiumuser_1755906929126","email":"premium_1755906929126@example.com"} -2025-08-22T23:55:29.134Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"bde9e9b7-a04c-4d69-a295-2e99257da795","type":"game","participants":2} -2025-08-22T23:55:29.148Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(7835e237-8a37-48f8-b208-16f35e6edc31)","executionTime":12,"gameId":"7835e237-8a37-48f8-b208-16f35e6edc31","found":true} -2025-08-22T23:55:29.153Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"749e8f41-2226-401f-83c6-ebc6b7f6d4ef","username":"testuser1_1755906929150","email":"test1_1755906929150@example.com"} -2025-08-22T23:55:29.159Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"78542054-a117-4fdc-8613-ef349097e28e","username":"testuser2_1755906929154","email":"test2_1755906929154@example.com"} -2025-08-22T23:55:29.165Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"6969240d-ead3-48c4-8c0b-bec35e546bc6","username":"premiumuser_1755906929160","email":"premium_1755906929160@example.com"} -2025-08-22T23:55:29.170Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"57b03945-b5b8-445b-bd4f-82ba7a4aad6f","type":"direct","participants":2} -2025-08-22T23:55:29.180Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"57b03945-b5b8-445b-bd4f-82ba7a4aad6f"} -2025-08-22T23:55:29.181Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(57b03945-b5b8-445b-bd4f-82ba7a4aad6f)","executionTime":10,"chatId":"57b03945-b5b8-445b-bd4f-82ba7a4aad6f","updatedFields":["messages","lastActivity"],"success":true} -2025-08-22T23:55:29.184Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"57b03945-b5b8-445b-bd4f-82ba7a4aad6f"} -2025-08-22T23:55:29.189Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"30c872d3-448f-4a06-8ff5-2cc34facc971","username":"testuser1_1755906929185","email":"test1_1755906929185@example.com"} -2025-08-22T23:55:29.193Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"d9cb951e-7bec-4e63-84bd-b13c9e079096","username":"testuser2_1755906929190","email":"test2_1755906929190@example.com"} -2025-08-22T23:55:29.199Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"5bea269d-3cf0-4a01-8e96-22edf09f72b0","username":"premiumuser_1755906929194","email":"premium_1755906929194@example.com"} -2025-08-22T23:55:29.204Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"418f0a1b-cc06-46c6-8cf6-57d85a426376","type":"direct","participants":2} -2025-08-22T23:55:29.212Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(418f0a1b-cc06-46c6-8cf6-57d85a426376)","executionTime":7,"chatId":"418f0a1b-cc06-46c6-8cf6-57d85a426376","messageCount":1,"archiveId":"32b168aa-99c5-4b13-a6c5-543ca597b076"} -2025-08-22T23:55:29.215Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"418f0a1b-cc06-46c6-8cf6-57d85a426376"} -2025-08-22T23:55:29.220Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"dc4c535b-62ba-43c2-8284-f26801ef3c54","username":"testuser1_1755906929216","email":"test1_1755906929216@example.com"} -2025-08-22T23:55:29.224Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"60724bd0-60b4-47b2-86e0-df664471781a","username":"testuser2_1755906929221","email":"test2_1755906929221@example.com"} -2025-08-22T23:55:29.229Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"5e28df07-7fc4-4989-966f-332dd98c943e","username":"premiumuser_1755906929225","email":"premium_1755906929225@example.com"} -2025-08-22T23:55:29.234Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"1e6c88b6-ee22-47ba-b34c-83e951f0ebc8","type":"direct","participants":2} -2025-08-22T23:55:29.240Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(1e6c88b6-ee22-47ba-b34c-83e951f0ebc8)","executionTime":5,"chatId":"1e6c88b6-ee22-47ba-b34c-83e951f0ebc8","messageCount":1,"archiveId":"7401989f-d097-4c8d-bab5-6f9fbd9538b9"} -2025-08-22T23:55:29.243Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(1e6c88b6-ee22-47ba-b34c-83e951f0ebc8)","executionTime":3,"chatId":"1e6c88b6-ee22-47ba-b34c-83e951f0ebc8","found":true} -2025-08-22T23:55:29.250Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"d17f2b03-8f53-46da-83e7-a512800b1718","username":"testuser1_1755906929244","email":"test1_1755906929244@example.com"} -2025-08-22T23:55:29.254Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"637e4680-1a34-4502-a944-e5a4ecb7ec13","username":"testuser2_1755906929251","email":"test2_1755906929251@example.com"} -2025-08-22T23:55:29.259Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"e54ec335-986d-40b0-bd48-9d08dd0d70fe","username":"premiumuser_1755906929255","email":"premium_1755906929255@example.com"} -2025-08-22T23:55:29.265Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"6daa084f-c842-4733-bdbb-03e65a9b0ac5","type":"direct","participants":2} -2025-08-22T23:55:29.270Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"24e3f379-8e73-4d1a-ad88-13ef9163925b","type":"group","participants":2} -2025-08-22T23:55:29.274Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(d17f2b03-8f53-46da-83e7-a512800b1718)","executionTime":3,"userId":"d17f2b03-8f53-46da-83e7-a512800b1718","count":2} -2025-08-22T23:55:29.279Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"fd15dc30-3a08-4359-a37f-a2c3ad748d0b","username":"testuser1_1755906929275","email":"test1_1755906929275@example.com"} -2025-08-22T23:55:29.283Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"4589891d-48eb-4e91-9591-3beecc29d82f","username":"testuser2_1755906929280","email":"test2_1755906929280@example.com"} -2025-08-22T23:55:29.288Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"7fd4a8a9-0fcf-4a8b-8543-507f8466606b","username":"premiumuser_1755906929285","email":"premium_1755906929285@example.com"} -2025-08-22T23:55:29.294Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"bf378cb6-e8e2-4124-9ac4-95445e678085","type":"direct","participants":2} -2025-08-22T23:55:29.297Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(fd15dc30-3a08-4359-a37f-a2c3ad748d0b)","executionTime":2,"userId":"fd15dc30-3a08-4359-a37f-a2c3ad748d0b","count":1} -2025-08-22T23:55:29.302Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"b4e53162-db8c-4d21-87e1-b49dfdf655c6","username":"testuser1_1755906929298","email":"test1_1755906929298@example.com"} -2025-08-22T23:55:29.307Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"502c1ea0-57d8-4b81-9640-5bf06c930988","username":"testuser2_1755906929303","email":"test2_1755906929303@example.com"} -2025-08-22T23:55:29.312Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"63706d17-5328-47d5-8452-3f50c0e47256","username":"premiumuser_1755906929308","email":"premium_1755906929308@example.com"} -2025-08-22T23:55:29.316Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":3,"chatId":"f968cc97-2ccc-4864-b2db-d86869580abe","type":"direct","participants":2} -2025-08-22T23:55:29.328Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":11,"inactivityMinutes":60,"count":216,"cutoffDate":"2025-08-22T22:55:29.317Z"} -2025-08-22T23:55:29.340Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-751Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-751Z.log deleted file mode 100644 index fd037613..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-751Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.751Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.807Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-22T23:55:28.870Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-22T23:55:28.880Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-22T23:55:28.898Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-22T23:55:28.909Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-22T23:55:28.981Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-760Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-760Z.log deleted file mode 100644 index 3393c33f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-760Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.760Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.952Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-778Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-778Z.log deleted file mode 100644 index 4eaa3dd7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-778Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.778Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.831Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-22T23:55:29.025Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-838Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-838Z.log deleted file mode 100644 index 3c2c56bc..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-838Z.log +++ /dev/null @@ -1,33 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.838Z -# Max entries per file: 10000 - -2025-08-22T23:55:28.950Z | [STARTUP] | Redis client connected successfully -2025-08-22T23:55:29.129Z | [STARTUP] | Logging service shutting down gracefully -2025-08-22T23:55:29.298Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.343Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.367Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.373Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.381Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.383Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.385Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.388Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-22T23:55:29.390Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.392Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.396Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-22T23:55:29.398Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.400Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.405Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.406Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.408Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.410Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.412Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.413Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.416Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.417Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.418Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.421Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:55:29.424Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.426Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.435Z | [STARTUP] | Redis client connected successfully -2025-08-22T23:55:29.469Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-876Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-876Z.log deleted file mode 100644 index a188e056..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-876Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.876Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.022Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-948Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-948Z.log deleted file mode 100644 index 4ddc2027..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-28-948Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:28.948Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.050Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-021Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-021Z.log deleted file mode 100644 index d53a67c7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-021Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.021Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.326Z | [STARTUP] | Logging service shutting down gracefully -2025-08-22T23:55:30.362Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-600Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-600Z.log deleted file mode 100644 index 1bef46e1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-600Z.log +++ /dev/null @@ -1,32 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.600Z -# Max entries per file: 10000 - -2025-08-22T23:55:32.277Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-22T23:55:32.881Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-22T23:55:33.799Z | [ERROR] | Error sending verification email | Meta:{"name":"TypeError","message":"Cannot read properties of undefined (reading 'email')","stack":"TypeError: Cannot read properties of undefined (reading 'email')\n at CreateUserCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\CreateUserCommandHandler.ts:54:19)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:77:7)"} -2025-08-22T23:55:33.824Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"TypeError","message":"Cannot read properties of undefined (reading 'id')","stack":"TypeError: Cannot read properties of undefined (reading 'id')\n at Function.toShortDto (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\DTOs\\Mappers\\UserMapper.ts:8:16)\n at CreateUserCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\CreateUserCommandHandler.ts:71:25)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:77:7)"} -2025-08-22T23:55:34.006Z | [ERROR] | Error sending verification email | Meta:{"name":"TypeError","message":"Cannot read properties of undefined (reading 'email')","stack":"TypeError: Cannot read properties of undefined (reading 'email')\n at CreateUserCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\CreateUserCommandHandler.ts:54:19)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:97:7)"} -2025-08-22T23:55:34.009Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"TypeError","message":"Cannot read properties of undefined (reading 'id')","stack":"TypeError: Cannot read properties of undefined (reading 'id')\n at Function.toShortDto (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\DTOs\\Mappers\\UserMapper.ts:8:16)\n at CreateUserCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\CreateUserCommandHandler.ts:71:25)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:97:7)"} -2025-08-22T23:55:34.315Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:114:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:34.368Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:34.586Z | [DATABASE] | User lookup completed | Meta:{"executionTime":217,"found":true,"searchBy":"username"} -2025-08-22T23:55:34.837Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":15} -2025-08-22T23:55:34.934Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-22T23:55:34.948Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-22T23:55:34.979Z | [DATABASE] | User lookup completed | Meta:{"executionTime":31,"found":false,"searchBy":"username"} -2025-08-22T23:55:35.029Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-22T23:55:35.161Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:35.223Z | [DATABASE] | User lookup completed | Meta:{"executionTime":62,"found":true,"searchBy":"username"} -2025-08-22T23:55:35.356Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":1} -2025-08-22T23:55:35.401Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-22T23:55:35.468Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:35.470Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-22T23:55:35.506Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-22T23:55:35.542Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-22T23:55:38.498Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-22T23:55:38.504Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-22T23:55:38.509Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:55:38.512Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":false,"searchBy":"username"} -2025-08-22T23:55:38.516Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-22T23:55:40.206Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-721Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-721Z.log deleted file mode 100644 index d2d5920e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-721Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.721Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.743Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.756Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.761Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.768Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.775Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.781Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.787Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.791Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.869Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-722Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-722Z.log deleted file mode 100644 index b286838a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-722Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.722Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.737Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-754Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-754Z.log deleted file mode 100644 index cd8bd905..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-754Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.754Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-780Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-780Z.log deleted file mode 100644 index 975c01b2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-780Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.780Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.797Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-856Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-856Z.log deleted file mode 100644 index a20f1918..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-29-856Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:29.856Z -# Max entries per file: 10000 - -2025-08-22T23:55:29.858Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-22T23:55:29.865Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:29.867Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-22T23:55:29.868Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-22T23:55:29.869Z | [STARTUP] | Test message -2025-08-22T23:55:29.870Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-22T23:55:29.873Z | [STARTUP] | Test for directory creation -2025-08-22T23:55:29.908Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-211Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-211Z.log deleted file mode 100644 index bdff269e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-211Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:30.211Z -# Max entries per file: 10000 - -2025-08-22T23:55:30.224Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:30.226Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:30.227Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:30.240Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:55:30.258Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-292Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-292Z.log deleted file mode 100644 index 346a4c11..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-292Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:30.292Z -# Max entries per file: 10000 - -2025-08-22T23:55:30.295Z | [AUTH] | Authentication successful | ReqId:vjehx5yc6 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-22T23:55:30.301Z | [AUTH] | Authentication failed - No valid token | ReqId:76yyk7gje | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-22T23:55:30.303Z | [AUTH] | Authentication successful | ReqId:3r2w7i9am | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-22T23:55:30.304Z | [AUTH] | Token refreshed | ReqId:fwsexjfon | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-22T23:55:30.306Z | [AUTH] | Admin authentication successful | ReqId:tzeqyatyf | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-22T23:55:30.311Z | [WARNING] | Admin access denied | ReqId:vh9hf4e9v | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-22T23:55:30.317Z | [WARNING] | Admin access denied | ReqId:cgrb86xdn | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-22T23:55:30.322Z | [AUTH] | Admin authentication successful | ReqId:0s8eddr1z | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-22T23:55:30.324Z | [AUTH] | Admin token refreshed | ReqId:s4mq3wig2 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-22T23:55:30.342Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-333Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-333Z.log deleted file mode 100644 index 9526813d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-55-30-333Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:55:30.333Z -# Max entries per file: 10000 - -2025-08-22T23:55:30.353Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-183Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-183Z.log deleted file mode 100644 index 568acb48..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-183Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.183Z -# Max entries per file: 10000 - -2025-08-22T23:59:44.360Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-219Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-219Z.log deleted file mode 100644 index c86457f2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-219Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.219Z -# Max entries per file: 10000 - -2025-08-22T23:59:44.417Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-408Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-408Z.log deleted file mode 100644 index a4657b4d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-408Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.408Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.050Z | [STARTUP] | Logging service shutting down gracefully -2025-08-22T23:59:46.076Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-668Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-668Z.log deleted file mode 100644 index 7ec85274..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-668Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.668Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.312Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.362Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.394Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.402Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.412Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.415Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.420Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.424Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-22T23:59:45.426Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.429Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.433Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-22T23:59:45.437Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.441Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.450Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.452Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.456Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.459Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.462Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.464Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.468Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.471Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.474Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.477Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-22T23:59:45.481Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.500Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.513Z | [STARTUP] | Redis client connected successfully -2025-08-22T23:59:45.550Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-679Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-679Z.log deleted file mode 100644 index b9e67a4a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-679Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.679Z -# Max entries per file: 10000 - -2025-08-22T23:59:44.747Z | [STARTUP] | Redis client connected successfully -2025-08-22T23:59:45.157Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-741Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-741Z.log deleted file mode 100644 index c2a94837..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-741Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.741Z -# Max entries per file: 10000 - -2025-08-22T23:59:44.916Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-801Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-801Z.log deleted file mode 100644 index 183ff9f0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-801Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.801Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.006Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-803Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-803Z.log deleted file mode 100644 index eecf3acb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-803Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.803Z -# Max entries per file: 10000 - -2025-08-22T23:59:44.848Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-22T23:59:45.051Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-826Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-826Z.log deleted file mode 100644 index 264e7e4b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-826Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.826Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.040Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-919Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-919Z.log deleted file mode 100644 index 79279d55..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-919Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.919Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.191Z | [DATABASE] | User created successfully | Meta:{"executionTime":32,"userId":"647e3539-03e7-4eeb-aa70-9b39edfe51c9","username":"testuser1_1755907185159","email":"test1_1755907185159@example.com"} -2025-08-22T23:59:45.240Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"99ad1e7c-3889-4842-8123-a61f56745e2e","username":"testuser2_1755907185234","email":"test2_1755907185234@example.com"} -2025-08-22T23:59:45.247Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"7f6700ac-be70-4c8c-94b4-43ce8cc3b7a1","username":"premiumuser_1755907185242","email":"premium_1755907185242@example.com"} -2025-08-22T23:59:45.257Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":9,"chatId":"502509c9-6111-492d-a44f-b13969c99f0f","type":"direct","participants":2} -2025-08-22T23:59:45.268Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"7715ff38-0ac0-47d8-b99c-6e0c0b422bc9","username":"testuser1_1755907185264","email":"test1_1755907185264@example.com"} -2025-08-22T23:59:45.274Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"4472c9c4-fa20-4b9e-930a-b96914688b86","username":"testuser2_1755907185270","email":"test2_1755907185270@example.com"} -2025-08-22T23:59:45.279Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"42ddd2cd-bc54-43aa-8d83-82bc36e59433","username":"premiumuser_1755907185275","email":"premium_1755907185275@example.com"} -2025-08-22T23:59:45.285Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"4c4d7b87-2f4b-443e-92cc-ff93e4f9aed6","type":"group","participants":3} -2025-08-22T23:59:45.293Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"6cf1e60d-8a5f-415f-b805-85cbf40c677b","username":"testuser1_1755907185287","email":"test1_1755907185287@example.com"} -2025-08-22T23:59:45.299Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"99b6bed9-b48c-46a2-968e-55615b27e9c3","username":"testuser2_1755907185294","email":"test2_1755907185294@example.com"} -2025-08-22T23:59:45.305Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"ec4cd5f3-ab2d-40df-bee0-c22781474e04","username":"premiumuser_1755907185300","email":"premium_1755907185300@example.com"} -2025-08-22T23:59:45.312Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"05ce16ee-e275-4c92-95e0-9318f9e07a9d","type":"game","participants":2} -2025-08-22T23:59:45.317Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"316bf4d9-f828-4062-96c0-c189769b654b","username":"testuser1_1755907185313","email":"test1_1755907185313@example.com"} -2025-08-22T23:59:45.323Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"e251c717-5fca-4bdc-a7e5-a1b37894d2da","username":"testuser2_1755907185318","email":"test2_1755907185318@example.com"} -2025-08-22T23:59:45.328Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"972ee00e-7d70-49af-9f1c-86817fe3d5bd","username":"premiumuser_1755907185324","email":"premium_1755907185324@example.com"} -2025-08-22T23:59:45.334Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"bdcedbb0-7c38-4564-9630-7f798ef2e531","type":"game","participants":2} -2025-08-22T23:59:45.348Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(c312b4be-2dc6-4d56-89f1-d470eb879e9e)","executionTime":13,"gameId":"c312b4be-2dc6-4d56-89f1-d470eb879e9e","found":true} -2025-08-22T23:59:45.354Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"76c2e012-0eef-4bfd-8913-eacd1c1c8a1d","username":"testuser1_1755907185349","email":"test1_1755907185349@example.com"} -2025-08-22T23:59:45.359Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"89b40dfc-26f7-461f-a1dc-82b6eab9d911","username":"testuser2_1755907185355","email":"test2_1755907185355@example.com"} -2025-08-22T23:59:45.363Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"2fc7eae8-5302-430a-8525-c3ed21603d2c","username":"premiumuser_1755907185360","email":"premium_1755907185360@example.com"} -2025-08-22T23:59:45.368Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"9d378457-4039-48b7-844a-45efdf85a463","type":"direct","participants":2} -2025-08-22T23:59:45.378Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"9d378457-4039-48b7-844a-45efdf85a463"} -2025-08-22T23:59:45.379Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(9d378457-4039-48b7-844a-45efdf85a463)","executionTime":10,"chatId":"9d378457-4039-48b7-844a-45efdf85a463","updatedFields":["messages","lastActivity"],"success":true} -2025-08-22T23:59:45.382Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"9d378457-4039-48b7-844a-45efdf85a463"} -2025-08-22T23:59:45.388Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"3184ff71-8c72-4555-a6ef-da87e96d13a1","username":"testuser1_1755907185383","email":"test1_1755907185383@example.com"} -2025-08-22T23:59:45.392Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"a3238ff2-e73b-42db-92ba-7d0508dcc377","username":"testuser2_1755907185389","email":"test2_1755907185389@example.com"} -2025-08-22T23:59:45.398Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"22565aa3-ca10-4656-a41a-2a5910ebd884","username":"premiumuser_1755907185393","email":"premium_1755907185393@example.com"} -2025-08-22T23:59:45.403Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"9634e95f-3b70-4012-a9e3-f50ed1f8ac04","type":"direct","participants":2} -2025-08-22T23:59:45.414Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(9634e95f-3b70-4012-a9e3-f50ed1f8ac04)","executionTime":10,"chatId":"9634e95f-3b70-4012-a9e3-f50ed1f8ac04","messageCount":1,"archiveId":"e0253136-a59a-4f6e-a335-6f1441748e68"} -2025-08-22T23:59:45.417Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"9634e95f-3b70-4012-a9e3-f50ed1f8ac04"} -2025-08-22T23:59:45.424Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"286901a2-6b82-4ff7-bc02-e7a0095cb0f4","username":"testuser1_1755907185418","email":"test1_1755907185418@example.com"} -2025-08-22T23:59:45.431Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"372cc641-a0df-419f-b504-28526515ae80","username":"testuser2_1755907185425","email":"test2_1755907185425@example.com"} -2025-08-22T23:59:45.438Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"c8c0ca37-903e-40cf-9fba-7fba81348ed8","username":"premiumuser_1755907185432","email":"premium_1755907185432@example.com"} -2025-08-22T23:59:45.445Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"d7681988-b4a4-4be5-bddb-3132c5db6e35","type":"direct","participants":2} -2025-08-22T23:59:45.454Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(d7681988-b4a4-4be5-bddb-3132c5db6e35)","executionTime":8,"chatId":"d7681988-b4a4-4be5-bddb-3132c5db6e35","messageCount":1,"archiveId":"aac9428e-5a07-4cf4-a7f4-9f98b08828b1"} -2025-08-22T23:59:45.458Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(d7681988-b4a4-4be5-bddb-3132c5db6e35)","executionTime":3,"chatId":"d7681988-b4a4-4be5-bddb-3132c5db6e35","found":true} -2025-08-22T23:59:45.463Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"f98697c7-e4ef-43d4-822e-68ca364f1d57","username":"testuser1_1755907185459","email":"test1_1755907185459@example.com"} -2025-08-22T23:59:45.469Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"a46a7de5-85d5-41de-acd0-e1afc5b1aee7","username":"testuser2_1755907185464","email":"test2_1755907185464@example.com"} -2025-08-22T23:59:45.474Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"8a56a89a-d884-4bcf-be0d-ce8967f942bc","username":"premiumuser_1755907185470","email":"premium_1755907185470@example.com"} -2025-08-22T23:59:45.480Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"98a8f892-c2ba-4d4d-a848-411dfe86a201","type":"direct","participants":2} -2025-08-22T23:59:45.485Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"deecc2b6-0c01-44bc-b93a-170902f08f9d","type":"group","participants":2} -2025-08-22T23:59:45.489Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(f98697c7-e4ef-43d4-822e-68ca364f1d57)","executionTime":3,"userId":"f98697c7-e4ef-43d4-822e-68ca364f1d57","count":2} -2025-08-22T23:59:45.495Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"36bda52a-9f10-4c78-8dbe-9f5d804ddb6e","username":"testuser1_1755907185491","email":"test1_1755907185491@example.com"} -2025-08-22T23:59:45.501Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"c2f4b1e3-04b2-42b2-a01f-e8d82958e94a","username":"testuser2_1755907185496","email":"test2_1755907185496@example.com"} -2025-08-22T23:59:45.507Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"ef01bad0-4a83-40ec-971a-6f32320b33a5","username":"premiumuser_1755907185502","email":"premium_1755907185502@example.com"} -2025-08-22T23:59:45.513Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"472a4679-767b-4844-89c8-d7db8388012c","type":"direct","participants":2} -2025-08-22T23:59:45.517Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(36bda52a-9f10-4c78-8dbe-9f5d804ddb6e)","executionTime":3,"userId":"36bda52a-9f10-4c78-8dbe-9f5d804ddb6e","count":1} -2025-08-22T23:59:45.528Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"4f3b36d6-8e94-4d40-86fc-f3304fb2291e","username":"testuser1_1755907185522","email":"test1_1755907185522@example.com"} -2025-08-22T23:59:45.533Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"c5d95504-616a-4007-940c-fb27560f9196","username":"testuser2_1755907185529","email":"test2_1755907185529@example.com"} -2025-08-22T23:59:45.539Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"7fa7574f-6055-4d1f-8b26-2bbb55ccec47","username":"premiumuser_1755907185534","email":"premium_1755907185534@example.com"} -2025-08-22T23:59:45.545Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"a412b72a-4607-4afe-87a0-8b0da02375c4","type":"direct","participants":2} -2025-08-22T23:59:45.556Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":10,"inactivityMinutes":60,"count":233,"cutoffDate":"2025-08-22T22:59:45.546Z"} -2025-08-22T23:59:45.571Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-970Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-970Z.log deleted file mode 100644 index 26e3fbfc..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-44-970Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:44.970Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.013Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-22T23:59:45.092Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-22T23:59:45.099Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-22T23:59:45.104Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-22T23:59:45.111Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-22T23:59:45.177Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-011Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-011Z.log deleted file mode 100644 index abe2d135..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-011Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:45.011Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.168Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-014Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-014Z.log deleted file mode 100644 index 5e3334e4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-014Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:45.014Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.109Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:45.178Z | [DATABASE] | User lookup completed | Meta:{"executionTime":69,"found":true,"searchBy":"username"} -2025-08-22T23:59:45.179Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:59:45.180Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":71} -2025-08-22T23:59:45.196Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-22T23:59:45.207Z | [DATABASE] | User lookup completed | Meta:{"executionTime":11,"found":true,"searchBy":"username"} -2025-08-22T23:59:45.208Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:59:45.209Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":13} -2025-08-22T23:59:45.213Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-22T23:59:45.215Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-22T23:59:45.216Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-22T23:59:45.219Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:45.220Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-22T23:59:45.221Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-22T23:59:45.222Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-22T23:59:45.231Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:45.232Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-22T23:59:45.241Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.245Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:45.247Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.253Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":8} -2025-08-22T23:59:45.260Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:45.261Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-22T23:59:45.270Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:59:45.271Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-22T23:59:45.274Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-22T23:59:45.314Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-131Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-131Z.log deleted file mode 100644 index 8205d63f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-131Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:45.131Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.224Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-687Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-687Z.log deleted file mode 100644 index e90605c1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-687Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:45.687Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.711Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.726Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.732Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.741Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.751Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.757Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.764Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.769Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:45.842Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-814Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-814Z.log deleted file mode 100644 index 2650c0c0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-814Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:45.814Z -# Max entries per file: 10000 - -2025-08-22T23:59:45.834Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-926Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-926Z.log deleted file mode 100644 index ea4baca6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-45-926Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:45.926Z -# Max entries per file: 10000 - -2025-08-22T23:59:48.202Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-22T23:59:48.522Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-22T23:59:48.955Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:48.973Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:48.981Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:48.995Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:49.049Z | [DATABASE] | User lookup completed | Meta:{"executionTime":54,"found":true,"searchBy":"username"} -2025-08-22T23:59:49.056Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:59:49.063Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":68} -2025-08-22T23:59:49.075Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-22T23:59:49.084Z | [DATABASE] | User lookup completed | Meta:{"executionTime":9,"found":false,"searchBy":"username"} -2025-08-22T23:59:49.095Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-22T23:59:49.105Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:49.110Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-22T23:59:49.117Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-22T23:59:49.134Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-22T23:59:49.147Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:49.159Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":true,"searchBy":"username"} -2025-08-22T23:59:49.163Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-22T23:59:49.167Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":20} -2025-08-22T23:59:51.770Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-22T23:59:51.775Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-22T23:59:51.786Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-22T23:59:51.797Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":false,"searchBy":"username"} -2025-08-22T23:59:51.802Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-22T23:59:52.300Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-138Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-138Z.log deleted file mode 100644 index 22832664..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-138Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:46.138Z -# Max entries per file: 10000 - -2025-08-22T23:59:46.150Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:46.152Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:46.153Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:46.156Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:46.175Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-267Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-267Z.log deleted file mode 100644 index 62830fbd..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-267Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:46.267Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-308Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-308Z.log deleted file mode 100644 index ccb740d3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-308Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:46.308Z -# Max entries per file: 10000 - -2025-08-22T23:59:46.410Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-517Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-517Z.log deleted file mode 100644 index 22e59dcc..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-517Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:46.517Z -# Max entries per file: 10000 - -2025-08-22T23:59:46.522Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-22T23:59:46.536Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-22T23:59:46.537Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-22T23:59:46.540Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-22T23:59:46.541Z | [STARTUP] | Test message -2025-08-22T23:59:46.550Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-22T23:59:46.555Z | [STARTUP] | Test for directory creation -2025-08-22T23:59:46.659Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-522Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-522Z.log deleted file mode 100644 index 9a56814f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-522Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:46.522Z -# Max entries per file: 10000 - -2025-08-22T23:59:46.525Z | [AUTH] | Authentication successful | ReqId:5n4ngau54 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-22T23:59:46.532Z | [AUTH] | Authentication failed - No valid token | ReqId:l6ha64cl8 | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-22T23:59:46.535Z | [AUTH] | Authentication successful | ReqId:4by1h40xn | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-22T23:59:46.536Z | [AUTH] | Token refreshed | ReqId:bn1s3v11v | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-22T23:59:46.539Z | [AUTH] | Admin authentication successful | ReqId:a4mu76qgt | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-22T23:59:46.548Z | [WARNING] | Admin access denied | ReqId:dyqf5lenf | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-22T23:59:46.555Z | [WARNING] | Admin access denied | ReqId:8eovgqfy1 | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-22T23:59:46.569Z | [AUTH] | Admin authentication successful | ReqId:9fg9eodxr | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-22T23:59:46.574Z | [AUTH] | Admin token refreshed | ReqId:rpja9vt7s | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-22T23:59:46.624Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-541Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-541Z.log deleted file mode 100644 index 75b9196b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-22T23-59-46-541Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-22T23:59:46.541Z -# Max entries per file: 10000 - -2025-08-22T23:59:46.574Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-724Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-724Z.log deleted file mode 100644 index a51a7a9d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-724Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:32.724Z -# Max entries per file: 10000 - -2025-08-23T00:00:32.781Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:00:33.134Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-981Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-981Z.log deleted file mode 100644 index 0fea789c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-981Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:32.981Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.176Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-989Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-989Z.log deleted file mode 100644 index ba97b033..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-32-989Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:32.989Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.190Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-032Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-032Z.log deleted file mode 100644 index 070a995b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-032Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.032Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.077Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:00:33.194Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:00:33.201Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:00:33.204Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:00:33.210Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:00:33.327Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-221Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-221Z.log deleted file mode 100644 index 5e8d390d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-221Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.221Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.461Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-244Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-244Z.log deleted file mode 100644 index ec2bb89d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-244Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.244Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.396Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-247Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-247Z.log deleted file mode 100644 index d1248c5d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-247Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.247Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.508Z | [DATABASE] | User created successfully | Meta:{"executionTime":32,"userId":"f6f89e30-544c-444f-a357-d66233135ae4","username":"testuser1_1755907233476","email":"test1_1755907233476@example.com"} -2025-08-23T00:00:33.571Z | [DATABASE] | User created successfully | Meta:{"executionTime":10,"userId":"3a68466f-0097-4782-b649-86459bc8f56c","username":"testuser2_1755907233561","email":"test2_1755907233561@example.com"} -2025-08-23T00:00:33.581Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"2172e798-e5cf-42f6-aad8-6e1ab03b7c4d","username":"premiumuser_1755907233573","email":"premium_1755907233573@example.com"} -2025-08-23T00:00:33.591Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":8,"chatId":"d9f7f343-f19f-4e4d-819b-0d77d53979a5","type":"direct","participants":2} -2025-08-23T00:00:33.607Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"c7e28331-f902-446b-815c-dcab3f3ad14a","username":"testuser1_1755907233599","email":"test1_1755907233599@example.com"} -2025-08-23T00:00:33.615Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"037fe5ff-9503-445f-8255-3574aa55ca67","username":"testuser2_1755907233609","email":"test2_1755907233609@example.com"} -2025-08-23T00:00:33.623Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"7374883a-919e-4b91-be03-55ada80b7dc1","username":"premiumuser_1755907233617","email":"premium_1755907233617@example.com"} -2025-08-23T00:00:33.632Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":8,"chatId":"f27de6cd-2cba-4ddf-bedd-4adf2f3f299f","type":"group","participants":3} -2025-08-23T00:00:33.644Z | [DATABASE] | User created successfully | Meta:{"executionTime":9,"userId":"b4099db8-88fb-4c16-b2c2-4c47bc918787","username":"testuser1_1755907233635","email":"test1_1755907233635@example.com"} -2025-08-23T00:00:33.651Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"daba5d2b-4d11-434f-9965-142426053b85","username":"testuser2_1755907233645","email":"test2_1755907233645@example.com"} -2025-08-23T00:00:33.661Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"63fe5d59-0c5d-4ced-b4a8-1c2cf65556b2","username":"premiumuser_1755907233653","email":"premium_1755907233653@example.com"} -2025-08-23T00:00:33.670Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":7,"chatId":"eaec8ef2-9954-4f97-abc2-553be635cc49","type":"game","participants":2} -2025-08-23T00:00:33.676Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"536965b8-8893-4298-b702-97e514c5298e","username":"testuser1_1755907233671","email":"test1_1755907233671@example.com"} -2025-08-23T00:00:33.682Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"9add006d-1712-430f-9f40-0f9a033f4f4e","username":"testuser2_1755907233677","email":"test2_1755907233677@example.com"} -2025-08-23T00:00:33.689Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"0ce2f6f9-f1c7-4e74-86a6-673d94229c81","username":"premiumuser_1755907233682","email":"premium_1755907233682@example.com"} -2025-08-23T00:00:33.699Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":7,"chatId":"116c2c6c-af86-41bd-8e69-0a27f16596ac","type":"game","participants":2} -2025-08-23T00:00:33.715Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(582fc167-039c-494f-ae5a-177f55644dd1)","executionTime":14,"gameId":"582fc167-039c-494f-ae5a-177f55644dd1","found":true} -2025-08-23T00:00:33.722Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"f0ace574-ed9c-4aa2-bcf2-d969eebeb584","username":"testuser1_1755907233717","email":"test1_1755907233717@example.com"} -2025-08-23T00:00:33.728Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"c46e2e92-db94-4faa-a860-fcd47c7dfc84","username":"testuser2_1755907233723","email":"test2_1755907233723@example.com"} -2025-08-23T00:00:33.735Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"01e27b25-37cd-40fd-b8b9-72e23502a79a","username":"premiumuser_1755907233729","email":"premium_1755907233729@example.com"} -2025-08-23T00:00:33.742Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"dbfdffc9-9342-47dc-8cd9-6b0048b410f1","type":"direct","participants":2} -2025-08-23T00:00:33.750Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"dbfdffc9-9342-47dc-8cd9-6b0048b410f1"} -2025-08-23T00:00:33.751Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(dbfdffc9-9342-47dc-8cd9-6b0048b410f1)","executionTime":8,"chatId":"dbfdffc9-9342-47dc-8cd9-6b0048b410f1","updatedFields":["messages","lastActivity"],"success":true} -2025-08-23T00:00:33.754Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"dbfdffc9-9342-47dc-8cd9-6b0048b410f1"} -2025-08-23T00:00:33.760Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"6e1e455d-0086-466b-80b5-9d7ef05b3b26","username":"testuser1_1755907233756","email":"test1_1755907233756@example.com"} -2025-08-23T00:00:33.765Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"42282ed9-0e2a-4333-98c2-96391585d167","username":"testuser2_1755907233761","email":"test2_1755907233761@example.com"} -2025-08-23T00:00:33.770Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"f7c6910f-5174-491f-ab82-b20d0c8817ee","username":"premiumuser_1755907233766","email":"premium_1755907233766@example.com"} -2025-08-23T00:00:33.776Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"233318ed-5f78-4222-82c1-fd49c6675ee0","type":"direct","participants":2} -2025-08-23T00:00:33.785Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(233318ed-5f78-4222-82c1-fd49c6675ee0)","executionTime":7,"chatId":"233318ed-5f78-4222-82c1-fd49c6675ee0","messageCount":1,"archiveId":"4bc49ca5-e4b5-4dba-9c83-6cddfd1337d1"} -2025-08-23T00:00:33.789Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":3,"found":true,"chatId":"233318ed-5f78-4222-82c1-fd49c6675ee0"} -2025-08-23T00:00:33.795Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"31dbc620-9bfe-4aa0-a584-f5099faf013b","username":"testuser1_1755907233790","email":"test1_1755907233790@example.com"} -2025-08-23T00:00:33.800Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"0056501b-fce1-4b01-8e05-c2fa18970825","username":"testuser2_1755907233796","email":"test2_1755907233796@example.com"} -2025-08-23T00:00:33.805Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"e32ab17d-45b4-428b-971e-3f6f5b9b2d72","username":"premiumuser_1755907233801","email":"premium_1755907233801@example.com"} -2025-08-23T00:00:33.811Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"c60deb9e-d8cd-40be-9f46-af395fb9a7ec","type":"direct","participants":2} -2025-08-23T00:00:33.817Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(c60deb9e-d8cd-40be-9f46-af395fb9a7ec)","executionTime":5,"chatId":"c60deb9e-d8cd-40be-9f46-af395fb9a7ec","messageCount":1,"archiveId":"e093b359-a50f-4e36-b4f0-092f2d0d69c8"} -2025-08-23T00:00:33.821Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(c60deb9e-d8cd-40be-9f46-af395fb9a7ec)","executionTime":3,"chatId":"c60deb9e-d8cd-40be-9f46-af395fb9a7ec","found":true} -2025-08-23T00:00:33.826Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"3a4e909a-fa56-47a6-ad81-c201affb0fb4","username":"testuser1_1755907233822","email":"test1_1755907233822@example.com"} -2025-08-23T00:00:33.831Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"7773b505-159c-4354-8b5b-a5c9ba03a341","username":"testuser2_1755907233827","email":"test2_1755907233827@example.com"} -2025-08-23T00:00:33.836Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"ed0f9e82-d6ba-4a08-bc66-cd44ae57dac6","username":"premiumuser_1755907233832","email":"premium_1755907233832@example.com"} -2025-08-23T00:00:33.840Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":3,"chatId":"b27e5dad-479e-416b-af5e-725ca0918cb2","type":"direct","participants":2} -2025-08-23T00:00:33.845Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"016e6fe0-41d9-48e9-a5d5-e0cdc6bb56af","type":"group","participants":2} -2025-08-23T00:00:33.848Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(3a4e909a-fa56-47a6-ad81-c201affb0fb4)","executionTime":2,"userId":"3a4e909a-fa56-47a6-ad81-c201affb0fb4","count":2} -2025-08-23T00:00:33.853Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"b233933d-b7c9-4c39-911d-013ba9e26d25","username":"testuser1_1755907233849","email":"test1_1755907233849@example.com"} -2025-08-23T00:00:33.859Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"e41ead08-6269-4033-afe7-221f50f20e75","username":"testuser2_1755907233854","email":"test2_1755907233854@example.com"} -2025-08-23T00:00:33.865Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"04215ac8-caaa-42f5-b5d3-cfdeb23e776d","username":"premiumuser_1755907233861","email":"premium_1755907233861@example.com"} -2025-08-23T00:00:33.870Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"230e5abc-3a2a-4db9-94da-035b74848a2e","type":"direct","participants":2} -2025-08-23T00:00:33.873Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(b233933d-b7c9-4c39-911d-013ba9e26d25)","executionTime":2,"userId":"b233933d-b7c9-4c39-911d-013ba9e26d25","count":1} -2025-08-23T00:00:33.879Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"67a81df0-e0f5-4e62-a3b0-783d763b9875","username":"testuser1_1755907233875","email":"test1_1755907233875@example.com"} -2025-08-23T00:00:33.884Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"3fc05b39-c50b-4700-bdf0-51f61bcb3fe3","username":"testuser2_1755907233880","email":"test2_1755907233880@example.com"} -2025-08-23T00:00:33.888Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"93bce752-25d5-49f1-9b40-cd245b97725d","username":"premiumuser_1755907233885","email":"premium_1755907233885@example.com"} -2025-08-23T00:00:33.893Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"beee8f27-5b80-482c-8926-7f1a3503ad94","type":"direct","participants":2} -2025-08-23T00:00:33.906Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":12,"inactivityMinutes":60,"count":234,"cutoffDate":"2025-08-22T23:00:33.894Z"} -2025-08-23T00:00:33.922Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-271Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-271Z.log deleted file mode 100644 index 3405084c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-271Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.271Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.505Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-297Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-297Z.log deleted file mode 100644 index 55759ff8..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-297Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.297Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.502Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-306Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-306Z.log deleted file mode 100644 index 9baee477..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-306Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.306Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.803Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:00:34.827Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-307Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-307Z.log deleted file mode 100644 index c23652aa..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-307Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.307Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.374Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-23T00:00:33.562Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-319Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-319Z.log deleted file mode 100644 index 2e9d52ef..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-319Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.319Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.710Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:00:34.756Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:00:34.778Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.786Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.791Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.800Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:34.803Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":true,"searchBy":"username"} -2025-08-23T00:00:34.806Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:00:34.808Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":8} -2025-08-23T00:00:34.812Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:00:34.814Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:00:34.815Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:00:34.817Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:34.818Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:00:34.820Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":1} -2025-08-23T00:00:34.821Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:00:34.829Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:34.831Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:00:34.832Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:00:34.832Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":3} -2025-08-23T00:00:37.377Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:00:37.381Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:00:37.431Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:37.449Z | [DATABASE] | User lookup completed | Meta:{"executionTime":18,"found":false,"searchBy":"username"} -2025-08-23T00:00:37.547Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:00:37.728Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-361Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-361Z.log deleted file mode 100644 index ca83eb39..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-361Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.361Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.547Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-390Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-390Z.log deleted file mode 100644 index 26086a1e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-390Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.390Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-402Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-402Z.log deleted file mode 100644 index 704fe6c8..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-402Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.402Z -# Max entries per file: 10000 - -2025-08-23T00:00:33.515Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:33.573Z | [DATABASE] | User lookup completed | Meta:{"executionTime":58,"found":true,"searchBy":"username"} -2025-08-23T00:00:33.575Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:00:33.577Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":62} -2025-08-23T00:00:33.583Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-23T00:00:33.604Z | [DATABASE] | User lookup completed | Meta:{"executionTime":21,"found":true,"searchBy":"username"} -2025-08-23T00:00:33.606Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:00:33.608Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":25} -2025-08-23T00:00:33.611Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:00:33.613Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:00:33.615Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:00:33.621Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:33.623Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:00:33.625Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:00:33.627Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:00:33.636Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:33.638Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:00:33.647Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:33.654Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:33.660Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:33.670Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":15} -2025-08-23T00:00:33.678Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:00:33.680Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:00:33.681Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:00:33.686Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:00:33.689Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:00:33.743Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-699Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-699Z.log deleted file mode 100644 index 6f10b0c1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-33-699Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:33.699Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.048Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.092Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.136Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.152Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.158Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.160Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.163Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.169Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:00:34.171Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.176Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.189Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:00:34.191Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.201Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.205Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.210Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.214Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.217Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.219Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.221Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.225Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.227Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.229Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.234Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:00:34.237Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.239Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.260Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:00:34.291Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-450Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-450Z.log deleted file mode 100644 index 036967a3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-450Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.450Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-475Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-475Z.log deleted file mode 100644 index 8e47e022..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-475Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.475Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.499Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-478Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-478Z.log deleted file mode 100644 index 8ae14c9c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-478Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.478Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.509Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.526Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.535Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.547Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.551Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.557Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.563Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.567Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.653Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-585Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-585Z.log deleted file mode 100644 index be60d3a0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-585Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.585Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.616Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-586Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-586Z.log deleted file mode 100644 index db76df07..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-586Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.586Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.595Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:00:34.609Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.610Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:00:34.615Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:00:34.616Z | [STARTUP] | Test message -2025-08-23T00:00:34.619Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:00:34.625Z | [STARTUP] | Test for directory creation -2025-08-23T00:00:34.677Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-786Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-786Z.log deleted file mode 100644 index 14e45b84..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-786Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.786Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.806Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-805Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-805Z.log deleted file mode 100644 index 28e42083..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-805Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.805Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.808Z | [AUTH] | Authentication successful | ReqId:qqzye69hi | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:00:34.816Z | [AUTH] | Authentication failed - No valid token | ReqId:aojwwrcd9 | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:00:34.819Z | [AUTH] | Authentication successful | ReqId:hdo5veual | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:00:34.825Z | [AUTH] | Token refreshed | ReqId:7rffnkfiw | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:00:34.828Z | [AUTH] | Admin authentication successful | ReqId:ydjoaugww | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:00:34.831Z | [WARNING] | Admin access denied | ReqId:zj793f5pn | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:00:34.839Z | [WARNING] | Admin access denied | ReqId:y0uwls74b | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:00:34.845Z | [AUTH] | Admin authentication successful | ReqId:89gv9f5ye | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:00:34.847Z | [AUTH] | Admin token refreshed | ReqId:l8i3d7vl5 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:00:34.865Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-861Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-861Z.log deleted file mode 100644 index d208044a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-00-34-861Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:00:34.861Z -# Max entries per file: 10000 - -2025-08-23T00:00:34.876Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.878Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.880Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.884Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:00:34.912Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-041Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-041Z.log deleted file mode 100644 index 5c7fc632..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-041Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.041Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.073Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-23T00:06:18.240Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-119Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-119Z.log deleted file mode 100644 index 7a193b0c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-119Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.119Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.268Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-392Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-392Z.log deleted file mode 100644 index 1e59533f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-392Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.392Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-395Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-395Z.log deleted file mode 100644 index 3e5e1612..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-395Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.395Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.489Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:18.568Z | [DATABASE] | User lookup completed | Meta:{"executionTime":79,"found":true,"searchBy":"username"} -2025-08-23T00:06:18.572Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:06:18.574Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":85} -2025-08-23T00:06:18.580Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-23T00:06:18.583Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":true,"searchBy":"username"} -2025-08-23T00:06:18.585Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:06:18.589Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":9} -2025-08-23T00:06:18.592Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:06:18.594Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:06:18.596Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:06:18.599Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:18.601Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:06:18.603Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:06:18.605Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:06:18.612Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:18.614Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:06:18.626Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:18.634Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:18.650Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:18.687Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":53} -2025-08-23T00:06:18.729Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:18.731Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:06:18.752Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:06:18.767Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:06:18.775Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:06:18.966Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-429Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-429Z.log deleted file mode 100644 index c8a7378d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-429Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.429Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.583Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-433Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-433Z.log deleted file mode 100644 index 71733ddb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-433Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.433Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.465Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:06:18.540Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:06:18.547Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:06:18.553Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:06:18.557Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:06:18.724Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-473Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-473Z.log deleted file mode 100644 index 77f57c0a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-473Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.473Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.692Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-539Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-539Z.log deleted file mode 100644 index 9f32da82..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-539Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.539Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.842Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-547Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-547Z.log deleted file mode 100644 index f1c81868..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-547Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.547Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.893Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-563Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-563Z.log deleted file mode 100644 index 9810b07d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-563Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.563Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.936Z | [DATABASE] | User created successfully | Meta:{"executionTime":87,"userId":"37defc0d-efd4-4ded-b24a-b5e6ff6dc507","username":"testuser1_1755907578849","email":"test1_1755907578849@example.com"} -2025-08-23T00:06:18.987Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"8eef6557-73f4-4a94-8fff-d51ecef7d241","username":"testuser2_1755907578979","email":"test2_1755907578979@example.com"} -2025-08-23T00:06:18.995Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"2c90b704-34af-4311-abd7-922ed2f0078e","username":"premiumuser_1755907578989","email":"premium_1755907578989@example.com"} -2025-08-23T00:06:19.005Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":8,"chatId":"4795a0a5-838d-44d8-bad6-32350bd7c6db","type":"direct","participants":2} -2025-08-23T00:06:19.018Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"0d44a7eb-ee5d-404f-bb63-458a62c44be8","username":"testuser1_1755907579011","email":"test1_1755907579011@example.com"} -2025-08-23T00:06:19.024Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"4b45b90a-4e87-463c-a11d-0be2ff094b91","username":"testuser2_1755907579020","email":"test2_1755907579020@example.com"} -2025-08-23T00:06:19.029Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"f916197c-4ae2-4de2-94b5-36f90ef5b3e7","username":"premiumuser_1755907579026","email":"premium_1755907579026@example.com"} -2025-08-23T00:06:19.035Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"9f765645-6e08-449f-b906-f52c863a8c53","type":"group","participants":3} -2025-08-23T00:06:19.042Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"67e80b2a-700b-45d9-b4ff-e3b48a6467aa","username":"testuser1_1755907579037","email":"test1_1755907579037@example.com"} -2025-08-23T00:06:19.048Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"eaaf25a3-2e74-436b-a343-3ca52acaad3b","username":"testuser2_1755907579044","email":"test2_1755907579044@example.com"} -2025-08-23T00:06:19.053Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"ad27760a-1826-474d-86bf-3d393ad6daed","username":"premiumuser_1755907579049","email":"premium_1755907579049@example.com"} -2025-08-23T00:06:19.058Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":3,"chatId":"4aec1a7e-4455-4265-b40c-4889850480ad","type":"game","participants":2} -2025-08-23T00:06:19.064Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"85fc8945-f0a8-467d-a3e0-fd9e69b3195c","username":"testuser1_1755907579060","email":"test1_1755907579060@example.com"} -2025-08-23T00:06:19.069Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"d3458138-5f36-4330-98d7-da02f76e351b","username":"testuser2_1755907579065","email":"test2_1755907579065@example.com"} -2025-08-23T00:06:19.073Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"6a47428b-05a0-46ef-b450-c3859011c551","username":"premiumuser_1755907579070","email":"premium_1755907579070@example.com"} -2025-08-23T00:06:19.078Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"18ec4ea2-4cac-448a-934c-9af2bb2aca93","type":"game","participants":2} -2025-08-23T00:06:19.090Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(1b0af921-03fa-4b4b-9766-181248dcb3ca)","executionTime":10,"gameId":"1b0af921-03fa-4b4b-9766-181248dcb3ca","found":true} -2025-08-23T00:06:19.096Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"0b05d5f2-18dc-4f9d-9a1f-2b301e25f9b6","username":"testuser1_1755907579092","email":"test1_1755907579092@example.com"} -2025-08-23T00:06:19.101Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"cf80c9de-b044-4768-af72-843f4fa56ca8","username":"testuser2_1755907579097","email":"test2_1755907579097@example.com"} -2025-08-23T00:06:19.107Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"06559028-964b-48a0-9b32-8fa0c07215c1","username":"premiumuser_1755907579103","email":"premium_1755907579103@example.com"} -2025-08-23T00:06:19.112Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"01d95d10-cb59-4b90-8d46-cc2c9923ed94","type":"direct","participants":2} -2025-08-23T00:06:19.120Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"01d95d10-cb59-4b90-8d46-cc2c9923ed94"} -2025-08-23T00:06:19.121Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(01d95d10-cb59-4b90-8d46-cc2c9923ed94)","executionTime":8,"chatId":"01d95d10-cb59-4b90-8d46-cc2c9923ed94","updatedFields":["messages","lastActivity"],"success":true} -2025-08-23T00:06:19.123Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":1,"found":true,"chatId":"01d95d10-cb59-4b90-8d46-cc2c9923ed94"} -2025-08-23T00:06:19.128Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"91f9bd6e-0c0f-4ef3-ad69-3dd9c7f9d4f9","username":"testuser1_1755907579125","email":"test1_1755907579125@example.com"} -2025-08-23T00:06:19.132Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"71496483-9b27-442b-82dd-1fceb75a8a25","username":"testuser2_1755907579129","email":"test2_1755907579129@example.com"} -2025-08-23T00:06:19.136Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"f24a6a65-3703-46b8-9f8a-2b0b24d0283c","username":"premiumuser_1755907579133","email":"premium_1755907579133@example.com"} -2025-08-23T00:06:19.142Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"3ac6bc70-0530-4dac-9c4c-eae7919219a2","type":"direct","participants":2} -2025-08-23T00:06:19.149Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(3ac6bc70-0530-4dac-9c4c-eae7919219a2)","executionTime":6,"chatId":"3ac6bc70-0530-4dac-9c4c-eae7919219a2","messageCount":1,"archiveId":"323b6b43-61aa-4559-9c91-05cb5b21dbab"} -2025-08-23T00:06:19.152Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"3ac6bc70-0530-4dac-9c4c-eae7919219a2"} -2025-08-23T00:06:19.157Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"e7625ab3-c65c-46b8-b4cc-5da9f5205f2a","username":"testuser1_1755907579153","email":"test1_1755907579153@example.com"} -2025-08-23T00:06:19.162Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"6c5ac122-9a68-4849-9daa-7f61954ce307","username":"testuser2_1755907579158","email":"test2_1755907579158@example.com"} -2025-08-23T00:06:19.166Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"8bc6bec8-0226-4c4b-a7a9-06adbc367ebf","username":"premiumuser_1755907579162","email":"premium_1755907579162@example.com"} -2025-08-23T00:06:19.171Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"1fc9fec5-a041-4e5d-9638-fc6ade70f39d","type":"direct","participants":2} -2025-08-23T00:06:19.178Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(1fc9fec5-a041-4e5d-9638-fc6ade70f39d)","executionTime":6,"chatId":"1fc9fec5-a041-4e5d-9638-fc6ade70f39d","messageCount":1,"archiveId":"de1fe1a5-918c-4d3b-905c-523db829852e"} -2025-08-23T00:06:19.181Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(1fc9fec5-a041-4e5d-9638-fc6ade70f39d)","executionTime":2,"chatId":"1fc9fec5-a041-4e5d-9638-fc6ade70f39d","found":true} -2025-08-23T00:06:19.188Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"cfdd1efe-f675-41f8-97e6-0342e8dcf638","username":"testuser1_1755907579182","email":"test1_1755907579182@example.com"} -2025-08-23T00:06:19.192Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"63711efa-f6e1-4dae-8c5f-095275604b08","username":"testuser2_1755907579189","email":"test2_1755907579189@example.com"} -2025-08-23T00:06:19.196Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"8403b4d5-a27a-476b-b861-d1a1186a3440","username":"premiumuser_1755907579193","email":"premium_1755907579193@example.com"} -2025-08-23T00:06:19.200Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":3,"chatId":"75154759-aa35-4d53-b07a-e59fcee674d2","type":"direct","participants":2} -2025-08-23T00:06:19.204Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":3,"chatId":"57b6f2f1-2f60-4dad-afc9-ea254e4a3a86","type":"group","participants":2} -2025-08-23T00:06:19.207Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(cfdd1efe-f675-41f8-97e6-0342e8dcf638)","executionTime":2,"userId":"cfdd1efe-f675-41f8-97e6-0342e8dcf638","count":2} -2025-08-23T00:06:19.212Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"f8fdd09f-5757-427c-a8eb-9df9e73b7631","username":"testuser1_1755907579208","email":"test1_1755907579208@example.com"} -2025-08-23T00:06:19.216Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"5def4553-f6ef-453d-bc2f-a5ac6f72e066","username":"testuser2_1755907579213","email":"test2_1755907579213@example.com"} -2025-08-23T00:06:19.220Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"6b1cf324-03e4-4ea6-82e2-1ba57895a492","username":"premiumuser_1755907579216","email":"premium_1755907579216@example.com"} -2025-08-23T00:06:19.225Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"7d8cdeac-c1e1-4c14-a3a5-ba2da82398af","type":"direct","participants":2} -2025-08-23T00:06:19.229Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(f8fdd09f-5757-427c-a8eb-9df9e73b7631)","executionTime":3,"userId":"f8fdd09f-5757-427c-a8eb-9df9e73b7631","count":1} -2025-08-23T00:06:19.235Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"ebee254f-1122-4186-b22d-97f6fba5edee","username":"testuser1_1755907579231","email":"test1_1755907579231@example.com"} -2025-08-23T00:06:19.239Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"8a2d05b4-c226-4e31-b704-33f3a85bf46b","username":"testuser2_1755907579235","email":"test2_1755907579235@example.com"} -2025-08-23T00:06:19.244Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"ed2d2f3b-a85e-45e9-ad75-2cc0131c9f31","username":"premiumuser_1755907579240","email":"premium_1755907579240@example.com"} -2025-08-23T00:06:19.248Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":3,"chatId":"d56dc54d-4a8b-442c-8fad-e8d30047b6b2","type":"direct","participants":2} -2025-08-23T00:06:19.260Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":11,"inactivityMinutes":60,"count":235,"cutoffDate":"2025-08-22T23:06:19.249Z"} -2025-08-23T00:06:19.275Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-617Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-617Z.log deleted file mode 100644 index 22ca7f4b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-617Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.617Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.100Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:06:20.113Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-632Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-632Z.log deleted file mode 100644 index 96f89b84..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-632Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.632Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.963Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-651Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-651Z.log deleted file mode 100644 index 31a04a42..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-651Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.651Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.802Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:06:19.053Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-702Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-702Z.log deleted file mode 100644 index 65ea7ca7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-702Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.702Z -# Max entries per file: 10000 - -2025-08-23T00:06:18.975Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-838Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-838Z.log deleted file mode 100644 index fe6b42ad..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-838Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.838Z -# Max entries per file: 10000 - -2025-08-23T00:06:20.156Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:06:20.203Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:06:20.221Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:20.228Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:20.237Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:20.242Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:20.251Z | [DATABASE] | User lookup completed | Meta:{"executionTime":9,"found":true,"searchBy":"username"} -2025-08-23T00:06:20.252Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:06:20.253Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":11} -2025-08-23T00:06:20.255Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:06:20.257Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:06:20.260Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:06:20.262Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:20.263Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:06:20.271Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:06:20.280Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:06:20.286Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:20.288Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:06:20.290Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:06:20.293Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":7} -2025-08-23T00:06:21.350Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:06:21.354Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:06:21.567Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:06:21.568Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:06:21.599Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:06:21.974Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-946Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-946Z.log deleted file mode 100644 index ca5d1c73..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-18-946Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:18.946Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.282Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.323Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.358Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.365Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.370Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.372Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.375Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.378Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:06:19.382Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.385Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.388Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:06:19.390Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.393Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.396Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.397Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.399Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.402Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.403Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.407Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.410Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.412Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.413Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.416Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:06:19.420Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.421Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.436Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:06:19.467Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-491Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-491Z.log deleted file mode 100644 index b33f3be8..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-491Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:19.491Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.506Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.518Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.522Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.527Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.531Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.535Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.542Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.545Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.609Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-623Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-623Z.log deleted file mode 100644 index 5b4406da..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-623Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:19.623Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.635Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-808Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-808Z.log deleted file mode 100644 index a42c844f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-808Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:19.808Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.819Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-863Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-863Z.log deleted file mode 100644 index 99986564..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-863Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:19.863Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.869Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:06:19.877Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.879Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:06:19.880Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:06:19.880Z | [STARTUP] | Test message -2025-08-23T00:06:19.881Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:06:19.884Z | [STARTUP] | Test for directory creation -2025-08-23T00:06:19.917Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-898Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-898Z.log deleted file mode 100644 index 10e360a3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-19-898Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:19.898Z -# Max entries per file: 10000 - -2025-08-23T00:06:19.912Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.913Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.914Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.918Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:06:19.937Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-054Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-054Z.log deleted file mode 100644 index 5f668bd4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-054Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:20.054Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-075Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-075Z.log deleted file mode 100644 index 97ee8efe..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-075Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:20.075Z -# Max entries per file: 10000 - -2025-08-23T00:06:20.110Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-078Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-078Z.log deleted file mode 100644 index b018f3bd..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-06-20-078Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:06:20.078Z -# Max entries per file: 10000 - -2025-08-23T00:06:20.080Z | [AUTH] | Authentication successful | ReqId:oyclk7u5a | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:06:20.087Z | [AUTH] | Authentication failed - No valid token | ReqId:zso9hdher | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:06:20.089Z | [AUTH] | Authentication successful | ReqId:k3y7yx0ge | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:06:20.089Z | [AUTH] | Token refreshed | ReqId:4unrrqzsd | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:06:20.121Z | [AUTH] | Admin authentication successful | ReqId:4xwc5ew4d | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:06:20.123Z | [WARNING] | Admin access denied | ReqId:ig7dsf3xj | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:06:20.133Z | [WARNING] | Admin access denied | ReqId:q871dm2hl | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:06:20.138Z | [AUTH] | Admin authentication successful | ReqId:u0r6jzq6r | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:06:20.139Z | [AUTH] | Admin token refreshed | ReqId:twbx90dc9 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:06:20.153Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-215Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-215Z.log deleted file mode 100644 index ce6fece4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-215Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.215Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.384Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-257Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-257Z.log deleted file mode 100644 index 691ae011..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-257Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.257Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.298Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-23T00:08:15.554Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-324Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-324Z.log deleted file mode 100644 index 14480cac..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-324Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.324Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.363Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:08:15.450Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:08:15.458Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:08:15.466Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:08:15.471Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:08:15.625Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-326Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-326Z.log deleted file mode 100644 index b8ab3649..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-326Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.326Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.647Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-359Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-359Z.log deleted file mode 100644 index 9cd9a495..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-359Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.359Z -# Max entries per file: 10000 - -2025-08-23T00:08:16.849Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:08:16.903Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:08:16.928Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.935Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.953Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.965Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:16.972Z | [DATABASE] | User lookup completed | Meta:{"executionTime":8,"found":true,"searchBy":"username"} -2025-08-23T00:08:16.977Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:08:16.978Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":14} -2025-08-23T00:08:16.984Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:08:16.996Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":false,"searchBy":"username"} -2025-08-23T00:08:17.015Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:08:17.028Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:17.032Z | [DATABASE] | User lookup completed | Meta:{"executionTime":4,"found":true,"searchBy":"username"} -2025-08-23T00:08:17.040Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:08:17.073Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:08:17.101Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:17.104Z | [DATABASE] | User lookup completed | Meta:{"executionTime":4,"found":true,"searchBy":"username"} -2025-08-23T00:08:17.113Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:08:17.117Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":17} -2025-08-23T00:08:18.255Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:08:18.258Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:08:18.261Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:18.263Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:08:18.265Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:08:18.305Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-392Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-392Z.log deleted file mode 100644 index 271e72b5..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-392Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.392Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.649Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-405Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-405Z.log deleted file mode 100644 index 8fbe601b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-405Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.405Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.482Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:08:15.744Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-439Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-439Z.log deleted file mode 100644 index c22020b4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-439Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.439Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.658Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-440Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-440Z.log deleted file mode 100644 index 56aaf1eb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-440Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.440Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-446Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-446Z.log deleted file mode 100644 index 192800e7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-446Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.446Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.570Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:15.634Z | [DATABASE] | User lookup completed | Meta:{"executionTime":63,"found":true,"searchBy":"username"} -2025-08-23T00:08:15.640Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:08:15.655Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":83} -2025-08-23T00:08:15.684Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-23T00:08:15.688Z | [DATABASE] | User lookup completed | Meta:{"executionTime":4,"found":true,"searchBy":"username"} -2025-08-23T00:08:15.691Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:08:15.693Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":9} -2025-08-23T00:08:15.698Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:08:15.700Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:08:15.702Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:08:15.706Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:15.708Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:08:15.713Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:08:15.714Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:08:15.722Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:15.724Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:08:15.740Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:15.753Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:15.758Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:15.767Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":14} -2025-08-23T00:08:15.775Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:08:15.776Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:08:15.779Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:08:15.782Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:08:15.791Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:08:15.846Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-462Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-462Z.log deleted file mode 100644 index 0cabadd6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-462Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.462Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.651Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-525Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-525Z.log deleted file mode 100644 index ad5150c0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-525Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.525Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.669Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-537Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-537Z.log deleted file mode 100644 index e09de280..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-537Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.537Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.678Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-560Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-560Z.log deleted file mode 100644 index 9ecb94bd..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-560Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.560Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.961Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:08:17.022Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-636Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-636Z.log deleted file mode 100644 index 12d11a34..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-636Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.636Z -# Max entries per file: 10000 - -2025-08-23T00:08:15.825Z | [DATABASE] | User created successfully | Meta:{"executionTime":44,"userId":"7a7108a6-1d38-414c-bbf7-aa6e1d60da8e","username":"testuser1_1755907695781","email":"test1_1755907695781@example.com"} -2025-08-23T00:08:15.884Z | [DATABASE] | User created successfully | Meta:{"executionTime":13,"userId":"771cda8a-0ef7-419d-92af-bdd3b2d078e4","username":"testuser2_1755907695871","email":"test2_1755907695871@example.com"} -2025-08-23T00:08:15.893Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"abc30a27-2003-4bfd-a77f-de70255b4f23","username":"premiumuser_1755907695886","email":"premium_1755907695886@example.com"} -2025-08-23T00:08:15.903Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":8,"chatId":"d09b17a9-119a-43a2-a394-5a5f58dab9e9","type":"direct","participants":2} -2025-08-23T00:08:15.914Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"91a0603c-041d-40ae-8e8d-57997963da55","username":"testuser1_1755907695908","email":"test1_1755907695908@example.com"} -2025-08-23T00:08:15.922Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"3f7aec83-6c46-42de-a3d5-7f842c8e3e2e","username":"testuser2_1755907695915","email":"test2_1755907695915@example.com"} -2025-08-23T00:08:15.928Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"7abc159a-d5ae-427a-9cde-a3de4bca2196","username":"premiumuser_1755907695923","email":"premium_1755907695923@example.com"} -2025-08-23T00:08:15.936Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"71a28b6b-9575-495d-a524-7b926f700609","type":"group","participants":3} -2025-08-23T00:08:15.944Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"6d656e9f-6966-45cf-830a-5be23f182d8b","username":"testuser1_1755907695937","email":"test1_1755907695937@example.com"} -2025-08-23T00:08:15.950Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"7e215320-f434-4a51-93c8-b3f8eb328bd3","username":"testuser2_1755907695945","email":"test2_1755907695945@example.com"} -2025-08-23T00:08:15.956Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"b34ad230-22e6-462d-af0c-e4c7225ebc82","username":"premiumuser_1755907695951","email":"premium_1755907695951@example.com"} -2025-08-23T00:08:15.962Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"de78b79c-18d5-4966-966f-5feed8cdec49","type":"game","participants":2} -2025-08-23T00:08:15.969Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"182c8d62-82d5-44df-856f-e9bd094eefb4","username":"testuser1_1755907695964","email":"test1_1755907695964@example.com"} -2025-08-23T00:08:15.974Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"845e8154-a47c-4ec4-8f48-5a447da8bd90","username":"testuser2_1755907695970","email":"test2_1755907695970@example.com"} -2025-08-23T00:08:15.980Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"21311848-f1ea-493d-a92b-6d86165d3556","username":"premiumuser_1755907695975","email":"premium_1755907695975@example.com"} -2025-08-23T00:08:15.986Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"4ac5b96f-8a71-4d93-810e-5b868606c38e","type":"game","participants":2} -2025-08-23T00:08:15.995Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(a954b9ac-51ae-41a6-b2a1-592e4db35ced)","executionTime":8,"gameId":"a954b9ac-51ae-41a6-b2a1-592e4db35ced","found":true} -2025-08-23T00:08:16.001Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"2543fc73-5777-4ee1-98c0-616ca2260dbe","username":"testuser1_1755907695997","email":"test1_1755907695997@example.com"} -2025-08-23T00:08:16.006Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"4926b95d-2f2c-4a60-9b63-e2d844080cc7","username":"testuser2_1755907696002","email":"test2_1755907696002@example.com"} -2025-08-23T00:08:16.010Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"8ab8ebe6-163a-4367-892b-83adb88a604f","username":"premiumuser_1755907696007","email":"premium_1755907696007@example.com"} -2025-08-23T00:08:16.015Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"d999f096-f847-4af1-8f72-1f69c6993c2a","type":"direct","participants":2} -2025-08-23T00:08:16.025Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"d999f096-f847-4af1-8f72-1f69c6993c2a"} -2025-08-23T00:08:16.026Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(d999f096-f847-4af1-8f72-1f69c6993c2a)","executionTime":9,"chatId":"d999f096-f847-4af1-8f72-1f69c6993c2a","updatedFields":["messages","lastActivity"],"success":true} -2025-08-23T00:08:16.030Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":3,"found":true,"chatId":"d999f096-f847-4af1-8f72-1f69c6993c2a"} -2025-08-23T00:08:16.035Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"7638fd94-f005-4656-9388-f9227e92069d","username":"testuser1_1755907696031","email":"test1_1755907696031@example.com"} -2025-08-23T00:08:16.041Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"05458243-9132-45e2-8e6a-7b9c69a83429","username":"testuser2_1755907696036","email":"test2_1755907696036@example.com"} -2025-08-23T00:08:16.046Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"145d84ea-cac9-4805-a0dd-651513d10313","username":"premiumuser_1755907696042","email":"premium_1755907696042@example.com"} -2025-08-23T00:08:16.051Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"7df054b8-9a80-4f23-b600-a151f2b68db6","type":"direct","participants":2} -2025-08-23T00:08:16.083Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(7df054b8-9a80-4f23-b600-a151f2b68db6)","executionTime":31,"chatId":"7df054b8-9a80-4f23-b600-a151f2b68db6","messageCount":1,"archiveId":"9a51c063-0efe-4741-912f-23c3bf796d28"} -2025-08-23T00:08:16.086Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"7df054b8-9a80-4f23-b600-a151f2b68db6"} -2025-08-23T00:08:16.092Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"4a2327ff-f9f1-4da3-be02-29ecdf2fd96e","username":"testuser1_1755907696087","email":"test1_1755907696087@example.com"} -2025-08-23T00:08:16.097Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"1926d71e-b5c0-4414-84aa-2a9408f2d649","username":"testuser2_1755907696093","email":"test2_1755907696093@example.com"} -2025-08-23T00:08:16.101Z | [DATABASE] | User created successfully | Meta:{"executionTime":3,"userId":"671a1c1b-25bb-43f9-aa64-5d6f1c5f92b5","username":"premiumuser_1755907696098","email":"premium_1755907696098@example.com"} -2025-08-23T00:08:16.107Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"549fee0c-c82a-4451-9823-944ae569bb5a","type":"direct","participants":2} -2025-08-23T00:08:16.114Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(549fee0c-c82a-4451-9823-944ae569bb5a)","executionTime":6,"chatId":"549fee0c-c82a-4451-9823-944ae569bb5a","messageCount":1,"archiveId":"5fc8e053-7639-4133-8965-2ef1f5ebc612"} -2025-08-23T00:08:16.119Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(549fee0c-c82a-4451-9823-944ae569bb5a)","executionTime":3,"chatId":"549fee0c-c82a-4451-9823-944ae569bb5a","found":true} -2025-08-23T00:08:16.125Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"9e68bf2e-88ba-4cfe-8465-bea53223da4a","username":"testuser1_1755907696121","email":"test1_1755907696121@example.com"} -2025-08-23T00:08:16.130Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"f9a9388a-7c97-4c81-96fa-25bc1910c2aa","username":"testuser2_1755907696126","email":"test2_1755907696126@example.com"} -2025-08-23T00:08:16.135Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"8aa4e6b8-70d4-40b0-858d-c8b6d34c9e06","username":"premiumuser_1755907696131","email":"premium_1755907696131@example.com"} -2025-08-23T00:08:16.140Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"9b7e6706-b838-4f48-b7e8-b83a67612b3c","type":"direct","participants":2} -2025-08-23T00:08:16.145Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"f30254c8-6239-4109-8ebf-798423f012bc","type":"group","participants":2} -2025-08-23T00:08:16.149Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(9e68bf2e-88ba-4cfe-8465-bea53223da4a)","executionTime":3,"userId":"9e68bf2e-88ba-4cfe-8465-bea53223da4a","count":2} -2025-08-23T00:08:16.155Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"cac148cf-7eda-4369-8eaa-66467d0ca7d4","username":"testuser1_1755907696151","email":"test1_1755907696151@example.com"} -2025-08-23T00:08:16.160Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"47b0a3c6-ea64-4bb8-a5d9-f5d6f0243a2f","username":"testuser2_1755907696156","email":"test2_1755907696156@example.com"} -2025-08-23T00:08:16.165Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"01b5dde2-f3c0-4ae6-87d8-26a83ffc3272","username":"premiumuser_1755907696161","email":"premium_1755907696161@example.com"} -2025-08-23T00:08:16.171Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"91676af3-255f-45d3-a57e-6c88cb3e5954","type":"direct","participants":2} -2025-08-23T00:08:16.176Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(cac148cf-7eda-4369-8eaa-66467d0ca7d4)","executionTime":4,"userId":"cac148cf-7eda-4369-8eaa-66467d0ca7d4","count":1} -2025-08-23T00:08:16.182Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"349cbf2e-ea47-4cfe-8eb9-02ff20cc2801","username":"testuser1_1755907696178","email":"test1_1755907696178@example.com"} -2025-08-23T00:08:16.187Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"2f46b84c-102d-4f29-a029-a7c597287c30","username":"testuser2_1755907696183","email":"test2_1755907696183@example.com"} -2025-08-23T00:08:16.192Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"60c64d3a-4912-4a11-94b5-43cd7a3fdcba","username":"premiumuser_1755907696188","email":"premium_1755907696188@example.com"} -2025-08-23T00:08:16.197Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"0d684192-8f30-453e-84c0-d8546cc32288","type":"direct","participants":2} -2025-08-23T00:08:16.211Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":13,"inactivityMinutes":60,"count":236,"cutoffDate":"2025-08-22T23:08:16.198Z"} -2025-08-23T00:08:16.227Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-767Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-767Z.log deleted file mode 100644 index b5f935f7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-15-767Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:15.767Z -# Max entries per file: 10000 - -2025-08-23T00:08:16.171Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.216Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.248Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.254Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.258Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.260Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.263Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.266Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:08:16.269Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.271Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.278Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:08:16.279Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.282Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.286Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.288Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.290Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.292Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.294Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.296Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.301Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.303Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.305Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.308Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:08:16.309Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.311Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.321Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:08:16.353Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-16-642Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-16-642Z.log deleted file mode 100644 index fc7318d4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-16-642Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:16.642Z -# Max entries per file: 10000 - -2025-08-23T00:08:16.666Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.687Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.692Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.704Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.716Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.726Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.737Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.750Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:16.924Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-278Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-278Z.log deleted file mode 100644 index 70a16396..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-278Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.278Z -# Max entries per file: 10000 - -2025-08-23T00:08:17.281Z | [AUTH] | Authentication successful | ReqId:ez11vs7l5 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:08:17.289Z | [AUTH] | Authentication failed - No valid token | ReqId:37q265dk3 | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:08:17.292Z | [AUTH] | Authentication successful | ReqId:e7etkcaue | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:08:17.294Z | [AUTH] | Token refreshed | ReqId:618m7q6jb | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:08:17.299Z | [AUTH] | Admin authentication successful | ReqId:g0jolpth1 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:08:17.302Z | [WARNING] | Admin access denied | ReqId:11u96nakx | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:08:17.313Z | [WARNING] | Admin access denied | ReqId:zm957sedk | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:08:17.318Z | [AUTH] | Admin authentication successful | ReqId:9mv5klbqf | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:08:17.321Z | [AUTH] | Admin token refreshed | ReqId:wkuyocx03 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:08:17.483Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-333Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-333Z.log deleted file mode 100644 index 53dd06b2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-333Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.333Z -# Max entries per file: 10000 - -2025-08-23T00:08:17.337Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:08:17.392Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:17.394Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:08:17.395Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:08:17.396Z | [STARTUP] | Test message -2025-08-23T00:08:17.399Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:08:17.404Z | [STARTUP] | Test for directory creation -2025-08-23T00:08:17.667Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-473Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-473Z.log deleted file mode 100644 index 946b5b4e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-473Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.473Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-478Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-478Z.log deleted file mode 100644 index b80a884f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-478Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.478Z -# Max entries per file: 10000 - -2025-08-23T00:08:17.499Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:17.504Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:17.519Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:17.524Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:08:17.691Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-591Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-591Z.log deleted file mode 100644 index ba7eb11f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-591Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.591Z -# Max entries per file: 10000 - -2025-08-23T00:08:17.704Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-615Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-615Z.log deleted file mode 100644 index cf89915b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-615Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.615Z -# Max entries per file: 10000 - -2025-08-23T00:08:17.712Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-696Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-696Z.log deleted file mode 100644 index b2a3b87b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-08-17-696Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:08:17.696Z -# Max entries per file: 10000 - -2025-08-23T00:08:17.735Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-149Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-149Z.log deleted file mode 100644 index 774f750d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-149Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.149Z -# Max entries per file: 10000 - -2025-08-23T00:09:11.644Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-180Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-180Z.log deleted file mode 100644 index d55da2b4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-180Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.180Z -# Max entries per file: 10000 - -2025-08-23T00:09:11.507Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-181Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-181Z.log deleted file mode 100644 index 2839188a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-181Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.181Z -# Max entries per file: 10000 - -2025-08-23T00:09:11.578Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-209Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-209Z.log deleted file mode 100644 index 8575c4ad..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-209Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.209Z -# Max entries per file: 10000 - -2025-08-23T00:09:11.587Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-282Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-282Z.log deleted file mode 100644 index a22fd8ae..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-282Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.282Z -# Max entries per file: 10000 - -2025-08-23T00:09:11.514Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:09:11.911Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-354Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-354Z.log deleted file mode 100644 index f3a81085..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-354Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.354Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.051Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.113Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.155Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.179Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.186Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.200Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.213Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.221Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:09:12.224Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.229Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.240Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:09:12.262Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.266Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.270Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.281Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.285Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.289Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.291Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.294Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.300Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.302Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.306Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.312Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:09:12.314Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.317Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.331Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:09:12.374Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-370Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-370Z.log deleted file mode 100644 index e406df34..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-370Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.370Z -# Max entries per file: 10000 - -2025-08-23T00:09:11.703Z | [DATABASE] | User created successfully | Meta:{"executionTime":88,"userId":"fd9baf7b-25e7-4854-9344-2d783f62927d","username":"testuser1_1755907751614","email":"test1_1755907751614@example.com"} -2025-08-23T00:09:11.796Z | [DATABASE] | User created successfully | Meta:{"executionTime":46,"userId":"d33ab321-fa6a-4b62-b091-3bcc4e894613","username":"testuser2_1755907751750","email":"test2_1755907751750@example.com"} -2025-08-23T00:09:11.821Z | [DATABASE] | User created successfully | Meta:{"executionTime":23,"userId":"70a6ae58-bf3b-4e69-8276-09c60759f315","username":"premiumuser_1755907751798","email":"premium_1755907751798@example.com"} -2025-08-23T00:09:11.842Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":10,"chatId":"0388a8ee-b078-4dc7-95fb-2638e234de16","type":"direct","participants":2} -2025-08-23T00:09:11.864Z | [DATABASE] | User created successfully | Meta:{"executionTime":13,"userId":"1d192f6f-ad47-4cf9-9cc9-6c40f87719e9","username":"testuser1_1755907751851","email":"test1_1755907751851@example.com"} -2025-08-23T00:09:11.889Z | [DATABASE] | User created successfully | Meta:{"executionTime":23,"userId":"578a3513-da74-4b9a-9e6a-ab63807daca5","username":"testuser2_1755907751866","email":"test2_1755907751866@example.com"} -2025-08-23T00:09:11.910Z | [DATABASE] | User created successfully | Meta:{"executionTime":19,"userId":"285a8f78-98f9-4d8e-a0c0-fa016717df9f","username":"premiumuser_1755907751891","email":"premium_1755907751891@example.com"} -2025-08-23T00:09:11.918Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"9c630049-6a52-4bb2-8027-6ede293a23a3","type":"group","participants":3} -2025-08-23T00:09:11.929Z | [DATABASE] | User created successfully | Meta:{"executionTime":9,"userId":"65220a04-bfda-4ace-8625-337de860fd30","username":"testuser1_1755907751920","email":"test1_1755907751920@example.com"} -2025-08-23T00:09:11.936Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"ac9eaa56-8658-4ed5-9016-cecd5efbebd6","username":"testuser2_1755907751930","email":"test2_1755907751930@example.com"} -2025-08-23T00:09:11.943Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"601965dd-0753-4eb1-bf31-082e891ec5b2","username":"premiumuser_1755907751937","email":"premium_1755907751937@example.com"} -2025-08-23T00:09:11.950Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"f16e1a88-0334-4256-9391-87a34a5a4462","type":"game","participants":2} -2025-08-23T00:09:11.958Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"7b864d3d-c8c4-4d27-b95c-bf88f3da58ad","username":"testuser1_1755907751952","email":"test1_1755907751952@example.com"} -2025-08-23T00:09:11.970Z | [DATABASE] | User created successfully | Meta:{"executionTime":11,"userId":"e4191026-b51b-48c4-a9cd-58014813e191","username":"testuser2_1755907751959","email":"test2_1755907751959@example.com"} -2025-08-23T00:09:11.976Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"505e0a01-7db5-4879-9506-1ca5dc47d035","username":"premiumuser_1755907751971","email":"premium_1755907751971@example.com"} -2025-08-23T00:09:11.983Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"30ea24d1-de10-43cf-9b9a-596c1621af73","type":"game","participants":2} -2025-08-23T00:09:11.992Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(24a7c82c-7333-4796-8fc4-0dce2cd1997b)","executionTime":8,"gameId":"24a7c82c-7333-4796-8fc4-0dce2cd1997b","found":true} -2025-08-23T00:09:12.006Z | [DATABASE] | User created successfully | Meta:{"executionTime":12,"userId":"eeb4a1da-b10e-4f05-9180-9c785f58041e","username":"testuser1_1755907751994","email":"test1_1755907751994@example.com"} -2025-08-23T00:09:12.013Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"06d5fb35-3cf9-4d4e-b16d-6183b3451cb5","username":"testuser2_1755907752007","email":"test2_1755907752007@example.com"} -2025-08-23T00:09:12.019Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"acb3f8ad-f2ec-4059-920c-d0d88a699ef3","username":"premiumuser_1755907752014","email":"premium_1755907752014@example.com"} -2025-08-23T00:09:12.026Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"7e980cc6-f196-4be3-a169-2257cd736cd9","type":"direct","participants":2} -2025-08-23T00:09:12.045Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"7e980cc6-f196-4be3-a169-2257cd736cd9"} -2025-08-23T00:09:12.047Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(7e980cc6-f196-4be3-a169-2257cd736cd9)","executionTime":11,"chatId":"7e980cc6-f196-4be3-a169-2257cd736cd9","updatedFields":["messages","lastActivity"],"success":true} -2025-08-23T00:09:12.051Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":3,"found":true,"chatId":"7e980cc6-f196-4be3-a169-2257cd736cd9"} -2025-08-23T00:09:12.057Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"8d0b0d90-a1f8-4cc1-9919-bd0db080e3ec","username":"testuser1_1755907752052","email":"test1_1755907752052@example.com"} -2025-08-23T00:09:12.063Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"717bf0c7-1396-466b-a8ea-979388170fc9","username":"testuser2_1755907752058","email":"test2_1755907752058@example.com"} -2025-08-23T00:09:12.069Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"7a934af4-babb-4c89-bb9e-43d6cc9aceef","username":"premiumuser_1755907752065","email":"premium_1755907752065@example.com"} -2025-08-23T00:09:12.089Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":18,"chatId":"b1a78b02-6d28-4804-804d-04e3ef2c1433","type":"direct","participants":2} -2025-08-23T00:09:12.099Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(b1a78b02-6d28-4804-804d-04e3ef2c1433)","executionTime":9,"chatId":"b1a78b02-6d28-4804-804d-04e3ef2c1433","messageCount":1,"archiveId":"6e2fed98-da08-45a3-bede-1bf59ad9b078"} -2025-08-23T00:09:12.103Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":3,"found":true,"chatId":"b1a78b02-6d28-4804-804d-04e3ef2c1433"} -2025-08-23T00:09:12.110Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"4730352a-7e03-468b-a319-43057797fdb2","username":"testuser1_1755907752104","email":"test1_1755907752104@example.com"} -2025-08-23T00:09:12.116Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"2423ec4a-c73c-4215-b97e-f009b8067688","username":"testuser2_1755907752111","email":"test2_1755907752111@example.com"} -2025-08-23T00:09:12.123Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"23f018ec-8e3b-4ba9-90cd-0315d8cee7ac","username":"premiumuser_1755907752117","email":"premium_1755907752117@example.com"} -2025-08-23T00:09:12.130Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"c1a51f01-c0fa-48d9-8890-196e139cdb28","type":"direct","participants":2} -2025-08-23T00:09:12.141Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(c1a51f01-c0fa-48d9-8890-196e139cdb28)","executionTime":10,"chatId":"c1a51f01-c0fa-48d9-8890-196e139cdb28","messageCount":1,"archiveId":"612fe81e-20d1-4c52-8fc3-8cf3c84c0b0a"} -2025-08-23T00:09:12.145Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(c1a51f01-c0fa-48d9-8890-196e139cdb28)","executionTime":3,"chatId":"c1a51f01-c0fa-48d9-8890-196e139cdb28","found":true} -2025-08-23T00:09:12.154Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"e1034456-1b0d-45e8-8330-e8a4496fec28","username":"testuser1_1755907752146","email":"test1_1755907752146@example.com"} -2025-08-23T00:09:12.163Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"80b0114a-f2f1-468d-a0a7-2b2f1ead1025","username":"testuser2_1755907752156","email":"test2_1755907752156@example.com"} -2025-08-23T00:09:12.172Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"e06ef2b9-dbbf-4e83-9199-2feed9ecd166","username":"premiumuser_1755907752165","email":"premium_1755907752165@example.com"} -2025-08-23T00:09:12.179Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"9702cd8a-edaf-47aa-957c-7d480aa73247","type":"direct","participants":2} -2025-08-23T00:09:12.190Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":10,"chatId":"5fb8eabe-d4d2-4264-9ad6-e60a5d038e32","type":"group","participants":2} -2025-08-23T00:09:12.194Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(e1034456-1b0d-45e8-8330-e8a4496fec28)","executionTime":3,"userId":"e1034456-1b0d-45e8-8330-e8a4496fec28","count":2} -2025-08-23T00:09:12.203Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"e3a2683f-00b2-43d3-bbdb-b0f210834e42","username":"testuser1_1755907752196","email":"test1_1755907752196@example.com"} -2025-08-23T00:09:12.209Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"68e4ca8c-de25-4161-accf-8e6368749958","username":"testuser2_1755907752204","email":"test2_1755907752204@example.com"} -2025-08-23T00:09:12.219Z | [DATABASE] | User created successfully | Meta:{"executionTime":9,"userId":"db339082-a965-4183-aa35-f8ab6d5b7b5f","username":"premiumuser_1755907752210","email":"premium_1755907752210@example.com"} -2025-08-23T00:09:12.231Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":10,"chatId":"35e37a74-4275-44ca-aedd-a461a58386c9","type":"direct","participants":2} -2025-08-23T00:09:12.236Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(e3a2683f-00b2-43d3-bbdb-b0f210834e42)","executionTime":4,"userId":"e3a2683f-00b2-43d3-bbdb-b0f210834e42","count":1} -2025-08-23T00:09:12.246Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"4bb03bca-d1b8-4cc4-a6c4-5e3955948c56","username":"testuser1_1755907752238","email":"test1_1755907752238@example.com"} -2025-08-23T00:09:12.254Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"c9522626-3ec0-44f1-8f8c-0b4180643f9d","username":"testuser2_1755907752247","email":"test2_1755907752247@example.com"} -2025-08-23T00:09:12.263Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"06990fa1-0b44-4414-bdd8-1a92889029d1","username":"premiumuser_1755907752255","email":"premium_1755907752255@example.com"} -2025-08-23T00:09:12.273Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":8,"chatId":"3cbd542f-13d7-4da1-8be0-b16de6d371ba","type":"direct","participants":2} -2025-08-23T00:09:12.289Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":15,"inactivityMinutes":60,"count":237,"cutoffDate":"2025-08-22T23:09:12.274Z"} -2025-08-23T00:09:12.309Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-375Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-375Z.log deleted file mode 100644 index 5bbb06ff..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-11-375Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:11.375Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.009Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:09:13.031Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-477Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-477Z.log deleted file mode 100644 index 724d93d0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-477Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.477Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.506Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-23T00:09:12.595Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-639Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-639Z.log deleted file mode 100644 index c9877ce7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-639Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.639Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.741Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-641Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-641Z.log deleted file mode 100644 index becd9902..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-641Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.641Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.752Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-675Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-675Z.log deleted file mode 100644 index 94865ee6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-675Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.675Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.706Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:09:12.767Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:09:12.772Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:09:12.791Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:09:12.793Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:09:12.832Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-697Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-697Z.log deleted file mode 100644 index 478cddbf..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-697Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.697Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.793Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-707Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-707Z.log deleted file mode 100644 index 5baa23bb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-707Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.707Z -# Max entries per file: 10000 - -2025-08-23T00:09:14.897Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:09:14.963Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:09:15.005Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:15.024Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:15.032Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:15.037Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:15.047Z | [DATABASE] | User lookup completed | Meta:{"executionTime":10,"found":true,"searchBy":"username"} -2025-08-23T00:09:15.055Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":1} -2025-08-23T00:09:15.068Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":31} -2025-08-23T00:09:15.072Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:09:15.084Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":false,"searchBy":"username"} -2025-08-23T00:09:15.085Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:09:15.095Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:15.109Z | [DATABASE] | User lookup completed | Meta:{"executionTime":14,"found":true,"searchBy":"username"} -2025-08-23T00:09:15.115Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:09:15.126Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:09:15.133Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:15.168Z | [DATABASE] | User lookup completed | Meta:{"executionTime":35,"found":true,"searchBy":"username"} -2025-08-23T00:09:15.169Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:09:15.174Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":41} -2025-08-23T00:09:16.616Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:09:16.748Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:09:16.751Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:16.752Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:09:16.753Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:09:16.783Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-748Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-748Z.log deleted file mode 100644 index 76d375d7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-748Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.748Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-750Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-750Z.log deleted file mode 100644 index 982200fa..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-750Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.750Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.817Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:12.863Z | [DATABASE] | User lookup completed | Meta:{"executionTime":46,"found":true,"searchBy":"username"} -2025-08-23T00:09:12.865Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:09:12.867Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":50} -2025-08-23T00:09:12.872Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-23T00:09:12.874Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:09:12.876Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:09:12.877Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":5} -2025-08-23T00:09:12.879Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:09:12.881Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:09:12.882Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:09:12.885Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:12.886Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:09:12.887Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:09:12.888Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:09:12.898Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:12.900Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:09:12.909Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.913Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:12.915Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.921Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":8} -2025-08-23T00:09:12.925Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:09:12.927Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:09:12.928Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:09:12.930Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:09:12.933Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:09:12.970Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-842Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-842Z.log deleted file mode 100644 index f7f7585c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-842Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.842Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.846Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:09:12.855Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:12.857Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:09:12.858Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:09:12.863Z | [STARTUP] | Test message -2025-08-23T00:09:12.864Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:09:12.869Z | [STARTUP] | Test for directory creation -2025-08-23T00:09:12.904Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-886Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-886Z.log deleted file mode 100644 index 0d126090..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-886Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.886Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.904Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-929Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-929Z.log deleted file mode 100644 index fa87d073..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-929Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.929Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.945Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-931Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-931Z.log deleted file mode 100644 index ed7e0c83..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-931Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.931Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-961Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-961Z.log deleted file mode 100644 index 480d299a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-12-961Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:12.961Z -# Max entries per file: 10000 - -2025-08-23T00:09:12.977Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-094Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-094Z.log deleted file mode 100644 index c4ec2fc8..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-094Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:13.094Z -# Max entries per file: 10000 - -2025-08-23T00:09:13.104Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.106Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.106Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.109Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.127Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-505Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-505Z.log deleted file mode 100644 index ad2fe6d6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-505Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:13.505Z -# Max entries per file: 10000 - -2025-08-23T00:09:13.524Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.536Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.542Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.549Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.553Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.560Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.565Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.567Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:09:13.640Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-583Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-583Z.log deleted file mode 100644 index 46b13ce7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-09-13-583Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:09:13.583Z -# Max entries per file: 10000 - -2025-08-23T00:09:13.585Z | [AUTH] | Authentication successful | ReqId:k0s3lnv88 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:09:13.589Z | [AUTH] | Authentication failed - No valid token | ReqId:4fmgykvux | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:09:13.591Z | [AUTH] | Authentication successful | ReqId:7snjrqaa3 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:09:13.591Z | [AUTH] | Token refreshed | ReqId:zqsv4eujc | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:09:13.593Z | [AUTH] | Admin authentication successful | ReqId:mldpfa4qg | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:09:13.594Z | [WARNING] | Admin access denied | ReqId:nlgthgokt | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:09:13.597Z | [WARNING] | Admin access denied | ReqId:n9oo70tch | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:09:13.602Z | [AUTH] | Admin authentication successful | ReqId:0phzvoffx | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:09:13.603Z | [AUTH] | Admin token refreshed | ReqId:22gakdkpc | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:09:13.618Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-11-30-055Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-11-30-055Z.log deleted file mode 100644 index 7c9cd535..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-11-30-055Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:11:30.055Z -# Max entries per file: 10000 - -2025-08-23T00:11:30.352Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-23T00:11:30.413Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-14-08-890Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-14-08-890Z.log deleted file mode 100644 index d980b184..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-14-08-890Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:14:08.890Z -# Max entries per file: 10000 - -2025-08-23T00:14:08.910Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:14:08.938Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:14:08.938Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:14:08.943Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:14:08.946Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:14:08.962Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:14:08.966Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:14:08.989Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-15-23-535Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-15-23-535Z.log deleted file mode 100644 index 6ed9ea43..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-15-23-535Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:15:23.535Z -# Max entries per file: 10000 - -2025-08-23T00:15:23.554Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:23.580Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:15:23.580Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:23.584Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:23.586Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:15:23.600Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:15:23.602Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:23.624Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-15-54-057Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-15-54-057Z.log deleted file mode 100644 index 9227f6b3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-15-54-057Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:15:54.057Z -# Max entries per file: 10000 - -2025-08-23T00:15:54.076Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:54.103Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:15:54.103Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:54.106Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:54.109Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:15:54.122Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:15:54.124Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:15:54.154Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-374Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-374Z.log deleted file mode 100644 index 4d42081f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-374Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.374Z -# Max entries per file: 10000 - -2025-08-23T00:16:13.418Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"ctype":0,"cardCount":1} -2025-08-23T00:16:13.626Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-537Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-537Z.log deleted file mode 100644 index 5a24787e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-537Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.537Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.233Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:16:15.248Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-818Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-818Z.log deleted file mode 100644 index dda6c9c6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-818Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.818Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.002Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-838Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-838Z.log deleted file mode 100644 index e2fe7392..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-838Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.838Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.010Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-849Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-849Z.log deleted file mode 100644 index a703594a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-849Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.849Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.023Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-927Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-927Z.log deleted file mode 100644 index 9b73a862..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-927Z.log +++ /dev/null @@ -1,57 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.927Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.166Z | [DATABASE] | User created successfully | Meta:{"executionTime":21,"userId":"08ea393a-c227-47aa-9a8c-25b4a8de3dc7","username":"testuser1_1755908174145","email":"test1_1755908174145@example.com"} -2025-08-23T00:16:14.244Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"e7c0b31a-bb35-4cf3-aaf6-cf2c571d6b7d","username":"testuser2_1755908174238","email":"test2_1755908174238@example.com"} -2025-08-23T00:16:14.251Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"c430ad39-a1dc-45b2-84d9-d8c273bf7b62","username":"premiumuser_1755908174246","email":"premium_1755908174246@example.com"} -2025-08-23T00:16:14.262Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":8,"chatId":"44707b2e-8981-40d6-9686-23150b25292f","type":"direct","participants":2} -2025-08-23T00:16:14.276Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"fc3a57b5-ca64-4eb5-b80a-a23586b99f98","username":"testuser1_1755908174269","email":"test1_1755908174269@example.com"} -2025-08-23T00:16:14.285Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"2d39a9ac-3a1d-4815-a087-6635af3692be","username":"testuser2_1755908174278","email":"test2_1755908174278@example.com"} -2025-08-23T00:16:14.292Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"833525e3-d5f7-40ed-bccb-09cd5406c068","username":"premiumuser_1755908174287","email":"premium_1755908174287@example.com"} -2025-08-23T00:16:14.300Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"b269a51c-bdb4-4e8d-99ef-5be6657230b7","type":"group","participants":3} -2025-08-23T00:16:14.309Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"cff8c3d2-cc03-4d63-9c9b-bf3761031c94","username":"testuser1_1755908174303","email":"test1_1755908174303@example.com"} -2025-08-23T00:16:14.315Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"7aaa3d6f-7743-4fc5-8896-ac03e3cc03fd","username":"testuser2_1755908174310","email":"test2_1755908174310@example.com"} -2025-08-23T00:16:14.321Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"f6fe89a1-034f-41ff-beb6-d2b34866a2cf","username":"premiumuser_1755908174316","email":"premium_1755908174316@example.com"} -2025-08-23T00:16:14.329Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"dafe326c-c523-4945-87bb-44ee13f9b8c3","type":"game","participants":2} -2025-08-23T00:16:14.336Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"e9bf799f-17bc-4452-bd7a-139d37ee08d1","username":"testuser1_1755908174331","email":"test1_1755908174331@example.com"} -2025-08-23T00:16:14.343Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"2123fb6d-41c7-4912-b4eb-409bd57e700f","username":"testuser2_1755908174338","email":"test2_1755908174338@example.com"} -2025-08-23T00:16:14.353Z | [DATABASE] | User created successfully | Meta:{"executionTime":8,"userId":"ebb496f3-b3d9-43ac-a9db-c9832ad25133","username":"premiumuser_1755908174345","email":"premium_1755908174345@example.com"} -2025-08-23T00:16:14.359Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"0b22e8f4-904a-461f-b585-33ff1927b955","type":"game","participants":2} -2025-08-23T00:16:14.368Z | [DATABASE] | Chat retrieved by game id | Meta:{"query":"findByGameId(cc81c08e-3b8f-4f26-ab19-00db028d4262)","executionTime":8,"gameId":"cc81c08e-3b8f-4f26-ab19-00db028d4262","found":true} -2025-08-23T00:16:14.375Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"d201d785-2fce-484f-8b02-909c828f1168","username":"testuser1_1755908174370","email":"test1_1755908174370@example.com"} -2025-08-23T00:16:14.381Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"21019bc3-71aa-4c49-9569-541e66092af7","username":"testuser2_1755908174376","email":"test2_1755908174376@example.com"} -2025-08-23T00:16:14.387Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"f7156ae8-5f31-47e9-9b71-bba130e9f023","username":"premiumuser_1755908174383","email":"premium_1755908174383@example.com"} -2025-08-23T00:16:14.393Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"4f2362f6-c8b3-4d26-bdd0-aea20a7bc018","type":"direct","participants":2} -2025-08-23T00:16:14.402Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"4f2362f6-c8b3-4d26-bdd0-aea20a7bc018"} -2025-08-23T00:16:14.403Z | [DATABASE] | Chat updated successfully | Meta:{"query":"update(4f2362f6-c8b3-4d26-bdd0-aea20a7bc018)","executionTime":8,"chatId":"4f2362f6-c8b3-4d26-bdd0-aea20a7bc018","updatedFields":["messages","lastActivity"],"success":true} -2025-08-23T00:16:14.406Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"4f2362f6-c8b3-4d26-bdd0-aea20a7bc018"} -2025-08-23T00:16:14.412Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"3996ce7c-d8bc-4d0e-ab32-1da8f1431875","username":"testuser1_1755908174407","email":"test1_1755908174407@example.com"} -2025-08-23T00:16:14.417Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"904e5038-00c3-4a5c-a0ee-c13d22e69504","username":"testuser2_1755908174413","email":"test2_1755908174413@example.com"} -2025-08-23T00:16:14.424Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"fc8ee6d7-e96e-4f62-8322-b57cc66b6e84","username":"premiumuser_1755908174418","email":"premium_1755908174418@example.com"} -2025-08-23T00:16:14.432Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":6,"chatId":"e209b810-4e5e-4e59-a497-c4c6fa9e43c4","type":"direct","participants":2} -2025-08-23T00:16:14.441Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(e209b810-4e5e-4e59-a497-c4c6fa9e43c4)","executionTime":8,"chatId":"e209b810-4e5e-4e59-a497-c4c6fa9e43c4","messageCount":1,"archiveId":"4704b536-9b4e-42e9-87d2-cacb122869d9"} -2025-08-23T00:16:14.444Z | [DATABASE] | Chat findById query completed | Meta:{"executionTime":2,"found":true,"chatId":"e209b810-4e5e-4e59-a497-c4c6fa9e43c4"} -2025-08-23T00:16:14.452Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"c57f8c6b-0245-43f3-baf9-37dd089e147e","username":"testuser1_1755908174446","email":"test1_1755908174446@example.com"} -2025-08-23T00:16:14.459Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"d8d6b726-1f96-4b7a-a916-51a90cd70753","username":"testuser2_1755908174453","email":"test2_1755908174453@example.com"} -2025-08-23T00:16:14.465Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"60514455-2bd8-48f7-b856-ee95b922ebf9","username":"premiumuser_1755908174460","email":"premium_1755908174460@example.com"} -2025-08-23T00:16:14.470Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"5ae7d45f-e38c-4ee0-ade6-06dde09be65e","type":"direct","participants":2} -2025-08-23T00:16:14.478Z | [DATABASE] | Chat archived successfully | Meta:{"query":"archiveChat(5ae7d45f-e38c-4ee0-ade6-06dde09be65e)","executionTime":6,"chatId":"5ae7d45f-e38c-4ee0-ade6-06dde09be65e","messageCount":1,"archiveId":"272fa3f9-e339-49cb-8914-a0c58ba5ade7"} -2025-08-23T00:16:14.482Z | [DATABASE] | Archived chat retrieved | Meta:{"query":"getArchivedChat(5ae7d45f-e38c-4ee0-ade6-06dde09be65e)","executionTime":2,"chatId":"5ae7d45f-e38c-4ee0-ade6-06dde09be65e","found":true} -2025-08-23T00:16:14.490Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"8bb99cb0-da7e-405c-96ff-85cad2780a7e","username":"testuser1_1755908174484","email":"test1_1755908174484@example.com"} -2025-08-23T00:16:14.496Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"555c6668-e7d9-48f4-b7cb-81833e3f25d0","username":"testuser2_1755908174491","email":"test2_1755908174491@example.com"} -2025-08-23T00:16:14.506Z | [DATABASE] | User created successfully | Meta:{"executionTime":9,"userId":"43f27f24-52a8-489e-8989-137463e152d2","username":"premiumuser_1755908174497","email":"premium_1755908174497@example.com"} -2025-08-23T00:16:14.512Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":4,"chatId":"74517ccd-502e-47be-99d6-2b94f794cfa9","type":"direct","participants":2} -2025-08-23T00:16:14.518Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"a22f4ca0-5656-40f6-a504-73a2f7e2043b","type":"group","participants":2} -2025-08-23T00:16:14.522Z | [DATABASE] | Chats retrieved by user id | Meta:{"query":"findByUserId(8bb99cb0-da7e-405c-96ff-85cad2780a7e)","executionTime":3,"userId":"8bb99cb0-da7e-405c-96ff-85cad2780a7e","count":2} -2025-08-23T00:16:14.529Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"fd304106-dc78-4db9-b56c-9b9d5a54525c","username":"testuser1_1755908174524","email":"test1_1755908174524@example.com"} -2025-08-23T00:16:14.534Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"078e8fd5-a00c-4d34-ae1d-31236f929abe","username":"testuser2_1755908174530","email":"test2_1755908174530@example.com"} -2025-08-23T00:16:14.542Z | [DATABASE] | User created successfully | Meta:{"executionTime":7,"userId":"3888e9c6-3d87-4520-810d-10005063ce30","username":"premiumuser_1755908174535","email":"premium_1755908174535@example.com"} -2025-08-23T00:16:14.548Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"94d10796-2ef9-4d4b-b29c-b20c4de2e696","type":"direct","participants":2} -2025-08-23T00:16:14.552Z | [DATABASE] | Active chats retrieved for user | Meta:{"query":"findActiveChatsForUser(fd304106-dc78-4db9-b56c-9b9d5a54525c)","executionTime":3,"userId":"fd304106-dc78-4db9-b56c-9b9d5a54525c","count":1} -2025-08-23T00:16:14.557Z | [DATABASE] | User created successfully | Meta:{"executionTime":4,"userId":"bcbdf70d-4078-400b-884d-d292d9b1f2a7","username":"testuser1_1755908174553","email":"test1_1755908174553@example.com"} -2025-08-23T00:16:14.563Z | [DATABASE] | User created successfully | Meta:{"executionTime":5,"userId":"b09516e8-e02e-48cb-8ee2-b3dfbfea11ee","username":"testuser2_1755908174558","email":"test2_1755908174558@example.com"} -2025-08-23T00:16:14.570Z | [DATABASE] | User created successfully | Meta:{"executionTime":6,"userId":"5a8e8fec-a1d8-4898-a337-1cf7edf8f945","username":"premiumuser_1755908174564","email":"premium_1755908174564@example.com"} -2025-08-23T00:16:14.576Z | [DATABASE] | Chat created successfully | Meta:{"executionTime":5,"chatId":"fc9d4a03-39d7-417c-9831-034bd14fd56b","type":"direct","participants":2} -2025-08-23T00:16:14.610Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(60min)","executionTime":33,"inactivityMinutes":60,"count":238,"cutoffDate":"2025-08-22T23:16:14.577Z"} -2025-08-23T00:16:14.625Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-938Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-938Z.log deleted file mode 100644 index 5228a168..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-938Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.938Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.099Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-946Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-946Z.log deleted file mode 100644 index 39c5cd97..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-13-946Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:13.946Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.022Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:16:14.273Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-179Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-179Z.log deleted file mode 100644 index b9db740e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-179Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.179Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.592Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.648Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.678Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.686Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.694Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.696Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.700Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.704Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:16:14.706Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.708Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.712Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:16:14.714Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.717Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.723Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.725Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.728Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.731Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.732Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.734Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.737Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.738Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.741Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.744Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:16:14.747Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.750Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:14.762Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:16:14.805Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-478Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-478Z.log deleted file mode 100644 index f01a1b5e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-478Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.478Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.945Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:16:15.987Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:16:15.999Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:16.004Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:16.008Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:16.013Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:16.017Z | [DATABASE] | User lookup completed | Meta:{"executionTime":4,"found":true,"searchBy":"username"} -2025-08-23T00:16:16.020Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:16:16.024Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":11} -2025-08-23T00:16:16.026Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:16:16.028Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:16:16.029Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:16:16.031Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:16.032Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:16:16.034Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:16:16.035Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:16:16.039Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:16.041Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:16:16.042Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:16:16.044Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":5} -2025-08-23T00:16:17.310Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:16:17.314Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:16:17.329Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:17.335Z | [DATABASE] | User lookup completed | Meta:{"executionTime":6,"found":false,"searchBy":"username"} -2025-08-23T00:16:17.355Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:16:17.507Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-504Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-504Z.log deleted file mode 100644 index 0ebf9f4a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-504Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.504Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.614Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-596Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-596Z.log deleted file mode 100644 index 7f5a7d13..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-596Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.596Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.679Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-844Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-844Z.log deleted file mode 100644 index 698d55c0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-844Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.844Z -# Max entries per file: 10000 - -2025-08-23T00:16:14.940Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-961Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-961Z.log deleted file mode 100644 index 4c3082fd..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-961Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.961Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-964Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-964Z.log deleted file mode 100644 index 18cb2ba7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-14-964Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:14.964Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.019Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:15.059Z | [DATABASE] | User lookup completed | Meta:{"executionTime":40,"found":true,"searchBy":"username"} -2025-08-23T00:16:15.061Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:16:15.063Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"org-123","requiresOrgReauth":false,"totalLoginTime":44} -2025-08-23T00:16:15.067Z | [AUTH] | Login attempt | Meta:{"username":"adminuser"} -2025-08-23T00:16:15.069Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:16:15.071Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:16:15.072Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":5} -2025-08-23T00:16:15.075Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:16:15.077Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:16:15.084Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:16:15.086Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:15.092Z | [DATABASE] | User lookup completed | Meta:{"executionTime":6,"found":true,"searchBy":"username"} -2025-08-23T00:16:15.096Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:16:15.098Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:16:15.105Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:15.106Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:16:15.115Z | [ERROR] | Password verification error | Meta:{"name":"Error","message":"password verification failed","stack":"Error: password verification failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:176:60)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.120Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:15.128Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"database connection error","stack":"Error: database connection error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:195:59)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.132Z | [DATABASE] | Database connection error during login | Meta:{"executionTime":12} -2025-08-23T00:16:15.143Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:16:15.146Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":true,"searchBy":"username"} -2025-08-23T00:16:15.147Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:16:15.165Z | [ERROR] | Token creation failed during login | Meta:{"name":"Error","message":"JWT creation failed","stack":"Error: JWT creation failed\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:217:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at JWTService. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at JWTService.mockConstructor [as create] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:78:39)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:16:15.168Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"Login failed due to internal error","stack":"Error: Login failed due to internal error\n at LoginCommandHandler.execute (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\User\\commands\\LoginCommandHandler.ts:133:15)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\LoginCommandHandler.test.ts:221:7)"} -2025-08-23T00:16:15.207Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-017Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-017Z.log deleted file mode 100644 index fd4a58a3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-017Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.017Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.023Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.035Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:16:15.035Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.040Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.043Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:16:15.054Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:16:15.060Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.076Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-099Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-099Z.log deleted file mode 100644 index 4201cf1e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-099Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.099Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.133Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:16:15.182Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.187Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:16:15.190Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.191Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:16:15.223Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-334Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-334Z.log deleted file mode 100644 index e7b0c89e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-334Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.334Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.351Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.366Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.378Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.384Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.389Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.395Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.401Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.406Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.470Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-379Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-379Z.log deleted file mode 100644 index 7d3b234c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-379Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.379Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.394Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-407Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-407Z.log deleted file mode 100644 index c56986f2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-407Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.407Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-434Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-434Z.log deleted file mode 100644 index 63a06534..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-434Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.434Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.447Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-444Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-444Z.log deleted file mode 100644 index d98a721b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-444Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.444Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.457Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-494Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-494Z.log deleted file mode 100644 index 60ae9960..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-494Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.494Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.497Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:16:15.505Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.506Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:16:15.507Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:16:15.507Z | [STARTUP] | Test message -2025-08-23T00:16:15.508Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:16:15.511Z | [STARTUP] | Test for directory creation -2025-08-23T00:16:15.536Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-803Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-803Z.log deleted file mode 100644 index 2d955199..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-803Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.803Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.805Z | [AUTH] | Authentication successful | ReqId:8nx62vwtf | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:16:15.809Z | [AUTH] | Authentication failed - No valid token | ReqId:y5ioe4n1a | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:16:15.811Z | [AUTH] | Authentication successful | ReqId:xii078z42 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:16:15.812Z | [AUTH] | Token refreshed | ReqId:k018eq9eh | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:16:15.818Z | [AUTH] | Admin authentication successful | ReqId:yi54zph57 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:16:15.820Z | [WARNING] | Admin access denied | ReqId:7z2ooeseb | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:16:15.825Z | [WARNING] | Admin access denied | ReqId:4cgbnnw7s | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:16:15.829Z | [AUTH] | Admin authentication successful | ReqId:ghvljwjk7 | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:16:15.829Z | [AUTH] | Admin token refreshed | ReqId:fjn2nakyu | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:16:15.842Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-842Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-842Z.log deleted file mode 100644 index b2750c7d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-16-15-842Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:16:15.842Z -# Max entries per file: 10000 - -2025-08-23T00:16:15.851Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.853Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.854Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.856Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:16:15.873Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-20-46-386Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-20-46-386Z.log deleted file mode 100644 index 7219d5d7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-20-46-386Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:20:46.386Z -# Max entries per file: 10000 - -2025-08-23T00:20:46.433Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-24-24-917Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-24-24-917Z.log deleted file mode 100644 index 5d9f951f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-24-24-917Z.log +++ /dev/null @@ -1,36 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:24:24.917Z -# Max entries per file: 10000 - -2025-08-23T00:24:34.359Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T00:24:34.375Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T00:24:34.375Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T00:24:36.059Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T00:24:36.087Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:24:36.089Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T00:24:36.092Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:39:45.668Z | [REQUEST] | Incoming request | ReqId:2qmmr12w9 | IP:::ffff:172.19.0.1 | GET / | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:45.671Z | [REQUEST] | GET / | ReqId:2qmmr12w9 | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:45.676Z | [REQUEST] | Request completed | ReqId:2qmmr12w9 | IP:::ffff:172.19.0.1 | GET / | Status:304 | Time:8ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:45.712Z | [REQUEST] | Incoming request | ReqId:gc4lsvxbq | IP:::ffff:172.19.0.1 | GET /favicon.ico | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:45.713Z | [REQUEST] | GET /favicon.ico | ReqId:gc4lsvxbq | IP:::ffff:172.19.0.1 | GET /favicon.ico | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:45.716Z | [REQUEST] | Request completed | ReqId:gc4lsvxbq | IP:::ffff:172.19.0.1 | GET /favicon.ico | Status:404 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.606Z | [REQUEST] | Incoming request | ReqId:fkv1mw7wq | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.608Z | [REQUEST] | GET /api-docs/ | ReqId:fkv1mw7wq | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.611Z | [REQUEST] | Request completed | ReqId:fkv1mw7wq | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.629Z | [REQUEST] | Incoming request | ReqId:8w9odijux | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.631Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:8w9odijux | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.637Z | [REQUEST] | Request completed | ReqId:8w9odijux | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | Status:200 | Time:8ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.639Z | [REQUEST] | Incoming request | ReqId:rup3l7wfx | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.641Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:rup3l7wfx | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.642Z | [REQUEST] | Request completed | ReqId:rup3l7wfx | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.664Z | [REQUEST] | Incoming request | ReqId:vtf0pk6ic | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.667Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:vtf0pk6ic | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.670Z | [REQUEST] | Incoming request | ReqId:7wzy0fy7r | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.672Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:7wzy0fy7r | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.677Z | [REQUEST] | Request completed | ReqId:vtf0pk6ic | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | Time:13ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.685Z | [REQUEST] | Request completed | ReqId:7wzy0fy7r | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | Time:15ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.790Z | [REQUEST] | Incoming request | ReqId:wvl2x5qm8 | IP:::ffff:172.19.0.1 | GET /api-docs/favicon-16x16.png | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:39:52.791Z | [REQUEST] | GET /api-docs/favicon-16x16.png | ReqId:wvl2x5qm8 | IP:::ffff:172.19.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:40:49.749Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T00:40:49.751Z | [STARTUP] | HTTP server closed -2025-08-23T00:40:49.753Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-37-11-854Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-37-11-854Z.log deleted file mode 100644 index b53c38b5..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-37-11-854Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:37:11.854Z -# Max entries per file: 10000 - -2025-08-23T00:37:11.947Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:37:11.949Z | [STARTUP] | Created Minio bucket: serpentrace-logs diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-40-44-283Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-40-44-283Z.log deleted file mode 100644 index e06a2502..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-40-44-283Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:40:44.283Z -# Max entries per file: 10000 - -2025-08-23T00:40:44.336Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-42-08-461Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-42-08-461Z.log deleted file mode 100644 index a8dc1678..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-42-08-461Z.log +++ /dev/null @@ -1,37 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:42:08.461Z -# Max entries per file: 10000 - -2025-08-23T00:42:17.297Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T00:42:17.309Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T00:42:17.309Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T00:42:18.450Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T00:42:18.510Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:42:18.511Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T00:42:18.520Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:42:39.705Z | [REQUEST] | Incoming request | ReqId:hilkjjko6 | IP:::ffff:172.19.0.1 | GET / | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:39.707Z | [REQUEST] | GET / | ReqId:hilkjjko6 | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:39.710Z | [REQUEST] | Request completed | ReqId:hilkjjko6 | IP:::ffff:172.19.0.1 | GET / | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:39.732Z | [REQUEST] | Incoming request | ReqId:kxa5ltr4f | IP:::ffff:172.19.0.1 | GET /favicon.ico | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:39.734Z | [REQUEST] | GET /favicon.ico | ReqId:kxa5ltr4f | IP:::ffff:172.19.0.1 | GET /favicon.ico | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:39.736Z | [REQUEST] | Request completed | ReqId:kxa5ltr4f | IP:::ffff:172.19.0.1 | GET /favicon.ico | Status:404 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.373Z | [REQUEST] | Incoming request | ReqId:oxnztb7s9 | IP:::ffff:172.19.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.375Z | [REQUEST] | GET /api-docs | ReqId:oxnztb7s9 | IP:::ffff:172.19.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.377Z | [REQUEST] | Request completed | ReqId:oxnztb7s9 | IP:::ffff:172.19.0.1 | GET /api-docs | Status:301 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.383Z | [REQUEST] | Incoming request | ReqId:2oixxr8ha | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.385Z | [REQUEST] | GET /api-docs/ | ReqId:2oixxr8ha | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.387Z | [REQUEST] | Request completed | ReqId:2oixxr8ha | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.402Z | [REQUEST] | Incoming request | ReqId:i5d79svag | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.404Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:i5d79svag | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.407Z | [REQUEST] | Request completed | ReqId:i5d79svag | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.409Z | [REQUEST] | Incoming request | ReqId:w0ew05uqd | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.411Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:w0ew05uqd | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.413Z | [REQUEST] | Request completed | ReqId:w0ew05uqd | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.415Z | [REQUEST] | Incoming request | ReqId:vwjyz41ri | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.417Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:vwjyz41ri | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.419Z | [REQUEST] | Request completed | ReqId:vwjyz41ri | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.422Z | [REQUEST] | Incoming request | ReqId:dyi0lg3mr | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.424Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:dyi0lg3mr | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:42:49.425Z | [REQUEST] | Request completed | ReqId:dyi0lg3mr | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:47:11.134Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T00:47:11.137Z | [STARTUP] | HTTP server closed -2025-08-23T00:47:11.139Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-46-39-239Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-46-39-239Z.log deleted file mode 100644 index f1c7218c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-46-39-239Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:46:39.239Z -# Max entries per file: 10000 - -2025-08-23T00:46:39.300Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:46:39.323Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:46:39.326Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:46:39.357Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-47-15-288Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-47-15-288Z.log deleted file mode 100644 index e3012687..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-47-15-288Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:47:15.288Z -# Max entries per file: 10000 - -2025-08-23T00:47:22.845Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T00:47:22.856Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T00:47:22.856Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T00:47:23.972Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T00:47:23.997Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:47:23.999Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T00:47:24.001Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:47:25.437Z | [REQUEST] | Incoming request | ReqId:lq7oxjcgt | IP:::ffff:172.19.0.1 | GET /api-docs?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910045430 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:47:25.440Z | [REQUEST] | GET /api-docs | ReqId:lq7oxjcgt | IP:::ffff:172.19.0.1 | GET /api-docs?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910045430 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:47:25.443Z | [REQUEST] | Request completed | ReqId:lq7oxjcgt | IP:::ffff:172.19.0.1 | GET /api-docs?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910045430 | Status:301 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:47:25.449Z | [REQUEST] | Incoming request | ReqId:19p3nk7ox | IP:::ffff:172.19.0.1 | GET /api-docs/?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910045430 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:47:25.451Z | [REQUEST] | GET /api-docs/ | ReqId:19p3nk7ox | IP:::ffff:172.19.0.1 | GET /api-docs/?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910045430 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:47:25.454Z | [REQUEST] | Request completed | ReqId:19p3nk7ox | IP:::ffff:172.19.0.1 | GET /api-docs/?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910045430 | Status:200 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:47:34.982Z | [REQUEST] | Incoming request | ReqId:s8e8rkbei | IP:::ffff:172.19.0.1 | GET / | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:47:34.983Z | [REQUEST] | GET / | ReqId:s8e8rkbei | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:47:34.985Z | [REQUEST] | Request completed | ReqId:s8e8rkbei | IP:::ffff:172.19.0.1 | GET / | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:48:50.184Z | [REQUEST] | Incoming request | ReqId:f42x8d34f | IP:::ffff:172.19.0.1 | GET / | UA:node -2025-08-23T00:48:50.191Z | [REQUEST] | GET / | ReqId:f42x8d34f | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:node -2025-08-23T00:48:50.203Z | [REQUEST] | Request completed | ReqId:f42x8d34f | IP:::ffff:172.19.0.1 | GET / | Status:200 | Time:20ms | UA:node -2025-08-23T00:48:50.222Z | [REQUEST] | Incoming request | ReqId:eagncxihh | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:node -2025-08-23T00:48:50.224Z | [REQUEST] | GET /api-docs/ | ReqId:eagncxihh | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:node -2025-08-23T00:48:50.229Z | [REQUEST] | Request completed | ReqId:eagncxihh | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | Time:7ms | UA:node -2025-08-23T00:48:50.237Z | [REQUEST] | Incoming request | ReqId:59b9k39tw | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | UA:node -2025-08-23T00:48:50.239Z | [REQUEST] | GET /api-docs/swagger.json | ReqId:59b9k39tw | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | Status:200 | UA:node -2025-08-23T00:48:50.246Z | [REQUEST] | Request completed | ReqId:59b9k39tw | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | Status:200 | Time:9ms | UA:node -2025-08-23T00:50:17.076Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T00:50:17.081Z | [STARTUP] | HTTP server closed -2025-08-23T00:50:17.084Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-27-150Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-27-150Z.log deleted file mode 100644 index b0165a47..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-27-150Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:27.150Z -# Max entries per file: 10000 - -2025-08-23T00:48:27.293Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.397Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.408Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.421Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.431Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.444Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.464Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:27.469Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:28.164Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-254Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-254Z.log deleted file mode 100644 index dd7f1a1a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-254Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:29.254Z -# Max entries per file: 10000 - -2025-08-23T00:48:29.533Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:48:31.702Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-592Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-592Z.log deleted file mode 100644 index 43ba0fd6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-592Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:29.592Z -# Max entries per file: 10000 - -2025-08-23T00:48:31.595Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-623Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-623Z.log deleted file mode 100644 index 4c854ca1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-623Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:29.623Z -# Max entries per file: 10000 - -2025-08-23T00:48:30.058Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:48:30.512Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:48:30.715Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:48:31.556Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-649Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-649Z.log deleted file mode 100644 index f7d86134..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-649Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:29.649Z -# Max entries per file: 10000 - -2025-08-23T00:48:31.553Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-655Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-655Z.log deleted file mode 100644 index cfb68cdb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-29-655Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:29.655Z -# Max entries per file: 10000 - -2025-08-23T00:48:31.583Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-058Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-058Z.log deleted file mode 100644 index 6494f956..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-058Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:30.058Z -# Max entries per file: 10000 - -2025-08-23T00:48:31.553Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-072Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-072Z.log deleted file mode 100644 index 852786a2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-072Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:30.072Z -# Max entries per file: 10000 - -2025-08-23T00:48:31.518Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-368Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-368Z.log deleted file mode 100644 index 1991d899..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-368Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:30.368Z -# Max entries per file: 10000 - -2025-08-23T00:48:32.345Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:48:33.406Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-591Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-591Z.log deleted file mode 100644 index 7f01c187..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-30-591Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:30.591Z -# Max entries per file: 10000 - -2025-08-23T00:48:32.437Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.497Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.620Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.643Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.664Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.669Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.678Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.698Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:48:32.702Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.707Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.716Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:48:32.723Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.739Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.751Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.753Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.757Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.761Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.764Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.770Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.780Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.787Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.790Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.794Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:48:32.801Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.804Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:32.820Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:48:32.880Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-31-473Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-31-473Z.log deleted file mode 100644 index 1c0ac868..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-31-473Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:31.473Z -# Max entries per file: 10000 - -2025-08-23T00:48:31.634Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-432Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-432Z.log deleted file mode 100644 index 8b7f2d52..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-432Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:32.432Z -# Max entries per file: 10000 - -2025-08-23T00:48:32.490Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-456Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-456Z.log deleted file mode 100644 index d80a5d4f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-456Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:32.456Z -# Max entries per file: 10000 - -2025-08-23T00:48:32.679Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-469Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-469Z.log deleted file mode 100644 index 3fd5505b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-469Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:32.469Z -# Max entries per file: 10000 - -2025-08-23T00:48:32.707Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-527Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-527Z.log deleted file mode 100644 index 62e6438b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-527Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:32.527Z -# Max entries per file: 10000 - -2025-08-23T00:48:35.203Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:48:35.282Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:48:35.428Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:35.772Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:35.778Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:35.795Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:48:35.925Z | [DATABASE] | User lookup completed | Meta:{"executionTime":130,"found":true,"searchBy":"username"} -2025-08-23T00:48:36.001Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:48:36.077Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":282} -2025-08-23T00:48:36.103Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:48:36.163Z | [DATABASE] | User lookup completed | Meta:{"executionTime":60,"found":false,"searchBy":"username"} -2025-08-23T00:48:36.237Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:48:36.255Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:48:36.289Z | [DATABASE] | User lookup completed | Meta:{"executionTime":34,"found":true,"searchBy":"username"} -2025-08-23T00:48:36.326Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:48:36.332Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:48:36.338Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:48:36.343Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-23T00:48:36.351Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:48:36.355Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":17} -2025-08-23T00:48:37.993Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:48:37.996Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:48:37.998Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:48:37.999Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:48:38.000Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:48:38.021Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-935Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-935Z.log deleted file mode 100644 index 674862ec..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-32-935Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:32.935Z -# Max entries per file: 10000 - -2025-08-23T00:48:32.968Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:48:33.081Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:33.089Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:48:33.103Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:33.106Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:33.249Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-131Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-131Z.log deleted file mode 100644 index 2108f36a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-131Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:33.131Z -# Max entries per file: 10000 - -2025-08-23T00:48:33.136Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:48:33.156Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:33.158Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:48:33.233Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:48:33.237Z | [STARTUP] | Test message -2025-08-23T00:48:33.243Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:48:33.248Z | [STARTUP] | Test for directory creation -2025-08-23T00:48:33.405Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-233Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-233Z.log deleted file mode 100644 index b0abc966..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-233Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:33.233Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-252Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-252Z.log deleted file mode 100644 index 3ddd7613..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-252Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:33.252Z -# Max entries per file: 10000 - -2025-08-23T00:48:33.255Z | [AUTH] | Authentication successful | ReqId:cgykr0b51 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:48:33.268Z | [AUTH] | Authentication failed - No valid token | ReqId:mhdto2ing | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:48:33.286Z | [AUTH] | Authentication successful | ReqId:obr879u3u | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:48:33.294Z | [AUTH] | Token refreshed | ReqId:d55jb3xo9 | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:48:33.301Z | [AUTH] | Admin authentication successful | ReqId:yqxhq4awp | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:48:33.315Z | [WARNING] | Admin access denied | ReqId:jb6d6qp4u | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:48:33.325Z | [WARNING] | Admin access denied | ReqId:xlxpiequm | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:48:33.335Z | [AUTH] | Admin authentication successful | ReqId:qapneq0kg | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:48:33.338Z | [AUTH] | Admin token refreshed | ReqId:tl0o2npqq | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:48:33.405Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-271Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-271Z.log deleted file mode 100644 index 34e58ca5..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-271Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:33.271Z -# Max entries per file: 10000 - -2025-08-23T00:48:33.323Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:33.328Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:33.334Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:33.339Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:48:33.399Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-279Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-279Z.log deleted file mode 100644 index 9e7bd039..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-279Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:33.279Z -# Max entries per file: 10000 - -2025-08-23T00:48:33.396Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-288Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-288Z.log deleted file mode 100644 index 87e1500a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-33-288Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:33.288Z -# Max entries per file: 10000 - -2025-08-23T00:48:33.326Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-37-268Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-37-268Z.log deleted file mode 100644 index e14e62d1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-48-37-268Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:48:37.268Z -# Max entries per file: 10000 - -2025-08-23T00:48:37.281Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:37.297Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:48:37.297Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:37.339Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:37.341Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:48:37.358Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:48:37.360Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:48:37.381Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-22-284Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-22-284Z.log deleted file mode 100644 index a07ef6f4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-22-284Z.log +++ /dev/null @@ -1,61 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:22.284Z -# Max entries per file: 10000 - -2025-08-23T00:50:30.750Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T00:50:30.765Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T00:50:30.765Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T00:50:32.198Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T00:50:32.234Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:32.240Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T00:50:32.244Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:50:50.668Z | [REQUEST] | Incoming request | ReqId:bmql6ji9q | IP:::ffff:172.19.0.1 | GET / | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:50:50.673Z | [REQUEST] | GET / | ReqId:bmql6ji9q | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:50:50.679Z | [REQUEST] | Request completed | ReqId:bmql6ji9q | IP:::ffff:172.19.0.1 | GET / | Status:200 | Time:11ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:50:59.046Z | [REQUEST] | Incoming request | ReqId:futxb8j10 | IP:::ffff:172.19.0.1 | GET / | UA:node -2025-08-23T00:50:59.047Z | [REQUEST] | GET / | ReqId:futxb8j10 | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:node -2025-08-23T00:50:59.049Z | [REQUEST] | Request completed | ReqId:futxb8j10 | IP:::ffff:172.19.0.1 | GET / | Status:200 | Time:3ms | UA:node -2025-08-23T00:50:59.066Z | [REQUEST] | Incoming request | ReqId:xmsq0ndrd | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:node -2025-08-23T00:50:59.068Z | [REQUEST] | GET /api-docs/ | ReqId:xmsq0ndrd | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:node -2025-08-23T00:50:59.073Z | [REQUEST] | Request completed | ReqId:xmsq0ndrd | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | Time:7ms | UA:node -2025-08-23T00:50:59.080Z | [REQUEST] | Incoming request | ReqId:v0mpnwbvh | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | UA:node -2025-08-23T00:50:59.082Z | [REQUEST] | GET /api-docs/swagger.json | ReqId:v0mpnwbvh | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | Status:200 | UA:node -2025-08-23T00:50:59.085Z | [REQUEST] | Request completed | ReqId:v0mpnwbvh | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | Status:200 | Time:5ms | UA:node -2025-08-23T00:51:03.280Z | [REQUEST] | Incoming request | ReqId:5f8c6x11m | IP:::ffff:172.19.0.1 | GET /api-docs?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910263287 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:51:03.283Z | [REQUEST] | GET /api-docs | ReqId:5f8c6x11m | IP:::ffff:172.19.0.1 | GET /api-docs?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910263287 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:51:03.285Z | [REQUEST] | Request completed | ReqId:5f8c6x11m | IP:::ffff:172.19.0.1 | GET /api-docs?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910263287 | Status:301 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:51:03.294Z | [REQUEST] | Incoming request | ReqId:cgz104rbk | IP:::ffff:172.19.0.1 | GET /api-docs/?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910263287 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:51:03.297Z | [REQUEST] | GET /api-docs/ | ReqId:cgz104rbk | IP:::ffff:172.19.0.1 | GET /api-docs/?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910263287 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:51:03.300Z | [REQUEST] | Request completed | ReqId:cgz104rbk | IP:::ffff:172.19.0.1 | GET /api-docs/?id=b7010505-df36-4f60-b08d-492574a6a8e8&vscodeBrowserReqId=1755910263287 | Status:200 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T00:51:07.988Z | [REQUEST] | Incoming request | ReqId:hsbysirnz | IP:::ffff:172.19.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:07.990Z | [REQUEST] | GET /api-docs | ReqId:hsbysirnz | IP:::ffff:172.19.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.029Z | [REQUEST] | Request completed | ReqId:hsbysirnz | IP:::ffff:172.19.0.1 | GET /api-docs | Status:301 | Time:42ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.036Z | [REQUEST] | Incoming request | ReqId:a6h469jtx | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.039Z | [REQUEST] | GET /api-docs/ | ReqId:a6h469jtx | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.044Z | [REQUEST] | Request completed | ReqId:a6h469jtx | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:304 | Time:8ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.070Z | [REQUEST] | Incoming request | ReqId:uwvcp882e | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.073Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:uwvcp882e | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.121Z | [REQUEST] | Request completed | ReqId:uwvcp882e | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:51ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.123Z | [REQUEST] | Incoming request | ReqId:4yqrt9n14 | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.125Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:4yqrt9n14 | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.127Z | [REQUEST] | Request completed | ReqId:4yqrt9n14 | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.130Z | [REQUEST] | Incoming request | ReqId:ut5i3vyso | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.131Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:ut5i3vyso | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.134Z | [REQUEST] | Request completed | ReqId:ut5i3vyso | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.182Z | [REQUEST] | Incoming request | ReqId:x1783pkrx | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.184Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:x1783pkrx | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:51:08.186Z | [REQUEST] | Request completed | ReqId:x1783pkrx | IP:::ffff:172.19.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T00:55:05.018Z | [REQUEST] | Incoming request | ReqId:j2mgee9d3 | IP:::ffff:172.19.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:05.020Z | [REQUEST] | GET /api-docs | ReqId:j2mgee9d3 | IP:::ffff:172.19.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:05.023Z | [REQUEST] | Request completed | ReqId:j2mgee9d3 | IP:::ffff:172.19.0.1 | GET /api-docs | Status:301 | Time:5ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:05.028Z | [REQUEST] | Incoming request | ReqId:gp5iqt8g2 | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:05.030Z | [REQUEST] | GET /api-docs/ | ReqId:gp5iqt8g2 | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:05.032Z | [REQUEST] | Request completed | ReqId:gp5iqt8g2 | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:10.881Z | [REQUEST] | Incoming request | ReqId:7n9cwsm8a | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:10.883Z | [REQUEST] | GET /api-docs/swagger.json | ReqId:7n9cwsm8a | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:10.885Z | [REQUEST] | Request completed | ReqId:7n9cwsm8a | IP:::ffff:172.19.0.1 | GET /api-docs/swagger.json | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:16.425Z | [REQUEST] | Incoming request | ReqId:zm9rvpl5o | IP:::ffff:172.19.0.1 | GET / | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:16.427Z | [REQUEST] | GET / | ReqId:zm9rvpl5o | IP:::ffff:172.19.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T00:55:16.429Z | [REQUEST] | Request completed | ReqId:zm9rvpl5o | IP:::ffff:172.19.0.1 | GET / | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:00:58.971Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T01:00:58.973Z | [STARTUP] | HTTP server closed -2025-08-23T01:00:58.975Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-43-647Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-43-647Z.log deleted file mode 100644 index 62ccd88e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-43-647Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:43.647Z -# Max entries per file: 10000 - -2025-08-23T00:50:43.711Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.811Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.819Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.827Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.835Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.841Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.849Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.853Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:43.926Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-106Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-106Z.log deleted file mode 100644 index c64a2eb4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-106Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.106Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.741Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.793Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.825Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.835Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.840Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.843Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.846Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.849Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:50:44.850Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.853Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.858Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:50:44.859Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.863Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.866Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.868Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.871Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.874Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.876Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.879Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.882Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.883Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.886Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.891Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:50:44.892Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.894Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:44.903Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:50:44.931Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-146Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-146Z.log deleted file mode 100644 index fd6519aa..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-146Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.146Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.666Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:50:45.708Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-153Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-153Z.log deleted file mode 100644 index 231df0b6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-153Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.153Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.188Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:50:44.255Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:44.262Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:50:44.265Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:44.269Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:44.330Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-246Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-246Z.log deleted file mode 100644 index c5120f34..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-246Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.246Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.410Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-265Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-265Z.log deleted file mode 100644 index ef67733f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-265Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.265Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.417Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-326Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-326Z.log deleted file mode 100644 index 98200870..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-326Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.326Z -# Max entries per file: 10000 - -2025-08-23T00:50:45.678Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:50:45.742Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:50:45.770Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.783Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.792Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.799Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:50:45.813Z | [DATABASE] | User lookup completed | Meta:{"executionTime":14,"found":true,"searchBy":"username"} -2025-08-23T00:50:45.819Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:50:45.823Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":24} -2025-08-23T00:50:45.827Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:50:45.829Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":false,"searchBy":"username"} -2025-08-23T00:50:45.839Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:50:45.845Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:50:45.853Z | [DATABASE] | User lookup completed | Meta:{"executionTime":8,"found":true,"searchBy":"username"} -2025-08-23T00:50:45.855Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:50:45.857Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:50:45.864Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:50:45.869Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-23T00:50:45.875Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:50:45.879Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":15} -2025-08-23T00:50:47.096Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:50:47.098Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:50:47.244Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:50:47.245Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:50:47.248Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:50:47.393Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-413Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-413Z.log deleted file mode 100644 index 36afe8d7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-413Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.413Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.605Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-511Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-511Z.log deleted file mode 100644 index cf585649..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-511Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.511Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.599Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:50:44.670Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:50:44.672Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:50:44.735Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-563Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-563Z.log deleted file mode 100644 index 8fae9cbf..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-563Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.563Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.620Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:50:44.841Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-570Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-570Z.log deleted file mode 100644 index ce157f50..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-570Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.570Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.708Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-671Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-671Z.log deleted file mode 100644 index 7160948d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-671Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.671Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.784Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-685Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-685Z.log deleted file mode 100644 index de0414d0..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-685Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.685Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.800Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-728Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-728Z.log deleted file mode 100644 index 8423cd2a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-728Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.728Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.833Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-737Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-737Z.log deleted file mode 100644 index 72e71112..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-44-737Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:44.737Z -# Max entries per file: 10000 - -2025-08-23T00:50:44.865Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-429Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-429Z.log deleted file mode 100644 index 9848ab1c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-429Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:45.429Z -# Max entries per file: 10000 - -2025-08-23T00:50:45.437Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:45.449Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:50:45.449Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:45.452Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:45.460Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:50:45.475Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:50:45.477Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:50:45.494Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-667Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-667Z.log deleted file mode 100644 index 8550b86b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-667Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:45.667Z -# Max entries per file: 10000 - -2025-08-23T00:50:45.672Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:50:45.684Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.687Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:50:45.688Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:50:45.689Z | [STARTUP] | Test message -2025-08-23T00:50:45.690Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:50:45.695Z | [STARTUP] | Test for directory creation -2025-08-23T00:50:45.788Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-700Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-700Z.log deleted file mode 100644 index db68b10d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-700Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:45.700Z -# Max entries per file: 10000 - -2025-08-23T00:50:45.718Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.727Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.731Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.739Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:50:45.790Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-738Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-738Z.log deleted file mode 100644 index 4eb671fb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-738Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:45.738Z -# Max entries per file: 10000 - -2025-08-23T00:50:45.790Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-995Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-995Z.log deleted file mode 100644 index ac55a53f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-45-995Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:45.995Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-023Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-023Z.log deleted file mode 100644 index 13f8abde..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-023Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:46.023Z -# Max entries per file: 10000 - -2025-08-23T00:50:46.078Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-310Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-310Z.log deleted file mode 100644 index c250d03c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-310Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:46.310Z -# Max entries per file: 10000 - -2025-08-23T00:50:46.313Z | [AUTH] | Authentication successful | ReqId:6heho2m4l | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:50:46.322Z | [AUTH] | Authentication failed - No valid token | ReqId:l8irgibya | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:50:46.325Z | [AUTH] | Authentication successful | ReqId:78zsesew3 | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:50:46.335Z | [AUTH] | Token refreshed | ReqId:3bzb4ap87 | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:50:46.340Z | [AUTH] | Admin authentication successful | ReqId:9f4j6ukze | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:50:46.343Z | [WARNING] | Admin access denied | ReqId:i8aehddm4 | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:50:46.350Z | [WARNING] | Admin access denied | ReqId:pwsh6llkt | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:50:46.361Z | [AUTH] | Admin authentication successful | ReqId:8app1gojc | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:50:46.362Z | [AUTH] | Admin token refreshed | ReqId:0gubbgw1u | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:50:46.429Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-490Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-490Z.log deleted file mode 100644 index fc294a57..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-50-46-490Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:50:46.490Z -# Max entries per file: 10000 - -2025-08-23T00:50:46.569Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-485Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-485Z.log deleted file mode 100644 index 8160284c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-485Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:54:21.485Z -# Max entries per file: 10000 - -2025-08-23T00:54:21.538Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:54:21.577Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:54:21.580Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:54:21.643Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-486Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-486Z.log deleted file mode 100644 index 5e0a5aa8..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-486Z.log +++ /dev/null @@ -1,17 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:54:21.486Z -# Max entries per file: 10000 - -2025-08-23T00:54:21.518Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:54:21.521Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.568Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.576Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:54:21.581Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.582Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.579Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:54:21.579Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.593Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.597Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:54:21.630Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:54:21.632Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:54:21.632Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:54:21.669Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-508Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-508Z.log deleted file mode 100644 index 900ad4d2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-508Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:54:21.508Z -# Max entries per file: 10000 - -2025-08-23T00:54:21.613Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-527Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-527Z.log deleted file mode 100644 index 699ea8a9..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-527Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:54:21.527Z -# Max entries per file: 10000 - -2025-08-23T00:54:21.645Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-548Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-548Z.log deleted file mode 100644 index 69bd4bd7..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-54-21-548Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:54:21.548Z -# Max entries per file: 10000 - -2025-08-23T00:54:23.138Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:54:23.170Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:54:23.185Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:54:23.190Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:54:23.194Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:54:23.199Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:54:23.203Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-23T00:54:23.204Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:54:23.204Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":6} -2025-08-23T00:54:23.206Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:54:23.207Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:54:23.207Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:54:23.208Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:54:23.209Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:54:23.210Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:54:23.211Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:54:23.215Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:54:23.216Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:54:23.217Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:54:23.217Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":2} -2025-08-23T00:54:24.376Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:54:24.378Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:54:24.380Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:54:24.380Z | [DATABASE] | User lookup completed | Meta:{"executionTime":0,"found":false,"searchBy":"username"} -2025-08-23T00:54:24.381Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:54:24.392Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-092Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-092Z.log deleted file mode 100644 index e406f646..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-092Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:56:51.092Z -# Max entries per file: 10000 - -2025-08-23T00:56:51.257Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-182Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-182Z.log deleted file mode 100644 index 1e2361f2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-182Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:56:51.182Z -# Max entries per file: 10000 - -2025-08-23T00:56:51.285Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-226Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-226Z.log deleted file mode 100644 index f11676a1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-226Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:56:51.226Z -# Max entries per file: 10000 - -2025-08-23T00:56:51.299Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:56:51.346Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:56:51.354Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:56:51.415Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-245Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-245Z.log deleted file mode 100644 index fe7132aa..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-245Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:56:51.245Z -# Max entries per file: 10000 - -2025-08-23T00:56:51.283Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:56:51.337Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.342Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:56:51.347Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.353Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.417Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-425Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-425Z.log deleted file mode 100644 index 21897884..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-425Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:56:51.425Z -# Max entries per file: 10000 - -2025-08-23T00:56:51.470Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.519Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:56:51.519Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.524Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.527Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:56:51.542Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:56:51.544Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:56:51.575Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-478Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-478Z.log deleted file mode 100644 index a7b9ce75..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-56-51-478Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:56:51.478Z -# Max entries per file: 10000 - -2025-08-23T00:56:52.773Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:56:52.808Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:56:52.820Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:56:52.825Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:56:52.830Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:56:52.833Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:56:52.838Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-23T00:56:52.839Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:56:52.839Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":6} -2025-08-23T00:56:52.841Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:56:52.842Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:56:52.842Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:56:52.844Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:56:52.845Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:56:52.845Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:56:52.846Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:56:52.849Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:56:52.850Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:56:52.851Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:56:52.851Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":2} -2025-08-23T00:56:54.037Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:56:54.039Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:56:54.041Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:56:54.042Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:56:54.043Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:56:54.056Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-51-926Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-51-926Z.log deleted file mode 100644 index 4e4bcab2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-51-926Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:51.926Z -# Max entries per file: 10000 - -2025-08-23T00:58:52.000Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.150Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.158Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.172Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.180Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.187Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.199Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.206Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:52.284Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-394Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-394Z.log deleted file mode 100644 index e1145bd6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-394Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.394Z -# Max entries per file: 10000 - -2025-08-23T00:58:52.540Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-658Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-658Z.log deleted file mode 100644 index 278db5df..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-658Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.658Z -# Max entries per file: 10000 - -2025-08-23T00:58:52.744Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:58:52.830Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:58:52.833Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:58:52.905Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-711Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-711Z.log deleted file mode 100644 index 72b1f030..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-711Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.711Z -# Max entries per file: 10000 - -2025-08-23T00:58:52.869Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-731Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-731Z.log deleted file mode 100644 index 29ef0125..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-731Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.731Z -# Max entries per file: 10000 - -2025-08-23T00:58:52.799Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:58:52.881Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:52.891Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:58:52.895Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:52.898Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:52.955Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-962Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-962Z.log deleted file mode 100644 index 1a10bce6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-962Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.962Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.082Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-992Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-992Z.log deleted file mode 100644 index 4d8a48ba..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-992Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.992Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.128Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-994Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-994Z.log deleted file mode 100644 index fc3299b6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-52-994Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:52.994Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.123Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-000Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-000Z.log deleted file mode 100644 index 4f8520c5..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-000Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.000Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.062Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:58:53.287Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-011Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-011Z.log deleted file mode 100644 index 3af0bb92..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-011Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.011Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.142Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-026Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-026Z.log deleted file mode 100644 index f5fa92e3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-026Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.026Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.142Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-033Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-033Z.log deleted file mode 100644 index b0be046f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-033Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.033Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.203Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-039Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-039Z.log deleted file mode 100644 index 3405ab37..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-039Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.039Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.392Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:58:54.405Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-146Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-146Z.log deleted file mode 100644 index 0b8ce4b8..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-146Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.146Z -# Max entries per file: 10000 - -2025-08-23T00:58:54.590Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:58:54.623Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:58:54.638Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.643Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.647Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.650Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:58:54.655Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-23T00:58:54.656Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:58:54.657Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":7} -2025-08-23T00:58:54.659Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:58:54.660Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:58:54.661Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:58:54.663Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:58:54.664Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:58:54.665Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:58:54.665Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:58:54.671Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:58:54.672Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:58:54.672Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:58:54.673Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":2} -2025-08-23T00:58:55.776Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:58:55.779Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:58:55.781Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:58:55.782Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:58:55.783Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:58:55.795Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-162Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-162Z.log deleted file mode 100644 index 7668e333..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-162Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.162Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.511Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.561Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.592Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.599Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.606Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.608Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.611Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.615Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:58:53.616Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.618Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.621Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:58:53.623Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.627Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.630Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.632Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.634Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.636Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.637Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.639Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.641Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.643Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.645Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.650Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:58:53.652Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.655Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:53.666Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:58:53.694Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-791Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-791Z.log deleted file mode 100644 index 5c5ca496..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-791Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.791Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.804Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-855Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-855Z.log deleted file mode 100644 index 2ae4377d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-53-855Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:53.855Z -# Max entries per file: 10000 - -2025-08-23T00:58:53.864Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:53.876Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:58:53.876Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:53.879Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:53.881Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:58:53.888Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:58:53.890Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:58:53.902Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-133Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-133Z.log deleted file mode 100644 index 143d1bc6..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-133Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:54.133Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-150Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-150Z.log deleted file mode 100644 index ed1e2881..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-150Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:54.150Z -# Max entries per file: 10000 - -2025-08-23T00:58:54.152Z | [AUTH] | Authentication successful | ReqId:swns07hzc | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:58:54.229Z | [AUTH] | Authentication failed - No valid token | ReqId:3h7rbnwfj | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:58:54.231Z | [AUTH] | Authentication successful | ReqId:xum4po9gk | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:58:54.232Z | [AUTH] | Token refreshed | ReqId:jfqxpvavg | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:58:54.234Z | [AUTH] | Admin authentication successful | ReqId:3vv1x0hku | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:58:54.235Z | [WARNING] | Admin access denied | ReqId:80hftgeok | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:58:54.241Z | [WARNING] | Admin access denied | ReqId:nsd12rg7v | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:58:54.245Z | [AUTH] | Admin authentication successful | ReqId:kfw9oilol | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:58:54.246Z | [AUTH] | Admin token refreshed | ReqId:tyvv0t0cx | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:58:54.260Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-159Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-159Z.log deleted file mode 100644 index fedb2e0f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-159Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:54.159Z -# Max entries per file: 10000 - -2025-08-23T00:58:54.200Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-196Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-196Z.log deleted file mode 100644 index b4cec8d3..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-196Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:54.196Z -# Max entries per file: 10000 - -2025-08-23T00:58:54.208Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-331Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-331Z.log deleted file mode 100644 index eef27b43..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-331Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:54.331Z -# Max entries per file: 10000 - -2025-08-23T00:58:54.334Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:58:54.342Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.344Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:58:54.345Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:58:54.345Z | [STARTUP] | Test message -2025-08-23T00:58:54.346Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:58:54.349Z | [STARTUP] | Test for directory creation -2025-08-23T00:58:54.382Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-371Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-371Z.log deleted file mode 100644 index acbebe92..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-58-54-371Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:58:54.371Z -# Max entries per file: 10000 - -2025-08-23T00:58:54.385Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.386Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.387Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.390Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:58:54.405Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-249Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-249Z.log deleted file mode 100644 index be5833be..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-249Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:30.249Z -# Max entries per file: 10000 - -2025-08-23T00:59:30.307Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Crypto error","stack":"Error: Crypto error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:78:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:82:56)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.397Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:111:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.405Z | [ERROR] | TokenService.generateVerificationToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generateVerificationToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:41:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:115:62)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.417Z | [ERROR] | TokenService.generateSecureToken error | Meta:{"name":"Error","message":"Random bytes failed","stack":"Error: Random bytes failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:143:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.randomBytes (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:57)\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:28:21)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.422Z | [ERROR] | TokenService.generatePasswordResetToken error | Meta:{"name":"Error","message":"Failed to generate secure token","stack":"Error: Failed to generate secure token\n at Function.generateSecureToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:31:13)\n at Function.generatePasswordResetToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:62:26)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:33\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:1824:9)\n at Object.throwingMatcher [as toThrow] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\expect\\build\\index.js:2235:93)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:147:63)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.431Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hashing failed","stack":"Error: Hashing failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:172:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:176:33)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.440Z | [ERROR] | TokenService.hashToken error | Meta:{"name":"Error","message":"Hash creation failed","stack":"Error: Hash creation failed\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:219:15)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:305:39\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:312:13)\n at Object.mockConstructor (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:102:19)\n at Object.createHash (eval at _createMockFunction (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-mock\\build\\index.js:460:31), :3:56)\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:158:21)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.446Z | [ERROR] | TokenService.verifyToken error | Meta:{"name":"Error","message":"Failed to hash token","stack":"Error: Failed to hash token\n at Function.hashToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:161:13)\n at Function.verifyToken (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\TokenService.ts:177:43)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\TokenService.test.ts:223:41)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:30.520Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-887Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-887Z.log deleted file mode 100644 index 15902d39..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-887Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:30.887Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.103Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:59:32.141Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:59:32.156Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.162Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.166Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.169Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:32.172Z | [DATABASE] | User lookup completed | Meta:{"executionTime":3,"found":true,"searchBy":"username"} -2025-08-23T00:59:32.173Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:59:32.174Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":5} -2025-08-23T00:59:32.176Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:59:32.177Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:59:32.177Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:59:32.179Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:32.180Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:59:32.181Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:59:32.182Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:59:32.185Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:32.186Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:59:32.187Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:59:32.188Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":3} -2025-08-23T00:59:33.373Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:59:33.375Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:59:33.377Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:33.378Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:59:33.379Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:59:33.395Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-912Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-912Z.log deleted file mode 100644 index b1726abb..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-912Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:30.912Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.086Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-931Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-931Z.log deleted file mode 100644 index 2ff98891..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-931Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:30.931Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.089Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-952Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-952Z.log deleted file mode 100644 index 953fddff..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-30-952Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:30.952Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.113Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-113Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-113Z.log deleted file mode 100644 index 3471f82d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-113Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.113Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.172Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:59:31.375Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-158Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-158Z.log deleted file mode 100644 index 968afb86..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-158Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.158Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.218Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:59:31.275Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:59:31.283Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:59:31.352Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-178Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-178Z.log deleted file mode 100644 index 8d4efea4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-178Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.178Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.282Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-198Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-198Z.log deleted file mode 100644 index d181ca42..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-198Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.198Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.340Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-201Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-201Z.log deleted file mode 100644 index b592eeca..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-201Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.201Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.351Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-209Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-209Z.log deleted file mode 100644 index 73606330..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-209Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.209Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.341Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-241Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-241Z.log deleted file mode 100644 index b7f00e9e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-241Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.241Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.303Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:59:31.369Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:31.373Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:59:31.375Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:31.377Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:31.407Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-269Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-269Z.log deleted file mode 100644 index 94db76c1..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-269Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.269Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.540Z | [STARTUP] | Logging service shutting down gracefully -2025-08-23T00:59:32.561Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-361Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-361Z.log deleted file mode 100644 index 7e5fd611..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-361Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.361Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.455Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-452Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-452Z.log deleted file mode 100644 index d0328b8f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-31-452Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:31.452Z -# Max entries per file: 10000 - -2025-08-23T00:59:31.732Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.782Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.827Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.835Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:58:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.840Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.841Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.844Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:68:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.847Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":60} -2025-08-23T00:59:31.848Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.851Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:79:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.854Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":null} -2025-08-23T00:59:31.855Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.859Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:92:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.862Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.863Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.865Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:104:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.867Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.868Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.870Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:114:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.872Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.873Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.877Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:126:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.880Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T00:59:31.882Z | [ERROR] | Failed to connect to Redis | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.883Z | [ERROR] | Failed to initialize Redis connection | Meta:{"name":"Error","message":"Socket already opened","stack":"Error: Socket already opened\n at RedisSocket.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\socket.ts:204:13)\n at Class.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\@redis\\client\\lib\\client\\index.ts:850:30)\n at RedisService.connect (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\RedisService.ts:61:35)\n at WebSocketService.initializeRedis (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:101:37)\n at new WebSocketService (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\WebSocketService.ts:89:14)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\ChatConfiguration.test.ts:141:29)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1551:26)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:31.892Z | [STARTUP] | Redis client connected successfully -2025-08-23T00:59:31.921Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-009Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-009Z.log deleted file mode 100644 index 94903f44..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-009Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.009Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.017Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:32.027Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:59:32.027Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:32.029Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:32.035Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:59:32.042Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:59:32.043Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:32.054Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-294Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-294Z.log deleted file mode 100644 index 8d43cf0c..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-294Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.294Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.296Z | [AUTH] | Authentication successful | ReqId:cab4p535c | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:59:32.306Z | [AUTH] | Authentication failed - No valid token | ReqId:te3uhv9fn | IP:unknown | UA:unknown | Meta:{"userAgent":"unknown"} -2025-08-23T00:59:32.308Z | [AUTH] | Authentication successful | ReqId:jgprv68yw | IP:unknown | UA:unknown | Meta:{"userId":"user-123","authLevel":0,"orgId":"org-123"} -2025-08-23T00:59:32.310Z | [AUTH] | Token refreshed | ReqId:72t3xyd96 | IP:unknown | UA:unknown | Meta:{"userId":"user-123"} -2025-08-23T00:59:32.313Z | [AUTH] | Admin authentication successful | ReqId:0ra8twgxj | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:59:32.315Z | [WARNING] | Admin access denied | ReqId:phl0ykyrj | IP:unknown | UA:unknown | Meta:{"hasPayload":false} -2025-08-23T00:59:32.324Z | [WARNING] | Admin access denied | ReqId:bh3ptk5rc | IP:unknown | UA:unknown | Meta:{"hasPayload":true,"authLevel":0,"userId":"user-123"} -2025-08-23T00:59:32.330Z | [AUTH] | Admin authentication successful | ReqId:8igdq11aq | IP:unknown | UA:unknown | Meta:{"userId":"admin-123","authLevel":1,"orgId":"org-123"} -2025-08-23T00:59:32.331Z | [AUTH] | Admin token refreshed | ReqId:9wllhhzww | IP:unknown | UA:unknown | Meta:{"userId":"admin-123"} -2025-08-23T00:59:32.345Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-334Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-334Z.log deleted file mode 100644 index efeeab85..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-334Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.334Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-358Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-358Z.log deleted file mode 100644 index c8acd3d2..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-358Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.358Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.378Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-417Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-417Z.log deleted file mode 100644 index a2b45c9f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-417Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.417Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.432Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-561Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-561Z.log deleted file mode 100644 index 07a8646d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-561Z.log +++ /dev/null @@ -1,12 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.561Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.565Z | [AUTH] | Test auth message | Meta:{"userId":"user123","action":"login"} -2025-08-23T00:59:32.574Z | [ERROR] | Test error occurred | Meta:{"name":"Error","message":"Test error message","stack":"Error: Test error message\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\LoggingService.test.ts:50:25)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.597Z | [DATABASE] | Query executed | Meta:{"query":"SELECT * FROM users","executionTime":45} -2025-08-23T00:59:32.598Z | [STARTUP] | Application started | Meta:{"version":"1.0.0"} -2025-08-23T00:59:32.599Z | [STARTUP] | Test message -2025-08-23T00:59:32.600Z | [AUTH] | Test with metadata | Meta:{"userId":"123","action":"test"} -2025-08-23T00:59:32.603Z | [STARTUP] | Test for directory creation -2025-08-23T00:59:32.638Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-574Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-574Z.log deleted file mode 100644 index 4ad8572e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-574Z.log +++ /dev/null @@ -1,9 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.574Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.585Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:47:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.597Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Password must be a non-empty string","stack":"Error: Password must be a non-empty string\n at Function.hashPassword (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Application\\Services\\PasswordService.ts:15:15)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:56:36)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.598Z | [ERROR] | PasswordService.hashPassword error | Meta:{"name":"Error","message":"Bcrypt error","stack":"Error: Bcrypt error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:63:40)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.601Z | [ERROR] | PasswordService.verifyPassword error | Meta:{"name":"Error","message":"Bcrypt compare error","stack":"Error: Bcrypt compare error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\Services\\PasswordService.test.ts:146:43)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:32.617Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-582Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-582Z.log deleted file mode 100644 index 59a3a8ba..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-32-582Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:32.582Z -# Max entries per file: 10000 - -2025-08-23T00:59:32.618Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-376Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-376Z.log deleted file mode 100644 index 1b35e930..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-376Z.log +++ /dev/null @@ -1,11 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:54.376Z -# Max entries per file: 10000 - -2025-08-23T00:59:54.406Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.459Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"admin-123","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T00:59:54.459Z","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.466Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.473Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:59:54.490Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Initial Name","deckType":1,"cardCount":0} -2025-08-23T00:59:54.492Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"deck-123","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.528Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-380Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-380Z.log deleted file mode 100644 index 4019152e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-380Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:54.380Z -# Max entries per file: 10000 - -2025-08-23T00:59:54.433Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:59:54.473Z | [REQUEST] | Contact hard deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"hard"} -2025-08-23T00:59:54.478Z | [REQUEST] | Contact soft deleted | Meta:{"contactId":"550e8400-e29b-41d4-a716-446655440000","contactEmail":"john.doe@example.com","deleteType":"soft"} -2025-08-23T00:59:54.522Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-400Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-400Z.log deleted file mode 100644 index 6381227a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-400Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:54.400Z -# Max entries per file: 10000 - -2025-08-23T00:59:54.428Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":1} -2025-08-23T00:59:54.484Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"admin-123","deckName":"Admin Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.491Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Question Deck","deckType":2,"cardCount":0} -2025-08-23T00:59:54.494Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Empty Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.496Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"123e4567-e89b-12d3-a456-426614174002","userId":"user-123","deckName":"Test Deck","deckType":1,"cardCount":0} -2025-08-23T00:59:54.535Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-411Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-411Z.log deleted file mode 100644 index 6d55a594..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-411Z.log +++ /dev/null @@ -1,30 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:54.411Z -# Max entries per file: 10000 - -2025-08-23T00:59:55.603Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:59:55.642Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:59:55.653Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"duplicate key value violates unique constraint","stack":"Error: duplicate key value violates unique constraint\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:82:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:55.660Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"unique constraint violation","stack":"Error: unique constraint violation\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:100:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:55.665Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Database error","stack":"Error: Database error\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\tests\\Application\\User\\commands\\UserCommandHandlers.comprehensive.test.ts:119:51)\n at Promise.finally.completed (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1559:28)\n at new Promise ()\n at callAsyncCircusFn (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1499:10)\n at _callCircusTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1009:40)\n at processTicksAndRejections (node:internal/process/task_queues:105:5)\n at _runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:949:3)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:839:13)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at _runTestsForDescribeBlock (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:829:11)\n at run (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:757:3)\n at runAndTransformResultsToJestFormat (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\jestAdapterInit.js:1920:21)\n at jestAdapter (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-circus\\build\\runner.js:101:19)\n at runTestInternal (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:277:16)\n at runTest (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:345:7)\n at Object.worker (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\jest-runner\\build\\testWorker.js:499:12)"} -2025-08-23T00:59:55.672Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:55.674Z | [DATABASE] | User lookup completed | Meta:{"executionTime":2,"found":true,"searchBy":"username"} -2025-08-23T00:59:55.675Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:59:55.676Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":4} -2025-08-23T00:59:55.678Z | [AUTH] | Login attempt | Meta:{"username":"nonexistent"} -2025-08-23T00:59:55.679Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:59:55.679Z | [AUTH] | Login failed - User not found | Meta:{"username":"nonexistent"} -2025-08-23T00:59:55.683Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:55.684Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:59:55.685Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":false,"verificationTime":0} -2025-08-23T00:59:55.686Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","username":"testuser"} -2025-08-23T00:59:55.689Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:55.690Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":true,"searchBy":"username"} -2025-08-23T00:59:55.690Z | [AUTH] | Password verification completed | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","valid":true,"verificationTime":0} -2025-08-23T00:59:55.691Z | [AUTH] | Login successful | Meta:{"userId":"123e4567-e89b-12d3-a456-426614174000","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":2} -2025-08-23T00:59:56.807Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Invalid login: 535 5.7.8 Sorry.","stack":"Error: Invalid login: 535 5.7.8 Sorry.\n at SMTPConnection._formatError (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:809:19)\n at SMTPConnection._actionAUTHComplete (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:1588:34)\n at SMTPConnection. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:556:26)\n at SMTPConnection._processResponse (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:993:20)\n at SMTPConnection._onData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:774:14)\n at TLSSocket.SMTPConnection._onSocketData (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\nodemailer\\lib\\smtp-connection\\index.js:195:44)\n at TLSSocket.emit (node:events:519:28)\n at addChunk (node:internal/streams/readable:561:12)\n at readableAddChunkPushByteMode (node:internal/streams/readable:512:3)\n at TLSSocket.Readable.push (node:internal/streams/readable:392:5)\n at TLSWrap.onStreamRead (node:internal/stream_base_commons:189:23)"} -2025-08-23T00:59:56.809Z | [WARNING] | Failed to send verification email | Meta:{"email":"test@example.com","userId":"123e4567-e89b-12d3-a456-426614174000"} -2025-08-23T00:59:56.810Z | [AUTH] | Login attempt | Meta:{"username":"testuser"} -2025-08-23T00:59:56.811Z | [DATABASE] | User lookup completed | Meta:{"executionTime":1,"found":false,"searchBy":"username"} -2025-08-23T00:59:56.812Z | [AUTH] | Login failed - User not found | Meta:{"username":"testuser"} -2025-08-23T00:59:56.822Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-419Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-419Z.log deleted file mode 100644 index 50dc6b2b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-419Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:54.419Z -# Max entries per file: 10000 - -2025-08-23T00:59:54.513Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-447Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-447Z.log deleted file mode 100644 index b565eb82..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T00-59-54-447Z.log +++ /dev/null @@ -1,5 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T00:59:54.447Z -# Max entries per file: 10000 - -2025-08-23T00:59:54.544Z | [STARTUP] | Logging service shutting down gracefully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-01-04-444Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-01-04-444Z.log deleted file mode 100644 index dc0d55ef..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-01-04-444Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T01:01:04.444Z -# Max entries per file: 10000 - -2025-08-23T01:01:12.318Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T01:01:12.333Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T01:01:12.333Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T01:01:13.468Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T01:01:13.494Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T01:01:13.496Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T01:01:13.498Z | [STARTUP] | Redis client connected successfully -2025-08-23T01:01:15.430Z | [REQUEST] | Incoming request | ReqId:gb3zxum1u | IP:::ffff:172.19.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:01:15.432Z | [REQUEST] | GET /api-docs | ReqId:gb3zxum1u | IP:::ffff:172.19.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:01:15.435Z | [REQUEST] | Request completed | ReqId:gb3zxum1u | IP:::ffff:172.19.0.1 | GET /api-docs | Status:301 | Time:5ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:01:15.440Z | [REQUEST] | Incoming request | ReqId:ljs5roqbv | IP:::ffff:172.19.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:01:15.442Z | [REQUEST] | GET /api-docs/ | ReqId:ljs5roqbv | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:01:15.445Z | [REQUEST] | Request completed | ReqId:ljs5roqbv | IP:::ffff:172.19.0.1 | GET /api-docs/ | Status:200 | Time:5ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:01:18.900Z | [REQUEST] | Incoming request | ReqId:zjweom4s4 | IP:::ffff:172.19.0.1 | GET /api-docs?id=915355e5-6483-4638-94be-6bd09919dfab&vscodeBrowserReqId=1755910878892 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T01:01:18.902Z | [REQUEST] | GET /api-docs | ReqId:zjweom4s4 | IP:::ffff:172.19.0.1 | GET /api-docs?id=915355e5-6483-4638-94be-6bd09919dfab&vscodeBrowserReqId=1755910878892 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T01:01:18.904Z | [REQUEST] | Request completed | ReqId:zjweom4s4 | IP:::ffff:172.19.0.1 | GET /api-docs?id=915355e5-6483-4638-94be-6bd09919dfab&vscodeBrowserReqId=1755910878892 | Status:301 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T01:01:18.911Z | [REQUEST] | Incoming request | ReqId:21bp9jwv0 | IP:::ffff:172.19.0.1 | GET /api-docs/?id=915355e5-6483-4638-94be-6bd09919dfab&vscodeBrowserReqId=1755910878892 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T01:01:18.913Z | [REQUEST] | GET /api-docs/ | ReqId:21bp9jwv0 | IP:::ffff:172.19.0.1 | GET /api-docs/?id=915355e5-6483-4638-94be-6bd09919dfab&vscodeBrowserReqId=1755910878892 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T01:01:18.915Z | [REQUEST] | Request completed | ReqId:21bp9jwv0 | IP:::ffff:172.19.0.1 | GET /api-docs/?id=915355e5-6483-4638-94be-6bd09919dfab&vscodeBrowserReqId=1755910878892 | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-08-23T01:18:57.551Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T01:18:57.553Z | [STARTUP] | HTTP server closed -2025-08-23T01:18:57.555Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-20-24-151Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-20-24-151Z.log deleted file mode 100644 index f4456498..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-20-24-151Z.log +++ /dev/null @@ -1,175 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T01:20:24.151Z -# Max entries per file: 10000 - -2025-08-23T01:20:33.131Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T01:20:33.146Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T01:20:33.146Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T01:20:34.395Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T01:20:34.417Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T01:20:34.419Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T01:20:34.428Z | [REQUEST] | Incoming request | ReqId:kdpa3nb6m | IP:::ffff:172.20.0.1 | GET / | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:34.430Z | [REQUEST] | GET / | ReqId:kdpa3nb6m | IP:::ffff:172.20.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:34.433Z | [REQUEST] | Request completed | ReqId:kdpa3nb6m | IP:::ffff:172.20.0.1 | GET / | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:34.436Z | [STARTUP] | Redis client connected successfully -2025-08-23T01:20:34.459Z | [REQUEST] | Incoming request | ReqId:whhgssqup | IP:::ffff:172.20.0.1 | GET /favicon.ico | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:34.461Z | [REQUEST] | GET /favicon.ico | ReqId:whhgssqup | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:34.464Z | [REQUEST] | Request completed | ReqId:whhgssqup | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:404 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.399Z | [REQUEST] | Incoming request | ReqId:hvjlw7a2s | IP:::ffff:172.20.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.400Z | [REQUEST] | GET /api-docs | ReqId:hvjlw7a2s | IP:::ffff:172.20.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.403Z | [REQUEST] | Request completed | ReqId:hvjlw7a2s | IP:::ffff:172.20.0.1 | GET /api-docs | Status:301 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.409Z | [REQUEST] | Incoming request | ReqId:qmv6fin0p | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.411Z | [REQUEST] | GET /api-docs/ | ReqId:qmv6fin0p | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.414Z | [REQUEST] | Request completed | ReqId:qmv6fin0p | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.431Z | [REQUEST] | Incoming request | ReqId:2n01mnbug | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.434Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:2n01mnbug | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.469Z | [REQUEST] | Incoming request | ReqId:mv2epkxfb | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.470Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:mv2epkxfb | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.473Z | [REQUEST] | Incoming request | ReqId:7i1bf9m3s | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.475Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:7i1bf9m3s | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.478Z | [REQUEST] | Incoming request | ReqId:t4swj8liq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.479Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:t4swj8liq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.481Z | [REQUEST] | Request completed | ReqId:t4swj8liq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.483Z | [REQUEST] | Request completed | ReqId:2n01mnbug | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | Time:52ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.489Z | [REQUEST] | Request completed | ReqId:7i1bf9m3s | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | Time:16ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:20:43.496Z | [REQUEST] | Request completed | ReqId:mv2epkxfb | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | Time:27ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:21:27.206Z | [REQUEST] | Incoming request | ReqId:8xphejt55 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:21:27.208Z | [REQUEST] | POST /api/users/login | ReqId:8xphejt55 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:21:27.210Z | [REQUEST] | Login endpoint accessed | ReqId:8xphejt55 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:21:27.212Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:21:27.245Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":31,"found":true,"username":"admin_user"} -2025-08-23T01:21:27.246Z | [DATABASE] | User lookup completed | Meta:{"executionTime":34,"found":true,"searchBy":"username"} -2025-08-23T01:21:27.286Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":false,"verificationTime":38} -2025-08-23T01:21:27.288Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:21:27.290Z | [REQUEST] | Request completed | ReqId:8xphejt55 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:84ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:22:40.086Z | [REQUEST] | Incoming request | ReqId:9jb25u47l | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:22:40.088Z | [REQUEST] | POST /api/users/login | ReqId:9jb25u47l | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:22:40.090Z | [REQUEST] | Login endpoint accessed | ReqId:9jb25u47l | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:22:40.091Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:22:40.103Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":10,"found":true,"username":"admin_user"} -2025-08-23T01:22:40.105Z | [DATABASE] | User lookup completed | Meta:{"executionTime":14,"found":true,"searchBy":"username"} -2025-08-23T01:22:40.144Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":false,"verificationTime":38} -2025-08-23T01:22:40.146Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:22:40.148Z | [REQUEST] | Request completed | ReqId:9jb25u47l | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:62ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:22:54.821Z | [REQUEST] | Incoming request | ReqId:rs2jz6lx1 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:22:54.823Z | [REQUEST] | POST /api/users/login | ReqId:rs2jz6lx1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:22:54.825Z | [REQUEST] | Login endpoint accessed | ReqId:rs2jz6lx1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"john_doe"} -2025-08-23T01:22:54.826Z | [AUTH] | Login attempt | Meta:{"username":"john_doe"} -2025-08-23T01:22:54.838Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: john_doe })","executionTime":10,"found":true,"username":"john_doe"} -2025-08-23T01:22:54.840Z | [DATABASE] | User lookup completed | Meta:{"executionTime":14,"found":true,"searchBy":"username"} -2025-08-23T01:22:54.881Z | [AUTH] | Password verification completed | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","valid":false,"verificationTime":39} -2025-08-23T01:22:54.883Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","username":"john_doe"} -2025-08-23T01:22:54.885Z | [REQUEST] | Request completed | ReqId:rs2jz6lx1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:64ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:08.951Z | [REQUEST] | Incoming request | ReqId:7sbpwbxg2 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:08.953Z | [REQUEST] | POST /api/users/login | ReqId:7sbpwbxg2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:08.955Z | [REQUEST] | Login endpoint accessed | ReqId:7sbpwbxg2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin@serpentrace.com"} -2025-08-23T01:23:08.957Z | [AUTH] | Login attempt | Meta:{"username":"admin@serpentrace.com"} -2025-08-23T01:23:08.967Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin@serpentrace.com })","executionTime":9,"found":false,"username":"admin@serpentrace.com"} -2025-08-23T01:23:08.972Z | [DATABASE] | User findByEmail query completed | Meta:{"query":"findOneBy({ email: admin@serpentrace.com })","executionTime":3,"found":true,"email":"admin@serpentrace.com"} -2025-08-23T01:23:08.973Z | [DATABASE] | User lookup completed | Meta:{"executionTime":16,"found":true,"searchBy":"email"} -2025-08-23T01:23:09.013Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":false,"verificationTime":37} -2025-08-23T01:23:09.014Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin@serpentrace.com"} -2025-08-23T01:23:09.016Z | [REQUEST] | Request completed | ReqId:7sbpwbxg2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:65ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:26.022Z | [REQUEST] | Incoming request | ReqId:ya086l23i | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:26.025Z | [REQUEST] | POST /api/users/login | ReqId:ya086l23i | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:26.027Z | [REQUEST] | Login endpoint accessed | ReqId:ya086l23i | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:23:26.029Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:23:26.042Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":11,"found":true,"username":"admin_user"} -2025-08-23T01:23:26.043Z | [DATABASE] | User lookup completed | Meta:{"executionTime":14,"found":true,"searchBy":"username"} -2025-08-23T01:23:26.083Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":false,"verificationTime":38} -2025-08-23T01:23:26.085Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:23:26.087Z | [REQUEST] | Request completed | ReqId:ya086l23i | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:65ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:30.900Z | [REQUEST] | Incoming request | ReqId:gya30duh1 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:30.902Z | [REQUEST] | POST /api/users/login | ReqId:gya30duh1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:30.904Z | [REQUEST] | Login endpoint accessed | ReqId:gya30duh1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:23:30.905Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:23:30.909Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":3,"found":true,"username":"admin_user"} -2025-08-23T01:23:30.911Z | [DATABASE] | User lookup completed | Meta:{"executionTime":6,"found":true,"searchBy":"username"} -2025-08-23T01:23:30.957Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":false,"verificationTime":45} -2025-08-23T01:23:30.959Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:23:30.961Z | [REQUEST] | Request completed | ReqId:gya30duh1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:61ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:37.972Z | [REQUEST] | Incoming request | ReqId:f2rgchl05 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:37.974Z | [REQUEST] | POST /api/users/login | ReqId:f2rgchl05 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:23:37.975Z | [REQUEST] | Login endpoint accessed | ReqId:f2rgchl05 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:23:37.977Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:23:37.980Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":2,"found":true,"username":"admin_user"} -2025-08-23T01:23:37.981Z | [DATABASE] | User lookup completed | Meta:{"executionTime":4,"found":true,"searchBy":"username"} -2025-08-23T01:23:38.021Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":false,"verificationTime":38} -2025-08-23T01:23:38.023Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:23:38.025Z | [REQUEST] | Request completed | ReqId:f2rgchl05 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:53ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:25:52.116Z | [REQUEST] | Incoming request | ReqId:61wn5xkpc | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:25:52.118Z | [REQUEST] | POST /api/users/create | ReqId:61wn5xkpc | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:25:52.120Z | [REQUEST] | Create user endpoint accessed | ReqId:61wn5xkpc | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"Test","email":"user@example.com"} -2025-08-23T01:25:52.127Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Password validation failed: Password must contain at least one uppercase letter","stack":"Error: Password validation failed: Password must contain at least one uppercase letter\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:23:15)\n at /app/src/Api/routers/userRouter.ts:77:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at runNext (/app/src/Application/Services/ValidationMiddleware.ts:300:28)\n at /app/src/Application/Services/ValidationMiddleware.ts:310:25\n at /app/src/Application/Services/ValidationMiddleware.ts:108:13\n at runNext (/app/src/Application/Services/ValidationMiddleware.ts:306:21)\n at /app/src/Application/Services/ValidationMiddleware.ts:310:25\n at /app/src/Application/Services/ValidationMiddleware.ts:141:13"} -2025-08-23T01:25:52.129Z | [ERROR] | Create user endpoint error | ReqId:61wn5xkpc | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"name":"Error","message":"Password validation failed: Password must contain at least one uppercase letter","stack":"Error: Password validation failed: Password must contain at least one uppercase letter\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:23:15)\n at /app/src/Api/routers/userRouter.ts:77:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at runNext (/app/src/Application/Services/ValidationMiddleware.ts:300:28)\n at /app/src/Application/Services/ValidationMiddleware.ts:310:25\n at /app/src/Application/Services/ValidationMiddleware.ts:108:13\n at runNext (/app/src/Application/Services/ValidationMiddleware.ts:306:21)\n at /app/src/Application/Services/ValidationMiddleware.ts:310:25\n at /app/src/Application/Services/ValidationMiddleware.ts:141:13"} -2025-08-23T01:25:52.131Z | [REQUEST] | Request completed | ReqId:61wn5xkpc | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:400 | Time:15ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:26:04.753Z | [REQUEST] | Incoming request | ReqId:b7lqkkezr | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:26:04.755Z | [REQUEST] | POST /api/users/create | ReqId:b7lqkkezr | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:26:04.758Z | [REQUEST] | Create user endpoint accessed | ReqId:b7lqkkezr | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"Test","email":"user@example.com"} -2025-08-23T01:26:04.932Z | [DATABASE] | User created successfully | Meta:{"executionTime":19,"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","username":"Test","email":"user@example.com"} -2025-08-23T01:26:05.377Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Missing credentials for \"PLAIN\"","stack":"Error: Missing credentials for \"PLAIN\"\n at SMTPConnection._formatError (/app/node_modules/nodemailer/lib/smtp-connection/index.js:809:19)\n at SMTPConnection.login (/app/node_modules/nodemailer/lib/smtp-connection/index.js:454:38)\n at /app/node_modules/nodemailer/lib/smtp-transport/index.js:272:32\n at SMTPConnection. (/app/node_modules/nodemailer/lib/smtp-connection/index.js:215:17)\n at Object.onceWrapper (node:events:638:28)\n at SMTPConnection.emit (node:events:524:28)\n at SMTPConnection.emit (node:domain:489:12)\n at SMTPConnection._actionEHLO (/app/node_modules/nodemailer/lib/smtp-connection/index.js:1371:14)\n at SMTPConnection._processResponse (/app/node_modules/nodemailer/lib/smtp-connection/index.js:993:20)\n at SMTPConnection._onData (/app/node_modules/nodemailer/lib/smtp-connection/index.js:774:14)"} -2025-08-23T01:26:05.379Z | [WARNING] | Failed to send verification email | Meta:{"email":"user@example.com","userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab"} -2025-08-23T01:26:05.380Z | [REQUEST] | User created successfully | ReqId:b7lqkkezr | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","username":"Test"} -2025-08-23T01:26:05.382Z | [REQUEST] | Request completed | ReqId:b7lqkkezr | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:201 | Time:629ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:26:16.633Z | [REQUEST] | Incoming request | ReqId:unentv6ov | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:26:16.635Z | [REQUEST] | POST /api/users/login | ReqId:unentv6ov | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:26:16.637Z | [REQUEST] | Login endpoint accessed | ReqId:unentv6ov | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"Test"} -2025-08-23T01:26:16.640Z | [AUTH] | Login attempt | Meta:{"username":"Test"} -2025-08-23T01:26:16.652Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: Test })","executionTime":11,"found":true,"username":"Test"} -2025-08-23T01:26:16.653Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-08-23T01:26:16.814Z | [AUTH] | Password verification completed | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","valid":true,"verificationTime":159} -2025-08-23T01:26:16.818Z | [AUTH] | Login successful | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":178} -2025-08-23T01:26:16.820Z | [AUTH] | User login successful | ReqId:unentv6ov | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","username":"Test"} -2025-08-23T01:26:16.822Z | [REQUEST] | Request completed | ReqId:unentv6ov | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:189ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:31:57.171Z | [REQUEST] | Incoming request | ReqId:o1ou920un | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:31:57.173Z | [REQUEST] | POST /api/users/login | ReqId:o1ou920un | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:31:57.174Z | [REQUEST] | Login endpoint accessed | ReqId:o1ou920un | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"new_user"} -2025-08-23T01:31:57.177Z | [AUTH] | Login attempt | Meta:{"username":"new_user"} -2025-08-23T01:31:57.190Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: new_user })","executionTime":11,"found":true,"username":"new_user"} -2025-08-23T01:31:57.192Z | [DATABASE] | User lookup completed | Meta:{"executionTime":15,"found":true,"searchBy":"username"} -2025-08-23T01:31:57.231Z | [AUTH] | Password verification completed | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","valid":false,"verificationTime":38} -2025-08-23T01:31:57.233Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","username":"new_user"} -2025-08-23T01:31:57.235Z | [REQUEST] | Request completed | ReqId:o1ou920un | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:64ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:32:13.743Z | [REQUEST] | Incoming request | ReqId:voix1xwg6 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:32:13.745Z | [REQUEST] | POST /api/users/login | ReqId:voix1xwg6 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:32:13.747Z | [REQUEST] | Login endpoint accessed | ReqId:voix1xwg6 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"john_doe"} -2025-08-23T01:32:13.749Z | [AUTH] | Login attempt | Meta:{"username":"john_doe"} -2025-08-23T01:32:13.763Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: john_doe })","executionTime":11,"found":true,"username":"john_doe"} -2025-08-23T01:32:13.765Z | [DATABASE] | User lookup completed | Meta:{"executionTime":16,"found":true,"searchBy":"username"} -2025-08-23T01:32:13.812Z | [AUTH] | Password verification completed | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","valid":false,"verificationTime":45} -2025-08-23T01:32:13.815Z | [WARNING] | Login failed - Invalid password | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","username":"john_doe"} -2025-08-23T01:32:13.818Z | [REQUEST] | Request completed | ReqId:voix1xwg6 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:75ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:34:10.808Z | [REQUEST] | Incoming request | ReqId:auhzerg6d | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:10.810Z | [REQUEST] | POST /api/users/login | ReqId:auhzerg6d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:10.812Z | [REQUEST] | Login endpoint accessed | ReqId:auhzerg6d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"Test"} -2025-08-23T01:34:10.814Z | [AUTH] | Login attempt | Meta:{"username":"Test"} -2025-08-23T01:34:10.824Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: Test })","executionTime":9,"found":true,"username":"Test"} -2025-08-23T01:34:10.826Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":true,"searchBy":"username"} -2025-08-23T01:34:10.978Z | [AUTH] | Password verification completed | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","valid":true,"verificationTime":150} -2025-08-23T01:34:10.981Z | [AUTH] | Login successful | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":167} -2025-08-23T01:34:10.982Z | [AUTH] | User login successful | ReqId:auhzerg6d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","username":"Test"} -2025-08-23T01:34:10.984Z | [REQUEST] | Request completed | ReqId:auhzerg6d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:176ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:35.427Z | [REQUEST] | Incoming request | ReqId:q8sh1n0l0 | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:35.429Z | [REQUEST] | GET /api/users/profile | ReqId:q8sh1n0l0 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:35.431Z | [AUTH] | Authentication failed - No valid token | ReqId:q8sh1n0l0 | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"ip":"::ffff:172.20.0.1","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0","path":"/profile"} -2025-08-23T01:34:35.433Z | [REQUEST] | Request completed | ReqId:q8sh1n0l0 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:401 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:49.090Z | [REQUEST] | Incoming request | ReqId:picbti2ll | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:49.092Z | [REQUEST] | GET /api/users/profile | ReqId:picbti2ll | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:34:49.094Z | [AUTH] | Authentication failed - No valid token | ReqId:picbti2ll | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"ip":"::ffff:172.20.0.1","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0","path":"/profile"} -2025-08-23T01:34:49.096Z | [REQUEST] | Request completed | ReqId:picbti2ll | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:401 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:35:07.710Z | [REQUEST] | Incoming request | ReqId:5wzbr0ggx | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:35:07.712Z | [REQUEST] | GET /api/organizations/page/1/2 | ReqId:5wzbr0ggx | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:35:07.716Z | [AUTH] | Authentication failed - No valid token | ReqId:5wzbr0ggx | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"ip":"::ffff:172.20.0.1","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0","path":"/page/1/2"} -2025-08-23T01:35:07.719Z | [REQUEST] | Request completed | ReqId:5wzbr0ggx | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:401 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:36:57.451Z | [REQUEST] | Incoming request | ReqId:inq9iaa2o | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:36:57.453Z | [REQUEST] | POST /api/users/login | ReqId:inq9iaa2o | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:36:57.455Z | [REQUEST] | Login endpoint accessed | ReqId:inq9iaa2o | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"new_user"} -2025-08-23T01:36:57.456Z | [AUTH] | Login attempt | Meta:{"username":"new_user"} -2025-08-23T01:36:57.470Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: new_user })","executionTime":12,"found":true,"username":"new_user"} -2025-08-23T01:36:57.472Z | [DATABASE] | User lookup completed | Meta:{"executionTime":16,"found":true,"searchBy":"username"} -2025-08-23T01:36:57.512Z | [AUTH] | Password verification completed | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","valid":true,"verificationTime":38} -2025-08-23T01:36:57.515Z | [AUTH] | Login successful | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","authLevel":0,"userStatus":0,"orgId":"","requiresOrgReauth":false,"totalLoginTime":59} -2025-08-23T01:36:57.516Z | [AUTH] | User login successful | ReqId:inq9iaa2o | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","username":"new_user"} -2025-08-23T01:36:57.518Z | [REQUEST] | Request completed | ReqId:inq9iaa2o | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:67ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:14.308Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T01:37:14.310Z | [STARTUP] | HTTP server closed -2025-08-23T01:37:14.312Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-37-19-593Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-37-19-593Z.log deleted file mode 100644 index f0943d9f..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-37-19-593Z.log +++ /dev/null @@ -1,130 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T01:37:19.593Z -# Max entries per file: 10000 - -2025-08-23T01:37:28.411Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T01:37:28.422Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T01:37:28.422Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T01:37:29.599Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T01:37:29.619Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T01:37:29.621Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T01:37:29.626Z | [STARTUP] | Redis client connected successfully -2025-08-23T01:37:31.292Z | [REQUEST] | Incoming request | ReqId:qoplgf49n | IP:::ffff:172.20.0.1 | GET / | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:31.295Z | [REQUEST] | GET / | ReqId:qoplgf49n | IP:::ffff:172.20.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:31.298Z | [REQUEST] | Request completed | ReqId:qoplgf49n | IP:::ffff:172.20.0.1 | GET / | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:31.320Z | [REQUEST] | Incoming request | ReqId:hot9iyt5y | IP:::ffff:172.20.0.1 | GET /favicon.ico | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:31.323Z | [REQUEST] | GET /favicon.ico | ReqId:hot9iyt5y | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:31.325Z | [REQUEST] | Request completed | ReqId:hot9iyt5y | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:404 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:38.026Z | [REQUEST] | Incoming request | ReqId:da6mp66er | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:38.028Z | [REQUEST] | POST /api/users/login | ReqId:da6mp66er | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:38.030Z | [REQUEST] | Login endpoint accessed | ReqId:da6mp66er | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"new_user"} -2025-08-23T01:37:38.032Z | [AUTH] | Login attempt | Meta:{"username":"new_user"} -2025-08-23T01:37:38.041Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: new_user })","executionTime":8,"found":true,"username":"new_user"} -2025-08-23T01:37:38.043Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":true,"searchBy":"username"} -2025-08-23T01:37:38.045Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","username":"new_user","userState":0,"stateDescription":"Email not verified"} -2025-08-23T01:37:38.046Z | [REQUEST] | Request completed | ReqId:da6mp66er | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:20ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:39.002Z | [REQUEST] | Incoming request | ReqId:pv016pj7l | IP:::ffff:172.20.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.004Z | [REQUEST] | GET /api-docs | ReqId:pv016pj7l | IP:::ffff:172.20.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.007Z | [REQUEST] | Request completed | ReqId:pv016pj7l | IP:::ffff:172.20.0.1 | GET /api-docs | Status:301 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.013Z | [REQUEST] | Incoming request | ReqId:0vn9g1c4d | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.015Z | [REQUEST] | GET /api-docs/ | ReqId:0vn9g1c4d | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.018Z | [REQUEST] | Request completed | ReqId:0vn9g1c4d | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.040Z | [REQUEST] | Incoming request | ReqId:hymukcniw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.042Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:hymukcniw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.045Z | [REQUEST] | Request completed | ReqId:hymukcniw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.047Z | [REQUEST] | Incoming request | ReqId:44qxwp7gl | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.049Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:44qxwp7gl | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.053Z | [REQUEST] | Request completed | ReqId:44qxwp7gl | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.056Z | [REQUEST] | Incoming request | ReqId:4q80ved29 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.058Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:4q80ved29 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.061Z | [REQUEST] | Request completed | ReqId:4q80ved29 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.064Z | [REQUEST] | Incoming request | ReqId:cn9ir2juw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.068Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:cn9ir2juw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:39.073Z | [REQUEST] | Request completed | ReqId:cn9ir2juw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:37:51.435Z | [REQUEST] | Incoming request | ReqId:chkjdiq4d | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:51.438Z | [REQUEST] | POST /api/users/login | ReqId:chkjdiq4d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:51.440Z | [REQUEST] | Login endpoint accessed | ReqId:chkjdiq4d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"john_doe"} -2025-08-23T01:37:51.441Z | [AUTH] | Login attempt | Meta:{"username":"john_doe"} -2025-08-23T01:37:51.457Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: john_doe })","executionTime":14,"found":true,"username":"john_doe"} -2025-08-23T01:37:51.459Z | [DATABASE] | User lookup completed | Meta:{"executionTime":18,"found":true,"searchBy":"username"} -2025-08-23T01:37:51.500Z | [AUTH] | Password verification completed | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","valid":true,"verificationTime":39} -2025-08-23T01:37:51.504Z | [AUTH] | Login successful | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":63} -2025-08-23T01:37:51.506Z | [AUTH] | User login successful | ReqId:chkjdiq4d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","username":"john_doe"} -2025-08-23T01:37:51.508Z | [REQUEST] | Request completed | ReqId:chkjdiq4d | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:73ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:57.435Z | [REQUEST] | Incoming request | ReqId:nm06t20fc | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:57.437Z | [REQUEST] | POST /api/users/login | ReqId:nm06t20fc | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:37:57.439Z | [REQUEST] | Login endpoint accessed | ReqId:nm06t20fc | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"jane_premium"} -2025-08-23T01:37:57.441Z | [AUTH] | Login attempt | Meta:{"username":"jane_premium"} -2025-08-23T01:37:57.444Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: jane_premium })","executionTime":2,"found":true,"username":"jane_premium"} -2025-08-23T01:37:57.446Z | [DATABASE] | User lookup completed | Meta:{"executionTime":5,"found":true,"searchBy":"username"} -2025-08-23T01:37:57.485Z | [AUTH] | Password verification completed | Meta:{"userId":"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb","valid":true,"verificationTime":37} -2025-08-23T01:37:57.499Z | [AUTH] | User requires organization reauthentication | Meta:{"userId":"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb","organizationId":"11111111-1111-1111-1111-111111111111","organizationName":"Tech Solutions Inc","lastOrgLogin":"2024-01-25T12:30:00.000Z","orgLoginUrl":"https://techsolutions.com"} -2025-08-23T01:37:57.500Z | [AUTH] | Login successful | Meta:{"userId":"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb","authLevel":0,"userStatus":2,"orgId":"11111111-1111-1111-1111-111111111111","requiresOrgReauth":true,"organizationName":"Tech Solutions Inc","totalLoginTime":59} -2025-08-23T01:37:57.502Z | [AUTH] | User login successful | ReqId:nm06t20fc | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb","username":"jane_premium"} -2025-08-23T01:37:57.503Z | [REQUEST] | Request completed | ReqId:nm06t20fc | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:68ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:38:08.454Z | [REQUEST] | Incoming request | ReqId:ppk1kj8f2 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:38:08.456Z | [REQUEST] | POST /api/users/login | ReqId:ppk1kj8f2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:38:08.457Z | [REQUEST] | Login endpoint accessed | ReqId:ppk1kj8f2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:38:08.459Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:38:08.469Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":9,"found":true,"username":"admin_user"} -2025-08-23T01:38:08.471Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":true,"searchBy":"username"} -2025-08-23T01:38:08.510Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":38} -2025-08-23T01:38:08.512Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":53} -2025-08-23T01:38:08.514Z | [AUTH] | User login successful | ReqId:ppk1kj8f2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:38:08.516Z | [REQUEST] | Request completed | ReqId:ppk1kj8f2 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:62ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:38:37.872Z | [REQUEST] | Incoming request | ReqId:cyozfueis | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:38:37.874Z | [REQUEST] | GET /api/organizations/page/1/2 | ReqId:cyozfueis | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:38:37.877Z | [AUTH] | Authentication failed - No valid token | ReqId:cyozfueis | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"ip":"::ffff:172.20.0.1","userAgent":"Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0) Gecko/20100101 Firefox/143.0","path":"/page/1/2"} -2025-08-23T01:38:37.879Z | [REQUEST] | Request completed | ReqId:cyozfueis | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:401 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:39:30.061Z | [REQUEST] | Incoming request | ReqId:esgutrojv | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-08-23T01:39:30.064Z | [REQUEST] | POST /api/users/login | ReqId:esgutrojv | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-08-23T01:39:30.065Z | [WARNING] | Validation failed - missing required fields | ReqId:esgutrojv | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"missingFields":["username","password"],"endpoint":"/login"} -2025-08-23T01:39:30.067Z | [REQUEST] | Request completed | ReqId:esgutrojv | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:400 | Time:6ms | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:09.984Z | [REQUEST] | Incoming request | ReqId:fw6l898da | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:09.986Z | [REQUEST] | POST /api/users/login | ReqId:fw6l898da | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:09.988Z | [REQUEST] | Login endpoint accessed | ReqId:fw6l898da | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"admin_user"} -2025-08-23T01:40:09.989Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:40:10.001Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":9,"found":true,"username":"admin_user"} -2025-08-23T01:40:10.002Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-08-23T01:40:10.041Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":37} -2025-08-23T01:40:10.044Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":55} -2025-08-23T01:40:10.045Z | [AUTH] | User login successful | ReqId:fw6l898da | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:40:10.047Z | [REQUEST] | Request completed | ReqId:fw6l898da | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:63ms | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:48.682Z | [REQUEST] | Incoming request | ReqId:eks86w3my | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:48.685Z | [REQUEST] | POST /api/users/login | ReqId:eks86w3my | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:48.686Z | [REQUEST] | Login endpoint accessed | ReqId:eks86w3my | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"admin_user"} -2025-08-23T01:40:48.688Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:40:48.699Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":10,"found":true,"username":"admin_user"} -2025-08-23T01:40:48.701Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-08-23T01:40:48.740Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":38} -2025-08-23T01:40:48.743Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":55} -2025-08-23T01:40:48.745Z | [AUTH] | User login successful | ReqId:eks86w3my | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:40:48.747Z | [REQUEST] | Request completed | ReqId:eks86w3my | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:65ms | UA:PostmanRuntime/7.45.0 -2025-08-23T01:40:56.732Z | [REQUEST] | Incoming request | ReqId:ft3bxszae | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:40:56.734Z | [REQUEST] | POST /api/users/login | ReqId:ft3bxszae | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:40:56.737Z | [REQUEST] | Login endpoint accessed | ReqId:ft3bxszae | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"admin_user"} -2025-08-23T01:40:56.739Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:40:56.745Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":3,"found":true,"username":"admin_user"} -2025-08-23T01:40:56.746Z | [DATABASE] | User lookup completed | Meta:{"executionTime":7,"found":true,"searchBy":"username"} -2025-08-23T01:40:56.786Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":38} -2025-08-23T01:40:56.789Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":50} -2025-08-23T01:40:56.790Z | [AUTH] | User login successful | ReqId:ft3bxszae | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:40:56.792Z | [REQUEST] | Request completed | ReqId:ft3bxszae | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:60ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:41:26.558Z | [REQUEST] | Incoming request | ReqId:eg8zyacs9 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:41:26.560Z | [REQUEST] | POST /api/users/login | ReqId:eg8zyacs9 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:41:26.562Z | [REQUEST] | Login endpoint accessed | ReqId:eg8zyacs9 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"new_user"} -2025-08-23T01:41:26.563Z | [AUTH] | Login attempt | Meta:{"username":"new_user"} -2025-08-23T01:41:26.575Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: new_user })","executionTime":10,"found":true,"username":"new_user"} -2025-08-23T01:41:26.577Z | [DATABASE] | User lookup completed | Meta:{"executionTime":14,"found":true,"searchBy":"username"} -2025-08-23T01:41:26.579Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","username":"new_user","userState":3,"stateDescription":"Account deleted"} -2025-08-23T01:41:26.582Z | [REQUEST] | Request completed | ReqId:eg8zyacs9 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:24ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:41:38.716Z | [REQUEST] | Incoming request | ReqId:i4i8pdovu | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:41:38.718Z | [REQUEST] | POST /api/users/login | ReqId:i4i8pdovu | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:41:38.721Z | [REQUEST] | Login endpoint accessed | ReqId:i4i8pdovu | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"new_user"} -2025-08-23T01:41:38.722Z | [AUTH] | Login attempt | Meta:{"username":"new_user"} -2025-08-23T01:41:38.735Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: new_user })","executionTime":11,"found":true,"username":"new_user"} -2025-08-23T01:41:38.737Z | [DATABASE] | User lookup completed | Meta:{"executionTime":15,"found":true,"searchBy":"username"} -2025-08-23T01:41:38.739Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee","username":"new_user","userState":4,"stateDescription":"Account deactivated"} -2025-08-23T01:41:38.740Z | [REQUEST] | Request completed | ReqId:i4i8pdovu | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:24ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:46:36.441Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T01:46:36.443Z | [STARTUP] | HTTP server closed -2025-08-23T01:46:36.445Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-46-41-339Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-46-41-339Z.log deleted file mode 100644 index 24d5584a..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T01-46-41-339Z.log +++ /dev/null @@ -1,210 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T01:46:41.339Z -# Max entries per file: 10000 - -2025-08-23T01:46:49.746Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T01:46:49.759Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T01:46:49.759Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T01:46:50.927Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T01:46:50.953Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T01:46:50.955Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T01:46:50.957Z | [STARTUP] | Redis client connected successfully -2025-08-23T01:46:58.380Z | [REQUEST] | Incoming request | ReqId:zzaevmfc5 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:46:58.383Z | [REQUEST] | POST /api/users/login | ReqId:zzaevmfc5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:46:58.385Z | [REQUEST] | Login endpoint accessed | ReqId:zzaevmfc5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"john_doe"} -2025-08-23T01:46:58.387Z | [AUTH] | Login attempt | Meta:{"username":"john_doe"} -2025-08-23T01:46:58.399Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: john_doe })","executionTime":10,"found":true,"username":"john_doe"} -2025-08-23T01:46:58.401Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-08-23T01:46:58.440Z | [AUTH] | Password verification completed | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","valid":true,"verificationTime":38} -2025-08-23T01:46:58.446Z | [AUTH] | Login successful | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":59} -2025-08-23T01:46:58.449Z | [AUTH] | User login successful | ReqId:zzaevmfc5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","username":"john_doe"} -2025-08-23T01:46:58.452Z | [REQUEST] | Request completed | ReqId:zzaevmfc5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:72ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:47:09.290Z | [REQUEST] | Incoming request | ReqId:orqgfbg2p | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:47:09.292Z | [REQUEST] | POST /api/users/login | ReqId:orqgfbg2p | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:47:09.295Z | [REQUEST] | Login endpoint accessed | ReqId:orqgfbg2p | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"john_doe"} -2025-08-23T01:47:09.296Z | [AUTH] | Login attempt | Meta:{"username":"john_doe"} -2025-08-23T01:47:09.312Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: john_doe })","executionTime":14,"found":true,"username":"john_doe"} -2025-08-23T01:47:09.314Z | [DATABASE] | User lookup completed | Meta:{"executionTime":18,"found":true,"searchBy":"username"} -2025-08-23T01:47:09.354Z | [AUTH] | Password verification completed | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","valid":true,"verificationTime":38} -2025-08-23T01:47:09.358Z | [AUTH] | Login successful | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":62} -2025-08-23T01:47:09.360Z | [AUTH] | User login successful | ReqId:orqgfbg2p | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","username":"john_doe"} -2025-08-23T01:47:09.362Z | [REQUEST] | Request completed | ReqId:orqgfbg2p | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:72ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:47:25.609Z | [REQUEST] | Incoming request | ReqId:drdxk298n | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:47:25.611Z | [REQUEST] | POST /api/users/login | ReqId:drdxk298n | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:47:25.613Z | [REQUEST] | Login endpoint accessed | ReqId:drdxk298n | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"username":"john_doe"} -2025-08-23T01:47:25.615Z | [AUTH] | Login attempt | Meta:{"username":"john_doe"} -2025-08-23T01:47:25.627Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: john_doe })","executionTime":10,"found":true,"username":"john_doe"} -2025-08-23T01:47:25.630Z | [DATABASE] | User lookup completed | Meta:{"executionTime":15,"found":true,"searchBy":"username"} -2025-08-23T01:47:25.669Z | [AUTH] | Password verification completed | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","valid":true,"verificationTime":38} -2025-08-23T01:47:25.672Z | [AUTH] | Login successful | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":57} -2025-08-23T01:47:25.674Z | [AUTH] | User login successful | ReqId:drdxk298n | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W | Meta:{"userId":"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa","username":"john_doe"} -2025-08-23T01:47:25.676Z | [REQUEST] | Request completed | ReqId:drdxk298n | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:67ms | UA:Mozilla/5.0 (Windows NT; Windows NT 10.0; hu-HU) W -2025-08-23T01:48:02.627Z | [REQUEST] | Incoming request | ReqId:a79rrr5wm | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:02.629Z | [REQUEST] | POST /api/users/login | ReqId:a79rrr5wm | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:02.631Z | [REQUEST] | Login endpoint accessed | ReqId:a79rrr5wm | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T01:48:02.633Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T01:48:02.646Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":12,"found":true,"username":"admin_user"} -2025-08-23T01:48:02.649Z | [DATABASE] | User lookup completed | Meta:{"executionTime":15,"found":true,"searchBy":"username"} -2025-08-23T01:48:02.688Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":38} -2025-08-23T01:48:02.691Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":58} -2025-08-23T01:48:02.692Z | [AUTH] | User login successful | ReqId:a79rrr5wm | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T01:48:02.694Z | [REQUEST] | Request completed | ReqId:a79rrr5wm | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:67ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:08.612Z | [REQUEST] | Incoming request | ReqId:zjkyrobt1 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css.map | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:08.614Z | [REQUEST] | GET /api-docs/swagger-ui.css.map | ReqId:zjkyrobt1 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css.map | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:08.621Z | [REQUEST] | Request completed | ReqId:zjkyrobt1 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css.map | Status:200 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:24.826Z | [REQUEST] | Incoming request | ReqId:g04vb2mdz | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:24.827Z | [REQUEST] | GET /api/organizations/page/1/2 | ReqId:g04vb2mdz | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:24.831Z | [AUTH] | Authentication successful | ReqId:g04vb2mdz | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:48:24.833Z | [REQUEST] | Get organizations by page endpoint accessed | ReqId:g04vb2mdz | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"from":1,"to":2} -2025-08-23T01:48:24.835Z | [REQUEST] | Get organizations by page query started | Meta:{"from":1,"to":2,"includeDeleted":false} -2025-08-23T01:48:24.849Z | [DATABASE] | Organization page query completed | Meta:{"query":"executionTime: 12ms, found: 2, total: 3, from: 1, to: 2"} -2025-08-23T01:48:24.851Z | [REQUEST] | Get organizations by page query completed | Meta:{"from":1,"to":2,"returned":2,"totalCount":3,"includeDeleted":false} -2025-08-23T01:48:24.852Z | [REQUEST] | Organizations page retrieved successfully | ReqId:g04vb2mdz | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"from":1,"to":2,"count":2,"totalCount":3} -2025-08-23T01:48:24.855Z | [REQUEST] | Request completed | ReqId:g04vb2mdz | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/page/1/2 | Status:200 | Time:29ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:46.165Z | [REQUEST] | Incoming request | ReqId:4dtyf6psg | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=c | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:46.167Z | [REQUEST] | GET /api/organizations/search | ReqId:4dtyf6psg | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=c | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:48:46.169Z | [AUTH] | Authentication successful | ReqId:4dtyf6psg | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=c | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:48:46.171Z | [REQUEST] | Search organizations endpoint accessed | ReqId:4dtyf6psg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=c | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:48:46.173Z | [WARNING] | Organization search attempted without query | ReqId:4dtyf6psg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=c | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:48:46.174Z | [REQUEST] | Request completed | ReqId:4dtyf6psg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=c | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:12.310Z | [REQUEST] | Incoming request | ReqId:0ow8vg8vw | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22x%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:12.313Z | [REQUEST] | GET /api/organizations/search | ReqId:0ow8vg8vw | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22x%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:12.316Z | [AUTH] | Authentication successful | ReqId:0ow8vg8vw | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22x%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:12.319Z | [REQUEST] | Search organizations endpoint accessed | ReqId:0ow8vg8vw | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22x%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:12.321Z | [WARNING] | Organization search attempted without query | ReqId:0ow8vg8vw | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22x%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:12.323Z | [REQUEST] | Request completed | ReqId:0ow8vg8vw | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22x%22 | Status:400 | Time:13ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.034Z | [REQUEST] | Incoming request | ReqId:rywel54uv | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.036Z | [REQUEST] | GET /api/organizations/search | ReqId:rywel54uv | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.039Z | [AUTH] | Authentication successful | ReqId:rywel54uv | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:20.041Z | [REQUEST] | Search organizations endpoint accessed | ReqId:rywel54uv | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:20.042Z | [WARNING] | Organization search attempted without query | ReqId:rywel54uv | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:20.044Z | [REQUEST] | Request completed | ReqId:rywel54uv | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.604Z | [REQUEST] | Incoming request | ReqId:metl0z9hs | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.606Z | [REQUEST] | GET /api/organizations/search | ReqId:metl0z9hs | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.608Z | [AUTH] | Authentication successful | ReqId:metl0z9hs | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:20.610Z | [REQUEST] | Search organizations endpoint accessed | ReqId:metl0z9hs | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:20.611Z | [WARNING] | Organization search attempted without query | ReqId:metl0z9hs | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:20.613Z | [REQUEST] | Request completed | ReqId:metl0z9hs | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.811Z | [REQUEST] | Incoming request | ReqId:u9j2b2q5a | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.813Z | [REQUEST] | GET /api/organizations/search | ReqId:u9j2b2q5a | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.816Z | [AUTH] | Authentication successful | ReqId:u9j2b2q5a | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:20.817Z | [REQUEST] | Search organizations endpoint accessed | ReqId:u9j2b2q5a | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:20.819Z | [WARNING] | Organization search attempted without query | ReqId:u9j2b2q5a | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:20.820Z | [REQUEST] | Request completed | ReqId:u9j2b2q5a | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.996Z | [REQUEST] | Incoming request | ReqId:rjhs04y9b | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:20.998Z | [REQUEST] | GET /api/organizations/search | ReqId:rjhs04y9b | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.001Z | [AUTH] | Authentication successful | ReqId:rjhs04y9b | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:21.003Z | [REQUEST] | Search organizations endpoint accessed | ReqId:rjhs04y9b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:21.004Z | [WARNING] | Organization search attempted without query | ReqId:rjhs04y9b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:21.006Z | [REQUEST] | Request completed | ReqId:rjhs04y9b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.190Z | [REQUEST] | Incoming request | ReqId:l631gn8nj | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.192Z | [REQUEST] | GET /api/organizations/search | ReqId:l631gn8nj | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.195Z | [AUTH] | Authentication successful | ReqId:l631gn8nj | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:21.196Z | [REQUEST] | Search organizations endpoint accessed | ReqId:l631gn8nj | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:21.198Z | [WARNING] | Organization search attempted without query | ReqId:l631gn8nj | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:21.199Z | [REQUEST] | Request completed | ReqId:l631gn8nj | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.361Z | [REQUEST] | Incoming request | ReqId:3kd239qpt | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.363Z | [REQUEST] | GET /api/organizations/search | ReqId:3kd239qpt | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.365Z | [AUTH] | Authentication successful | ReqId:3kd239qpt | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:21.367Z | [REQUEST] | Search organizations endpoint accessed | ReqId:3kd239qpt | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:21.368Z | [WARNING] | Organization search attempted without query | ReqId:3kd239qpt | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:21.369Z | [REQUEST] | Request completed | ReqId:3kd239qpt | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:8ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.543Z | [REQUEST] | Incoming request | ReqId:xcwuoo3ka | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.545Z | [REQUEST] | GET /api/organizations/search | ReqId:xcwuoo3ka | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.547Z | [AUTH] | Authentication successful | ReqId:xcwuoo3ka | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:21.549Z | [REQUEST] | Search organizations endpoint accessed | ReqId:xcwuoo3ka | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:21.550Z | [WARNING] | Organization search attempted without query | ReqId:xcwuoo3ka | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:21.552Z | [REQUEST] | Request completed | ReqId:xcwuoo3ka | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.731Z | [REQUEST] | Incoming request | ReqId:la0veadee | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.733Z | [REQUEST] | GET /api/organizations/search | ReqId:la0veadee | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.737Z | [AUTH] | Authentication successful | ReqId:la0veadee | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:21.739Z | [REQUEST] | Search organizations endpoint accessed | ReqId:la0veadee | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:21.741Z | [WARNING] | Organization search attempted without query | ReqId:la0veadee | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:21.742Z | [REQUEST] | Request completed | ReqId:la0veadee | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:11ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.931Z | [REQUEST] | Incoming request | ReqId:lq1migg3q | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.934Z | [REQUEST] | GET /api/organizations/search | ReqId:lq1migg3q | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:50:21.937Z | [AUTH] | Authentication successful | ReqId:lq1migg3q | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:50:21.939Z | [REQUEST] | Search organizations endpoint accessed | ReqId:lq1migg3q | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:50:21.941Z | [WARNING] | Organization search attempted without query | ReqId:lq1migg3q | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:50:21.942Z | [REQUEST] | Request completed | ReqId:lq1migg3q | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=%22Inc%22 | Status:400 | Time:11ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:09.358Z | [REQUEST] | Incoming request | ReqId:bvjzu8apr | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:09.360Z | [REQUEST] | GET /api/admin/users/page/1/2 | ReqId:bvjzu8apr | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:09.363Z | [AUTH] | Admin authentication successful | ReqId:bvjzu8apr | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:51:09.365Z | [REQUEST] | Admin paginated users endpoint accessed | ReqId:bvjzu8apr | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"from":1,"to":2,"includeDeleted":false} -2025-08-23T01:51:09.367Z | [REQUEST] | Get users by page query started | Meta:{"from":1,"to":2,"includeDeleted":false} -2025-08-23T01:51:09.381Z | [DATABASE] | User page query completed | Meta:{"query":"from: 1, to: 2","executionTime":13,"found":2,"total":6} -2025-08-23T01:51:09.383Z | [REQUEST] | Get users by page query completed | Meta:{"from":1,"to":2,"returned":2,"totalCount":6,"includeDeleted":false} -2025-08-23T01:51:09.385Z | [REQUEST] | Admin users retrieved successfully | ReqId:bvjzu8apr | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"returnedUsers":2,"totalCount":6,"from":1,"to":2,"includeDeleted":false} -2025-08-23T01:51:09.387Z | [REQUEST] | Request completed | ReqId:bvjzu8apr | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/2 | Status:200 | Time:29ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:32.289Z | [REQUEST] | Incoming request | ReqId:9wjp2xrzg | IP:::ffff:172.20.0.1 | GET /api/admin/users/cccccccc-cccc-cccc-cccc-cccccccccccc | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:32.291Z | [REQUEST] | GET /api/admin/users/cccccccc-cccc-cccc-cccc-cccccccccccc | ReqId:9wjp2xrzg | IP:::ffff:172.20.0.1 | GET /api/admin/users/cccccccc-cccc-cccc-cccc-cccccccccccc | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:32.294Z | [AUTH] | Admin authentication successful | ReqId:9wjp2xrzg | IP:::ffff:172.20.0.1 | GET /api/admin/users/cccccccc-cccc-cccc-cccc-cccccccccccc | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:51:32.296Z | [WARNING] | Validation failed - invalid UUID format | ReqId:9wjp2xrzg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/cccccccc-cccc-cccc-cccc-cccccccccccc | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"uuidErrors":["Field 'userId' must contain a valid UUID"],"endpoint":"/users/cccccccc-cccc-cccc-cccc-cccccccccccc"} -2025-08-23T01:51:32.298Z | [REQUEST] | Request completed | ReqId:9wjp2xrzg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/cccccccc-cccc-cccc-cccc-cccccccccccc | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:55.671Z | [REQUEST] | Incoming request | ReqId:xpntubjq4 | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/6 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:55.673Z | [REQUEST] | GET /api/admin/users/page/1/6 | ReqId:xpntubjq4 | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/6 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:51:55.676Z | [AUTH] | Admin authentication successful | ReqId:xpntubjq4 | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/6 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:51:55.677Z | [REQUEST] | Admin paginated users endpoint accessed | ReqId:xpntubjq4 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/6 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"from":1,"to":6,"includeDeleted":false} -2025-08-23T01:51:55.679Z | [REQUEST] | Get users by page query started | Meta:{"from":1,"to":6,"includeDeleted":false} -2025-08-23T01:51:55.691Z | [DATABASE] | User page query completed | Meta:{"query":"from: 1, to: 6","executionTime":11,"found":5,"total":6} -2025-08-23T01:51:55.693Z | [REQUEST] | Get users by page query completed | Meta:{"from":1,"to":6,"returned":5,"totalCount":6,"includeDeleted":false} -2025-08-23T01:51:55.695Z | [REQUEST] | Admin users retrieved successfully | ReqId:xpntubjq4 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/6 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"returnedUsers":5,"totalCount":6,"from":1,"to":6,"includeDeleted":false} -2025-08-23T01:51:55.696Z | [REQUEST] | Request completed | ReqId:xpntubjq4 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/1/6 | Status:200 | Time:25ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:06.382Z | [REQUEST] | Incoming request | ReqId:vo8gdcc2b | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/0/6 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:06.384Z | [REQUEST] | GET /api/admin/users/page/0/6 | ReqId:vo8gdcc2b | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/0/6 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:06.387Z | [AUTH] | Admin authentication successful | ReqId:vo8gdcc2b | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/0/6 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:52:06.389Z | [REQUEST] | Admin paginated users endpoint accessed | ReqId:vo8gdcc2b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/0/6 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"from":0,"to":6,"includeDeleted":false} -2025-08-23T01:52:06.390Z | [REQUEST] | Get users by page query started | Meta:{"from":0,"to":6,"includeDeleted":false} -2025-08-23T01:52:06.403Z | [DATABASE] | User page query completed | Meta:{"query":"from: 0, to: 6","executionTime":11,"found":6,"total":6} -2025-08-23T01:52:06.405Z | [REQUEST] | Get users by page query completed | Meta:{"from":0,"to":6,"returned":6,"totalCount":6,"includeDeleted":false} -2025-08-23T01:52:06.407Z | [REQUEST] | Admin users retrieved successfully | ReqId:vo8gdcc2b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/0/6 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"returnedUsers":6,"totalCount":6,"from":0,"to":6,"includeDeleted":false} -2025-08-23T01:52:06.408Z | [REQUEST] | Request completed | ReqId:vo8gdcc2b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/page/0/6 | Status:200 | Time:26ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:17.944Z | [REQUEST] | Incoming request | ReqId:bj93nq7kt | IP:::ffff:172.20.0.1 | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:17.946Z | [REQUEST] | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | ReqId:bj93nq7kt | IP:::ffff:172.20.0.1 | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:17.949Z | [AUTH] | Admin authentication successful | ReqId:bj93nq7kt | IP:::ffff:172.20.0.1 | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:52:17.951Z | [REQUEST] | Admin get user by id endpoint accessed | ReqId:bj93nq7kt | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"targetUserId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","includeDeleted":false} -2025-08-23T01:52:17.962Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: 4f8ecfd9-cf3c-4902-9aed-0e94a74305ab })","executionTime":10,"found":true,"userId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab"} -2025-08-23T01:52:17.963Z | [REQUEST] | Admin user retrieved successfully | ReqId:bj93nq7kt | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"targetUserId":"4f8ecfd9-cf3c-4902-9aed-0e94a74305ab","username":"Test","includeDeleted":false} -2025-08-23T01:52:17.965Z | [REQUEST] | Request completed | ReqId:bj93nq7kt | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/4f8ecfd9-cf3c-4902-9aed-0e94a74305ab | Status:200 | Time:21ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:37.410Z | [REQUEST] | Incoming request | ReqId:c2yvdwr7a | IP:::ffff:172.20.0.1 | GET /api/admin/users/search/Test | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:37.412Z | [REQUEST] | GET /api/admin/users/search/Test | ReqId:c2yvdwr7a | IP:::ffff:172.20.0.1 | GET /api/admin/users/search/Test | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:52:37.415Z | [AUTH] | Admin authentication successful | ReqId:c2yvdwr7a | IP:::ffff:172.20.0.1 | GET /api/admin/users/search/Test | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:52:37.417Z | [REQUEST] | Admin search users endpoint accessed | ReqId:c2yvdwr7a | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/search/Test | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"searchTerm":"Test","includeDeleted":false} -2025-08-23T01:52:37.430Z | [DATABASE] | User search completed | Meta:{"query":"Test","executionTime":12,"limit":20,"offset":0,"totalCount":1,"returnedCount":1} -2025-08-23T01:52:37.432Z | [REQUEST] | Admin user search completed | ReqId:c2yvdwr7a | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/search/Test | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"searchTerm":"Test","resultCount":1,"includeDeleted":false} -2025-08-23T01:52:37.434Z | [REQUEST] | Request completed | ReqId:c2yvdwr7a | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/users/search/Test | Status:200 | Time:24ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:04.367Z | [REQUEST] | Incoming request | ReqId:z5j9o0tet | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:04.369Z | [REQUEST] | GET /api/organizations/search | ReqId:z5j9o0tet | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:04.372Z | [AUTH] | Authentication successful | ReqId:z5j9o0tet | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:53:04.374Z | [REQUEST] | Search organizations endpoint accessed | ReqId:z5j9o0tet | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:53:04.375Z | [WARNING] | Organization search attempted without query | ReqId:z5j9o0tet | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:53:04.377Z | [REQUEST] | Request completed | ReqId:z5j9o0tet | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:400 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:10.203Z | [REQUEST] | Incoming request | ReqId:j8zbdn0qz | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:10.205Z | [REQUEST] | GET /api/organizations/search | ReqId:j8zbdn0qz | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:10.208Z | [AUTH] | Authentication successful | ReqId:j8zbdn0qz | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:53:10.209Z | [REQUEST] | Search organizations endpoint accessed | ReqId:j8zbdn0qz | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:53:10.211Z | [WARNING] | Organization search attempted without query | ReqId:j8zbdn0qz | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:53:10.213Z | [REQUEST] | Request completed | ReqId:j8zbdn0qz | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare%20Corp | Status:400 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:12.510Z | [REQUEST] | Incoming request | ReqId:jdh0pkdyg | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:12.512Z | [REQUEST] | GET /api/organizations/search | ReqId:jdh0pkdyg | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T01:53:12.514Z | [AUTH] | Authentication successful | ReqId:jdh0pkdyg | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T01:53:12.516Z | [REQUEST] | Search organizations endpoint accessed | ReqId:jdh0pkdyg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T01:53:12.518Z | [WARNING] | Organization search attempted without query | ReqId:jdh0pkdyg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T01:53:12.519Z | [REQUEST] | Request completed | ReqId:jdh0pkdyg | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=Healthcare | Status:400 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.796Z | [REQUEST] | Incoming request | ReqId:ddjlk6qo8 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.798Z | [REQUEST] | GET /api-docs/ | ReqId:ddjlk6qo8 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.802Z | [REQUEST] | Request completed | ReqId:ddjlk6qo8 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.820Z | [REQUEST] | Incoming request | ReqId:mcvt6e6tm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.823Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:mcvt6e6tm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.826Z | [REQUEST] | Request completed | ReqId:mcvt6e6tm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.831Z | [REQUEST] | Incoming request | ReqId:31wfm04gu | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.833Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:31wfm04gu | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.836Z | [REQUEST] | Request completed | ReqId:31wfm04gu | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.838Z | [REQUEST] | Incoming request | ReqId:bfzndz938 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.840Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:bfzndz938 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.842Z | [REQUEST] | Request completed | ReqId:bfzndz938 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.845Z | [REQUEST] | Incoming request | ReqId:njxlmjgdt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.847Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:njxlmjgdt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:05.849Z | [REQUEST] | Request completed | ReqId:njxlmjgdt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:02:21.928Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T02:02:21.930Z | [STARTUP] | HTTP server closed -2025-08-23T02:02:21.932Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-02-54-088Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-02-54-088Z.log deleted file mode 100644 index e925b03b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-02-54-088Z.log +++ /dev/null @@ -1,75 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:02:54.088Z -# Max entries per file: 10000 - -2025-08-23T02:03:02.518Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:03:02.533Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:03:02.533Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:03:03.725Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:03:03.745Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:03:03.747Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:03:03.752Z | [STARTUP] | Redis client connected successfully -2025-08-23T02:03:05.128Z | [REQUEST] | Incoming request | ReqId:quygfhbb5 | IP:::ffff:172.20.0.1 | GET / | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:05.130Z | [REQUEST] | GET / | ReqId:quygfhbb5 | IP:::ffff:172.20.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:05.133Z | [REQUEST] | Request completed | ReqId:quygfhbb5 | IP:::ffff:172.20.0.1 | GET / | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:05.148Z | [REQUEST] | Incoming request | ReqId:5l8ypvf11 | IP:::ffff:172.20.0.1 | GET /favicon.ico | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:05.150Z | [REQUEST] | GET /favicon.ico | ReqId:5l8ypvf11 | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:05.153Z | [REQUEST] | Request completed | ReqId:5l8ypvf11 | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:404 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.336Z | [REQUEST] | Incoming request | ReqId:zdt0u3vi6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.338Z | [REQUEST] | GET /api-docs/ | ReqId:zdt0u3vi6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.342Z | [REQUEST] | Request completed | ReqId:zdt0u3vi6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.359Z | [REQUEST] | Incoming request | ReqId:ai5uossiq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.362Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:ai5uossiq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.365Z | [REQUEST] | Request completed | ReqId:ai5uossiq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.367Z | [REQUEST] | Incoming request | ReqId:c74qo7584 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.369Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:c74qo7584 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.371Z | [REQUEST] | Incoming request | ReqId:2jz7now1o | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.373Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:2jz7now1o | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.375Z | [REQUEST] | Request completed | ReqId:c74qo7584 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:8ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.377Z | [REQUEST] | Request completed | ReqId:2jz7now1o | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.379Z | [REQUEST] | Incoming request | ReqId:hq8a5xhtd | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.381Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:hq8a5xhtd | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:09.383Z | [REQUEST] | Request completed | ReqId:hq8a5xhtd | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:29.723Z | [REQUEST] | Incoming request | ReqId:wx2551f34 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:29.725Z | [REQUEST] | POST /api/users/login | ReqId:wx2551f34 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:29.727Z | [REQUEST] | Login endpoint accessed | ReqId:wx2551f34 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T02:03:29.729Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T02:03:29.756Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":25,"found":true,"username":"admin_user"} -2025-08-23T02:03:29.758Z | [DATABASE] | User lookup completed | Meta:{"executionTime":29,"found":true,"searchBy":"username"} -2025-08-23T02:03:29.797Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":38} -2025-08-23T02:03:29.801Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":72} -2025-08-23T02:03:29.802Z | [AUTH] | User login successful | ReqId:wx2551f34 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T02:03:29.804Z | [REQUEST] | Request completed | ReqId:wx2551f34 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:81ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:54.393Z | [REQUEST] | Incoming request | ReqId:v73p4mzes | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=in&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:54.395Z | [REQUEST] | GET /api/organizations/search | ReqId:v73p4mzes | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=in&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:03:54.400Z | [AUTH] | Authentication successful | ReqId:v73p4mzes | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=in&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:03:54.402Z | [REQUEST] | Search organizations endpoint accessed | ReqId:v73p4mzes | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=in&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T02:03:54.403Z | [WARNING] | Organization search attempted without query | ReqId:v73p4mzes | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=in&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T02:03:54.405Z | [REQUEST] | Request completed | ReqId:v73p4mzes | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?term=in&from=1&to=2 | Status:400 | Time:12ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:04:36.521Z | [REQUEST] | Incoming request | ReqId:mi2n84wdl | IP:::ffff:172.20.0.1 | GET /api/admin/decks/search/a | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:04:36.523Z | [REQUEST] | GET /api/admin/decks/search/a | ReqId:mi2n84wdl | IP:::ffff:172.20.0.1 | GET /api/admin/decks/search/a | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:04:36.527Z | [AUTH] | Admin authentication successful | ReqId:mi2n84wdl | IP:::ffff:172.20.0.1 | GET /api/admin/decks/search/a | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:04:36.529Z | [REQUEST] | Admin search decks endpoint accessed | ReqId:mi2n84wdl | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/decks/search/a | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"searchTerm":"a","includeDeleted":false} -2025-08-23T02:04:36.566Z | [DATABASE] | Deck search completed | Meta:{"query":"executionTime: 34ms, found: 7, total: 7, searchTerm: \"a\", limit: 20, offset: 0"} -2025-08-23T02:04:36.568Z | [REQUEST] | Admin deck search completed | ReqId:mi2n84wdl | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/decks/search/a | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"searchTerm":"a","resultCount":7,"includeDeleted":false} -2025-08-23T02:04:36.570Z | [REQUEST] | Request completed | ReqId:mi2n84wdl | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/admin/decks/search/a | Status:200 | Time:49ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.746Z | [REQUEST] | Incoming request | ReqId:ujart0blm | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.748Z | [REQUEST] | GET /api-docs/ | ReqId:ujart0blm | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.752Z | [REQUEST] | Request completed | ReqId:ujart0blm | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.768Z | [REQUEST] | Incoming request | ReqId:svd005yiv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.770Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:svd005yiv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.776Z | [REQUEST] | Incoming request | ReqId:rhmhbvz0n | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.777Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:rhmhbvz0n | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.781Z | [REQUEST] | Incoming request | ReqId:r7dyk6unq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.783Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:r7dyk6unq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.785Z | [REQUEST] | Request completed | ReqId:r7dyk6unq | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.788Z | [REQUEST] | Incoming request | ReqId:tcpussb30 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.790Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:tcpussb30 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.792Z | [REQUEST] | Request completed | ReqId:svd005yiv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | Time:24ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.798Z | [REQUEST] | Request completed | ReqId:tcpussb30 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.809Z | [REQUEST] | Request completed | ReqId:rhmhbvz0n | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | Time:33ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.929Z | [REQUEST] | Incoming request | ReqId:7o66pvpqe | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.931Z | [REQUEST] | GET /api-docs/favicon-16x16.png | ReqId:7o66pvpqe | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:05:46.936Z | [REQUEST] | Request completed | ReqId:7o66pvpqe | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:10:45.496Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T02:10:45.498Z | [STARTUP] | HTTP server closed -2025-08-23T02:10:45.501Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-18-637Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-18-637Z.log deleted file mode 100644 index 4cf48b4b..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-18-637Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:15:18.637Z -# Max entries per file: 10000 - -2025-08-23T02:15:25.399Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:15:25.416Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:15:25.416Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:15:26.592Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:15:26.623Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:15:26.625Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:15:26.628Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-55-300Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-55-300Z.log deleted file mode 100644 index b1317a20..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-55-300Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:15:55.300Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-59-043Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-59-043Z.log deleted file mode 100644 index 1fa565ae..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-15-59-043Z.log +++ /dev/null @@ -1,44 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:15:59.043Z -# Max entries per file: 10000 - -2025-08-23T02:16:06.292Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:16:06.304Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:16:06.304Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:16:07.365Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:16:07.392Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:16:07.394Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:16:07.396Z | [STARTUP] | Redis client connected successfully -2025-08-23T02:16:08.363Z | [REQUEST] | Incoming request | ReqId:8natxsh6z | IP:::ffff:172.20.0.1 | GET /api-docs | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.366Z | [REQUEST] | GET /api-docs | ReqId:8natxsh6z | IP:::ffff:172.20.0.1 | GET /api-docs | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.369Z | [REQUEST] | Request completed | ReqId:8natxsh6z | IP:::ffff:172.20.0.1 | GET /api-docs | Status:301 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.374Z | [REQUEST] | Incoming request | ReqId:6xj098cwy | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.376Z | [REQUEST] | GET /api-docs/ | ReqId:6xj098cwy | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.379Z | [REQUEST] | Request completed | ReqId:6xj098cwy | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.394Z | [REQUEST] | Incoming request | ReqId:uoea3feq4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.397Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:uoea3feq4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.400Z | [REQUEST] | Request completed | ReqId:uoea3feq4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.402Z | [REQUEST] | Incoming request | ReqId:3kgo60rcj | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.403Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:3kgo60rcj | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.405Z | [REQUEST] | Request completed | ReqId:3kgo60rcj | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.407Z | [REQUEST] | Incoming request | ReqId:j53cbps14 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.409Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:j53cbps14 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.411Z | [REQUEST] | Request completed | ReqId:j53cbps14 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.413Z | [REQUEST] | Incoming request | ReqId:sl36pv1p8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.415Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:sl36pv1p8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:08.428Z | [REQUEST] | Request completed | ReqId:sl36pv1p8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:15ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:22.530Z | [REQUEST] | Incoming request | ReqId:pbn8yzfba | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:22.532Z | [REQUEST] | POST /api/users/login | ReqId:pbn8yzfba | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:22.535Z | [REQUEST] | Login endpoint accessed | ReqId:pbn8yzfba | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"username":"admin_user"} -2025-08-23T02:16:22.536Z | [AUTH] | Login attempt | Meta:{"username":"admin_user"} -2025-08-23T02:16:22.563Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: admin_user })","executionTime":25,"found":true,"username":"admin_user"} -2025-08-23T02:16:22.565Z | [DATABASE] | User lookup completed | Meta:{"executionTime":29,"found":true,"searchBy":"username"} -2025-08-23T02:16:22.605Z | [AUTH] | Password verification completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","valid":true,"verificationTime":38} -2025-08-23T02:16:22.609Z | [AUTH] | Login successful | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":73} -2025-08-23T02:16:22.610Z | [AUTH] | User login successful | ReqId:pbn8yzfba | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","username":"admin_user"} -2025-08-23T02:16:22.612Z | [REQUEST] | Request completed | ReqId:pbn8yzfba | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:82ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:38.688Z | [REQUEST] | Incoming request | ReqId:h389wjyvi | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:38.690Z | [REQUEST] | GET /api/organizations/search | ReqId:h389wjyvi | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:16:38.693Z | [AUTH] | Authentication successful | ReqId:h389wjyvi | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:16:38.695Z | [REQUEST] | Search organizations endpoint accessed | ReqId:h389wjyvi | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T02:16:38.697Z | [WARNING] | Organization search attempted without query | ReqId:h389wjyvi | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T02:16:38.699Z | [REQUEST] | Request completed | ReqId:h389wjyvi | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:400 | Time:11ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-17-21-230Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-17-21-230Z.log deleted file mode 100644 index bdc1d86d..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-17-21-230Z.log +++ /dev/null @@ -1,17 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:17:21.230Z -# Max entries per file: 10000 - -2025-08-23T02:17:27.669Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:17:27.681Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:17:27.681Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:17:28.714Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:17:28.739Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:17:28.741Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:17:28.743Z | [STARTUP] | Redis client connected successfully -2025-08-23T02:17:29.865Z | [REQUEST] | Incoming request | ReqId:ypq8rc2e0 | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:17:29.868Z | [REQUEST] | GET /api/organizations/search | ReqId:ypq8rc2e0 | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:17:29.872Z | [AUTH] | Authentication successful | ReqId:ypq8rc2e0 | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:17:29.874Z | [REQUEST] | Search organizations endpoint accessed | ReqId:ypq8rc2e0 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"inc"} -2025-08-23T02:17:29.890Z | [DATABASE] | Organization search completed | Meta:{"query":"executionTime: 14ms, found: 1, total: 1, searchTerm: \"inc\", limit: 20, offset: 0"} -2025-08-23T02:17:29.892Z | [REQUEST] | Organization search completed successfully | ReqId:ypq8rc2e0 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"inc","resultCount":0} -2025-08-23T02:17:29.895Z | [REQUEST] | Request completed | ReqId:ypq8rc2e0 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | Time:30ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-17-42-515Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-17-42-515Z.log deleted file mode 100644 index 56fc61ee..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-17-42-515Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:17:42.515Z -# Max entries per file: 10000 - -2025-08-23T02:17:49.423Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:17:49.436Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:17:49.436Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:17:50.544Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:17:50.567Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:17:50.569Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:17:50.578Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-18-04-282Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-18-04-282Z.log deleted file mode 100644 index c2c8bb3e..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-18-04-282Z.log +++ /dev/null @@ -1,34 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:18:04.282Z -# Max entries per file: 10000 - -2025-08-23T02:18:10.746Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:18:10.759Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:18:10.759Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:18:11.870Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:18:11.896Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:18:11.898Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:18:11.902Z | [REQUEST] | Incoming request | ReqId:xysv4w82y | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:11.903Z | [REQUEST] | GET /api/organizations/search | ReqId:xysv4w82y | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:11.907Z | [AUTH] | Authentication successful | ReqId:xysv4w82y | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:18:11.909Z | [REQUEST] | Search organizations endpoint accessed | ReqId:xysv4w82y | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"inc"} -2025-08-23T02:18:11.915Z | [STARTUP] | Redis client connected successfully -2025-08-23T02:18:11.922Z | [DATABASE] | Organization search completed | Meta:{"query":"executionTime: 11ms, found: 1, total: 1, searchTerm: \"inc\", limit: 20, offset: 0"} -2025-08-23T02:18:11.923Z | [REQUEST] | Organization search completed successfully | ReqId:xysv4w82y | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"inc","resultCount":0} -2025-08-23T02:18:11.926Z | [REQUEST] | Request completed | ReqId:xysv4w82y | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/organizations/search?query=inc&from=1&to=2 | Status:304 | Time:24ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:25.000Z | [REQUEST] | Incoming request | ReqId:lrj3y5nl3 | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:25.002Z | [REQUEST] | GET /api/decks/page/1/2 | ReqId:lrj3y5nl3 | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:25.005Z | [AUTH] | Authentication successful | ReqId:lrj3y5nl3 | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:18:25.006Z | [REQUEST] | Get decks by page endpoint accessed | ReqId:lrj3y5nl3 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","userOrgId":"","isAdmin":true,"from":1,"to":2} -2025-08-23T02:18:25.008Z | [AUTH] | ADMIN_BYPASS: GET_DECKS_PAGE_BYPASS | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","targetId":"paginated-decks","action":"GET_DECKS_PAGE_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T02:18:25.008Z","from":1,"to":2,"includesDeleted":false,"operation":"read"} -2025-08-23T02:18:25.010Z | [REQUEST] | Get decks by page query started | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","userOrgId":"","isAdmin":true,"from":1,"to":2,"includeDeleted":false} -2025-08-23T02:18:25.011Z | [AUTH] | ADMIN_BYPASS: FIND_FILTERED_DECKS_BYPASS | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","targetId":"all-decks-filtered","action":"FIND_FILTERED_DECKS_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-08-23T02:18:25.011Z","bypassType":"admin-all-decks-filtered","userOrgId":"","from":1,"to":2,"operation":"read"} -2025-08-23T02:18:25.037Z | [DATABASE] | Admin filtered deck query completed | Meta:{"query":"executionTime: 26ms, userId: dddddddd-dddd-dddd-dddd-dddddddddddd, found: 2, totalCount: 7, isAdmin: true"} -2025-08-23T02:18:25.039Z | [REQUEST] | Get decks by page query completed | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","userOrgId":"","isAdmin":true,"from":1,"to":2,"returned":2,"totalCount":7,"includeDeleted":false} -2025-08-23T02:18:25.041Z | [REQUEST] | Get decks page completed successfully | ReqId:lrj3y5nl3 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","from":1,"to":2,"returnedCount":2,"totalCount":7} -2025-08-23T02:18:25.043Z | [REQUEST] | Request completed | ReqId:lrj3y5nl3 | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/2 | Status:200 | Time:43ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:34.097Z | [REQUEST] | Incoming request | ReqId:gqj6d065b | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:34.099Z | [REQUEST] | GET /api/decks/search | ReqId:gqj6d065b | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:34.102Z | [AUTH] | Authentication successful | ReqId:gqj6d065b | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:18:34.104Z | [REQUEST] | Search decks endpoint accessed | ReqId:gqj6d065b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{} -2025-08-23T02:18:34.107Z | [WARNING] | Deck search attempted without query | ReqId:gqj6d065b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"hasQuery":false} -2025-08-23T02:18:34.109Z | [REQUEST] | Request completed | ReqId:gqj6d065b | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:400 | Time:12ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-18-52-235Z.log b/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-18-52-235Z.log deleted file mode 100644 index c23fcda4..00000000 --- a/SerpentRace_Backend/logs/2025-08/serpentrace-2025-08-23T02-18-52-235Z.log +++ /dev/null @@ -1,28 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-08-23T02:18:52.235Z -# Max entries per file: 10000 - -2025-08-23T02:18:58.663Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.4","chatInactivityTimeout":"30"} -2025-08-23T02:18:58.675Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-08-23T02:18:58.675Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-08-23T02:18:58.703Z | [REQUEST] | Incoming request | ReqId:eprbr5hmu | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:58.705Z | [REQUEST] | GET /api/decks/search | ReqId:eprbr5hmu | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:58.709Z | [AUTH] | Authentication successful | ReqId:eprbr5hmu | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:18:58.711Z | [REQUEST] | Search decks endpoint accessed | ReqId:eprbr5hmu | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"a"} -2025-08-23T02:18:58.713Z | [DATABASE] | Deck search failed | Meta:{"query":"executionTime: 0ms, searchTerm: \"a\""} -2025-08-23T02:18:58.722Z | [ERROR] | DeckRepository.search error | Meta:{"name":"EntityMetadataNotFoundError","message":"No metadata for \"DeckAggregate\" was found.","stack":"EntityMetadataNotFoundError: No metadata for \"DeckAggregate\" was found.\n at DataSource.getMetadata (/app/node_modules/src/data-source/DataSource.ts:451:30)\n at Repository.get metadata [as metadata] (/app/node_modules/src/repository/Repository.ts:54:40)\n at Repository.createQueryBuilder (/app/node_modules/src/repository/Repository.ts:83:18)\n at DeckRepository.search (/app/src/Infrastructure/Repository/DeckRepository.ts:109:44)\n at GeneralSearchService.searchDecks (/app/src/Application/Search/Generalsearch.ts:108:55)\n at GeneralSearchService.searchByType (/app/src/Application/Search/Generalsearch.ts:131:27)\n at GeneralSearchService.searchFromUrl (/app/src/Application/Search/Generalsearch.ts:142:23)\n at /app/src/Api/routers/deckRouter.ts:110:38\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)"} -2025-08-23T02:18:58.726Z | [ERROR] | Search decks endpoint error | ReqId:eprbr5hmu | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"name":"Error","message":"Failed to search decks in database","stack":"Error: Failed to search decks in database\n at DeckRepository.search (/app/src/Infrastructure/Repository/DeckRepository.ts:129:19)\n at GeneralSearchService.searchDecks (/app/src/Application/Search/Generalsearch.ts:108:55)\n at GeneralSearchService.searchByType (/app/src/Application/Search/Generalsearch.ts:131:27)\n at GeneralSearchService.searchFromUrl (/app/src/Application/Search/Generalsearch.ts:142:23)\n at /app/src/Api/routers/deckRouter.ts:110:38\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:29:5)\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)"} -2025-08-23T02:18:58.729Z | [REQUEST] | Request completed | ReqId:eprbr5hmu | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:500 | Time:26ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:18:59.783Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-08-23T02:18:59.805Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-08-23T02:18:59.807Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-08-23T02:18:59.809Z | [STARTUP] | Redis client connected successfully -2025-08-23T02:19:01.010Z | [REQUEST] | Incoming request | ReqId:73ivh57my | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:19:01.012Z | [REQUEST] | GET /api/decks/search | ReqId:73ivh57my | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:19:01.015Z | [AUTH] | Authentication successful | ReqId:73ivh57my | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"userId":"dddddddd-dddd-dddd-dddd-dddddddddddd","authLevel":1,"orgId":""} -2025-08-23T02:19:01.017Z | [REQUEST] | Search decks endpoint accessed | ReqId:73ivh57my | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"a"} -2025-08-23T02:19:01.031Z | [DATABASE] | Deck search completed | Meta:{"query":"executionTime: 12ms, found: 7, total: 7, searchTerm: \"a\", limit: 20, offset: 0"} -2025-08-23T02:19:01.033Z | [REQUEST] | Deck search completed successfully | ReqId:73ivh57my | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 | Meta:{"query":"a","resultCount":0} -2025-08-23T02:19:01.035Z | [REQUEST] | Request completed | ReqId:73ivh57my | UserId:dddddddd-dddd-dddd-dddd-dddddddddddd | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=a&from=1&to=2 | Status:200 | Time:25ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-08-23T02:19:33.182Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-08-23T02:19:33.184Z | [STARTUP] | HTTP server closed -2025-08-23T02:19:33.187Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-11T19-46-55-317Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-11T19-46-55-317Z.log deleted file mode 100644 index 01df8eab..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-11T19-46-55-317Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-11T19:46:55.317Z -# Max entries per file: 10000 - -2025-09-11T19:47:01.847Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-11T19:47:01.860Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-11T19:47:01.860Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-11T19:47:03.007Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-11T19:47:03.029Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-11T19:47:03.031Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-11T19:47:03.036Z | [STARTUP] | Redis client connected successfully -2025-09-11T19:50:33.982Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-09-11T19:50:33.984Z | [STARTUP] | HTTP server closed -2025-09-11T19:50:33.986Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T17-53-43-765Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T17-53-43-765Z.log deleted file mode 100644 index a34a0796..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T17-53-43-765Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T17:53:43.765Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-17-37-847Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-17-37-847Z.log deleted file mode 100644 index b9fe2cd2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-17-37-847Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:17:37.847Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-18-23-927Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-18-23-927Z.log deleted file mode 100644 index ca10414d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-18-23-927Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:18:23.927Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-18-34-439Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-18-34-439Z.log deleted file mode 100644 index 5f456f38..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-18-34-439Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:18:34.439Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-19-23-569Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-19-23-569Z.log deleted file mode 100644 index d91ef9f5..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-19-23-569Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:19:23.569Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-20-04-021Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-20-04-021Z.log deleted file mode 100644 index e2e74687..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-20-04-021Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:20:04.021Z -# Max entries per file: 10000 - -2025-09-14T19:20:10.462Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:20:10.481Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:20:10.481Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:20:11.517Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:20:11.540Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:20:11.542Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:20:11.544Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-21-14-683Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-21-14-683Z.log deleted file mode 100644 index cd00780e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-21-14-683Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:21:14.683Z -# Max entries per file: 10000 - -2025-09-14T19:21:20.986Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:21:21.000Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:21:21.000Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:21:22.043Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:21:22.066Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:21:22.068Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:21:22.071Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-21-36-572Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-21-36-572Z.log deleted file mode 100644 index e49ce23d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-21-36-572Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:21:36.572Z -# Max entries per file: 10000 - -2025-09-14T19:21:42.689Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:21:42.701Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:21:42.701Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:21:43.715Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:21:43.736Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:21:43.737Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:21:43.742Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-33-778Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-33-778Z.log deleted file mode 100644 index 9d24e1d7..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-33-778Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:22:33.778Z -# Max entries per file: 10000 - -2025-09-14T19:22:40.482Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:22:40.492Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:22:40.492Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-43-932Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-43-932Z.log deleted file mode 100644 index 49c6b475..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-43-932Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:22:43.932Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-48-065Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-48-065Z.log deleted file mode 100644 index 298b743a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-22-48-065Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:22:48.065Z -# Max entries per file: 10000 - -2025-09-14T19:22:54.939Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:22:54.950Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:22:54.950Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:22:56.146Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:22:56.166Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:22:56.168Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:22:56.173Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-25-44-004Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-25-44-004Z.log deleted file mode 100644 index 25386ca3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-25-44-004Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:25:44.004Z -# Max entries per file: 10000 - -2025-09-14T19:25:50.938Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:25:50.951Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:25:50.951Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:25:52.304Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:25:52.327Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:25:52.329Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:25:52.331Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-25-59-718Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-25-59-718Z.log deleted file mode 100644 index a113ab44..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-25-59-718Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:25:59.718Z -# Max entries per file: 10000 - -2025-09-14T19:26:06.302Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:26:06.313Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:26:06.313Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:26:07.503Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:26:07.523Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:26:07.525Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:26:07.530Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-28-40-447Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-28-40-447Z.log deleted file mode 100644 index b3551b53..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-28-40-447Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:28:40.447Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-28-44-247Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-28-44-247Z.log deleted file mode 100644 index 8d036622..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-28-44-247Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:28:44.247Z -# Max entries per file: 10000 - -2025-09-14T19:28:50.571Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:28:50.583Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:28:50.583Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:28:51.978Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:28:52.002Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:28:52.004Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:28:52.006Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-29-20-730Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-29-20-730Z.log deleted file mode 100644 index 50e812b9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-29-20-730Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:29:20.730Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-29-24-137Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-29-24-137Z.log deleted file mode 100644 index b1a47de8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-29-24-137Z.log +++ /dev/null @@ -1,34 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:29:24.137Z -# Max entries per file: 10000 - -2025-09-14T19:29:30.670Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:29:30.683Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:29:30.683Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:29:32.101Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:29:32.122Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:29:32.124Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:29:32.126Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:29:53.164Z | [REQUEST] | Incoming request | ReqId:amhtws2j0 | IP:::ffff:172.20.0.1 | GET / | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:53.168Z | [REQUEST] | GET / | ReqId:amhtws2j0 | IP:::ffff:172.20.0.1 | GET / | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:53.170Z | [REQUEST] | Request completed | ReqId:amhtws2j0 | IP:::ffff:172.20.0.1 | GET / | Status:200 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:53.204Z | [REQUEST] | Incoming request | ReqId:enbi7wzsd | IP:::ffff:172.20.0.1 | GET /favicon.ico | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:53.206Z | [REQUEST] | GET /favicon.ico | ReqId:enbi7wzsd | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:53.209Z | [REQUEST] | Request completed | ReqId:enbi7wzsd | IP:::ffff:172.20.0.1 | GET /favicon.ico | Status:404 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.233Z | [REQUEST] | Incoming request | ReqId:8gdk52ggd | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.235Z | [REQUEST] | GET /api-docs/ | ReqId:8gdk52ggd | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.238Z | [REQUEST] | Request completed | ReqId:8gdk52ggd | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.257Z | [REQUEST] | Incoming request | ReqId:5qhaikidc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.260Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:5qhaikidc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.264Z | [REQUEST] | Incoming request | ReqId:ajms6z1qt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.265Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:ajms6z1qt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.268Z | [REQUEST] | Incoming request | ReqId:u5j5akkaa | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.270Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:u5j5akkaa | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.271Z | [REQUEST] | Request completed | ReqId:u5j5akkaa | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.274Z | [REQUEST] | Incoming request | ReqId:ensevj1ln | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.275Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:ensevj1ln | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.277Z | [REQUEST] | Request completed | ReqId:5qhaikidc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | Time:20ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.283Z | [REQUEST] | Request completed | ReqId:ensevj1ln | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.290Z | [REQUEST] | Request completed | ReqId:ajms6z1qt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | Time:26ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.402Z | [REQUEST] | Incoming request | ReqId:y8brzkde5 | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.404Z | [REQUEST] | GET /api-docs/favicon-16x16.png | ReqId:y8brzkde5 | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:29:58.407Z | [REQUEST] | Request completed | ReqId:y8brzkde5 | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-31-16-080Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-31-16-080Z.log deleted file mode 100644 index d792dcdc..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-31-16-080Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:31:16.080Z -# Max entries per file: 10000 - -2025-09-14T19:31:22.883Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:31:22.895Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:31:22.895Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:31:24.314Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:31:24.340Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:31:24.342Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:31:24.344Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-05-539Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-05-539Z.log deleted file mode 100644 index ba52383b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-05-539Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:35:05.539Z -# Max entries per file: 10000 - -2025-09-14T19:35:10.729Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:35:10.744Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-49-977Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-49-977Z.log deleted file mode 100644 index f0e6eee9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-49-977Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:35:49.977Z -# Max entries per file: 10000 - -2025-09-14T19:35:55.314Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:35:55.326Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-50-418Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-50-418Z.log deleted file mode 100644 index f46b44c8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-35-50-418Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:35:50.418Z -# Max entries per file: 10000 - -2025-09-14T19:35:57.577Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:35:57.588Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:35:57.588Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:35:59.015Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:35:59.036Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:35:59.038Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:35:59.043Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-36-04-541Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-36-04-541Z.log deleted file mode 100644 index db823fe9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-36-04-541Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:36:04.541Z -# Max entries per file: 10000 - -2025-09-14T19:36:11.577Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:36:11.588Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:36:11.588Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:36:13.015Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:36:13.037Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:36:13.039Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:36:13.041Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-36-05-386Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-36-05-386Z.log deleted file mode 100644 index d90d1536..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-36-05-386Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:36:05.386Z -# Max entries per file: 10000 - -2025-09-14T19:36:10.463Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:36:10.476Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-31-110Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-31-110Z.log deleted file mode 100644 index 233ab0e9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-31-110Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:37:31.110Z -# Max entries per file: 10000 - -2025-09-14T19:37:35.672Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:37:35.680Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:37:35.680Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:37:36.067Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T19:37:36.088Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:37:36.088Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:37:36.090Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-47-755Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-47-755Z.log deleted file mode 100644 index 360c7777..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-47-755Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:37:47.755Z -# Max entries per file: 10000 - -2025-09-14T19:37:55.839Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:37:55.851Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:37:55.851Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:37:57.364Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:37:57.385Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:37:57.387Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:37:57.392Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-48-912Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-48-912Z.log deleted file mode 100644 index 81aca9f7..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-48-912Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:37:48.912Z -# Max entries per file: 10000 - -2025-09-14T19:37:54.930Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:37:54.940Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:37:54.940Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:37:55.356Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T19:37:55.373Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:37:55.374Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:37:55.380Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:39:02.452Z | [STARTUP] | Received SIGINT. Shutting down gracefully... -2025-09-14T19:39:02.453Z | [STARTUP] | HTTP server closed -2025-09-14T19:39:02.454Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-48-947Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-48-947Z.log deleted file mode 100644 index f9fa4e7a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-37-48-947Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:37:48.947Z -# Max entries per file: 10000 - -2025-09-14T19:37:54.942Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:37:54.959Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-18-891Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-18-891Z.log deleted file mode 100644 index a0946fa2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-18-891Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:39:18.891Z -# Max entries per file: 10000 - -2025-09-14T19:39:24.194Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:39:24.210Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-19-312Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-19-312Z.log deleted file mode 100644 index c384b369..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-19-312Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:39:19.312Z -# Max entries per file: 10000 - -2025-09-14T19:39:26.428Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:39:26.440Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:39:26.440Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:39:27.891Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:39:27.913Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:39:27.914Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:39:27.919Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-36-793Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-36-793Z.log deleted file mode 100644 index 209638cc..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-39-36-793Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:39:36.793Z -# Max entries per file: 10000 - -2025-09-14T19:39:41.380Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:39:41.388Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:39:41.388Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:39:41.765Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T19:39:41.780Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:39:41.781Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:39:41.787Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:39:48.418Z | [REQUEST] | Incoming request | ReqId:1hgroipe4 | IP:::1 | GET /api-docs?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757878788411 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:39:48.420Z | [REQUEST] | Request completed | ReqId:1hgroipe4 | IP:::1 | GET /api-docs?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757878788411 | Status:301 | Time:2ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:39:48.426Z | [REQUEST] | Incoming request | ReqId:btkm4sg8l | IP:::1 | GET /api-docs/?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757878788411 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:39:48.427Z | [REQUEST] | Request completed | ReqId:btkm4sg8l | IP:::1 | GET /api-docs/?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757878788411 | Status:200 | Time:1ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:39:52.847Z | [REQUEST] | Incoming request | ReqId:37e5xhtd2 | IP:::1 | GET /?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757878792844 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:39:52.848Z | [REQUEST] | Request completed | ReqId:37e5xhtd2 | IP:::1 | GET /?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757878792844 | Status:200 | Time:1ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-01-700Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-01-700Z.log deleted file mode 100644 index 6218cbc6..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-01-700Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:40:01.700Z -# Max entries per file: 10000 - -2025-09-14T19:40:07.768Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:40:07.784Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-02-248Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-02-248Z.log deleted file mode 100644 index 65c6cb98..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-02-248Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:40:02.248Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-03-219Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-03-219Z.log deleted file mode 100644 index 6686764e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-03-219Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:40:03.219Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-09-601Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-09-601Z.log deleted file mode 100644 index e586cd4c..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-09-601Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:40:09.601Z -# Max entries per file: 10000 - -2025-09-14T19:40:17.332Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:40:17.342Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:40:17.342Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:40:18.750Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:40:18.770Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:40:18.772Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:40:18.776Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-11-053Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-11-053Z.log deleted file mode 100644 index 92493eed..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-11-053Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:40:11.053Z -# Max entries per file: 10000 - -2025-09-14T19:40:16.718Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:40:16.735Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-11-179Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-11-179Z.log deleted file mode 100644 index a5338d63..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-40-11-179Z.log +++ /dev/null @@ -1,13 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:40:11.179Z -# Max entries per file: 10000 - -2025-09-14T19:40:16.831Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:40:16.841Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:40:16.841Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:40:17.228Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T19:40:17.245Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:40:17.245Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:40:17.250Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:40:26.170Z | [STARTUP] | Received SIGINT. Shutting down gracefully... -2025-09-14T19:40:26.171Z | [STARTUP] | HTTP server closed -2025-09-14T19:40:26.173Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-41-36-857Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-41-36-857Z.log deleted file mode 100644 index 90e7ce29..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-41-36-857Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:41:36.857Z -# Max entries per file: 10000 - -2025-09-14T19:41:43.272Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:41:43.282Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:41:43.282Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:41:44.665Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:41:44.686Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:41:44.688Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:41:44.690Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:48:38.950Z | [REQUEST] | Incoming request | ReqId:myhi4uo4t | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.952Z | [REQUEST] | GET /api-docs/ | ReqId:myhi4uo4t | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.956Z | [REQUEST] | Request completed | ReqId:myhi4uo4t | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.970Z | [REQUEST] | Incoming request | ReqId:0pgu57zsi | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.972Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:0pgu57zsi | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.975Z | [REQUEST] | Request completed | ReqId:0pgu57zsi | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.977Z | [REQUEST] | Incoming request | ReqId:ee2btiljk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.978Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:ee2btiljk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.980Z | [REQUEST] | Request completed | ReqId:ee2btiljk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.982Z | [REQUEST] | Incoming request | ReqId:z1kr03fdf | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.984Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:z1kr03fdf | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.986Z | [REQUEST] | Request completed | ReqId:z1kr03fdf | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.988Z | [REQUEST] | Incoming request | ReqId:mh5mkf7ga | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.989Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:mh5mkf7ga | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:48:38.991Z | [REQUEST] | Request completed | ReqId:mh5mkf7ga | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-41-37-744Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-41-37-744Z.log deleted file mode 100644 index 3ea61936..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-41-37-744Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:41:37.744Z -# Max entries per file: 10000 - -2025-09-14T19:41:42.344Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:41:42.360Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-50-53-106Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-50-53-106Z.log deleted file mode 100644 index fff39a19..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-50-53-106Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:50:53.106Z -# Max entries per file: 10000 - -2025-09-14T19:50:58.355Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:50:58.370Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-50-54-167Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-50-54-167Z.log deleted file mode 100644 index 818342e5..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-50-54-167Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:50:54.167Z -# Max entries per file: 10000 - -2025-09-14T19:51:01.518Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:51:01.530Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:51:01.530Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:51:03.004Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:51:03.027Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:51:03.029Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:51:03.031Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-28-025Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-28-025Z.log deleted file mode 100644 index 05045b8c..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-28-025Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:51:28.025Z -# Max entries per file: 10000 - -2025-09-14T19:51:33.189Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:51:33.201Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-28-672Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-28-672Z.log deleted file mode 100644 index 83c43786..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-28-672Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:51:28.672Z -# Max entries per file: 10000 - -2025-09-14T19:51:35.449Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:51:35.459Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:51:35.459Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:51:36.922Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:51:36.943Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:51:36.946Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:51:36.950Z | [REQUEST] | Incoming request | ReqId:3lihqtdzl | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.952Z | [REQUEST] | GET /api-docs/ | ReqId:3lihqtdzl | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.956Z | [REQUEST] | Request completed | ReqId:3lihqtdzl | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.963Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:51:36.974Z | [REQUEST] | Incoming request | ReqId:21npbeg4l | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.977Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:21npbeg4l | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.980Z | [REQUEST] | Request completed | ReqId:21npbeg4l | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.982Z | [REQUEST] | Incoming request | ReqId:6jxci6n95 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.984Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:6jxci6n95 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.987Z | [REQUEST] | Request completed | ReqId:6jxci6n95 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.989Z | [REQUEST] | Incoming request | ReqId:29kaglz53 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.991Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:29kaglz53 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.993Z | [REQUEST] | Request completed | ReqId:29kaglz53 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.996Z | [REQUEST] | Incoming request | ReqId:su6wy0x4z | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:36.998Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:su6wy0x4z | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:51:37.001Z | [REQUEST] | Request completed | ReqId:su6wy0x4z | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-59-846Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-59-846Z.log deleted file mode 100644 index 0d4a0793..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-51-59-846Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:51:59.846Z -# Max entries per file: 10000 - -2025-09-14T19:52:05.713Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:52:05.729Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-52-00-530Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-52-00-530Z.log deleted file mode 100644 index e6dd0474..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-52-00-530Z.log +++ /dev/null @@ -1,70 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:52:00.530Z -# Max entries per file: 10000 - -2025-09-14T19:52:08.107Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:52:08.123Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:52:08.122Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:52:09.707Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:52:09.732Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:52:09.734Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:52:09.737Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:52:09.743Z | [REQUEST] | Incoming request | ReqId:xblab1m4b | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.745Z | [REQUEST] | GET /api-docs/ | ReqId:xblab1m4b | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.750Z | [REQUEST] | Request completed | ReqId:xblab1m4b | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.765Z | [REQUEST] | Incoming request | ReqId:2f5zww6ej | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.768Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:2f5zww6ej | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.771Z | [REQUEST] | Request completed | ReqId:2f5zww6ej | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.774Z | [REQUEST] | Incoming request | ReqId:y2ewanme8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.777Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:y2ewanme8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.779Z | [REQUEST] | Request completed | ReqId:y2ewanme8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.783Z | [REQUEST] | Incoming request | ReqId:uqp4qjj7q | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.785Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:uqp4qjj7q | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.788Z | [REQUEST] | Request completed | ReqId:uqp4qjj7q | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.791Z | [REQUEST] | Incoming request | ReqId:2dzf4n56g | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.793Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:2dzf4n56g | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:09.797Z | [REQUEST] | Request completed | ReqId:2dzf4n56g | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.669Z | [REQUEST] | Incoming request | ReqId:3x978ob6y | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.671Z | [REQUEST] | GET /api-docs/ | ReqId:3x978ob6y | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.673Z | [REQUEST] | Request completed | ReqId:3x978ob6y | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.684Z | [REQUEST] | Incoming request | ReqId:o8aezb5hh | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.686Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:o8aezb5hh | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.689Z | [REQUEST] | Request completed | ReqId:o8aezb5hh | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.691Z | [REQUEST] | Incoming request | ReqId:wzfo6i6tm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.693Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:wzfo6i6tm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.695Z | [REQUEST] | Request completed | ReqId:wzfo6i6tm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.697Z | [REQUEST] | Incoming request | ReqId:g7gi3kzu3 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.699Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:g7gi3kzu3 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.702Z | [REQUEST] | Request completed | ReqId:g7gi3kzu3 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.706Z | [REQUEST] | Incoming request | ReqId:6i04zrypc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.708Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:6i04zrypc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:23.709Z | [REQUEST] | Request completed | ReqId:6i04zrypc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.220Z | [REQUEST] | Incoming request | ReqId:euixru5in | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.222Z | [REQUEST] | GET /api-docs/ | ReqId:euixru5in | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.224Z | [REQUEST] | Request completed | ReqId:euixru5in | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.235Z | [REQUEST] | Incoming request | ReqId:xo8c32efn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.237Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:xo8c32efn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.240Z | [REQUEST] | Incoming request | ReqId:wblxyid7w | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.241Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:wblxyid7w | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.243Z | [REQUEST] | Incoming request | ReqId:b78198q08 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.245Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:b78198q08 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.248Z | [REQUEST] | Incoming request | ReqId:2oom9qei9 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.250Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:2oom9qei9 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.251Z | [REQUEST] | Request completed | ReqId:2oom9qei9 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.253Z | [REQUEST] | Request completed | ReqId:xo8c32efn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:18ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.255Z | [REQUEST] | Request completed | ReqId:wblxyid7w | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:15ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.258Z | [REQUEST] | Request completed | ReqId:b78198q08 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:15ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.415Z | [REQUEST] | Incoming request | ReqId:ch3fux52a | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.418Z | [REQUEST] | GET /api-docs/ | ReqId:ch3fux52a | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.434Z | [REQUEST] | Request completed | ReqId:ch3fux52a | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:19ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.445Z | [REQUEST] | Incoming request | ReqId:q9e0hnwxo | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.447Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:q9e0hnwxo | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.449Z | [REQUEST] | Incoming request | ReqId:ab06uc7dn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.451Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:ab06uc7dn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.453Z | [REQUEST] | Incoming request | ReqId:v0kdcpmlr | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.455Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:v0kdcpmlr | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.457Z | [REQUEST] | Incoming request | ReqId:y7u3oubro | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.459Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:y7u3oubro | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.460Z | [REQUEST] | Request completed | ReqId:y7u3oubro | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.462Z | [REQUEST] | Request completed | ReqId:q9e0hnwxo | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:17ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.465Z | [REQUEST] | Request completed | ReqId:ab06uc7dn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:16ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:52:24.467Z | [REQUEST] | Request completed | ReqId:v0kdcpmlr | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:14ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-12-706Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-12-706Z.log deleted file mode 100644 index 33a0ebf3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-12-706Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:12.706Z -# Max entries per file: 10000 - -2025-09-14T19:55:18.053Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:55:18.068Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-13-224Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-13-224Z.log deleted file mode 100644 index ccef5435..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-13-224Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:13.224Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-20-859Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-20-859Z.log deleted file mode 100644 index 6a10da24..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-20-859Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:20.859Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-21-256Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-21-256Z.log deleted file mode 100644 index 9cf6ce24..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-21-256Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:21.256Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-26-756Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-26-756Z.log deleted file mode 100644 index 1219f420..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-26-756Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:26.756Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-27-530Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-27-530Z.log deleted file mode 100644 index f8da676b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-27-530Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:27.530Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-34-308Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-34-308Z.log deleted file mode 100644 index c69d75ed..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-34-308Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:34.308Z -# Max entries per file: 10000 - -2025-09-14T19:55:41.033Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:55:41.045Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:55:41.045Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:55:42.437Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:55:42.460Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:55:42.462Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:55:42.464Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-35-273Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-35-273Z.log deleted file mode 100644 index b6146484..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-35-273Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:35.273Z -# Max entries per file: 10000 - -2025-09-14T19:55:40.119Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:55:40.132Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-46-899Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-46-899Z.log deleted file mode 100644 index 98812978..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-55-46-899Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:55:46.899Z -# Max entries per file: 10000 - -2025-09-14T19:55:51.808Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:55:51.818Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:55:51.818Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:55:52.208Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T19:55:52.226Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:55:52.226Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:55:52.236Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-22-131Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-22-131Z.log deleted file mode 100644 index 2cb209ac..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-22-131Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:22.131Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-22-663Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-22-663Z.log deleted file mode 100644 index 352181cb..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-22-663Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:22.663Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-23-727Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-23-727Z.log deleted file mode 100644 index 922fc7f7..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-23-727Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:23.727Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-28-658Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-28-658Z.log deleted file mode 100644 index 8329300d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-28-658Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:28.658Z -# Max entries per file: 10000 - -2025-09-14T19:56:36.291Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:56:36.303Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:56:36.303Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:56:37.750Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:56:37.776Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:56:37.777Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:56:37.779Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-30-047Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-30-047Z.log deleted file mode 100644 index 27d8f5d6..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-30-047Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:30.047Z -# Max entries per file: 10000 - -2025-09-14T19:56:35.724Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:56:35.740Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-30-264Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-30-264Z.log deleted file mode 100644 index e3577c93..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-30-264Z.log +++ /dev/null @@ -1,8 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:30.264Z -# Max entries per file: 10000 - -2025-09-14T19:56:35.940Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:56:35.949Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:56:35.949Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:56:35.955Z | [STARTUP] | Received SIGINT. Shutting down gracefully... -2025-09-14T19:56:35.956Z | [STARTUP] | HTTP server closed diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-50-987Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-50-987Z.log deleted file mode 100644 index eb164ff8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-50-987Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:50.987Z -# Max entries per file: 10000 - -2025-09-14T19:56:56.338Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:56:56.350Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-51-714Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-51-714Z.log deleted file mode 100644 index 5c487d80..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-56-51-714Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:56:51.714Z -# Max entries per file: 10000 - -2025-09-14T19:56:58.570Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:56:58.586Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:56:58.586Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:57:00.050Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:57:00.075Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:57:00.077Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:57:00.084Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-22-310Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-22-310Z.log deleted file mode 100644 index b24c5c03..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-22-310Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:57:22.310Z -# Max entries per file: 10000 - -2025-09-14T19:57:29.394Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:57:29.405Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:57:29.405Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:57:30.897Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:57:30.929Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:57:30.931Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:57:30.934Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-23-216Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-23-216Z.log deleted file mode 100644 index 46acfef6..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-23-216Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:57:23.216Z -# Max entries per file: 10000 - -2025-09-14T19:57:28.407Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:57:28.421Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-34-124Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-34-124Z.log deleted file mode 100644 index 57dc327b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-34-124Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:57:34.124Z -# Max entries per file: 10000 - -2025-09-14T19:57:39.760Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:57:39.777Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-34-793Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-34-793Z.log deleted file mode 100644 index 5293787a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-34-793Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:57:34.793Z -# Max entries per file: 10000 - -2025-09-14T19:57:42.264Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T19:57:42.278Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T19:57:42.278Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:57:43.916Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T19:57:43.942Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:57:43.944Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:57:43.952Z | [REQUEST] | Incoming request | ReqId:0me8zlf48 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.954Z | [REQUEST] | GET /api-docs/ | ReqId:0me8zlf48 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.962Z | [REQUEST] | Request completed | ReqId:0me8zlf48 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.966Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:57:43.976Z | [REQUEST] | Incoming request | ReqId:sq278yirw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.978Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:sq278yirw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.982Z | [REQUEST] | Request completed | ReqId:sq278yirw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.985Z | [REQUEST] | Incoming request | ReqId:fqkahr9at | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.986Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:fqkahr9at | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.989Z | [REQUEST] | Request completed | ReqId:fqkahr9at | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.993Z | [REQUEST] | Incoming request | ReqId:utojci4dv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:43.998Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:utojci4dv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:44.002Z | [REQUEST] | Request completed | ReqId:utojci4dv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:44.006Z | [REQUEST] | Incoming request | ReqId:grl6mvhv4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:44.009Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:grl6mvhv4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T19:57:44.011Z | [REQUEST] | Request completed | ReqId:grl6mvhv4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-46-327Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-46-327Z.log deleted file mode 100644 index 0f52b639..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T19-57-46-327Z.log +++ /dev/null @@ -1,14 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T19:57:46.327Z -# Max entries per file: 10000 - -2025-09-14T19:57:51.157Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T19:57:51.166Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T19:57:51.166Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T19:57:51.571Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T19:57:51.589Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T19:57:51.590Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T19:57:51.596Z | [STARTUP] | Redis client connected successfully -2025-09-14T19:58:02.604Z | [REQUEST] | Incoming request | ReqId:khxdq2w4r | IP:::1 | GET /api-docs?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757879882599 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:58:02.606Z | [REQUEST] | Request completed | ReqId:khxdq2w4r | IP:::1 | GET /api-docs?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757879882599 | Status:301 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:58:02.610Z | [REQUEST] | Incoming request | ReqId:063om7yyi | IP:::1 | GET /api-docs/?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757879882599 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb -2025-09-14T19:58:02.612Z | [REQUEST] | Request completed | ReqId:063om7yyi | IP:::1 | GET /api-docs/?id=71580eb7-92cd-4e84-8d20-de8a86ab1458&vscodeBrowserReqId=1757879882599 | Status:200 | Time:2ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWeb diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-38-171Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-38-171Z.log deleted file mode 100644 index 3c1c82a1..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-38-171Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:02:38.171Z -# Max entries per file: 10000 - -2025-09-14T20:02:44.163Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:02:44.177Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-38-740Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-38-740Z.log deleted file mode 100644 index 64e79e26..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-38-740Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:02:38.740Z -# Max entries per file: 10000 - -2025-09-14T20:02:46.546Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:02:46.558Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:02:46.558Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:02:48.059Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:02:48.082Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:02:48.084Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:02:48.086Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-39-778Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-39-778Z.log deleted file mode 100644 index 6729c6ff..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-02-39-778Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:02:39.778Z -# Max entries per file: 10000 - -2025-09-14T20:02:45.618Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:02:45.627Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T20:02:45.627Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:02:46.043Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T20:02:46.059Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:02:46.059Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:02:46.065Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-24-544Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-24-544Z.log deleted file mode 100644 index e459927f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-24-544Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:03:24.544Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-26-103Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-26-103Z.log deleted file mode 100644 index 61acd9a9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-26-103Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:03:26.103Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-26-308Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-26-308Z.log deleted file mode 100644 index bbc43d04..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-26-308Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:03:26.308Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-36-394Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-36-394Z.log deleted file mode 100644 index 984737e0..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-36-394Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:03:36.394Z -# Max entries per file: 10000 - -2025-09-14T20:03:44.301Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:03:44.314Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:03:44.314Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:03:45.750Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:03:45.773Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:03:45.775Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:03:45.777Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-37-940Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-37-940Z.log deleted file mode 100644 index fe43f6ba..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-37-940Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:03:37.940Z -# Max entries per file: 10000 - -2025-09-14T20:03:43.872Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3001","nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:03:43.881Z | [STARTUP] | Server started successfully | Meta:{"port":"3001","environment":"development","timestamp":"2025-09-14T20:03:43.881Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:03:44.307Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"localhost","database":"serpentrace"} -2025-09-14T20:03:44.325Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:03:44.326Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:03:44.333Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-37-988Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-37-988Z.log deleted file mode 100644 index 299ca0bd..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-03-37-988Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:03:37.988Z -# Max entries per file: 10000 - -2025-09-14T20:03:43.936Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:03:43.949Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-06-995Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-06-995Z.log deleted file mode 100644 index 7059eb3d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-06-995Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:04:06.995Z -# Max entries per file: 10000 - -2025-09-14T20:04:12.310Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:04:12.323Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-07-608Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-07-608Z.log deleted file mode 100644 index 2cd90562..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-07-608Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:04:07.608Z -# Max entries per file: 10000 - -2025-09-14T20:04:14.471Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:04:14.483Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:04:14.483Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:04:15.932Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:04:15.958Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:04:15.960Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:04:15.962Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-34-581Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-34-581Z.log deleted file mode 100644 index f6f185d2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-34-581Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:04:34.581Z -# Max entries per file: 10000 - -2025-09-14T20:04:39.469Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:04:39.482Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-35-057Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-35-057Z.log deleted file mode 100644 index adb2035b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-04-35-057Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:04:35.057Z -# Max entries per file: 10000 - -2025-09-14T20:04:41.474Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:04:41.485Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:04:41.485Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:04:42.847Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:04:42.872Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:04:42.874Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:04:42.876Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:04:46.110Z | [REQUEST] | Incoming request | ReqId:1yyn1q5t6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.112Z | [REQUEST] | GET /api-docs/ | ReqId:1yyn1q5t6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.116Z | [REQUEST] | Request completed | ReqId:1yyn1q5t6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.134Z | [REQUEST] | Incoming request | ReqId:ksodbmdxj | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.136Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:ksodbmdxj | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.139Z | [REQUEST] | Request completed | ReqId:ksodbmdxj | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.141Z | [REQUEST] | Incoming request | ReqId:q5z3qqwtn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.142Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:q5z3qqwtn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.145Z | [REQUEST] | Request completed | ReqId:q5z3qqwtn | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.147Z | [REQUEST] | Incoming request | ReqId:wa3dtpx9u | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.149Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:wa3dtpx9u | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.153Z | [REQUEST] | Request completed | ReqId:wa3dtpx9u | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.156Z | [REQUEST] | Incoming request | ReqId:hpp8km4ph | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.158Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:hpp8km4ph | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:04:46.160Z | [REQUEST] | Request completed | ReqId:hpp8km4ph | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-53-162Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-53-162Z.log deleted file mode 100644 index 498ed1c3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-53-162Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:05:53.162Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-53-638Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-53-638Z.log deleted file mode 100644 index 65d817bc..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-53-638Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:05:53.638Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-59-981Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-59-981Z.log deleted file mode 100644 index 7c60bb1a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-05-59-981Z.log +++ /dev/null @@ -1,91 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:05:59.981Z -# Max entries per file: 10000 - -2025-09-14T20:06:06.865Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:06:06.878Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:06:06.878Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:06:08.423Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:06:08.457Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:06:08.459Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:06:08.465Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:06:25.226Z | [REQUEST] | Incoming request | ReqId:am94kk6mw | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.228Z | [REQUEST] | GET /api-docs/ | ReqId:am94kk6mw | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.233Z | [REQUEST] | Request completed | ReqId:am94kk6mw | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.245Z | [REQUEST] | Incoming request | ReqId:ym563icb4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.247Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:ym563icb4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.250Z | [REQUEST] | Request completed | ReqId:ym563icb4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.252Z | [REQUEST] | Incoming request | ReqId:ry1k9aw66 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.254Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:ry1k9aw66 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.256Z | [REQUEST] | Request completed | ReqId:ry1k9aw66 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.258Z | [REQUEST] | Incoming request | ReqId:g0svs24ty | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.260Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:g0svs24ty | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.263Z | [REQUEST] | Request completed | ReqId:g0svs24ty | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.266Z | [REQUEST] | Incoming request | ReqId:v5g6qkrjt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.268Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:v5g6qkrjt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:25.282Z | [REQUEST] | Request completed | ReqId:v5g6qkrjt | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:16ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.495Z | [REQUEST] | Incoming request | ReqId:u20sx1lyq | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.498Z | [REQUEST] | GET /api-docs/ | ReqId:u20sx1lyq | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.500Z | [REQUEST] | Request completed | ReqId:u20sx1lyq | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.511Z | [REQUEST] | Incoming request | ReqId:uf1mmdj9r | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.513Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:uf1mmdj9r | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.516Z | [REQUEST] | Incoming request | ReqId:jtr47plur | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.517Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:jtr47plur | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.520Z | [REQUEST] | Incoming request | ReqId:q337vnr8t | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.521Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:q337vnr8t | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.523Z | [REQUEST] | Incoming request | ReqId:alliw3ju5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.525Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:alliw3ju5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.526Z | [REQUEST] | Request completed | ReqId:alliw3ju5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.528Z | [REQUEST] | Request completed | ReqId:uf1mmdj9r | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:17ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.530Z | [REQUEST] | Request completed | ReqId:jtr47plur | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:14ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.532Z | [REQUEST] | Request completed | ReqId:q337vnr8t | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:13ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.838Z | [REQUEST] | Incoming request | ReqId:rzbm2n2d6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.840Z | [REQUEST] | GET /api-docs/ | ReqId:rzbm2n2d6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.842Z | [REQUEST] | Request completed | ReqId:rzbm2n2d6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.854Z | [REQUEST] | Incoming request | ReqId:x417iclxa | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.856Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:x417iclxa | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.858Z | [REQUEST] | Incoming request | ReqId:a10yltzew | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.860Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:a10yltzew | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.862Z | [REQUEST] | Incoming request | ReqId:53hgiewt7 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.864Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:53hgiewt7 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.866Z | [REQUEST] | Incoming request | ReqId:v4dvuj5ec | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.867Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:v4dvuj5ec | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.869Z | [REQUEST] | Request completed | ReqId:v4dvuj5ec | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.872Z | [REQUEST] | Request completed | ReqId:x417iclxa | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:18ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.874Z | [REQUEST] | Request completed | ReqId:a10yltzew | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:16ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:26.876Z | [REQUEST] | Request completed | ReqId:53hgiewt7 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:14ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.969Z | [REQUEST] | Incoming request | ReqId:5b9tk7htx | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.971Z | [REQUEST] | GET /api-docs/ | ReqId:5b9tk7htx | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.974Z | [REQUEST] | Request completed | ReqId:5b9tk7htx | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.988Z | [REQUEST] | Incoming request | ReqId:ciuyk74zw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.990Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:ciuyk74zw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.992Z | [REQUEST] | Incoming request | ReqId:7su3rk26l | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.994Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:7su3rk26l | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.995Z | [REQUEST] | Request completed | ReqId:7su3rk26l | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.997Z | [REQUEST] | Incoming request | ReqId:fc9jgpgy0 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:28.999Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:fc9jgpgy0 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:29.001Z | [REQUEST] | Incoming request | ReqId:hpjzyp6q4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:29.002Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:hpjzyp6q4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:29.004Z | [REQUEST] | Request completed | ReqId:ciuyk74zw | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:16ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:29.006Z | [REQUEST] | Request completed | ReqId:fc9jgpgy0 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:29.008Z | [REQUEST] | Request completed | ReqId:hpjzyp6q4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.296Z | [REQUEST] | Incoming request | ReqId:b0fy5z668 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.298Z | [REQUEST] | GET /api-docs/ | ReqId:b0fy5z668 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.300Z | [REQUEST] | Request completed | ReqId:b0fy5z668 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.311Z | [REQUEST] | Incoming request | ReqId:iqxhi9r4z | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.313Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:iqxhi9r4z | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.319Z | [REQUEST] | Incoming request | ReqId:klimkepb2 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.320Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:klimkepb2 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.323Z | [REQUEST] | Incoming request | ReqId:5e6xamgv6 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.324Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:5e6xamgv6 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.327Z | [REQUEST] | Incoming request | ReqId:u00i5vmjk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.328Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:u00i5vmjk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.330Z | [REQUEST] | Request completed | ReqId:u00i5vmjk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.332Z | [REQUEST] | Request completed | ReqId:iqxhi9r4z | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | Time:21ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.337Z | [REQUEST] | Request completed | ReqId:5e6xamgv6 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | Time:14ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.344Z | [REQUEST] | Request completed | ReqId:klimkepb2 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | Time:25ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.447Z | [REQUEST] | Incoming request | ReqId:njo7qe6h2 | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.449Z | [REQUEST] | GET /api-docs/favicon-16x16.png | ReqId:njo7qe6h2 | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:31.452Z | [REQUEST] | Request completed | ReqId:njo7qe6h2 | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:06:38.747Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-09-14T20:06:38.749Z | [STARTUP] | HTTP server closed -2025-09-14T20:06:38.750Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-06-01-139Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-06-01-139Z.log deleted file mode 100644 index e30b328d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-06-01-139Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:06:01.139Z -# Max entries per file: 10000 - -2025-09-14T20:06:05.936Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:06:05.951Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-07-02-912Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-07-02-912Z.log deleted file mode 100644 index 3844d87a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-07-02-912Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:07:02.912Z -# Max entries per file: 10000 - -2025-09-14T20:07:09.099Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:07:09.117Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:07:09.116Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:07:09.517Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:07:09.538Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:07:09.540Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:07:09.549Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:07:11.349Z | [REQUEST] | Incoming request | ReqId:cryjoxei6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.351Z | [REQUEST] | GET /api-docs/ | ReqId:cryjoxei6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.355Z | [REQUEST] | Request completed | ReqId:cryjoxei6 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.373Z | [REQUEST] | Incoming request | ReqId:jinfpn5ty | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.375Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:jinfpn5ty | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.378Z | [REQUEST] | Request completed | ReqId:jinfpn5ty | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.381Z | [REQUEST] | Incoming request | ReqId:b9k3wztje | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.382Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:b9k3wztje | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.384Z | [REQUEST] | Request completed | ReqId:b9k3wztje | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.386Z | [REQUEST] | Incoming request | ReqId:ijjrg0hv4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.388Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:ijjrg0hv4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.390Z | [REQUEST] | Request completed | ReqId:ijjrg0hv4 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.394Z | [REQUEST] | Incoming request | ReqId:a87yylovk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.396Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:a87yylovk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:07:11.398Z | [REQUEST] | Request completed | ReqId:a87yylovk | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-00-227Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-00-227Z.log deleted file mode 100644 index eb31e65a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-00-227Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:08:00.227Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-00-798Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-00-798Z.log deleted file mode 100644 index a2d4b6af..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-00-798Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:08:00.798Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-07-227Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-07-227Z.log deleted file mode 100644 index d7962a1e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-07-227Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:08:07.227Z -# Max entries per file: 10000 - -2025-09-14T20:08:14.471Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:08:14.483Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:08:14.483Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:08:14.869Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:08:14.901Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:08:14.903Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:08:14.912Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-07-983Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-07-983Z.log deleted file mode 100644 index 8d1222e9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-08-07-983Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:08:07.983Z -# Max entries per file: 10000 - -2025-09-14T20:08:13.360Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:08:13.377Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-39-137Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-39-137Z.log deleted file mode 100644 index 5cb6b130..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-39-137Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:09:39.137Z -# Max entries per file: 10000 - -2025-09-14T20:09:45.937Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:09:45.950Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:09:45.950Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:09:46.340Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:09:46.372Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:09:46.374Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:09:46.384Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-39-957Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-39-957Z.log deleted file mode 100644 index 34e8065d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-39-957Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:09:39.957Z -# Max entries per file: 10000 - -2025-09-14T20:09:45.006Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:09:45.018Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-48-920Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-48-920Z.log deleted file mode 100644 index 449d4d33..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-48-920Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:09:48.920Z -# Max entries per file: 10000 - -2025-09-14T20:09:54.298Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:09:54.312Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-49-547Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-49-547Z.log deleted file mode 100644 index 044113c8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-49-547Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:09:49.547Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-58-049Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-58-049Z.log deleted file mode 100644 index ff3607f3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-58-049Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:09:58.049Z -# Max entries per file: 10000 - -2025-09-14T20:10:03.082Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:10:03.096Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-58-619Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-58-619Z.log deleted file mode 100644 index c3c75803..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-09-58-619Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:09:58.619Z -# Max entries per file: 10000 - -2025-09-14T20:10:05.346Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:10:05.358Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:10:05.358Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:10:05.779Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:10:05.802Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:10:05.804Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:10:05.823Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:10:49.221Z | [REQUEST] | Incoming request | ReqId:cymen6mtp | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.224Z | [REQUEST] | GET /api-docs/ | ReqId:cymen6mtp | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.228Z | [REQUEST] | Request completed | ReqId:cymen6mtp | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.250Z | [REQUEST] | Incoming request | ReqId:77bal0bui | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.253Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:77bal0bui | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.257Z | [REQUEST] | Request completed | ReqId:77bal0bui | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.260Z | [REQUEST] | Incoming request | ReqId:2u3nxw1vs | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.262Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:2u3nxw1vs | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.265Z | [REQUEST] | Request completed | ReqId:2u3nxw1vs | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.269Z | [REQUEST] | Incoming request | ReqId:brdg5c91e | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.272Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:brdg5c91e | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.275Z | [REQUEST] | Request completed | ReqId:brdg5c91e | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.278Z | [REQUEST] | Incoming request | ReqId:3unaqja0j | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.280Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:3unaqja0j | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:10:49.282Z | [REQUEST] | Request completed | ReqId:3unaqja0j | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-10-47-240Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-10-47-240Z.log deleted file mode 100644 index 36806c8f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-10-47-240Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:10:47.240Z -# Max entries per file: 10000 - -2025-09-14T20:10:52.507Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:10:52.520Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-11-03-972Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-11-03-972Z.log deleted file mode 100644 index 79dea904..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-11-03-972Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:11:03.972Z -# Max entries per file: 10000 - -2025-09-14T20:11:10.326Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:11:10.338Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:11:10.338Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:11:10.727Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:11:10.750Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:11:10.752Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:11:10.773Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-11-55-344Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-11-55-344Z.log deleted file mode 100644 index 70e91025..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-11-55-344Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:11:55.344Z -# Max entries per file: 10000 - -2025-09-14T20:12:01.808Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:12:01.821Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:12:01.821Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:12:02.222Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:12:02.245Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:12:02.247Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:12:02.269Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-05-216Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-05-216Z.log deleted file mode 100644 index 9605a65a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-05-216Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:12:05.216Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-10-978Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-10-978Z.log deleted file mode 100644 index a17c569f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-10-978Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:12:10.978Z -# Max entries per file: 10000 - -2025-09-14T20:12:17.617Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:12:17.632Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:12:17.632Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:12:18.063Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:12:18.104Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:12:18.108Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:12:18.118Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-22-724Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-22-724Z.log deleted file mode 100644 index d57c44ee..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-22-724Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:12:22.724Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-27-642Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-27-642Z.log deleted file mode 100644 index 26a28f95..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-27-642Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:12:27.642Z -# Max entries per file: 10000 - -2025-09-14T20:12:33.901Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:12:33.912Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:12:33.912Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:12:34.292Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:12:34.325Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:12:34.327Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:12:34.335Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-40-587Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-40-587Z.log deleted file mode 100644 index 4be18a53..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-12-40-587Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:12:40.587Z -# Max entries per file: 10000 - -2025-09-14T20:12:46.791Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:12:46.802Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:12:46.802Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:12:47.170Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:12:47.192Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:12:47.193Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:12:47.210Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:12:47.233Z | [REQUEST] | Incoming request | ReqId:kkv72ie1q | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.235Z | [REQUEST] | GET /api-docs/ | ReqId:kkv72ie1q | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.240Z | [REQUEST] | Request completed | ReqId:kkv72ie1q | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.262Z | [REQUEST] | Incoming request | ReqId:8onq1yhwd | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.264Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:8onq1yhwd | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.267Z | [REQUEST] | Request completed | ReqId:8onq1yhwd | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.279Z | [REQUEST] | Incoming request | ReqId:lqy3wbx07 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.282Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:lqy3wbx07 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.284Z | [REQUEST] | Request completed | ReqId:lqy3wbx07 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.286Z | [REQUEST] | Incoming request | ReqId:tbk28cbpz | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.289Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:tbk28cbpz | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.291Z | [REQUEST] | Request completed | ReqId:tbk28cbpz | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.294Z | [REQUEST] | Incoming request | ReqId:y4hu9r8s8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.295Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:y4hu9r8s8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:12:47.297Z | [REQUEST] | Request completed | ReqId:y4hu9r8s8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-00-379Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-00-379Z.log deleted file mode 100644 index eb626f0e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-00-379Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:13:00.379Z -# Max entries per file: 10000 - -2025-09-14T20:13:06.910Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:13:06.922Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:13:06.922Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:13:07.333Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:13:07.362Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:13:07.364Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:13:07.386Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-15-653Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-15-653Z.log deleted file mode 100644 index 00617a93..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-15-653Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:13:15.653Z -# Max entries per file: 10000 - -2025-09-14T20:13:21.986Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:13:21.998Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:13:21.998Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:13:22.407Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:13:22.437Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:13:22.439Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:13:22.447Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:13:24.171Z | [REQUEST] | Incoming request | ReqId:cymkg9nvg | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.173Z | [REQUEST] | GET /api-docs/ | ReqId:cymkg9nvg | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.177Z | [REQUEST] | Request completed | ReqId:cymkg9nvg | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.191Z | [REQUEST] | Incoming request | ReqId:1w5odnf0k | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.193Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:1w5odnf0k | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.196Z | [REQUEST] | Request completed | ReqId:1w5odnf0k | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.199Z | [REQUEST] | Incoming request | ReqId:18hfakfg5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.200Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:18hfakfg5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.202Z | [REQUEST] | Request completed | ReqId:18hfakfg5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:3ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.204Z | [REQUEST] | Incoming request | ReqId:x9q7c26c6 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.206Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:x9q7c26c6 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.208Z | [REQUEST] | Request completed | ReqId:x9q7c26c6 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.213Z | [REQUEST] | Incoming request | ReqId:q43h8m5zl | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.215Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:q43h8m5zl | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:24.217Z | [REQUEST] | Request completed | ReqId:q43h8m5zl | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-43-268Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-43-268Z.log deleted file mode 100644 index 83cede0f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-13-43-268Z.log +++ /dev/null @@ -1,25 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:13:43.268Z -# Max entries per file: 10000 - -2025-09-14T20:13:49.367Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:13:49.378Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:13:49.378Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:13:49.773Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:13:49.795Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:13:49.797Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:13:49.800Z | [REQUEST] | Incoming request | ReqId:62wqvzyx9 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.802Z | [REQUEST] | GET /api-docs/ | ReqId:62wqvzyx9 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.807Z | [REQUEST] | Request completed | ReqId:62wqvzyx9 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.836Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:13:49.842Z | [REQUEST] | Incoming request | ReqId:byythpo6r | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.844Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:byythpo6r | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.847Z | [REQUEST] | Request completed | ReqId:byythpo6r | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.849Z | [REQUEST] | Incoming request | ReqId:2p7zzx3j5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.851Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:2p7zzx3j5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.853Z | [REQUEST] | Request completed | ReqId:2p7zzx3j5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.856Z | [REQUEST] | Incoming request | ReqId:0xpvjdlnf | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.858Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:0xpvjdlnf | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.860Z | [REQUEST] | Request completed | ReqId:0xpvjdlnf | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.863Z | [REQUEST] | Incoming request | ReqId:h5uden8u8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.865Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:h5uden8u8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:13:49.867Z | [REQUEST] | Request completed | ReqId:h5uden8u8 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-14-38-501Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-14-38-501Z.log deleted file mode 100644 index 61bd9a49..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-14-38-501Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:14:38.501Z -# Max entries per file: 10000 - -2025-09-14T20:14:44.798Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:14:44.811Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:14:44.811Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:14:45.190Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:14:45.222Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:14:45.224Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:14:45.232Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-15-32-215Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-15-32-215Z.log deleted file mode 100644 index 0561e0a9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-15-32-215Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:15:32.215Z -# Max entries per file: 10000 - -2025-09-14T20:15:38.507Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:15:38.519Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:15:38.519Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:15:38.889Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:15:38.920Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:15:38.922Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:15:38.930Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-15-44-576Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-15-44-576Z.log deleted file mode 100644 index c852f506..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-15-44-576Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:15:44.576Z -# Max entries per file: 10000 - -2025-09-14T20:15:50.873Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:15:50.886Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:15:50.886Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:15:51.279Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:15:51.311Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:15:51.313Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:15:51.322Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-00-949Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-00-949Z.log deleted file mode 100644 index 0cb2f9ed..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-00-949Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:16:00.949Z -# Max entries per file: 10000 - -2025-09-14T20:16:07.314Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:16:07.327Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:16:07.327Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:16:07.707Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:16:07.728Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:16:07.730Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:16:07.747Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-15-740Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-15-740Z.log deleted file mode 100644 index 03f8e2b3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-15-740Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:16:15.740Z -# Max entries per file: 10000 - -2025-09-14T20:16:22.160Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:16:22.173Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:16:22.173Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:16:22.555Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:16:22.588Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:16:22.590Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:16:22.599Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-28-104Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-28-104Z.log deleted file mode 100644 index fa692f0b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-28-104Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:16:28.104Z -# Max entries per file: 10000 - -2025-09-14T20:16:34.549Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:16:34.560Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:16:34.560Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:16:34.941Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:16:34.974Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:16:34.976Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:16:34.985Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-46-081Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-46-081Z.log deleted file mode 100644 index d671a95f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-16-46-081Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:16:46.081Z -# Max entries per file: 10000 - -2025-09-14T20:16:52.700Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:16:52.713Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:16:52.713Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:16:53.106Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:16:53.129Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:16:53.131Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:16:53.151Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-17-42-278Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-17-42-278Z.log deleted file mode 100644 index 15429b28..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-17-42-278Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:17:42.278Z -# Max entries per file: 10000 - -2025-09-14T20:17:48.580Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:17:48.592Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:17:48.592Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:17:49.004Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:17:49.027Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:17:49.029Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:17:49.047Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-04-287Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-04-287Z.log deleted file mode 100644 index aaf8e292..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-04-287Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:18:04.287Z -# Max entries per file: 10000 - -2025-09-14T20:18:10.588Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:18:10.601Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:18:10.601Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:18:10.997Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:18:11.020Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:18:11.022Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:18:11.043Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-25-348Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-25-348Z.log deleted file mode 100644 index 09fd39e1..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-25-348Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:18:25.348Z -# Max entries per file: 10000 - -2025-09-14T20:18:31.556Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:18:31.568Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:18:31.568Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:18:31.950Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:18:31.982Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:18:31.984Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:18:31.992Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-44-491Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-44-491Z.log deleted file mode 100644 index 7b05e8ee..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-18-44-491Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:18:44.491Z -# Max entries per file: 10000 - -2025-09-14T20:18:50.746Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:18:50.759Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:18:50.759Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:18:51.158Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:18:51.190Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:18:51.192Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:18:51.201Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-04-397Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-04-397Z.log deleted file mode 100644 index 25d8dac5..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-04-397Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:19:04.397Z -# Max entries per file: 10000 - -2025-09-14T20:19:10.741Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:19:10.754Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:19:10.754Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:19:11.136Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:19:11.167Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:19:11.168Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:19:11.177Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-36-569Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-36-569Z.log deleted file mode 100644 index bd5b4309..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-36-569Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:19:36.569Z -# Max entries per file: 10000 - -2025-09-14T20:19:42.965Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:19:42.977Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:19:42.977Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:19:43.342Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:19:43.373Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:19:43.375Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:19:43.383Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-57-030Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-57-030Z.log deleted file mode 100644 index eba68041..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-19-57-030Z.log +++ /dev/null @@ -1,88 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:19:57.030Z -# Max entries per file: 10000 - -2025-09-14T20:20:03.240Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-14T20:20:03.252Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-14T20:20:03.252Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-14T20:20:03.612Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-14T20:20:03.643Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-14T20:20:03.645Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-14T20:20:03.653Z | [STARTUP] | Redis client connected successfully -2025-09-14T20:24:43.086Z | [REQUEST] | Incoming request | ReqId:sff45gu0i | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.088Z | [REQUEST] | GET /api-docs/ | ReqId:sff45gu0i | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.092Z | [REQUEST] | Request completed | ReqId:sff45gu0i | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.107Z | [REQUEST] | Incoming request | ReqId:cy0j894z1 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.109Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:cy0j894z1 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.112Z | [REQUEST] | Request completed | ReqId:cy0j894z1 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:5ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.114Z | [REQUEST] | Incoming request | ReqId:id69vfyzc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.116Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:id69vfyzc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.118Z | [REQUEST] | Request completed | ReqId:id69vfyzc | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.120Z | [REQUEST] | Incoming request | ReqId:z0rbpuuec | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.121Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:z0rbpuuec | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.124Z | [REQUEST] | Request completed | ReqId:z0rbpuuec | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.126Z | [REQUEST] | Incoming request | ReqId:f4xi5iou9 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.128Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:f4xi5iou9 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T20:24:43.130Z | [REQUEST] | Request completed | ReqId:f4xi5iou9 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-14T21:20:03.585Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":31,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-14T20:50:03.554Z"} -2025-09-14T21:20:03.590Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":3,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-17T21:20:03.587Z"} -2025-09-14T21:20:03.595Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":4,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-14T21:20:03.597Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-17T21:20:03.587Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-14T22:20:03.472Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":9,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-14T21:50:03.463Z"} -2025-09-14T22:20:03.475Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":2,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-17T22:20:03.473Z"} -2025-09-14T22:20:03.477Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":1,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-14T22:20:03.479Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-17T22:20:03.473Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-14T23:20:03.380Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":10,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-14T22:50:03.370Z"} -2025-09-14T23:20:03.382Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-17T23:20:03.381Z"} -2025-09-14T23:20:03.385Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-14T23:20:03.386Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-17T23:20:03.381Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T00:20:03.299Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":8,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-14T23:50:03.291Z"} -2025-09-15T00:20:03.302Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T00:20:03.301Z"} -2025-09-15T00:20:03.305Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T00:20:03.306Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T00:20:03.301Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T01:20:03.222Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":8,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T00:50:03.214Z"} -2025-09-15T01:20:03.225Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T01:20:03.224Z"} -2025-09-15T01:20:03.228Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T01:20:03.229Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T01:20:03.224Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T02:20:03.144Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":8,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T01:50:03.136Z"} -2025-09-15T02:20:03.146Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T02:20:03.145Z"} -2025-09-15T02:20:03.149Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":1,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T02:20:03.150Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T02:20:03.145Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T03:20:02.030Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":7,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T02:50:02.023Z"} -2025-09-15T03:20:02.033Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T03:20:02.032Z"} -2025-09-15T03:20:02.036Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T03:20:02.037Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T03:20:02.032Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T04:20:01.931Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":8,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T03:50:01.923Z"} -2025-09-15T04:20:01.934Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T04:20:01.933Z"} -2025-09-15T04:20:01.937Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T04:20:01.938Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T04:20:01.933Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T05:20:01.854Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":8,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T04:50:01.846Z"} -2025-09-15T05:20:01.857Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T05:20:01.856Z"} -2025-09-15T05:20:01.860Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T05:20:01.861Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T05:20:01.856Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T06:20:01.787Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":10,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T05:50:01.777Z"} -2025-09-15T06:20:01.789Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T06:20:01.788Z"} -2025-09-15T06:20:01.792Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":1,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T06:20:01.794Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T06:20:01.788Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T07:20:01.722Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":21,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T06:50:01.701Z"} -2025-09-15T07:20:01.727Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":3,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T07:20:01.724Z"} -2025-09-15T07:20:01.731Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":3,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T07:20:01.733Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T07:20:01.724Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T08:20:01.625Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":12,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T07:50:01.613Z"} -2025-09-15T08:20:01.628Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T08:20:01.627Z"} -2025-09-15T08:20:01.631Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":1,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T08:20:01.633Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T08:20:01.627Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T09:20:01.533Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":10,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T08:50:01.523Z"} -2025-09-15T09:20:01.536Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":2,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T09:20:01.534Z"} -2025-09-15T09:20:01.539Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T09:20:01.540Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T09:20:01.534Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T10:20:01.470Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":30,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T09:50:01.440Z"} -2025-09-15T10:20:01.474Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":2,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T10:20:01.472Z"} -2025-09-15T10:20:01.479Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":3,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T10:20:01.481Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T10:20:01.472Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T11:20:01.381Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":8,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T10:50:01.373Z"} -2025-09-15T11:20:01.385Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":1,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T11:20:01.384Z"} -2025-09-15T11:20:01.388Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":2,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T11:20:01.389Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T11:20:01.383Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T11:45:18.409Z | [STARTUP] | Received SIGTERM. Shutting down gracefully... -2025-09-15T11:45:18.474Z | [STARTUP] | HTTP server closed -2025-09-15T11:45:18.813Z | [CONNECTION] | Database connection closed | Meta:{"connectionType":"postgresql","status":"success"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-23-38-787Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-23-38-787Z.log deleted file mode 100644 index 588cd354..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-14T20-23-38-787Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-14T20:23:38.787Z -# Max entries per file: 10000 - -2025-09-14T20:23:43.504Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":3000,"nodeVersion":"v22.9.0","chatInactivityTimeout":"30"} -2025-09-14T20:23:43.522Z | [ERROR] | Uncaught Exception - Server will shut down | Meta:{"name":"Error","message":"listen EADDRINUSE: address already in use :::3000","stack":"Error: listen EADDRINUSE: address already in use :::3000\n at Server.setupListenHandle [as _listen2] (node:net:1908:16)\n at listenInCluster (node:net:1965:12)\n at Server.listen (node:net:2067:7)\n at Object. (D:\\munka\\SzeSnake\\SerpentRace_Backend\\src\\Api\\index.ts:193:27)\n at Module._compile (node:internal/modules/cjs/loader:1546:14)\n at Module.m._compile (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1618:23)\n at Module._extensions..js (node:internal/modules/cjs/loader:1691:10)\n at Object.require.extensions. [as .ts] (D:\\munka\\SzeSnake\\SerpentRace_Backend\\node_modules\\ts-node\\src\\index.ts:1621:12)\n at Module.load (node:internal/modules/cjs/loader:1317:32)\n at Function.Module._load (node:internal/modules/cjs/loader:1127:12)"} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-19-26-585Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-19-26-585Z.log deleted file mode 100644 index 9cbeff53..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-19-26-585Z.log +++ /dev/null @@ -1,41 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:19:26.585Z -# Max entries per file: 10000 - -2025-09-15T12:19:32.866Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:19:32.878Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:19:32.878Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:19:33.263Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:19:33.284Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:19:33.286Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:19:33.298Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:28:28.318Z | [REQUEST] | Incoming request | ReqId:q9xumji83 | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.320Z | [REQUEST] | GET /api-docs/ | ReqId:q9xumji83 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.324Z | [REQUEST] | Request completed | ReqId:q9xumji83 | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.357Z | [REQUEST] | Incoming request | ReqId:qb1ye19jh | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.359Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:qb1ye19jh | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.361Z | [REQUEST] | Request completed | ReqId:qb1ye19jh | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | Time:4ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.364Z | [REQUEST] | Incoming request | ReqId:exdgz9dua | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.367Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:exdgz9dua | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.373Z | [REQUEST] | Request completed | ReqId:exdgz9dua | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.400Z | [REQUEST] | Incoming request | ReqId:eijtywrju | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.402Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:eijtywrju | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.405Z | [REQUEST] | Incoming request | ReqId:tjtedvicv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.406Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:tjtedvicv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.409Z | [REQUEST] | Request completed | ReqId:eijtywrju | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.411Z | [REQUEST] | Request completed | ReqId:tjtedvicv | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.464Z | [REQUEST] | Incoming request | ReqId:ywvfo1bxm | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:28:28.466Z | [REQUEST] | GET /api-docs/favicon-16x16.png | ReqId:ywvfo1bxm | IP:::ffff:172.20.0.1 | GET /api-docs/favicon-16x16.png | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T12:32:07.748Z | [REQUEST] | Incoming request | ReqId:593am1m2y | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:32:07.750Z | [REQUEST] | POST /api/users/create | ReqId:593am1m2y | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:32:07.752Z | [REQUEST] | Create user endpoint accessed | ReqId:593am1m2y | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser","email":"user@example.com"} -2025-09-15T12:32:07.979Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"null value in column \"type\" of relation \"Users\" violates not-null constraint","stack":"QueryFailedError: null value in column \"type\" of relation \"Users\" violates not-null constraint\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:46:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:32:07.981Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Failed to create user in database","stack":"Error: Failed to create user in database\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:31:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:46:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:32:07.983Z | [ERROR] | Create user endpoint error | ReqId:593am1m2y | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:86:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:32:07.985Z | [REQUEST] | Request completed | ReqId:593am1m2y | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:237ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:33:00.449Z | [REQUEST] | Incoming request | ReqId:mslolhmks | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:33:00.451Z | [REQUEST] | POST /api/users/create | ReqId:mslolhmks | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:33:00.453Z | [REQUEST] | Create user endpoint accessed | ReqId:mslolhmks | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser","email":"user@example.com"} -2025-09-15T12:33:00.620Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"null value in column \"type\" of relation \"Users\" violates not-null constraint","stack":"QueryFailedError: null value in column \"type\" of relation \"Users\" violates not-null constraint\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:46:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:33:00.622Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"Failed to create user in database","stack":"Error: Failed to create user in database\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:31:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:46:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:33:00.624Z | [ERROR] | Create user endpoint error | ReqId:mslolhmks | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:86:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:33:00.625Z | [REQUEST] | Request completed | ReqId:mslolhmks | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:176ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-10-378Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-10-378Z.log deleted file mode 100644 index 3dcbe9a9..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-10-378Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:35:10.378Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-16-712Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-16-712Z.log deleted file mode 100644 index 45a65313..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-16-712Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:35:16.712Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-26-845Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-26-845Z.log deleted file mode 100644 index 0bc19e32..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-26-845Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:35:26.845Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-35-873Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-35-873Z.log deleted file mode 100644 index e81fd9b0..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-35-35-873Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:35:35.873Z -# Max entries per file: 10000 - -2025-09-15T12:35:42.719Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:35:42.732Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:35:42.732Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:35:43.115Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:35:43.147Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:35:43.149Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:35:43.156Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-05-704Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-05-704Z.log deleted file mode 100644 index 606664c4..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-05-704Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:36:05.704Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-08-997Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-08-997Z.log deleted file mode 100644 index edc9ba2a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-08-997Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:36:08.997Z -# Max entries per file: 10000 - -2025-09-15T12:36:15.436Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:36:15.449Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:36:15.449Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:36:15.975Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:36:16.015Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:36:16.017Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:36:16.031Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-58-728Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-58-728Z.log deleted file mode 100644 index b94ddd59..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-36-58-728Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:36:58.728Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-37-01-627Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-37-01-627Z.log deleted file mode 100644 index 53751b13..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-37-01-627Z.log +++ /dev/null @@ -1,18 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:37:01.627Z -# Max entries per file: 10000 - -2025-09-15T12:37:08.011Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:37:08.032Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:37:08.032Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:37:08.842Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:37:08.861Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:37:08.863Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:37:08.868Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:37:42.174Z | [REQUEST] | Incoming request | ReqId:glvtze4j4 | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:37:42.176Z | [REQUEST] | POST /api/users/create | ReqId:glvtze4j4 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:37:42.179Z | [REQUEST] | Create user endpoint accessed | ReqId:glvtze4j4 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser","email":"user@example.com"} -2025-09-15T12:37:42.359Z | [DATABASE] | User created successfully | Meta:{"executionTime":25,"userId":"e560f2c5-055e-4911-90ba-44890e6fe661","username":"TesztUser","email":"user@example.com"} -2025-09-15T12:37:42.625Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Missing credentials for \"PLAIN\"","stack":"Error: Missing credentials for \"PLAIN\"\n at SMTPConnection._formatError (/app/node_modules/nodemailer/lib/smtp-connection/index.js:809:19)\n at SMTPConnection.login (/app/node_modules/nodemailer/lib/smtp-connection/index.js:454:38)\n at /app/node_modules/nodemailer/lib/smtp-transport/index.js:272:32\n at SMTPConnection. (/app/node_modules/nodemailer/lib/smtp-connection/index.js:215:17)\n at Object.onceWrapper (node:events:638:28)\n at SMTPConnection.emit (node:events:524:28)\n at SMTPConnection.emit (node:domain:489:12)\n at SMTPConnection._actionEHLO (/app/node_modules/nodemailer/lib/smtp-connection/index.js:1371:14)\n at SMTPConnection._processResponse (/app/node_modules/nodemailer/lib/smtp-connection/index.js:993:20)\n at SMTPConnection._onData (/app/node_modules/nodemailer/lib/smtp-connection/index.js:774:14)"} -2025-09-15T12:37:42.627Z | [WARNING] | Failed to send verification email | Meta:{"email":"user@example.com","userId":"e560f2c5-055e-4911-90ba-44890e6fe661"} -2025-09-15T12:37:42.629Z | [REQUEST] | User created successfully | ReqId:glvtze4j4 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"e560f2c5-055e-4911-90ba-44890e6fe661","username":"TesztUser"} -2025-09-15T12:37:42.632Z | [REQUEST] | Request completed | ReqId:glvtze4j4 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:201 | Time:458ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-39-44-241Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-39-44-241Z.log deleted file mode 100644 index e9e81cf3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-39-44-241Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:39:44.241Z -# Max entries per file: 10000 - -2025-09-15T12:39:50.587Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:39:50.600Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:39:50.600Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:39:51.449Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:39:51.470Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:39:51.471Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:39:51.477Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-40-00-507Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-40-00-507Z.log deleted file mode 100644 index 9af13397..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-40-00-507Z.log +++ /dev/null @@ -1,31 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:40:00.507Z -# Max entries per file: 10000 - -2025-09-15T12:40:06.929Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:40:06.942Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:40:06.942Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:40:07.745Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:40:07.765Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:40:07.767Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:40:07.772Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:40:22.594Z | [REQUEST] | Incoming request | ReqId:s1v0fji91 | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:40:22.596Z | [REQUEST] | POST /api/users/create | ReqId:s1v0fji91 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:40:22.599Z | [REQUEST] | Create user endpoint accessed | ReqId:s1v0fji91 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser","email":"user@example.com"} -2025-09-15T12:40:22.775Z | [DATABASE] | User created successfully | Meta:{"executionTime":20,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser","email":"user@example.com"} -2025-09-15T12:40:23.015Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Missing credentials for \"PLAIN\"","stack":"Error: Missing credentials for \"PLAIN\"\n at SMTPConnection._formatError (/app/node_modules/nodemailer/lib/smtp-connection/index.js:809:19)\n at SMTPConnection.login (/app/node_modules/nodemailer/lib/smtp-connection/index.js:454:38)\n at /app/node_modules/nodemailer/lib/smtp-transport/index.js:272:32\n at SMTPConnection. (/app/node_modules/nodemailer/lib/smtp-connection/index.js:215:17)\n at Object.onceWrapper (node:events:638:28)\n at SMTPConnection.emit (node:events:524:28)\n at SMTPConnection.emit (node:domain:489:12)\n at SMTPConnection._actionEHLO (/app/node_modules/nodemailer/lib/smtp-connection/index.js:1371:14)\n at SMTPConnection._processResponse (/app/node_modules/nodemailer/lib/smtp-connection/index.js:993:20)\n at SMTPConnection._onData (/app/node_modules/nodemailer/lib/smtp-connection/index.js:774:14)"} -2025-09-15T12:40:23.017Z | [WARNING] | Failed to send verification email | Meta:{"email":"user@example.com","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:40:23.019Z | [REQUEST] | User created successfully | ReqId:s1v0fji91 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser"} -2025-09-15T12:40:23.021Z | [REQUEST] | Request completed | ReqId:s1v0fji91 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:201 | Time:427ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:41:32.394Z | [REQUEST] | Incoming request | ReqId:vz85w21ja | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T12:41:32.396Z | [REQUEST] | POST /api/users/login | ReqId:vz85w21ja | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:41:32.398Z | [REQUEST] | Login endpoint accessed | ReqId:vz85w21ja | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T12:41:32.400Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T12:41:32.417Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":15,"found":true,"username":"TesztUser"} -2025-09-15T12:41:32.419Z | [DATABASE] | User lookup completed | Meta:{"executionTime":19,"found":true,"searchBy":"username"} -2025-09-15T12:41:32.570Z | [AUTH] | Password verification completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","valid":true,"verificationTime":150} -2025-09-15T12:41:32.574Z | [AUTH] | Login successful | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":174} -2025-09-15T12:41:32.576Z | [AUTH] | User login successful | ReqId:vz85w21ja | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser"} -2025-09-15T12:41:32.578Z | [REQUEST] | Request completed | ReqId:vz85w21ja | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:184ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:41:48.986Z | [REQUEST] | Incoming request | ReqId:amumwt25s | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 -2025-09-15T12:41:48.988Z | [REQUEST] | POST /api/users/logout | ReqId:amumwt25s | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:41:48.990Z | [REQUEST] | Request completed | ReqId:amumwt25s | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:404 | Time:4ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-48-47-841Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-48-47-841Z.log deleted file mode 100644 index 02d4d91c..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-48-47-841Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:48:47.841Z -# Max entries per file: 10000 - -2025-09-15T12:48:49.684Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:48:49.698Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:48:49.698Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:48:50.561Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:48:50.565Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:48:50.567Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:48:50.569Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-49-09-893Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-49-09-893Z.log deleted file mode 100644 index be0f518a..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-49-09-893Z.log +++ /dev/null @@ -1,43 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:49:09.893Z -# Max entries per file: 10000 - -2025-09-15T12:49:11.651Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:49:11.664Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:49:11.664Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:49:12.488Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:49:12.492Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:49:12.493Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:49:12.495Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:49:18.910Z | [REQUEST] | Incoming request | ReqId:x9twrmood | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 -2025-09-15T12:49:18.913Z | [REQUEST] | POST /api/users/logout | ReqId:x9twrmood | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:49:18.918Z | [AUTH] | Authentication successful | ReqId:x9twrmood | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:49:18.920Z | [AUTH] | Logout process started | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.925Z | [AUTH] | JWT token blacklisted | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","tokenExpiry":85934} -2025-09-15T12:49:18.927Z | [AUTH] | User removed from active sessions | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.942Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":5,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.943Z | [DATABASE] | User updated successfully | Meta:{"query":"update(ffa31617-2cf9-403e-ab9d-87eeec85ce58)","executionTime":14,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updatedFields":["updatedate"],"success":true} -2025-09-15T12:49:18.945Z | [AUTH] | User last logout timestamp updated | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.948Z | [AUTH] | User cache cleared | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.949Z | [AUTH] | User logout completed successfully | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.951Z | [REQUEST] | User logged out successfully | ReqId:x9twrmood | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:49:18.953Z | [REQUEST] | Request completed | ReqId:x9twrmood | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | Time:43ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:49:28.379Z | [REQUEST] | Incoming request | ReqId:t8vc1878y | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T12:49:28.381Z | [REQUEST] | POST /api/users/login | ReqId:t8vc1878y | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:49:28.383Z | [REQUEST] | Login endpoint accessed | ReqId:t8vc1878y | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T12:49:28.385Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T12:49:28.390Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":3,"found":true,"username":"TesztUser"} -2025-09-15T12:49:28.392Z | [DATABASE] | User lookup completed | Meta:{"executionTime":7,"found":true,"searchBy":"username"} -2025-09-15T12:49:28.543Z | [AUTH] | Password verification completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","valid":true,"verificationTime":150} -2025-09-15T12:49:28.547Z | [AUTH] | Login successful | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":162} -2025-09-15T12:49:28.549Z | [AUTH] | User login successful | ReqId:t8vc1878y | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser"} -2025-09-15T12:49:28.551Z | [REQUEST] | Request completed | ReqId:t8vc1878y | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:172ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:50:26.136Z | [REQUEST] | Incoming request | ReqId:wrt3pu1i2 | IP:::ffff:172.20.0.1 | POST /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:50:26.138Z | [REQUEST] | POST /api/users/profile | ReqId:wrt3pu1i2 | IP:::ffff:172.20.0.1 | POST /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:50:26.141Z | [REQUEST] | Request completed | ReqId:wrt3pu1i2 | IP:::ffff:172.20.0.1 | POST /api/users/profile | Status:404 | Time:5ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:50:40.248Z | [REQUEST] | Incoming request | ReqId:mdj6td86j | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:50:40.250Z | [REQUEST] | GET /api/users/profile | ReqId:mdj6td86j | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:50:40.254Z | [AUTH] | Authentication successful | ReqId:mdj6td86j | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:50:40.255Z | [REQUEST] | Get user profile endpoint accessed | ReqId:mdj6td86j | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:50:40.270Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":13,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:50:40.272Z | [REQUEST] | User profile retrieved successfully | ReqId:mdj6td86j | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser"} -2025-09-15T12:50:40.273Z | [REQUEST] | Request completed | ReqId:mdj6td86j | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | Time:25ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-52-01-020Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-52-01-020Z.log deleted file mode 100644 index 4d09b780..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-52-01-020Z.log +++ /dev/null @@ -1,116 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:52:01.020Z -# Max entries per file: 10000 - -2025-09-15T12:52:02.736Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:52:02.751Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:52:02.751Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:52:03.631Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:52:03.636Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:52:03.637Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:52:03.639Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:52:09.917Z | [REQUEST] | Incoming request | ReqId:4t001uku2 | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:52:09.919Z | [REQUEST] | GET /api/users/profile | ReqId:4t001uku2 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:52:09.924Z | [AUTH] | Authentication successful | ReqId:4t001uku2 | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:52:09.926Z | [REQUEST] | Get user profile endpoint accessed | ReqId:4t001uku2 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:09.936Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":9,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:09.937Z | [REQUEST] | User profile retrieved successfully | ReqId:4t001uku2 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser"} -2025-09-15T12:52:09.940Z | [REQUEST] | Request completed | ReqId:4t001uku2 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | Time:23ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:52:31.743Z | [REQUEST] | Incoming request | ReqId:h9zwe89hh | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 -2025-09-15T12:52:31.746Z | [REQUEST] | POST /api/users/logout | ReqId:h9zwe89hh | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:52:31.749Z | [AUTH] | Authentication successful | ReqId:h9zwe89hh | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:52:31.751Z | [AUTH] | Logout process started | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.754Z | [AUTH] | JWT token blacklisted | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","tokenExpiry":86217} -2025-09-15T12:52:31.757Z | [AUTH] | User removed from active sessions | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.773Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":2,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.775Z | [DATABASE] | User updated successfully | Meta:{"query":"update(ffa31617-2cf9-403e-ab9d-87eeec85ce58)","executionTime":17,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updatedFields":["updatedate"],"success":true} -2025-09-15T12:52:31.776Z | [AUTH] | User last logout timestamp updated | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.778Z | [AUTH] | User cache cleared | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.780Z | [AUTH] | User logout completed successfully | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.781Z | [REQUEST] | User logged out successfully | ReqId:h9zwe89hh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:52:31.783Z | [REQUEST] | Request completed | ReqId:h9zwe89hh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | Time:40ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:53:25.323Z | [REQUEST] | Incoming request | ReqId:o2fg2oi9u | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:53:25.325Z | [REQUEST] | GET /api/users/profile | ReqId:o2fg2oi9u | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:53:25.328Z | [AUTH] | Authentication failed - Token blacklisted | ReqId:o2fg2oi9u | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"ip":"::ffff:172.20.0.1","userAgent":"PostmanRuntime/7.45.0","path":"/profile"} -2025-09-15T12:53:25.330Z | [REQUEST] | Request completed | ReqId:o2fg2oi9u | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:401 | Time:7ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:53:41.156Z | [REQUEST] | Incoming request | ReqId:q4u7qdspw | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T12:53:41.158Z | [REQUEST] | POST /api/users/login | ReqId:q4u7qdspw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:53:41.160Z | [REQUEST] | Login endpoint accessed | ReqId:q4u7qdspw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T12:53:41.163Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T12:53:41.174Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":10,"found":true,"username":"TesztUser"} -2025-09-15T12:53:41.176Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-09-15T12:53:41.327Z | [AUTH] | Password verification completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","valid":true,"verificationTime":149} -2025-09-15T12:53:41.331Z | [AUTH] | Login successful | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":168} -2025-09-15T12:53:41.333Z | [AUTH] | User login successful | ReqId:q4u7qdspw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztUser"} -2025-09-15T12:53:41.335Z | [REQUEST] | Request completed | ReqId:q4u7qdspw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:179ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:09.875Z | [REQUEST] | Incoming request | ReqId:djcuh0yw5 | IP:::ffff:172.20.0.1 | PATCH /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:09.877Z | [REQUEST] | PATCH /api/users/profile | ReqId:djcuh0yw5 | IP:::ffff:172.20.0.1 | PATCH /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:09.880Z | [AUTH] | Authentication successful | ReqId:djcuh0yw5 | IP:::ffff:172.20.0.1 | PATCH /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:54:09.882Z | [REQUEST] | Update user profile endpoint accessed | ReqId:djcuh0yw5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","fieldsToUpdate":["username","password"]} -2025-09-15T12:54:10.046Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":3,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:10.048Z | [DATABASE] | User updated successfully | Meta:{"query":"update(ffa31617-2cf9-403e-ab9d-87eeec85ce58)","executionTime":15,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updatedFields":["id","username","password"],"success":true} -2025-09-15T12:54:10.050Z | [REQUEST] | User profile updated successfully | ReqId:djcuh0yw5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztAdmin"} -2025-09-15T12:54:10.052Z | [REQUEST] | Request completed | ReqId:djcuh0yw5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/users/profile | Status:200 | Time:177ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:18.420Z | [REQUEST] | Incoming request | ReqId:qoj2pmsic | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:18.422Z | [REQUEST] | GET /api/users/profile | ReqId:qoj2pmsic | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:18.425Z | [AUTH] | Authentication successful | ReqId:qoj2pmsic | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:54:18.426Z | [REQUEST] | Get user profile endpoint accessed | ReqId:qoj2pmsic | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:18.430Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":2,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:18.432Z | [REQUEST] | User profile retrieved successfully | ReqId:qoj2pmsic | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztAdmin"} -2025-09-15T12:54:18.433Z | [REQUEST] | Request completed | ReqId:qoj2pmsic | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | Time:13ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:38.465Z | [REQUEST] | Incoming request | ReqId:vrd0xj5h8 | IP:::ffff:172.20.0.1 | DELETE /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:38.467Z | [REQUEST] | DELETE /api/users/profile | ReqId:vrd0xj5h8 | IP:::ffff:172.20.0.1 | DELETE /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:38.469Z | [AUTH] | Authentication successful | ReqId:vrd0xj5h8 | IP:::ffff:172.20.0.1 | DELETE /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:54:38.484Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":3,"found":false,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:38.486Z | [DATABASE] | User soft deleted successfully | Meta:{"query":"update(ffa31617-2cf9-403e-ab9d-87eeec85ce58, { state: SOFT_DELETE })","executionTime":15,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","success":false} -2025-09-15T12:54:38.487Z | [REQUEST] | User soft deleted successfully | ReqId:vrd0xj5h8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:38.489Z | [REQUEST] | Request completed | ReqId:vrd0xj5h8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/users/profile | Status:200 | Time:24ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:43.815Z | [REQUEST] | Incoming request | ReqId:yii54vgus | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:43.817Z | [REQUEST] | GET /api/users/profile | ReqId:yii54vgus | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:43.819Z | [AUTH] | Authentication successful | ReqId:yii54vgus | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:54:43.821Z | [REQUEST] | Get user profile endpoint accessed | ReqId:yii54vgus | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:43.824Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":2,"found":false,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:43.826Z | [WARNING] | User profile not found | ReqId:yii54vgus | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:43.827Z | [REQUEST] | Request completed | ReqId:yii54vgus | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:404 | Time:12ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:50.178Z | [REQUEST] | Incoming request | ReqId:jgp1r1dec | IP:::ffff:172.20.0.1 | GET /api/users/logout | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:50.180Z | [REQUEST] | GET /api/users/logout | ReqId:jgp1r1dec | IP:::ffff:172.20.0.1 | GET /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:50.182Z | [REQUEST] | Request completed | ReqId:jgp1r1dec | IP:::ffff:172.20.0.1 | GET /api/users/logout | Status:404 | Time:4ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:57.930Z | [REQUEST] | Incoming request | ReqId:w78a7912l | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:57.932Z | [REQUEST] | POST /api/users/logout | ReqId:w78a7912l | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:54:57.935Z | [AUTH] | Authentication successful | ReqId:w78a7912l | IP:::ffff:172.20.0.1 | POST /api/users/logout | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T12:54:57.937Z | [AUTH] | Logout process started | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:57.940Z | [AUTH] | JWT token blacklisted | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","tokenExpiry":86324} -2025-09-15T12:54:57.942Z | [AUTH] | User removed from active sessions | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:57.954Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":1,"found":false,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:57.956Z | [DATABASE] | User updated successfully | Meta:{"query":"update(ffa31617-2cf9-403e-ab9d-87eeec85ce58)","executionTime":12,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updatedFields":["updatedate"],"success":false} -2025-09-15T12:54:57.958Z | [AUTH] | User cache cleared | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:57.960Z | [AUTH] | User logout completed successfully | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:57.961Z | [REQUEST] | User logged out successfully | ReqId:w78a7912l | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T12:54:57.963Z | [REQUEST] | Request completed | ReqId:w78a7912l | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/users/logout | Status:200 | Time:33ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:22.864Z | [REQUEST] | Incoming request | ReqId:mclmp1qlh | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:22.866Z | [REQUEST] | POST /api/users/create | ReqId:mclmp1qlh | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:22.868Z | [REQUEST] | Create user endpoint accessed | ReqId:mclmp1qlh | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin","email":"user@example.com"} -2025-09-15T12:55:23.066Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:23.068Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"User with this username or email already exists","stack":"Error: User with this username or email already exists\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:28:23)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:23.070Z | [ERROR] | Create user endpoint error | ReqId:mclmp1qlh | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:23.072Z | [REQUEST] | Request completed | ReqId:mclmp1qlh | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:208ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:31.890Z | [REQUEST] | Incoming request | ReqId:fjhc85an2 | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:31.892Z | [REQUEST] | POST /api/users/create | ReqId:fjhc85an2 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:31.894Z | [REQUEST] | Create user endpoint accessed | ReqId:fjhc85an2 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin","email":"user@example.com"} -2025-09-15T12:55:32.050Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:32.052Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"User with this username or email already exists","stack":"Error: User with this username or email already exists\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:28:23)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:32.054Z | [ERROR] | Create user endpoint error | ReqId:fjhc85an2 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:32.056Z | [REQUEST] | Request completed | ReqId:fjhc85an2 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:166ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:58.720Z | [REQUEST] | Incoming request | ReqId:8z2pt6wls | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:58.723Z | [REQUEST] | POST /api/users/create | ReqId:8z2pt6wls | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:55:58.728Z | [REQUEST] | Create user endpoint accessed | ReqId:8z2pt6wls | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin","email":"user@example.com"} -2025-09-15T12:55:58.903Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:58.906Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"User with this username or email already exists","stack":"Error: User with this username or email already exists\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:28:23)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:58.909Z | [ERROR] | Create user endpoint error | ReqId:8z2pt6wls | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:55:58.911Z | [REQUEST] | Request completed | ReqId:8z2pt6wls | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:191ms | UA:PostmanRuntime/7.45.0 -2025-09-15T12:56:02.539Z | [REQUEST] | Incoming request | ReqId:xarq833pk | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:56:02.541Z | [REQUEST] | POST /api/users/create | ReqId:xarq833pk | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:56:02.543Z | [REQUEST] | Create user endpoint accessed | ReqId:xarq833pk | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin1","email":"user@example.com"} -2025-09-15T12:56:02.700Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_3c3ab3f49a87e6ddb607f3c4945\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_3c3ab3f49a87e6ddb607f3c4945\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:56:02.702Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"User with this username or email already exists","stack":"Error: User with this username or email already exists\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:28:23)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:56:02.704Z | [ERROR] | Create user endpoint error | ReqId:xarq833pk | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:56:02.706Z | [REQUEST] | Request completed | ReqId:xarq833pk | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:167ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-57-09-147Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-57-09-147Z.log deleted file mode 100644 index e81fc689..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-57-09-147Z.log +++ /dev/null @@ -1,18 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:57:09.147Z -# Max entries per file: 10000 - -2025-09-15T12:57:10.909Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:57:10.923Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:57:10.923Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:57:11.797Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:57:11.802Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:57:11.803Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:57:11.805Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:57:16.179Z | [REQUEST] | Incoming request | ReqId:lc4shv0do | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:57:16.181Z | [REQUEST] | POST /api/users/create | ReqId:lc4shv0do | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:57:16.184Z | [REQUEST] | Create user endpoint accessed | ReqId:lc4shv0do | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin","email":"user@example.com"} -2025-09-15T12:57:16.371Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:57:16.373Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"User with this username or email already exists","stack":"Error: User with this username or email already exists\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:28:23)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:57:16.375Z | [ERROR] | Create user endpoint error | ReqId:lc4shv0do | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:57:16.377Z | [ERROR] | Create user endpoint error | ReqId:lc4shv0do | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:57:16.380Z | [REQUEST] | Request completed | ReqId:lc4shv0do | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:201ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-59-13-517Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-59-13-517Z.log deleted file mode 100644 index 7fe31dd2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-59-13-517Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:59:13.517Z -# Max entries per file: 10000 - -2025-09-15T12:59:15.303Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:59:15.316Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:59:15.316Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:59:16.334Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:59:16.339Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:59:16.341Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:59:16.343Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-59-33-039Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-59-33-039Z.log deleted file mode 100644 index 933e6457..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T12-59-33-039Z.log +++ /dev/null @@ -1,17 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T12:59:33.039Z -# Max entries per file: 10000 - -2025-09-15T12:59:34.745Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T12:59:34.758Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T12:59:34.758Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T12:59:35.583Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T12:59:35.587Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T12:59:35.590Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T12:59:35.592Z | [STARTUP] | Redis client connected successfully -2025-09-15T12:59:40.637Z | [REQUEST] | Incoming request | ReqId:pb09cnqv0 | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T12:59:40.639Z | [REQUEST] | POST /api/users/create | ReqId:pb09cnqv0 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T12:59:40.643Z | [REQUEST] | Create user endpoint accessed | ReqId:pb09cnqv0 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin","email":"user@example.com"} -2025-09-15T12:59:40.827Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:59:40.829Z | [ERROR] | CreateUserCommandHandler error | Meta:{"name":"Error","message":"User with this username or email already exists","stack":"Error: User with this username or email already exists\n at UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:28:23)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:59:40.831Z | [ERROR] | Create user endpoint error | ReqId:pb09cnqv0 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to create user","stack":"Error: Failed to create user\n at CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:84:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T12:59:40.834Z | [REQUEST] | Request completed | ReqId:pb09cnqv0 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:500 | Time:197ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-01-39-531Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-01-39-531Z.log deleted file mode 100644 index 77f1e597..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-01-39-531Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:01:39.531Z -# Max entries per file: 10000 - -2025-09-15T13:01:41.391Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:01:41.404Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:01:41.404Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:01:42.306Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:01:42.311Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:01:42.312Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:01:42.314Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-04-05-024Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-04-05-024Z.log deleted file mode 100644 index 3d98c7bd..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-04-05-024Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:04:05.024Z -# Max entries per file: 10000 - -2025-09-15T13:04:06.799Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:04:06.813Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:04:06.813Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:04:07.767Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:04:07.772Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:04:07.774Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:04:07.777Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-04-16-511Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-04-16-511Z.log deleted file mode 100644 index c7b80ea4..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-04-16-511Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:04:16.511Z -# Max entries per file: 10000 - -2025-09-15T13:04:18.361Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:04:18.375Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:04:18.375Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:04:19.274Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:04:19.279Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:04:19.280Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:04:19.282Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-05-05-594Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-05-05-594Z.log deleted file mode 100644 index 60c76467..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-05-05-594Z.log +++ /dev/null @@ -1,48 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:05:05.594Z -# Max entries per file: 10000 - -2025-09-15T13:05:07.337Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:05:07.351Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:05:07.351Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:05:08.342Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:05:08.347Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:05:08.349Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:05:08.350Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:05:16.809Z | [REQUEST] | Incoming request | ReqId:1f3eifswo | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T13:05:16.812Z | [REQUEST] | POST /api/users/create | ReqId:1f3eifswo | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:05:16.816Z | [REQUEST] | Create user endpoint accessed | ReqId:1f3eifswo | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin","email":"user@example.com"} -2025-09-15T13:05:17.010Z | [ERROR] | UserRepository.create error | Meta:{"name":"QueryFailedError","message":"duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"","stack":"QueryFailedError: duplicate key value violates unique constraint \"UQ_ffc81a3b97dcbf8e320d5106c0d\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async UserRepository.create (/app/src/Infrastructure/Repository/UserRepository.ts:16:28)\n at async CreateUserCommandHandler.execute (/app/src/Application/User/commands/CreateUserCommandHandler.ts:44:23)\n at async /app/src/Api/routers/userRouter.ts:77:18"} -2025-09-15T13:05:17.014Z | [REQUEST] | Request completed | ReqId:1f3eifswo | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:409 | Time:205ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:06:06.365Z | [REQUEST] | Incoming request | ReqId:faaxhg3i1 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T13:06:06.367Z | [REQUEST] | POST /api/users/login | ReqId:faaxhg3i1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:06:06.369Z | [REQUEST] | Login endpoint accessed | ReqId:faaxhg3i1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin"} -2025-09-15T13:06:06.371Z | [AUTH] | Login attempt | Meta:{"username":"TesztAdmin"} -2025-09-15T13:06:06.394Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztAdmin })","executionTime":20,"found":true,"username":"TesztAdmin"} -2025-09-15T13:06:06.396Z | [DATABASE] | User lookup completed | Meta:{"executionTime":25,"found":true,"searchBy":"username"} -2025-09-15T13:06:06.550Z | [AUTH] | Password verification completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","valid":true,"verificationTime":151} -2025-09-15T13:06:06.556Z | [AUTH] | Login successful | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":185} -2025-09-15T13:06:06.558Z | [AUTH] | User login successful | ReqId:faaxhg3i1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztAdmin"} -2025-09-15T13:06:06.560Z | [REQUEST] | Request completed | ReqId:faaxhg3i1 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:195ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:07:03.023Z | [REQUEST] | Incoming request | ReqId:148mhu0kz | IP:::ffff:172.20.0.1 | GET /api-docs/ | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.025Z | [REQUEST] | GET /api-docs/ | ReqId:148mhu0kz | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.031Z | [REQUEST] | Request completed | ReqId:148mhu0kz | IP:::ffff:172.20.0.1 | GET /api-docs/ | Status:304 | Time:8ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.056Z | [REQUEST] | Incoming request | ReqId:cr24npsy5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.059Z | [REQUEST] | GET /api-docs/swagger-ui.css | ReqId:cr24npsy5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.061Z | [REQUEST] | Incoming request | ReqId:qmgartctm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.063Z | [REQUEST] | GET /api-docs/swagger-ui-bundle.js | ReqId:qmgartctm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.066Z | [REQUEST] | Request completed | ReqId:cr24npsy5 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui.css | Status:304 | Time:10ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.068Z | [REQUEST] | Request completed | ReqId:qmgartctm | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-bundle.js | Status:304 | Time:7ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.072Z | [REQUEST] | Incoming request | ReqId:qm5m8ga8e | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.074Z | [REQUEST] | GET /api-docs/swagger-ui-standalone-preset.js | ReqId:qm5m8ga8e | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.078Z | [REQUEST] | Request completed | ReqId:qm5m8ga8e | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-standalone-preset.js | Status:304 | Time:6ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.080Z | [REQUEST] | Incoming request | ReqId:hbywdbqe2 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.085Z | [REQUEST] | GET /api-docs/swagger-ui-init.js | ReqId:hbywdbqe2 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:200 | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:07:03.089Z | [REQUEST] | Request completed | ReqId:hbywdbqe2 | IP:::ffff:172.20.0.1 | GET /api-docs/swagger-ui-init.js | Status:304 | Time:9ms | UA:Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:143.0 -2025-09-15T13:21:56.108Z | [REQUEST] | Incoming request | ReqId:dyxy3fe8v | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 -2025-09-15T13:21:56.110Z | [REQUEST] | POST /api/decks/ | ReqId:dyxy3fe8v | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:21:56.115Z | [AUTH] | Authentication successful | ReqId:dyxy3fe8v | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:21:56.117Z | [REQUEST] | Create deck endpoint accessed | ReqId:dyxy3fe8v | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"TestLuckCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:21:56.128Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: undefined })","executionTime":9,"found":true} -2025-09-15T13:21:56.130Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:21:56.130Z","deckName":"TestLuckCard","deckType":2,"cardCount":3} -2025-09-15T13:21:56.145Z | [ERROR] | Create deck endpoint error | ReqId:dyxy3fe8v | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"QueryFailedError","message":"null value in column \"user_id\" of relation \"Decks\" violates not-null constraint","stack":"QueryFailedError: null value in column \"user_id\" of relation \"Decks\" violates not-null constraint\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async InsertQueryBuilder.execute (/app/node_modules/src/query-builder/InsertQueryBuilder.ts:164:33)\n at async SubjectExecutor.executeInsertOperations (/app/node_modules/src/persistence/SubjectExecutor.ts:435:42)\n at async SubjectExecutor.execute (/app/node_modules/src/persistence/SubjectExecutor.ts:137:9)\n at async EntityPersistExecutor.execute (/app/node_modules/src/persistence/EntityPersistExecutor.ts:182:21)\n at async CreateDeckCommandHandler.createDeck (/app/src/Application/Deck/commands/CreateDeckCommandHandler.ts:112:21)\n at async /app/src/Api/routers/deckRouter.ts:64:18"} -2025-09-15T13:21:56.148Z | [REQUEST] | Request completed | ReqId:dyxy3fe8v | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:500 | Time:40ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-23-41-490Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-23-41-490Z.log deleted file mode 100644 index 62d354e2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-23-41-490Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:23:41.490Z -# Max entries per file: 10000 - -2025-09-15T13:23:43.323Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:23:43.340Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:23:43.340Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:23:44.199Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:23:44.204Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:23:44.206Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:23:44.208Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-24-35-940Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-24-35-940Z.log deleted file mode 100644 index 72891e7d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-24-35-940Z.log +++ /dev/null @@ -1,19 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:24:35.940Z -# Max entries per file: 10000 - -2025-09-15T13:24:37.729Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:24:37.742Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:24:37.742Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:24:38.621Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:24:38.625Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:24:38.626Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:24:38.628Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:24:41.226Z | [REQUEST] | Incoming request | ReqId:vf0yd6b4i | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 -2025-09-15T13:24:41.228Z | [REQUEST] | POST /api/decks/ | ReqId:vf0yd6b4i | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:24:41.233Z | [AUTH] | Authentication successful | ReqId:vf0yd6b4i | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:24:41.235Z | [REQUEST] | Create deck endpoint accessed | ReqId:vf0yd6b4i | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"TestLuckCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:24:41.244Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":8,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:24:41.246Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:24:41.246Z","deckName":"TestLuckCard","deckType":2,"cardCount":3} -2025-09-15T13:24:41.259Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"2fd99236-7748-4662-af37-2c8d17af4313","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","deckName":"TestLuckCard","deckType":2,"cardCount":3} -2025-09-15T13:24:41.260Z | [REQUEST] | Deck created successfully | ReqId:vf0yd6b4i | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"2fd99236-7748-4662-af37-2c8d17af4313","name":"TestLuckCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:24:41.263Z | [REQUEST] | Request completed | ReqId:vf0yd6b4i | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | Time:37ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-26-42-347Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-26-42-347Z.log deleted file mode 100644 index 0fbfb7b7..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-26-42-347Z.log +++ /dev/null @@ -1,45 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:26:42.347Z -# Max entries per file: 10000 - -2025-09-15T13:26:44.028Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:26:44.041Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:26:44.041Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:26:44.859Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:26:44.863Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:26:44.865Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:26:44.867Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:27:30.496Z | [REQUEST] | Incoming request | ReqId:qybe4z9r3 | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 -2025-09-15T13:27:30.498Z | [REQUEST] | POST /api/decks/ | ReqId:qybe4z9r3 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:27:30.504Z | [AUTH] | Authentication successful | ReqId:qybe4z9r3 | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:27:30.506Z | [REQUEST] | Create deck endpoint accessed | ReqId:qybe4z9r3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"TestJOKERCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:27:30.522Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":14,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:27:30.524Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:27:30.524Z","deckName":"TestJOKERCard","deckType":1,"cardCount":1} -2025-09-15T13:27:30.536Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","deckName":"TestJOKERCard","deckType":1,"cardCount":1} -2025-09-15T13:27:30.538Z | [REQUEST] | Deck created successfully | ReqId:qybe4z9r3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","name":"TestJOKERCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:27:30.541Z | [REQUEST] | Request completed | ReqId:qybe4z9r3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | Time:45ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:08.994Z | [REQUEST] | Incoming request | ReqId:5qs85uahx | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:08.996Z | [REQUEST] | POST /api/decks/ | ReqId:5qs85uahx | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:09.000Z | [AUTH] | Authentication successful | ReqId:5qs85uahx | IP:::ffff:172.20.0.1 | POST /api/decks/ | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:28:09.002Z | [REQUEST] | Create deck endpoint accessed | ReqId:5qs85uahx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"TestQUESTIONCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:28:09.015Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":12,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:28:09.017Z | [AUTH] | ADMIN_BYPASS: CREATE_DECK_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"new-deck","action":"CREATE_DECK_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:28:09.017Z","deckName":"TestQUESTIONCard","deckType":2,"cardCount":1} -2025-09-15T13:28:09.023Z | [REQUEST] | Deck created successfully | Meta:{"deckId":"c6336b46-a80c-467a-a329-9ad51bdbba6c","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","deckName":"TestQUESTIONCard","deckType":2,"cardCount":1} -2025-09-15T13:28:09.025Z | [REQUEST] | Deck created successfully | ReqId:5qs85uahx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"c6336b46-a80c-467a-a329-9ad51bdbba6c","name":"TestQUESTIONCard","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:28:09.027Z | [REQUEST] | Request completed | ReqId:5qs85uahx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/decks/ | Status:200 | Time:33ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:34.166Z | [REQUEST] | Incoming request | ReqId:mz6qkai4y | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:34.167Z | [REQUEST] | GET /api/decks/page/0/50 | ReqId:mz6qkai4y | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:34.171Z | [AUTH] | Authentication successful | ReqId:mz6qkai4y | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:28:34.173Z | [REQUEST] | Get decks by page endpoint accessed | ReqId:mz6qkai4y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":0,"to":50} -2025-09-15T13:28:34.175Z | [AUTH] | ADMIN_BYPASS: GET_DECKS_PAGE_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"paginated-decks","action":"GET_DECKS_PAGE_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:28:34.175Z","from":0,"to":50,"includesDeleted":false,"operation":"read"} -2025-09-15T13:28:34.176Z | [REQUEST] | Get decks by page query started | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":0,"to":50,"includeDeleted":false} -2025-09-15T13:28:34.178Z | [AUTH] | ADMIN_BYPASS: FIND_FILTERED_DECKS_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"all-decks-filtered","action":"FIND_FILTERED_DECKS_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:28:34.178Z","bypassType":"admin-all-decks-filtered","userOrgId":"","from":0,"to":50,"operation":"read"} -2025-09-15T13:28:34.197Z | [DATABASE] | Admin filtered deck query completed | Meta:{"query":"executionTime: 19ms, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58, found: 3, totalCount: 3, isAdmin: true"} -2025-09-15T13:28:34.199Z | [REQUEST] | Get decks by page query completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":0,"to":50,"returned":3,"totalCount":3,"includeDeleted":false} -2025-09-15T13:28:34.201Z | [REQUEST] | Get decks page completed successfully | ReqId:mz6qkai4y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","from":0,"to":50,"returnedCount":3,"totalCount":3} -2025-09-15T13:28:34.203Z | [REQUEST] | Request completed | ReqId:mz6qkai4y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | Time:37ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:44.002Z | [REQUEST] | Incoming request | ReqId:ntr1851wr | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:44.004Z | [REQUEST] | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | ReqId:ntr1851wr | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:28:44.007Z | [AUTH] | Authentication successful | ReqId:ntr1851wr | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:28:44.009Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:ntr1851wr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"c6336b46-a80c-467a-a329-9ad51bdbba6c"} -2025-09-15T13:28:44.013Z | [REQUEST] | Deck retrieved successfully | ReqId:ntr1851wr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"c6336b46-a80c-467a-a329-9ad51bdbba6c"} -2025-09-15T13:28:44.015Z | [REQUEST] | Request completed | ReqId:ntr1851wr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | Time:12ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-29-34-706Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-29-34-706Z.log deleted file mode 100644 index 169ca1f5..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-29-34-706Z.log +++ /dev/null @@ -1,80 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:29:34.706Z -# Max entries per file: 10000 - -2025-09-15T13:29:36.573Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:29:36.588Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:29:36.588Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:29:37.535Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:29:37.540Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:29:37.541Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:29:37.543Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:29:38.521Z | [REQUEST] | Incoming request | ReqId:up9owkuzg | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | UA:PostmanRuntime/7.45.0 -2025-09-15T13:29:38.523Z | [REQUEST] | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | ReqId:up9owkuzg | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:29:38.528Z | [AUTH] | Authentication successful | ReqId:up9owkuzg | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:29:38.530Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:up9owkuzg | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"c6336b46-a80c-467a-a329-9ad51bdbba6c"} -2025-09-15T13:29:38.540Z | [REQUEST] | Deck retrieved successfully | ReqId:up9owkuzg | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"c6336b46-a80c-467a-a329-9ad51bdbba6c"} -2025-09-15T13:29:38.543Z | [REQUEST] | Request completed | ReqId:up9owkuzg | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/c6336b46-a80c-467a-a329-9ad51bdbba6c | Status:200 | Time:22ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:05.712Z | [REQUEST] | Incoming request | ReqId:p5hb1mr6q | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/50 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:05.714Z | [REQUEST] | GET /api/decks/page/1/50 | ReqId:p5hb1mr6q | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/50 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:05.718Z | [AUTH] | Authentication successful | ReqId:p5hb1mr6q | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/50 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:30:05.720Z | [REQUEST] | Get decks by page endpoint accessed | ReqId:p5hb1mr6q | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/50 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":1,"to":50} -2025-09-15T13:30:05.722Z | [AUTH] | ADMIN_BYPASS: GET_DECKS_PAGE_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"paginated-decks","action":"GET_DECKS_PAGE_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:30:05.722Z","from":1,"to":50,"includesDeleted":false,"operation":"read"} -2025-09-15T13:30:05.724Z | [REQUEST] | Get decks by page query started | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":1,"to":50,"includeDeleted":false} -2025-09-15T13:30:05.726Z | [AUTH] | ADMIN_BYPASS: FIND_FILTERED_DECKS_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"all-decks-filtered","action":"FIND_FILTERED_DECKS_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:30:05.726Z","bypassType":"admin-all-decks-filtered","userOrgId":"","from":1,"to":50,"operation":"read"} -2025-09-15T13:30:05.751Z | [DATABASE] | Admin filtered deck query completed | Meta:{"query":"executionTime: 26ms, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58, found: 2, totalCount: 3, isAdmin: true"} -2025-09-15T13:30:05.753Z | [REQUEST] | Get decks by page query completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":1,"to":50,"returned":2,"totalCount":3,"includeDeleted":false} -2025-09-15T13:30:05.756Z | [REQUEST] | Get decks page completed successfully | ReqId:p5hb1mr6q | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/50 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","from":1,"to":50,"returnedCount":2,"totalCount":3} -2025-09-15T13:30:05.758Z | [REQUEST] | Request completed | ReqId:p5hb1mr6q | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/1/50 | Status:200 | Time:46ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:11.696Z | [REQUEST] | Incoming request | ReqId:dd51xu5s3 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:11.698Z | [REQUEST] | GET /api/decks/page/0/50 | ReqId:dd51xu5s3 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:11.701Z | [AUTH] | Authentication successful | ReqId:dd51xu5s3 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:30:11.703Z | [REQUEST] | Get decks by page endpoint accessed | ReqId:dd51xu5s3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":0,"to":50} -2025-09-15T13:30:11.705Z | [AUTH] | ADMIN_BYPASS: GET_DECKS_PAGE_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"paginated-decks","action":"GET_DECKS_PAGE_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:30:11.705Z","from":0,"to":50,"includesDeleted":false,"operation":"read"} -2025-09-15T13:30:11.706Z | [REQUEST] | Get decks by page query started | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":0,"to":50,"includeDeleted":false} -2025-09-15T13:30:11.708Z | [AUTH] | ADMIN_BYPASS: FIND_FILTERED_DECKS_BYPASS | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","targetId":"all-decks-filtered","action":"FIND_FILTERED_DECKS_BYPASS","bypassReason":"Admin privileges","timestamp":"2025-09-15T13:30:11.708Z","bypassType":"admin-all-decks-filtered","userOrgId":"","from":0,"to":50,"operation":"read"} -2025-09-15T13:30:11.716Z | [DATABASE] | Admin filtered deck query completed | Meta:{"query":"executionTime: 8ms, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58, found: 3, totalCount: 3, isAdmin: true"} -2025-09-15T13:30:11.719Z | [REQUEST] | Get decks by page query completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","userOrgId":"","isAdmin":true,"from":0,"to":50,"returned":3,"totalCount":3,"includeDeleted":false} -2025-09-15T13:30:11.720Z | [REQUEST] | Get decks page completed successfully | ReqId:dd51xu5s3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","from":0,"to":50,"returnedCount":3,"totalCount":3} -2025-09-15T13:30:11.722Z | [REQUEST] | Request completed | ReqId:dd51xu5s3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/page/0/50 | Status:200 | Time:26ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:20.336Z | [REQUEST] | Incoming request | ReqId:hjwse88um | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:20.338Z | [REQUEST] | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:hjwse88um | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:20.341Z | [AUTH] | Authentication successful | ReqId:hjwse88um | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:30:20.343Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:hjwse88um | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T13:30:20.347Z | [REQUEST] | Deck retrieved successfully | ReqId:hjwse88um | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T13:30:20.349Z | [REQUEST] | Request completed | ReqId:hjwse88um | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:13ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:39.509Z | [REQUEST] | Incoming request | ReqId:kque0rc26 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:39.511Z | [REQUEST] | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:kque0rc26 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:39.515Z | [AUTH] | Authentication successful | ReqId:kque0rc26 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:30:39.516Z | [REQUEST] | Soft delete deck endpoint accessed | ReqId:kque0rc26 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:30:39.532Z | [REQUEST] | Deck soft delete successful | ReqId:kque0rc26 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","success":true} -2025-09-15T13:30:39.534Z | [REQUEST] | Request completed | ReqId:kque0rc26 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:25ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:46.563Z | [REQUEST] | Incoming request | ReqId:mu36xi6e8 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:46.565Z | [REQUEST] | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:mu36xi6e8 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:30:46.568Z | [AUTH] | Authentication successful | ReqId:mu36xi6e8 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:30:46.570Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:mu36xi6e8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T13:30:46.573Z | [WARNING] | Deck not found | ReqId:mu36xi6e8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T13:30:46.575Z | [REQUEST] | Request completed | ReqId:mu36xi6e8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:12ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:17.680Z | [REQUEST] | Incoming request | ReqId:7gmo2fhko | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:17.682Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:7gmo2fhko | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:17.687Z | [AUTH] | Admin authentication successful | ReqId:7gmo2fhko | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:31:17.690Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:7gmo2fhko | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:31:17.702Z | [WARNING] | Deck not found | ReqId:7gmo2fhko | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:31:17.705Z | [REQUEST] | Request completed | ReqId:7gmo2fhko | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:25ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:42.235Z | [REQUEST] | Incoming request | ReqId:g67b01cdw | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:42.237Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:g67b01cdw | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:42.240Z | [AUTH] | Admin authentication successful | ReqId:g67b01cdw | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:31:42.242Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:g67b01cdw | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:31:42.253Z | [WARNING] | Deck not found | ReqId:g67b01cdw | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:31:42.255Z | [REQUEST] | Request completed | ReqId:g67b01cdw | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:20ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:50.204Z | [REQUEST] | Incoming request | ReqId:0lzne8ot8 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:50.207Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:0lzne8ot8 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:31:50.210Z | [AUTH] | Admin authentication successful | ReqId:0lzne8ot8 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:31:50.212Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:0lzne8ot8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:31:50.215Z | [WARNING] | Deck not found | ReqId:0lzne8ot8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:31:50.216Z | [REQUEST] | Request completed | ReqId:0lzne8ot8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:12ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:32:21.452Z | [REQUEST] | Incoming request | ReqId:g6rb1d954 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 -2025-09-15T13:32:21.454Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:g6rb1d954 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:32:21.458Z | [AUTH] | Admin authentication successful | ReqId:g6rb1d954 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:32:21.460Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:g6rb1d954 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":true} -2025-09-15T13:32:21.471Z | [REQUEST] | Admin deck retrieved successfully | ReqId:g6rb1d954 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":true} -2025-09-15T13:32:21.473Z | [REQUEST] | Request completed | ReqId:g6rb1d954 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | Time:21ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-33-47-071Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-33-47-071Z.log deleted file mode 100644 index 2b73943b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-33-47-071Z.log +++ /dev/null @@ -1,22 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:33:47.071Z -# Max entries per file: 10000 - -2025-09-15T13:33:48.872Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:33:48.886Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:33:48.886Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:33:49.727Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:33:49.731Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:33:49.733Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:33:49.735Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:34:05.538Z | [REQUEST] | Incoming request | ReqId:ycymyqimc | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:34:05.540Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:ycymyqimc | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:34:05.546Z | [AUTH] | Admin authentication successful | ReqId:ycymyqimc | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:34:05.548Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:ycymyqimc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:34:05.569Z | [REQUEST] | Deck updated successfully by admin | ReqId:ycymyqimc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:34:05.572Z | [REQUEST] | Request completed | ReqId:ycymyqimc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:34ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:34:20.127Z | [REQUEST] | Incoming request | ReqId:gkyyo5yvb | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:34:20.129Z | [REQUEST] | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:gkyyo5yvb | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:34:20.133Z | [AUTH] | Authentication successful | ReqId:gkyyo5yvb | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:34:20.135Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:gkyyo5yvb | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T13:34:20.148Z | [REQUEST] | Deck retrieved successfully | ReqId:gkyyo5yvb | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T13:34:20.151Z | [REQUEST] | Request completed | ReqId:gkyyo5yvb | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:24ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-35-57-280Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-35-57-280Z.log deleted file mode 100644 index 0fbdae83..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-35-57-280Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:35:57.280Z -# Max entries per file: 10000 - -2025-09-15T13:35:59.213Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:35:59.236Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:35:59.236Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:36:00.116Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:36:00.120Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:36:00.121Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:36:00.123Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-36-43-572Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-36-43-572Z.log deleted file mode 100644 index 18826ddc..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-36-43-572Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:36:43.572Z -# Max entries per file: 10000 - -2025-09-15T13:36:45.317Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:36:45.340Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:36:45.340Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:36:46.218Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:36:46.223Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:36:46.225Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:36:46.227Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-37-16-542Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-37-16-542Z.log deleted file mode 100644 index c99b51d5..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-37-16-542Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:37:16.542Z -# Max entries per file: 10000 - -2025-09-15T13:37:18.339Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:37:18.356Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:37:18.356Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:37:19.242Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:37:19.246Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:37:19.248Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:37:19.250Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-37-32-547Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-37-32-547Z.log deleted file mode 100644 index 3ec28a99..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-37-32-547Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:37:32.547Z -# Max entries per file: 10000 - -2025-09-15T13:37:34.359Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:37:34.374Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:37:34.374Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:37:35.317Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:37:35.322Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:37:35.324Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:37:35.326Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:37:42.627Z | [REQUEST] | Incoming request | ReqId:i89tfam1y | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:37:42.630Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:i89tfam1y | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:37:42.638Z | [AUTH] | Authentication successful | ReqId:i89tfam1y | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:37:42.640Z | [REQUEST] | Update deck endpoint accessed | ReqId:i89tfam1y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:37:42.650Z | [ERROR] | Update deck endpoint error | ReqId:i89tfam1y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only Admin users can change deck state","stack":"Error: Only Admin users can change deck state\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:11:15)\n at /app/src/Api/routers/deckRouter.ts:149:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T13:37:42.653Z | [REQUEST] | Request completed | ReqId:i89tfam1y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:500 | Time:26ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-38-27-484Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-38-27-484Z.log deleted file mode 100644 index 27f2262e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-38-27-484Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:38:27.484Z -# Max entries per file: 10000 - -2025-09-15T13:38:29.204Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:38:29.219Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:38:29.219Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:38:30.102Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:38:30.106Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:38:30.108Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:38:30.109Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:38:33.406Z | [REQUEST] | Incoming request | ReqId:8cx4pvnqf | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:38:33.409Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:8cx4pvnqf | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:38:33.414Z | [AUTH] | Authentication successful | ReqId:8cx4pvnqf | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:38:33.416Z | [REQUEST] | Update deck endpoint accessed | ReqId:8cx4pvnqf | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:38:33.421Z | [ERROR] | Update deck endpoint error | ReqId:8cx4pvnqf | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only Admin users can change deck state","stack":"Error: Only Admin users can change deck state\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:11:15)\n at /app/src/Api/routers/deckRouter.ts:149:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T13:38:33.424Z | [REQUEST] | Request completed | ReqId:8cx4pvnqf | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:500 | Time:18ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-38-50-543Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-38-50-543Z.log deleted file mode 100644 index b3d080c3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-38-50-543Z.log +++ /dev/null @@ -1,28 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:38:50.543Z -# Max entries per file: 10000 - -2025-09-15T13:38:52.204Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:38:52.225Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:38:52.225Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:38:53.077Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:38:53.082Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:38:53.084Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:38:53.085Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:39:02.934Z | [REQUEST] | Incoming request | ReqId:25s3ninsz | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:02.936Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:25s3ninsz | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:02.941Z | [AUTH] | Authentication successful | ReqId:25s3ninsz | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:39:02.942Z | [REQUEST] | Update deck endpoint accessed | ReqId:25s3ninsz | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:39:02.948Z | [ERROR] | Update deck endpoint error | ReqId:25s3ninsz | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only admin users can change deck state","stack":"Error: Only admin users can change deck state\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:11:15)\n at /app/src/Api/routers/deckRouter.ts:149:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T13:39:02.951Z | [REQUEST] | Request completed | ReqId:25s3ninsz | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:403 | Time:17ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:14.176Z | [REQUEST] | Incoming request | ReqId:u2mn4na5w | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:14.178Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:u2mn4na5w | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:14.182Z | [AUTH] | Admin authentication successful | ReqId:u2mn4na5w | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:39:14.183Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:u2mn4na5w | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:39:14.196Z | [ERROR] | Admin update deck endpoint error | ReqId:u2mn4na5w | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"EntityPropertyNotFoundError","message":"Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.","stack":"EntityPropertyNotFoundError: Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.\n at /app/node_modules/src/query-builder/UpdateQueryBuilder.ts:500:31\n at Array.forEach ()\n at UpdateQueryBuilder.createUpdateExpression (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:493:68)\n at UpdateQueryBuilder.getQuery (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:53:21)\n at UpdateQueryBuilder.getQueryAndParameters (/app/node_modules/src/query-builder/QueryBuilder.ts:495:28)\n at UpdateQueryBuilder.execute (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:142:50)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async DeckRepository.update (/app/src/Infrastructure/Repository/DeckRepository.ts:91:9)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:21)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:39:14.198Z | [REQUEST] | Request completed | ReqId:u2mn4na5w | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:22ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:46.956Z | [REQUEST] | Incoming request | ReqId:9pokgr876 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:46.958Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:9pokgr876 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:39:46.962Z | [AUTH] | Admin authentication successful | ReqId:9pokgr876 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:39:46.964Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:9pokgr876 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:39:46.967Z | [ERROR] | Admin update deck endpoint error | ReqId:9pokgr876 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"EntityPropertyNotFoundError","message":"Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.","stack":"EntityPropertyNotFoundError: Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.\n at /app/node_modules/src/query-builder/UpdateQueryBuilder.ts:500:31\n at Array.forEach ()\n at UpdateQueryBuilder.createUpdateExpression (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:493:68)\n at UpdateQueryBuilder.getQuery (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:53:21)\n at UpdateQueryBuilder.getQueryAndParameters (/app/node_modules/src/query-builder/QueryBuilder.ts:495:28)\n at UpdateQueryBuilder.execute (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:142:50)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async DeckRepository.update (/app/src/Infrastructure/Repository/DeckRepository.ts:91:9)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:21)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:39:46.968Z | [REQUEST] | Request completed | ReqId:9pokgr876 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:12ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-40-06-108Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-40-06-108Z.log deleted file mode 100644 index 5ee9f3fd..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-40-06-108Z.log +++ /dev/null @@ -1,6 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:40:06.108Z -# Max entries per file: 10000 - -2025-09-15T13:40:08.010Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:40:08.028Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:40:08.028Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-40-23-157Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-40-23-157Z.log deleted file mode 100644 index 23c067e8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-40-23-157Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:40:23.157Z -# Max entries per file: 10000 - -2025-09-15T13:40:24.906Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:40:24.919Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:40:24.919Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:40:25.790Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:40:25.795Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:40:25.797Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:40:25.799Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:40:29.157Z | [REQUEST] | Incoming request | ReqId:nbyi7hf4b | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:40:29.159Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:nbyi7hf4b | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:40:29.164Z | [AUTH] | Admin authentication successful | ReqId:nbyi7hf4b | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:40:29.166Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:nbyi7hf4b | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:40:29.178Z | [ERROR] | Admin update deck endpoint error | ReqId:nbyi7hf4b | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"EntityPropertyNotFoundError","message":"Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.","stack":"EntityPropertyNotFoundError: Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.\n at /app/node_modules/src/query-builder/UpdateQueryBuilder.ts:500:31\n at Array.forEach ()\n at UpdateQueryBuilder.createUpdateExpression (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:493:68)\n at UpdateQueryBuilder.getQuery (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:53:21)\n at UpdateQueryBuilder.getQueryAndParameters (/app/node_modules/src/query-builder/QueryBuilder.ts:495:28)\n at UpdateQueryBuilder.execute (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:142:50)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async DeckRepository.update (/app/src/Infrastructure/Repository/DeckRepository.ts:91:9)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:21)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:40:29.181Z | [REQUEST] | Request completed | ReqId:nbyi7hf4b | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:24ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-41-20-719Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-41-20-719Z.log deleted file mode 100644 index fab51ca5..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-41-20-719Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:41:20.719Z -# Max entries per file: 10000 - -2025-09-15T13:41:22.434Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:41:22.447Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:41:22.447Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:41:23.335Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:41:23.341Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:41:23.343Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:41:23.345Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:41:36.092Z | [REQUEST] | Incoming request | ReqId:fjofmv6l7 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:41:36.095Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:fjofmv6l7 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:41:36.101Z | [AUTH] | Admin authentication successful | ReqId:fjofmv6l7 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:41:36.103Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:fjofmv6l7 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:41:36.118Z | [ERROR] | Admin update deck endpoint error | ReqId:fjofmv6l7 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"EntityPropertyNotFoundError","message":"Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.","stack":"EntityPropertyNotFoundError: Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.\n at /app/node_modules/src/query-builder/UpdateQueryBuilder.ts:500:31\n at Array.forEach ()\n at UpdateQueryBuilder.createUpdateExpression (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:493:68)\n at UpdateQueryBuilder.getQuery (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:53:21)\n at UpdateQueryBuilder.getQueryAndParameters (/app/node_modules/src/query-builder/QueryBuilder.ts:495:28)\n at UpdateQueryBuilder.execute (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:142:50)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async DeckRepository.update (/app/src/Infrastructure/Repository/DeckRepository.ts:91:9)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:21)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:41:36.121Z | [REQUEST] | Request completed | ReqId:fjofmv6l7 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:29ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-42-13-170Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-42-13-170Z.log deleted file mode 100644 index 472e77e2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-42-13-170Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:42:13.170Z -# Max entries per file: 10000 - -2025-09-15T13:42:15.156Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:42:15.172Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:42:15.172Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:42:16.074Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:42:16.078Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:42:16.080Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:42:16.082Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-42-25-322Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-42-25-322Z.log deleted file mode 100644 index d67cac7d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-42-25-322Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:42:25.322Z -# Max entries per file: 10000 - -2025-09-15T13:42:27.252Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:42:27.266Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:42:27.266Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:42:28.267Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:42:28.274Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:42:28.277Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:42:28.279Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-43-30-066Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-43-30-066Z.log deleted file mode 100644 index 0a618693..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-43-30-066Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:43:30.066Z -# Max entries per file: 10000 - -2025-09-15T13:43:31.768Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:43:31.781Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:43:31.781Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:43:32.780Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:43:32.788Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:43:32.791Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:43:32.793Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:44:15.844Z | [REQUEST] | Incoming request | ReqId:19eou213r | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:44:15.846Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:19eou213r | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:44:15.852Z | [AUTH] | Admin authentication successful | ReqId:19eou213r | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:44:15.854Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:19eou213r | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:44:15.885Z | [ERROR] | Admin update deck endpoint error | ReqId:19eou213r | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"EntityPropertyNotFoundError","message":"Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.","stack":"EntityPropertyNotFoundError: Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.\n at /app/node_modules/src/query-builder/UpdateQueryBuilder.ts:500:31\n at Array.forEach ()\n at UpdateQueryBuilder.createUpdateExpression (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:493:68)\n at UpdateQueryBuilder.getQuery (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:53:21)\n at UpdateQueryBuilder.getQueryAndParameters (/app/node_modules/src/query-builder/QueryBuilder.ts:495:28)\n at UpdateQueryBuilder.execute (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:142:50)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async DeckRepository.update (/app/src/Infrastructure/Repository/DeckRepository.ts:91:9)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:21)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:44:15.890Z | [REQUEST] | Request completed | ReqId:19eou213r | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:46ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-46-10-832Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-46-10-832Z.log deleted file mode 100644 index dd2db47e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-46-10-832Z.log +++ /dev/null @@ -1,28 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:46:10.832Z -# Max entries per file: 10000 - -2025-09-15T13:46:12.467Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:46:12.488Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:46:12.488Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:46:13.329Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:46:13.333Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:46:13.335Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:46:13.337Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:46:14.480Z | [REQUEST] | Incoming request | ReqId:824qa6tun | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:14.482Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:824qa6tun | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:14.488Z | [AUTH] | Admin authentication successful | ReqId:824qa6tun | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:46:14.490Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:824qa6tun | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:46:14.500Z | [REQUEST] | Deck updated successfully by admin | ReqId:824qa6tun | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:46:14.503Z | [REQUEST] | Request completed | ReqId:824qa6tun | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:23ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:24.088Z | [REQUEST] | Incoming request | ReqId:7692alx1r | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:24.090Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:7692alx1r | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:24.093Z | [AUTH] | Admin authentication successful | ReqId:7692alx1r | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:46:24.095Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:7692alx1r | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:46:24.099Z | [REQUEST] | Admin deck retrieved successfully | ReqId:7692alx1r | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T13:46:24.101Z | [REQUEST] | Request completed | ReqId:7692alx1r | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:13ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:31.366Z | [REQUEST] | Incoming request | ReqId:c8cxyi5g1 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:31.369Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:c8cxyi5g1 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:46:31.372Z | [AUTH] | Admin authentication successful | ReqId:c8cxyi5g1 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:46:31.374Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:c8cxyi5g1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:46:31.382Z | [REQUEST] | Deck updated successfully by admin | ReqId:c8cxyi5g1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T13:46:31.384Z | [REQUEST] | Request completed | ReqId:c8cxyi5g1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:18ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-47-09-198Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-47-09-198Z.log deleted file mode 100644 index a10eeb7f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-47-09-198Z.log +++ /dev/null @@ -1,16 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:47:09.198Z -# Max entries per file: 10000 - -2025-09-15T13:47:10.972Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:47:10.985Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:47:10.985Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:47:11.830Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:47:11.835Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:47:11.836Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:47:11.838Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:47:19.528Z | [REQUEST] | Incoming request | ReqId:2796zm2nk | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:47:19.530Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:2796zm2nk | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:47:19.536Z | [AUTH] | Admin authentication successful | ReqId:2796zm2nk | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:47:19.538Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:2796zm2nk | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:47:19.554Z | [ERROR] | Admin update deck endpoint error | ReqId:2796zm2nk | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"EntityPropertyNotFoundError","message":"Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.","stack":"EntityPropertyNotFoundError: Property \"userstate\" was not found in \"DeckAggregate\". Make sure your query is correct.\n at /app/node_modules/src/query-builder/UpdateQueryBuilder.ts:500:31\n at Array.forEach ()\n at UpdateQueryBuilder.createUpdateExpression (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:493:68)\n at UpdateQueryBuilder.getQuery (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:53:21)\n at UpdateQueryBuilder.getQueryAndParameters (/app/node_modules/src/query-builder/QueryBuilder.ts:495:28)\n at UpdateQueryBuilder.execute (/app/node_modules/src/query-builder/UpdateQueryBuilder.ts:142:50)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async DeckRepository.update (/app/src/Infrastructure/Repository/DeckRepository.ts:91:9)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:14:22)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:47:19.558Z | [REQUEST] | Request completed | ReqId:2796zm2nk | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:30ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-52-36-580Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-52-36-580Z.log deleted file mode 100644 index f03c041e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-52-36-580Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:52:36.580Z -# Max entries per file: 10000 - -2025-09-15T13:52:38.386Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:52:38.405Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:52:38.405Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:52:39.350Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:52:39.356Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:52:39.358Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:52:39.361Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-53-08-111Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-53-08-111Z.log deleted file mode 100644 index 7a6d62d0..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-53-08-111Z.log +++ /dev/null @@ -1,40 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:53:08.111Z -# Max entries per file: 10000 - -2025-09-15T13:53:09.775Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:53:09.789Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:53:09.789Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:53:10.592Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:53:10.597Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:53:10.599Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:53:10.600Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:53:15.284Z | [REQUEST] | Incoming request | ReqId:pkn3kcox4 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:15.286Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:pkn3kcox4 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:15.292Z | [AUTH] | Admin authentication successful | ReqId:pkn3kcox4 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:53:15.294Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:pkn3kcox4 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:53:15.313Z | [ERROR] | Admin update deck endpoint error | ReqId:pkn3kcox4 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:25:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:53:15.318Z | [REQUEST] | Request completed | ReqId:pkn3kcox4 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:34ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:17.396Z | [REQUEST] | Incoming request | ReqId:bvfgp2wa8 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:17.399Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:bvfgp2wa8 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:17.402Z | [AUTH] | Admin authentication successful | ReqId:bvfgp2wa8 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:53:17.404Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:bvfgp2wa8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:53:17.410Z | [ERROR] | Admin update deck endpoint error | ReqId:bvfgp2wa8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:25:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:53:17.412Z | [REQUEST] | Request completed | ReqId:bvfgp2wa8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:16ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:21.269Z | [REQUEST] | Incoming request | ReqId:ry801ym1c | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:21.271Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:ry801ym1c | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:21.274Z | [AUTH] | Admin authentication successful | ReqId:ry801ym1c | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:53:21.276Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:ry801ym1c | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:53:21.283Z | [ERROR] | Admin update deck endpoint error | ReqId:ry801ym1c | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:25:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T13:53:21.285Z | [REQUEST] | Request completed | ReqId:ry801ym1c | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:16ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:32.751Z | [REQUEST] | Incoming request | ReqId:nw3221p2p | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:32.753Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:nw3221p2p | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:53:32.757Z | [AUTH] | Authentication successful | ReqId:nw3221p2p | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:53:32.759Z | [REQUEST] | Update deck endpoint accessed | ReqId:nw3221p2p | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T13:53:32.762Z | [ERROR] | Update deck endpoint error | ReqId:nw3221p2p | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only admin users can change deck state","stack":"Error: Only admin users can change deck state\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:12:15)\n at /app/src/Api/routers/deckRouter.ts:149:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T13:53:32.764Z | [REQUEST] | Request completed | ReqId:nw3221p2p | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:403 | Time:13ms | UA:PostmanRuntime/7.45.0 -2025-09-15T13:54:02.097Z | [REQUEST] | Incoming request | ReqId:a4m6eeo8u | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:54:02.099Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:a4m6eeo8u | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:54:02.106Z | [AUTH] | Authentication successful | ReqId:a4m6eeo8u | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:54:02.108Z | [REQUEST] | Update deck endpoint accessed | ReqId:a4m6eeo8u | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T13:54:02.125Z | [ERROR] | Update deck endpoint error | ReqId:a4m6eeo8u | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:25:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T13:54:02.128Z | [REQUEST] | Request completed | ReqId:a4m6eeo8u | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:31ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-55-34-710Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-55-34-710Z.log deleted file mode 100644 index fe55b317..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-55-34-710Z.log +++ /dev/null @@ -1,18 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:55:34.710Z -# Max entries per file: 10000 - -2025-09-15T13:55:36.542Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:55:36.554Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:55:36.554Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:55:37.371Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:55:37.375Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:55:37.377Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:55:37.379Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:55:41.549Z | [REQUEST] | Incoming request | ReqId:jydpdfy8s | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:55:41.552Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:jydpdfy8s | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:55:41.558Z | [AUTH] | Authentication successful | ReqId:jydpdfy8s | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:55:41.561Z | [REQUEST] | Update deck endpoint accessed | ReqId:jydpdfy8s | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T13:55:41.575Z | [ERROR] | Deck not found for update: 956870b1-c437-4591-98b3-0742dd63b77d -2025-09-15T13:55:41.583Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:27:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T13:55:41.585Z | [ERROR] | Update deck endpoint error | ReqId:jydpdfy8s | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:27:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T13:55:41.587Z | [REQUEST] | Request completed | ReqId:jydpdfy8s | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:38ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-57-30-059Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-57-30-059Z.log deleted file mode 100644 index 44a01e24..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-57-30-059Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:57:30.059Z -# Max entries per file: 10000 - -2025-09-15T13:57:31.929Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:57:31.954Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:57:31.954Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:57:32.926Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:57:32.932Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:57:32.934Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:57:32.937Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-58-15-430Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-58-15-430Z.log deleted file mode 100644 index 028c97ca..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-58-15-430Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:58:15.430Z -# Max entries per file: 10000 - -2025-09-15T13:58:17.294Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:58:17.308Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:58:17.308Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:58:18.172Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:58:18.177Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:58:18.179Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:58:18.182Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-58-29-102Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-58-29-102Z.log deleted file mode 100644 index c532dc5f..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-58-29-102Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:58:29.102Z -# Max entries per file: 10000 - -2025-09-15T13:58:31.213Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:58:31.229Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:58:31.229Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:58:32.122Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:58:32.127Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:58:32.129Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:58:32.132Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-59-00-196Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-59-00-196Z.log deleted file mode 100644 index f4ce9cdd..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T13-59-00-196Z.log +++ /dev/null @@ -1,18 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T13:59:00.196Z -# Max entries per file: 10000 - -2025-09-15T13:59:01.866Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T13:59:01.880Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T13:59:01.880Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T13:59:02.699Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T13:59:02.704Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T13:59:02.706Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T13:59:02.709Z | [STARTUP] | Redis client connected successfully -2025-09-15T13:59:13.315Z | [REQUEST] | Incoming request | ReqId:7t55k5c5a | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T13:59:13.318Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:7t55k5c5a | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T13:59:13.326Z | [AUTH] | Authentication successful | ReqId:7t55k5c5a | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T13:59:13.328Z | [REQUEST] | Update deck endpoint accessed | ReqId:7t55k5c5a | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T13:59:13.347Z | [ERROR] | Deck not found with ID: 956870b1-c437-4591-98b3-0742dd63b77d -2025-09-15T13:59:13.354Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T13:59:13.356Z | [ERROR] | Update deck endpoint error | ReqId:7t55k5c5a | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T13:59:13.360Z | [REQUEST] | Request completed | ReqId:7t55k5c5a | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:45ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-00-25-368Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-00-25-368Z.log deleted file mode 100644 index c0f0da92..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-00-25-368Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:00:25.368Z -# Max entries per file: 10000 - -2025-09-15T14:00:27.376Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:00:27.390Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:00:27.390Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:00:28.257Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:00:28.262Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:00:28.264Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:00:28.266Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-00-50-228Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-00-50-228Z.log deleted file mode 100644 index 8528777d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-00-50-228Z.log +++ /dev/null @@ -1,84 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:00:50.228Z -# Max entries per file: 10000 - -2025-09-15T14:00:52.016Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:00:52.038Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:00:52.038Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:00:52.919Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:00:52.924Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:00:52.926Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:00:52.935Z | [REQUEST] | Incoming request | ReqId:uwpdhqsrh | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:00:52.938Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:uwpdhqsrh | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:00:52.941Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:00:52.947Z | [AUTH] | Authentication successful | ReqId:uwpdhqsrh | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:00:52.949Z | [REQUEST] | Update deck endpoint accessed | ReqId:uwpdhqsrh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:00:52.966Z | [ERROR] | Deck update failed for ID: 956870b1-c437-4591-98b3-0742dd63b77d. Update returned null. -2025-09-15T14:00:52.972Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:38:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:00:52.974Z | [ERROR] | Update deck endpoint error | ReqId:uwpdhqsrh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:38:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:00:52.976Z | [REQUEST] | Request completed | ReqId:uwpdhqsrh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:500 | Time:41ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:13.948Z | [REQUEST] | Incoming request | ReqId:6v41uuwjh | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:13.951Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:6v41uuwjh | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:13.955Z | [AUTH] | Admin authentication successful | ReqId:6v41uuwjh | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:01:13.957Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:6v41uuwjh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T14:01:13.983Z | [REQUEST] | Deck updated successfully by admin | ReqId:6v41uuwjh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:01:13.986Z | [REQUEST] | Request completed | ReqId:6v41uuwjh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:38ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:19.371Z | [REQUEST] | Incoming request | ReqId:d0w54y49d | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:19.373Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:d0w54y49d | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:19.376Z | [AUTH] | Admin authentication successful | ReqId:d0w54y49d | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:01:19.378Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:d0w54y49d | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T14:01:19.389Z | [REQUEST] | Deck updated successfully by admin | ReqId:d0w54y49d | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:01:19.392Z | [REQUEST] | Request completed | ReqId:d0w54y49d | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:21ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:25.642Z | [REQUEST] | Incoming request | ReqId:vo2kzhgxr | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:25.644Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:vo2kzhgxr | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:25.647Z | [AUTH] | Authentication successful | ReqId:vo2kzhgxr | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:01:25.649Z | [REQUEST] | Update deck endpoint accessed | ReqId:vo2kzhgxr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T14:01:25.653Z | [ERROR] | Update deck endpoint error | ReqId:vo2kzhgxr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only admin users can change deck state","stack":"Error: Only admin users can change deck state\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:15)\n at /app/src/Api/routers/deckRouter.ts:149:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T14:01:25.655Z | [REQUEST] | Request completed | ReqId:vo2kzhgxr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:403 | Time:13ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:29.183Z | [REQUEST] | Incoming request | ReqId:9cdvwk747 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:29.186Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:9cdvwk747 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:29.189Z | [AUTH] | Authentication successful | ReqId:9cdvwk747 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:01:29.191Z | [REQUEST] | Update deck endpoint accessed | ReqId:9cdvwk747 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T14:01:29.193Z | [ERROR] | Update deck endpoint error | ReqId:9cdvwk747 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only admin users can change deck state","stack":"Error: Only admin users can change deck state\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:13:15)\n at /app/src/Api/routers/deckRouter.ts:149:59\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T14:01:29.195Z | [REQUEST] | Request completed | ReqId:9cdvwk747 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:403 | Time:12ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:35.418Z | [REQUEST] | Incoming request | ReqId:3bmz0pm86 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:35.420Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:3bmz0pm86 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:35.424Z | [AUTH] | Admin authentication successful | ReqId:3bmz0pm86 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:01:35.425Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:3bmz0pm86 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T14:01:35.442Z | [REQUEST] | Deck updated successfully by admin | ReqId:3bmz0pm86 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:01:35.444Z | [REQUEST] | Request completed | ReqId:3bmz0pm86 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:26ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:52.908Z | [REQUEST] | Incoming request | ReqId:3r824evf5 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:52.909Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:3r824evf5 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:01:52.913Z | [AUTH] | Admin authentication successful | ReqId:3r824evf5 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:01:52.914Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:3r824evf5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:01:52.929Z | [REQUEST] | Deck updated successfully by admin | ReqId:3r824evf5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:01:52.931Z | [REQUEST] | Request completed | ReqId:3r824evf5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:23ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:03.386Z | [REQUEST] | Incoming request | ReqId:dxhgpyi2j | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:03.388Z | [REQUEST] | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:dxhgpyi2j | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:03.391Z | [AUTH] | Authentication successful | ReqId:dxhgpyi2j | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:02:03.393Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:dxhgpyi2j | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T14:02:03.405Z | [REQUEST] | Deck retrieved successfully | ReqId:dxhgpyi2j | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T14:02:03.407Z | [REQUEST] | Request completed | ReqId:dxhgpyi2j | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:21ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:08.569Z | [REQUEST] | Incoming request | ReqId:qojfsuzvf | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:08.571Z | [REQUEST] | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:qojfsuzvf | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:08.575Z | [AUTH] | Authentication successful | ReqId:qojfsuzvf | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:02:08.577Z | [REQUEST] | Soft delete deck endpoint accessed | ReqId:qojfsuzvf | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:02:08.583Z | [REQUEST] | Deck soft delete successful | ReqId:qojfsuzvf | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","success":true} -2025-09-15T14:02:08.585Z | [REQUEST] | Request completed | ReqId:qojfsuzvf | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | DELETE /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:16ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:13.668Z | [REQUEST] | Incoming request | ReqId:3f4xjqhu7 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:13.671Z | [REQUEST] | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:3f4xjqhu7 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:13.674Z | [AUTH] | Authentication successful | ReqId:3f4xjqhu7 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:02:13.676Z | [REQUEST] | Get deck by id endpoint accessed | ReqId:3f4xjqhu7 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T14:02:13.680Z | [WARNING] | Deck not found | ReqId:3f4xjqhu7 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d"} -2025-09-15T14:02:13.682Z | [REQUEST] | Request completed | ReqId:3f4xjqhu7 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:14ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:20.042Z | [REQUEST] | Incoming request | ReqId:duqed9hz5 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:20.044Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:duqed9hz5 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:20.047Z | [AUTH] | Admin authentication successful | ReqId:duqed9hz5 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:02:20.049Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:duqed9hz5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T14:02:20.052Z | [WARNING] | Deck not found | ReqId:duqed9hz5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":false} -2025-09-15T14:02:20.054Z | [REQUEST] | Request completed | ReqId:duqed9hz5 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:12ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:24.423Z | [REQUEST] | Incoming request | ReqId:lchgi1z85 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:24.425Z | [REQUEST] | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:lchgi1z85 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:02:24.429Z | [AUTH] | Admin authentication successful | ReqId:lchgi1z85 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:02:24.430Z | [REQUEST] | Admin get deck by id endpoint accessed | ReqId:lchgi1z85 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":true} -2025-09-15T14:02:24.434Z | [REQUEST] | Admin deck retrieved successfully | ReqId:lchgi1z85 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","includeDeleted":true} -2025-09-15T14:02:24.436Z | [REQUEST] | Request completed | ReqId:lchgi1z85 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | Time:13ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-04-00-322Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-04-00-322Z.log deleted file mode 100644 index 9b23cd0c..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-04-00-322Z.log +++ /dev/null @@ -1,50 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:04:00.322Z -# Max entries per file: 10000 - -2025-09-15T14:04:02.233Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:04:02.253Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:04:02.253Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:04:03.091Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:04:03.095Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:04:03.097Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:04:03.099Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:04:05.323Z | [REQUEST] | Incoming request | ReqId:bqa20veh2 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:05.326Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:bqa20veh2 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:05.331Z | [AUTH] | Authentication successful | ReqId:bqa20veh2 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:04:05.333Z | [REQUEST] | Update deck endpoint accessed | ReqId:bqa20veh2 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:04:05.341Z | [ERROR] | Deck not found with ID: 956870b1-c437-4591-98b3-0742dd63b77d -2025-09-15T14:04:05.347Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:24:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:04:05.348Z | [ERROR] | Update deck endpoint error | ReqId:bqa20veh2 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:24:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:04:05.351Z | [REQUEST] | Request completed | ReqId:bqa20veh2 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:404 | Time:28ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:15.756Z | [REQUEST] | Incoming request | ReqId:iz3c4zkv8 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:15.758Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:iz3c4zkv8 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:15.761Z | [AUTH] | Admin authentication successful | ReqId:iz3c4zkv8 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:04:15.763Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:iz3c4zkv8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:04:15.780Z | [ERROR] | Deck update failed for ID: 956870b1-c437-4591-98b3-0742dd63b77d. Update returned null. -2025-09-15T14:04:15.783Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:04:15.784Z | [ERROR] | Admin update deck endpoint error | ReqId:iz3c4zkv8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:04:15.786Z | [REQUEST] | Request completed | ReqId:iz3c4zkv8 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d?includeDeleted=true | Status:500 | Time:30ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:21.722Z | [REQUEST] | Incoming request | ReqId:cjfulch9p | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:21.724Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:cjfulch9p | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:21.728Z | [AUTH] | Admin authentication successful | ReqId:cjfulch9p | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:04:21.730Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:cjfulch9p | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:04:21.738Z | [ERROR] | Deck update failed for ID: 956870b1-c437-4591-98b3-0742dd63b77d. Update returned null. -2025-09-15T14:04:21.740Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:04:21.742Z | [ERROR] | Admin update deck endpoint error | ReqId:cjfulch9p | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:04:21.744Z | [REQUEST] | Request completed | ReqId:cjfulch9p | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:500 | Time:22ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:55.777Z | [REQUEST] | Incoming request | ReqId:c0joko691 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:55.779Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:c0joko691 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:04:55.783Z | [AUTH] | Admin authentication successful | ReqId:c0joko691 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:04:55.785Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:c0joko691 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:04:55.807Z | [ERROR] | Deck update failed for ID: 956870b1-c437-4591-98b3-0742dd63b77d. Update returned null. -2025-09-15T14:04:55.810Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:04:55.811Z | [ERROR] | Admin update deck endpoint error | ReqId:c0joko691 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:04:55.813Z | [REQUEST] | Request completed | ReqId:c0joko691 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:500 | Time:36ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:05:37.508Z | [REQUEST] | Incoming request | ReqId:lc4uixrb0 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:05:37.510Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:lc4uixrb0 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:05:37.513Z | [AUTH] | Admin authentication successful | ReqId:lc4uixrb0 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:05:37.515Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:lc4uixrb0 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:05:37.529Z | [ERROR] | Deck update failed for ID: 956870b1-c437-4591-98b3-0742dd63b77d. Update returned null. -2025-09-15T14:05:37.532Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:05:37.533Z | [ERROR] | Admin update deck endpoint error | ReqId:lc4uixrb0 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Failed to update deck","stack":"Error: Failed to update deck\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:42:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/adminRouter.ts:367:24"} -2025-09-15T14:05:37.535Z | [REQUEST] | Request completed | ReqId:lc4uixrb0 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:500 | Time:27ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-07-17-372Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-07-17-372Z.log deleted file mode 100644 index 06fa03b8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-07-17-372Z.log +++ /dev/null @@ -1,62 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:07:17.372Z -# Max entries per file: 10000 - -2025-09-15T14:07:19.126Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:07:19.141Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:07:19.140Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:07:20.119Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:07:20.124Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:07:20.126Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:07:20.129Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:07:23.712Z | [REQUEST] | Incoming request | ReqId:oml0ssvgu | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:23.714Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:oml0ssvgu | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:23.720Z | [AUTH] | Admin authentication successful | ReqId:oml0ssvgu | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:07:23.722Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:oml0ssvgu | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:07:23.738Z | [REQUEST] | Deck updated successfully by admin | ReqId:oml0ssvgu | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:07:23.742Z | [REQUEST] | Request completed | ReqId:oml0ssvgu | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:30ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:29.084Z | [REQUEST] | Incoming request | ReqId:644rrks7q | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:29.087Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:644rrks7q | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:29.090Z | [AUTH] | Admin authentication successful | ReqId:644rrks7q | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:07:29.092Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:644rrks7q | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:07:29.099Z | [REQUEST] | Deck updated successfully by admin | ReqId:644rrks7q | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:07:29.101Z | [REQUEST] | Request completed | ReqId:644rrks7q | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:17ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:38.036Z | [REQUEST] | Incoming request | ReqId:w3whhnig1 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:38.038Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:w3whhnig1 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:38.042Z | [AUTH] | Authentication successful | ReqId:w3whhnig1 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:07:38.043Z | [REQUEST] | Update deck endpoint accessed | ReqId:w3whhnig1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:07:38.047Z | [ERROR] | Deck not found with ID: 956870b1-c437-4591-98b3-0742dd63b77d -2025-09-15T14:07:38.053Z | [ERROR] | Error updating deck: 956870b1-c437-4591-98b3-0742dd63b77d | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:24:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:07:38.055Z | [ERROR] | Update deck endpoint error | ReqId:w3whhnig1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Deck not found","stack":"Error: Deck not found\n at UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:24:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:07:38.057Z | [REQUEST] | Request completed | ReqId:w3whhnig1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:404 | Time:21ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:53.707Z | [REQUEST] | Incoming request | ReqId:mn141hd3l | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:53.710Z | [REQUEST] | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:mn141hd3l | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:07:53.715Z | [AUTH] | Admin authentication successful | ReqId:mn141hd3l | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:07:53.718Z | [REQUEST] | Admin update deck endpoint accessed | ReqId:mn141hd3l | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["state"]} -2025-09-15T14:07:53.742Z | [REQUEST] | Deck updated successfully by admin | ReqId:mn141hd3l | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","adminUserId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:07:53.745Z | [REQUEST] | Request completed | ReqId:mn141hd3l | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/admin/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:38ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:08:09.622Z | [REQUEST] | Incoming request | ReqId:ukwwyliqj | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:08:09.624Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:ukwwyliqj | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:08:09.628Z | [AUTH] | Authentication successful | ReqId:ukwwyliqj | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:08:09.629Z | [REQUEST] | Update deck endpoint accessed | ReqId:ukwwyliqj | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:08:09.646Z | [REQUEST] | Deck updated successfully | ReqId:ukwwyliqj | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:08:09.648Z | [REQUEST] | Request completed | ReqId:ukwwyliqj | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:26ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:08:13.912Z | [REQUEST] | Incoming request | ReqId:dyi0jfwzx | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 -2025-09-15T14:08:13.914Z | [REQUEST] | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | ReqId:dyi0jfwzx | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:08:13.918Z | [AUTH] | Authentication successful | ReqId:dyi0jfwzx | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:08:13.920Z | [REQUEST] | Update deck endpoint accessed | ReqId:dyi0jfwzx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:08:13.927Z | [REQUEST] | Deck updated successfully | ReqId:dyi0jfwzx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"956870b1-c437-4591-98b3-0742dd63b77d","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:08:13.930Z | [REQUEST] | Request completed | ReqId:dyi0jfwzx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/956870b1-c437-4591-98b3-0742dd63b77d | Status:200 | Time:18ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:09:42.709Z | [REQUEST] | Incoming request | ReqId:bc8j44uc1 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | UA:PostmanRuntime/7.45.0 -2025-09-15T14:09:42.711Z | [REQUEST] | PATCH /api/decks/search | ReqId:bc8j44uc1 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:09:42.714Z | [AUTH] | Authentication successful | ReqId:bc8j44uc1 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:09:42.716Z | [REQUEST] | Update deck endpoint accessed | ReqId:bc8j44uc1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"search","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:09:42.755Z | [ERROR] | Error updating deck: search | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:09:42.757Z | [ERROR] | Update deck endpoint error | ReqId:bc8j44uc1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:09:42.761Z | [REQUEST] | Request completed | ReqId:bc8j44uc1 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:500 | Time:52ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:10:17.370Z | [REQUEST] | Incoming request | ReqId:8tsocbx8x | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | UA:PostmanRuntime/7.45.0 -2025-09-15T14:10:17.372Z | [REQUEST] | PATCH /api/decks/search | ReqId:8tsocbx8x | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:10:17.375Z | [AUTH] | Authentication successful | ReqId:8tsocbx8x | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:10:17.376Z | [REQUEST] | Update deck endpoint accessed | ReqId:8tsocbx8x | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"search","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:10:17.388Z | [ERROR] | Error updating deck: search | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:10:17.390Z | [ERROR] | Update deck endpoint error | ReqId:8tsocbx8x | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:10:17.391Z | [REQUEST] | Request completed | ReqId:8tsocbx8x | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search | Status:500 | Time:21ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-10-55-000Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-10-55-000Z.log deleted file mode 100644 index 895d0541..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-10-55-000Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:10:55.000Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-11-12-385Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-11-12-385Z.log deleted file mode 100644 index 25196349..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-11-12-385Z.log +++ /dev/null @@ -1,24 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:11:12.385Z -# Max entries per file: 10000 - -2025-09-15T14:11:14.064Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:11:14.078Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:11:14.078Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:11:14.915Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:11:14.919Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:11:14.921Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:11:14.923Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:13:35.446Z | [REQUEST] | Incoming request | ReqId:n5sgzj0gd | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:13:35.448Z | [REQUEST] | PATCH /api/decks/search | ReqId:n5sgzj0gd | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:13:35.455Z | [AUTH] | Authentication successful | ReqId:n5sgzj0gd | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:13:35.457Z | [REQUEST] | Update deck endpoint accessed | ReqId:n5sgzj0gd | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"search","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:13:35.510Z | [ERROR] | Error updating deck: search | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:13:35.513Z | [ERROR] | Update deck endpoint error | ReqId:n5sgzj0gd | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:13:35.516Z | [REQUEST] | Request completed | ReqId:n5sgzj0gd | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:500 | Time:70ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:15:43.337Z | [REQUEST] | Incoming request | ReqId:qrky9dlab | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:15:43.339Z | [REQUEST] | PATCH /api/decks/search | ReqId:qrky9dlab | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:15:43.342Z | [AUTH] | Authentication successful | ReqId:qrky9dlab | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:15:43.343Z | [REQUEST] | Update deck endpoint accessed | ReqId:qrky9dlab | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"search","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["name"]} -2025-09-15T14:15:43.353Z | [ERROR] | Error updating deck: search | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:15:43.355Z | [ERROR] | Update deck endpoint error | ReqId:qrky9dlab | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"QueryFailedError","message":"invalid input syntax for type uuid: \"search\"","stack":"QueryFailedError: invalid input syntax for type uuid: \"search\"\n at PostgresQueryRunner.query (/app/node_modules/typeorm/src/driver/postgres/PostgresQueryRunner.ts:325:19)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async SelectQueryBuilder.loadRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3863:25)\n at async SelectQueryBuilder.executeEntitiesAndRawResults (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:3609:26)\n at async SelectQueryBuilder.getRawAndEntities (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1671:29)\n at async SelectQueryBuilder.getOne (/app/node_modules/src/query-builder/SelectQueryBuilder.ts:1698:25)\n at async UpdateDeckCommandHandler.execute (/app/src/Application/Deck/commands/UpdateDeckCommandHandler.ts:20:28)\n at async /app/src/Api/routers/deckRouter.ts:149:18"} -2025-09-15T14:15:43.357Z | [REQUEST] | Request completed | ReqId:qrky9dlab | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=0&offset=0 | Status:500 | Time:20ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-16-20-713Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-16-20-713Z.log deleted file mode 100644 index 9be07e05..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-16-20-713Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:16:20.713Z -# Max entries per file: 10000 - -2025-09-15T14:16:22.529Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:16:22.542Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:16:22.542Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:16:23.475Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:16:23.480Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:16:23.482Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:16:23.484Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-16-32-534Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-16-32-534Z.log deleted file mode 100644 index 167e1a96..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-16-32-534Z.log +++ /dev/null @@ -1,5861 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:16:32.534Z -# Max entries per file: 10000 - -2025-09-15T14:16:34.286Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:16:34.299Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:16:34.299Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:16:35.366Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:16:35.370Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:16:35.372Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:16:35.374Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:16:42.793Z | [REQUEST] | Incoming request | ReqId:ju9erlg4y | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=2&offset=0 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:16:42.795Z | [REQUEST] | GET /api/decks/search | ReqId:ju9erlg4y | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=2&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:16:42.800Z | [AUTH] | Authentication successful | ReqId:ju9erlg4y | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=2&offset=0 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:16:42.802Z | [REQUEST] | Search decks endpoint accessed | ReqId:ju9erlg4y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=2&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"query":"Card","limit":"2","offset":"0"} -2025-09-15T14:16:42.816Z | [DATABASE] | Deck search completed | Meta:{"query":"executionTime: 12ms, found: 2, total: 3, searchTerm: \"Card\", limit: 2, offset: 0"} -2025-09-15T14:16:42.818Z | [REQUEST] | Deck search completed successfully | ReqId:ju9erlg4y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=2&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"query":"Card","resultCount":0} -2025-09-15T14:16:42.820Z | [REQUEST] | Request completed | ReqId:ju9erlg4y | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=2&offset=0 | Status:200 | Time:27ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:16:50.057Z | [REQUEST] | Incoming request | ReqId:usmkumjuc | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:16:50.060Z | [REQUEST] | GET /api/decks/search | ReqId:usmkumjuc | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:16:50.063Z | [AUTH] | Authentication successful | ReqId:usmkumjuc | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:16:50.064Z | [REQUEST] | Search decks endpoint accessed | ReqId:usmkumjuc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"query":"Card","limit":"3","offset":"0"} -2025-09-15T14:16:50.069Z | [DATABASE] | Deck search completed | Meta:{"query":"executionTime: 3ms, found: 3, total: 3, searchTerm: \"Card\", limit: 3, offset: 0"} -2025-09-15T14:16:50.070Z | [REQUEST] | Deck search completed successfully | ReqId:usmkumjuc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"query":"Card","resultCount":0} -2025-09-15T14:16:50.072Z | [REQUEST] | Request completed | ReqId:usmkumjuc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | Time:15ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:17:34.422Z | [REQUEST] | Incoming request | ReqId:ztoywwga9 | IP:::ffff:172.20.0.1 | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:17:34.425Z | [REQUEST] | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | ReqId:ztoywwga9 | IP:::ffff:172.20.0.1 | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:17:34.429Z | [AUTH] | Authentication successful | ReqId:ztoywwga9 | IP:::ffff:172.20.0.1 | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:17:34.431Z | [REQUEST] | Update deck endpoint accessed | ReqId:ztoywwga9 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"2fd99236-7748-4662-af37-2c8d17af4313","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","updateFields":["type"]} -2025-09-15T14:17:34.453Z | [REQUEST] | Deck updated successfully | ReqId:ztoywwga9 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"deckId":"2fd99236-7748-4662-af37-2c8d17af4313","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:17:34.455Z | [REQUEST] | Request completed | ReqId:ztoywwga9 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/2fd99236-7748-4662-af37-2c8d17af4313 | Status:200 | Time:33ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:18:07.733Z | [REQUEST] | Incoming request | ReqId:6ddmhvc7b | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=3&offset=0 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:18:07.735Z | [REQUEST] | PATCH /api/decks/search | ReqId:6ddmhvc7b | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:18:07.738Z | [AUTH] | Authentication successful | ReqId:6ddmhvc7b | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=3&offset=0 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:18:07.745Z | [ERROR] | Update deck endpoint error | ReqId:6ddmhvc7b | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"TypeError","message":"Cannot convert undefined or null to object","stack":"TypeError: Cannot convert undefined or null to object\n at Function.keys ()\n at /app/src/Api/routers/deckRouter.ts:147:96\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T14:18:07.749Z | [REQUEST] | Request completed | ReqId:6ddmhvc7b | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | PATCH /api/decks/search?query=Card&limit=3&offset=0 | Status:500 | Time:16ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:18:18.854Z | [REQUEST] | Incoming request | ReqId:h34z3irlr | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:18:18.856Z | [REQUEST] | GET /api/decks/search | ReqId:h34z3irlr | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:18:18.859Z | [AUTH] | Authentication successful | ReqId:h34z3irlr | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:18:18.861Z | [REQUEST] | Search decks endpoint accessed | ReqId:h34z3irlr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"query":"Card","limit":"3","offset":"0"} -2025-09-15T14:18:18.875Z | [DATABASE] | Deck search completed | Meta:{"query":"executionTime: 13ms, found: 3, total: 3, searchTerm: \"Card\", limit: 3, offset: 0"} -2025-09-15T14:18:18.877Z | [REQUEST] | Deck search completed successfully | ReqId:h34z3irlr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"query":"Card","resultCount":0} -2025-09-15T14:18:18.881Z | [REQUEST] | Request completed | ReqId:h34z3irlr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | GET /api/decks/search?query=Card&limit=3&offset=0 | Status:200 | Time:27ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:23.961Z | [REQUEST] | Incoming request | ReqId:2k5rrod2v | IP:::ffff:172.20.0.1 | GET /api/games/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:23.963Z | [REQUEST] | GET /api/games/start | ReqId:2k5rrod2v | IP:::ffff:172.20.0.1 | GET /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:23.965Z | [REQUEST] | Request completed | ReqId:2k5rrod2v | IP:::ffff:172.20.0.1 | GET /api/games/start | Status:404 | Time:4ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:31.022Z | [REQUEST] | Incoming request | ReqId:8gzkh7jfd | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:31.023Z | [REQUEST] | POST /api/games/start | ReqId:8gzkh7jfd | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:31.027Z | [AUTH] | Authentication successful | ReqId:8gzkh7jfd | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:20:31.029Z | [REQUEST] | Start game endpoint accessed | ReqId:8gzkh7jfd | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":"","deckCount":3,"maxplayers":1,"logintype":0} -2025-09-15T14:20:31.031Z | [OTHER] | GameService.startGame called | Meta:{"deckCount":3,"maxplayers":1,"logintype":0,"userid":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgid":""} -2025-09-15T14:20:31.036Z | [ERROR] | GameService.startGame failed | Meta:{"name":"Error","message":"Maximum players must be at least 2","stack":"Error: Maximum players must be at least 2\n at GameService.validateStartGameInput (/app/src/Application/Game/GameService.ts:250:19)\n at GameService.startGame (/app/src/Application/Game/GameService.ts:48:18)\n at /app/src/Api/routers/gameRouter.ts:40:50\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T14:20:31.038Z | [OTHER] | Game start failed | Meta:{"executionTime":2,"error":"Maximum players must be at least 2"} -2025-09-15T14:20:31.041Z | [ERROR] | Start game endpoint error | ReqId:8gzkh7jfd | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Maximum players must be at least 2","stack":"Error: Maximum players must be at least 2\n at GameService.validateStartGameInput (/app/src/Application/Game/GameService.ts:250:19)\n at GameService.startGame (/app/src/Application/Game/GameService.ts:48:18)\n at /app/src/Api/routers/gameRouter.ts:40:50\n at Layer.handleRequest (/app/node_modules/router/lib/layer.js:152:17)\n at next (/app/node_modules/router/lib/route.js:157:13)\n at authRequired (/app/src/Application/Services/AuthMiddleware.ts:88:9)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T14:20:31.043Z | [REQUEST] | Request completed | ReqId:8gzkh7jfd | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:400 | Time:21ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:36.481Z | [REQUEST] | Incoming request | ReqId:jtvdevyrj | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:36.483Z | [REQUEST] | POST /api/games/start | ReqId:jtvdevyrj | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:36.486Z | [AUTH] | Authentication successful | ReqId:jtvdevyrj | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:20:36.488Z | [REQUEST] | Start game endpoint accessed | ReqId:jtvdevyrj | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":"","deckCount":3,"maxplayers":2,"logintype":0} -2025-09-15T14:20:36.490Z | [OTHER] | GameService.startGame called | Meta:{"deckCount":3,"maxplayers":2,"logintype":0,"userid":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgid":""} -2025-09-15T14:20:36.491Z | [OTHER] | Start game input validation passed | Meta:{"deckCount":3,"maxplayers":2,"logintype":0} -2025-09-15T14:20:36.493Z | [OTHER] | Starting game creation | Meta:"deckCount: 3, maxPlayers: 2, loginType: 0" -2025-09-15T14:20:36.508Z | [OTHER] | Deck types validation passed | Meta:"foundTypes: [1, 0, 2]" -2025-09-15T14:20:36.510Z | [OTHER] | Created shuffled game deck | Meta:"type: 1, cardCount: 1, sourceDecks: 1" -2025-09-15T14:20:36.512Z | [OTHER] | Created shuffled game deck | Meta:"type: 0, cardCount: 3, sourceDecks: 1" -2025-09-15T14:20:36.513Z | [OTHER] | Created shuffled game deck | Meta:"type: 2, cardCount: 1, sourceDecks: 1" -2025-09-15T14:20:36.528Z | [DATABASE] | Game created | Meta:{"query":"executionTime: 13ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, gameCode: 6BDKNI"} -2025-09-15T14:20:36.532Z | [OTHER] | Game created in Redis | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","hostId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","websocketRoom":"game_6BDKNI","redisKey":"game:9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:20:36.534Z | [OTHER] | Triggering async board generation for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"positiveFieldCount":40,"negativeFieldCount":16,"luckFieldCount":10,"totalSpecialFields":66} -2025-09-15T14:20:36.536Z | [OTHER] | Starting board generation for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 -2025-09-15T14:20:36.540Z | [OTHER] | Attempt 1: Error rate 54.92% (target: 15%) -2025-09-15T14:20:36.543Z | [OTHER] | Attempt 2: Error rate 53.13% (target: 15%) -2025-09-15T14:20:36.546Z | [OTHER] | Attempt 3: Error rate 50.39% (target: 15%) -2025-09-15T14:20:36.548Z | [OTHER] | Attempt 4: Error rate 54.17% (target: 15%) -2025-09-15T14:20:36.550Z | [OTHER] | Attempt 5: Error rate 53.66% (target: 15%) -2025-09-15T14:20:36.553Z | [OTHER] | Attempt 6: Error rate 57.25% (target: 15%) -2025-09-15T14:20:36.556Z | [OTHER] | Attempt 7: Error rate 50% (target: 15%) -2025-09-15T14:20:36.558Z | [OTHER] | Attempt 8: Error rate 54.55% (target: 15%) -2025-09-15T14:20:36.560Z | [OTHER] | Attempt 9: Error rate 55.28% (target: 15%) -2025-09-15T14:20:36.562Z | [OTHER] | Attempt 10: Error rate 51.39% (target: 15%) -2025-09-15T14:20:36.564Z | [OTHER] | Attempt 11: Error rate 51.09% (target: 15%) -2025-09-15T14:20:36.567Z | [OTHER] | Attempt 12: Error rate 48.11% (target: 15%) -2025-09-15T14:20:36.570Z | [OTHER] | Attempt 13: Error rate 50.35% (target: 15%) -2025-09-15T14:20:36.572Z | [OTHER] | Attempt 14: Error rate 47.04% (target: 15%) -2025-09-15T14:20:36.573Z | [OTHER] | Attempt 15: Error rate 44.44% (target: 15%) -2025-09-15T14:20:36.575Z | [OTHER] | Attempt 16: Error rate 50.69% (target: 15%) -2025-09-15T14:20:36.577Z | [OTHER] | Attempt 17: Error rate 53.03% (target: 15%) -2025-09-15T14:20:36.579Z | [OTHER] | Attempt 18: Error rate 53.97% (target: 15%) -2025-09-15T14:20:36.580Z | [OTHER] | Attempt 19: Error rate 55.95% (target: 15%) -2025-09-15T14:20:36.582Z | [OTHER] | Attempt 20: Error rate 55.3% (target: 15%) -2025-09-15T14:20:36.585Z | [OTHER] | Attempt 21: Error rate 50.76% (target: 15%) -2025-09-15T14:20:36.587Z | [OTHER] | Attempt 22: Error rate 51.55% (target: 15%) -2025-09-15T14:20:36.588Z | [OTHER] | Attempt 23: Error rate 47.96% (target: 15%) -2025-09-15T14:20:36.590Z | [OTHER] | Attempt 24: Error rate 52.96% (target: 15%) -2025-09-15T14:20:36.592Z | [OTHER] | Attempt 25: Error rate 46.25% (target: 15%) -2025-09-15T14:20:36.594Z | [OTHER] | Attempt 26: Error rate 55.32% (target: 15%) -2025-09-15T14:20:36.595Z | [OTHER] | Attempt 27: Error rate 60.76% (target: 15%) -2025-09-15T14:20:36.597Z | [OTHER] | Attempt 28: Error rate 49.21% (target: 15%) -2025-09-15T14:20:36.599Z | [OTHER] | Attempt 29: Error rate 51.48% (target: 15%) -2025-09-15T14:20:36.601Z | [OTHER] | Attempt 30: Error rate 47.1% (target: 15%) -2025-09-15T14:20:36.603Z | [OTHER] | Attempt 31: Error rate 49.61% (target: 15%) -2025-09-15T14:20:36.604Z | [OTHER] | Attempt 32: Error rate 49.32% (target: 15%) -2025-09-15T14:20:36.606Z | [OTHER] | Attempt 33: Error rate 60.23% (target: 15%) -2025-09-15T14:20:36.608Z | [OTHER] | Attempt 34: Error rate 52.9% (target: 15%) -2025-09-15T14:20:36.609Z | [OTHER] | Attempt 35: Error rate 52.85% (target: 15%) -2025-09-15T14:20:36.611Z | [OTHER] | Attempt 36: Error rate 54.7% (target: 15%) -2025-09-15T14:20:36.612Z | [OTHER] | Attempt 37: Error rate 44.3% (target: 15%) -2025-09-15T14:20:36.614Z | [OTHER] | Attempt 38: Error rate 51.39% (target: 15%) -2025-09-15T14:20:36.617Z | [OTHER] | Attempt 39: Error rate 46.38% (target: 15%) -2025-09-15T14:20:36.618Z | [OTHER] | Attempt 40: Error rate 49.65% (target: 15%) -2025-09-15T14:20:36.620Z | [OTHER] | Attempt 41: Error rate 55.81% (target: 15%) -2025-09-15T14:20:36.622Z | [OTHER] | Attempt 42: Error rate 54.55% (target: 15%) -2025-09-15T14:20:36.623Z | [OTHER] | Attempt 43: Error rate 52.33% (target: 15%) -2025-09-15T14:20:36.625Z | [OTHER] | Attempt 44: Error rate 48.15% (target: 15%) -2025-09-15T14:20:36.626Z | [OTHER] | Attempt 45: Error rate 59.47% (target: 15%) -2025-09-15T14:20:36.628Z | [OTHER] | Attempt 46: Error rate 53.66% (target: 15%) -2025-09-15T14:20:36.630Z | [OTHER] | Attempt 47: Error rate 53.25% (target: 15%) -2025-09-15T14:20:36.631Z | [OTHER] | Attempt 48: Error rate 60.85% (target: 15%) -2025-09-15T14:20:36.634Z | [OTHER] | Attempt 49: Error rate 50% (target: 15%) -2025-09-15T14:20:36.635Z | [OTHER] | Attempt 50: Error rate 54.92% (target: 15%) -2025-09-15T14:20:36.637Z | [OTHER] | Attempt 51: Error rate 60.37% (target: 15%) -2025-09-15T14:20:36.639Z | [OTHER] | Attempt 52: Error rate 53.13% (target: 15%) -2025-09-15T14:20:36.646Z | [OTHER] | Attempt 53: Error rate 52.71% (target: 15%) -2025-09-15T14:20:36.647Z | [OTHER] | Attempt 54: Error rate 45.24% (target: 15%) -2025-09-15T14:20:36.649Z | [OTHER] | Attempt 55: Error rate 52.03% (target: 15%) -2025-09-15T14:20:36.651Z | [OTHER] | Attempt 56: Error rate 54.55% (target: 15%) -2025-09-15T14:20:36.652Z | [OTHER] | Attempt 57: Error rate 45.65% (target: 15%) -2025-09-15T14:20:36.654Z | [OTHER] | Attempt 58: Error rate 58.15% (target: 15%) -2025-09-15T14:20:36.657Z | [OTHER] | Attempt 59: Error rate 52.9% (target: 15%) -2025-09-15T14:20:36.659Z | [OTHER] | Attempt 60: Error rate 61.96% (target: 15%) -2025-09-15T14:20:36.660Z | [OTHER] | Attempt 61: Error rate 46.45% (target: 15%) -2025-09-15T14:20:36.662Z | [OTHER] | Attempt 62: Error rate 50.37% (target: 15%) -2025-09-15T14:20:36.663Z | [OTHER] | Attempt 63: Error rate 56.16% (target: 15%) -2025-09-15T14:20:36.665Z | [OTHER] | Attempt 64: Error rate 54.26% (target: 15%) -2025-09-15T14:20:36.666Z | [OTHER] | Attempt 65: Error rate 48.45% (target: 15%) -2025-09-15T14:20:36.668Z | [OTHER] | Attempt 66: Error rate 57.26% (target: 15%) -2025-09-15T14:20:36.670Z | [OTHER] | Attempt 67: Error rate 51.52% (target: 15%) -2025-09-15T14:20:36.671Z | [OTHER] | Attempt 68: Error rate 50.79% (target: 15%) -2025-09-15T14:20:36.674Z | [OTHER] | Attempt 69: Error rate 57.36% (target: 15%) -2025-09-15T14:20:36.676Z | [OTHER] | Attempt 70: Error rate 60.42% (target: 15%) -2025-09-15T14:20:36.677Z | [OTHER] | Attempt 71: Error rate 55.28% (target: 15%) -2025-09-15T14:20:36.679Z | [OTHER] | Attempt 72: Error rate 59.69% (target: 15%) -2025-09-15T14:20:36.680Z | [OTHER] | Attempt 73: Error rate 58.13% (target: 15%) -2025-09-15T14:20:36.682Z | [OTHER] | Attempt 74: Error rate 43.7% (target: 15%) -2025-09-15T14:20:36.683Z | [OTHER] | Attempt 75: Error rate 58.12% (target: 15%) -2025-09-15T14:20:36.685Z | [OTHER] | Attempt 76: Error rate 48.72% (target: 15%) -2025-09-15T14:20:36.686Z | [OTHER] | Attempt 77: Error rate 54.96% (target: 15%) -2025-09-15T14:20:36.688Z | [OTHER] | Attempt 78: Error rate 58.89% (target: 15%) -2025-09-15T14:20:36.690Z | [OTHER] | Attempt 79: Error rate 52.14% (target: 15%) -2025-09-15T14:20:36.692Z | [OTHER] | Attempt 80: Error rate 55.69% (target: 15%) -2025-09-15T14:20:36.694Z | [OTHER] | Attempt 81: Error rate 41.09% (target: 15%) -2025-09-15T14:20:36.695Z | [OTHER] | Attempt 82: Error rate 50.79% (target: 15%) -2025-09-15T14:20:36.697Z | [OTHER] | Attempt 83: Error rate 53.62% (target: 15%) -2025-09-15T14:20:36.698Z | [OTHER] | Attempt 84: Error rate 58.73% (target: 15%) -2025-09-15T14:20:36.700Z | [OTHER] | Attempt 85: Error rate 51.81% (target: 15%) -2025-09-15T14:20:36.701Z | [OTHER] | Attempt 86: Error rate 54.47% (target: 15%) -2025-09-15T14:20:36.703Z | [OTHER] | Attempt 87: Error rate 58.73% (target: 15%) -2025-09-15T14:20:36.704Z | [OTHER] | Attempt 88: Error rate 51.77% (target: 15%) -2025-09-15T14:20:36.706Z | [OTHER] | Attempt 89: Error rate 54.07% (target: 15%) -2025-09-15T14:20:36.708Z | [OTHER] | Attempt 90: Error rate 53.55% (target: 15%) -2025-09-15T14:20:36.709Z | [OTHER] | Attempt 91: Error rate 58.33% (target: 15%) -2025-09-15T14:20:36.711Z | [OTHER] | Attempt 92: Error rate 46.51% (target: 15%) -2025-09-15T14:20:36.712Z | [OTHER] | Attempt 93: Error rate 62.68% (target: 15%) -2025-09-15T14:20:36.714Z | [OTHER] | Attempt 94: Error rate 49.26% (target: 15%) -2025-09-15T14:20:36.715Z | [OTHER] | Attempt 95: Error rate 57.04% (target: 15%) -2025-09-15T14:20:36.717Z | [OTHER] | Attempt 96: Error rate 57.54% (target: 15%) -2025-09-15T14:20:36.718Z | [OTHER] | Attempt 97: Error rate 49.63% (target: 15%) -2025-09-15T14:20:36.720Z | [OTHER] | Attempt 98: Error rate 51.14% (target: 15%) -2025-09-15T14:20:36.722Z | [OTHER] | Attempt 99: Error rate 56.2% (target: 15%) -2025-09-15T14:20:36.724Z | [OTHER] | Attempt 100: Error rate 54.07% (target: 15%) -2025-09-15T14:20:36.726Z | [OTHER] | Attempt 101: Error rate 53.1% (target: 15%) -2025-09-15T14:20:36.727Z | [OTHER] | Attempt 102: Error rate 57.32% (target: 15%) -2025-09-15T14:20:36.729Z | [OTHER] | Attempt 103: Error rate 50.76% (target: 15%) -2025-09-15T14:20:36.730Z | [OTHER] | Attempt 104: Error rate 52.13% (target: 15%) -2025-09-15T14:20:36.732Z | [OTHER] | Attempt 105: Error rate 53.41% (target: 15%) -2025-09-15T14:20:36.733Z | [OTHER] | Attempt 106: Error rate 46.01% (target: 15%) -2025-09-15T14:20:36.735Z | [OTHER] | Attempt 107: Error rate 52.27% (target: 15%) -2025-09-15T14:20:36.736Z | [OTHER] | Attempt 108: Error rate 43.48% (target: 15%) -2025-09-15T14:20:36.738Z | [OTHER] | Attempt 109: Error rate 55.3% (target: 15%) -2025-09-15T14:20:36.739Z | [OTHER] | Attempt 110: Error rate 50% (target: 15%) -2025-09-15T14:20:36.741Z | [OTHER] | Attempt 111: Error rate 54.07% (target: 15%) -2025-09-15T14:20:36.742Z | [OTHER] | Attempt 112: Error rate 51.55% (target: 15%) -2025-09-15T14:20:36.744Z | [OTHER] | Attempt 113: Error rate 53.19% (target: 15%) -2025-09-15T14:20:36.746Z | [OTHER] | Attempt 114: Error rate 54.81% (target: 15%) -2025-09-15T14:20:36.748Z | [OTHER] | Attempt 115: Error rate 62.08% (target: 15%) -2025-09-15T14:20:36.749Z | [OTHER] | Attempt 116: Error rate 48.41% (target: 15%) -2025-09-15T14:20:36.751Z | [OTHER] | Attempt 117: Error rate 51.89% (target: 15%) -2025-09-15T14:20:36.752Z | [OTHER] | Attempt 118: Error rate 50.4% (target: 15%) -2025-09-15T14:20:36.754Z | [OTHER] | Attempt 119: Error rate 51.98% (target: 15%) -2025-09-15T14:20:36.756Z | [OTHER] | Attempt 120: Error rate 55.07% (target: 15%) -2025-09-15T14:20:36.758Z | [OTHER] | Attempt 121: Error rate 54.35% (target: 15%) -2025-09-15T14:20:36.759Z | [OTHER] | Attempt 122: Error rate 54.17% (target: 15%) -2025-09-15T14:20:36.761Z | [OTHER] | Attempt 123: Error rate 56.44% (target: 15%) -2025-09-15T14:20:36.762Z | [OTHER] | Attempt 124: Error rate 49.62% (target: 15%) -2025-09-15T14:20:36.764Z | [OTHER] | Attempt 125: Error rate 54.92% (target: 15%) -2025-09-15T14:20:36.765Z | [OTHER] | Attempt 126: Error rate 52.19% (target: 15%) -2025-09-15T14:20:36.767Z | [OTHER] | Attempt 127: Error rate 50.74% (target: 15%) -2025-09-15T14:20:36.769Z | [OTHER] | Attempt 128: Error rate 51.96% (target: 15%) -2025-09-15T14:20:36.770Z | [OTHER] | Attempt 129: Error rate 52.27% (target: 15%) -2025-09-15T14:20:36.772Z | [OTHER] | Attempt 130: Error rate 49.63% (target: 15%) -2025-09-15T14:20:36.773Z | [OTHER] | Attempt 131: Error rate 49.59% (target: 15%) -2025-09-15T14:20:36.775Z | [OTHER] | Attempt 132: Error rate 48.91% (target: 15%) -2025-09-15T14:20:36.776Z | [OTHER] | Attempt 133: Error rate 59.13% (target: 15%) -2025-09-15T14:20:36.778Z | [OTHER] | Attempt 134: Error rate 50% (target: 15%) -2025-09-15T14:20:36.780Z | [OTHER] | Attempt 135: Error rate 58.97% (target: 15%) -2025-09-15T14:20:36.781Z | [OTHER] | Attempt 136: Error rate 54.17% (target: 15%) -2025-09-15T14:20:36.783Z | [OTHER] | Attempt 137: Error rate 53.17% (target: 15%) -2025-09-15T14:20:36.784Z | [OTHER] | Attempt 138: Error rate 45.63% (target: 15%) -2025-09-15T14:20:36.786Z | [OTHER] | Attempt 139: Error rate 55.43% (target: 15%) -2025-09-15T14:20:36.788Z | [OTHER] | Attempt 140: Error rate 42.8% (target: 15%) -2025-09-15T14:20:36.790Z | [OTHER] | Attempt 141: Error rate 52.9% (target: 15%) -2025-09-15T14:20:36.792Z | [OTHER] | Attempt 142: Error rate 59.17% (target: 15%) -2025-09-15T14:20:36.793Z | [OTHER] | Attempt 143: Error rate 51.45% (target: 15%) -2025-09-15T14:20:36.795Z | [OTHER] | Attempt 144: Error rate 56.82% (target: 15%) -2025-09-15T14:20:36.796Z | [OTHER] | Attempt 145: Error rate 50.83% (target: 15%) -2025-09-15T14:20:36.798Z | [OTHER] | Attempt 146: Error rate 44.14% (target: 15%) -2025-09-15T14:20:36.800Z | [OTHER] | Attempt 147: Error rate 55.56% (target: 15%) -2025-09-15T14:20:36.801Z | [OTHER] | Attempt 148: Error rate 49.29% (target: 15%) -2025-09-15T14:20:36.803Z | [OTHER] | Attempt 149: Error rate 53.41% (target: 15%) -2025-09-15T14:20:36.805Z | [OTHER] | Attempt 150: Error rate 59.52% (target: 15%) -2025-09-15T14:20:36.807Z | [OTHER] | Attempt 151: Error rate 53.97% (target: 15%) -2025-09-15T14:20:36.808Z | [OTHER] | Attempt 152: Error rate 52.03% (target: 15%) -2025-09-15T14:20:36.810Z | [OTHER] | Attempt 153: Error rate 52.48% (target: 15%) -2025-09-15T14:20:36.812Z | [OTHER] | Attempt 154: Error rate 53.66% (target: 15%) -2025-09-15T14:20:36.813Z | [OTHER] | Attempt 155: Error rate 49.58% (target: 15%) -2025-09-15T14:20:36.815Z | [OTHER] | Attempt 156: Error rate 60.87% (target: 15%) -2025-09-15T14:20:36.817Z | [OTHER] | Attempt 157: Error rate 59.85% (target: 15%) -2025-09-15T14:20:36.818Z | [OTHER] | Attempt 158: Error rate 55.04% (target: 15%) -2025-09-15T14:20:36.820Z | [OTHER] | Attempt 159: Error rate 48.19% (target: 15%) -2025-09-15T14:20:36.821Z | [OTHER] | Attempt 160: Error rate 53.26% (target: 15%) -2025-09-15T14:20:36.824Z | [OTHER] | Attempt 161: Error rate 52.71% (target: 15%) -2025-09-15T14:20:36.825Z | [OTHER] | Attempt 162: Error rate 48.06% (target: 15%) -2025-09-15T14:20:36.827Z | [OTHER] | Attempt 163: Error rate 51.22% (target: 15%) -2025-09-15T14:20:36.829Z | [OTHER] | Attempt 164: Error rate 57.14% (target: 15%) -2025-09-15T14:20:36.830Z | [OTHER] | Attempt 165: Error rate 59.09% (target: 15%) -2025-09-15T14:20:36.832Z | [OTHER] | Attempt 166: Error rate 54.37% (target: 15%) -2025-09-15T14:20:36.833Z | [OTHER] | Attempt 167: Error rate 51.14% (target: 15%) -2025-09-15T14:20:36.835Z | [OTHER] | Attempt 168: Error rate 52.78% (target: 15%) -2025-09-15T14:20:36.836Z | [OTHER] | Attempt 169: Error rate 45.65% (target: 15%) -2025-09-15T14:20:36.838Z | [OTHER] | Attempt 170: Error rate 51.89% (target: 15%) -2025-09-15T14:20:36.840Z | [OTHER] | Attempt 171: Error rate 52.54% (target: 15%) -2025-09-15T14:20:36.842Z | [OTHER] | Attempt 172: Error rate 51.89% (target: 15%) -2025-09-15T14:20:36.843Z | [OTHER] | Attempt 173: Error rate 58.94% (target: 15%) -2025-09-15T14:20:36.845Z | [OTHER] | Attempt 174: Error rate 46.67% (target: 15%) -2025-09-15T14:20:36.846Z | [OTHER] | Attempt 175: Error rate 62.5% (target: 15%) -2025-09-15T14:20:36.848Z | [OTHER] | Attempt 176: Error rate 51.52% (target: 15%) -2025-09-15T14:20:36.849Z | [OTHER] | Attempt 177: Error rate 52.44% (target: 15%) -2025-09-15T14:20:36.851Z | [OTHER] | Attempt 178: Error rate 50% (target: 15%) -2025-09-15T14:20:36.853Z | [OTHER] | Attempt 179: Error rate 58.15% (target: 15%) -2025-09-15T14:20:36.854Z | [OTHER] | Attempt 180: Error rate 47.56% (target: 15%) -2025-09-15T14:20:36.857Z | [OTHER] | Attempt 181: Error rate 49.62% (target: 15%) -2025-09-15T14:20:36.858Z | [OTHER] | Attempt 182: Error rate 48.84% (target: 15%) -2025-09-15T14:20:36.860Z | [OTHER] | Attempt 183: Error rate 54.17% (target: 15%) -2025-09-15T14:20:36.861Z | [OTHER] | Attempt 184: Error rate 45.35% (target: 15%) -2025-09-15T14:20:36.863Z | [OTHER] | Attempt 185: Error rate 60.32% (target: 15%) -2025-09-15T14:20:36.864Z | [OTHER] | Attempt 186: Error rate 49.12% (target: 15%) -2025-09-15T14:20:36.866Z | [OTHER] | Attempt 187: Error rate 54.37% (target: 15%) -2025-09-15T14:20:36.867Z | [OTHER] | Attempt 188: Error rate 54.58% (target: 15%) -2025-09-15T14:20:36.869Z | [OTHER] | Attempt 189: Error rate 51.74% (target: 15%) -2025-09-15T14:20:36.871Z | [OTHER] | Attempt 190: Error rate 51.85% (target: 15%) -2025-09-15T14:20:36.872Z | [OTHER] | Attempt 191: Error rate 52.43% (target: 15%) -2025-09-15T14:20:36.874Z | [OTHER] | Attempt 192: Error rate 58.33% (target: 15%) -2025-09-15T14:20:36.875Z | [OTHER] | Attempt 193: Error rate 50.39% (target: 15%) -2025-09-15T14:20:36.877Z | [OTHER] | Attempt 194: Error rate 47.04% (target: 15%) -2025-09-15T14:20:36.879Z | [OTHER] | Attempt 195: Error rate 57.14% (target: 15%) -2025-09-15T14:20:36.880Z | [OTHER] | Attempt 196: Error rate 51.11% (target: 15%) -2025-09-15T14:20:36.882Z | [OTHER] | Attempt 197: Error rate 50.36% (target: 15%) -2025-09-15T14:20:36.883Z | [OTHER] | Attempt 198: Error rate 53.19% (target: 15%) -2025-09-15T14:20:36.885Z | [OTHER] | Attempt 199: Error rate 57.29% (target: 15%) -2025-09-15T14:20:36.886Z | [OTHER] | Attempt 200: Error rate 55.43% (target: 15%) -2025-09-15T14:20:36.889Z | [OTHER] | Attempt 201: Error rate 51.94% (target: 15%) -2025-09-15T14:20:36.890Z | [OTHER] | Attempt 202: Error rate 50% (target: 15%) -2025-09-15T14:20:36.892Z | [OTHER] | Attempt 203: Error rate 50% (target: 15%) -2025-09-15T14:20:36.894Z | [OTHER] | Attempt 204: Error rate 50% (target: 15%) -2025-09-15T14:20:36.895Z | [OTHER] | Attempt 205: Error rate 44.9% (target: 15%) -2025-09-15T14:20:36.897Z | [OTHER] | Attempt 206: Error rate 53.67% (target: 15%) -2025-09-15T14:20:36.898Z | [OTHER] | Attempt 207: Error rate 55.43% (target: 15%) -2025-09-15T14:20:36.900Z | [OTHER] | Attempt 208: Error rate 51.59% (target: 15%) -2025-09-15T14:20:36.902Z | [OTHER] | Attempt 209: Error rate 55.9% (target: 15%) -2025-09-15T14:20:36.903Z | [OTHER] | Attempt 210: Error rate 53.85% (target: 15%) -2025-09-15T14:20:36.905Z | [OTHER] | Attempt 211: Error rate 52.84% (target: 15%) -2025-09-15T14:20:36.907Z | [OTHER] | Attempt 212: Error rate 53.88% (target: 15%) -2025-09-15T14:20:36.909Z | [OTHER] | Attempt 213: Error rate 49.66% (target: 15%) -2025-09-15T14:20:36.910Z | [OTHER] | Attempt 214: Error rate 51.85% (target: 15%) -2025-09-15T14:20:36.912Z | [OTHER] | Attempt 215: Error rate 50.38% (target: 15%) -2025-09-15T14:20:36.914Z | [OTHER] | Attempt 216: Error rate 50.71% (target: 15%) -2025-09-15T14:20:36.915Z | [OTHER] | Attempt 217: Error rate 55.04% (target: 15%) -2025-09-15T14:20:36.917Z | [OTHER] | Attempt 218: Error rate 53.33% (target: 15%) -2025-09-15T14:20:36.918Z | [OTHER] | Attempt 219: Error rate 45.65% (target: 15%) -2025-09-15T14:20:36.920Z | [OTHER] | Attempt 220: Error rate 52.08% (target: 15%) -2025-09-15T14:20:36.923Z | [OTHER] | Attempt 221: Error rate 53.03% (target: 15%) -2025-09-15T14:20:36.924Z | [OTHER] | Attempt 222: Error rate 57.45% (target: 15%) -2025-09-15T14:20:36.926Z | [OTHER] | Attempt 223: Error rate 50% (target: 15%) -2025-09-15T14:20:36.927Z | [OTHER] | Attempt 224: Error rate 52.14% (target: 15%) -2025-09-15T14:20:36.929Z | [OTHER] | Attempt 225: Error rate 53.66% (target: 15%) -2025-09-15T14:20:36.931Z | [OTHER] | Attempt 226: Error rate 45.93% (target: 15%) -2025-09-15T14:20:36.933Z | [OTHER] | Attempt 227: Error rate 61.9% (target: 15%) -2025-09-15T14:20:36.937Z | [OTHER] | Attempt 228: Error rate 46.9% (target: 15%) -2025-09-15T14:20:36.939Z | [OTHER] | Attempt 229: Error rate 57.54% (target: 15%) -2025-09-15T14:20:36.942Z | [OTHER] | Attempt 230: Error rate 41.84% (target: 15%) -2025-09-15T14:20:36.944Z | [OTHER] | Attempt 231: Error rate 50.78% (target: 15%) -2025-09-15T14:20:36.946Z | [OTHER] | Attempt 232: Error rate 45.53% (target: 15%) -2025-09-15T14:20:36.949Z | [OTHER] | Attempt 233: Error rate 54.81% (target: 15%) -2025-09-15T14:20:36.951Z | [OTHER] | Attempt 234: Error rate 49.61% (target: 15%) -2025-09-15T14:20:36.954Z | [OTHER] | Attempt 235: Error rate 57.33% (target: 15%) -2025-09-15T14:20:36.956Z | [OTHER] | Attempt 236: Error rate 47.73% (target: 15%) -2025-09-15T14:20:36.958Z | [OTHER] | Attempt 237: Error rate 51.36% (target: 15%) -2025-09-15T14:20:36.960Z | [OTHER] | Attempt 238: Error rate 51.94% (target: 15%) -2025-09-15T14:20:36.963Z | [OTHER] | Attempt 239: Error rate 57.04% (target: 15%) -2025-09-15T14:20:36.965Z | [OTHER] | Attempt 240: Error rate 46.38% (target: 15%) -2025-09-15T14:20:36.970Z | [OTHER] | Attempt 241: Error rate 53.1% (target: 15%) -2025-09-15T14:20:36.973Z | [OTHER] | Attempt 242: Error rate 50.72% (target: 15%) -2025-09-15T14:20:36.975Z | [OTHER] | Attempt 243: Error rate 47.29% (target: 15%) -2025-09-15T14:20:36.977Z | [OTHER] | Attempt 244: Error rate 52.03% (target: 15%) -2025-09-15T14:20:36.979Z | [OTHER] | Attempt 245: Error rate 47.78% (target: 15%) -2025-09-15T14:20:36.981Z | [OTHER] | Attempt 246: Error rate 54.58% (target: 15%) -2025-09-15T14:20:36.982Z | [OTHER] | Attempt 247: Error rate 48.94% (target: 15%) -2025-09-15T14:20:36.985Z | [OTHER] | Attempt 248: Error rate 48.45% (target: 15%) -2025-09-15T14:20:36.986Z | [OTHER] | Attempt 249: Error rate 55.81% (target: 15%) -2025-09-15T14:20:36.988Z | [OTHER] | Attempt 250: Error rate 51.94% (target: 15%) -2025-09-15T14:20:36.990Z | [OTHER] | Attempt 251: Error rate 56.3% (target: 15%) -2025-09-15T14:20:36.992Z | [OTHER] | Attempt 252: Error rate 54.17% (target: 15%) -2025-09-15T14:20:36.994Z | [OTHER] | Attempt 253: Error rate 50.43% (target: 15%) -2025-09-15T14:20:36.995Z | [OTHER] | Attempt 254: Error rate 52.78% (target: 15%) -2025-09-15T14:20:36.997Z | [OTHER] | Attempt 255: Error rate 54.55% (target: 15%) -2025-09-15T14:20:36.999Z | [OTHER] | Attempt 256: Error rate 53.19% (target: 15%) -2025-09-15T14:20:37.000Z | [OTHER] | Attempt 257: Error rate 52.13% (target: 15%) -2025-09-15T14:20:37.002Z | [OTHER] | Attempt 258: Error rate 54.47% (target: 15%) -2025-09-15T14:20:37.004Z | [OTHER] | Attempt 259: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.005Z | [OTHER] | Attempt 260: Error rate 52.59% (target: 15%) -2025-09-15T14:20:37.007Z | [OTHER] | Attempt 261: Error rate 54.7% (target: 15%) -2025-09-15T14:20:37.009Z | [OTHER] | Attempt 262: Error rate 41.06% (target: 15%) -2025-09-15T14:20:37.011Z | [OTHER] | Attempt 263: Error rate 43.26% (target: 15%) -2025-09-15T14:20:37.013Z | [OTHER] | Attempt 264: Error rate 59.47% (target: 15%) -2025-09-15T14:20:37.014Z | [OTHER] | Attempt 265: Error rate 51.85% (target: 15%) -2025-09-15T14:20:37.016Z | [OTHER] | Attempt 266: Error rate 46.97% (target: 15%) -2025-09-15T14:20:37.017Z | [OTHER] | Attempt 267: Error rate 51.16% (target: 15%) -2025-09-15T14:20:37.019Z | [OTHER] | Attempt 268: Error rate 50.72% (target: 15%) -2025-09-15T14:20:37.021Z | [OTHER] | Attempt 269: Error rate 54.07% (target: 15%) -2025-09-15T14:20:37.022Z | [OTHER] | Attempt 270: Error rate 47.78% (target: 15%) -2025-09-15T14:20:37.024Z | [OTHER] | Attempt 271: Error rate 52.38% (target: 15%) -2025-09-15T14:20:37.025Z | [OTHER] | Attempt 272: Error rate 54.37% (target: 15%) -2025-09-15T14:20:37.027Z | [OTHER] | Attempt 273: Error rate 58.54% (target: 15%) -2025-09-15T14:20:37.028Z | [OTHER] | Attempt 274: Error rate 51.98% (target: 15%) -2025-09-15T14:20:37.030Z | [OTHER] | Attempt 275: Error rate 40.7% (target: 15%) -2025-09-15T14:20:37.031Z | [OTHER] | Attempt 276: Error rate 49.29% (target: 15%) -2025-09-15T14:20:37.033Z | [OTHER] | Attempt 277: Error rate 38.37% (target: 15%) -2025-09-15T14:20:37.034Z | [OTHER] | Attempt 278: Error rate 55.56% (target: 15%) -2025-09-15T14:20:37.036Z | [OTHER] | Attempt 279: Error rate 55.68% (target: 15%) -2025-09-15T14:20:37.038Z | [OTHER] | Attempt 280: Error rate 56.16% (target: 15%) -2025-09-15T14:20:37.040Z | [OTHER] | Attempt 281: Error rate 51.06% (target: 15%) -2025-09-15T14:20:37.042Z | [OTHER] | Attempt 282: Error rate 57.95% (target: 15%) -2025-09-15T14:20:37.044Z | [OTHER] | Attempt 283: Error rate 56.25% (target: 15%) -2025-09-15T14:20:37.046Z | [OTHER] | Attempt 284: Error rate 57.54% (target: 15%) -2025-09-15T14:20:37.047Z | [OTHER] | Attempt 285: Error rate 54.55% (target: 15%) -2025-09-15T14:20:37.049Z | [OTHER] | Attempt 286: Error rate 57.33% (target: 15%) -2025-09-15T14:20:37.050Z | [OTHER] | Attempt 287: Error rate 50.38% (target: 15%) -2025-09-15T14:20:37.052Z | [OTHER] | Attempt 288: Error rate 54.88% (target: 15%) -2025-09-15T14:20:37.053Z | [OTHER] | Attempt 289: Error rate 53.97% (target: 15%) -2025-09-15T14:20:37.055Z | [OTHER] | Attempt 290: Error rate 60.61% (target: 15%) -2025-09-15T14:20:37.056Z | [OTHER] | Attempt 291: Error rate 47.29% (target: 15%) -2025-09-15T14:20:37.058Z | [OTHER] | Attempt 292: Error rate 51.09% (target: 15%) -2025-09-15T14:20:37.059Z | [OTHER] | Attempt 293: Error rate 52.59% (target: 15%) -2025-09-15T14:20:37.061Z | [OTHER] | Attempt 294: Error rate 49.29% (target: 15%) -2025-09-15T14:20:37.062Z | [OTHER] | Attempt 295: Error rate 64.63% (target: 15%) -2025-09-15T14:20:37.064Z | [OTHER] | Attempt 296: Error rate 54.47% (target: 15%) -2025-09-15T14:20:37.066Z | [OTHER] | Attempt 297: Error rate 53.33% (target: 15%) -2025-09-15T14:20:37.067Z | [OTHER] | Attempt 298: Error rate 50% (target: 15%) -2025-09-15T14:20:37.069Z | [OTHER] | Attempt 299: Error rate 46.01% (target: 15%) -2025-09-15T14:20:37.070Z | [OTHER] | Attempt 300: Error rate 49.22% (target: 15%) -2025-09-15T14:20:37.072Z | [OTHER] | Attempt 301: Error rate 52.65% (target: 15%) -2025-09-15T14:20:37.074Z | [OTHER] | Attempt 302: Error rate 52.96% (target: 15%) -2025-09-15T14:20:37.076Z | [OTHER] | Attempt 303: Error rate 61.24% (target: 15%) -2025-09-15T14:20:37.077Z | [OTHER] | Attempt 304: Error rate 47.46% (target: 15%) -2025-09-15T14:20:37.079Z | [OTHER] | Attempt 305: Error rate 53% (target: 15%) -2025-09-15T14:20:37.080Z | [OTHER] | Attempt 306: Error rate 55.19% (target: 15%) -2025-09-15T14:20:37.082Z | [OTHER] | Attempt 307: Error rate 46.88% (target: 15%) -2025-09-15T14:20:37.084Z | [OTHER] | Attempt 308: Error rate 47.73% (target: 15%) -2025-09-15T14:20:37.085Z | [OTHER] | Attempt 309: Error rate 51.94% (target: 15%) -2025-09-15T14:20:37.087Z | [OTHER] | Attempt 310: Error rate 52.33% (target: 15%) -2025-09-15T14:20:37.088Z | [OTHER] | Attempt 311: Error rate 58.33% (target: 15%) -2025-09-15T14:20:37.090Z | [OTHER] | Attempt 312: Error rate 50.76% (target: 15%) -2025-09-15T14:20:37.091Z | [OTHER] | Attempt 313: Error rate 52.17% (target: 15%) -2025-09-15T14:20:37.092Z | [OTHER] | Attempt 314: Error rate 47.35% (target: 15%) -2025-09-15T14:20:37.094Z | [OTHER] | Attempt 315: Error rate 54.26% (target: 15%) -2025-09-15T14:20:37.096Z | [OTHER] | Attempt 316: Error rate 47.29% (target: 15%) -2025-09-15T14:20:37.097Z | [OTHER] | Attempt 317: Error rate 51.71% (target: 15%) -2025-09-15T14:20:37.099Z | [OTHER] | Attempt 318: Error rate 58.33% (target: 15%) -2025-09-15T14:20:37.100Z | [OTHER] | Attempt 319: Error rate 48.58% (target: 15%) -2025-09-15T14:20:37.102Z | [OTHER] | Attempt 320: Error rate 54.51% (target: 15%) -2025-09-15T14:20:37.103Z | [OTHER] | Attempt 321: Error rate 51.77% (target: 15%) -2025-09-15T14:20:37.106Z | [OTHER] | Attempt 322: Error rate 47.62% (target: 15%) -2025-09-15T14:20:37.107Z | [OTHER] | Attempt 323: Error rate 50.36% (target: 15%) -2025-09-15T14:20:37.109Z | [OTHER] | Attempt 324: Error rate 54.92% (target: 15%) -2025-09-15T14:20:37.110Z | [OTHER] | Attempt 325: Error rate 53.42% (target: 15%) -2025-09-15T14:20:37.112Z | [OTHER] | Attempt 326: Error rate 48.02% (target: 15%) -2025-09-15T14:20:37.113Z | [OTHER] | Attempt 327: Error rate 54.71% (target: 15%) -2025-09-15T14:20:37.115Z | [OTHER] | Attempt 328: Error rate 46.75% (target: 15%) -2025-09-15T14:20:37.116Z | [OTHER] | Attempt 329: Error rate 57.2% (target: 15%) -2025-09-15T14:20:37.118Z | [OTHER] | Attempt 330: Error rate 46.38% (target: 15%) -2025-09-15T14:20:37.119Z | [OTHER] | Attempt 331: Error rate 53.62% (target: 15%) -2025-09-15T14:20:37.121Z | [OTHER] | Attempt 332: Error rate 53.07% (target: 15%) -2025-09-15T14:20:37.122Z | [OTHER] | Attempt 333: Error rate 53.55% (target: 15%) -2025-09-15T14:20:37.124Z | [OTHER] | Attempt 334: Error rate 57.41% (target: 15%) -2025-09-15T14:20:37.125Z | [OTHER] | Attempt 335: Error rate 55.8% (target: 15%) -2025-09-15T14:20:37.127Z | [OTHER] | Attempt 336: Error rate 48.86% (target: 15%) -2025-09-15T14:20:37.129Z | [OTHER] | Attempt 337: Error rate 62.15% (target: 15%) -2025-09-15T14:20:37.130Z | [OTHER] | Attempt 338: Error rate 52.92% (target: 15%) -2025-09-15T14:20:37.132Z | [OTHER] | Attempt 339: Error rate 50% (target: 15%) -2025-09-15T14:20:37.133Z | [OTHER] | Attempt 340: Error rate 50.38% (target: 15%) -2025-09-15T14:20:37.135Z | [OTHER] | Attempt 341: Error rate 51.85% (target: 15%) -2025-09-15T14:20:37.138Z | [OTHER] | Attempt 342: Error rate 57.09% (target: 15%) -2025-09-15T14:20:37.141Z | [OTHER] | Attempt 343: Error rate 50% (target: 15%) -2025-09-15T14:20:37.143Z | [OTHER] | Attempt 344: Error rate 51.09% (target: 15%) -2025-09-15T14:20:37.146Z | [OTHER] | Attempt 345: Error rate 50% (target: 15%) -2025-09-15T14:20:37.147Z | [OTHER] | Attempt 346: Error rate 55.19% (target: 15%) -2025-09-15T14:20:37.149Z | [OTHER] | Attempt 347: Error rate 56.38% (target: 15%) -2025-09-15T14:20:37.151Z | [OTHER] | Attempt 348: Error rate 45.24% (target: 15%) -2025-09-15T14:20:37.152Z | [OTHER] | Attempt 349: Error rate 53.62% (target: 15%) -2025-09-15T14:20:37.154Z | [OTHER] | Attempt 350: Error rate 57.8% (target: 15%) -2025-09-15T14:20:37.156Z | [OTHER] | Attempt 351: Error rate 49.24% (target: 15%) -2025-09-15T14:20:37.157Z | [OTHER] | Attempt 352: Error rate 61.46% (target: 15%) -2025-09-15T14:20:37.159Z | [OTHER] | Attempt 353: Error rate 52.22% (target: 15%) -2025-09-15T14:20:37.160Z | [OTHER] | Attempt 354: Error rate 56.75% (target: 15%) -2025-09-15T14:20:37.162Z | [OTHER] | Attempt 355: Error rate 50.38% (target: 15%) -2025-09-15T14:20:37.163Z | [OTHER] | Attempt 356: Error rate 50.35% (target: 15%) -2025-09-15T14:20:37.165Z | [OTHER] | Attempt 357: Error rate 52.72% (target: 15%) -2025-09-15T14:20:37.167Z | [OTHER] | Attempt 358: Error rate 51.59% (target: 15%) -2025-09-15T14:20:37.169Z | [OTHER] | Attempt 359: Error rate 55.19% (target: 15%) -2025-09-15T14:20:37.171Z | [OTHER] | Attempt 360: Error rate 50.36% (target: 15%) -2025-09-15T14:20:37.172Z | [OTHER] | Attempt 361: Error rate 50.74% (target: 15%) -2025-09-15T14:20:37.175Z | [OTHER] | Attempt 362: Error rate 55.56% (target: 15%) -2025-09-15T14:20:37.176Z | [OTHER] | Attempt 363: Error rate 55.3% (target: 15%) -2025-09-15T14:20:37.178Z | [OTHER] | Attempt 364: Error rate 46.83% (target: 15%) -2025-09-15T14:20:37.180Z | [OTHER] | Attempt 365: Error rate 53.99% (target: 15%) -2025-09-15T14:20:37.181Z | [OTHER] | Attempt 366: Error rate 53.55% (target: 15%) -2025-09-15T14:20:37.182Z | [OTHER] | Attempt 367: Error rate 41.09% (target: 15%) -2025-09-15T14:20:37.184Z | [OTHER] | Attempt 368: Error rate 58.7% (target: 15%) -2025-09-15T14:20:37.186Z | [OTHER] | Attempt 369: Error rate 57.48% (target: 15%) -2025-09-15T14:20:37.188Z | [OTHER] | Attempt 370: Error rate 53.26% (target: 15%) -2025-09-15T14:20:37.189Z | [OTHER] | Attempt 371: Error rate 56.3% (target: 15%) -2025-09-15T14:20:37.191Z | [OTHER] | Attempt 372: Error rate 52.44% (target: 15%) -2025-09-15T14:20:37.193Z | [OTHER] | Attempt 373: Error rate 43.33% (target: 15%) -2025-09-15T14:20:37.194Z | [OTHER] | Attempt 374: Error rate 56.44% (target: 15%) -2025-09-15T14:20:37.195Z | [OTHER] | Attempt 375: Error rate 50.71% (target: 15%) -2025-09-15T14:20:37.197Z | [OTHER] | Attempt 376: Error rate 56.12% (target: 15%) -2025-09-15T14:20:37.199Z | [OTHER] | Attempt 377: Error rate 43.75% (target: 15%) -2025-09-15T14:20:37.200Z | [OTHER] | Attempt 378: Error rate 51.98% (target: 15%) -2025-09-15T14:20:37.202Z | [OTHER] | Attempt 379: Error rate 59.03% (target: 15%) -2025-09-15T14:20:37.204Z | [OTHER] | Attempt 380: Error rate 55.19% (target: 15%) -2025-09-15T14:20:37.205Z | [OTHER] | Attempt 381: Error rate 62.2% (target: 15%) -2025-09-15T14:20:37.208Z | [OTHER] | Attempt 382: Error rate 54.55% (target: 15%) -2025-09-15T14:20:37.209Z | [OTHER] | Attempt 383: Error rate 53.33% (target: 15%) -2025-09-15T14:20:37.211Z | [OTHER] | Attempt 384: Error rate 53.97% (target: 15%) -2025-09-15T14:20:37.212Z | [OTHER] | Attempt 385: Error rate 54.81% (target: 15%) -2025-09-15T14:20:37.214Z | [OTHER] | Attempt 386: Error rate 50.9% (target: 15%) -2025-09-15T14:20:37.215Z | [OTHER] | Attempt 387: Error rate 52.85% (target: 15%) -2025-09-15T14:20:37.217Z | [OTHER] | Attempt 388: Error rate 52.85% (target: 15%) -2025-09-15T14:20:37.218Z | [OTHER] | Attempt 389: Error rate 51.94% (target: 15%) -2025-09-15T14:20:37.220Z | [OTHER] | Attempt 390: Error rate 50.36% (target: 15%) -2025-09-15T14:20:37.221Z | [OTHER] | Attempt 391: Error rate 53.47% (target: 15%) -2025-09-15T14:20:37.223Z | [OTHER] | Attempt 392: Error rate 54.58% (target: 15%) -2025-09-15T14:20:37.224Z | [OTHER] | Attempt 393: Error rate 57.78% (target: 15%) -2025-09-15T14:20:37.226Z | [OTHER] | Attempt 394: Error rate 52.27% (target: 15%) -2025-09-15T14:20:37.227Z | [OTHER] | Attempt 395: Error rate 49.24% (target: 15%) -2025-09-15T14:20:37.229Z | [OTHER] | Attempt 396: Error rate 52.27% (target: 15%) -2025-09-15T14:20:37.230Z | [OTHER] | Attempt 397: Error rate 57.94% (target: 15%) -2025-09-15T14:20:37.232Z | [OTHER] | Attempt 398: Error rate 50% (target: 15%) -2025-09-15T14:20:37.238Z | [OTHER] | Attempt 399: Error rate 47.86% (target: 15%) -2025-09-15T14:20:37.241Z | [OTHER] | Attempt 400: Error rate 52.92% (target: 15%) -2025-09-15T14:20:37.243Z | [OTHER] | Attempt 401: Error rate 45.83% (target: 15%) -2025-09-15T14:20:37.248Z | [OTHER] | Attempt 402: Error rate 49.59% (target: 15%) -2025-09-15T14:20:37.252Z | [OTHER] | Attempt 403: Error rate 56.59% (target: 15%) -2025-09-15T14:20:37.254Z | [OTHER] | Attempt 404: Error rate 52.9% (target: 15%) -2025-09-15T14:20:37.256Z | [OTHER] | Attempt 405: Error rate 56.67% (target: 15%) -2025-09-15T14:20:37.259Z | [OTHER] | Attempt 406: Error rate 56.14% (target: 15%) -2025-09-15T14:20:37.261Z | [OTHER] | Attempt 407: Error rate 49.63% (target: 15%) -2025-09-15T14:20:37.263Z | [OTHER] | Attempt 408: Error rate 49.58% (target: 15%) -2025-09-15T14:20:37.265Z | [OTHER] | Attempt 409: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.267Z | [OTHER] | Attempt 410: Error rate 48.84% (target: 15%) -2025-09-15T14:20:37.269Z | [OTHER] | Attempt 411: Error rate 49.19% (target: 15%) -2025-09-15T14:20:37.272Z | [OTHER] | Attempt 412: Error rate 52.25% (target: 15%) -2025-09-15T14:20:37.274Z | [OTHER] | Attempt 413: Error rate 50% (target: 15%) -2025-09-15T14:20:37.277Z | [OTHER] | Attempt 414: Error rate 54.61% (target: 15%) -2025-09-15T14:20:37.279Z | [OTHER] | Attempt 415: Error rate 49.1% (target: 15%) -2025-09-15T14:20:37.281Z | [OTHER] | Attempt 416: Error rate 47% (target: 15%) -2025-09-15T14:20:37.284Z | [OTHER] | Attempt 417: Error rate 45.12% (target: 15%) -2025-09-15T14:20:37.286Z | [OTHER] | Attempt 418: Error rate 55.8% (target: 15%) -2025-09-15T14:20:37.287Z | [OTHER] | Attempt 419: Error rate 53.66% (target: 15%) -2025-09-15T14:20:37.289Z | [OTHER] | Attempt 420: Error rate 51.48% (target: 15%) -2025-09-15T14:20:37.291Z | [OTHER] | Attempt 421: Error rate 50% (target: 15%) -2025-09-15T14:20:37.293Z | [OTHER] | Attempt 422: Error rate 52.22% (target: 15%) -2025-09-15T14:20:37.296Z | [OTHER] | Attempt 423: Error rate 51.59% (target: 15%) -2025-09-15T14:20:37.298Z | [OTHER] | Attempt 424: Error rate 39.74% (target: 15%) -2025-09-15T14:20:37.301Z | [OTHER] | Attempt 425: Error rate 52.71% (target: 15%) -2025-09-15T14:20:37.303Z | [OTHER] | Attempt 426: Error rate 50.78% (target: 15%) -2025-09-15T14:20:37.305Z | [OTHER] | Attempt 427: Error rate 45.12% (target: 15%) -2025-09-15T14:20:37.308Z | [OTHER] | Attempt 428: Error rate 55.3% (target: 15%) -2025-09-15T14:20:37.313Z | [OTHER] | Attempt 429: Error rate 48.81% (target: 15%) -2025-09-15T14:20:37.314Z | [OTHER] | Attempt 430: Error rate 52.48% (target: 15%) -2025-09-15T14:20:37.316Z | [OTHER] | Attempt 431: Error rate 48.29% (target: 15%) -2025-09-15T14:20:37.317Z | [OTHER] | Attempt 432: Error rate 53.88% (target: 15%) -2025-09-15T14:20:37.319Z | [OTHER] | Attempt 433: Error rate 50.4% (target: 15%) -2025-09-15T14:20:37.321Z | [OTHER] | Attempt 434: Error rate 55.8% (target: 15%) -2025-09-15T14:20:37.322Z | [OTHER] | Attempt 435: Error rate 53.67% (target: 15%) -2025-09-15T14:20:37.324Z | [OTHER] | Attempt 436: Error rate 50.83% (target: 15%) -2025-09-15T14:20:37.326Z | [OTHER] | Attempt 437: Error rate 53.57% (target: 15%) -2025-09-15T14:20:37.327Z | [OTHER] | Attempt 438: Error rate 54.71% (target: 15%) -2025-09-15T14:20:37.329Z | [OTHER] | Attempt 439: Error rate 57.36% (target: 15%) -2025-09-15T14:20:37.331Z | [OTHER] | Attempt 440: Error rate 54.81% (target: 15%) -2025-09-15T14:20:37.332Z | [OTHER] | Attempt 441: Error rate 47.73% (target: 15%) -2025-09-15T14:20:37.334Z | [OTHER] | Attempt 442: Error rate 51.74% (target: 15%) -2025-09-15T14:20:37.335Z | [OTHER] | Attempt 443: Error rate 57.58% (target: 15%) -2025-09-15T14:20:37.338Z | [OTHER] | Attempt 444: Error rate 53.97% (target: 15%) -2025-09-15T14:20:37.339Z | [OTHER] | Attempt 445: Error rate 58.14% (target: 15%) -2025-09-15T14:20:37.341Z | [OTHER] | Attempt 446: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.343Z | [OTHER] | Attempt 447: Error rate 49.24% (target: 15%) -2025-09-15T14:20:37.344Z | [OTHER] | Attempt 448: Error rate 53.33% (target: 15%) -2025-09-15T14:20:37.348Z | [OTHER] | Attempt 449: Error rate 41.67% (target: 15%) -2025-09-15T14:20:37.349Z | [OTHER] | Attempt 450: Error rate 45.73% (target: 15%) -2025-09-15T14:20:37.351Z | [OTHER] | Attempt 451: Error rate 54.7% (target: 15%) -2025-09-15T14:20:37.353Z | [OTHER] | Attempt 452: Error rate 58.14% (target: 15%) -2025-09-15T14:20:37.355Z | [OTHER] | Attempt 453: Error rate 52.38% (target: 15%) -2025-09-15T14:20:37.356Z | [OTHER] | Attempt 454: Error rate 48.61% (target: 15%) -2025-09-15T14:20:37.358Z | [OTHER] | Attempt 455: Error rate 48.15% (target: 15%) -2025-09-15T14:20:37.359Z | [OTHER] | Attempt 456: Error rate 55.56% (target: 15%) -2025-09-15T14:20:37.361Z | [OTHER] | Attempt 457: Error rate 48.15% (target: 15%) -2025-09-15T14:20:37.363Z | [OTHER] | Attempt 458: Error rate 59.92% (target: 15%) -2025-09-15T14:20:37.364Z | [OTHER] | Attempt 459: Error rate 52.38% (target: 15%) -2025-09-15T14:20:37.366Z | [OTHER] | Attempt 460: Error rate 49.65% (target: 15%) -2025-09-15T14:20:37.368Z | [OTHER] | Attempt 461: Error rate 56.12% (target: 15%) -2025-09-15T14:20:37.369Z | [OTHER] | Attempt 462: Error rate 48.26% (target: 15%) -2025-09-15T14:20:37.371Z | [OTHER] | Attempt 463: Error rate 54.81% (target: 15%) -2025-09-15T14:20:37.373Z | [OTHER] | Attempt 464: Error rate 54.37% (target: 15%) -2025-09-15T14:20:37.375Z | [OTHER] | Attempt 465: Error rate 52.13% (target: 15%) -2025-09-15T14:20:37.377Z | [OTHER] | Attempt 466: Error rate 54.76% (target: 15%) -2025-09-15T14:20:37.378Z | [OTHER] | Attempt 467: Error rate 53.79% (target: 15%) -2025-09-15T14:20:37.380Z | [OTHER] | Attempt 468: Error rate 57.54% (target: 15%) -2025-09-15T14:20:37.382Z | [OTHER] | Attempt 469: Error rate 56.3% (target: 15%) -2025-09-15T14:20:37.383Z | [OTHER] | Attempt 470: Error rate 47.04% (target: 15%) -2025-09-15T14:20:37.387Z | [OTHER] | Attempt 471: Error rate 47.87% (target: 15%) -2025-09-15T14:20:37.388Z | [OTHER] | Attempt 472: Error rate 53.41% (target: 15%) -2025-09-15T14:20:37.390Z | [OTHER] | Attempt 473: Error rate 50.39% (target: 15%) -2025-09-15T14:20:37.391Z | [OTHER] | Attempt 474: Error rate 49.69% (target: 15%) -2025-09-15T14:20:37.393Z | [OTHER] | Attempt 475: Error rate 47.62% (target: 15%) -2025-09-15T14:20:37.394Z | [OTHER] | Attempt 476: Error rate 55.93% (target: 15%) -2025-09-15T14:20:37.396Z | [OTHER] | Attempt 477: Error rate 49.62% (target: 15%) -2025-09-15T14:20:37.398Z | [OTHER] | Attempt 478: Error rate 50% (target: 15%) -2025-09-15T14:20:37.400Z | [OTHER] | Attempt 479: Error rate 46.81% (target: 15%) -2025-09-15T14:20:37.401Z | [OTHER] | Attempt 480: Error rate 53.4% (target: 15%) -2025-09-15T14:20:37.403Z | [OTHER] | Attempt 481: Error rate 53.41% (target: 15%) -2025-09-15T14:20:37.405Z | [OTHER] | Attempt 482: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.406Z | [OTHER] | Attempt 483: Error rate 56.2% (target: 15%) -2025-09-15T14:20:37.409Z | [OTHER] | Attempt 484: Error rate 55.81% (target: 15%) -2025-09-15T14:20:37.411Z | [OTHER] | Attempt 485: Error rate 54.9% (target: 15%) -2025-09-15T14:20:37.412Z | [OTHER] | Attempt 486: Error rate 55.16% (target: 15%) -2025-09-15T14:20:37.414Z | [OTHER] | Attempt 487: Error rate 57.14% (target: 15%) -2025-09-15T14:20:37.416Z | [OTHER] | Attempt 488: Error rate 47.22% (target: 15%) -2025-09-15T14:20:37.417Z | [OTHER] | Attempt 489: Error rate 47.97% (target: 15%) -2025-09-15T14:20:37.419Z | [OTHER] | Attempt 490: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.422Z | [OTHER] | Attempt 491: Error rate 56.2% (target: 15%) -2025-09-15T14:20:37.424Z | [OTHER] | Attempt 492: Error rate 53.79% (target: 15%) -2025-09-15T14:20:37.425Z | [OTHER] | Attempt 493: Error rate 55.16% (target: 15%) -2025-09-15T14:20:37.427Z | [OTHER] | Attempt 494: Error rate 52.5% (target: 15%) -2025-09-15T14:20:37.428Z | [OTHER] | Attempt 495: Error rate 53.57% (target: 15%) -2025-09-15T14:20:37.430Z | [OTHER] | Attempt 496: Error rate 48.84% (target: 15%) -2025-09-15T14:20:37.432Z | [OTHER] | Attempt 497: Error rate 41.29% (target: 15%) -2025-09-15T14:20:37.433Z | [OTHER] | Attempt 498: Error rate 52.17% (target: 15%) -2025-09-15T14:20:37.435Z | [OTHER] | Attempt 499: Error rate 58.14% (target: 15%) -2025-09-15T14:20:37.437Z | [OTHER] | Attempt 500: Error rate 51.42% (target: 15%) -2025-09-15T14:20:37.438Z | [OTHER] | Attempt 501: Error rate 47.08% (target: 15%) -2025-09-15T14:20:37.440Z | [OTHER] | Attempt 502: Error rate 39.26% (target: 15%) -2025-09-15T14:20:37.441Z | [OTHER] | Attempt 503: Error rate 46.12% (target: 15%) -2025-09-15T14:20:37.444Z | [OTHER] | Attempt 504: Error rate 51.81% (target: 15%) -2025-09-15T14:20:37.447Z | [OTHER] | Attempt 505: Error rate 51.14% (target: 15%) -2025-09-15T14:20:37.448Z | [OTHER] | Attempt 506: Error rate 59.78% (target: 15%) -2025-09-15T14:20:37.450Z | [OTHER] | Attempt 507: Error rate 52.85% (target: 15%) -2025-09-15T14:20:37.452Z | [OTHER] | Attempt 508: Error rate 58.75% (target: 15%) -2025-09-15T14:20:37.453Z | [OTHER] | Attempt 509: Error rate 55.28% (target: 15%) -2025-09-15T14:20:37.455Z | [OTHER] | Attempt 510: Error rate 51.28% (target: 15%) -2025-09-15T14:20:37.456Z | [OTHER] | Attempt 511: Error rate 46.74% (target: 15%) -2025-09-15T14:20:37.458Z | [OTHER] | Attempt 512: Error rate 51.14% (target: 15%) -2025-09-15T14:20:37.459Z | [OTHER] | Attempt 513: Error rate 57.95% (target: 15%) -2025-09-15T14:20:37.461Z | [OTHER] | Attempt 514: Error rate 52.27% (target: 15%) -2025-09-15T14:20:37.463Z | [OTHER] | Attempt 515: Error rate 54.86% (target: 15%) -2025-09-15T14:20:37.464Z | [OTHER] | Attempt 516: Error rate 53.07% (target: 15%) -2025-09-15T14:20:37.466Z | [OTHER] | Attempt 517: Error rate 48.89% (target: 15%) -2025-09-15T14:20:37.467Z | [OTHER] | Attempt 518: Error rate 55.9% (target: 15%) -2025-09-15T14:20:37.469Z | [OTHER] | Attempt 519: Error rate 58.94% (target: 15%) -2025-09-15T14:20:37.471Z | [OTHER] | Attempt 520: Error rate 50.35% (target: 15%) -2025-09-15T14:20:37.472Z | [OTHER] | Attempt 521: Error rate 44.57% (target: 15%) -2025-09-15T14:20:37.474Z | [OTHER] | Attempt 522: Error rate 48.84% (target: 15%) -2025-09-15T14:20:37.476Z | [OTHER] | Attempt 523: Error rate 51.67% (target: 15%) -2025-09-15T14:20:37.479Z | [OTHER] | Attempt 524: Error rate 51.45% (target: 15%) -2025-09-15T14:20:37.480Z | [OTHER] | Attempt 525: Error rate 51.02% (target: 15%) -2025-09-15T14:20:37.482Z | [OTHER] | Attempt 526: Error rate 55.13% (target: 15%) -2025-09-15T14:20:37.484Z | [OTHER] | Attempt 527: Error rate 51.67% (target: 15%) -2025-09-15T14:20:37.485Z | [OTHER] | Attempt 528: Error rate 52.17% (target: 15%) -2025-09-15T14:20:37.486Z | [OTHER] | Attempt 529: Error rate 52.22% (target: 15%) -2025-09-15T14:20:37.488Z | [OTHER] | Attempt 530: Error rate 50% (target: 15%) -2025-09-15T14:20:37.490Z | [OTHER] | Attempt 531: Error rate 53.99% (target: 15%) -2025-09-15T14:20:37.491Z | [OTHER] | Attempt 532: Error rate 52.25% (target: 15%) -2025-09-15T14:20:37.493Z | [OTHER] | Attempt 533: Error rate 47.22% (target: 15%) -2025-09-15T14:20:37.494Z | [OTHER] | Attempt 534: Error rate 50% (target: 15%) -2025-09-15T14:20:37.496Z | [OTHER] | Attempt 535: Error rate 47.41% (target: 15%) -2025-09-15T14:20:37.497Z | [OTHER] | Attempt 536: Error rate 50% (target: 15%) -2025-09-15T14:20:37.499Z | [OTHER] | Attempt 537: Error rate 57.94% (target: 15%) -2025-09-15T14:20:37.501Z | [OTHER] | Attempt 538: Error rate 58.54% (target: 15%) -2025-09-15T14:20:37.502Z | [OTHER] | Attempt 539: Error rate 54.55% (target: 15%) -2025-09-15T14:20:37.504Z | [OTHER] | Attempt 540: Error rate 47.33% (target: 15%) -2025-09-15T14:20:37.506Z | [OTHER] | Attempt 541: Error rate 59.06% (target: 15%) -2025-09-15T14:20:37.508Z | [OTHER] | Attempt 542: Error rate 59.06% (target: 15%) -2025-09-15T14:20:37.509Z | [OTHER] | Attempt 543: Error rate 53.97% (target: 15%) -2025-09-15T14:20:37.511Z | [OTHER] | Attempt 544: Error rate 50% (target: 15%) -2025-09-15T14:20:37.513Z | [OTHER] | Attempt 545: Error rate 51.11% (target: 15%) -2025-09-15T14:20:37.515Z | [OTHER] | Attempt 546: Error rate 57.78% (target: 15%) -2025-09-15T14:20:37.516Z | [OTHER] | Attempt 547: Error rate 50.36% (target: 15%) -2025-09-15T14:20:37.517Z | [OTHER] | Attempt 548: Error rate 45.42% (target: 15%) -2025-09-15T14:20:37.519Z | [OTHER] | Attempt 549: Error rate 48.58% (target: 15%) -2025-09-15T14:20:37.520Z | [OTHER] | Attempt 550: Error rate 50% (target: 15%) -2025-09-15T14:20:37.522Z | [OTHER] | Attempt 551: Error rate 47.22% (target: 15%) -2025-09-15T14:20:37.523Z | [OTHER] | Attempt 552: Error rate 53.03% (target: 15%) -2025-09-15T14:20:37.525Z | [OTHER] | Attempt 553: Error rate 48.91% (target: 15%) -2025-09-15T14:20:37.527Z | [OTHER] | Attempt 554: Error rate 51.74% (target: 15%) -2025-09-15T14:20:37.528Z | [OTHER] | Attempt 555: Error rate 57.09% (target: 15%) -2025-09-15T14:20:37.530Z | [OTHER] | Attempt 556: Error rate 57.94% (target: 15%) -2025-09-15T14:20:37.531Z | [OTHER] | Attempt 557: Error rate 51.02% (target: 15%) -2025-09-15T14:20:37.532Z | [OTHER] | Attempt 558: Error rate 46.3% (target: 15%) -2025-09-15T14:20:37.534Z | [OTHER] | Attempt 559: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.535Z | [OTHER] | Attempt 560: Error rate 52.9% (target: 15%) -2025-09-15T14:20:37.537Z | [OTHER] | Attempt 561: Error rate 54.92% (target: 15%) -2025-09-15T14:20:37.539Z | [OTHER] | Attempt 562: Error rate 57.36% (target: 15%) -2025-09-15T14:20:37.540Z | [OTHER] | Attempt 563: Error rate 52.44% (target: 15%) -2025-09-15T14:20:37.542Z | [OTHER] | Attempt 564: Error rate 48.84% (target: 15%) -2025-09-15T14:20:37.544Z | [OTHER] | Attempt 565: Error rate 52.59% (target: 15%) -2025-09-15T14:20:37.545Z | [OTHER] | Attempt 566: Error rate 46.67% (target: 15%) -2025-09-15T14:20:37.547Z | [OTHER] | Attempt 567: Error rate 50% (target: 15%) -2025-09-15T14:20:37.548Z | [OTHER] | Attempt 568: Error rate 46.83% (target: 15%) -2025-09-15T14:20:37.550Z | [OTHER] | Attempt 569: Error rate 50.4% (target: 15%) -2025-09-15T14:20:37.551Z | [OTHER] | Attempt 570: Error rate 56.91% (target: 15%) -2025-09-15T14:20:37.553Z | [OTHER] | Attempt 571: Error rate 47.62% (target: 15%) -2025-09-15T14:20:37.554Z | [OTHER] | Attempt 572: Error rate 51.89% (target: 15%) -2025-09-15T14:20:37.556Z | [OTHER] | Attempt 573: Error rate 57.45% (target: 15%) -2025-09-15T14:20:37.557Z | [OTHER] | Attempt 574: Error rate 53.17% (target: 15%) -2025-09-15T14:20:37.559Z | [OTHER] | Attempt 575: Error rate 44.7% (target: 15%) -2025-09-15T14:20:37.560Z | [OTHER] | Attempt 576: Error rate 45.93% (target: 15%) -2025-09-15T14:20:37.562Z | [OTHER] | Attempt 577: Error rate 53.41% (target: 15%) -2025-09-15T14:20:37.563Z | [OTHER] | Attempt 578: Error rate 47.08% (target: 15%) -2025-09-15T14:20:37.565Z | [OTHER] | Attempt 579: Error rate 56.75% (target: 15%) -2025-09-15T14:20:37.567Z | [OTHER] | Attempt 580: Error rate 45.35% (target: 15%) -2025-09-15T14:20:37.568Z | [OTHER] | Attempt 581: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.570Z | [OTHER] | Attempt 582: Error rate 50.83% (target: 15%) -2025-09-15T14:20:37.572Z | [OTHER] | Attempt 583: Error rate 56.16% (target: 15%) -2025-09-15T14:20:37.573Z | [OTHER] | Attempt 584: Error rate 42.86% (target: 15%) -2025-09-15T14:20:37.575Z | [OTHER] | Attempt 585: Error rate 52.9% (target: 15%) -2025-09-15T14:20:37.577Z | [OTHER] | Attempt 586: Error rate 54.7% (target: 15%) -2025-09-15T14:20:37.579Z | [OTHER] | Attempt 587: Error rate 53.55% (target: 15%) -2025-09-15T14:20:37.580Z | [OTHER] | Attempt 588: Error rate 51.48% (target: 15%) -2025-09-15T14:20:37.582Z | [OTHER] | Attempt 589: Error rate 49.19% (target: 15%) -2025-09-15T14:20:37.584Z | [OTHER] | Attempt 590: Error rate 51.59% (target: 15%) -2025-09-15T14:20:37.586Z | [OTHER] | Attempt 591: Error rate 48.37% (target: 15%) -2025-09-15T14:20:37.587Z | [OTHER] | Attempt 592: Error rate 54% (target: 15%) -2025-09-15T14:20:37.589Z | [OTHER] | Attempt 593: Error rate 49.58% (target: 15%) -2025-09-15T14:20:37.590Z | [OTHER] | Attempt 594: Error rate 57.04% (target: 15%) -2025-09-15T14:20:37.592Z | [OTHER] | Attempt 595: Error rate 57.72% (target: 15%) -2025-09-15T14:20:37.593Z | [OTHER] | Attempt 596: Error rate 51.42% (target: 15%) -2025-09-15T14:20:37.595Z | [OTHER] | Attempt 597: Error rate 51.19% (target: 15%) -2025-09-15T14:20:37.596Z | [OTHER] | Attempt 598: Error rate 40.94% (target: 15%) -2025-09-15T14:20:37.598Z | [OTHER] | Attempt 599: Error rate 42.31% (target: 15%) -2025-09-15T14:20:37.599Z | [OTHER] | Attempt 600: Error rate 53.74% (target: 15%) -2025-09-15T14:20:37.601Z | [OTHER] | Attempt 601: Error rate 50.37% (target: 15%) -2025-09-15T14:20:37.602Z | [OTHER] | Attempt 602: Error rate 55.04% (target: 15%) -2025-09-15T14:20:37.604Z | [OTHER] | Attempt 603: Error rate 49.64% (target: 15%) -2025-09-15T14:20:37.605Z | [OTHER] | Attempt 604: Error rate 54.07% (target: 15%) -2025-09-15T14:20:37.606Z | [OTHER] | Attempt 605: Error rate 50.78% (target: 15%) -2025-09-15T14:20:37.609Z | [OTHER] | Attempt 606: Error rate 50% (target: 15%) -2025-09-15T14:20:37.611Z | [OTHER] | Attempt 607: Error rate 51.06% (target: 15%) -2025-09-15T14:20:37.612Z | [OTHER] | Attempt 608: Error rate 47.29% (target: 15%) -2025-09-15T14:20:37.613Z | [OTHER] | Attempt 609: Error rate 53.1% (target: 15%) -2025-09-15T14:20:37.615Z | [OTHER] | Attempt 610: Error rate 54.58% (target: 15%) -2025-09-15T14:20:37.617Z | [OTHER] | Attempt 611: Error rate 51.63% (target: 15%) -2025-09-15T14:20:37.618Z | [OTHER] | Attempt 612: Error rate 57.78% (target: 15%) -2025-09-15T14:20:37.620Z | [OTHER] | Attempt 613: Error rate 57.97% (target: 15%) -2025-09-15T14:20:37.621Z | [OTHER] | Attempt 614: Error rate 56.3% (target: 15%) -2025-09-15T14:20:37.623Z | [OTHER] | Attempt 615: Error rate 52.33% (target: 15%) -2025-09-15T14:20:37.624Z | [OTHER] | Attempt 616: Error rate 51.81% (target: 15%) -2025-09-15T14:20:37.626Z | [OTHER] | Attempt 617: Error rate 54.37% (target: 15%) -2025-09-15T14:20:37.627Z | [OTHER] | Attempt 618: Error rate 52.56% (target: 15%) -2025-09-15T14:20:37.629Z | [OTHER] | Attempt 619: Error rate 45.73% (target: 15%) -2025-09-15T14:20:37.630Z | [OTHER] | Attempt 620: Error rate 48.55% (target: 15%) -2025-09-15T14:20:37.632Z | [OTHER] | Attempt 621: Error rate 50.35% (target: 15%) -2025-09-15T14:20:37.633Z | [OTHER] | Attempt 622: Error rate 52.33% (target: 15%) -2025-09-15T14:20:37.635Z | [OTHER] | Attempt 623: Error rate 50.35% (target: 15%) -2025-09-15T14:20:37.636Z | [OTHER] | Attempt 624: Error rate 54.81% (target: 15%) -2025-09-15T14:20:37.638Z | [OTHER] | Attempt 625: Error rate 48.58% (target: 15%) -2025-09-15T14:20:37.640Z | [OTHER] | Attempt 626: Error rate 54.07% (target: 15%) -2025-09-15T14:20:37.642Z | [OTHER] | Attempt 627: Error rate 54.44% (target: 15%) -2025-09-15T14:20:37.643Z | [OTHER] | Attempt 628: Error rate 60.74% (target: 15%) -2025-09-15T14:20:37.645Z | [OTHER] | Attempt 629: Error rate 57.99% (target: 15%) -2025-09-15T14:20:37.646Z | [OTHER] | Attempt 630: Error rate 52.33% (target: 15%) -2025-09-15T14:20:37.648Z | [OTHER] | Attempt 631: Error rate 53.79% (target: 15%) -2025-09-15T14:20:37.649Z | [OTHER] | Attempt 632: Error rate 46.9% (target: 15%) -2025-09-15T14:20:37.651Z | [OTHER] | Attempt 633: Error rate 47.87% (target: 15%) -2025-09-15T14:20:37.652Z | [OTHER] | Attempt 634: Error rate 48.58% (target: 15%) -2025-09-15T14:20:37.654Z | [OTHER] | Attempt 635: Error rate 52.38% (target: 15%) -2025-09-15T14:20:37.655Z | [OTHER] | Attempt 636: Error rate 51.22% (target: 15%) -2025-09-15T14:20:37.657Z | [OTHER] | Attempt 637: Error rate 55.07% (target: 15%) -2025-09-15T14:20:37.658Z | [OTHER] | Attempt 638: Error rate 46.51% (target: 15%) -2025-09-15T14:20:37.660Z | [OTHER] | Attempt 639: Error rate 53.88% (target: 15%) -2025-09-15T14:20:37.661Z | [OTHER] | Attempt 640: Error rate 57.25% (target: 15%) -2025-09-15T14:20:37.663Z | [OTHER] | Attempt 641: Error rate 49.6% (target: 15%) -2025-09-15T14:20:37.664Z | [OTHER] | Attempt 642: Error rate 55.19% (target: 15%) -2025-09-15T14:20:37.666Z | [OTHER] | Attempt 643: Error rate 52.96% (target: 15%) -2025-09-15T14:20:37.668Z | [OTHER] | Attempt 644: Error rate 45.18% (target: 15%) -2025-09-15T14:20:37.669Z | [OTHER] | Attempt 645: Error rate 52.33% (target: 15%) -2025-09-15T14:20:37.672Z | [OTHER] | Attempt 646: Error rate 51.74% (target: 15%) -2025-09-15T14:20:37.673Z | [OTHER] | Attempt 647: Error rate 50% (target: 15%) -2025-09-15T14:20:37.675Z | [OTHER] | Attempt 648: Error rate 54.65% (target: 15%) -2025-09-15T14:20:37.677Z | [OTHER] | Attempt 649: Error rate 55.69% (target: 15%) -2025-09-15T14:20:37.678Z | [OTHER] | Attempt 650: Error rate 51.81% (target: 15%) -2025-09-15T14:20:37.680Z | [OTHER] | Attempt 651: Error rate 57.2% (target: 15%) -2025-09-15T14:20:37.681Z | [OTHER] | Attempt 652: Error rate 50.81% (target: 15%) -2025-09-15T14:20:37.683Z | [OTHER] | Attempt 653: Error rate 47.83% (target: 15%) -2025-09-15T14:20:37.684Z | [OTHER] | Attempt 654: Error rate 60.71% (target: 15%) -2025-09-15T14:20:37.685Z | [OTHER] | Attempt 655: Error rate 54.07% (target: 15%) -2025-09-15T14:20:37.687Z | [OTHER] | Attempt 656: Error rate 58.91% (target: 15%) -2025-09-15T14:20:37.689Z | [OTHER] | Attempt 657: Error rate 51.22% (target: 15%) -2025-09-15T14:20:37.690Z | [OTHER] | Attempt 658: Error rate 48.06% (target: 15%) -2025-09-15T14:20:37.691Z | [OTHER] | Attempt 659: Error rate 39.43% (target: 15%) -2025-09-15T14:20:37.693Z | [OTHER] | Attempt 660: Error rate 55.43% (target: 15%) -2025-09-15T14:20:37.695Z | [OTHER] | Attempt 661: Error rate 48.48% (target: 15%) -2025-09-15T14:20:37.696Z | [OTHER] | Attempt 662: Error rate 49.6% (target: 15%) -2025-09-15T14:20:37.697Z | [OTHER] | Attempt 663: Error rate 55.3% (target: 15%) -2025-09-15T14:20:37.699Z | [OTHER] | Attempt 664: Error rate 53.06% (target: 15%) -2025-09-15T14:20:37.701Z | [OTHER] | Attempt 665: Error rate 46.97% (target: 15%) -2025-09-15T14:20:37.702Z | [OTHER] | Attempt 666: Error rate 53.49% (target: 15%) -2025-09-15T14:20:37.705Z | [OTHER] | Attempt 667: Error rate 55.83% (target: 15%) -2025-09-15T14:20:37.706Z | [OTHER] | Attempt 668: Error rate 44.44% (target: 15%) -2025-09-15T14:20:37.708Z | [OTHER] | Attempt 669: Error rate 49.33% (target: 15%) -2025-09-15T14:20:37.709Z | [OTHER] | Attempt 670: Error rate 56.03% (target: 15%) -2025-09-15T14:20:37.711Z | [OTHER] | Attempt 671: Error rate 57.2% (target: 15%) -2025-09-15T14:20:37.713Z | [OTHER] | Attempt 672: Error rate 43.09% (target: 15%) -2025-09-15T14:20:37.714Z | [OTHER] | Attempt 673: Error rate 48.19% (target: 15%) -2025-09-15T14:20:37.715Z | [OTHER] | Attempt 674: Error rate 43.25% (target: 15%) -2025-09-15T14:20:37.717Z | [OTHER] | Attempt 675: Error rate 53.1% (target: 15%) -2025-09-15T14:20:37.719Z | [OTHER] | Attempt 676: Error rate 55.56% (target: 15%) -2025-09-15T14:20:37.720Z | [OTHER] | Attempt 677: Error rate 53.03% (target: 15%) -2025-09-15T14:20:37.722Z | [OTHER] | Attempt 678: Error rate 54.17% (target: 15%) -2025-09-15T14:20:37.723Z | [OTHER] | Attempt 679: Error rate 58.94% (target: 15%) -2025-09-15T14:20:37.725Z | [OTHER] | Attempt 680: Error rate 57.2% (target: 15%) -2025-09-15T14:20:37.726Z | [OTHER] | Attempt 681: Error rate 46.67% (target: 15%) -2025-09-15T14:20:37.728Z | [OTHER] | Attempt 682: Error rate 51.06% (target: 15%) -2025-09-15T14:20:37.729Z | [OTHER] | Attempt 683: Error rate 51.89% (target: 15%) -2025-09-15T14:20:37.731Z | [OTHER] | Attempt 684: Error rate 51.89% (target: 15%) -2025-09-15T14:20:37.732Z | [OTHER] | Attempt 685: Error rate 53.19% (target: 15%) -2025-09-15T14:20:37.734Z | [OTHER] | Attempt 686: Error rate 55.21% (target: 15%) -2025-09-15T14:20:37.737Z | [OTHER] | Attempt 687: Error rate 55.8% (target: 15%) -2025-09-15T14:20:37.738Z | [OTHER] | Attempt 688: Error rate 51.45% (target: 15%) -2025-09-15T14:20:37.740Z | [OTHER] | Attempt 689: Error rate 48.55% (target: 15%) -2025-09-15T14:20:37.741Z | [OTHER] | Attempt 690: Error rate 46.58% (target: 15%) -2025-09-15T14:20:37.743Z | [OTHER] | Attempt 691: Error rate 53.41% (target: 15%) -2025-09-15T14:20:37.744Z | [OTHER] | Attempt 692: Error rate 52.04% (target: 15%) -2025-09-15T14:20:37.746Z | [OTHER] | Attempt 693: Error rate 50% (target: 15%) -2025-09-15T14:20:37.747Z | [OTHER] | Attempt 694: Error rate 45.74% (target: 15%) -2025-09-15T14:20:37.749Z | [OTHER] | Attempt 695: Error rate 55.8% (target: 15%) -2025-09-15T14:20:37.751Z | [OTHER] | Attempt 696: Error rate 52.44% (target: 15%) -2025-09-15T14:20:37.752Z | [OTHER] | Attempt 697: Error rate 53.17% (target: 15%) -2025-09-15T14:20:37.754Z | [OTHER] | Attempt 698: Error rate 55.26% (target: 15%) -2025-09-15T14:20:37.755Z | [OTHER] | Attempt 699: Error rate 45.83% (target: 15%) -2025-09-15T14:20:37.757Z | [OTHER] | Attempt 700: Error rate 44.33% (target: 15%) -2025-09-15T14:20:37.758Z | [OTHER] | Attempt 701: Error rate 50.83% (target: 15%) -2025-09-15T14:20:37.760Z | [OTHER] | Attempt 702: Error rate 49.59% (target: 15%) -2025-09-15T14:20:37.761Z | [OTHER] | Attempt 703: Error rate 47.5% (target: 15%) -2025-09-15T14:20:37.763Z | [OTHER] | Attempt 704: Error rate 51.11% (target: 15%) -2025-09-15T14:20:37.764Z | [OTHER] | Attempt 705: Error rate 53.57% (target: 15%) -2025-09-15T14:20:37.766Z | [OTHER] | Attempt 706: Error rate 53.47% (target: 15%) -2025-09-15T14:20:37.769Z | [OTHER] | Attempt 707: Error rate 52.71% (target: 15%) -2025-09-15T14:20:37.770Z | [OTHER] | Attempt 708: Error rate 63.68% (target: 15%) -2025-09-15T14:20:37.772Z | [OTHER] | Attempt 709: Error rate 51.74% (target: 15%) -2025-09-15T14:20:37.773Z | [OTHER] | Attempt 710: Error rate 54.61% (target: 15%) -2025-09-15T14:20:37.775Z | [OTHER] | Attempt 711: Error rate 47.08% (target: 15%) -2025-09-15T14:20:37.776Z | [OTHER] | Attempt 712: Error rate 61.25% (target: 15%) -2025-09-15T14:20:37.778Z | [OTHER] | Attempt 713: Error rate 48.45% (target: 15%) -2025-09-15T14:20:37.780Z | [OTHER] | Attempt 714: Error rate 55.19% (target: 15%) -2025-09-15T14:20:37.781Z | [OTHER] | Attempt 715: Error rate 48.15% (target: 15%) -2025-09-15T14:20:37.783Z | [OTHER] | Attempt 716: Error rate 46.9% (target: 15%) -2025-09-15T14:20:37.784Z | [OTHER] | Attempt 717: Error rate 50.71% (target: 15%) -2025-09-15T14:20:37.786Z | [OTHER] | Attempt 718: Error rate 58.16% (target: 15%) -2025-09-15T14:20:37.787Z | [OTHER] | Attempt 719: Error rate 58.13% (target: 15%) -2025-09-15T14:20:37.789Z | [OTHER] | Attempt 720: Error rate 43.97% (target: 15%) -2025-09-15T14:20:37.790Z | [OTHER] | Attempt 721: Error rate 51.52% (target: 15%) -2025-09-15T14:20:37.792Z | [OTHER] | Attempt 722: Error rate 59.3% (target: 15%) -2025-09-15T14:20:37.793Z | [OTHER] | Attempt 723: Error rate 52.92% (target: 15%) -2025-09-15T14:20:37.795Z | [OTHER] | Attempt 724: Error rate 51.55% (target: 15%) -2025-09-15T14:20:37.797Z | [OTHER] | Attempt 725: Error rate 51.14% (target: 15%) -2025-09-15T14:20:37.798Z | [OTHER] | Attempt 726: Error rate 54.47% (target: 15%) -2025-09-15T14:20:37.800Z | [OTHER] | Attempt 727: Error rate 57.95% (target: 15%) -2025-09-15T14:20:37.802Z | [OTHER] | Attempt 728: Error rate 50.36% (target: 15%) -2025-09-15T14:20:37.804Z | [OTHER] | Attempt 729: Error rate 42.36% (target: 15%) -2025-09-15T14:20:37.805Z | [OTHER] | Attempt 730: Error rate 54.51% (target: 15%) -2025-09-15T14:20:37.807Z | [OTHER] | Attempt 731: Error rate 57.2% (target: 15%) -2025-09-15T14:20:37.809Z | [OTHER] | Attempt 732: Error rate 51.48% (target: 15%) -2025-09-15T14:20:37.810Z | [OTHER] | Attempt 733: Error rate 52.48% (target: 15%) -2025-09-15T14:20:37.812Z | [OTHER] | Attempt 734: Error rate 48.26% (target: 15%) -2025-09-15T14:20:37.813Z | [OTHER] | Attempt 735: Error rate 52.22% (target: 15%) -2025-09-15T14:20:37.815Z | [OTHER] | Attempt 736: Error rate 46.21% (target: 15%) -2025-09-15T14:20:37.817Z | [OTHER] | Attempt 737: Error rate 51.77% (target: 15%) -2025-09-15T14:20:37.818Z | [OTHER] | Attempt 738: Error rate 45.35% (target: 15%) -2025-09-15T14:20:37.820Z | [OTHER] | Attempt 739: Error rate 47.87% (target: 15%) -2025-09-15T14:20:37.821Z | [OTHER] | Attempt 740: Error rate 51.55% (target: 15%) -2025-09-15T14:20:37.823Z | [OTHER] | Attempt 741: Error rate 48.06% (target: 15%) -2025-09-15T14:20:37.824Z | [OTHER] | Attempt 742: Error rate 54.39% (target: 15%) -2025-09-15T14:20:37.826Z | [OTHER] | Attempt 743: Error rate 62.12% (target: 15%) -2025-09-15T14:20:37.827Z | [OTHER] | Attempt 744: Error rate 48.94% (target: 15%) -2025-09-15T14:20:37.829Z | [OTHER] | Attempt 745: Error rate 54.96% (target: 15%) -2025-09-15T14:20:37.830Z | [OTHER] | Attempt 746: Error rate 49.63% (target: 15%) -2025-09-15T14:20:37.832Z | [OTHER] | Attempt 747: Error rate 48.84% (target: 15%) -2025-09-15T14:20:37.835Z | [OTHER] | Attempt 748: Error rate 48.78% (target: 15%) -2025-09-15T14:20:37.836Z | [OTHER] | Attempt 749: Error rate 49.59% (target: 15%) -2025-09-15T14:20:37.837Z | [OTHER] | Attempt 750: Error rate 43.65% (target: 15%) -2025-09-15T14:20:37.839Z | [OTHER] | Attempt 751: Error rate 53.26% (target: 15%) -2025-09-15T14:20:37.841Z | [OTHER] | Attempt 752: Error rate 58.16% (target: 15%) -2025-09-15T14:20:37.842Z | [OTHER] | Attempt 753: Error rate 51.19% (target: 15%) -2025-09-15T14:20:37.844Z | [OTHER] | Attempt 754: Error rate 50.39% (target: 15%) -2025-09-15T14:20:37.846Z | [OTHER] | Attempt 755: Error rate 48.11% (target: 15%) -2025-09-15T14:20:37.847Z | [OTHER] | Attempt 756: Error rate 45.04% (target: 15%) -2025-09-15T14:20:37.849Z | [OTHER] | Attempt 757: Error rate 49.15% (target: 15%) -2025-09-15T14:20:37.851Z | [OTHER] | Attempt 758: Error rate 52.59% (target: 15%) -2025-09-15T14:20:37.852Z | [OTHER] | Attempt 759: Error rate 56.6% (target: 15%) -2025-09-15T14:20:37.854Z | [OTHER] | Attempt 760: Error rate 45.53% (target: 15%) -2025-09-15T14:20:37.855Z | [OTHER] | Attempt 761: Error rate 54.26% (target: 15%) -2025-09-15T14:20:37.857Z | [OTHER] | Attempt 762: Error rate 56.82% (target: 15%) -2025-09-15T14:20:37.858Z | [OTHER] | Attempt 763: Error rate 50.78% (target: 15%) -2025-09-15T14:20:37.860Z | [OTHER] | Attempt 764: Error rate 53.9% (target: 15%) -2025-09-15T14:20:37.861Z | [OTHER] | Attempt 765: Error rate 51.59% (target: 15%) -2025-09-15T14:20:37.863Z | [OTHER] | Attempt 766: Error rate 53.03% (target: 15%) -2025-09-15T14:20:37.865Z | [OTHER] | Attempt 767: Error rate 49.6% (target: 15%) -2025-09-15T14:20:37.867Z | [OTHER] | Attempt 768: Error rate 53.42% (target: 15%) -2025-09-15T14:20:37.869Z | [OTHER] | Attempt 769: Error rate 56.84% (target: 15%) -2025-09-15T14:20:37.870Z | [OTHER] | Attempt 770: Error rate 52.48% (target: 15%) -2025-09-15T14:20:37.872Z | [OTHER] | Attempt 771: Error rate 56.46% (target: 15%) -2025-09-15T14:20:37.874Z | [OTHER] | Attempt 772: Error rate 51.04% (target: 15%) -2025-09-15T14:20:37.876Z | [OTHER] | Attempt 773: Error rate 46.34% (target: 15%) -2025-09-15T14:20:37.877Z | [OTHER] | Attempt 774: Error rate 54.37% (target: 15%) -2025-09-15T14:20:37.879Z | [OTHER] | Attempt 775: Error rate 49.59% (target: 15%) -2025-09-15T14:20:37.880Z | [OTHER] | Attempt 776: Error rate 53.99% (target: 15%) -2025-09-15T14:20:37.882Z | [OTHER] | Attempt 777: Error rate 57.29% (target: 15%) -2025-09-15T14:20:37.883Z | [OTHER] | Attempt 778: Error rate 59.33% (target: 15%) -2025-09-15T14:20:37.885Z | [OTHER] | Attempt 779: Error rate 43.02% (target: 15%) -2025-09-15T14:20:37.887Z | [OTHER] | Attempt 780: Error rate 50.79% (target: 15%) -2025-09-15T14:20:37.888Z | [OTHER] | Attempt 781: Error rate 47.41% (target: 15%) -2025-09-15T14:20:37.890Z | [OTHER] | Attempt 782: Error rate 58.53% (target: 15%) -2025-09-15T14:20:37.891Z | [OTHER] | Attempt 783: Error rate 49.22% (target: 15%) -2025-09-15T14:20:37.893Z | [OTHER] | Attempt 784: Error rate 55.3% (target: 15%) -2025-09-15T14:20:37.895Z | [OTHER] | Attempt 785: Error rate 44.44% (target: 15%) -2025-09-15T14:20:37.896Z | [OTHER] | Attempt 786: Error rate 55.07% (target: 15%) -2025-09-15T14:20:37.898Z | [OTHER] | Attempt 787: Error rate 60.71% (target: 15%) -2025-09-15T14:20:37.900Z | [OTHER] | Attempt 788: Error rate 49.6% (target: 15%) -2025-09-15T14:20:37.902Z | [OTHER] | Attempt 789: Error rate 54.92% (target: 15%) -2025-09-15T14:20:37.904Z | [OTHER] | Attempt 790: Error rate 50.74% (target: 15%) -2025-09-15T14:20:37.905Z | [OTHER] | Attempt 791: Error rate 43.41% (target: 15%) -2025-09-15T14:20:37.907Z | [OTHER] | Attempt 792: Error rate 48.48% (target: 15%) -2025-09-15T14:20:37.909Z | [OTHER] | Attempt 793: Error rate 46.97% (target: 15%) -2025-09-15T14:20:37.910Z | [OTHER] | Attempt 794: Error rate 56.67% (target: 15%) -2025-09-15T14:20:37.912Z | [OTHER] | Attempt 795: Error rate 53.41% (target: 15%) -2025-09-15T14:20:37.914Z | [OTHER] | Attempt 796: Error rate 55.43% (target: 15%) -2025-09-15T14:20:37.915Z | [OTHER] | Attempt 797: Error rate 44.57% (target: 15%) -2025-09-15T14:20:37.917Z | [OTHER] | Attempt 798: Error rate 53.26% (target: 15%) -2025-09-15T14:20:37.919Z | [OTHER] | Attempt 799: Error rate 54.92% (target: 15%) -2025-09-15T14:20:37.921Z | [OTHER] | Attempt 800: Error rate 48.15% (target: 15%) -2025-09-15T14:20:37.922Z | [OTHER] | Attempt 801: Error rate 59.93% (target: 15%) -2025-09-15T14:20:37.924Z | [OTHER] | Attempt 802: Error rate 50% (target: 15%) -2025-09-15T14:20:37.925Z | [OTHER] | Attempt 803: Error rate 42.96% (target: 15%) -2025-09-15T14:20:37.927Z | [OTHER] | Attempt 804: Error rate 51.19% (target: 15%) -2025-09-15T14:20:37.928Z | [OTHER] | Attempt 805: Error rate 43.18% (target: 15%) -2025-09-15T14:20:37.930Z | [OTHER] | Attempt 806: Error rate 51.52% (target: 15%) -2025-09-15T14:20:37.932Z | [OTHER] | Attempt 807: Error rate 60.14% (target: 15%) -2025-09-15T14:20:37.934Z | [OTHER] | Attempt 808: Error rate 38.74% (target: 15%) -2025-09-15T14:20:37.936Z | [OTHER] | Attempt 809: Error rate 57.54% (target: 15%) -2025-09-15T14:20:37.938Z | [OTHER] | Attempt 810: Error rate 57.04% (target: 15%) -2025-09-15T14:20:37.944Z | [OTHER] | Attempt 811: Error rate 53.66% (target: 15%) -2025-09-15T14:20:37.946Z | [OTHER] | Attempt 812: Error rate 44.87% (target: 15%) -2025-09-15T14:20:37.950Z | [OTHER] | Attempt 813: Error rate 63.6% (target: 15%) -2025-09-15T14:20:37.952Z | [OTHER] | Attempt 814: Error rate 51.14% (target: 15%) -2025-09-15T14:20:37.955Z | [OTHER] | Attempt 815: Error rate 53.82% (target: 15%) -2025-09-15T14:20:37.957Z | [OTHER] | Attempt 816: Error rate 54.35% (target: 15%) -2025-09-15T14:20:37.960Z | [OTHER] | Attempt 817: Error rate 51.48% (target: 15%) -2025-09-15T14:20:37.962Z | [OTHER] | Attempt 818: Error rate 54.61% (target: 15%) -2025-09-15T14:20:37.971Z | [OTHER] | Attempt 819: Error rate 51.89% (target: 15%) -2025-09-15T14:20:37.977Z | [OTHER] | Attempt 820: Error rate 60.32% (target: 15%) -2025-09-15T14:20:37.981Z | [OTHER] | Attempt 821: Error rate 50.72% (target: 15%) -2025-09-15T14:20:37.989Z | [OTHER] | Attempt 822: Error rate 50.33% (target: 15%) -2025-09-15T14:20:37.993Z | [OTHER] | Attempt 823: Error rate 48.45% (target: 15%) -2025-09-15T14:20:37.997Z | [OTHER] | Attempt 824: Error rate 49.65% (target: 15%) -2025-09-15T14:20:38.001Z | [OTHER] | Attempt 825: Error rate 47.57% (target: 15%) -2025-09-15T14:20:38.006Z | [OTHER] | Attempt 826: Error rate 52.19% (target: 15%) -2025-09-15T14:20:38.011Z | [OTHER] | Attempt 827: Error rate 52.59% (target: 15%) -2025-09-15T14:20:38.013Z | [OTHER] | Attempt 828: Error rate 55.1% (target: 15%) -2025-09-15T14:20:38.018Z | [OTHER] | Attempt 829: Error rate 65.22% (target: 15%) -2025-09-15T14:20:38.020Z | [OTHER] | Attempt 830: Error rate 43.41% (target: 15%) -2025-09-15T14:20:38.022Z | [OTHER] | Attempt 831: Error rate 54.07% (target: 15%) -2025-09-15T14:20:38.024Z | [OTHER] | Attempt 832: Error rate 55.3% (target: 15%) -2025-09-15T14:20:38.025Z | [OTHER] | Attempt 833: Error rate 46.18% (target: 15%) -2025-09-15T14:20:38.027Z | [OTHER] | Attempt 834: Error rate 54.55% (target: 15%) -2025-09-15T14:20:38.029Z | [OTHER] | Attempt 835: Error rate 59.03% (target: 15%) -2025-09-15T14:20:38.031Z | [OTHER] | Attempt 836: Error rate 51.11% (target: 15%) -2025-09-15T14:20:38.033Z | [OTHER] | Attempt 837: Error rate 45.83% (target: 15%) -2025-09-15T14:20:38.036Z | [OTHER] | Attempt 838: Error rate 44.93% (target: 15%) -2025-09-15T14:20:38.039Z | [OTHER] | Attempt 839: Error rate 52.59% (target: 15%) -2025-09-15T14:20:38.042Z | [OTHER] | Attempt 840: Error rate 51.14% (target: 15%) -2025-09-15T14:20:38.044Z | [OTHER] | Attempt 841: Error rate 51.36% (target: 15%) -2025-09-15T14:20:38.046Z | [OTHER] | Attempt 842: Error rate 44.31% (target: 15%) -2025-09-15T14:20:38.048Z | [OTHER] | Attempt 843: Error rate 50.39% (target: 15%) -2025-09-15T14:20:38.049Z | [OTHER] | Attempt 844: Error rate 44.57% (target: 15%) -2025-09-15T14:20:38.051Z | [OTHER] | Attempt 845: Error rate 52.92% (target: 15%) -2025-09-15T14:20:38.053Z | [OTHER] | Attempt 846: Error rate 55.43% (target: 15%) -2025-09-15T14:20:38.055Z | [OTHER] | Attempt 847: Error rate 54.17% (target: 15%) -2025-09-15T14:20:38.056Z | [OTHER] | Attempt 848: Error rate 44.32% (target: 15%) -2025-09-15T14:20:38.059Z | [OTHER] | Attempt 849: Error rate 51.81% (target: 15%) -2025-09-15T14:20:38.060Z | [OTHER] | Attempt 850: Error rate 52.48% (target: 15%) -2025-09-15T14:20:38.062Z | [OTHER] | Attempt 851: Error rate 52.22% (target: 15%) -2025-09-15T14:20:38.064Z | [OTHER] | Attempt 852: Error rate 47.52% (target: 15%) -2025-09-15T14:20:38.066Z | [OTHER] | Attempt 853: Error rate 56.2% (target: 15%) -2025-09-15T14:20:38.067Z | [OTHER] | Attempt 854: Error rate 52.22% (target: 15%) -2025-09-15T14:20:38.069Z | [OTHER] | Attempt 855: Error rate 43.02% (target: 15%) -2025-09-15T14:20:38.071Z | [OTHER] | Attempt 856: Error rate 43.7% (target: 15%) -2025-09-15T14:20:38.073Z | [OTHER] | Attempt 857: Error rate 51.11% (target: 15%) -2025-09-15T14:20:38.075Z | [OTHER] | Attempt 858: Error rate 40.24% (target: 15%) -2025-09-15T14:20:38.077Z | [OTHER] | Attempt 859: Error rate 59.93% (target: 15%) -2025-09-15T14:20:38.078Z | [OTHER] | Attempt 860: Error rate 54.33% (target: 15%) -2025-09-15T14:20:38.080Z | [OTHER] | Attempt 861: Error rate 53.7% (target: 15%) -2025-09-15T14:20:38.081Z | [OTHER] | Attempt 862: Error rate 53.66% (target: 15%) -2025-09-15T14:20:38.083Z | [OTHER] | Attempt 863: Error rate 52.71% (target: 15%) -2025-09-15T14:20:38.085Z | [OTHER] | Attempt 864: Error rate 45.29% (target: 15%) -2025-09-15T14:20:38.086Z | [OTHER] | Attempt 865: Error rate 53.06% (target: 15%) -2025-09-15T14:20:38.088Z | [OTHER] | Attempt 866: Error rate 57.54% (target: 15%) -2025-09-15T14:20:38.090Z | [OTHER] | Attempt 867: Error rate 54.47% (target: 15%) -2025-09-15T14:20:38.091Z | [OTHER] | Attempt 868: Error rate 48.11% (target: 15%) -2025-09-15T14:20:38.094Z | [OTHER] | Attempt 869: Error rate 53.17% (target: 15%) -2025-09-15T14:20:38.096Z | [OTHER] | Attempt 870: Error rate 58.53% (target: 15%) -2025-09-15T14:20:38.097Z | [OTHER] | Attempt 871: Error rate 53.7% (target: 15%) -2025-09-15T14:20:38.099Z | [OTHER] | Attempt 872: Error rate 58.73% (target: 15%) -2025-09-15T14:20:38.101Z | [OTHER] | Attempt 873: Error rate 57.94% (target: 15%) -2025-09-15T14:20:38.102Z | [OTHER] | Attempt 874: Error rate 43.33% (target: 15%) -2025-09-15T14:20:38.104Z | [OTHER] | Attempt 875: Error rate 46.6% (target: 15%) -2025-09-15T14:20:38.106Z | [OTHER] | Attempt 876: Error rate 48.89% (target: 15%) -2025-09-15T14:20:38.107Z | [OTHER] | Attempt 877: Error rate 59.52% (target: 15%) -2025-09-15T14:20:38.109Z | [OTHER] | Attempt 878: Error rate 56.75% (target: 15%) -2025-09-15T14:20:38.110Z | [OTHER] | Attempt 879: Error rate 42.18% (target: 15%) -2025-09-15T14:20:38.112Z | [OTHER] | Attempt 880: Error rate 51.59% (target: 15%) -2025-09-15T14:20:38.114Z | [OTHER] | Attempt 881: Error rate 52.92% (target: 15%) -2025-09-15T14:20:38.115Z | [OTHER] | Attempt 882: Error rate 47.46% (target: 15%) -2025-09-15T14:20:38.117Z | [OTHER] | Attempt 883: Error rate 49.24% (target: 15%) -2025-09-15T14:20:38.119Z | [OTHER] | Attempt 884: Error rate 49.31% (target: 15%) -2025-09-15T14:20:38.120Z | [OTHER] | Attempt 885: Error rate 52.27% (target: 15%) -2025-09-15T14:20:38.122Z | [OTHER] | Attempt 886: Error rate 54.51% (target: 15%) -2025-09-15T14:20:38.123Z | [OTHER] | Attempt 887: Error rate 60.23% (target: 15%) -2025-09-15T14:20:38.125Z | [OTHER] | Attempt 888: Error rate 46.43% (target: 15%) -2025-09-15T14:20:38.127Z | [OTHER] | Attempt 889: Error rate 58.33% (target: 15%) -2025-09-15T14:20:38.129Z | [OTHER] | Attempt 890: Error rate 54.26% (target: 15%) -2025-09-15T14:20:38.131Z | [OTHER] | Attempt 891: Error rate 43.09% (target: 15%) -2025-09-15T14:20:38.132Z | [OTHER] | Attempt 892: Error rate 58.15% (target: 15%) -2025-09-15T14:20:38.134Z | [OTHER] | Attempt 893: Error rate 49.64% (target: 15%) -2025-09-15T14:20:38.135Z | [OTHER] | Attempt 894: Error rate 59.26% (target: 15%) -2025-09-15T14:20:38.137Z | [OTHER] | Attempt 895: Error rate 62.02% (target: 15%) -2025-09-15T14:20:38.139Z | [OTHER] | Attempt 896: Error rate 50.72% (target: 15%) -2025-09-15T14:20:38.140Z | [OTHER] | Attempt 897: Error rate 59.3% (target: 15%) -2025-09-15T14:20:38.142Z | [OTHER] | Attempt 898: Error rate 54.37% (target: 15%) -2025-09-15T14:20:38.144Z | [OTHER] | Attempt 899: Error rate 58.71% (target: 15%) -2025-09-15T14:20:38.146Z | [OTHER] | Attempt 900: Error rate 48.81% (target: 15%) -2025-09-15T14:20:38.147Z | [OTHER] | Attempt 901: Error rate 60.74% (target: 15%) -2025-09-15T14:20:38.149Z | [OTHER] | Attempt 902: Error rate 50.83% (target: 15%) -2025-09-15T14:20:38.151Z | [OTHER] | Attempt 903: Error rate 48.15% (target: 15%) -2025-09-15T14:20:38.153Z | [OTHER] | Attempt 904: Error rate 50.74% (target: 15%) -2025-09-15T14:20:38.155Z | [OTHER] | Attempt 905: Error rate 56.67% (target: 15%) -2025-09-15T14:20:38.156Z | [OTHER] | Attempt 906: Error rate 48.91% (target: 15%) -2025-09-15T14:20:38.158Z | [OTHER] | Attempt 907: Error rate 52.78% (target: 15%) -2025-09-15T14:20:38.160Z | [OTHER] | Attempt 908: Error rate 62.3% (target: 15%) -2025-09-15T14:20:38.163Z | [OTHER] | Attempt 909: Error rate 60.74% (target: 15%) -2025-09-15T14:20:38.164Z | [OTHER] | Attempt 910: Error rate 50% (target: 15%) -2025-09-15T14:20:38.166Z | [OTHER] | Attempt 911: Error rate 56.35% (target: 15%) -2025-09-15T14:20:38.168Z | [OTHER] | Attempt 912: Error rate 56.1% (target: 15%) -2025-09-15T14:20:38.170Z | [OTHER] | Attempt 913: Error rate 52.27% (target: 15%) -2025-09-15T14:20:38.171Z | [OTHER] | Attempt 914: Error rate 46.33% (target: 15%) -2025-09-15T14:20:38.173Z | [OTHER] | Attempt 915: Error rate 50% (target: 15%) -2025-09-15T14:20:38.175Z | [OTHER] | Attempt 916: Error rate 55.68% (target: 15%) -2025-09-15T14:20:38.177Z | [OTHER] | Attempt 917: Error rate 56.3% (target: 15%) -2025-09-15T14:20:38.179Z | [OTHER] | Attempt 918: Error rate 44.1% (target: 15%) -2025-09-15T14:20:38.180Z | [OTHER] | Attempt 919: Error rate 46.15% (target: 15%) -2025-09-15T14:20:38.182Z | [OTHER] | Attempt 920: Error rate 61.9% (target: 15%) -2025-09-15T14:20:38.184Z | [OTHER] | Attempt 921: Error rate 54.26% (target: 15%) -2025-09-15T14:20:38.186Z | [OTHER] | Attempt 922: Error rate 49.22% (target: 15%) -2025-09-15T14:20:38.187Z | [OTHER] | Attempt 923: Error rate 52.48% (target: 15%) -2025-09-15T14:20:38.189Z | [OTHER] | Attempt 924: Error rate 52.5% (target: 15%) -2025-09-15T14:20:38.191Z | [OTHER] | Attempt 925: Error rate 55.67% (target: 15%) -2025-09-15T14:20:38.192Z | [OTHER] | Attempt 926: Error rate 55.16% (target: 15%) -2025-09-15T14:20:38.194Z | [OTHER] | Attempt 927: Error rate 58.73% (target: 15%) -2025-09-15T14:20:38.195Z | [OTHER] | Attempt 928: Error rate 51.06% (target: 15%) -2025-09-15T14:20:38.197Z | [OTHER] | Attempt 929: Error rate 55.98% (target: 15%) -2025-09-15T14:20:38.199Z | [OTHER] | Attempt 930: Error rate 48.06% (target: 15%) -2025-09-15T14:20:38.200Z | [OTHER] | Attempt 931: Error rate 54.96% (target: 15%) -2025-09-15T14:20:38.202Z | [OTHER] | Attempt 932: Error rate 53.17% (target: 15%) -2025-09-15T14:20:38.204Z | [OTHER] | Attempt 933: Error rate 49.22% (target: 15%) -2025-09-15T14:20:38.205Z | [OTHER] | Attempt 934: Error rate 63.12% (target: 15%) -2025-09-15T14:20:38.207Z | [OTHER] | Attempt 935: Error rate 54.81% (target: 15%) -2025-09-15T14:20:38.209Z | [OTHER] | Attempt 936: Error rate 49.19% (target: 15%) -2025-09-15T14:20:38.211Z | [OTHER] | Attempt 937: Error rate 59.92% (target: 15%) -2025-09-15T14:20:38.212Z | [OTHER] | Attempt 938: Error rate 55.04% (target: 15%) -2025-09-15T14:20:38.214Z | [OTHER] | Attempt 939: Error rate 51.52% (target: 15%) -2025-09-15T14:20:38.216Z | [OTHER] | Attempt 940: Error rate 51.19% (target: 15%) -2025-09-15T14:20:38.217Z | [OTHER] | Attempt 941: Error rate 47.41% (target: 15%) -2025-09-15T14:20:38.219Z | [OTHER] | Attempt 942: Error rate 44.96% (target: 15%) -2025-09-15T14:20:38.221Z | [OTHER] | Attempt 943: Error rate 46.1% (target: 15%) -2025-09-15T14:20:38.222Z | [OTHER] | Attempt 944: Error rate 47.83% (target: 15%) -2025-09-15T14:20:38.224Z | [OTHER] | Attempt 945: Error rate 54.37% (target: 15%) -2025-09-15T14:20:38.226Z | [OTHER] | Attempt 946: Error rate 54.07% (target: 15%) -2025-09-15T14:20:38.228Z | [OTHER] | Attempt 947: Error rate 51.16% (target: 15%) -2025-09-15T14:20:38.230Z | [OTHER] | Attempt 948: Error rate 54.35% (target: 15%) -2025-09-15T14:20:38.231Z | [OTHER] | Attempt 949: Error rate 52.33% (target: 15%) -2025-09-15T14:20:38.234Z | [OTHER] | Attempt 950: Error rate 49.26% (target: 15%) -2025-09-15T14:20:38.236Z | [OTHER] | Attempt 951: Error rate 53.26% (target: 15%) -2025-09-15T14:20:38.237Z | [OTHER] | Attempt 952: Error rate 46.85% (target: 15%) -2025-09-15T14:20:38.240Z | [OTHER] | Attempt 953: Error rate 43.84% (target: 15%) -2025-09-15T14:20:38.242Z | [OTHER] | Attempt 954: Error rate 47.87% (target: 15%) -2025-09-15T14:20:38.243Z | [OTHER] | Attempt 955: Error rate 43.84% (target: 15%) -2025-09-15T14:20:38.245Z | [OTHER] | Attempt 956: Error rate 55.81% (target: 15%) -2025-09-15T14:20:38.247Z | [OTHER] | Attempt 957: Error rate 49.65% (target: 15%) -2025-09-15T14:20:38.249Z | [OTHER] | Attempt 958: Error rate 47.29% (target: 15%) -2025-09-15T14:20:38.250Z | [OTHER] | Attempt 959: Error rate 54.7% (target: 15%) -2025-09-15T14:20:38.252Z | [OTHER] | Attempt 960: Error rate 47.15% (target: 15%) -2025-09-15T14:20:38.254Z | [OTHER] | Attempt 961: Error rate 49.28% (target: 15%) -2025-09-15T14:20:38.255Z | [OTHER] | Attempt 962: Error rate 51.19% (target: 15%) -2025-09-15T14:20:38.257Z | [OTHER] | Attempt 963: Error rate 52.65% (target: 15%) -2025-09-15T14:20:38.259Z | [OTHER] | Attempt 964: Error rate 54.51% (target: 15%) -2025-09-15T14:20:38.260Z | [OTHER] | Attempt 965: Error rate 56.91% (target: 15%) -2025-09-15T14:20:38.262Z | [OTHER] | Attempt 966: Error rate 50.34% (target: 15%) -2025-09-15T14:20:38.264Z | [OTHER] | Attempt 967: Error rate 58.7% (target: 15%) -2025-09-15T14:20:38.266Z | [OTHER] | Attempt 968: Error rate 59.63% (target: 15%) -2025-09-15T14:20:38.267Z | [OTHER] | Attempt 969: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.269Z | [OTHER] | Attempt 970: Error rate 57.41% (target: 15%) -2025-09-15T14:20:38.271Z | [OTHER] | Attempt 971: Error rate 50.43% (target: 15%) -2025-09-15T14:20:38.273Z | [OTHER] | Attempt 972: Error rate 48.81% (target: 15%) -2025-09-15T14:20:38.274Z | [OTHER] | Attempt 973: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.276Z | [OTHER] | Attempt 974: Error rate 56.75% (target: 15%) -2025-09-15T14:20:38.278Z | [OTHER] | Attempt 975: Error rate 52.84% (target: 15%) -2025-09-15T14:20:38.279Z | [OTHER] | Attempt 976: Error rate 56.35% (target: 15%) -2025-09-15T14:20:38.281Z | [OTHER] | Attempt 977: Error rate 48.15% (target: 15%) -2025-09-15T14:20:38.283Z | [OTHER] | Attempt 978: Error rate 52.59% (target: 15%) -2025-09-15T14:20:38.285Z | [OTHER] | Attempt 979: Error rate 57.61% (target: 15%) -2025-09-15T14:20:38.286Z | [OTHER] | Attempt 980: Error rate 57.54% (target: 15%) -2025-09-15T14:20:38.288Z | [OTHER] | Attempt 981: Error rate 49.66% (target: 15%) -2025-09-15T14:20:38.290Z | [OTHER] | Attempt 982: Error rate 54.37% (target: 15%) -2025-09-15T14:20:38.292Z | [OTHER] | Attempt 983: Error rate 47.22% (target: 15%) -2025-09-15T14:20:38.294Z | [OTHER] | Attempt 984: Error rate 45.65% (target: 15%) -2025-09-15T14:20:38.295Z | [OTHER] | Attempt 985: Error rate 56.1% (target: 15%) -2025-09-15T14:20:38.297Z | [OTHER] | Attempt 986: Error rate 53.03% (target: 15%) -2025-09-15T14:20:38.299Z | [OTHER] | Attempt 987: Error rate 44.93% (target: 15%) -2025-09-15T14:20:38.301Z | [OTHER] | Attempt 988: Error rate 48.52% (target: 15%) -2025-09-15T14:20:38.303Z | [OTHER] | Attempt 989: Error rate 55.43% (target: 15%) -2025-09-15T14:20:38.305Z | [OTHER] | Attempt 990: Error rate 54.26% (target: 15%) -2025-09-15T14:20:38.306Z | [OTHER] | Attempt 991: Error rate 55.04% (target: 15%) -2025-09-15T14:20:38.309Z | [OTHER] | Attempt 992: Error rate 45.93% (target: 15%) -2025-09-15T14:20:38.310Z | [OTHER] | Attempt 993: Error rate 52.43% (target: 15%) -2025-09-15T14:20:38.312Z | [OTHER] | Attempt 994: Error rate 60.14% (target: 15%) -2025-09-15T14:20:38.314Z | [OTHER] | Attempt 995: Error rate 49.12% (target: 15%) -2025-09-15T14:20:38.316Z | [OTHER] | Attempt 996: Error rate 50.4% (target: 15%) -2025-09-15T14:20:38.317Z | [OTHER] | Attempt 997: Error rate 51.63% (target: 15%) -2025-09-15T14:20:38.319Z | [OTHER] | Attempt 998: Error rate 57.21% (target: 15%) -2025-09-15T14:20:38.321Z | [OTHER] | Attempt 999: Error rate 41.29% (target: 15%) -2025-09-15T14:20:38.323Z | [OTHER] | Attempt 1000: Error rate 48.86% (target: 15%) -2025-09-15T14:20:38.325Z | [OTHER] | Attempt 1001: Error rate 51.19% (target: 15%) -2025-09-15T14:20:38.327Z | [OTHER] | Attempt 1002: Error rate 51.67% (target: 15%) -2025-09-15T14:20:38.328Z | [OTHER] | Attempt 1003: Error rate 50.37% (target: 15%) -2025-09-15T14:20:38.330Z | [OTHER] | Attempt 1004: Error rate 48.15% (target: 15%) -2025-09-15T14:20:38.332Z | [OTHER] | Attempt 1005: Error rate 58.8% (target: 15%) -2025-09-15T14:20:38.334Z | [OTHER] | Attempt 1006: Error rate 49.21% (target: 15%) -2025-09-15T14:20:38.336Z | [OTHER] | Attempt 1007: Error rate 53.75% (target: 15%) -2025-09-15T14:20:38.338Z | [OTHER] | Attempt 1008: Error rate 61.11% (target: 15%) -2025-09-15T14:20:38.340Z | [OTHER] | Attempt 1009: Error rate 47.29% (target: 15%) -2025-09-15T14:20:38.341Z | [OTHER] | Attempt 1010: Error rate 51.14% (target: 15%) -2025-09-15T14:20:38.343Z | [OTHER] | Attempt 1011: Error rate 51.19% (target: 15%) -2025-09-15T14:20:38.345Z | [OTHER] | Attempt 1012: Error rate 52.59% (target: 15%) -2025-09-15T14:20:38.347Z | [OTHER] | Attempt 1013: Error rate 50.38% (target: 15%) -2025-09-15T14:20:38.349Z | [OTHER] | Attempt 1014: Error rate 49.32% (target: 15%) -2025-09-15T14:20:38.350Z | [OTHER] | Attempt 1015: Error rate 50% (target: 15%) -2025-09-15T14:20:38.352Z | [OTHER] | Attempt 1016: Error rate 47.78% (target: 15%) -2025-09-15T14:20:38.354Z | [OTHER] | Attempt 1017: Error rate 52.65% (target: 15%) -2025-09-15T14:20:38.356Z | [OTHER] | Attempt 1018: Error rate 52.13% (target: 15%) -2025-09-15T14:20:38.359Z | [OTHER] | Attempt 1019: Error rate 59.06% (target: 15%) -2025-09-15T14:20:38.361Z | [OTHER] | Attempt 1020: Error rate 51.19% (target: 15%) -2025-09-15T14:20:38.362Z | [OTHER] | Attempt 1021: Error rate 42.05% (target: 15%) -2025-09-15T14:20:38.364Z | [OTHER] | Attempt 1022: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.366Z | [OTHER] | Attempt 1023: Error rate 50% (target: 15%) -2025-09-15T14:20:38.368Z | [OTHER] | Attempt 1024: Error rate 55.56% (target: 15%) -2025-09-15T14:20:38.369Z | [OTHER] | Attempt 1025: Error rate 49.63% (target: 15%) -2025-09-15T14:20:38.371Z | [OTHER] | Attempt 1026: Error rate 43.9% (target: 15%) -2025-09-15T14:20:38.373Z | [OTHER] | Attempt 1027: Error rate 54.7% (target: 15%) -2025-09-15T14:20:38.375Z | [OTHER] | Attempt 1028: Error rate 56.58% (target: 15%) -2025-09-15T14:20:38.377Z | [OTHER] | Attempt 1029: Error rate 36.39% (target: 15%) -2025-09-15T14:20:38.378Z | [OTHER] | Attempt 1030: Error rate 48.89% (target: 15%) -2025-09-15T14:20:38.380Z | [OTHER] | Attempt 1031: Error rate 54.65% (target: 15%) -2025-09-15T14:20:38.382Z | [OTHER] | Attempt 1032: Error rate 54.96% (target: 15%) -2025-09-15T14:20:38.384Z | [OTHER] | Attempt 1033: Error rate 44.72% (target: 15%) -2025-09-15T14:20:38.387Z | [OTHER] | Attempt 1034: Error rate 55.56% (target: 15%) -2025-09-15T14:20:38.388Z | [OTHER] | Attempt 1035: Error rate 54.7% (target: 15%) -2025-09-15T14:20:38.391Z | [OTHER] | Attempt 1036: Error rate 48.94% (target: 15%) -2025-09-15T14:20:38.392Z | [OTHER] | Attempt 1037: Error rate 51.42% (target: 15%) -2025-09-15T14:20:38.394Z | [OTHER] | Attempt 1038: Error rate 44.44% (target: 15%) -2025-09-15T14:20:38.396Z | [OTHER] | Attempt 1039: Error rate 53.57% (target: 15%) -2025-09-15T14:20:38.398Z | [OTHER] | Attempt 1040: Error rate 45.83% (target: 15%) -2025-09-15T14:20:38.399Z | [OTHER] | Attempt 1041: Error rate 50.83% (target: 15%) -2025-09-15T14:20:38.401Z | [OTHER] | Attempt 1042: Error rate 59.63% (target: 15%) -2025-09-15T14:20:38.403Z | [OTHER] | Attempt 1043: Error rate 59.21% (target: 15%) -2025-09-15T14:20:38.404Z | [OTHER] | Attempt 1044: Error rate 53.49% (target: 15%) -2025-09-15T14:20:38.406Z | [OTHER] | Attempt 1045: Error rate 57.54% (target: 15%) -2025-09-15T14:20:38.408Z | [OTHER] | Attempt 1046: Error rate 55.81% (target: 15%) -2025-09-15T14:20:38.410Z | [OTHER] | Attempt 1047: Error rate 57.08% (target: 15%) -2025-09-15T14:20:38.412Z | [OTHER] | Attempt 1048: Error rate 53.88% (target: 15%) -2025-09-15T14:20:38.413Z | [OTHER] | Attempt 1049: Error rate 57.58% (target: 15%) -2025-09-15T14:20:38.416Z | [OTHER] | Attempt 1050: Error rate 48.89% (target: 15%) -2025-09-15T14:20:38.418Z | [OTHER] | Attempt 1051: Error rate 57.8% (target: 15%) -2025-09-15T14:20:38.420Z | [OTHER] | Attempt 1052: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.422Z | [OTHER] | Attempt 1053: Error rate 51.45% (target: 15%) -2025-09-15T14:20:38.424Z | [OTHER] | Attempt 1054: Error rate 55.67% (target: 15%) -2025-09-15T14:20:38.426Z | [OTHER] | Attempt 1055: Error rate 67.86% (target: 15%) -2025-09-15T14:20:38.428Z | [OTHER] | Attempt 1056: Error rate 56.03% (target: 15%) -2025-09-15T14:20:38.430Z | [OTHER] | Attempt 1057: Error rate 42.75% (target: 15%) -2025-09-15T14:20:38.432Z | [OTHER] | Attempt 1058: Error rate 52.17% (target: 15%) -2025-09-15T14:20:38.434Z | [OTHER] | Attempt 1059: Error rate 53.82% (target: 15%) -2025-09-15T14:20:38.436Z | [OTHER] | Attempt 1060: Error rate 40.48% (target: 15%) -2025-09-15T14:20:38.438Z | [OTHER] | Attempt 1061: Error rate 48.25% (target: 15%) -2025-09-15T14:20:38.440Z | [OTHER] | Attempt 1062: Error rate 47.22% (target: 15%) -2025-09-15T14:20:38.442Z | [OTHER] | Attempt 1063: Error rate 49.17% (target: 15%) -2025-09-15T14:20:38.443Z | [OTHER] | Attempt 1064: Error rate 51.67% (target: 15%) -2025-09-15T14:20:38.445Z | [OTHER] | Attempt 1065: Error rate 43.84% (target: 15%) -2025-09-15T14:20:38.447Z | [OTHER] | Attempt 1066: Error rate 53.55% (target: 15%) -2025-09-15T14:20:38.449Z | [OTHER] | Attempt 1067: Error rate 55.19% (target: 15%) -2025-09-15T14:20:38.451Z | [OTHER] | Attempt 1068: Error rate 57.25% (target: 15%) -2025-09-15T14:20:38.452Z | [OTHER] | Attempt 1069: Error rate 53.26% (target: 15%) -2025-09-15T14:20:38.454Z | [OTHER] | Attempt 1070: Error rate 47.83% (target: 15%) -2025-09-15T14:20:38.456Z | [OTHER] | Attempt 1071: Error rate 56.25% (target: 15%) -2025-09-15T14:20:38.458Z | [OTHER] | Attempt 1072: Error rate 53.42% (target: 15%) -2025-09-15T14:20:38.459Z | [OTHER] | Attempt 1073: Error rate 50% (target: 15%) -2025-09-15T14:20:38.461Z | [OTHER] | Attempt 1074: Error rate 51.32% (target: 15%) -2025-09-15T14:20:38.464Z | [OTHER] | Attempt 1075: Error rate 53.57% (target: 15%) -2025-09-15T14:20:38.465Z | [OTHER] | Attempt 1076: Error rate 55.56% (target: 15%) -2025-09-15T14:20:38.467Z | [OTHER] | Attempt 1077: Error rate 53.25% (target: 15%) -2025-09-15T14:20:38.469Z | [OTHER] | Attempt 1078: Error rate 57.95% (target: 15%) -2025-09-15T14:20:38.471Z | [OTHER] | Attempt 1079: Error rate 56.98% (target: 15%) -2025-09-15T14:20:38.472Z | [OTHER] | Attempt 1080: Error rate 56.44% (target: 15%) -2025-09-15T14:20:38.474Z | [OTHER] | Attempt 1081: Error rate 55.9% (target: 15%) -2025-09-15T14:20:38.476Z | [OTHER] | Attempt 1082: Error rate 56.52% (target: 15%) -2025-09-15T14:20:38.478Z | [OTHER] | Attempt 1083: Error rate 41.5% (target: 15%) -2025-09-15T14:20:38.479Z | [OTHER] | Attempt 1084: Error rate 43.24% (target: 15%) -2025-09-15T14:20:38.482Z | [OTHER] | Attempt 1085: Error rate 54.17% (target: 15%) -2025-09-15T14:20:38.484Z | [OTHER] | Attempt 1086: Error rate 47.97% (target: 15%) -2025-09-15T14:20:38.486Z | [OTHER] | Attempt 1087: Error rate 43.86% (target: 15%) -2025-09-15T14:20:38.488Z | [OTHER] | Attempt 1088: Error rate 54.17% (target: 15%) -2025-09-15T14:20:38.490Z | [OTHER] | Attempt 1089: Error rate 47.04% (target: 15%) -2025-09-15T14:20:38.491Z | [OTHER] | Attempt 1090: Error rate 53.7% (target: 15%) -2025-09-15T14:20:38.494Z | [OTHER] | Attempt 1091: Error rate 54.86% (target: 15%) -2025-09-15T14:20:38.495Z | [OTHER] | Attempt 1092: Error rate 48.45% (target: 15%) -2025-09-15T14:20:38.497Z | [OTHER] | Attempt 1093: Error rate 52.85% (target: 15%) -2025-09-15T14:20:38.499Z | [OTHER] | Attempt 1094: Error rate 58.54% (target: 15%) -2025-09-15T14:20:38.501Z | [OTHER] | Attempt 1095: Error rate 53.25% (target: 15%) -2025-09-15T14:20:38.502Z | [OTHER] | Attempt 1096: Error rate 51.55% (target: 15%) -2025-09-15T14:20:38.504Z | [OTHER] | Attempt 1097: Error rate 57.41% (target: 15%) -2025-09-15T14:20:38.506Z | [OTHER] | Attempt 1098: Error rate 53.49% (target: 15%) -2025-09-15T14:20:38.508Z | [OTHER] | Attempt 1099: Error rate 50% (target: 15%) -2025-09-15T14:20:38.510Z | [OTHER] | Attempt 1100: Error rate 49.64% (target: 15%) -2025-09-15T14:20:38.512Z | [OTHER] | Attempt 1101: Error rate 54.55% (target: 15%) -2025-09-15T14:20:38.514Z | [OTHER] | Attempt 1102: Error rate 42.5% (target: 15%) -2025-09-15T14:20:38.515Z | [OTHER] | Attempt 1103: Error rate 50.81% (target: 15%) -2025-09-15T14:20:38.517Z | [OTHER] | Attempt 1104: Error rate 53.79% (target: 15%) -2025-09-15T14:20:38.519Z | [OTHER] | Attempt 1105: Error rate 52.22% (target: 15%) -2025-09-15T14:20:38.521Z | [OTHER] | Attempt 1106: Error rate 44.44% (target: 15%) -2025-09-15T14:20:38.523Z | [OTHER] | Attempt 1107: Error rate 45.18% (target: 15%) -2025-09-15T14:20:38.525Z | [OTHER] | Attempt 1108: Error rate 49.12% (target: 15%) -2025-09-15T14:20:38.527Z | [OTHER] | Attempt 1109: Error rate 56.74% (target: 15%) -2025-09-15T14:20:38.528Z | [OTHER] | Attempt 1110: Error rate 59.42% (target: 15%) -2025-09-15T14:20:38.531Z | [OTHER] | Attempt 1111: Error rate 40% (target: 15%) -2025-09-15T14:20:38.532Z | [OTHER] | Attempt 1112: Error rate 46.43% (target: 15%) -2025-09-15T14:20:38.534Z | [OTHER] | Attempt 1113: Error rate 65.38% (target: 15%) -2025-09-15T14:20:38.536Z | [OTHER] | Attempt 1114: Error rate 49.62% (target: 15%) -2025-09-15T14:20:38.538Z | [OTHER] | Attempt 1115: Error rate 56.52% (target: 15%) -2025-09-15T14:20:38.540Z | [OTHER] | Attempt 1116: Error rate 57.36% (target: 15%) -2025-09-15T14:20:38.541Z | [OTHER] | Attempt 1117: Error rate 57.54% (target: 15%) -2025-09-15T14:20:38.545Z | [OTHER] | Attempt 1118: Error rate 53.57% (target: 15%) -2025-09-15T14:20:38.546Z | [OTHER] | Attempt 1119: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.548Z | [OTHER] | Attempt 1120: Error rate 50.76% (target: 15%) -2025-09-15T14:20:38.550Z | [OTHER] | Attempt 1121: Error rate 49.28% (target: 15%) -2025-09-15T14:20:38.552Z | [OTHER] | Attempt 1122: Error rate 51.11% (target: 15%) -2025-09-15T14:20:38.554Z | [OTHER] | Attempt 1123: Error rate 54.44% (target: 15%) -2025-09-15T14:20:38.556Z | [OTHER] | Attempt 1124: Error rate 49.65% (target: 15%) -2025-09-15T14:20:38.558Z | [OTHER] | Attempt 1125: Error rate 49.22% (target: 15%) -2025-09-15T14:20:38.560Z | [OTHER] | Attempt 1126: Error rate 45.19% (target: 15%) -2025-09-15T14:20:38.562Z | [OTHER] | Attempt 1127: Error rate 55.56% (target: 15%) -2025-09-15T14:20:38.564Z | [OTHER] | Attempt 1128: Error rate 59.13% (target: 15%) -2025-09-15T14:20:38.565Z | [OTHER] | Attempt 1129: Error rate 50.72% (target: 15%) -2025-09-15T14:20:38.568Z | [OTHER] | Attempt 1130: Error rate 51.77% (target: 15%) -2025-09-15T14:20:38.569Z | [OTHER] | Attempt 1131: Error rate 47.37% (target: 15%) -2025-09-15T14:20:38.571Z | [OTHER] | Attempt 1132: Error rate 43.8% (target: 15%) -2025-09-15T14:20:38.574Z | [OTHER] | Attempt 1133: Error rate 55.68% (target: 15%) -2025-09-15T14:20:38.576Z | [OTHER] | Attempt 1134: Error rate 54.26% (target: 15%) -2025-09-15T14:20:38.577Z | [OTHER] | Attempt 1135: Error rate 50% (target: 15%) -2025-09-15T14:20:38.580Z | [OTHER] | Attempt 1136: Error rate 56.38% (target: 15%) -2025-09-15T14:20:38.581Z | [OTHER] | Attempt 1137: Error rate 48.84% (target: 15%) -2025-09-15T14:20:38.583Z | [OTHER] | Attempt 1138: Error rate 49.29% (target: 15%) -2025-09-15T14:20:38.585Z | [OTHER] | Attempt 1139: Error rate 51.06% (target: 15%) -2025-09-15T14:20:38.587Z | [OTHER] | Attempt 1140: Error rate 47.22% (target: 15%) -2025-09-15T14:20:38.588Z | [OTHER] | Attempt 1141: Error rate 42.22% (target: 15%) -2025-09-15T14:20:38.591Z | [OTHER] | Attempt 1142: Error rate 50.43% (target: 15%) -2025-09-15T14:20:38.592Z | [OTHER] | Attempt 1143: Error rate 56.03% (target: 15%) -2025-09-15T14:20:38.594Z | [OTHER] | Attempt 1144: Error rate 52.17% (target: 15%) -2025-09-15T14:20:38.596Z | [OTHER] | Attempt 1145: Error rate 54.17% (target: 15%) -2025-09-15T14:20:38.598Z | [OTHER] | Attempt 1146: Error rate 54.92% (target: 15%) -2025-09-15T14:20:38.599Z | [OTHER] | Attempt 1147: Error rate 55.13% (target: 15%) -2025-09-15T14:20:38.601Z | [OTHER] | Attempt 1148: Error rate 54.55% (target: 15%) -2025-09-15T14:20:38.603Z | [OTHER] | Attempt 1149: Error rate 45.83% (target: 15%) -2025-09-15T14:20:38.605Z | [OTHER] | Attempt 1150: Error rate 54.76% (target: 15%) -2025-09-15T14:20:38.607Z | [OTHER] | Attempt 1151: Error rate 48.78% (target: 15%) -2025-09-15T14:20:38.609Z | [OTHER] | Attempt 1152: Error rate 50% (target: 15%) -2025-09-15T14:20:38.611Z | [OTHER] | Attempt 1153: Error rate 51.52% (target: 15%) -2025-09-15T14:20:38.612Z | [OTHER] | Attempt 1154: Error rate 48.23% (target: 15%) -2025-09-15T14:20:38.615Z | [OTHER] | Attempt 1155: Error rate 56.16% (target: 15%) -2025-09-15T14:20:38.617Z | [OTHER] | Attempt 1156: Error rate 50% (target: 15%) -2025-09-15T14:20:38.618Z | [OTHER] | Attempt 1157: Error rate 53.03% (target: 15%) -2025-09-15T14:20:38.620Z | [OTHER] | Attempt 1158: Error rate 49.64% (target: 15%) -2025-09-15T14:20:38.623Z | [OTHER] | Attempt 1159: Error rate 60.08% (target: 15%) -2025-09-15T14:20:38.625Z | [OTHER] | Attempt 1160: Error rate 47.1% (target: 15%) -2025-09-15T14:20:38.627Z | [OTHER] | Attempt 1161: Error rate 53.03% (target: 15%) -2025-09-15T14:20:38.629Z | [OTHER] | Attempt 1162: Error rate 49.24% (target: 15%) -2025-09-15T14:20:38.630Z | [OTHER] | Attempt 1163: Error rate 53.4% (target: 15%) -2025-09-15T14:20:38.632Z | [OTHER] | Attempt 1164: Error rate 55.56% (target: 15%) -2025-09-15T14:20:38.634Z | [OTHER] | Attempt 1165: Error rate 56.67% (target: 15%) -2025-09-15T14:20:38.636Z | [OTHER] | Attempt 1166: Error rate 54.71% (target: 15%) -2025-09-15T14:20:38.638Z | [OTHER] | Attempt 1167: Error rate 47.92% (target: 15%) -2025-09-15T14:20:38.640Z | [OTHER] | Attempt 1168: Error rate 51.16% (target: 15%) -2025-09-15T14:20:38.642Z | [OTHER] | Attempt 1169: Error rate 49.58% (target: 15%) -2025-09-15T14:20:38.643Z | [OTHER] | Attempt 1170: Error rate 62.22% (target: 15%) -2025-09-15T14:20:38.645Z | [OTHER] | Attempt 1171: Error rate 50.36% (target: 15%) -2025-09-15T14:20:38.647Z | [OTHER] | Attempt 1172: Error rate 55.07% (target: 15%) -2025-09-15T14:20:38.649Z | [OTHER] | Attempt 1173: Error rate 56.16% (target: 15%) -2025-09-15T14:20:38.651Z | [OTHER] | Attempt 1174: Error rate 56.52% (target: 15%) -2025-09-15T14:20:38.653Z | [OTHER] | Attempt 1175: Error rate 55.67% (target: 15%) -2025-09-15T14:20:38.655Z | [OTHER] | Attempt 1176: Error rate 52.7% (target: 15%) -2025-09-15T14:20:38.657Z | [OTHER] | Attempt 1177: Error rate 48.84% (target: 15%) -2025-09-15T14:20:38.659Z | [OTHER] | Attempt 1178: Error rate 52.71% (target: 15%) -2025-09-15T14:20:38.661Z | [OTHER] | Attempt 1179: Error rate 50.38% (target: 15%) -2025-09-15T14:20:38.663Z | [OTHER] | Attempt 1180: Error rate 43.94% (target: 15%) -2025-09-15T14:20:38.665Z | [OTHER] | Attempt 1181: Error rate 59.46% (target: 15%) -2025-09-15T14:20:38.667Z | [OTHER] | Attempt 1182: Error rate 45.83% (target: 15%) -2025-09-15T14:20:38.669Z | [OTHER] | Attempt 1183: Error rate 46.59% (target: 15%) -2025-09-15T14:20:38.672Z | [OTHER] | Attempt 1184: Error rate 53.88% (target: 15%) -2025-09-15T14:20:38.673Z | [OTHER] | Attempt 1185: Error rate 54.07% (target: 15%) -2025-09-15T14:20:38.675Z | [OTHER] | Attempt 1186: Error rate 48.48% (target: 15%) -2025-09-15T14:20:38.677Z | [OTHER] | Attempt 1187: Error rate 59.38% (target: 15%) -2025-09-15T14:20:38.679Z | [OTHER] | Attempt 1188: Error rate 55.28% (target: 15%) -2025-09-15T14:20:38.681Z | [OTHER] | Attempt 1189: Error rate 48.91% (target: 15%) -2025-09-15T14:20:38.683Z | [OTHER] | Attempt 1190: Error rate 55.9% (target: 15%) -2025-09-15T14:20:38.685Z | [OTHER] | Attempt 1191: Error rate 44.05% (target: 15%) -2025-09-15T14:20:38.687Z | [OTHER] | Attempt 1192: Error rate 54.65% (target: 15%) -2025-09-15T14:20:38.689Z | [OTHER] | Attempt 1193: Error rate 59.06% (target: 15%) -2025-09-15T14:20:38.691Z | [OTHER] | Attempt 1194: Error rate 51.85% (target: 15%) -2025-09-15T14:20:38.693Z | [OTHER] | Attempt 1195: Error rate 51.14% (target: 15%) -2025-09-15T14:20:38.695Z | [OTHER] | Attempt 1196: Error rate 55.83% (target: 15%) -2025-09-15T14:20:38.697Z | [OTHER] | Attempt 1197: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.698Z | [OTHER] | Attempt 1198: Error rate 45.35% (target: 15%) -2025-09-15T14:20:38.701Z | [OTHER] | Attempt 1199: Error rate 52.99% (target: 15%) -2025-09-15T14:20:38.703Z | [OTHER] | Attempt 1200: Error rate 51.14% (target: 15%) -2025-09-15T14:20:38.705Z | [OTHER] | Attempt 1201: Error rate 47.67% (target: 15%) -2025-09-15T14:20:38.707Z | [OTHER] | Attempt 1202: Error rate 60.47% (target: 15%) -2025-09-15T14:20:38.709Z | [OTHER] | Attempt 1203: Error rate 58.16% (target: 15%) -2025-09-15T14:20:38.711Z | [OTHER] | Attempt 1204: Error rate 57.36% (target: 15%) -2025-09-15T14:20:38.713Z | [OTHER] | Attempt 1205: Error rate 51.71% (target: 15%) -2025-09-15T14:20:38.714Z | [OTHER] | Attempt 1206: Error rate 53.55% (target: 15%) -2025-09-15T14:20:38.716Z | [OTHER] | Attempt 1207: Error rate 57.94% (target: 15%) -2025-09-15T14:20:38.718Z | [OTHER] | Attempt 1208: Error rate 50.35% (target: 15%) -2025-09-15T14:20:38.720Z | [OTHER] | Attempt 1209: Error rate 46.51% (target: 15%) -2025-09-15T14:20:38.722Z | [OTHER] | Attempt 1210: Error rate 50.68% (target: 15%) -2025-09-15T14:20:38.724Z | [OTHER] | Attempt 1211: Error rate 47.73% (target: 15%) -2025-09-15T14:20:38.726Z | [OTHER] | Attempt 1212: Error rate 52.38% (target: 15%) -2025-09-15T14:20:38.728Z | [OTHER] | Attempt 1213: Error rate 61.11% (target: 15%) -2025-09-15T14:20:38.729Z | [OTHER] | Attempt 1214: Error rate 54.17% (target: 15%) -2025-09-15T14:20:38.731Z | [OTHER] | Attempt 1215: Error rate 48.98% (target: 15%) -2025-09-15T14:20:38.733Z | [OTHER] | Attempt 1216: Error rate 52.08% (target: 15%) -2025-09-15T14:20:38.735Z | [OTHER] | Attempt 1217: Error rate 60.14% (target: 15%) -2025-09-15T14:20:38.737Z | [OTHER] | Attempt 1218: Error rate 50% (target: 15%) -2025-09-15T14:20:38.738Z | [OTHER] | Attempt 1219: Error rate 55.81% (target: 15%) -2025-09-15T14:20:38.740Z | [OTHER] | Attempt 1220: Error rate 60.42% (target: 15%) -2025-09-15T14:20:38.743Z | [OTHER] | Attempt 1221: Error rate 56.67% (target: 15%) -2025-09-15T14:20:38.745Z | [OTHER] | Attempt 1222: Error rate 56.98% (target: 15%) -2025-09-15T14:20:38.747Z | [OTHER] | Attempt 1223: Error rate 51.98% (target: 15%) -2025-09-15T14:20:38.749Z | [OTHER] | Attempt 1224: Error rate 40.37% (target: 15%) -2025-09-15T14:20:38.750Z | [OTHER] | Attempt 1225: Error rate 51.81% (target: 15%) -2025-09-15T14:20:38.753Z | [OTHER] | Attempt 1226: Error rate 52.44% (target: 15%) -2025-09-15T14:20:38.761Z | [OTHER] | Attempt 1227: Error rate 48.86% (target: 15%) -2025-09-15T14:20:38.765Z | [OTHER] | Attempt 1228: Error rate 50% (target: 15%) -2025-09-15T14:20:38.768Z | [OTHER] | Attempt 1229: Error rate 55.9% (target: 15%) -2025-09-15T14:20:38.772Z | [OTHER] | Attempt 1230: Error rate 54.44% (target: 15%) -2025-09-15T14:20:38.777Z | [OTHER] | Attempt 1231: Error rate 51.74% (target: 15%) -2025-09-15T14:20:38.782Z | [OTHER] | Attempt 1232: Error rate 51.81% (target: 15%) -2025-09-15T14:20:38.787Z | [OTHER] | Attempt 1233: Error rate 45.42% (target: 15%) -2025-09-15T14:20:38.790Z | [OTHER] | Attempt 1234: Error rate 45.08% (target: 15%) -2025-09-15T14:20:38.793Z | [OTHER] | Attempt 1235: Error rate 49.26% (target: 15%) -2025-09-15T14:20:38.795Z | [OTHER] | Attempt 1236: Error rate 49.19% (target: 15%) -2025-09-15T14:20:38.798Z | [OTHER] | Attempt 1237: Error rate 53.17% (target: 15%) -2025-09-15T14:20:38.800Z | [OTHER] | Attempt 1238: Error rate 58.33% (target: 15%) -2025-09-15T14:20:38.803Z | [OTHER] | Attempt 1239: Error rate 48.06% (target: 15%) -2025-09-15T14:20:38.805Z | [OTHER] | Attempt 1240: Error rate 45.83% (target: 15%) -2025-09-15T14:20:38.807Z | [OTHER] | Attempt 1241: Error rate 54.65% (target: 15%) -2025-09-15T14:20:38.810Z | [OTHER] | Attempt 1242: Error rate 50% (target: 15%) -2025-09-15T14:20:38.812Z | [OTHER] | Attempt 1243: Error rate 57.61% (target: 15%) -2025-09-15T14:20:38.814Z | [OTHER] | Attempt 1244: Error rate 60.08% (target: 15%) -2025-09-15T14:20:38.816Z | [OTHER] | Attempt 1245: Error rate 51.14% (target: 15%) -2025-09-15T14:20:38.818Z | [OTHER] | Attempt 1246: Error rate 50.4% (target: 15%) -2025-09-15T14:20:38.820Z | [OTHER] | Attempt 1247: Error rate 54.55% (target: 15%) -2025-09-15T14:20:38.822Z | [OTHER] | Attempt 1248: Error rate 51.39% (target: 15%) -2025-09-15T14:20:38.824Z | [OTHER] | Attempt 1249: Error rate 51.85% (target: 15%) -2025-09-15T14:20:38.825Z | [OTHER] | Attempt 1250: Error rate 54.17% (target: 15%) -2025-09-15T14:20:38.828Z | [OTHER] | Attempt 1251: Error rate 50.79% (target: 15%) -2025-09-15T14:20:38.829Z | [OTHER] | Attempt 1252: Error rate 50.79% (target: 15%) -2025-09-15T14:20:38.831Z | [OTHER] | Attempt 1253: Error rate 55.95% (target: 15%) -2025-09-15T14:20:38.834Z | [OTHER] | Attempt 1254: Error rate 57.78% (target: 15%) -2025-09-15T14:20:38.835Z | [OTHER] | Attempt 1255: Error rate 52.22% (target: 15%) -2025-09-15T14:20:38.837Z | [OTHER] | Attempt 1256: Error rate 51.42% (target: 15%) -2025-09-15T14:20:38.840Z | [OTHER] | Attempt 1257: Error rate 50.79% (target: 15%) -2025-09-15T14:20:38.842Z | [OTHER] | Attempt 1258: Error rate 53.03% (target: 15%) -2025-09-15T14:20:38.843Z | [OTHER] | Attempt 1259: Error rate 44.32% (target: 15%) -2025-09-15T14:20:38.846Z | [OTHER] | Attempt 1260: Error rate 49.58% (target: 15%) -2025-09-15T14:20:38.848Z | [OTHER] | Attempt 1261: Error rate 56.3% (target: 15%) -2025-09-15T14:20:38.850Z | [OTHER] | Attempt 1262: Error rate 49.63% (target: 15%) -2025-09-15T14:20:38.852Z | [OTHER] | Attempt 1263: Error rate 54.81% (target: 15%) -2025-09-15T14:20:38.854Z | [OTHER] | Attempt 1264: Error rate 57.99% (target: 15%) -2025-09-15T14:20:38.856Z | [OTHER] | Attempt 1265: Error rate 60.61% (target: 15%) -2025-09-15T14:20:38.858Z | [OTHER] | Attempt 1266: Error rate 55.04% (target: 15%) -2025-09-15T14:20:38.860Z | [OTHER] | Attempt 1267: Error rate 48.37% (target: 15%) -2025-09-15T14:20:38.862Z | [OTHER] | Attempt 1268: Error rate 47.5% (target: 15%) -2025-09-15T14:20:38.864Z | [OTHER] | Attempt 1269: Error rate 55.93% (target: 15%) -2025-09-15T14:20:38.865Z | [OTHER] | Attempt 1270: Error rate 59.63% (target: 15%) -2025-09-15T14:20:38.867Z | [OTHER] | Attempt 1271: Error rate 56.1% (target: 15%) -2025-09-15T14:20:38.869Z | [OTHER] | Attempt 1272: Error rate 50.85% (target: 15%) -2025-09-15T14:20:38.871Z | [OTHER] | Attempt 1273: Error rate 49.61% (target: 15%) -2025-09-15T14:20:38.873Z | [OTHER] | Attempt 1274: Error rate 47.5% (target: 15%) -2025-09-15T14:20:38.875Z | [OTHER] | Attempt 1275: Error rate 47.67% (target: 15%) -2025-09-15T14:20:38.877Z | [OTHER] | Attempt 1276: Error rate 47.35% (target: 15%) -2025-09-15T14:20:38.879Z | [OTHER] | Attempt 1277: Error rate 57.09% (target: 15%) -2025-09-15T14:20:38.881Z | [OTHER] | Attempt 1278: Error rate 50.44% (target: 15%) -2025-09-15T14:20:38.883Z | [OTHER] | Attempt 1279: Error rate 53.25% (target: 15%) -2025-09-15T14:20:38.885Z | [OTHER] | Attempt 1280: Error rate 49.26% (target: 15%) -2025-09-15T14:20:38.887Z | [OTHER] | Attempt 1281: Error rate 57.72% (target: 15%) -2025-09-15T14:20:38.889Z | [OTHER] | Attempt 1282: Error rate 58.87% (target: 15%) -2025-09-15T14:20:38.892Z | [OTHER] | Attempt 1283: Error rate 50.39% (target: 15%) -2025-09-15T14:20:38.894Z | [OTHER] | Attempt 1284: Error rate 51.14% (target: 15%) -2025-09-15T14:20:38.896Z | [OTHER] | Attempt 1285: Error rate 47.86% (target: 15%) -2025-09-15T14:20:38.898Z | [OTHER] | Attempt 1286: Error rate 56.91% (target: 15%) -2025-09-15T14:20:38.900Z | [OTHER] | Attempt 1287: Error rate 55.95% (target: 15%) -2025-09-15T14:20:38.902Z | [OTHER] | Attempt 1288: Error rate 48.37% (target: 15%) -2025-09-15T14:20:38.904Z | [OTHER] | Attempt 1289: Error rate 56.35% (target: 15%) -2025-09-15T14:20:38.906Z | [OTHER] | Attempt 1290: Error rate 55.07% (target: 15%) -2025-09-15T14:20:38.908Z | [OTHER] | Attempt 1291: Error rate 55.68% (target: 15%) -2025-09-15T14:20:38.910Z | [OTHER] | Attempt 1292: Error rate 47.29% (target: 15%) -2025-09-15T14:20:38.911Z | [OTHER] | Attempt 1293: Error rate 52.96% (target: 15%) -2025-09-15T14:20:38.914Z | [OTHER] | Attempt 1294: Error rate 49.64% (target: 15%) -2025-09-15T14:20:38.915Z | [OTHER] | Attempt 1295: Error rate 53.79% (target: 15%) -2025-09-15T14:20:38.917Z | [OTHER] | Attempt 1296: Error rate 52.44% (target: 15%) -2025-09-15T14:20:38.920Z | [OTHER] | Attempt 1297: Error rate 52.78% (target: 15%) -2025-09-15T14:20:38.922Z | [OTHER] | Attempt 1298: Error rate 58.55% (target: 15%) -2025-09-15T14:20:38.924Z | [OTHER] | Attempt 1299: Error rate 57.09% (target: 15%) -2025-09-15T14:20:38.926Z | [OTHER] | Attempt 1300: Error rate 53.42% (target: 15%) -2025-09-15T14:20:38.928Z | [OTHER] | Attempt 1301: Error rate 46.67% (target: 15%) -2025-09-15T14:20:38.930Z | [OTHER] | Attempt 1302: Error rate 49.58% (target: 15%) -2025-09-15T14:20:38.932Z | [OTHER] | Attempt 1303: Error rate 50% (target: 15%) -2025-09-15T14:20:38.934Z | [OTHER] | Attempt 1304: Error rate 59.06% (target: 15%) -2025-09-15T14:20:38.936Z | [OTHER] | Attempt 1305: Error rate 49.59% (target: 15%) -2025-09-15T14:20:38.938Z | [OTHER] | Attempt 1306: Error rate 53.62% (target: 15%) -2025-09-15T14:20:38.940Z | [OTHER] | Attempt 1307: Error rate 60.23% (target: 15%) -2025-09-15T14:20:38.943Z | [OTHER] | Attempt 1308: Error rate 58.33% (target: 15%) -2025-09-15T14:20:38.945Z | [OTHER] | Attempt 1309: Error rate 54.96% (target: 15%) -2025-09-15T14:20:38.947Z | [OTHER] | Attempt 1310: Error rate 46.45% (target: 15%) -2025-09-15T14:20:38.949Z | [OTHER] | Attempt 1311: Error rate 52.27% (target: 15%) -2025-09-15T14:20:38.951Z | [OTHER] | Attempt 1312: Error rate 51.55% (target: 15%) -2025-09-15T14:20:38.953Z | [OTHER] | Attempt 1313: Error rate 55% (target: 15%) -2025-09-15T14:20:38.955Z | [OTHER] | Attempt 1314: Error rate 52.33% (target: 15%) -2025-09-15T14:20:38.957Z | [OTHER] | Attempt 1315: Error rate 50.83% (target: 15%) -2025-09-15T14:20:38.959Z | [OTHER] | Attempt 1316: Error rate 45.93% (target: 15%) -2025-09-15T14:20:38.962Z | [OTHER] | Attempt 1317: Error rate 54.71% (target: 15%) -2025-09-15T14:20:38.963Z | [OTHER] | Attempt 1318: Error rate 48.98% (target: 15%) -2025-09-15T14:20:38.966Z | [OTHER] | Attempt 1319: Error rate 50.39% (target: 15%) -2025-09-15T14:20:38.968Z | [OTHER] | Attempt 1320: Error rate 51.98% (target: 15%) -2025-09-15T14:20:38.970Z | [OTHER] | Attempt 1321: Error rate 54.37% (target: 15%) -2025-09-15T14:20:38.973Z | [OTHER] | Attempt 1322: Error rate 48.86% (target: 15%) -2025-09-15T14:20:38.975Z | [OTHER] | Attempt 1323: Error rate 52.59% (target: 15%) -2025-09-15T14:20:38.977Z | [OTHER] | Attempt 1324: Error rate 49.64% (target: 15%) -2025-09-15T14:20:38.980Z | [OTHER] | Attempt 1325: Error rate 45.56% (target: 15%) -2025-09-15T14:20:38.981Z | [OTHER] | Attempt 1326: Error rate 44.1% (target: 15%) -2025-09-15T14:20:38.983Z | [OTHER] | Attempt 1327: Error rate 53.33% (target: 15%) -2025-09-15T14:20:38.986Z | [OTHER] | Attempt 1328: Error rate 52.33% (target: 15%) -2025-09-15T14:20:38.987Z | [OTHER] | Attempt 1329: Error rate 50.81% (target: 15%) -2025-09-15T14:20:38.989Z | [OTHER] | Attempt 1330: Error rate 50% (target: 15%) -2025-09-15T14:20:38.992Z | [OTHER] | Attempt 1331: Error rate 55.81% (target: 15%) -2025-09-15T14:20:38.994Z | [OTHER] | Attempt 1332: Error rate 36.99% (target: 15%) -2025-09-15T14:20:38.996Z | [OTHER] | Attempt 1333: Error rate 56.1% (target: 15%) -2025-09-15T14:20:38.998Z | [OTHER] | Attempt 1334: Error rate 50.39% (target: 15%) -2025-09-15T14:20:39.000Z | [OTHER] | Attempt 1335: Error rate 50.41% (target: 15%) -2025-09-15T14:20:39.002Z | [OTHER] | Attempt 1336: Error rate 54.71% (target: 15%) -2025-09-15T14:20:39.004Z | [OTHER] | Attempt 1337: Error rate 51.48% (target: 15%) -2025-09-15T14:20:39.006Z | [OTHER] | Attempt 1338: Error rate 50.38% (target: 15%) -2025-09-15T14:20:39.008Z | [OTHER] | Attempt 1339: Error rate 47.71% (target: 15%) -2025-09-15T14:20:39.010Z | [OTHER] | Attempt 1340: Error rate 50.35% (target: 15%) -2025-09-15T14:20:39.012Z | [OTHER] | Attempt 1341: Error rate 49.64% (target: 15%) -2025-09-15T14:20:39.014Z | [OTHER] | Attempt 1342: Error rate 46.45% (target: 15%) -2025-09-15T14:20:39.016Z | [OTHER] | Attempt 1343: Error rate 53.47% (target: 15%) -2025-09-15T14:20:39.018Z | [OTHER] | Attempt 1344: Error rate 49.6% (target: 15%) -2025-09-15T14:20:39.020Z | [OTHER] | Attempt 1345: Error rate 53.88% (target: 15%) -2025-09-15T14:20:39.023Z | [OTHER] | Attempt 1346: Error rate 47.22% (target: 15%) -2025-09-15T14:20:39.025Z | [OTHER] | Attempt 1347: Error rate 48.84% (target: 15%) -2025-09-15T14:20:39.027Z | [OTHER] | Attempt 1348: Error rate 45.24% (target: 15%) -2025-09-15T14:20:39.029Z | [OTHER] | Attempt 1349: Error rate 51.45% (target: 15%) -2025-09-15T14:20:39.031Z | [OTHER] | Attempt 1350: Error rate 49.61% (target: 15%) -2025-09-15T14:20:39.033Z | [OTHER] | Attempt 1351: Error rate 50% (target: 15%) -2025-09-15T14:20:39.035Z | [OTHER] | Attempt 1352: Error rate 54.92% (target: 15%) -2025-09-15T14:20:39.037Z | [OTHER] | Attempt 1353: Error rate 55.69% (target: 15%) -2025-09-15T14:20:39.040Z | [OTHER] | Attempt 1354: Error rate 62.88% (target: 15%) -2025-09-15T14:20:39.042Z | [OTHER] | Attempt 1355: Error rate 46.81% (target: 15%) -2025-09-15T14:20:39.044Z | [OTHER] | Attempt 1356: Error rate 61.54% (target: 15%) -2025-09-15T14:20:39.046Z | [OTHER] | Attempt 1357: Error rate 46.83% (target: 15%) -2025-09-15T14:20:39.048Z | [OTHER] | Attempt 1358: Error rate 51.55% (target: 15%) -2025-09-15T14:20:39.050Z | [OTHER] | Attempt 1359: Error rate 58.33% (target: 15%) -2025-09-15T14:20:39.052Z | [OTHER] | Attempt 1360: Error rate 53.25% (target: 15%) -2025-09-15T14:20:39.054Z | [OTHER] | Attempt 1361: Error rate 56.25% (target: 15%) -2025-09-15T14:20:39.056Z | [OTHER] | Attempt 1362: Error rate 52.38% (target: 15%) -2025-09-15T14:20:39.058Z | [OTHER] | Attempt 1363: Error rate 55.16% (target: 15%) -2025-09-15T14:20:39.060Z | [OTHER] | Attempt 1364: Error rate 52.22% (target: 15%) -2025-09-15T14:20:39.062Z | [OTHER] | Attempt 1365: Error rate 44.57% (target: 15%) -2025-09-15T14:20:39.064Z | [OTHER] | Attempt 1366: Error rate 56.59% (target: 15%) -2025-09-15T14:20:39.067Z | [OTHER] | Attempt 1367: Error rate 50.78% (target: 15%) -2025-09-15T14:20:39.068Z | [OTHER] | Attempt 1368: Error rate 52.9% (target: 15%) -2025-09-15T14:20:39.071Z | [OTHER] | Attempt 1369: Error rate 57.26% (target: 15%) -2025-09-15T14:20:39.072Z | [OTHER] | Attempt 1370: Error rate 52.78% (target: 15%) -2025-09-15T14:20:39.075Z | [OTHER] | Attempt 1371: Error rate 45.93% (target: 15%) -2025-09-15T14:20:39.077Z | [OTHER] | Attempt 1372: Error rate 52.38% (target: 15%) -2025-09-15T14:20:39.079Z | [OTHER] | Attempt 1373: Error rate 59.09% (target: 15%) -2025-09-15T14:20:39.082Z | [OTHER] | Attempt 1374: Error rate 53.4% (target: 15%) -2025-09-15T14:20:39.084Z | [OTHER] | Attempt 1375: Error rate 51.42% (target: 15%) -2025-09-15T14:20:39.086Z | [OTHER] | Attempt 1376: Error rate 43.86% (target: 15%) -2025-09-15T14:20:39.088Z | [OTHER] | Attempt 1377: Error rate 53.25% (target: 15%) -2025-09-15T14:20:39.090Z | [OTHER] | Attempt 1378: Error rate 54.26% (target: 15%) -2025-09-15T14:20:39.092Z | [OTHER] | Attempt 1379: Error rate 42.71% (target: 15%) -2025-09-15T14:20:39.094Z | [OTHER] | Attempt 1380: Error rate 60.88% (target: 15%) -2025-09-15T14:20:39.096Z | [OTHER] | Attempt 1381: Error rate 59.85% (target: 15%) -2025-09-15T14:20:39.098Z | [OTHER] | Attempt 1382: Error rate 53.15% (target: 15%) -2025-09-15T14:20:39.101Z | [OTHER] | Attempt 1383: Error rate 56.82% (target: 15%) -2025-09-15T14:20:39.103Z | [OTHER] | Attempt 1384: Error rate 46.21% (target: 15%) -2025-09-15T14:20:39.105Z | [OTHER] | Attempt 1385: Error rate 57.95% (target: 15%) -2025-09-15T14:20:39.107Z | [OTHER] | Attempt 1386: Error rate 55.56% (target: 15%) -2025-09-15T14:20:39.109Z | [OTHER] | Attempt 1387: Error rate 55.43% (target: 15%) -2025-09-15T14:20:39.111Z | [OTHER] | Attempt 1388: Error rate 56.03% (target: 15%) -2025-09-15T14:20:39.113Z | [OTHER] | Attempt 1389: Error rate 59.09% (target: 15%) -2025-09-15T14:20:39.115Z | [OTHER] | Attempt 1390: Error rate 57.61% (target: 15%) -2025-09-15T14:20:39.117Z | [OTHER] | Attempt 1391: Error rate 48.52% (target: 15%) -2025-09-15T14:20:39.120Z | [OTHER] | Attempt 1392: Error rate 51.11% (target: 15%) -2025-09-15T14:20:39.121Z | [OTHER] | Attempt 1393: Error rate 54.71% (target: 15%) -2025-09-15T14:20:39.123Z | [OTHER] | Attempt 1394: Error rate 56.16% (target: 15%) -2025-09-15T14:20:39.126Z | [OTHER] | Attempt 1395: Error rate 50.4% (target: 15%) -2025-09-15T14:20:39.127Z | [OTHER] | Attempt 1396: Error rate 52.96% (target: 15%) -2025-09-15T14:20:39.130Z | [OTHER] | Attempt 1397: Error rate 54.55% (target: 15%) -2025-09-15T14:20:39.132Z | [OTHER] | Attempt 1398: Error rate 46.03% (target: 15%) -2025-09-15T14:20:39.134Z | [OTHER] | Attempt 1399: Error rate 43.59% (target: 15%) -2025-09-15T14:20:39.136Z | [OTHER] | Attempt 1400: Error rate 54.76% (target: 15%) -2025-09-15T14:20:39.138Z | [OTHER] | Attempt 1401: Error rate 51.11% (target: 15%) -2025-09-15T14:20:39.140Z | [OTHER] | Attempt 1402: Error rate 56.44% (target: 15%) -2025-09-15T14:20:39.142Z | [OTHER] | Attempt 1403: Error rate 46.38% (target: 15%) -2025-09-15T14:20:39.144Z | [OTHER] | Attempt 1404: Error rate 51.06% (target: 15%) -2025-09-15T14:20:39.146Z | [OTHER] | Attempt 1405: Error rate 55.3% (target: 15%) -2025-09-15T14:20:39.148Z | [OTHER] | Attempt 1406: Error rate 56.88% (target: 15%) -2025-09-15T14:20:39.150Z | [OTHER] | Attempt 1407: Error rate 54.47% (target: 15%) -2025-09-15T14:20:39.152Z | [OTHER] | Attempt 1408: Error rate 48.89% (target: 15%) -2025-09-15T14:20:39.156Z | [OTHER] | Attempt 1409: Error rate 51.09% (target: 15%) -2025-09-15T14:20:39.157Z | [OTHER] | Attempt 1410: Error rate 52.04% (target: 15%) -2025-09-15T14:20:39.159Z | [OTHER] | Attempt 1411: Error rate 49.28% (target: 15%) -2025-09-15T14:20:39.161Z | [OTHER] | Attempt 1412: Error rate 49.6% (target: 15%) -2025-09-15T14:20:39.163Z | [OTHER] | Attempt 1413: Error rate 48.98% (target: 15%) -2025-09-15T14:20:39.166Z | [OTHER] | Attempt 1414: Error rate 53.57% (target: 15%) -2025-09-15T14:20:39.168Z | [OTHER] | Attempt 1415: Error rate 52.38% (target: 15%) -2025-09-15T14:20:39.170Z | [OTHER] | Attempt 1416: Error rate 55.28% (target: 15%) -2025-09-15T14:20:39.172Z | [OTHER] | Attempt 1417: Error rate 58.16% (target: 15%) -2025-09-15T14:20:39.174Z | [OTHER] | Attempt 1418: Error rate 53.03% (target: 15%) -2025-09-15T14:20:39.176Z | [OTHER] | Attempt 1419: Error rate 52.78% (target: 15%) -2025-09-15T14:20:39.178Z | [OTHER] | Attempt 1420: Error rate 53.4% (target: 15%) -2025-09-15T14:20:39.180Z | [OTHER] | Attempt 1421: Error rate 55.21% (target: 15%) -2025-09-15T14:20:39.182Z | [OTHER] | Attempt 1422: Error rate 46.26% (target: 15%) -2025-09-15T14:20:39.185Z | [OTHER] | Attempt 1423: Error rate 51.16% (target: 15%) -2025-09-15T14:20:39.187Z | [OTHER] | Attempt 1424: Error rate 54.17% (target: 15%) -2025-09-15T14:20:39.189Z | [OTHER] | Attempt 1425: Error rate 54.55% (target: 15%) -2025-09-15T14:20:39.191Z | [OTHER] | Attempt 1426: Error rate 51.77% (target: 15%) -2025-09-15T14:20:39.193Z | [OTHER] | Attempt 1427: Error rate 54.44% (target: 15%) -2025-09-15T14:20:39.195Z | [OTHER] | Attempt 1428: Error rate 49.17% (target: 15%) -2025-09-15T14:20:39.197Z | [OTHER] | Attempt 1429: Error rate 55% (target: 15%) -2025-09-15T14:20:39.199Z | [OTHER] | Attempt 1430: Error rate 46.88% (target: 15%) -2025-09-15T14:20:39.201Z | [OTHER] | Attempt 1431: Error rate 48.81% (target: 15%) -2025-09-15T14:20:39.204Z | [OTHER] | Attempt 1432: Error rate 56.44% (target: 15%) -2025-09-15T14:20:39.206Z | [OTHER] | Attempt 1433: Error rate 48.06% (target: 15%) -2025-09-15T14:20:39.207Z | [OTHER] | Attempt 1434: Error rate 54.88% (target: 15%) -2025-09-15T14:20:39.210Z | [OTHER] | Attempt 1435: Error rate 52.59% (target: 15%) -2025-09-15T14:20:39.212Z | [OTHER] | Attempt 1436: Error rate 53.66% (target: 15%) -2025-09-15T14:20:39.214Z | [OTHER] | Attempt 1437: Error rate 55.21% (target: 15%) -2025-09-15T14:20:39.216Z | [OTHER] | Attempt 1438: Error rate 52.33% (target: 15%) -2025-09-15T14:20:39.218Z | [OTHER] | Attempt 1439: Error rate 54.33% (target: 15%) -2025-09-15T14:20:39.221Z | [OTHER] | Attempt 1440: Error rate 51.77% (target: 15%) -2025-09-15T14:20:39.225Z | [OTHER] | Attempt 1441: Error rate 47.46% (target: 15%) -2025-09-15T14:20:39.227Z | [OTHER] | Attempt 1442: Error rate 51.48% (target: 15%) -2025-09-15T14:20:39.232Z | [OTHER] | Attempt 1443: Error rate 52.78% (target: 15%) -2025-09-15T14:20:39.235Z | [OTHER] | Attempt 1444: Error rate 50% (target: 15%) -2025-09-15T14:20:39.237Z | [OTHER] | Attempt 1445: Error rate 54.07% (target: 15%) -2025-09-15T14:20:39.240Z | [OTHER] | Attempt 1446: Error rate 44.7% (target: 15%) -2025-09-15T14:20:39.242Z | [OTHER] | Attempt 1447: Error rate 54.71% (target: 15%) -2025-09-15T14:20:39.244Z | [OTHER] | Attempt 1448: Error rate 54.17% (target: 15%) -2025-09-15T14:20:39.247Z | [OTHER] | Attempt 1449: Error rate 41.46% (target: 15%) -2025-09-15T14:20:39.251Z | [OTHER] | Attempt 1450: Error rate 48.11% (target: 15%) -2025-09-15T14:20:39.253Z | [OTHER] | Attempt 1451: Error rate 47.73% (target: 15%) -2025-09-15T14:20:39.255Z | [OTHER] | Attempt 1452: Error rate 50.38% (target: 15%) -2025-09-15T14:20:39.258Z | [OTHER] | Attempt 1453: Error rate 59.3% (target: 15%) -2025-09-15T14:20:39.260Z | [OTHER] | Attempt 1454: Error rate 49.21% (target: 15%) -2025-09-15T14:20:39.262Z | [OTHER] | Attempt 1455: Error rate 55.19% (target: 15%) -2025-09-15T14:20:39.265Z | [OTHER] | Attempt 1456: Error rate 46.3% (target: 15%) -2025-09-15T14:20:39.267Z | [OTHER] | Attempt 1457: Error rate 57.41% (target: 15%) -2025-09-15T14:20:39.270Z | [OTHER] | Attempt 1458: Error rate 53.7% (target: 15%) -2025-09-15T14:20:39.272Z | [OTHER] | Attempt 1459: Error rate 42.75% (target: 15%) -2025-09-15T14:20:39.274Z | [OTHER] | Attempt 1460: Error rate 42.22% (target: 15%) -2025-09-15T14:20:39.277Z | [OTHER] | Attempt 1461: Error rate 55.68% (target: 15%) -2025-09-15T14:20:39.279Z | [OTHER] | Attempt 1462: Error rate 55.67% (target: 15%) -2025-09-15T14:20:39.281Z | [OTHER] | Attempt 1463: Error rate 47.15% (target: 15%) -2025-09-15T14:20:39.284Z | [OTHER] | Attempt 1464: Error rate 53.88% (target: 15%) -2025-09-15T14:20:39.286Z | [OTHER] | Attempt 1465: Error rate 50.76% (target: 15%) -2025-09-15T14:20:39.289Z | [OTHER] | Attempt 1466: Error rate 46.67% (target: 15%) -2025-09-15T14:20:39.291Z | [OTHER] | Attempt 1467: Error rate 46.67% (target: 15%) -2025-09-15T14:20:39.294Z | [OTHER] | Attempt 1468: Error rate 48.45% (target: 15%) -2025-09-15T14:20:39.296Z | [OTHER] | Attempt 1469: Error rate 48.52% (target: 15%) -2025-09-15T14:20:39.298Z | [OTHER] | Attempt 1470: Error rate 54.26% (target: 15%) -2025-09-15T14:20:39.300Z | [OTHER] | Attempt 1471: Error rate 47.67% (target: 15%) -2025-09-15T14:20:39.302Z | [OTHER] | Attempt 1472: Error rate 48.19% (target: 15%) -2025-09-15T14:20:39.304Z | [OTHER] | Attempt 1473: Error rate 53.57% (target: 15%) -2025-09-15T14:20:39.306Z | [OTHER] | Attempt 1474: Error rate 51.14% (target: 15%) -2025-09-15T14:20:39.308Z | [OTHER] | Attempt 1475: Error rate 54.71% (target: 15%) -2025-09-15T14:20:39.310Z | [OTHER] | Attempt 1476: Error rate 47.29% (target: 15%) -2025-09-15T14:20:39.313Z | [OTHER] | Attempt 1477: Error rate 52.22% (target: 15%) -2025-09-15T14:20:39.315Z | [OTHER] | Attempt 1478: Error rate 56.5% (target: 15%) -2025-09-15T14:20:39.317Z | [OTHER] | Attempt 1479: Error rate 48.19% (target: 15%) -2025-09-15T14:20:39.320Z | [OTHER] | Attempt 1480: Error rate 58.14% (target: 15%) -2025-09-15T14:20:39.322Z | [OTHER] | Attempt 1481: Error rate 55.81% (target: 15%) -2025-09-15T14:20:39.324Z | [OTHER] | Attempt 1482: Error rate 51.63% (target: 15%) -2025-09-15T14:20:39.326Z | [OTHER] | Attempt 1483: Error rate 53.33% (target: 15%) -2025-09-15T14:20:39.328Z | [OTHER] | Attempt 1484: Error rate 53.17% (target: 15%) -2025-09-15T14:20:39.331Z | [OTHER] | Attempt 1485: Error rate 56.6% (target: 15%) -2025-09-15T14:20:39.333Z | [OTHER] | Attempt 1486: Error rate 58.91% (target: 15%) -2025-09-15T14:20:39.335Z | [OTHER] | Attempt 1487: Error rate 60.32% (target: 15%) -2025-09-15T14:20:39.337Z | [OTHER] | Attempt 1488: Error rate 57.61% (target: 15%) -2025-09-15T14:20:39.339Z | [OTHER] | Attempt 1489: Error rate 52.63% (target: 15%) -2025-09-15T14:20:39.341Z | [OTHER] | Attempt 1490: Error rate 43.84% (target: 15%) -2025-09-15T14:20:39.345Z | [OTHER] | Attempt 1491: Error rate 46.3% (target: 15%) -2025-09-15T14:20:39.346Z | [OTHER] | Attempt 1492: Error rate 57.25% (target: 15%) -2025-09-15T14:20:39.348Z | [OTHER] | Attempt 1493: Error rate 48.45% (target: 15%) -2025-09-15T14:20:39.351Z | [OTHER] | Attempt 1494: Error rate 48.02% (target: 15%) -2025-09-15T14:20:39.353Z | [OTHER] | Attempt 1495: Error rate 56.67% (target: 15%) -2025-09-15T14:20:39.355Z | [OTHER] | Attempt 1496: Error rate 51.98% (target: 15%) -2025-09-15T14:20:39.357Z | [OTHER] | Attempt 1497: Error rate 49.28% (target: 15%) -2025-09-15T14:20:39.359Z | [OTHER] | Attempt 1498: Error rate 56.82% (target: 15%) -2025-09-15T14:20:39.361Z | [OTHER] | Attempt 1499: Error rate 47.56% (target: 15%) -2025-09-15T14:20:39.364Z | [OTHER] | Attempt 1500: Error rate 51.06% (target: 15%) -2025-09-15T14:20:39.366Z | [OTHER] | Attempt 1501: Error rate 48.15% (target: 15%) -2025-09-15T14:20:39.368Z | [OTHER] | Attempt 1502: Error rate 50% (target: 15%) -2025-09-15T14:20:39.370Z | [OTHER] | Attempt 1503: Error rate 54.37% (target: 15%) -2025-09-15T14:20:39.373Z | [OTHER] | Attempt 1504: Error rate 47.29% (target: 15%) -2025-09-15T14:20:39.375Z | [OTHER] | Attempt 1505: Error rate 54.26% (target: 15%) -2025-09-15T14:20:39.377Z | [OTHER] | Attempt 1506: Error rate 56.44% (target: 15%) -2025-09-15T14:20:39.379Z | [OTHER] | Attempt 1507: Error rate 57.04% (target: 15%) -2025-09-15T14:20:39.382Z | [OTHER] | Attempt 1508: Error rate 44.57% (target: 15%) -2025-09-15T14:20:39.384Z | [OTHER] | Attempt 1509: Error rate 55.3% (target: 15%) -2025-09-15T14:20:39.387Z | [OTHER] | Attempt 1510: Error rate 57.52% (target: 15%) -2025-09-15T14:20:39.389Z | [OTHER] | Attempt 1511: Error rate 45.19% (target: 15%) -2025-09-15T14:20:39.391Z | [OTHER] | Attempt 1512: Error rate 58.51% (target: 15%) -2025-09-15T14:20:39.394Z | [OTHER] | Attempt 1513: Error rate 39.77% (target: 15%) -2025-09-15T14:20:39.396Z | [OTHER] | Attempt 1514: Error rate 51.74% (target: 15%) -2025-09-15T14:20:39.399Z | [OTHER] | Attempt 1515: Error rate 53.33% (target: 15%) -2025-09-15T14:20:39.401Z | [OTHER] | Attempt 1516: Error rate 53.79% (target: 15%) -2025-09-15T14:20:39.403Z | [OTHER] | Attempt 1517: Error rate 53.97% (target: 15%) -2025-09-15T14:20:39.405Z | [OTHER] | Attempt 1518: Error rate 44.05% (target: 15%) -2025-09-15T14:20:39.407Z | [OTHER] | Attempt 1519: Error rate 50% (target: 15%) -2025-09-15T14:20:39.410Z | [OTHER] | Attempt 1520: Error rate 55.43% (target: 15%) -2025-09-15T14:20:39.412Z | [OTHER] | Attempt 1521: Error rate 50.35% (target: 15%) -2025-09-15T14:20:39.414Z | [OTHER] | Attempt 1522: Error rate 51.25% (target: 15%) -2025-09-15T14:20:39.416Z | [OTHER] | Attempt 1523: Error rate 51.16% (target: 15%) -2025-09-15T14:20:39.418Z | [OTHER] | Attempt 1524: Error rate 46.51% (target: 15%) -2025-09-15T14:20:39.420Z | [OTHER] | Attempt 1525: Error rate 46.38% (target: 15%) -2025-09-15T14:20:39.422Z | [OTHER] | Attempt 1526: Error rate 52.31% (target: 15%) -2025-09-15T14:20:39.424Z | [OTHER] | Attempt 1527: Error rate 62.79% (target: 15%) -2025-09-15T14:20:39.427Z | [OTHER] | Attempt 1528: Error rate 42.96% (target: 15%) -2025-09-15T14:20:39.430Z | [OTHER] | Attempt 1529: Error rate 52.03% (target: 15%) -2025-09-15T14:20:39.434Z | [OTHER] | Attempt 1530: Error rate 55.05% (target: 15%) -2025-09-15T14:20:39.437Z | [OTHER] | Attempt 1531: Error rate 53.55% (target: 15%) -2025-09-15T14:20:39.441Z | [OTHER] | Attempt 1532: Error rate 52.96% (target: 15%) -2025-09-15T14:20:39.442Z | [OTHER] | Attempt 1533: Error rate 44.72% (target: 15%) -2025-09-15T14:20:39.445Z | [OTHER] | Attempt 1534: Error rate 59.03% (target: 15%) -2025-09-15T14:20:39.447Z | [OTHER] | Attempt 1535: Error rate 50% (target: 15%) -2025-09-15T14:20:39.449Z | [OTHER] | Attempt 1536: Error rate 51.55% (target: 15%) -2025-09-15T14:20:39.451Z | [OTHER] | Attempt 1537: Error rate 57.54% (target: 15%) -2025-09-15T14:20:39.454Z | [OTHER] | Attempt 1538: Error rate 41.67% (target: 15%) -2025-09-15T14:20:39.456Z | [OTHER] | Attempt 1539: Error rate 52.85% (target: 15%) -2025-09-15T14:20:39.459Z | [OTHER] | Attempt 1540: Error rate 50.42% (target: 15%) -2025-09-15T14:20:39.461Z | [OTHER] | Attempt 1541: Error rate 50.35% (target: 15%) -2025-09-15T14:20:39.463Z | [OTHER] | Attempt 1542: Error rate 48.25% (target: 15%) -2025-09-15T14:20:39.465Z | [OTHER] | Attempt 1543: Error rate 55.67% (target: 15%) -2025-09-15T14:20:39.467Z | [OTHER] | Attempt 1544: Error rate 44.84% (target: 15%) -2025-09-15T14:20:39.470Z | [OTHER] | Attempt 1545: Error rate 49.57% (target: 15%) -2025-09-15T14:20:39.472Z | [OTHER] | Attempt 1546: Error rate 50% (target: 15%) -2025-09-15T14:20:39.474Z | [OTHER] | Attempt 1547: Error rate 47.83% (target: 15%) -2025-09-15T14:20:39.477Z | [OTHER] | Attempt 1548: Error rate 47.78% (target: 15%) -2025-09-15T14:20:39.479Z | [OTHER] | Attempt 1549: Error rate 46.38% (target: 15%) -2025-09-15T14:20:39.481Z | [OTHER] | Attempt 1550: Error rate 51.42% (target: 15%) -2025-09-15T14:20:39.483Z | [OTHER] | Attempt 1551: Error rate 48.72% (target: 15%) -2025-09-15T14:20:39.485Z | [OTHER] | Attempt 1552: Error rate 51.52% (target: 15%) -2025-09-15T14:20:39.488Z | [OTHER] | Attempt 1553: Error rate 44.1% (target: 15%) -2025-09-15T14:20:39.490Z | [OTHER] | Attempt 1554: Error rate 54.81% (target: 15%) -2025-09-15T14:20:39.492Z | [OTHER] | Attempt 1555: Error rate 52.85% (target: 15%) -2025-09-15T14:20:39.494Z | [OTHER] | Attempt 1556: Error rate 50% (target: 15%) -2025-09-15T14:20:39.497Z | [OTHER] | Attempt 1557: Error rate 47.97% (target: 15%) -2025-09-15T14:20:39.499Z | [OTHER] | Attempt 1558: Error rate 54.81% (target: 15%) -2025-09-15T14:20:39.502Z | [OTHER] | Attempt 1559: Error rate 51.85% (target: 15%) -2025-09-15T14:20:39.504Z | [OTHER] | Attempt 1560: Error rate 48.45% (target: 15%) -2025-09-15T14:20:39.507Z | [OTHER] | Attempt 1561: Error rate 44.2% (target: 15%) -2025-09-15T14:20:39.509Z | [OTHER] | Attempt 1562: Error rate 55.68% (target: 15%) -2025-09-15T14:20:39.511Z | [OTHER] | Attempt 1563: Error rate 50% (target: 15%) -2025-09-15T14:20:39.513Z | [OTHER] | Attempt 1564: Error rate 49.29% (target: 15%) -2025-09-15T14:20:39.515Z | [OTHER] | Attempt 1565: Error rate 50.37% (target: 15%) -2025-09-15T14:20:39.518Z | [OTHER] | Attempt 1566: Error rate 52.44% (target: 15%) -2025-09-15T14:20:39.520Z | [OTHER] | Attempt 1567: Error rate 56.14% (target: 15%) -2025-09-15T14:20:39.522Z | [OTHER] | Attempt 1568: Error rate 53.25% (target: 15%) -2025-09-15T14:20:39.525Z | [OTHER] | Attempt 1569: Error rate 58.91% (target: 15%) -2025-09-15T14:20:39.527Z | [OTHER] | Attempt 1570: Error rate 49.26% (target: 15%) -2025-09-15T14:20:39.529Z | [OTHER] | Attempt 1571: Error rate 52.22% (target: 15%) -2025-09-15T14:20:39.532Z | [OTHER] | Attempt 1572: Error rate 55.19% (target: 15%) -2025-09-15T14:20:39.534Z | [OTHER] | Attempt 1573: Error rate 54.44% (target: 15%) -2025-09-15T14:20:39.537Z | [OTHER] | Attempt 1574: Error rate 59.78% (target: 15%) -2025-09-15T14:20:39.539Z | [OTHER] | Attempt 1575: Error rate 51.85% (target: 15%) -2025-09-15T14:20:39.541Z | [OTHER] | Attempt 1576: Error rate 50.79% (target: 15%) -2025-09-15T14:20:39.543Z | [OTHER] | Attempt 1577: Error rate 49.61% (target: 15%) -2025-09-15T14:20:39.545Z | [OTHER] | Attempt 1578: Error rate 47.41% (target: 15%) -2025-09-15T14:20:39.548Z | [OTHER] | Attempt 1579: Error rate 45.63% (target: 15%) -2025-09-15T14:20:39.550Z | [OTHER] | Attempt 1580: Error rate 48.45% (target: 15%) -2025-09-15T14:20:39.552Z | [OTHER] | Attempt 1581: Error rate 56.44% (target: 15%) -2025-09-15T14:20:39.554Z | [OTHER] | Attempt 1582: Error rate 54.92% (target: 15%) -2025-09-15T14:20:39.556Z | [OTHER] | Attempt 1583: Error rate 57.46% (target: 15%) -2025-09-15T14:20:39.558Z | [OTHER] | Attempt 1584: Error rate 46.76% (target: 15%) -2025-09-15T14:20:39.561Z | [OTHER] | Attempt 1585: Error rate 53.33% (target: 15%) -2025-09-15T14:20:39.563Z | [OTHER] | Attempt 1586: Error rate 62.79% (target: 15%) -2025-09-15T14:20:39.565Z | [OTHER] | Attempt 1587: Error rate 52.65% (target: 15%) -2025-09-15T14:20:39.568Z | [OTHER] | Attempt 1588: Error rate 49.29% (target: 15%) -2025-09-15T14:20:39.570Z | [OTHER] | Attempt 1589: Error rate 49.29% (target: 15%) -2025-09-15T14:20:39.572Z | [OTHER] | Attempt 1590: Error rate 47.78% (target: 15%) -2025-09-15T14:20:39.575Z | [OTHER] | Attempt 1591: Error rate 53.88% (target: 15%) -2025-09-15T14:20:39.577Z | [OTHER] | Attempt 1592: Error rate 54.55% (target: 15%) -2025-09-15T14:20:39.580Z | [OTHER] | Attempt 1593: Error rate 59.06% (target: 15%) -2025-09-15T14:20:39.582Z | [OTHER] | Attempt 1594: Error rate 56.74% (target: 15%) -2025-09-15T14:20:39.584Z | [OTHER] | Attempt 1595: Error rate 53.79% (target: 15%) -2025-09-15T14:20:39.586Z | [OTHER] | Attempt 1596: Error rate 50.35% (target: 15%) -2025-09-15T14:20:39.588Z | [OTHER] | Attempt 1597: Error rate 53.17% (target: 15%) -2025-09-15T14:20:39.591Z | [OTHER] | Attempt 1598: Error rate 44.7% (target: 15%) -2025-09-15T14:20:39.593Z | [OTHER] | Attempt 1599: Error rate 45.74% (target: 15%) -2025-09-15T14:20:39.595Z | [OTHER] | Attempt 1600: Error rate 55.43% (target: 15%) -2025-09-15T14:20:39.598Z | [OTHER] | Attempt 1601: Error rate 47.52% (target: 15%) -2025-09-15T14:20:39.600Z | [OTHER] | Attempt 1602: Error rate 50% (target: 15%) -2025-09-15T14:20:39.602Z | [OTHER] | Attempt 1603: Error rate 54.17% (target: 15%) -2025-09-15T14:20:39.605Z | [OTHER] | Attempt 1604: Error rate 47.46% (target: 15%) -2025-09-15T14:20:39.607Z | [OTHER] | Attempt 1605: Error rate 52.99% (target: 15%) -2025-09-15T14:20:39.609Z | [OTHER] | Attempt 1606: Error rate 48.81% (target: 15%) -2025-09-15T14:20:39.611Z | [OTHER] | Attempt 1607: Error rate 44.57% (target: 15%) -2025-09-15T14:20:39.613Z | [OTHER] | Attempt 1608: Error rate 52.03% (target: 15%) -2025-09-15T14:20:39.616Z | [OTHER] | Attempt 1609: Error rate 53.79% (target: 15%) -2025-09-15T14:20:39.618Z | [OTHER] | Attempt 1610: Error rate 52.96% (target: 15%) -2025-09-15T14:20:39.621Z | [OTHER] | Attempt 1611: Error rate 44.81% (target: 15%) -2025-09-15T14:20:39.623Z | [OTHER] | Attempt 1612: Error rate 49.62% (target: 15%) -2025-09-15T14:20:39.625Z | [OTHER] | Attempt 1613: Error rate 51.16% (target: 15%) -2025-09-15T14:20:39.628Z | [OTHER] | Attempt 1614: Error rate 54.71% (target: 15%) -2025-09-15T14:20:39.630Z | [OTHER] | Attempt 1615: Error rate 52.33% (target: 15%) -2025-09-15T14:20:39.633Z | [OTHER] | Attempt 1616: Error rate 53.49% (target: 15%) -2025-09-15T14:20:39.635Z | [OTHER] | Attempt 1617: Error rate 51.94% (target: 15%) -2025-09-15T14:20:39.637Z | [OTHER] | Attempt 1618: Error rate 55.19% (target: 15%) -2025-09-15T14:20:39.640Z | [OTHER] | Attempt 1619: Error rate 53.41% (target: 15%) -2025-09-15T14:20:39.642Z | [OTHER] | Attempt 1620: Error rate 42.59% (target: 15%) -2025-09-15T14:20:39.644Z | [OTHER] | Attempt 1621: Error rate 51.94% (target: 15%) -2025-09-15T14:20:39.647Z | [OTHER] | Attempt 1622: Error rate 40.74% (target: 15%) -2025-09-15T14:20:39.649Z | [OTHER] | Attempt 1623: Error rate 52.85% (target: 15%) -2025-09-15T14:20:39.651Z | [OTHER] | Attempt 1624: Error rate 45.19% (target: 15%) -2025-09-15T14:20:39.654Z | [OTHER] | Attempt 1625: Error rate 54.26% (target: 15%) -2025-09-15T14:20:39.656Z | [OTHER] | Attempt 1626: Error rate 53.49% (target: 15%) -2025-09-15T14:20:39.659Z | [OTHER] | Attempt 1627: Error rate 54.17% (target: 15%) -2025-09-15T14:20:39.661Z | [OTHER] | Attempt 1628: Error rate 50.83% (target: 15%) -2025-09-15T14:20:39.663Z | [OTHER] | Attempt 1629: Error rate 55.16% (target: 15%) -2025-09-15T14:20:39.666Z | [OTHER] | Attempt 1630: Error rate 57.04% (target: 15%) -2025-09-15T14:20:39.668Z | [OTHER] | Attempt 1631: Error rate 55.56% (target: 15%) -2025-09-15T14:20:39.671Z | [OTHER] | Attempt 1632: Error rate 58.54% (target: 15%) -2025-09-15T14:20:39.678Z | [OTHER] | Attempt 1633: Error rate 50% (target: 15%) -2025-09-15T14:20:39.681Z | [OTHER] | Attempt 1634: Error rate 45.24% (target: 15%) -2025-09-15T14:20:39.684Z | [OTHER] | Attempt 1635: Error rate 59.09% (target: 15%) -2025-09-15T14:20:39.686Z | [OTHER] | Attempt 1636: Error rate 53.79% (target: 15%) -2025-09-15T14:20:39.689Z | [OTHER] | Attempt 1637: Error rate 49.17% (target: 15%) -2025-09-15T14:20:39.691Z | [OTHER] | Attempt 1638: Error rate 50.37% (target: 15%) -2025-09-15T14:20:39.693Z | [OTHER] | Attempt 1639: Error rate 52.22% (target: 15%) -2025-09-15T14:20:39.696Z | [OTHER] | Attempt 1640: Error rate 48.19% (target: 15%) -2025-09-15T14:20:39.698Z | [OTHER] | Attempt 1641: Error rate 59.78% (target: 15%) -2025-09-15T14:20:39.700Z | [OTHER] | Attempt 1642: Error rate 54.71% (target: 15%) -2025-09-15T14:20:39.703Z | [OTHER] | Attempt 1643: Error rate 53.79% (target: 15%) -2025-09-15T14:20:39.705Z | [OTHER] | Attempt 1644: Error rate 61.9% (target: 15%) -2025-09-15T14:20:39.707Z | [OTHER] | Attempt 1645: Error rate 59.13% (target: 15%) -2025-09-15T14:20:39.709Z | [OTHER] | Attempt 1646: Error rate 54.17% (target: 15%) -2025-09-15T14:20:39.712Z | [OTHER] | Attempt 1647: Error rate 56.35% (target: 15%) -2025-09-15T14:20:39.714Z | [OTHER] | Attempt 1648: Error rate 42.86% (target: 15%) -2025-09-15T14:20:39.716Z | [OTHER] | Attempt 1649: Error rate 47.41% (target: 15%) -2025-09-15T14:20:39.718Z | [OTHER] | Attempt 1650: Error rate 57.2% (target: 15%) -2025-09-15T14:20:39.721Z | [OTHER] | Attempt 1651: Error rate 51.55% (target: 15%) -2025-09-15T14:20:39.723Z | [OTHER] | Attempt 1652: Error rate 52.54% (target: 15%) -2025-09-15T14:20:39.726Z | [OTHER] | Attempt 1653: Error rate 54.47% (target: 15%) -2025-09-15T14:20:39.728Z | [OTHER] | Attempt 1654: Error rate 49.12% (target: 15%) -2025-09-15T14:20:39.730Z | [OTHER] | Attempt 1655: Error rate 57.58% (target: 15%) -2025-09-15T14:20:39.732Z | [OTHER] | Attempt 1656: Error rate 59.67% (target: 15%) -2025-09-15T14:20:39.734Z | [OTHER] | Attempt 1657: Error rate 52.27% (target: 15%) -2025-09-15T14:20:39.738Z | [OTHER] | Attempt 1658: Error rate 46.38% (target: 15%) -2025-09-15T14:20:39.739Z | [OTHER] | Attempt 1659: Error rate 61.9% (target: 15%) -2025-09-15T14:20:39.741Z | [OTHER] | Attempt 1660: Error rate 54.76% (target: 15%) -2025-09-15T14:20:39.744Z | [OTHER] | Attempt 1661: Error rate 52.22% (target: 15%) -2025-09-15T14:20:39.746Z | [OTHER] | Attempt 1662: Error rate 54.92% (target: 15%) -2025-09-15T14:20:39.749Z | [OTHER] | Attempt 1663: Error rate 56.35% (target: 15%) -2025-09-15T14:20:39.751Z | [OTHER] | Attempt 1664: Error rate 53.97% (target: 15%) -2025-09-15T14:20:39.753Z | [OTHER] | Attempt 1665: Error rate 52.71% (target: 15%) -2025-09-15T14:20:39.756Z | [OTHER] | Attempt 1666: Error rate 45.93% (target: 15%) -2025-09-15T14:20:39.758Z | [OTHER] | Attempt 1667: Error rate 56.52% (target: 15%) -2025-09-15T14:20:39.760Z | [OTHER] | Attempt 1668: Error rate 50% (target: 15%) -2025-09-15T14:20:39.763Z | [OTHER] | Attempt 1669: Error rate 57.41% (target: 15%) -2025-09-15T14:20:39.765Z | [OTHER] | Attempt 1670: Error rate 60.64% (target: 15%) -2025-09-15T14:20:39.767Z | [OTHER] | Attempt 1671: Error rate 51.22% (target: 15%) -2025-09-15T14:20:39.769Z | [OTHER] | Attempt 1672: Error rate 53.41% (target: 15%) -2025-09-15T14:20:39.772Z | [OTHER] | Attempt 1673: Error rate 49.22% (target: 15%) -2025-09-15T14:20:39.775Z | [OTHER] | Attempt 1674: Error rate 51.89% (target: 15%) -2025-09-15T14:20:39.777Z | [OTHER] | Attempt 1675: Error rate 57.54% (target: 15%) -2025-09-15T14:20:39.780Z | [OTHER] | Attempt 1676: Error rate 43.16% (target: 15%) -2025-09-15T14:20:39.782Z | [OTHER] | Attempt 1677: Error rate 47.22% (target: 15%) -2025-09-15T14:20:39.784Z | [OTHER] | Attempt 1678: Error rate 52.56% (target: 15%) -2025-09-15T14:20:39.787Z | [OTHER] | Attempt 1679: Error rate 43.33% (target: 15%) -2025-09-15T14:20:39.789Z | [OTHER] | Attempt 1680: Error rate 51.45% (target: 15%) -2025-09-15T14:20:39.791Z | [OTHER] | Attempt 1681: Error rate 62.59% (target: 15%) -2025-09-15T14:20:39.794Z | [OTHER] | Attempt 1682: Error rate 53.9% (target: 15%) -2025-09-15T14:20:39.796Z | [OTHER] | Attempt 1683: Error rate 54.17% (target: 15%) -2025-09-15T14:20:39.798Z | [OTHER] | Attempt 1684: Error rate 53.1% (target: 15%) -2025-09-15T14:20:39.800Z | [OTHER] | Attempt 1685: Error rate 53.7% (target: 15%) -2025-09-15T14:20:39.803Z | [OTHER] | Attempt 1686: Error rate 46.21% (target: 15%) -2025-09-15T14:20:39.806Z | [OTHER] | Attempt 1687: Error rate 49.21% (target: 15%) -2025-09-15T14:20:39.808Z | [OTHER] | Attempt 1688: Error rate 49.33% (target: 15%) -2025-09-15T14:20:39.811Z | [OTHER] | Attempt 1689: Error rate 54.42% (target: 15%) -2025-09-15T14:20:39.813Z | [OTHER] | Attempt 1690: Error rate 47.67% (target: 15%) -2025-09-15T14:20:39.815Z | [OTHER] | Attempt 1691: Error rate 59.26% (target: 15%) -2025-09-15T14:20:39.818Z | [OTHER] | Attempt 1692: Error rate 54.81% (target: 15%) -2025-09-15T14:20:39.820Z | [OTHER] | Attempt 1693: Error rate 54.76% (target: 15%) -2025-09-15T14:20:39.823Z | [OTHER] | Attempt 1694: Error rate 53.25% (target: 15%) -2025-09-15T14:20:39.825Z | [OTHER] | Attempt 1695: Error rate 50% (target: 15%) -2025-09-15T14:20:39.828Z | [OTHER] | Attempt 1696: Error rate 55.93% (target: 15%) -2025-09-15T14:20:39.830Z | [OTHER] | Attempt 1697: Error rate 48.52% (target: 15%) -2025-09-15T14:20:39.832Z | [OTHER] | Attempt 1698: Error rate 56.2% (target: 15%) -2025-09-15T14:20:39.834Z | [OTHER] | Attempt 1699: Error rate 55.78% (target: 15%) -2025-09-15T14:20:39.838Z | [OTHER] | Attempt 1700: Error rate 51.14% (target: 15%) -2025-09-15T14:20:39.840Z | [OTHER] | Attempt 1701: Error rate 56.06% (target: 15%) -2025-09-15T14:20:39.842Z | [OTHER] | Attempt 1702: Error rate 55.43% (target: 15%) -2025-09-15T14:20:39.844Z | [OTHER] | Attempt 1703: Error rate 56.16% (target: 15%) -2025-09-15T14:20:39.846Z | [OTHER] | Attempt 1704: Error rate 60.57% (target: 15%) -2025-09-15T14:20:39.849Z | [OTHER] | Attempt 1705: Error rate 52.54% (target: 15%) -2025-09-15T14:20:39.852Z | [OTHER] | Attempt 1706: Error rate 51.11% (target: 15%) -2025-09-15T14:20:39.854Z | [OTHER] | Attempt 1707: Error rate 57.72% (target: 15%) -2025-09-15T14:20:39.856Z | [OTHER] | Attempt 1708: Error rate 55.78% (target: 15%) -2025-09-15T14:20:39.859Z | [OTHER] | Attempt 1709: Error rate 49.58% (target: 15%) -2025-09-15T14:20:39.861Z | [OTHER] | Attempt 1710: Error rate 62.12% (target: 15%) -2025-09-15T14:20:39.864Z | [OTHER] | Attempt 1711: Error rate 48.61% (target: 15%) -2025-09-15T14:20:39.866Z | [OTHER] | Attempt 1712: Error rate 53.88% (target: 15%) -2025-09-15T14:20:39.868Z | [OTHER] | Attempt 1713: Error rate 50.85% (target: 15%) -2025-09-15T14:20:39.871Z | [OTHER] | Attempt 1714: Error rate 44.93% (target: 15%) -2025-09-15T14:20:39.873Z | [OTHER] | Attempt 1715: Error rate 55.07% (target: 15%) -2025-09-15T14:20:39.875Z | [OTHER] | Attempt 1716: Error rate 55.56% (target: 15%) -2025-09-15T14:20:39.878Z | [OTHER] | Attempt 1717: Error rate 52.27% (target: 15%) -2025-09-15T14:20:39.880Z | [OTHER] | Attempt 1718: Error rate 47.29% (target: 15%) -2025-09-15T14:20:39.883Z | [OTHER] | Attempt 1719: Error rate 52.71% (target: 15%) -2025-09-15T14:20:39.885Z | [OTHER] | Attempt 1720: Error rate 41.86% (target: 15%) -2025-09-15T14:20:39.887Z | [OTHER] | Attempt 1721: Error rate 51.55% (target: 15%) -2025-09-15T14:20:39.890Z | [OTHER] | Attempt 1722: Error rate 55.67% (target: 15%) -2025-09-15T14:20:39.892Z | [OTHER] | Attempt 1723: Error rate 45.53% (target: 15%) -2025-09-15T14:20:39.894Z | [OTHER] | Attempt 1724: Error rate 56.5% (target: 15%) -2025-09-15T14:20:39.897Z | [OTHER] | Attempt 1725: Error rate 44.02% (target: 15%) -2025-09-15T14:20:39.899Z | [OTHER] | Attempt 1726: Error rate 55.56% (target: 15%) -2025-09-15T14:20:39.902Z | [OTHER] | Attempt 1727: Error rate 53.66% (target: 15%) -2025-09-15T14:20:39.904Z | [OTHER] | Attempt 1728: Error rate 57.5% (target: 15%) -2025-09-15T14:20:39.906Z | [OTHER] | Attempt 1729: Error rate 47.87% (target: 15%) -2025-09-15T14:20:39.908Z | [OTHER] | Attempt 1730: Error rate 46.83% (target: 15%) -2025-09-15T14:20:39.911Z | [OTHER] | Attempt 1731: Error rate 54.07% (target: 15%) -2025-09-15T14:20:39.913Z | [OTHER] | Attempt 1732: Error rate 50% (target: 15%) -2025-09-15T14:20:39.915Z | [OTHER] | Attempt 1733: Error rate 53.41% (target: 15%) -2025-09-15T14:20:39.918Z | [OTHER] | Attempt 1734: Error rate 51.52% (target: 15%) -2025-09-15T14:20:39.920Z | [OTHER] | Attempt 1735: Error rate 39.53% (target: 15%) -2025-09-15T14:20:39.922Z | [OTHER] | Attempt 1736: Error rate 55.56% (target: 15%) -2025-09-15T14:20:39.925Z | [OTHER] | Attempt 1737: Error rate 47.83% (target: 15%) -2025-09-15T14:20:39.927Z | [OTHER] | Attempt 1738: Error rate 54.07% (target: 15%) -2025-09-15T14:20:39.929Z | [OTHER] | Attempt 1739: Error rate 56.38% (target: 15%) -2025-09-15T14:20:39.932Z | [OTHER] | Attempt 1740: Error rate 60% (target: 15%) -2025-09-15T14:20:39.934Z | [OTHER] | Attempt 1741: Error rate 53.1% (target: 15%) -2025-09-15T14:20:39.937Z | [OTHER] | Attempt 1742: Error rate 47.1% (target: 15%) -2025-09-15T14:20:39.939Z | [OTHER] | Attempt 1743: Error rate 59.3% (target: 15%) -2025-09-15T14:20:39.942Z | [OTHER] | Attempt 1744: Error rate 50.76% (target: 15%) -2025-09-15T14:20:39.945Z | [OTHER] | Attempt 1745: Error rate 52.84% (target: 15%) -2025-09-15T14:20:39.948Z | [OTHER] | Attempt 1746: Error rate 57.14% (target: 15%) -2025-09-15T14:20:39.950Z | [OTHER] | Attempt 1747: Error rate 49.65% (target: 15%) -2025-09-15T14:20:39.953Z | [OTHER] | Attempt 1748: Error rate 53.17% (target: 15%) -2025-09-15T14:20:39.956Z | [OTHER] | Attempt 1749: Error rate 57.32% (target: 15%) -2025-09-15T14:20:39.959Z | [OTHER] | Attempt 1750: Error rate 56.98% (target: 15%) -2025-09-15T14:20:39.963Z | [OTHER] | Attempt 1751: Error rate 59.33% (target: 15%) -2025-09-15T14:20:39.966Z | [OTHER] | Attempt 1752: Error rate 50% (target: 15%) -2025-09-15T14:20:39.969Z | [OTHER] | Attempt 1753: Error rate 56.38% (target: 15%) -2025-09-15T14:20:39.972Z | [OTHER] | Attempt 1754: Error rate 51.11% (target: 15%) -2025-09-15T14:20:39.974Z | [OTHER] | Attempt 1755: Error rate 62.4% (target: 15%) -2025-09-15T14:20:39.977Z | [OTHER] | Attempt 1756: Error rate 43.18% (target: 15%) -2025-09-15T14:20:39.979Z | [OTHER] | Attempt 1757: Error rate 45.18% (target: 15%) -2025-09-15T14:20:39.981Z | [OTHER] | Attempt 1758: Error rate 47.62% (target: 15%) -2025-09-15T14:20:39.984Z | [OTHER] | Attempt 1759: Error rate 51.89% (target: 15%) -2025-09-15T14:20:39.987Z | [OTHER] | Attempt 1760: Error rate 47.57% (target: 15%) -2025-09-15T14:20:39.989Z | [OTHER] | Attempt 1761: Error rate 52.92% (target: 15%) -2025-09-15T14:20:39.992Z | [OTHER] | Attempt 1762: Error rate 61.51% (target: 15%) -2025-09-15T14:20:39.995Z | [OTHER] | Attempt 1763: Error rate 50.79% (target: 15%) -2025-09-15T14:20:39.998Z | [OTHER] | Attempt 1764: Error rate 58.71% (target: 15%) -2025-09-15T14:20:40.000Z | [OTHER] | Attempt 1765: Error rate 58.55% (target: 15%) -2025-09-15T14:20:40.003Z | [OTHER] | Attempt 1766: Error rate 55.32% (target: 15%) -2025-09-15T14:20:40.006Z | [OTHER] | Attempt 1767: Error rate 55.43% (target: 15%) -2025-09-15T14:20:40.010Z | [OTHER] | Attempt 1768: Error rate 52.84% (target: 15%) -2025-09-15T14:20:40.013Z | [OTHER] | Attempt 1769: Error rate 53.55% (target: 15%) -2025-09-15T14:20:40.016Z | [OTHER] | Attempt 1770: Error rate 43.7% (target: 15%) -2025-09-15T14:20:40.019Z | [OTHER] | Attempt 1771: Error rate 51.59% (target: 15%) -2025-09-15T14:20:40.022Z | [OTHER] | Attempt 1772: Error rate 53.41% (target: 15%) -2025-09-15T14:20:40.025Z | [OTHER] | Attempt 1773: Error rate 54.7% (target: 15%) -2025-09-15T14:20:40.028Z | [OTHER] | Attempt 1774: Error rate 52.04% (target: 15%) -2025-09-15T14:20:40.030Z | [OTHER] | Attempt 1775: Error rate 45.83% (target: 15%) -2025-09-15T14:20:40.033Z | [OTHER] | Attempt 1776: Error rate 49.64% (target: 15%) -2025-09-15T14:20:40.036Z | [OTHER] | Attempt 1777: Error rate 45.19% (target: 15%) -2025-09-15T14:20:40.039Z | [OTHER] | Attempt 1778: Error rate 56.67% (target: 15%) -2025-09-15T14:20:40.041Z | [OTHER] | Attempt 1779: Error rate 57.58% (target: 15%) -2025-09-15T14:20:40.044Z | [OTHER] | Attempt 1780: Error rate 51.89% (target: 15%) -2025-09-15T14:20:40.047Z | [OTHER] | Attempt 1781: Error rate 52.17% (target: 15%) -2025-09-15T14:20:40.050Z | [OTHER] | Attempt 1782: Error rate 53.33% (target: 15%) -2025-09-15T14:20:40.054Z | [OTHER] | Attempt 1783: Error rate 46.88% (target: 15%) -2025-09-15T14:20:40.056Z | [OTHER] | Attempt 1784: Error rate 53.57% (target: 15%) -2025-09-15T14:20:40.058Z | [OTHER] | Attempt 1785: Error rate 55.56% (target: 15%) -2025-09-15T14:20:40.061Z | [OTHER] | Attempt 1786: Error rate 55.43% (target: 15%) -2025-09-15T14:20:40.064Z | [OTHER] | Attempt 1787: Error rate 50.36% (target: 15%) -2025-09-15T14:20:40.067Z | [OTHER] | Attempt 1788: Error rate 52.27% (target: 15%) -2025-09-15T14:20:40.070Z | [OTHER] | Attempt 1789: Error rate 58.33% (target: 15%) -2025-09-15T14:20:40.072Z | [OTHER] | Attempt 1790: Error rate 49.21% (target: 15%) -2025-09-15T14:20:40.075Z | [OTHER] | Attempt 1791: Error rate 57.2% (target: 15%) -2025-09-15T14:20:40.078Z | [OTHER] | Attempt 1792: Error rate 50.78% (target: 15%) -2025-09-15T14:20:40.080Z | [OTHER] | Attempt 1793: Error rate 52.22% (target: 15%) -2025-09-15T14:20:40.083Z | [OTHER] | Attempt 1794: Error rate 51.85% (target: 15%) -2025-09-15T14:20:40.085Z | [OTHER] | Attempt 1795: Error rate 62.68% (target: 15%) -2025-09-15T14:20:40.087Z | [OTHER] | Attempt 1796: Error rate 48.11% (target: 15%) -2025-09-15T14:20:40.090Z | [OTHER] | Attempt 1797: Error rate 50.78% (target: 15%) -2025-09-15T14:20:40.092Z | [OTHER] | Attempt 1798: Error rate 55.8% (target: 15%) -2025-09-15T14:20:40.095Z | [OTHER] | Attempt 1799: Error rate 45.29% (target: 15%) -2025-09-15T14:20:40.097Z | [OTHER] | Attempt 1800: Error rate 46.43% (target: 15%) -2025-09-15T14:20:40.099Z | [OTHER] | Attempt 1801: Error rate 47.78% (target: 15%) -2025-09-15T14:20:40.102Z | [OTHER] | Attempt 1802: Error rate 46.38% (target: 15%) -2025-09-15T14:20:40.104Z | [OTHER] | Attempt 1803: Error rate 49.58% (target: 15%) -2025-09-15T14:20:40.106Z | [OTHER] | Attempt 1804: Error rate 47.35% (target: 15%) -2025-09-15T14:20:40.109Z | [OTHER] | Attempt 1805: Error rate 52.5% (target: 15%) -2025-09-15T14:20:40.112Z | [OTHER] | Attempt 1806: Error rate 47.35% (target: 15%) -2025-09-15T14:20:40.114Z | [OTHER] | Attempt 1807: Error rate 52.78% (target: 15%) -2025-09-15T14:20:40.116Z | [OTHER] | Attempt 1808: Error rate 49.63% (target: 15%) -2025-09-15T14:20:40.119Z | [OTHER] | Attempt 1809: Error rate 53.75% (target: 15%) -2025-09-15T14:20:40.121Z | [OTHER] | Attempt 1810: Error rate 61.36% (target: 15%) -2025-09-15T14:20:40.124Z | [OTHER] | Attempt 1811: Error rate 50.81% (target: 15%) -2025-09-15T14:20:40.126Z | [OTHER] | Attempt 1812: Error rate 50.43% (target: 15%) -2025-09-15T14:20:40.128Z | [OTHER] | Attempt 1813: Error rate 46.05% (target: 15%) -2025-09-15T14:20:40.131Z | [OTHER] | Attempt 1814: Error rate 53.41% (target: 15%) -2025-09-15T14:20:40.133Z | [OTHER] | Attempt 1815: Error rate 56.2% (target: 15%) -2025-09-15T14:20:40.136Z | [OTHER] | Attempt 1816: Error rate 57.36% (target: 15%) -2025-09-15T14:20:40.138Z | [OTHER] | Attempt 1817: Error rate 53.26% (target: 15%) -2025-09-15T14:20:40.140Z | [OTHER] | Attempt 1818: Error rate 47.08% (target: 15%) -2025-09-15T14:20:40.143Z | [OTHER] | Attempt 1819: Error rate 57.14% (target: 15%) -2025-09-15T14:20:40.145Z | [OTHER] | Attempt 1820: Error rate 52.17% (target: 15%) -2025-09-15T14:20:40.148Z | [OTHER] | Attempt 1821: Error rate 47.78% (target: 15%) -2025-09-15T14:20:40.150Z | [OTHER] | Attempt 1822: Error rate 61.51% (target: 15%) -2025-09-15T14:20:40.153Z | [OTHER] | Attempt 1823: Error rate 52.14% (target: 15%) -2025-09-15T14:20:40.155Z | [OTHER] | Attempt 1824: Error rate 51.85% (target: 15%) -2025-09-15T14:20:40.159Z | [OTHER] | Attempt 1825: Error rate 46.21% (target: 15%) -2025-09-15T14:20:40.160Z | [OTHER] | Attempt 1826: Error rate 52.9% (target: 15%) -2025-09-15T14:20:40.163Z | [OTHER] | Attempt 1827: Error rate 53.62% (target: 15%) -2025-09-15T14:20:40.165Z | [OTHER] | Attempt 1828: Error rate 54.61% (target: 15%) -2025-09-15T14:20:40.168Z | [OTHER] | Attempt 1829: Error rate 52.22% (target: 15%) -2025-09-15T14:20:40.170Z | [OTHER] | Attempt 1830: Error rate 51.59% (target: 15%) -2025-09-15T14:20:40.172Z | [OTHER] | Attempt 1831: Error rate 51.67% (target: 15%) -2025-09-15T14:20:40.175Z | [OTHER] | Attempt 1832: Error rate 48.58% (target: 15%) -2025-09-15T14:20:40.177Z | [OTHER] | Attempt 1833: Error rate 52.84% (target: 15%) -2025-09-15T14:20:40.180Z | [OTHER] | Attempt 1834: Error rate 54.07% (target: 15%) -2025-09-15T14:20:40.182Z | [OTHER] | Attempt 1835: Error rate 52.17% (target: 15%) -2025-09-15T14:20:40.185Z | [OTHER] | Attempt 1836: Error rate 45.65% (target: 15%) -2025-09-15T14:20:40.187Z | [OTHER] | Attempt 1837: Error rate 53.17% (target: 15%) -2025-09-15T14:20:40.190Z | [OTHER] | Attempt 1838: Error rate 58.33% (target: 15%) -2025-09-15T14:20:40.193Z | [OTHER] | Attempt 1839: Error rate 51.98% (target: 15%) -2025-09-15T14:20:40.195Z | [OTHER] | Attempt 1840: Error rate 42.03% (target: 15%) -2025-09-15T14:20:40.198Z | [OTHER] | Attempt 1841: Error rate 49.28% (target: 15%) -2025-09-15T14:20:40.200Z | [OTHER] | Attempt 1842: Error rate 55.67% (target: 15%) -2025-09-15T14:20:40.203Z | [OTHER] | Attempt 1843: Error rate 56.88% (target: 15%) -2025-09-15T14:20:40.205Z | [OTHER] | Attempt 1844: Error rate 45.74% (target: 15%) -2025-09-15T14:20:40.208Z | [OTHER] | Attempt 1845: Error rate 53.88% (target: 15%) -2025-09-15T14:20:40.210Z | [OTHER] | Attempt 1846: Error rate 48.15% (target: 15%) -2025-09-15T14:20:40.213Z | [OTHER] | Attempt 1847: Error rate 50% (target: 15%) -2025-09-15T14:20:40.215Z | [OTHER] | Attempt 1848: Error rate 45.08% (target: 15%) -2025-09-15T14:20:40.218Z | [OTHER] | Attempt 1849: Error rate 51.89% (target: 15%) -2025-09-15T14:20:40.220Z | [OTHER] | Attempt 1850: Error rate 49.22% (target: 15%) -2025-09-15T14:20:40.223Z | [OTHER] | Attempt 1851: Error rate 48.84% (target: 15%) -2025-09-15T14:20:40.225Z | [OTHER] | Attempt 1852: Error rate 48% (target: 15%) -2025-09-15T14:20:40.228Z | [OTHER] | Attempt 1853: Error rate 53.49% (target: 15%) -2025-09-15T14:20:40.230Z | [OTHER] | Attempt 1854: Error rate 49.28% (target: 15%) -2025-09-15T14:20:40.233Z | [OTHER] | Attempt 1855: Error rate 58.13% (target: 15%) -2025-09-15T14:20:40.235Z | [OTHER] | Attempt 1856: Error rate 58.15% (target: 15%) -2025-09-15T14:20:40.237Z | [OTHER] | Attempt 1857: Error rate 50.74% (target: 15%) -2025-09-15T14:20:40.240Z | [OTHER] | Attempt 1858: Error rate 56.35% (target: 15%) -2025-09-15T14:20:40.242Z | [OTHER] | Attempt 1859: Error rate 46.83% (target: 15%) -2025-09-15T14:20:40.245Z | [OTHER] | Attempt 1860: Error rate 51.11% (target: 15%) -2025-09-15T14:20:40.247Z | [OTHER] | Attempt 1861: Error rate 47.87% (target: 15%) -2025-09-15T14:20:40.249Z | [OTHER] | Attempt 1862: Error rate 55.68% (target: 15%) -2025-09-15T14:20:40.252Z | [OTHER] | Attempt 1863: Error rate 51.55% (target: 15%) -2025-09-15T14:20:40.254Z | [OTHER] | Attempt 1864: Error rate 50.35% (target: 15%) -2025-09-15T14:20:40.257Z | [OTHER] | Attempt 1865: Error rate 55.16% (target: 15%) -2025-09-15T14:20:40.260Z | [OTHER] | Attempt 1866: Error rate 58.5% (target: 15%) -2025-09-15T14:20:40.262Z | [OTHER] | Attempt 1867: Error rate 52.17% (target: 15%) -2025-09-15T14:20:40.264Z | [OTHER] | Attempt 1868: Error rate 41.47% (target: 15%) -2025-09-15T14:20:40.267Z | [OTHER] | Attempt 1869: Error rate 51.52% (target: 15%) -2025-09-15T14:20:40.269Z | [OTHER] | Attempt 1870: Error rate 58.33% (target: 15%) -2025-09-15T14:20:40.272Z | [OTHER] | Attempt 1871: Error rate 51.11% (target: 15%) -2025-09-15T14:20:40.274Z | [OTHER] | Attempt 1872: Error rate 48.52% (target: 15%) -2025-09-15T14:20:40.278Z | [OTHER] | Attempt 1873: Error rate 45.56% (target: 15%) -2025-09-15T14:20:40.280Z | [OTHER] | Attempt 1874: Error rate 49.63% (target: 15%) -2025-09-15T14:20:40.283Z | [OTHER] | Attempt 1875: Error rate 46.34% (target: 15%) -2025-09-15T14:20:40.285Z | [OTHER] | Attempt 1876: Error rate 51.55% (target: 15%) -2025-09-15T14:20:40.288Z | [OTHER] | Attempt 1877: Error rate 53.57% (target: 15%) -2025-09-15T14:20:40.290Z | [OTHER] | Attempt 1878: Error rate 52.14% (target: 15%) -2025-09-15T14:20:40.293Z | [OTHER] | Attempt 1879: Error rate 48.45% (target: 15%) -2025-09-15T14:20:40.295Z | [OTHER] | Attempt 1880: Error rate 49.57% (target: 15%) -2025-09-15T14:20:40.298Z | [OTHER] | Attempt 1881: Error rate 45.83% (target: 15%) -2025-09-15T14:20:40.300Z | [OTHER] | Attempt 1882: Error rate 51.67% (target: 15%) -2025-09-15T14:20:40.303Z | [OTHER] | Attempt 1883: Error rate 53.06% (target: 15%) -2025-09-15T14:20:40.306Z | [OTHER] | Attempt 1884: Error rate 51.42% (target: 15%) -2025-09-15T14:20:40.308Z | [OTHER] | Attempt 1885: Error rate 56.44% (target: 15%) -2025-09-15T14:20:40.310Z | [OTHER] | Attempt 1886: Error rate 52.54% (target: 15%) -2025-09-15T14:20:40.313Z | [OTHER] | Attempt 1887: Error rate 46.67% (target: 15%) -2025-09-15T14:20:40.316Z | [OTHER] | Attempt 1888: Error rate 59.47% (target: 15%) -2025-09-15T14:20:40.318Z | [OTHER] | Attempt 1889: Error rate 50.67% (target: 15%) -2025-09-15T14:20:40.321Z | [OTHER] | Attempt 1890: Error rate 56.35% (target: 15%) -2025-09-15T14:20:40.323Z | [OTHER] | Attempt 1891: Error rate 59.13% (target: 15%) -2025-09-15T14:20:40.326Z | [OTHER] | Attempt 1892: Error rate 52.44% (target: 15%) -2025-09-15T14:20:40.328Z | [OTHER] | Attempt 1893: Error rate 56.06% (target: 15%) -2025-09-15T14:20:40.330Z | [OTHER] | Attempt 1894: Error rate 58.15% (target: 15%) -2025-09-15T14:20:40.333Z | [OTHER] | Attempt 1895: Error rate 47.22% (target: 15%) -2025-09-15T14:20:40.335Z | [OTHER] | Attempt 1896: Error rate 59.63% (target: 15%) -2025-09-15T14:20:40.338Z | [OTHER] | Attempt 1897: Error rate 50.39% (target: 15%) -2025-09-15T14:20:40.340Z | [OTHER] | Attempt 1898: Error rate 47.35% (target: 15%) -2025-09-15T14:20:40.343Z | [OTHER] | Attempt 1899: Error rate 41.48% (target: 15%) -2025-09-15T14:20:40.346Z | [OTHER] | Attempt 1900: Error rate 46.74% (target: 15%) -2025-09-15T14:20:40.348Z | [OTHER] | Attempt 1901: Error rate 54.92% (target: 15%) -2025-09-15T14:20:40.350Z | [OTHER] | Attempt 1902: Error rate 55.69% (target: 15%) -2025-09-15T14:20:40.353Z | [OTHER] | Attempt 1903: Error rate 48.15% (target: 15%) -2025-09-15T14:20:40.356Z | [OTHER] | Attempt 1904: Error rate 55.04% (target: 15%) -2025-09-15T14:20:40.358Z | [OTHER] | Attempt 1905: Error rate 60.71% (target: 15%) -2025-09-15T14:20:40.361Z | [OTHER] | Attempt 1906: Error rate 50.83% (target: 15%) -2025-09-15T14:20:40.363Z | [OTHER] | Attempt 1907: Error rate 51.59% (target: 15%) -2025-09-15T14:20:40.367Z | [OTHER] | Attempt 1908: Error rate 60.99% (target: 15%) -2025-09-15T14:20:40.368Z | [OTHER] | Attempt 1909: Error rate 43.02% (target: 15%) -2025-09-15T14:20:40.371Z | [OTHER] | Attempt 1910: Error rate 44.96% (target: 15%) -2025-09-15T14:20:40.373Z | [OTHER] | Attempt 1911: Error rate 53.49% (target: 15%) -2025-09-15T14:20:40.376Z | [OTHER] | Attempt 1912: Error rate 54.81% (target: 15%) -2025-09-15T14:20:40.378Z | [OTHER] | Attempt 1913: Error rate 56.06% (target: 15%) -2025-09-15T14:20:40.381Z | [OTHER] | Attempt 1914: Error rate 54.65% (target: 15%) -2025-09-15T14:20:40.383Z | [OTHER] | Attempt 1915: Error rate 47.96% (target: 15%) -2025-09-15T14:20:40.386Z | [OTHER] | Attempt 1916: Error rate 55.3% (target: 15%) -2025-09-15T14:20:40.388Z | [OTHER] | Attempt 1917: Error rate 43.8% (target: 15%) -2025-09-15T14:20:40.390Z | [OTHER] | Attempt 1918: Error rate 58.33% (target: 15%) -2025-09-15T14:20:40.393Z | [OTHER] | Attempt 1919: Error rate 45.19% (target: 15%) -2025-09-15T14:20:40.395Z | [OTHER] | Attempt 1920: Error rate 57.95% (target: 15%) -2025-09-15T14:20:40.398Z | [OTHER] | Attempt 1921: Error rate 54.96% (target: 15%) -2025-09-15T14:20:40.400Z | [OTHER] | Attempt 1922: Error rate 50.36% (target: 15%) -2025-09-15T14:20:40.402Z | [OTHER] | Attempt 1923: Error rate 47.14% (target: 15%) -2025-09-15T14:20:40.405Z | [OTHER] | Attempt 1924: Error rate 46.83% (target: 15%) -2025-09-15T14:20:40.408Z | [OTHER] | Attempt 1925: Error rate 40.94% (target: 15%) -2025-09-15T14:20:40.410Z | [OTHER] | Attempt 1926: Error rate 51.89% (target: 15%) -2025-09-15T14:20:40.413Z | [OTHER] | Attempt 1927: Error rate 56.3% (target: 15%) -2025-09-15T14:20:40.415Z | [OTHER] | Attempt 1928: Error rate 57.75% (target: 15%) -2025-09-15T14:20:40.418Z | [OTHER] | Attempt 1929: Error rate 50% (target: 15%) -2025-09-15T14:20:40.420Z | [OTHER] | Attempt 1930: Error rate 51.06% (target: 15%) -2025-09-15T14:20:40.423Z | [OTHER] | Attempt 1931: Error rate 55.81% (target: 15%) -2025-09-15T14:20:40.425Z | [OTHER] | Attempt 1932: Error rate 48.26% (target: 15%) -2025-09-15T14:20:40.428Z | [OTHER] | Attempt 1933: Error rate 54.07% (target: 15%) -2025-09-15T14:20:40.430Z | [OTHER] | Attempt 1934: Error rate 49.28% (target: 15%) -2025-09-15T14:20:40.433Z | [OTHER] | Attempt 1935: Error rate 54.26% (target: 15%) -2025-09-15T14:20:40.436Z | [OTHER] | Attempt 1936: Error rate 59.92% (target: 15%) -2025-09-15T14:20:40.438Z | [OTHER] | Attempt 1937: Error rate 56.16% (target: 15%) -2025-09-15T14:20:40.441Z | [OTHER] | Attempt 1938: Error rate 43% (target: 15%) -2025-09-15T14:20:40.443Z | [OTHER] | Attempt 1939: Error rate 52.59% (target: 15%) -2025-09-15T14:20:40.446Z | [OTHER] | Attempt 1940: Error rate 52.27% (target: 15%) -2025-09-15T14:20:40.448Z | [OTHER] | Attempt 1941: Error rate 55.56% (target: 15%) -2025-09-15T14:20:40.451Z | [OTHER] | Attempt 1942: Error rate 52.59% (target: 15%) -2025-09-15T14:20:40.453Z | [OTHER] | Attempt 1943: Error rate 48.48% (target: 15%) -2025-09-15T14:20:40.455Z | [OTHER] | Attempt 1944: Error rate 52.96% (target: 15%) -2025-09-15T14:20:40.458Z | [OTHER] | Attempt 1945: Error rate 56.38% (target: 15%) -2025-09-15T14:20:40.461Z | [OTHER] | Attempt 1946: Error rate 55.93% (target: 15%) -2025-09-15T14:20:40.463Z | [OTHER] | Attempt 1947: Error rate 51.52% (target: 15%) -2025-09-15T14:20:40.465Z | [OTHER] | Attempt 1948: Error rate 57.69% (target: 15%) -2025-09-15T14:20:40.469Z | [OTHER] | Attempt 1949: Error rate 54.61% (target: 15%) -2025-09-15T14:20:40.471Z | [OTHER] | Attempt 1950: Error rate 50.81% (target: 15%) -2025-09-15T14:20:40.473Z | [OTHER] | Attempt 1951: Error rate 43.4% (target: 15%) -2025-09-15T14:20:40.476Z | [OTHER] | Attempt 1952: Error rate 42.22% (target: 15%) -2025-09-15T14:20:40.478Z | [OTHER] | Attempt 1953: Error rate 46.03% (target: 15%) -2025-09-15T14:20:40.481Z | [OTHER] | Attempt 1954: Error rate 50.42% (target: 15%) -2025-09-15T14:20:40.484Z | [OTHER] | Attempt 1955: Error rate 51.25% (target: 15%) -2025-09-15T14:20:40.486Z | [OTHER] | Attempt 1956: Error rate 49.65% (target: 15%) -2025-09-15T14:20:40.489Z | [OTHER] | Attempt 1957: Error rate 52.27% (target: 15%) -2025-09-15T14:20:40.491Z | [OTHER] | Attempt 1958: Error rate 50.43% (target: 15%) -2025-09-15T14:20:40.493Z | [OTHER] | Attempt 1959: Error rate 49.15% (target: 15%) -2025-09-15T14:20:40.496Z | [OTHER] | Attempt 1960: Error rate 48.11% (target: 15%) -2025-09-15T14:20:40.498Z | [OTHER] | Attempt 1961: Error rate 44.44% (target: 15%) -2025-09-15T14:20:40.501Z | [OTHER] | Attempt 1962: Error rate 59.92% (target: 15%) -2025-09-15T14:20:40.503Z | [OTHER] | Attempt 1963: Error rate 52.33% (target: 15%) -2025-09-15T14:20:40.506Z | [OTHER] | Attempt 1964: Error rate 44.2% (target: 15%) -2025-09-15T14:20:40.508Z | [OTHER] | Attempt 1965: Error rate 47.62% (target: 15%) -2025-09-15T14:20:40.510Z | [OTHER] | Attempt 1966: Error rate 50.39% (target: 15%) -2025-09-15T14:20:40.514Z | [OTHER] | Attempt 1967: Error rate 55.8% (target: 15%) -2025-09-15T14:20:40.516Z | [OTHER] | Attempt 1968: Error rate 51.45% (target: 15%) -2025-09-15T14:20:40.519Z | [OTHER] | Attempt 1969: Error rate 47.62% (target: 15%) -2025-09-15T14:20:40.521Z | [OTHER] | Attempt 1970: Error rate 57.94% (target: 15%) -2025-09-15T14:20:40.524Z | [OTHER] | Attempt 1971: Error rate 55.07% (target: 15%) -2025-09-15T14:20:40.526Z | [OTHER] | Attempt 1972: Error rate 57.36% (target: 15%) -2025-09-15T14:20:40.529Z | [OTHER] | Attempt 1973: Error rate 54.96% (target: 15%) -2025-09-15T14:20:40.531Z | [OTHER] | Attempt 1974: Error rate 51.67% (target: 15%) -2025-09-15T14:20:40.534Z | [OTHER] | Attempt 1975: Error rate 59.92% (target: 15%) -2025-09-15T14:20:40.536Z | [OTHER] | Attempt 1976: Error rate 55.28% (target: 15%) -2025-09-15T14:20:40.539Z | [OTHER] | Attempt 1977: Error rate 50.36% (target: 15%) -2025-09-15T14:20:40.542Z | [OTHER] | Attempt 1978: Error rate 50.36% (target: 15%) -2025-09-15T14:20:40.545Z | [OTHER] | Attempt 1979: Error rate 49.62% (target: 15%) -2025-09-15T14:20:40.548Z | [OTHER] | Attempt 1980: Error rate 47.87% (target: 15%) -2025-09-15T14:20:40.551Z | [OTHER] | Attempt 1981: Error rate 53.74% (target: 15%) -2025-09-15T14:20:40.553Z | [OTHER] | Attempt 1982: Error rate 57.09% (target: 15%) -2025-09-15T14:20:40.556Z | [OTHER] | Attempt 1983: Error rate 55.43% (target: 15%) -2025-09-15T14:20:40.559Z | [OTHER] | Attempt 1984: Error rate 49.26% (target: 15%) -2025-09-15T14:20:40.563Z | [OTHER] | Attempt 1985: Error rate 55.93% (target: 15%) -2025-09-15T14:20:40.565Z | [OTHER] | Attempt 1986: Error rate 52.13% (target: 15%) -2025-09-15T14:20:40.568Z | [OTHER] | Attempt 1987: Error rate 45.83% (target: 15%) -2025-09-15T14:20:40.571Z | [OTHER] | Attempt 1988: Error rate 54.37% (target: 15%) -2025-09-15T14:20:40.574Z | [OTHER] | Attempt 1989: Error rate 49.63% (target: 15%) -2025-09-15T14:20:40.577Z | [OTHER] | Attempt 1990: Error rate 55.04% (target: 15%) -2025-09-15T14:20:40.580Z | [OTHER] | Attempt 1991: Error rate 51.55% (target: 15%) -2025-09-15T14:20:40.582Z | [OTHER] | Attempt 1992: Error rate 50% (target: 15%) -2025-09-15T14:20:40.585Z | [OTHER] | Attempt 1993: Error rate 50.74% (target: 15%) -2025-09-15T14:20:40.587Z | [OTHER] | Attempt 1994: Error rate 53.62% (target: 15%) -2025-09-15T14:20:40.589Z | [OTHER] | Attempt 1995: Error rate 52.96% (target: 15%) -2025-09-15T14:20:40.592Z | [OTHER] | Attempt 1996: Error rate 58.7% (target: 15%) -2025-09-15T14:20:40.595Z | [OTHER] | Attempt 1997: Error rate 51.11% (target: 15%) -2025-09-15T14:20:40.597Z | [OTHER] | Attempt 1998: Error rate 48.06% (target: 15%) -2025-09-15T14:20:40.600Z | [OTHER] | Attempt 1999: Error rate 55.56% (target: 15%) -2025-09-15T14:20:40.602Z | [OTHER] | Attempt 2000: Error rate 55.04% (target: 15%) -2025-09-15T14:20:40.605Z | [OTHER] | Attempt 2001: Error rate 55.83% (target: 15%) -2025-09-15T14:20:40.607Z | [OTHER] | Attempt 2002: Error rate 54.07% (target: 15%) -2025-09-15T14:20:40.610Z | [OTHER] | Attempt 2003: Error rate 55.98% (target: 15%) -2025-09-15T14:20:40.613Z | [OTHER] | Attempt 2004: Error rate 54.7% (target: 15%) -2025-09-15T14:20:40.615Z | [OTHER] | Attempt 2005: Error rate 56.2% (target: 15%) -2025-09-15T14:20:40.618Z | [OTHER] | Attempt 2006: Error rate 56.52% (target: 15%) -2025-09-15T14:20:40.620Z | [OTHER] | Attempt 2007: Error rate 51.22% (target: 15%) -2025-09-15T14:20:40.623Z | [OTHER] | Attempt 2008: Error rate 53.26% (target: 15%) -2025-09-15T14:20:40.626Z | [OTHER] | Attempt 2009: Error rate 51.45% (target: 15%) -2025-09-15T14:20:40.628Z | [OTHER] | Attempt 2010: Error rate 47.04% (target: 15%) -2025-09-15T14:20:40.631Z | [OTHER] | Attempt 2011: Error rate 37.6% (target: 15%) -2025-09-15T14:20:40.634Z | [OTHER] | Attempt 2012: Error rate 53.17% (target: 15%) -2025-09-15T14:20:40.636Z | [OTHER] | Attempt 2013: Error rate 50.37% (target: 15%) -2025-09-15T14:20:40.639Z | [OTHER] | Attempt 2014: Error rate 51.48% (target: 15%) -2025-09-15T14:20:40.642Z | [OTHER] | Attempt 2015: Error rate 43.56% (target: 15%) -2025-09-15T14:20:40.644Z | [OTHER] | Attempt 2016: Error rate 55.93% (target: 15%) -2025-09-15T14:20:40.647Z | [OTHER] | Attempt 2017: Error rate 49.64% (target: 15%) -2025-09-15T14:20:40.650Z | [OTHER] | Attempt 2018: Error rate 51.45% (target: 15%) -2025-09-15T14:20:40.652Z | [OTHER] | Attempt 2019: Error rate 55.07% (target: 15%) -2025-09-15T14:20:40.655Z | [OTHER] | Attempt 2020: Error rate 55.93% (target: 15%) -2025-09-15T14:20:40.658Z | [OTHER] | Attempt 2021: Error rate 60.74% (target: 15%) -2025-09-15T14:20:40.660Z | [OTHER] | Attempt 2022: Error rate 53.33% (target: 15%) -2025-09-15T14:20:40.662Z | [OTHER] | Attempt 2023: Error rate 50% (target: 15%) -2025-09-15T14:20:40.665Z | [OTHER] | Attempt 2024: Error rate 58.33% (target: 15%) -2025-09-15T14:20:40.668Z | [OTHER] | Attempt 2025: Error rate 46.9% (target: 15%) -2025-09-15T14:20:40.671Z | [OTHER] | Attempt 2026: Error rate 51.32% (target: 15%) -2025-09-15T14:20:40.673Z | [OTHER] | Attempt 2027: Error rate 54.07% (target: 15%) -2025-09-15T14:20:40.676Z | [OTHER] | Attempt 2028: Error rate 45.73% (target: 15%) -2025-09-15T14:20:40.678Z | [OTHER] | Attempt 2029: Error rate 46.97% (target: 15%) -2025-09-15T14:20:40.681Z | [OTHER] | Attempt 2030: Error rate 49.6% (target: 15%) -2025-09-15T14:20:40.684Z | [OTHER] | Attempt 2031: Error rate 47.83% (target: 15%) -2025-09-15T14:20:40.686Z | [OTHER] | Attempt 2032: Error rate 50.38% (target: 15%) -2025-09-15T14:20:40.690Z | [OTHER] | Attempt 2033: Error rate 57.72% (target: 15%) -2025-09-15T14:20:40.691Z | [OTHER] | Attempt 2034: Error rate 51.98% (target: 15%) -2025-09-15T14:20:40.694Z | [OTHER] | Attempt 2035: Error rate 55% (target: 15%) -2025-09-15T14:20:40.697Z | [OTHER] | Attempt 2036: Error rate 57.94% (target: 15%) -2025-09-15T14:20:40.699Z | [OTHER] | Attempt 2037: Error rate 53.17% (target: 15%) -2025-09-15T14:20:40.702Z | [OTHER] | Attempt 2038: Error rate 46.58% (target: 15%) -2025-09-15T14:20:40.705Z | [OTHER] | Attempt 2039: Error rate 54.26% (target: 15%) -2025-09-15T14:20:40.708Z | [OTHER] | Attempt 2040: Error rate 49.55% (target: 15%) -2025-09-15T14:20:40.710Z | [OTHER] | Attempt 2041: Error rate 52.9% (target: 15%) -2025-09-15T14:20:40.713Z | [OTHER] | Attempt 2042: Error rate 60.23% (target: 15%) -2025-09-15T14:20:40.716Z | [OTHER] | Attempt 2043: Error rate 47.56% (target: 15%) -2025-09-15T14:20:40.718Z | [OTHER] | Attempt 2044: Error rate 54.35% (target: 15%) -2025-09-15T14:20:40.721Z | [OTHER] | Attempt 2045: Error rate 53.33% (target: 15%) -2025-09-15T14:20:40.724Z | [OTHER] | Attempt 2046: Error rate 57.32% (target: 15%) -2025-09-15T14:20:40.726Z | [OTHER] | Attempt 2047: Error rate 50.35% (target: 15%) -2025-09-15T14:20:40.729Z | [OTHER] | Attempt 2048: Error rate 50.38% (target: 15%) -2025-09-15T14:20:40.731Z | [OTHER] | Attempt 2049: Error rate 60.47% (target: 15%) -2025-09-15T14:20:40.734Z | [OTHER] | Attempt 2050: Error rate 54.44% (target: 15%) -2025-09-15T14:20:40.737Z | [OTHER] | Attempt 2051: Error rate 55.28% (target: 15%) -2025-09-15T14:20:40.739Z | [OTHER] | Attempt 2052: Error rate 50.72% (target: 15%) -2025-09-15T14:20:40.742Z | [OTHER] | Attempt 2053: Error rate 54.26% (target: 15%) -2025-09-15T14:20:40.744Z | [OTHER] | Attempt 2054: Error rate 52.03% (target: 15%) -2025-09-15T14:20:40.747Z | [OTHER] | Attempt 2055: Error rate 56.74% (target: 15%) -2025-09-15T14:20:40.749Z | [OTHER] | Attempt 2056: Error rate 45.14% (target: 15%) -2025-09-15T14:20:40.752Z | [OTHER] | Attempt 2057: Error rate 52.9% (target: 15%) -2025-09-15T14:20:40.755Z | [OTHER] | Attempt 2058: Error rate 56.3% (target: 15%) -2025-09-15T14:20:40.757Z | [OTHER] | Attempt 2059: Error rate 47.78% (target: 15%) -2025-09-15T14:20:40.760Z | [OTHER] | Attempt 2060: Error rate 51.89% (target: 15%) -2025-09-15T14:20:40.762Z | [OTHER] | Attempt 2061: Error rate 58.14% (target: 15%) -2025-09-15T14:20:40.765Z | [OTHER] | Attempt 2062: Error rate 56.52% (target: 15%) -2025-09-15T14:20:40.767Z | [OTHER] | Attempt 2063: Error rate 56.38% (target: 15%) -2025-09-15T14:20:40.770Z | [OTHER] | Attempt 2064: Error rate 51.94% (target: 15%) -2025-09-15T14:20:40.773Z | [OTHER] | Attempt 2065: Error rate 61.11% (target: 15%) -2025-09-15T14:20:40.775Z | [OTHER] | Attempt 2066: Error rate 57.78% (target: 15%) -2025-09-15T14:20:40.778Z | [OTHER] | Attempt 2067: Error rate 59.42% (target: 15%) -2025-09-15T14:20:40.781Z | [OTHER] | Attempt 2068: Error rate 39.13% (target: 15%) -2025-09-15T14:20:40.784Z | [OTHER] | Attempt 2069: Error rate 50.36% (target: 15%) -2025-09-15T14:20:40.789Z | [OTHER] | Attempt 2070: Error rate 51.09% (target: 15%) -2025-09-15T14:20:40.792Z | [OTHER] | Attempt 2071: Error rate 45.93% (target: 15%) -2025-09-15T14:20:40.795Z | [OTHER] | Attempt 2072: Error rate 51.45% (target: 15%) -2025-09-15T14:20:40.798Z | [OTHER] | Attempt 2073: Error rate 51.67% (target: 15%) -2025-09-15T14:20:40.800Z | [OTHER] | Attempt 2074: Error rate 57.45% (target: 15%) -2025-09-15T14:20:40.805Z | [OTHER] | Attempt 2075: Error rate 57.48% (target: 15%) -2025-09-15T14:20:40.806Z | [OTHER] | Attempt 2076: Error rate 52.78% (target: 15%) -2025-09-15T14:20:40.809Z | [OTHER] | Attempt 2077: Error rate 49.21% (target: 15%) -2025-09-15T14:20:40.812Z | [OTHER] | Attempt 2078: Error rate 54.67% (target: 15%) -2025-09-15T14:20:40.815Z | [OTHER] | Attempt 2079: Error rate 50.4% (target: 15%) -2025-09-15T14:20:40.817Z | [OTHER] | Attempt 2080: Error rate 49.63% (target: 15%) -2025-09-15T14:20:40.820Z | [OTHER] | Attempt 2081: Error rate 59.13% (target: 15%) -2025-09-15T14:20:40.823Z | [OTHER] | Attempt 2082: Error rate 47.1% (target: 15%) -2025-09-15T14:20:40.825Z | [OTHER] | Attempt 2083: Error rate 53.74% (target: 15%) -2025-09-15T14:20:40.828Z | [OTHER] | Attempt 2084: Error rate 56.52% (target: 15%) -2025-09-15T14:20:40.831Z | [OTHER] | Attempt 2085: Error rate 55.3% (target: 15%) -2025-09-15T14:20:40.834Z | [OTHER] | Attempt 2086: Error rate 54.76% (target: 15%) -2025-09-15T14:20:40.836Z | [OTHER] | Attempt 2087: Error rate 60.85% (target: 15%) -2025-09-15T14:20:40.839Z | [OTHER] | Attempt 2088: Error rate 48.29% (target: 15%) -2025-09-15T14:20:40.842Z | [OTHER] | Attempt 2089: Error rate 55.04% (target: 15%) -2025-09-15T14:20:40.844Z | [OTHER] | Attempt 2090: Error rate 46.51% (target: 15%) -2025-09-15T14:20:40.847Z | [OTHER] | Attempt 2091: Error rate 51.48% (target: 15%) -2025-09-15T14:20:40.849Z | [OTHER] | Attempt 2092: Error rate 45.83% (target: 15%) -2025-09-15T14:20:40.852Z | [OTHER] | Attempt 2093: Error rate 56.1% (target: 15%) -2025-09-15T14:20:40.855Z | [OTHER] | Attempt 2094: Error rate 50% (target: 15%) -2025-09-15T14:20:40.857Z | [OTHER] | Attempt 2095: Error rate 53.66% (target: 15%) -2025-09-15T14:20:40.860Z | [OTHER] | Attempt 2096: Error rate 60.71% (target: 15%) -2025-09-15T14:20:40.863Z | [OTHER] | Attempt 2097: Error rate 53.33% (target: 15%) -2025-09-15T14:20:40.865Z | [OTHER] | Attempt 2098: Error rate 50.37% (target: 15%) -2025-09-15T14:20:40.868Z | [OTHER] | Attempt 2099: Error rate 44.31% (target: 15%) -2025-09-15T14:20:40.871Z | [OTHER] | Attempt 2100: Error rate 55.43% (target: 15%) -2025-09-15T14:20:40.873Z | [OTHER] | Attempt 2101: Error rate 52.38% (target: 15%) -2025-09-15T14:20:40.876Z | [OTHER] | Attempt 2102: Error rate 50.78% (target: 15%) -2025-09-15T14:20:40.879Z | [OTHER] | Attempt 2103: Error rate 51.14% (target: 15%) -2025-09-15T14:20:40.882Z | [OTHER] | Attempt 2104: Error rate 56.5% (target: 15%) -2025-09-15T14:20:40.884Z | [OTHER] | Attempt 2105: Error rate 47.73% (target: 15%) -2025-09-15T14:20:40.887Z | [OTHER] | Attempt 2106: Error rate 51.48% (target: 15%) -2025-09-15T14:20:40.890Z | [OTHER] | Attempt 2107: Error rate 47.67% (target: 15%) -2025-09-15T14:20:40.892Z | [OTHER] | Attempt 2108: Error rate 59.57% (target: 15%) -2025-09-15T14:20:40.895Z | [OTHER] | Attempt 2109: Error rate 53.41% (target: 15%) -2025-09-15T14:20:40.897Z | [OTHER] | Attempt 2110: Error rate 56.38% (target: 15%) -2025-09-15T14:20:40.900Z | [OTHER] | Attempt 2111: Error rate 48.04% (target: 15%) -2025-09-15T14:20:40.903Z | [OTHER] | Attempt 2112: Error rate 53.97% (target: 15%) -2025-09-15T14:20:40.906Z | [OTHER] | Attempt 2113: Error rate 45.56% (target: 15%) -2025-09-15T14:20:40.908Z | [OTHER] | Attempt 2114: Error rate 47.73% (target: 15%) -2025-09-15T14:20:40.911Z | [OTHER] | Attempt 2115: Error rate 53.03% (target: 15%) -2025-09-15T14:20:40.914Z | [OTHER] | Attempt 2116: Error rate 54.07% (target: 15%) -2025-09-15T14:20:40.918Z | [OTHER] | Attempt 2117: Error rate 43.42% (target: 15%) -2025-09-15T14:20:40.920Z | [OTHER] | Attempt 2118: Error rate 53.7% (target: 15%) -2025-09-15T14:20:40.922Z | [OTHER] | Attempt 2119: Error rate 55.68% (target: 15%) -2025-09-15T14:20:40.925Z | [OTHER] | Attempt 2120: Error rate 50.71% (target: 15%) -2025-09-15T14:20:40.928Z | [OTHER] | Attempt 2121: Error rate 55.3% (target: 15%) -2025-09-15T14:20:40.931Z | [OTHER] | Attempt 2122: Error rate 57.78% (target: 15%) -2025-09-15T14:20:40.933Z | [OTHER] | Attempt 2123: Error rate 53.03% (target: 15%) -2025-09-15T14:20:40.936Z | [OTHER] | Attempt 2124: Error rate 43.94% (target: 15%) -2025-09-15T14:20:40.939Z | [OTHER] | Attempt 2125: Error rate 51.55% (target: 15%) -2025-09-15T14:20:40.941Z | [OTHER] | Attempt 2126: Error rate 44.93% (target: 15%) -2025-09-15T14:20:40.944Z | [OTHER] | Attempt 2127: Error rate 55.44% (target: 15%) -2025-09-15T14:20:40.946Z | [OTHER] | Attempt 2128: Error rate 48.26% (target: 15%) -2025-09-15T14:20:40.949Z | [OTHER] | Attempt 2129: Error rate 51.11% (target: 15%) -2025-09-15T14:20:40.951Z | [OTHER] | Attempt 2130: Error rate 45.63% (target: 15%) -2025-09-15T14:20:40.954Z | [OTHER] | Attempt 2131: Error rate 45% (target: 15%) -2025-09-15T14:20:40.957Z | [OTHER] | Attempt 2132: Error rate 58.91% (target: 15%) -2025-09-15T14:20:40.960Z | [OTHER] | Attempt 2133: Error rate 56.88% (target: 15%) -2025-09-15T14:20:40.963Z | [OTHER] | Attempt 2134: Error rate 58.33% (target: 15%) -2025-09-15T14:20:40.966Z | [OTHER] | Attempt 2135: Error rate 55.93% (target: 15%) -2025-09-15T14:20:40.969Z | [OTHER] | Attempt 2136: Error rate 52.65% (target: 15%) -2025-09-15T14:20:40.972Z | [OTHER] | Attempt 2137: Error rate 52.65% (target: 15%) -2025-09-15T14:20:40.975Z | [OTHER] | Attempt 2138: Error rate 49.65% (target: 15%) -2025-09-15T14:20:40.977Z | [OTHER] | Attempt 2139: Error rate 45.61% (target: 15%) -2025-09-15T14:20:40.980Z | [OTHER] | Attempt 2140: Error rate 54.88% (target: 15%) -2025-09-15T14:20:40.983Z | [OTHER] | Attempt 2141: Error rate 57.94% (target: 15%) -2025-09-15T14:20:40.986Z | [OTHER] | Attempt 2142: Error rate 44.33% (target: 15%) -2025-09-15T14:20:40.989Z | [OTHER] | Attempt 2143: Error rate 57.5% (target: 15%) -2025-09-15T14:20:40.991Z | [OTHER] | Attempt 2144: Error rate 53.26% (target: 15%) -2025-09-15T14:20:40.994Z | [OTHER] | Attempt 2145: Error rate 55.3% (target: 15%) -2025-09-15T14:20:40.997Z | [OTHER] | Attempt 2146: Error rate 52.27% (target: 15%) -2025-09-15T14:20:40.999Z | [OTHER] | Attempt 2147: Error rate 49.62% (target: 15%) -2025-09-15T14:20:41.002Z | [OTHER] | Attempt 2148: Error rate 56.98% (target: 15%) -2025-09-15T14:20:41.005Z | [OTHER] | Attempt 2149: Error rate 57.97% (target: 15%) -2025-09-15T14:20:41.007Z | [OTHER] | Attempt 2150: Error rate 53.42% (target: 15%) -2025-09-15T14:20:41.010Z | [OTHER] | Attempt 2151: Error rate 46.9% (target: 15%) -2025-09-15T14:20:41.012Z | [OTHER] | Attempt 2152: Error rate 60.98% (target: 15%) -2025-09-15T14:20:41.016Z | [OTHER] | Attempt 2153: Error rate 49.28% (target: 15%) -2025-09-15T14:20:41.018Z | [OTHER] | Attempt 2154: Error rate 55.3% (target: 15%) -2025-09-15T14:20:41.022Z | [OTHER] | Attempt 2155: Error rate 54.65% (target: 15%) -2025-09-15T14:20:41.024Z | [OTHER] | Attempt 2156: Error rate 51.48% (target: 15%) -2025-09-15T14:20:41.027Z | [OTHER] | Attempt 2157: Error rate 52.27% (target: 15%) -2025-09-15T14:20:41.029Z | [OTHER] | Attempt 2158: Error rate 51.42% (target: 15%) -2025-09-15T14:20:41.033Z | [OTHER] | Attempt 2159: Error rate 52.59% (target: 15%) -2025-09-15T14:20:41.035Z | [OTHER] | Attempt 2160: Error rate 50.76% (target: 15%) -2025-09-15T14:20:41.038Z | [OTHER] | Attempt 2161: Error rate 52.71% (target: 15%) -2025-09-15T14:20:41.041Z | [OTHER] | Attempt 2162: Error rate 51.81% (target: 15%) -2025-09-15T14:20:41.043Z | [OTHER] | Attempt 2163: Error rate 54.07% (target: 15%) -2025-09-15T14:20:41.046Z | [OTHER] | Attempt 2164: Error rate 47.08% (target: 15%) -2025-09-15T14:20:41.050Z | [OTHER] | Attempt 2165: Error rate 57.61% (target: 15%) -2025-09-15T14:20:41.054Z | [OTHER] | Attempt 2166: Error rate 48.89% (target: 15%) -2025-09-15T14:20:41.056Z | [OTHER] | Attempt 2167: Error rate 58.89% (target: 15%) -2025-09-15T14:20:41.059Z | [OTHER] | Attempt 2168: Error rate 56.67% (target: 15%) -2025-09-15T14:20:41.062Z | [OTHER] | Attempt 2169: Error rate 48.91% (target: 15%) -2025-09-15T14:20:41.065Z | [OTHER] | Attempt 2170: Error rate 54.61% (target: 15%) -2025-09-15T14:20:41.067Z | [OTHER] | Attempt 2171: Error rate 53.55% (target: 15%) -2025-09-15T14:20:41.070Z | [OTHER] | Attempt 2172: Error rate 44.81% (target: 15%) -2025-09-15T14:20:41.073Z | [OTHER] | Attempt 2173: Error rate 47.22% (target: 15%) -2025-09-15T14:20:41.076Z | [OTHER] | Attempt 2174: Error rate 54.76% (target: 15%) -2025-09-15T14:20:41.079Z | [OTHER] | Attempt 2175: Error rate 52.71% (target: 15%) -2025-09-15T14:20:41.081Z | [OTHER] | Attempt 2176: Error rate 50% (target: 15%) -2025-09-15T14:20:41.084Z | [OTHER] | Attempt 2177: Error rate 61.48% (target: 15%) -2025-09-15T14:20:41.086Z | [OTHER] | Attempt 2178: Error rate 52.54% (target: 15%) -2025-09-15T14:20:41.090Z | [OTHER] | Attempt 2179: Error rate 56.75% (target: 15%) -2025-09-15T14:20:41.092Z | [OTHER] | Attempt 2180: Error rate 44.32% (target: 15%) -2025-09-15T14:20:41.095Z | [OTHER] | Attempt 2181: Error rate 56.06% (target: 15%) -2025-09-15T14:20:41.098Z | [OTHER] | Attempt 2182: Error rate 53.13% (target: 15%) -2025-09-15T14:20:41.101Z | [OTHER] | Attempt 2183: Error rate 52.78% (target: 15%) -2025-09-15T14:20:41.104Z | [OTHER] | Attempt 2184: Error rate 58.33% (target: 15%) -2025-09-15T14:20:41.107Z | [OTHER] | Attempt 2185: Error rate 55.04% (target: 15%) -2025-09-15T14:20:41.109Z | [OTHER] | Attempt 2186: Error rate 50.33% (target: 15%) -2025-09-15T14:20:41.112Z | [OTHER] | Attempt 2187: Error rate 47.62% (target: 15%) -2025-09-15T14:20:41.115Z | [OTHER] | Attempt 2188: Error rate 51.71% (target: 15%) -2025-09-15T14:20:41.118Z | [OTHER] | Attempt 2189: Error rate 56.38% (target: 15%) -2025-09-15T14:20:41.120Z | [OTHER] | Attempt 2190: Error rate 49.58% (target: 15%) -2025-09-15T14:20:41.124Z | [OTHER] | Attempt 2191: Error rate 58.7% (target: 15%) -2025-09-15T14:20:41.127Z | [OTHER] | Attempt 2192: Error rate 44.68% (target: 15%) -2025-09-15T14:20:41.130Z | [OTHER] | Attempt 2193: Error rate 54.44% (target: 15%) -2025-09-15T14:20:41.133Z | [OTHER] | Attempt 2194: Error rate 47.83% (target: 15%) -2025-09-15T14:20:41.135Z | [OTHER] | Attempt 2195: Error rate 51.19% (target: 15%) -2025-09-15T14:20:41.138Z | [OTHER] | Attempt 2196: Error rate 50.36% (target: 15%) -2025-09-15T14:20:41.141Z | [OTHER] | Attempt 2197: Error rate 60% (target: 15%) -2025-09-15T14:20:41.144Z | [OTHER] | Attempt 2198: Error rate 56.59% (target: 15%) -2025-09-15T14:20:41.146Z | [OTHER] | Attempt 2199: Error rate 46.97% (target: 15%) -2025-09-15T14:20:41.150Z | [OTHER] | Attempt 2200: Error rate 51.94% (target: 15%) -2025-09-15T14:20:41.152Z | [OTHER] | Attempt 2201: Error rate 54.61% (target: 15%) -2025-09-15T14:20:41.154Z | [OTHER] | Attempt 2202: Error rate 47.97% (target: 15%) -2025-09-15T14:20:41.157Z | [OTHER] | Attempt 2203: Error rate 53.47% (target: 15%) -2025-09-15T14:20:41.160Z | [OTHER] | Attempt 2204: Error rate 51.48% (target: 15%) -2025-09-15T14:20:41.163Z | [OTHER] | Attempt 2205: Error rate 51.06% (target: 15%) -2025-09-15T14:20:41.165Z | [OTHER] | Attempt 2206: Error rate 47.56% (target: 15%) -2025-09-15T14:20:41.168Z | [OTHER] | Attempt 2207: Error rate 47.92% (target: 15%) -2025-09-15T14:20:41.171Z | [OTHER] | Attempt 2208: Error rate 53.17% (target: 15%) -2025-09-15T14:20:41.174Z | [OTHER] | Attempt 2209: Error rate 53.57% (target: 15%) -2025-09-15T14:20:41.176Z | [OTHER] | Attempt 2210: Error rate 50.38% (target: 15%) -2025-09-15T14:20:41.179Z | [OTHER] | Attempt 2211: Error rate 46.26% (target: 15%) -2025-09-15T14:20:41.182Z | [OTHER] | Attempt 2212: Error rate 57.8% (target: 15%) -2025-09-15T14:20:41.185Z | [OTHER] | Attempt 2213: Error rate 55.56% (target: 15%) -2025-09-15T14:20:41.188Z | [OTHER] | Attempt 2214: Error rate 51.14% (target: 15%) -2025-09-15T14:20:41.190Z | [OTHER] | Attempt 2215: Error rate 50.76% (target: 15%) -2025-09-15T14:20:41.193Z | [OTHER] | Attempt 2216: Error rate 57.75% (target: 15%) -2025-09-15T14:20:41.196Z | [OTHER] | Attempt 2217: Error rate 52.71% (target: 15%) -2025-09-15T14:20:41.199Z | [OTHER] | Attempt 2218: Error rate 62.39% (target: 15%) -2025-09-15T14:20:41.202Z | [OTHER] | Attempt 2219: Error rate 55.3% (target: 15%) -2025-09-15T14:20:41.205Z | [OTHER] | Attempt 2220: Error rate 49.17% (target: 15%) -2025-09-15T14:20:41.208Z | [OTHER] | Attempt 2221: Error rate 46.59% (target: 15%) -2025-09-15T14:20:41.211Z | [OTHER] | Attempt 2222: Error rate 44.05% (target: 15%) -2025-09-15T14:20:41.214Z | [OTHER] | Attempt 2223: Error rate 48.15% (target: 15%) -2025-09-15T14:20:41.216Z | [OTHER] | Attempt 2224: Error rate 53.17% (target: 15%) -2025-09-15T14:20:41.219Z | [OTHER] | Attempt 2225: Error rate 58.11% (target: 15%) -2025-09-15T14:20:41.222Z | [OTHER] | Attempt 2226: Error rate 52.67% (target: 15%) -2025-09-15T14:20:41.225Z | [OTHER] | Attempt 2227: Error rate 46.59% (target: 15%) -2025-09-15T14:20:41.228Z | [OTHER] | Attempt 2228: Error rate 56.44% (target: 15%) -2025-09-15T14:20:41.231Z | [OTHER] | Attempt 2229: Error rate 53.49% (target: 15%) -2025-09-15T14:20:41.233Z | [OTHER] | Attempt 2230: Error rate 52.85% (target: 15%) -2025-09-15T14:20:41.236Z | [OTHER] | Attempt 2231: Error rate 52.38% (target: 15%) -2025-09-15T14:20:41.239Z | [OTHER] | Attempt 2232: Error rate 54.17% (target: 15%) -2025-09-15T14:20:41.241Z | [OTHER] | Attempt 2233: Error rate 52.03% (target: 15%) -2025-09-15T14:20:41.244Z | [OTHER] | Attempt 2234: Error rate 52.85% (target: 15%) -2025-09-15T14:20:41.247Z | [OTHER] | Attempt 2235: Error rate 53.88% (target: 15%) -2025-09-15T14:20:41.250Z | [OTHER] | Attempt 2236: Error rate 51.39% (target: 15%) -2025-09-15T14:20:41.253Z | [OTHER] | Attempt 2237: Error rate 55.68% (target: 15%) -2025-09-15T14:20:41.255Z | [OTHER] | Attempt 2238: Error rate 45.58% (target: 15%) -2025-09-15T14:20:41.258Z | [OTHER] | Attempt 2239: Error rate 54.58% (target: 15%) -2025-09-15T14:20:41.261Z | [OTHER] | Attempt 2240: Error rate 56.44% (target: 15%) -2025-09-15T14:20:41.264Z | [OTHER] | Attempt 2241: Error rate 55.56% (target: 15%) -2025-09-15T14:20:41.267Z | [OTHER] | Attempt 2242: Error rate 50.79% (target: 15%) -2025-09-15T14:20:41.269Z | [OTHER] | Attempt 2243: Error rate 50.37% (target: 15%) -2025-09-15T14:20:41.272Z | [OTHER] | Attempt 2244: Error rate 65.89% (target: 15%) -2025-09-15T14:20:41.275Z | [OTHER] | Attempt 2245: Error rate 49.22% (target: 15%) -2025-09-15T14:20:41.278Z | [OTHER] | Attempt 2246: Error rate 56.98% (target: 15%) -2025-09-15T14:20:41.280Z | [OTHER] | Attempt 2247: Error rate 53.7% (target: 15%) -2025-09-15T14:20:41.283Z | [OTHER] | Attempt 2248: Error rate 51.14% (target: 15%) -2025-09-15T14:20:41.286Z | [OTHER] | Attempt 2249: Error rate 52.54% (target: 15%) -2025-09-15T14:20:41.289Z | [OTHER] | Attempt 2250: Error rate 49.61% (target: 15%) -2025-09-15T14:20:41.291Z | [OTHER] | Attempt 2251: Error rate 50% (target: 15%) -2025-09-15T14:20:41.295Z | [OTHER] | Attempt 2252: Error rate 47.78% (target: 15%) -2025-09-15T14:20:41.298Z | [OTHER] | Attempt 2253: Error rate 50.39% (target: 15%) -2025-09-15T14:20:41.304Z | [OTHER] | Attempt 2254: Error rate 57.09% (target: 15%) -2025-09-15T14:20:41.308Z | [OTHER] | Attempt 2255: Error rate 60.85% (target: 15%) -2025-09-15T14:20:41.313Z | [OTHER] | Attempt 2256: Error rate 51.89% (target: 15%) -2025-09-15T14:20:41.316Z | [OTHER] | Attempt 2257: Error rate 51.98% (target: 15%) -2025-09-15T14:20:41.319Z | [OTHER] | Attempt 2258: Error rate 52.38% (target: 15%) -2025-09-15T14:20:41.322Z | [OTHER] | Attempt 2259: Error rate 56.59% (target: 15%) -2025-09-15T14:20:41.325Z | [OTHER] | Attempt 2260: Error rate 51.52% (target: 15%) -2025-09-15T14:20:41.327Z | [OTHER] | Attempt 2261: Error rate 51.98% (target: 15%) -2025-09-15T14:20:41.331Z | [OTHER] | Attempt 2262: Error rate 56.88% (target: 15%) -2025-09-15T14:20:41.334Z | [OTHER] | Attempt 2263: Error rate 55.68% (target: 15%) -2025-09-15T14:20:41.337Z | [OTHER] | Attempt 2264: Error rate 55.68% (target: 15%) -2025-09-15T14:20:41.340Z | [OTHER] | Attempt 2265: Error rate 55.07% (target: 15%) -2025-09-15T14:20:41.343Z | [OTHER] | Attempt 2266: Error rate 54.71% (target: 15%) -2025-09-15T14:20:41.345Z | [OTHER] | Attempt 2267: Error rate 52.78% (target: 15%) -2025-09-15T14:20:41.348Z | [OTHER] | Attempt 2268: Error rate 53.26% (target: 15%) -2025-09-15T14:20:41.352Z | [OTHER] | Attempt 2269: Error rate 51.14% (target: 15%) -2025-09-15T14:20:41.355Z | [OTHER] | Attempt 2270: Error rate 55.8% (target: 15%) -2025-09-15T14:20:41.358Z | [OTHER] | Attempt 2271: Error rate 50.93% (target: 15%) -2025-09-15T14:20:41.361Z | [OTHER] | Attempt 2272: Error rate 54.07% (target: 15%) -2025-09-15T14:20:41.364Z | [OTHER] | Attempt 2273: Error rate 48.91% (target: 15%) -2025-09-15T14:20:41.368Z | [OTHER] | Attempt 2274: Error rate 59.3% (target: 15%) -2025-09-15T14:20:41.371Z | [OTHER] | Attempt 2275: Error rate 51.59% (target: 15%) -2025-09-15T14:20:41.374Z | [OTHER] | Attempt 2276: Error rate 53.51% (target: 15%) -2025-09-15T14:20:41.377Z | [OTHER] | Attempt 2277: Error rate 47.35% (target: 15%) -2025-09-15T14:20:41.380Z | [OTHER] | Attempt 2278: Error rate 55.86% (target: 15%) -2025-09-15T14:20:41.383Z | [OTHER] | Attempt 2279: Error rate 50% (target: 15%) -2025-09-15T14:20:41.385Z | [OTHER] | Attempt 2280: Error rate 50.79% (target: 15%) -2025-09-15T14:20:41.388Z | [OTHER] | Attempt 2281: Error rate 50.36% (target: 15%) -2025-09-15T14:20:41.391Z | [OTHER] | Attempt 2282: Error rate 51.63% (target: 15%) -2025-09-15T14:20:41.394Z | [OTHER] | Attempt 2283: Error rate 50% (target: 15%) -2025-09-15T14:20:41.397Z | [OTHER] | Attempt 2284: Error rate 52.85% (target: 15%) -2025-09-15T14:20:41.400Z | [OTHER] | Attempt 2285: Error rate 56.91% (target: 15%) -2025-09-15T14:20:41.403Z | [OTHER] | Attempt 2286: Error rate 56.88% (target: 15%) -2025-09-15T14:20:41.405Z | [OTHER] | Attempt 2287: Error rate 51.02% (target: 15%) -2025-09-15T14:20:41.408Z | [OTHER] | Attempt 2288: Error rate 55.21% (target: 15%) -2025-09-15T14:20:41.411Z | [OTHER] | Attempt 2289: Error rate 55.56% (target: 15%) -2025-09-15T14:20:41.414Z | [OTHER] | Attempt 2290: Error rate 53.19% (target: 15%) -2025-09-15T14:20:41.417Z | [OTHER] | Attempt 2291: Error rate 55.1% (target: 15%) -2025-09-15T14:20:41.420Z | [OTHER] | Attempt 2292: Error rate 47.86% (target: 15%) -2025-09-15T14:20:41.423Z | [OTHER] | Attempt 2293: Error rate 51.14% (target: 15%) -2025-09-15T14:20:41.426Z | [OTHER] | Attempt 2294: Error rate 52.08% (target: 15%) -2025-09-15T14:20:41.429Z | [OTHER] | Attempt 2295: Error rate 56.44% (target: 15%) -2025-09-15T14:20:41.431Z | [OTHER] | Attempt 2296: Error rate 54.76% (target: 15%) -2025-09-15T14:20:41.434Z | [OTHER] | Attempt 2297: Error rate 47.04% (target: 15%) -2025-09-15T14:20:41.437Z | [OTHER] | Attempt 2298: Error rate 55.07% (target: 15%) -2025-09-15T14:20:41.439Z | [OTHER] | Attempt 2299: Error rate 50.36% (target: 15%) -2025-09-15T14:20:41.442Z | [OTHER] | Attempt 2300: Error rate 51.63% (target: 15%) -2025-09-15T14:20:41.445Z | [OTHER] | Attempt 2301: Error rate 52.85% (target: 15%) -2025-09-15T14:20:41.448Z | [OTHER] | Attempt 2302: Error rate 50.35% (target: 15%) -2025-09-15T14:20:41.451Z | [OTHER] | Attempt 2303: Error rate 56.44% (target: 15%) -2025-09-15T14:20:41.454Z | [OTHER] | Attempt 2304: Error rate 52.38% (target: 15%) -2025-09-15T14:20:41.457Z | [OTHER] | Attempt 2305: Error rate 50.78% (target: 15%) -2025-09-15T14:20:41.461Z | [OTHER] | Attempt 2306: Error rate 58.89% (target: 15%) -2025-09-15T14:20:41.463Z | [OTHER] | Attempt 2307: Error rate 55.13% (target: 15%) -2025-09-15T14:20:41.466Z | [OTHER] | Attempt 2308: Error rate 52.78% (target: 15%) -2025-09-15T14:20:41.469Z | [OTHER] | Attempt 2309: Error rate 48.91% (target: 15%) -2025-09-15T14:20:41.472Z | [OTHER] | Attempt 2310: Error rate 44.96% (target: 15%) -2025-09-15T14:20:41.474Z | [OTHER] | Attempt 2311: Error rate 50.35% (target: 15%) -2025-09-15T14:20:41.478Z | [OTHER] | Attempt 2312: Error rate 56.44% (target: 15%) -2025-09-15T14:20:41.480Z | [OTHER] | Attempt 2313: Error rate 55.81% (target: 15%) -2025-09-15T14:20:41.483Z | [OTHER] | Attempt 2314: Error rate 48.15% (target: 15%) -2025-09-15T14:20:41.486Z | [OTHER] | Attempt 2315: Error rate 57.75% (target: 15%) -2025-09-15T14:20:41.489Z | [OTHER] | Attempt 2316: Error rate 52.03% (target: 15%) -2025-09-15T14:20:41.491Z | [OTHER] | Attempt 2317: Error rate 58.75% (target: 15%) -2025-09-15T14:20:41.494Z | [OTHER] | Attempt 2318: Error rate 50% (target: 15%) -2025-09-15T14:20:41.497Z | [OTHER] | Attempt 2319: Error rate 46.21% (target: 15%) -2025-09-15T14:20:41.500Z | [OTHER] | Attempt 2320: Error rate 58.89% (target: 15%) -2025-09-15T14:20:41.503Z | [OTHER] | Attempt 2321: Error rate 48.52% (target: 15%) -2025-09-15T14:20:41.505Z | [OTHER] | Attempt 2322: Error rate 51.19% (target: 15%) -2025-09-15T14:20:41.508Z | [OTHER] | Attempt 2323: Error rate 48.64% (target: 15%) -2025-09-15T14:20:41.511Z | [OTHER] | Attempt 2324: Error rate 58.33% (target: 15%) -2025-09-15T14:20:41.515Z | [OTHER] | Attempt 2325: Error rate 53.49% (target: 15%) -2025-09-15T14:20:41.517Z | [OTHER] | Attempt 2326: Error rate 51.11% (target: 15%) -2025-09-15T14:20:41.520Z | [OTHER] | Attempt 2327: Error rate 59.85% (target: 15%) -2025-09-15T14:20:41.522Z | [OTHER] | Attempt 2328: Error rate 47.78% (target: 15%) -2025-09-15T14:20:41.525Z | [OTHER] | Attempt 2329: Error rate 59.57% (target: 15%) -2025-09-15T14:20:41.528Z | [OTHER] | Attempt 2330: Error rate 55% (target: 15%) -2025-09-15T14:20:41.531Z | [OTHER] | Attempt 2331: Error rate 50.81% (target: 15%) -2025-09-15T14:20:41.533Z | [OTHER] | Attempt 2332: Error rate 55.93% (target: 15%) -2025-09-15T14:20:41.537Z | [OTHER] | Attempt 2333: Error rate 48.84% (target: 15%) -2025-09-15T14:20:41.539Z | [OTHER] | Attempt 2334: Error rate 55.3% (target: 15%) -2025-09-15T14:20:41.542Z | [OTHER] | Attempt 2335: Error rate 47.29% (target: 15%) -2025-09-15T14:20:41.545Z | [OTHER] | Attempt 2336: Error rate 50.69% (target: 15%) -2025-09-15T14:20:41.548Z | [OTHER] | Attempt 2337: Error rate 54.88% (target: 15%) -2025-09-15T14:20:41.551Z | [OTHER] | Attempt 2338: Error rate 49.22% (target: 15%) -2025-09-15T14:20:41.554Z | [OTHER] | Attempt 2339: Error rate 51.16% (target: 15%) -2025-09-15T14:20:41.557Z | [OTHER] | Attempt 2340: Error rate 43.33% (target: 15%) -2025-09-15T14:20:41.560Z | [OTHER] | Attempt 2341: Error rate 54.37% (target: 15%) -2025-09-15T14:20:41.563Z | [OTHER] | Attempt 2342: Error rate 51.14% (target: 15%) -2025-09-15T14:20:41.567Z | [OTHER] | Attempt 2343: Error rate 49.61% (target: 15%) -2025-09-15T14:20:41.569Z | [OTHER] | Attempt 2344: Error rate 51.67% (target: 15%) -2025-09-15T14:20:41.573Z | [OTHER] | Attempt 2345: Error rate 51.22% (target: 15%) -2025-09-15T14:20:41.576Z | [OTHER] | Attempt 2346: Error rate 46.21% (target: 15%) -2025-09-15T14:20:41.579Z | [OTHER] | Attempt 2347: Error rate 48.06% (target: 15%) -2025-09-15T14:20:41.582Z | [OTHER] | Attempt 2348: Error rate 55.8% (target: 15%) -2025-09-15T14:20:41.585Z | [OTHER] | Attempt 2349: Error rate 53.33% (target: 15%) -2025-09-15T14:20:41.588Z | [OTHER] | Attempt 2350: Error rate 49.26% (target: 15%) -2025-09-15T14:20:41.591Z | [OTHER] | Attempt 2351: Error rate 56.12% (target: 15%) -2025-09-15T14:20:41.594Z | [OTHER] | Attempt 2352: Error rate 49.6% (target: 15%) -2025-09-15T14:20:41.597Z | [OTHER] | Attempt 2353: Error rate 57.2% (target: 15%) -2025-09-15T14:20:41.600Z | [OTHER] | Attempt 2354: Error rate 52.22% (target: 15%) -2025-09-15T14:20:41.602Z | [OTHER] | Attempt 2355: Error rate 51.16% (target: 15%) -2025-09-15T14:20:41.605Z | [OTHER] | Attempt 2356: Error rate 57.78% (target: 15%) -2025-09-15T14:20:41.608Z | [OTHER] | Attempt 2357: Error rate 48.64% (target: 15%) -2025-09-15T14:20:41.611Z | [OTHER] | Attempt 2358: Error rate 48.19% (target: 15%) -2025-09-15T14:20:41.614Z | [OTHER] | Attempt 2359: Error rate 43.97% (target: 15%) -2025-09-15T14:20:41.617Z | [OTHER] | Attempt 2360: Error rate 55.28% (target: 15%) -2025-09-15T14:20:41.619Z | [OTHER] | Attempt 2361: Error rate 56.35% (target: 15%) -2025-09-15T14:20:41.622Z | [OTHER] | Attempt 2362: Error rate 55.19% (target: 15%) -2025-09-15T14:20:41.625Z | [OTHER] | Attempt 2363: Error rate 50.76% (target: 15%) -2025-09-15T14:20:41.628Z | [OTHER] | Attempt 2364: Error rate 56.82% (target: 15%) -2025-09-15T14:20:41.631Z | [OTHER] | Attempt 2365: Error rate 44.72% (target: 15%) -2025-09-15T14:20:41.634Z | [OTHER] | Attempt 2366: Error rate 50.81% (target: 15%) -2025-09-15T14:20:41.638Z | [OTHER] | Attempt 2367: Error rate 58.89% (target: 15%) -2025-09-15T14:20:41.640Z | [OTHER] | Attempt 2368: Error rate 48.91% (target: 15%) -2025-09-15T14:20:41.643Z | [OTHER] | Attempt 2369: Error rate 54.26% (target: 15%) -2025-09-15T14:20:41.646Z | [OTHER] | Attempt 2370: Error rate 55.56% (target: 15%) -2025-09-15T14:20:41.648Z | [OTHER] | Attempt 2371: Error rate 54.44% (target: 15%) -2025-09-15T14:20:41.651Z | [OTHER] | Attempt 2372: Error rate 53.33% (target: 15%) -2025-09-15T14:20:41.654Z | [OTHER] | Attempt 2373: Error rate 48.89% (target: 15%) -2025-09-15T14:20:41.657Z | [OTHER] | Attempt 2374: Error rate 52.33% (target: 15%) -2025-09-15T14:20:41.660Z | [OTHER] | Attempt 2375: Error rate 47.92% (target: 15%) -2025-09-15T14:20:41.663Z | [OTHER] | Attempt 2376: Error rate 47.29% (target: 15%) -2025-09-15T14:20:41.666Z | [OTHER] | Attempt 2377: Error rate 55.56% (target: 15%) -2025-09-15T14:20:41.669Z | [OTHER] | Attempt 2378: Error rate 45.93% (target: 15%) -2025-09-15T14:20:41.672Z | [OTHER] | Attempt 2379: Error rate 57.58% (target: 15%) -2025-09-15T14:20:41.674Z | [OTHER] | Attempt 2380: Error rate 52.14% (target: 15%) -2025-09-15T14:20:41.677Z | [OTHER] | Attempt 2381: Error rate 55.19% (target: 15%) -2025-09-15T14:20:41.680Z | [OTHER] | Attempt 2382: Error rate 44.32% (target: 15%) -2025-09-15T14:20:41.683Z | [OTHER] | Attempt 2383: Error rate 47.73% (target: 15%) -2025-09-15T14:20:41.686Z | [OTHER] | Attempt 2384: Error rate 48.02% (target: 15%) -2025-09-15T14:20:41.689Z | [OTHER] | Attempt 2385: Error rate 48% (target: 15%) -2025-09-15T14:20:41.692Z | [OTHER] | Attempt 2386: Error rate 52.84% (target: 15%) -2025-09-15T14:20:41.694Z | [OTHER] | Attempt 2387: Error rate 43.02% (target: 15%) -2025-09-15T14:20:41.697Z | [OTHER] | Attempt 2388: Error rate 49.64% (target: 15%) -2025-09-15T14:20:41.700Z | [OTHER] | Attempt 2389: Error rate 57.75% (target: 15%) -2025-09-15T14:20:41.703Z | [OTHER] | Attempt 2390: Error rate 51.63% (target: 15%) -2025-09-15T14:20:41.706Z | [OTHER] | Attempt 2391: Error rate 46.3% (target: 15%) -2025-09-15T14:20:41.709Z | [OTHER] | Attempt 2392: Error rate 55.13% (target: 15%) -2025-09-15T14:20:41.712Z | [OTHER] | Attempt 2393: Error rate 46.53% (target: 15%) -2025-09-15T14:20:41.715Z | [OTHER] | Attempt 2394: Error rate 47.67% (target: 15%) -2025-09-15T14:20:41.717Z | [OTHER] | Attempt 2395: Error rate 58.53% (target: 15%) -2025-09-15T14:20:41.720Z | [OTHER] | Attempt 2396: Error rate 56.91% (target: 15%) -2025-09-15T14:20:41.723Z | [OTHER] | Attempt 2397: Error rate 47.1% (target: 15%) -2025-09-15T14:20:41.726Z | [OTHER] | Attempt 2398: Error rate 48.84% (target: 15%) -2025-09-15T14:20:41.729Z | [OTHER] | Attempt 2399: Error rate 52.33% (target: 15%) -2025-09-15T14:20:41.732Z | [OTHER] | Attempt 2400: Error rate 50.88% (target: 15%) -2025-09-15T14:20:41.734Z | [OTHER] | Attempt 2401: Error rate 50.35% (target: 15%) -2025-09-15T14:20:41.737Z | [OTHER] | Attempt 2402: Error rate 48.2% (target: 15%) -2025-09-15T14:20:41.740Z | [OTHER] | Attempt 2403: Error rate 58.75% (target: 15%) -2025-09-15T14:20:41.743Z | [OTHER] | Attempt 2404: Error rate 47.67% (target: 15%) -2025-09-15T14:20:41.745Z | [OTHER] | Attempt 2405: Error rate 48.94% (target: 15%) -2025-09-15T14:20:41.749Z | [OTHER] | Attempt 2406: Error rate 51.67% (target: 15%) -2025-09-15T14:20:41.751Z | [OTHER] | Attempt 2407: Error rate 44.72% (target: 15%) -2025-09-15T14:20:41.754Z | [OTHER] | Attempt 2408: Error rate 57.29% (target: 15%) -2025-09-15T14:20:41.758Z | [OTHER] | Attempt 2409: Error rate 52.48% (target: 15%) -2025-09-15T14:20:41.761Z | [OTHER] | Attempt 2410: Error rate 50.85% (target: 15%) -2025-09-15T14:20:41.763Z | [OTHER] | Attempt 2411: Error rate 50.83% (target: 15%) -2025-09-15T14:20:41.767Z | [OTHER] | Attempt 2412: Error rate 48.91% (target: 15%) -2025-09-15T14:20:41.769Z | [OTHER] | Attempt 2413: Error rate 57.41% (target: 15%) -2025-09-15T14:20:41.772Z | [OTHER] | Attempt 2414: Error rate 47.46% (target: 15%) -2025-09-15T14:20:41.775Z | [OTHER] | Attempt 2415: Error rate 46.74% (target: 15%) -2025-09-15T14:20:41.778Z | [OTHER] | Attempt 2416: Error rate 52.03% (target: 15%) -2025-09-15T14:20:41.781Z | [OTHER] | Attempt 2417: Error rate 54.76% (target: 15%) -2025-09-15T14:20:41.784Z | [OTHER] | Attempt 2418: Error rate 49.61% (target: 15%) -2025-09-15T14:20:41.787Z | [OTHER] | Attempt 2419: Error rate 44.93% (target: 15%) -2025-09-15T14:20:41.790Z | [OTHER] | Attempt 2420: Error rate 43.25% (target: 15%) -2025-09-15T14:20:41.793Z | [OTHER] | Attempt 2421: Error rate 53.03% (target: 15%) -2025-09-15T14:20:41.796Z | [OTHER] | Attempt 2422: Error rate 55.3% (target: 15%) -2025-09-15T14:20:41.800Z | [OTHER] | Attempt 2423: Error rate 53.33% (target: 15%) -2025-09-15T14:20:41.803Z | [OTHER] | Attempt 2424: Error rate 54.96% (target: 15%) -2025-09-15T14:20:41.806Z | [OTHER] | Attempt 2425: Error rate 43.48% (target: 15%) -2025-09-15T14:20:41.808Z | [OTHER] | Attempt 2426: Error rate 46.83% (target: 15%) -2025-09-15T14:20:41.812Z | [OTHER] | Attempt 2427: Error rate 50% (target: 15%) -2025-09-15T14:20:41.814Z | [OTHER] | Attempt 2428: Error rate 58.51% (target: 15%) -2025-09-15T14:20:41.817Z | [OTHER] | Attempt 2429: Error rate 55.83% (target: 15%) -2025-09-15T14:20:41.820Z | [OTHER] | Attempt 2430: Error rate 55.95% (target: 15%) -2025-09-15T14:20:41.823Z | [OTHER] | Attempt 2431: Error rate 49.6% (target: 15%) -2025-09-15T14:20:41.826Z | [OTHER] | Attempt 2432: Error rate 47.35% (target: 15%) -2025-09-15T14:20:41.829Z | [OTHER] | Attempt 2433: Error rate 54.76% (target: 15%) -2025-09-15T14:20:41.832Z | [OTHER] | Attempt 2434: Error rate 53.62% (target: 15%) -2025-09-15T14:20:41.835Z | [OTHER] | Attempt 2435: Error rate 48.58% (target: 15%) -2025-09-15T14:20:41.838Z | [OTHER] | Attempt 2436: Error rate 44.44% (target: 15%) -2025-09-15T14:20:41.841Z | [OTHER] | Attempt 2437: Error rate 57.97% (target: 15%) -2025-09-15T14:20:41.844Z | [OTHER] | Attempt 2438: Error rate 53.99% (target: 15%) -2025-09-15T14:20:41.847Z | [OTHER] | Attempt 2439: Error rate 49.59% (target: 15%) -2025-09-15T14:20:41.849Z | [OTHER] | Attempt 2440: Error rate 57.69% (target: 15%) -2025-09-15T14:20:41.853Z | [OTHER] | Attempt 2441: Error rate 54.37% (target: 15%) -2025-09-15T14:20:41.855Z | [OTHER] | Attempt 2442: Error rate 52.9% (target: 15%) -2025-09-15T14:20:41.859Z | [OTHER] | Attempt 2443: Error rate 53.47% (target: 15%) -2025-09-15T14:20:41.861Z | [OTHER] | Attempt 2444: Error rate 43.18% (target: 15%) -2025-09-15T14:20:41.864Z | [OTHER] | Attempt 2445: Error rate 55.42% (target: 15%) -2025-09-15T14:20:41.867Z | [OTHER] | Attempt 2446: Error rate 56.67% (target: 15%) -2025-09-15T14:20:41.870Z | [OTHER] | Attempt 2447: Error rate 54.26% (target: 15%) -2025-09-15T14:20:41.873Z | [OTHER] | Attempt 2448: Error rate 52.08% (target: 15%) -2025-09-15T14:20:41.875Z | [OTHER] | Attempt 2449: Error rate 58.71% (target: 15%) -2025-09-15T14:20:41.879Z | [OTHER] | Attempt 2450: Error rate 54.44% (target: 15%) -2025-09-15T14:20:41.881Z | [OTHER] | Attempt 2451: Error rate 54% (target: 15%) -2025-09-15T14:20:41.884Z | [OTHER] | Attempt 2452: Error rate 46.12% (target: 15%) -2025-09-15T14:20:41.887Z | [OTHER] | Attempt 2453: Error rate 59.69% (target: 15%) -2025-09-15T14:20:41.890Z | [OTHER] | Attempt 2454: Error rate 51.75% (target: 15%) -2025-09-15T14:20:41.893Z | [OTHER] | Attempt 2455: Error rate 50% (target: 15%) -2025-09-15T14:20:41.896Z | [OTHER] | Attempt 2456: Error rate 48.37% (target: 15%) -2025-09-15T14:20:41.899Z | [OTHER] | Attempt 2457: Error rate 49.24% (target: 15%) -2025-09-15T14:20:41.902Z | [OTHER] | Attempt 2458: Error rate 49.63% (target: 15%) -2025-09-15T14:20:41.905Z | [OTHER] | Attempt 2459: Error rate 54.17% (target: 15%) -2025-09-15T14:20:41.908Z | [OTHER] | Attempt 2460: Error rate 47.83% (target: 15%) -2025-09-15T14:20:41.911Z | [OTHER] | Attempt 2461: Error rate 53.1% (target: 15%) -2025-09-15T14:20:41.914Z | [OTHER] | Attempt 2462: Error rate 54.96% (target: 15%) -2025-09-15T14:20:41.916Z | [OTHER] | Attempt 2463: Error rate 45.83% (target: 15%) -2025-09-15T14:20:41.919Z | [OTHER] | Attempt 2464: Error rate 54.07% (target: 15%) -2025-09-15T14:20:41.922Z | [OTHER] | Attempt 2465: Error rate 46.34% (target: 15%) -2025-09-15T14:20:41.925Z | [OTHER] | Attempt 2466: Error rate 59.33% (target: 15%) -2025-09-15T14:20:41.928Z | [OTHER] | Attempt 2467: Error rate 47.62% (target: 15%) -2025-09-15T14:20:41.931Z | [OTHER] | Attempt 2468: Error rate 57.78% (target: 15%) -2025-09-15T14:20:41.934Z | [OTHER] | Attempt 2469: Error rate 56.46% (target: 15%) -2025-09-15T14:20:41.937Z | [OTHER] | Attempt 2470: Error rate 50.85% (target: 15%) -2025-09-15T14:20:41.940Z | [OTHER] | Attempt 2471: Error rate 49.29% (target: 15%) -2025-09-15T14:20:41.944Z | [OTHER] | Attempt 2472: Error rate 52.44% (target: 15%) -2025-09-15T14:20:41.946Z | [OTHER] | Attempt 2473: Error rate 50.41% (target: 15%) -2025-09-15T14:20:41.949Z | [OTHER] | Attempt 2474: Error rate 55.83% (target: 15%) -2025-09-15T14:20:41.952Z | [OTHER] | Attempt 2475: Error rate 45.04% (target: 15%) -2025-09-15T14:20:41.955Z | [OTHER] | Attempt 2476: Error rate 54.7% (target: 15%) -2025-09-15T14:20:41.958Z | [OTHER] | Attempt 2477: Error rate 52.71% (target: 15%) -2025-09-15T14:20:41.961Z | [OTHER] | Attempt 2478: Error rate 40.54% (target: 15%) -2025-09-15T14:20:41.964Z | [OTHER] | Attempt 2479: Error rate 42.36% (target: 15%) -2025-09-15T14:20:41.967Z | [OTHER] | Attempt 2480: Error rate 58.67% (target: 15%) -2025-09-15T14:20:41.970Z | [OTHER] | Attempt 2481: Error rate 55.68% (target: 15%) -2025-09-15T14:20:41.974Z | [OTHER] | Attempt 2482: Error rate 52.5% (target: 15%) -2025-09-15T14:20:41.977Z | [OTHER] | Attempt 2483: Error rate 61.48% (target: 15%) -2025-09-15T14:20:41.980Z | [OTHER] | Attempt 2484: Error rate 47.46% (target: 15%) -2025-09-15T14:20:41.982Z | [OTHER] | Attempt 2485: Error rate 46.21% (target: 15%) -2025-09-15T14:20:41.985Z | [OTHER] | Attempt 2486: Error rate 52.33% (target: 15%) -2025-09-15T14:20:41.989Z | [OTHER] | Attempt 2487: Error rate 51.94% (target: 15%) -2025-09-15T14:20:41.992Z | [OTHER] | Attempt 2488: Error rate 50% (target: 15%) -2025-09-15T14:20:41.994Z | [OTHER] | Attempt 2489: Error rate 49.58% (target: 15%) -2025-09-15T14:20:41.998Z | [OTHER] | Attempt 2490: Error rate 55.19% (target: 15%) -2025-09-15T14:20:42.000Z | [OTHER] | Attempt 2491: Error rate 59.21% (target: 15%) -2025-09-15T14:20:42.005Z | [OTHER] | Attempt 2492: Error rate 47.78% (target: 15%) -2025-09-15T14:20:42.006Z | [OTHER] | Attempt 2493: Error rate 53.25% (target: 15%) -2025-09-15T14:20:42.010Z | [OTHER] | Attempt 2494: Error rate 55.21% (target: 15%) -2025-09-15T14:20:42.013Z | [OTHER] | Attempt 2495: Error rate 49.28% (target: 15%) -2025-09-15T14:20:42.015Z | [OTHER] | Attempt 2496: Error rate 54.26% (target: 15%) -2025-09-15T14:20:42.018Z | [OTHER] | Attempt 2497: Error rate 50.38% (target: 15%) -2025-09-15T14:20:42.021Z | [OTHER] | Attempt 2498: Error rate 48.84% (target: 15%) -2025-09-15T14:20:42.024Z | [OTHER] | Attempt 2499: Error rate 48.11% (target: 15%) -2025-09-15T14:20:42.027Z | [OTHER] | Attempt 2500: Error rate 53.03% (target: 15%) -2025-09-15T14:20:42.030Z | [OTHER] | Attempt 2501: Error rate 53.88% (target: 15%) -2025-09-15T14:20:42.033Z | [OTHER] | Attempt 2502: Error rate 54.76% (target: 15%) -2025-09-15T14:20:42.036Z | [OTHER] | Attempt 2503: Error rate 54.27% (target: 15%) -2025-09-15T14:20:42.039Z | [OTHER] | Attempt 2504: Error rate 48.58% (target: 15%) -2025-09-15T14:20:42.042Z | [OTHER] | Attempt 2505: Error rate 52.78% (target: 15%) -2025-09-15T14:20:42.045Z | [OTHER] | Attempt 2506: Error rate 52.56% (target: 15%) -2025-09-15T14:20:42.048Z | [OTHER] | Attempt 2507: Error rate 46.3% (target: 15%) -2025-09-15T14:20:42.051Z | [OTHER] | Attempt 2508: Error rate 55.16% (target: 15%) -2025-09-15T14:20:42.054Z | [OTHER] | Attempt 2509: Error rate 55.04% (target: 15%) -2025-09-15T14:20:42.057Z | [OTHER] | Attempt 2510: Error rate 50% (target: 15%) -2025-09-15T14:20:42.060Z | [OTHER] | Attempt 2511: Error rate 53.47% (target: 15%) -2025-09-15T14:20:42.063Z | [OTHER] | Attempt 2512: Error rate 58.73% (target: 15%) -2025-09-15T14:20:42.066Z | [OTHER] | Attempt 2513: Error rate 55.04% (target: 15%) -2025-09-15T14:20:42.069Z | [OTHER] | Attempt 2514: Error rate 46.01% (target: 15%) -2025-09-15T14:20:42.072Z | [OTHER] | Attempt 2515: Error rate 53.33% (target: 15%) -2025-09-15T14:20:42.075Z | [OTHER] | Attempt 2516: Error rate 50.78% (target: 15%) -2025-09-15T14:20:42.078Z | [OTHER] | Attempt 2517: Error rate 49.65% (target: 15%) -2025-09-15T14:20:42.081Z | [OTHER] | Attempt 2518: Error rate 54.86% (target: 15%) -2025-09-15T14:20:42.085Z | [OTHER] | Attempt 2519: Error rate 59.78% (target: 15%) -2025-09-15T14:20:42.088Z | [OTHER] | Attempt 2520: Error rate 54.26% (target: 15%) -2025-09-15T14:20:42.091Z | [OTHER] | Attempt 2521: Error rate 51.25% (target: 15%) -2025-09-15T14:20:42.094Z | [OTHER] | Attempt 2522: Error rate 53.19% (target: 15%) -2025-09-15T14:20:42.097Z | [OTHER] | Attempt 2523: Error rate 53.97% (target: 15%) -2025-09-15T14:20:42.100Z | [OTHER] | Attempt 2524: Error rate 50.69% (target: 15%) -2025-09-15T14:20:42.103Z | [OTHER] | Attempt 2525: Error rate 53.97% (target: 15%) -2025-09-15T14:20:42.106Z | [OTHER] | Attempt 2526: Error rate 51.42% (target: 15%) -2025-09-15T14:20:42.109Z | [OTHER] | Attempt 2527: Error rate 50.37% (target: 15%) -2025-09-15T14:20:42.112Z | [OTHER] | Attempt 2528: Error rate 54.08% (target: 15%) -2025-09-15T14:20:42.115Z | [OTHER] | Attempt 2529: Error rate 58.73% (target: 15%) -2025-09-15T14:20:42.118Z | [OTHER] | Attempt 2530: Error rate 52.19% (target: 15%) -2025-09-15T14:20:42.121Z | [OTHER] | Attempt 2531: Error rate 53.97% (target: 15%) -2025-09-15T14:20:42.124Z | [OTHER] | Attempt 2532: Error rate 51.85% (target: 15%) -2025-09-15T14:20:42.127Z | [OTHER] | Attempt 2533: Error rate 52.9% (target: 15%) -2025-09-15T14:20:42.131Z | [OTHER] | Attempt 2534: Error rate 56.98% (target: 15%) -2025-09-15T14:20:42.134Z | [OTHER] | Attempt 2535: Error rate 48.45% (target: 15%) -2025-09-15T14:20:42.137Z | [OTHER] | Attempt 2536: Error rate 49.6% (target: 15%) -2025-09-15T14:20:42.140Z | [OTHER] | Attempt 2537: Error rate 62.15% (target: 15%) -2025-09-15T14:20:42.144Z | [OTHER] | Attempt 2538: Error rate 48.11% (target: 15%) -2025-09-15T14:20:42.147Z | [OTHER] | Attempt 2539: Error rate 51.48% (target: 15%) -2025-09-15T14:20:42.150Z | [OTHER] | Attempt 2540: Error rate 51.52% (target: 15%) -2025-09-15T14:20:42.153Z | [OTHER] | Attempt 2541: Error rate 45.18% (target: 15%) -2025-09-15T14:20:42.157Z | [OTHER] | Attempt 2542: Error rate 50% (target: 15%) -2025-09-15T14:20:42.160Z | [OTHER] | Attempt 2543: Error rate 48.61% (target: 15%) -2025-09-15T14:20:42.163Z | [OTHER] | Attempt 2544: Error rate 47.67% (target: 15%) -2025-09-15T14:20:42.166Z | [OTHER] | Attempt 2545: Error rate 53.49% (target: 15%) -2025-09-15T14:20:42.169Z | [OTHER] | Attempt 2546: Error rate 56.06% (target: 15%) -2025-09-15T14:20:42.173Z | [OTHER] | Attempt 2547: Error rate 54.35% (target: 15%) -2025-09-15T14:20:42.176Z | [OTHER] | Attempt 2548: Error rate 59.38% (target: 15%) -2025-09-15T14:20:42.179Z | [OTHER] | Attempt 2549: Error rate 48.48% (target: 15%) -2025-09-15T14:20:42.182Z | [OTHER] | Attempt 2550: Error rate 51.11% (target: 15%) -2025-09-15T14:20:42.185Z | [OTHER] | Attempt 2551: Error rate 54.17% (target: 15%) -2025-09-15T14:20:42.188Z | [OTHER] | Attempt 2552: Error rate 55.43% (target: 15%) -2025-09-15T14:20:42.191Z | [OTHER] | Attempt 2553: Error rate 47.29% (target: 15%) -2025-09-15T14:20:42.194Z | [OTHER] | Attempt 2554: Error rate 54.17% (target: 15%) -2025-09-15T14:20:42.197Z | [OTHER] | Attempt 2555: Error rate 49.6% (target: 15%) -2025-09-15T14:20:42.200Z | [OTHER] | Attempt 2556: Error rate 54.88% (target: 15%) -2025-09-15T14:20:42.203Z | [OTHER] | Attempt 2557: Error rate 53.49% (target: 15%) -2025-09-15T14:20:42.206Z | [OTHER] | Attempt 2558: Error rate 56.67% (target: 15%) -2025-09-15T14:20:42.209Z | [OTHER] | Attempt 2559: Error rate 59.83% (target: 15%) -2025-09-15T14:20:42.212Z | [OTHER] | Attempt 2560: Error rate 48.02% (target: 15%) -2025-09-15T14:20:42.215Z | [OTHER] | Attempt 2561: Error rate 55.95% (target: 15%) -2025-09-15T14:20:42.218Z | [OTHER] | Attempt 2562: Error rate 57.78% (target: 15%) -2025-09-15T14:20:42.222Z | [OTHER] | Attempt 2563: Error rate 59.52% (target: 15%) -2025-09-15T14:20:42.225Z | [OTHER] | Attempt 2564: Error rate 54.61% (target: 15%) -2025-09-15T14:20:42.228Z | [OTHER] | Attempt 2565: Error rate 56.98% (target: 15%) -2025-09-15T14:20:42.231Z | [OTHER] | Attempt 2566: Error rate 51.89% (target: 15%) -2025-09-15T14:20:42.234Z | [OTHER] | Attempt 2567: Error rate 55.28% (target: 15%) -2025-09-15T14:20:42.236Z | [OTHER] | Attempt 2568: Error rate 52.54% (target: 15%) -2025-09-15T14:20:42.240Z | [OTHER] | Attempt 2569: Error rate 52.65% (target: 15%) -2025-09-15T14:20:42.243Z | [OTHER] | Attempt 2570: Error rate 58.52% (target: 15%) -2025-09-15T14:20:42.246Z | [OTHER] | Attempt 2571: Error rate 55.07% (target: 15%) -2025-09-15T14:20:42.249Z | [OTHER] | Attempt 2572: Error rate 41.87% (target: 15%) -2025-09-15T14:20:42.252Z | [OTHER] | Attempt 2573: Error rate 57.97% (target: 15%) -2025-09-15T14:20:42.255Z | [OTHER] | Attempt 2574: Error rate 50% (target: 15%) -2025-09-15T14:20:42.258Z | [OTHER] | Attempt 2575: Error rate 52.84% (target: 15%) -2025-09-15T14:20:42.262Z | [OTHER] | Attempt 2576: Error rate 53.41% (target: 15%) -2025-09-15T14:20:42.264Z | [OTHER] | Attempt 2577: Error rate 58.33% (target: 15%) -2025-09-15T14:20:42.267Z | [OTHER] | Attempt 2578: Error rate 58.91% (target: 15%) -2025-09-15T14:20:42.270Z | [OTHER] | Attempt 2579: Error rate 58.75% (target: 15%) -2025-09-15T14:20:42.273Z | [OTHER] | Attempt 2580: Error rate 54.55% (target: 15%) -2025-09-15T14:20:42.276Z | [OTHER] | Attempt 2581: Error rate 55.81% (target: 15%) -2025-09-15T14:20:42.279Z | [OTHER] | Attempt 2582: Error rate 52.13% (target: 15%) -2025-09-15T14:20:42.282Z | [OTHER] | Attempt 2583: Error rate 51.55% (target: 15%) -2025-09-15T14:20:42.285Z | [OTHER] | Attempt 2584: Error rate 54.07% (target: 15%) -2025-09-15T14:20:42.288Z | [OTHER] | Attempt 2585: Error rate 48.52% (target: 15%) -2025-09-15T14:20:42.291Z | [OTHER] | Attempt 2586: Error rate 53.7% (target: 15%) -2025-09-15T14:20:42.294Z | [OTHER] | Attempt 2587: Error rate 58.53% (target: 15%) -2025-09-15T14:20:42.297Z | [OTHER] | Attempt 2588: Error rate 43.56% (target: 15%) -2025-09-15T14:20:42.301Z | [OTHER] | Attempt 2589: Error rate 48.89% (target: 15%) -2025-09-15T14:20:42.304Z | [OTHER] | Attempt 2590: Error rate 51.42% (target: 15%) -2025-09-15T14:20:42.307Z | [OTHER] | Attempt 2591: Error rate 55.3% (target: 15%) -2025-09-15T14:20:42.310Z | [OTHER] | Attempt 2592: Error rate 56.75% (target: 15%) -2025-09-15T14:20:42.314Z | [OTHER] | Attempt 2593: Error rate 50.81% (target: 15%) -2025-09-15T14:20:42.317Z | [OTHER] | Attempt 2594: Error rate 53.62% (target: 15%) -2025-09-15T14:20:42.320Z | [OTHER] | Attempt 2595: Error rate 52.59% (target: 15%) -2025-09-15T14:20:42.323Z | [OTHER] | Attempt 2596: Error rate 56.91% (target: 15%) -2025-09-15T14:20:42.326Z | [OTHER] | Attempt 2597: Error rate 51.81% (target: 15%) -2025-09-15T14:20:42.329Z | [OTHER] | Attempt 2598: Error rate 49.26% (target: 15%) -2025-09-15T14:20:42.333Z | [OTHER] | Attempt 2599: Error rate 51.16% (target: 15%) -2025-09-15T14:20:42.336Z | [OTHER] | Attempt 2600: Error rate 57.2% (target: 15%) -2025-09-15T14:20:42.339Z | [OTHER] | Attempt 2601: Error rate 53.9% (target: 15%) -2025-09-15T14:20:42.342Z | [OTHER] | Attempt 2602: Error rate 50.74% (target: 15%) -2025-09-15T14:20:42.345Z | [OTHER] | Attempt 2603: Error rate 52.08% (target: 15%) -2025-09-15T14:20:42.348Z | [OTHER] | Attempt 2604: Error rate 42.31% (target: 15%) -2025-09-15T14:20:42.351Z | [OTHER] | Attempt 2605: Error rate 54.07% (target: 15%) -2025-09-15T14:20:42.354Z | [OTHER] | Attempt 2606: Error rate 47.15% (target: 15%) -2025-09-15T14:20:42.357Z | [OTHER] | Attempt 2607: Error rate 52.44% (target: 15%) -2025-09-15T14:20:42.360Z | [OTHER] | Attempt 2608: Error rate 51.16% (target: 15%) -2025-09-15T14:20:42.363Z | [OTHER] | Attempt 2609: Error rate 52.54% (target: 15%) -2025-09-15T14:20:42.366Z | [OTHER] | Attempt 2610: Error rate 52.04% (target: 15%) -2025-09-15T14:20:42.369Z | [OTHER] | Attempt 2611: Error rate 50% (target: 15%) -2025-09-15T14:20:42.372Z | [OTHER] | Attempt 2612: Error rate 56% (target: 15%) -2025-09-15T14:20:42.375Z | [OTHER] | Attempt 2613: Error rate 59.92% (target: 15%) -2025-09-15T14:20:42.378Z | [OTHER] | Attempt 2614: Error rate 50.4% (target: 15%) -2025-09-15T14:20:42.381Z | [OTHER] | Attempt 2615: Error rate 53.1% (target: 15%) -2025-09-15T14:20:42.385Z | [OTHER] | Attempt 2616: Error rate 57.04% (target: 15%) -2025-09-15T14:20:42.389Z | [OTHER] | Attempt 2617: Error rate 49.64% (target: 15%) -2025-09-15T14:20:42.391Z | [OTHER] | Attempt 2618: Error rate 53.07% (target: 15%) -2025-09-15T14:20:42.394Z | [OTHER] | Attempt 2619: Error rate 50% (target: 15%) -2025-09-15T14:20:42.398Z | [OTHER] | Attempt 2620: Error rate 52.85% (target: 15%) -2025-09-15T14:20:42.401Z | [OTHER] | Attempt 2621: Error rate 55.56% (target: 15%) -2025-09-15T14:20:42.404Z | [OTHER] | Attempt 2622: Error rate 56.52% (target: 15%) -2025-09-15T14:20:42.407Z | [OTHER] | Attempt 2623: Error rate 47.46% (target: 15%) -2025-09-15T14:20:42.410Z | [OTHER] | Attempt 2624: Error rate 62.4% (target: 15%) -2025-09-15T14:20:42.413Z | [OTHER] | Attempt 2625: Error rate 53.42% (target: 15%) -2025-09-15T14:20:42.417Z | [OTHER] | Attempt 2626: Error rate 55.67% (target: 15%) -2025-09-15T14:20:42.420Z | [OTHER] | Attempt 2627: Error rate 50.85% (target: 15%) -2025-09-15T14:20:42.423Z | [OTHER] | Attempt 2628: Error rate 59.17% (target: 15%) -2025-09-15T14:20:42.426Z | [OTHER] | Attempt 2629: Error rate 51.98% (target: 15%) -2025-09-15T14:20:42.429Z | [OTHER] | Attempt 2630: Error rate 51.39% (target: 15%) -2025-09-15T14:20:42.432Z | [OTHER] | Attempt 2631: Error rate 53.03% (target: 15%) -2025-09-15T14:20:42.435Z | [OTHER] | Attempt 2632: Error rate 53.82% (target: 15%) -2025-09-15T14:20:42.438Z | [OTHER] | Attempt 2633: Error rate 55.19% (target: 15%) -2025-09-15T14:20:42.442Z | [OTHER] | Attempt 2634: Error rate 45.08% (target: 15%) -2025-09-15T14:20:42.445Z | [OTHER] | Attempt 2635: Error rate 45.45% (target: 15%) -2025-09-15T14:20:42.448Z | [OTHER] | Attempt 2636: Error rate 57.2% (target: 15%) -2025-09-15T14:20:42.451Z | [OTHER] | Attempt 2637: Error rate 53.26% (target: 15%) -2025-09-15T14:20:42.454Z | [OTHER] | Attempt 2638: Error rate 50.81% (target: 15%) -2025-09-15T14:20:42.457Z | [OTHER] | Attempt 2639: Error rate 58.53% (target: 15%) -2025-09-15T14:20:42.460Z | [OTHER] | Attempt 2640: Error rate 56.67% (target: 15%) -2025-09-15T14:20:42.463Z | [OTHER] | Attempt 2641: Error rate 55.68% (target: 15%) -2025-09-15T14:20:42.467Z | [OTHER] | Attempt 2642: Error rate 50.4% (target: 15%) -2025-09-15T14:20:42.472Z | [OTHER] | Attempt 2643: Error rate 50.78% (target: 15%) -2025-09-15T14:20:42.476Z | [OTHER] | Attempt 2644: Error rate 50.69% (target: 15%) -2025-09-15T14:20:42.479Z | [OTHER] | Attempt 2645: Error rate 57.09% (target: 15%) -2025-09-15T14:20:42.482Z | [OTHER] | Attempt 2646: Error rate 58.33% (target: 15%) -2025-09-15T14:20:42.486Z | [OTHER] | Attempt 2647: Error rate 46.38% (target: 15%) -2025-09-15T14:20:42.489Z | [OTHER] | Attempt 2648: Error rate 52.84% (target: 15%) -2025-09-15T14:20:42.492Z | [OTHER] | Attempt 2649: Error rate 47.04% (target: 15%) -2025-09-15T14:20:42.496Z | [OTHER] | Attempt 2650: Error rate 42.42% (target: 15%) -2025-09-15T14:20:42.499Z | [OTHER] | Attempt 2651: Error rate 48.3% (target: 15%) -2025-09-15T14:20:42.503Z | [OTHER] | Attempt 2652: Error rate 53.97% (target: 15%) -2025-09-15T14:20:42.506Z | [OTHER] | Attempt 2653: Error rate 52.38% (target: 15%) -2025-09-15T14:20:42.509Z | [OTHER] | Attempt 2654: Error rate 49.64% (target: 15%) -2025-09-15T14:20:42.512Z | [OTHER] | Attempt 2655: Error rate 48.78% (target: 15%) -2025-09-15T14:20:42.515Z | [OTHER] | Attempt 2656: Error rate 56.52% (target: 15%) -2025-09-15T14:20:42.519Z | [OTHER] | Attempt 2657: Error rate 49.58% (target: 15%) -2025-09-15T14:20:42.522Z | [OTHER] | Attempt 2658: Error rate 46.43% (target: 15%) -2025-09-15T14:20:42.526Z | [OTHER] | Attempt 2659: Error rate 51.85% (target: 15%) -2025-09-15T14:20:42.528Z | [OTHER] | Attempt 2660: Error rate 53.88% (target: 15%) -2025-09-15T14:20:42.531Z | [OTHER] | Attempt 2661: Error rate 53.03% (target: 15%) -2025-09-15T14:20:42.534Z | [OTHER] | Attempt 2662: Error rate 50.39% (target: 15%) -2025-09-15T14:20:42.537Z | [OTHER] | Attempt 2663: Error rate 49.63% (target: 15%) -2025-09-15T14:20:42.540Z | [OTHER] | Attempt 2664: Error rate 54.35% (target: 15%) -2025-09-15T14:20:42.544Z | [OTHER] | Attempt 2665: Error rate 55.3% (target: 15%) -2025-09-15T14:20:42.547Z | [OTHER] | Attempt 2666: Error rate 50.37% (target: 15%) -2025-09-15T14:20:42.550Z | [OTHER] | Attempt 2667: Error rate 51.28% (target: 15%) -2025-09-15T14:20:42.555Z | [OTHER] | Attempt 2668: Error rate 47.81% (target: 15%) -2025-09-15T14:20:42.558Z | [OTHER] | Attempt 2669: Error rate 45.65% (target: 15%) -2025-09-15T14:20:42.561Z | [OTHER] | Attempt 2670: Error rate 53.49% (target: 15%) -2025-09-15T14:20:42.564Z | [OTHER] | Attempt 2671: Error rate 52.5% (target: 15%) -2025-09-15T14:20:42.568Z | [OTHER] | Attempt 2672: Error rate 53.41% (target: 15%) -2025-09-15T14:20:42.571Z | [OTHER] | Attempt 2673: Error rate 53.7% (target: 15%) -2025-09-15T14:20:42.574Z | [OTHER] | Attempt 2674: Error rate 47.41% (target: 15%) -2025-09-15T14:20:42.577Z | [OTHER] | Attempt 2675: Error rate 58.75% (target: 15%) -2025-09-15T14:20:42.581Z | [OTHER] | Attempt 2676: Error rate 50.81% (target: 15%) -2025-09-15T14:20:42.584Z | [OTHER] | Attempt 2677: Error rate 47.1% (target: 15%) -2025-09-15T14:20:42.587Z | [OTHER] | Attempt 2678: Error rate 48.15% (target: 15%) -2025-09-15T14:20:42.590Z | [OTHER] | Attempt 2679: Error rate 48.61% (target: 15%) -2025-09-15T14:20:42.594Z | [OTHER] | Attempt 2680: Error rate 48.23% (target: 15%) -2025-09-15T14:20:42.598Z | [OTHER] | Attempt 2681: Error rate 48.29% (target: 15%) -2025-09-15T14:20:42.601Z | [OTHER] | Attempt 2682: Error rate 46.97% (target: 15%) -2025-09-15T14:20:42.604Z | [OTHER] | Attempt 2683: Error rate 45.56% (target: 15%) -2025-09-15T14:20:42.607Z | [OTHER] | Attempt 2684: Error rate 45.56% (target: 15%) -2025-09-15T14:20:42.611Z | [OTHER] | Attempt 2685: Error rate 53.19% (target: 15%) -2025-09-15T14:20:42.614Z | [OTHER] | Attempt 2686: Error rate 53.75% (target: 15%) -2025-09-15T14:20:42.617Z | [OTHER] | Attempt 2687: Error rate 52.71% (target: 15%) -2025-09-15T14:20:42.621Z | [OTHER] | Attempt 2688: Error rate 53.7% (target: 15%) -2025-09-15T14:20:42.624Z | [OTHER] | Attempt 2689: Error rate 49.21% (target: 15%) -2025-09-15T14:20:42.627Z | [OTHER] | Attempt 2690: Error rate 50.4% (target: 15%) -2025-09-15T14:20:42.631Z | [OTHER] | Attempt 2691: Error rate 50% (target: 15%) -2025-09-15T14:20:42.634Z | [OTHER] | Attempt 2692: Error rate 57.36% (target: 15%) -2025-09-15T14:20:42.637Z | [OTHER] | Attempt 2693: Error rate 51.52% (target: 15%) -2025-09-15T14:20:42.640Z | [OTHER] | Attempt 2694: Error rate 50.83% (target: 15%) -2025-09-15T14:20:42.643Z | [OTHER] | Attempt 2695: Error rate 53.41% (target: 15%) -2025-09-15T14:20:42.646Z | [OTHER] | Attempt 2696: Error rate 53.95% (target: 15%) -2025-09-15T14:20:42.649Z | [OTHER] | Attempt 2697: Error rate 50.42% (target: 15%) -2025-09-15T14:20:42.652Z | [OTHER] | Attempt 2698: Error rate 54.96% (target: 15%) -2025-09-15T14:20:42.655Z | [OTHER] | Attempt 2699: Error rate 42.06% (target: 15%) -2025-09-15T14:20:42.658Z | [OTHER] | Attempt 2700: Error rate 52.13% (target: 15%) -2025-09-15T14:20:42.662Z | [OTHER] | Attempt 2701: Error rate 48.52% (target: 15%) -2025-09-15T14:20:42.665Z | [OTHER] | Attempt 2702: Error rate 54.96% (target: 15%) -2025-09-15T14:20:42.668Z | [OTHER] | Attempt 2703: Error rate 52.65% (target: 15%) -2025-09-15T14:20:42.672Z | [OTHER] | Attempt 2704: Error rate 57.36% (target: 15%) -2025-09-15T14:20:42.675Z | [OTHER] | Attempt 2705: Error rate 59.57% (target: 15%) -2025-09-15T14:20:42.678Z | [OTHER] | Attempt 2706: Error rate 58.91% (target: 15%) -2025-09-15T14:20:42.681Z | [OTHER] | Attempt 2707: Error rate 47.22% (target: 15%) -2025-09-15T14:20:42.684Z | [OTHER] | Attempt 2708: Error rate 55.43% (target: 15%) -2025-09-15T14:20:42.687Z | [OTHER] | Attempt 2709: Error rate 47.16% (target: 15%) -2025-09-15T14:20:42.690Z | [OTHER] | Attempt 2710: Error rate 48.41% (target: 15%) -2025-09-15T14:20:42.694Z | [OTHER] | Attempt 2711: Error rate 47.44% (target: 15%) -2025-09-15T14:20:42.697Z | [OTHER] | Attempt 2712: Error rate 60% (target: 15%) -2025-09-15T14:20:42.700Z | [OTHER] | Attempt 2713: Error rate 50.76% (target: 15%) -2025-09-15T14:20:42.703Z | [OTHER] | Attempt 2714: Error rate 48.86% (target: 15%) -2025-09-15T14:20:42.707Z | [OTHER] | Attempt 2715: Error rate 58.52% (target: 15%) -2025-09-15T14:20:42.710Z | [OTHER] | Attempt 2716: Error rate 56.2% (target: 15%) -2025-09-15T14:20:42.713Z | [OTHER] | Attempt 2717: Error rate 46.59% (target: 15%) -2025-09-15T14:20:42.716Z | [OTHER] | Attempt 2718: Error rate 52.5% (target: 15%) -2025-09-15T14:20:42.721Z | [OTHER] | Attempt 2719: Error rate 50.37% (target: 15%) -2025-09-15T14:20:42.724Z | [OTHER] | Attempt 2720: Error rate 54.17% (target: 15%) -2025-09-15T14:20:42.728Z | [OTHER] | Attempt 2721: Error rate 54.86% (target: 15%) -2025-09-15T14:20:42.731Z | [OTHER] | Attempt 2722: Error rate 50% (target: 15%) -2025-09-15T14:20:42.735Z | [OTHER] | Attempt 2723: Error rate 55.81% (target: 15%) -2025-09-15T14:20:42.739Z | [OTHER] | Attempt 2724: Error rate 53.97% (target: 15%) -2025-09-15T14:20:42.743Z | [OTHER] | Attempt 2725: Error rate 45.56% (target: 15%) -2025-09-15T14:20:42.746Z | [OTHER] | Attempt 2726: Error rate 58.53% (target: 15%) -2025-09-15T14:20:42.750Z | [OTHER] | Attempt 2727: Error rate 46.83% (target: 15%) -2025-09-15T14:20:42.754Z | [OTHER] | Attempt 2728: Error rate 55.81% (target: 15%) -2025-09-15T14:20:42.757Z | [OTHER] | Attempt 2729: Error rate 51.14% (target: 15%) -2025-09-15T14:20:42.761Z | [OTHER] | Attempt 2730: Error rate 50.39% (target: 15%) -2025-09-15T14:20:42.764Z | [OTHER] | Attempt 2731: Error rate 54.61% (target: 15%) -2025-09-15T14:20:42.768Z | [OTHER] | Attempt 2732: Error rate 45.56% (target: 15%) -2025-09-15T14:20:42.771Z | [OTHER] | Attempt 2733: Error rate 52.08% (target: 15%) -2025-09-15T14:20:42.777Z | [OTHER] | Attempt 2734: Error rate 48.02% (target: 15%) -2025-09-15T14:20:42.785Z | [OTHER] | Attempt 2735: Error rate 51.14% (target: 15%) -2025-09-15T14:20:42.791Z | [OTHER] | Attempt 2736: Error rate 46.97% (target: 15%) -2025-09-15T14:20:42.798Z | [OTHER] | Attempt 2737: Error rate 43.41% (target: 15%) -2025-09-15T14:20:42.805Z | [OTHER] | Attempt 2738: Error rate 48.58% (target: 15%) -2025-09-15T14:20:42.812Z | [OTHER] | Attempt 2739: Error rate 56.91% (target: 15%) -2025-09-15T14:20:42.818Z | [OTHER] | Attempt 2740: Error rate 45.19% (target: 15%) -2025-09-15T14:20:42.821Z | [OTHER] | Attempt 2741: Error rate 53.33% (target: 15%) -2025-09-15T14:20:42.826Z | [OTHER] | Attempt 2742: Error rate 53.49% (target: 15%) -2025-09-15T14:20:42.831Z | [OTHER] | Attempt 2743: Error rate 54.96% (target: 15%) -2025-09-15T14:20:42.838Z | [OTHER] | Attempt 2744: Error rate 55.93% (target: 15%) -2025-09-15T14:20:42.843Z | [OTHER] | Attempt 2745: Error rate 53.49% (target: 15%) -2025-09-15T14:20:42.847Z | [OTHER] | Attempt 2746: Error rate 58.14% (target: 15%) -2025-09-15T14:20:42.851Z | [OTHER] | Attempt 2747: Error rate 49.24% (target: 15%) -2025-09-15T14:20:42.855Z | [OTHER] | Attempt 2748: Error rate 49.63% (target: 15%) -2025-09-15T14:20:42.859Z | [OTHER] | Attempt 2749: Error rate 49.19% (target: 15%) -2025-09-15T14:20:42.862Z | [OTHER] | Attempt 2750: Error rate 54.55% (target: 15%) -2025-09-15T14:20:42.866Z | [OTHER] | Attempt 2751: Error rate 53.41% (target: 15%) -2025-09-15T14:20:42.870Z | [OTHER] | Attempt 2752: Error rate 60.64% (target: 15%) -2025-09-15T14:20:42.873Z | [OTHER] | Attempt 2753: Error rate 54.61% (target: 15%) -2025-09-15T14:20:42.876Z | [OTHER] | Attempt 2754: Error rate 56.52% (target: 15%) -2025-09-15T14:20:42.880Z | [OTHER] | Attempt 2755: Error rate 55.56% (target: 15%) -2025-09-15T14:20:42.883Z | [OTHER] | Attempt 2756: Error rate 54.17% (target: 15%) -2025-09-15T14:20:42.887Z | [OTHER] | Attempt 2757: Error rate 50.4% (target: 15%) -2025-09-15T14:20:42.890Z | [OTHER] | Attempt 2758: Error rate 46.97% (target: 15%) -2025-09-15T14:20:42.895Z | [OTHER] | Attempt 2759: Error rate 57.61% (target: 15%) -2025-09-15T14:20:42.899Z | [OTHER] | Attempt 2760: Error rate 46.51% (target: 15%) -2025-09-15T14:20:42.903Z | [OTHER] | Attempt 2761: Error rate 43.12% (target: 15%) -2025-09-15T14:20:42.906Z | [OTHER] | Attempt 2762: Error rate 53.03% (target: 15%) -2025-09-15T14:20:42.909Z | [OTHER] | Attempt 2763: Error rate 58.16% (target: 15%) -2025-09-15T14:20:42.912Z | [OTHER] | Attempt 2764: Error rate 49.28% (target: 15%) -2025-09-15T14:20:42.916Z | [OTHER] | Attempt 2765: Error rate 49.61% (target: 15%) -2025-09-15T14:20:42.919Z | [OTHER] | Attempt 2766: Error rate 51.39% (target: 15%) -2025-09-15T14:20:42.923Z | [OTHER] | Attempt 2767: Error rate 48.89% (target: 15%) -2025-09-15T14:20:42.926Z | [OTHER] | Attempt 2768: Error rate 50.78% (target: 15%) -2025-09-15T14:20:42.930Z | [OTHER] | Attempt 2769: Error rate 53.57% (target: 15%) -2025-09-15T14:20:42.933Z | [OTHER] | Attempt 2770: Error rate 52.92% (target: 15%) -2025-09-15T14:20:42.937Z | [OTHER] | Attempt 2771: Error rate 50.79% (target: 15%) -2025-09-15T14:20:42.941Z | [OTHER] | Attempt 2772: Error rate 49.31% (target: 15%) -2025-09-15T14:20:42.944Z | [OTHER] | Attempt 2773: Error rate 48.15% (target: 15%) -2025-09-15T14:20:42.948Z | [OTHER] | Attempt 2774: Error rate 51.14% (target: 15%) -2025-09-15T14:20:42.952Z | [OTHER] | Attempt 2775: Error rate 43.09% (target: 15%) -2025-09-15T14:20:42.956Z | [OTHER] | Attempt 2776: Error rate 56.1% (target: 15%) -2025-09-15T14:20:42.959Z | [OTHER] | Attempt 2777: Error rate 45.24% (target: 15%) -2025-09-15T14:20:42.963Z | [OTHER] | Attempt 2778: Error rate 49.24% (target: 15%) -2025-09-15T14:20:42.967Z | [OTHER] | Attempt 2779: Error rate 46.75% (target: 15%) -2025-09-15T14:20:42.970Z | [OTHER] | Attempt 2780: Error rate 46.3% (target: 15%) -2025-09-15T14:20:42.974Z | [OTHER] | Attempt 2781: Error rate 47.15% (target: 15%) -2025-09-15T14:20:42.978Z | [OTHER] | Attempt 2782: Error rate 53.19% (target: 15%) -2025-09-15T14:20:42.982Z | [OTHER] | Attempt 2783: Error rate 46.97% (target: 15%) -2025-09-15T14:20:42.986Z | [OTHER] | Attempt 2784: Error rate 53.49% (target: 15%) -2025-09-15T14:20:42.989Z | [OTHER] | Attempt 2785: Error rate 54.07% (target: 15%) -2025-09-15T14:20:42.993Z | [OTHER] | Attempt 2786: Error rate 59.63% (target: 15%) -2025-09-15T14:20:42.996Z | [OTHER] | Attempt 2787: Error rate 42.75% (target: 15%) -2025-09-15T14:20:42.999Z | [OTHER] | Attempt 2788: Error rate 47.22% (target: 15%) -2025-09-15T14:20:43.003Z | [OTHER] | Attempt 2789: Error rate 56.25% (target: 15%) -2025-09-15T14:20:43.006Z | [OTHER] | Attempt 2790: Error rate 48.58% (target: 15%) -2025-09-15T14:20:43.009Z | [OTHER] | Attempt 2791: Error rate 45.56% (target: 15%) -2025-09-15T14:20:43.012Z | [OTHER] | Attempt 2792: Error rate 51.11% (target: 15%) -2025-09-15T14:20:43.016Z | [OTHER] | Attempt 2793: Error rate 53.17% (target: 15%) -2025-09-15T14:20:43.019Z | [OTHER] | Attempt 2794: Error rate 55.44% (target: 15%) -2025-09-15T14:20:43.022Z | [OTHER] | Attempt 2795: Error rate 52.27% (target: 15%) -2025-09-15T14:20:43.025Z | [OTHER] | Attempt 2796: Error rate 59.13% (target: 15%) -2025-09-15T14:20:43.029Z | [OTHER] | Attempt 2797: Error rate 53.33% (target: 15%) -2025-09-15T14:20:43.032Z | [OTHER] | Attempt 2798: Error rate 51.04% (target: 15%) -2025-09-15T14:20:43.035Z | [OTHER] | Attempt 2799: Error rate 46.01% (target: 15%) -2025-09-15T14:20:43.038Z | [OTHER] | Attempt 2800: Error rate 51.85% (target: 15%) -2025-09-15T14:20:43.042Z | [OTHER] | Attempt 2801: Error rate 53.79% (target: 15%) -2025-09-15T14:20:43.045Z | [OTHER] | Attempt 2802: Error rate 48.58% (target: 15%) -2025-09-15T14:20:43.048Z | [OTHER] | Attempt 2803: Error rate 57.78% (target: 15%) -2025-09-15T14:20:43.051Z | [OTHER] | Attempt 2804: Error rate 53.85% (target: 15%) -2025-09-15T14:20:43.055Z | [OTHER] | Attempt 2805: Error rate 46.88% (target: 15%) -2025-09-15T14:20:43.058Z | [OTHER] | Attempt 2806: Error rate 52.33% (target: 15%) -2025-09-15T14:20:43.061Z | [OTHER] | Attempt 2807: Error rate 50.39% (target: 15%) -2025-09-15T14:20:43.065Z | [OTHER] | Attempt 2808: Error rate 53.7% (target: 15%) -2025-09-15T14:20:43.068Z | [OTHER] | Attempt 2809: Error rate 50.4% (target: 15%) -2025-09-15T14:20:43.071Z | [OTHER] | Attempt 2810: Error rate 48.58% (target: 15%) -2025-09-15T14:20:43.074Z | [OTHER] | Attempt 2811: Error rate 51.16% (target: 15%) -2025-09-15T14:20:43.077Z | [OTHER] | Attempt 2812: Error rate 48.89% (target: 15%) -2025-09-15T14:20:43.080Z | [OTHER] | Attempt 2813: Error rate 57.94% (target: 15%) -2025-09-15T14:20:43.084Z | [OTHER] | Attempt 2814: Error rate 56.16% (target: 15%) -2025-09-15T14:20:43.087Z | [OTHER] | Attempt 2815: Error rate 56.67% (target: 15%) -2025-09-15T14:20:43.090Z | [OTHER] | Attempt 2816: Error rate 51.14% (target: 15%) -2025-09-15T14:20:43.094Z | [OTHER] | Attempt 2817: Error rate 49.19% (target: 15%) -2025-09-15T14:20:43.097Z | [OTHER] | Attempt 2818: Error rate 55% (target: 15%) -2025-09-15T14:20:43.101Z | [OTHER] | Attempt 2819: Error rate 60.74% (target: 15%) -2025-09-15T14:20:43.104Z | [OTHER] | Attempt 2820: Error rate 48.45% (target: 15%) -2025-09-15T14:20:43.107Z | [OTHER] | Attempt 2821: Error rate 55.07% (target: 15%) -2025-09-15T14:20:43.111Z | [OTHER] | Attempt 2822: Error rate 53.33% (target: 15%) -2025-09-15T14:20:43.114Z | [OTHER] | Attempt 2823: Error rate 50.78% (target: 15%) -2025-09-15T14:20:43.117Z | [OTHER] | Attempt 2824: Error rate 55.43% (target: 15%) -2025-09-15T14:20:43.120Z | [OTHER] | Attempt 2825: Error rate 59.3% (target: 15%) -2025-09-15T14:20:43.125Z | [OTHER] | Attempt 2826: Error rate 51.04% (target: 15%) -2025-09-15T14:20:43.127Z | [OTHER] | Attempt 2827: Error rate 54.51% (target: 15%) -2025-09-15T14:20:43.131Z | [OTHER] | Attempt 2828: Error rate 47.67% (target: 15%) -2025-09-15T14:20:43.134Z | [OTHER] | Attempt 2829: Error rate 53.79% (target: 15%) -2025-09-15T14:20:43.137Z | [OTHER] | Attempt 2830: Error rate 60.53% (target: 15%) -2025-09-15T14:20:43.140Z | [OTHER] | Attempt 2831: Error rate 48.41% (target: 15%) -2025-09-15T14:20:43.144Z | [OTHER] | Attempt 2832: Error rate 44.81% (target: 15%) -2025-09-15T14:20:43.147Z | [OTHER] | Attempt 2833: Error rate 51.81% (target: 15%) -2025-09-15T14:20:43.151Z | [OTHER] | Attempt 2834: Error rate 50% (target: 15%) -2025-09-15T14:20:43.154Z | [OTHER] | Attempt 2835: Error rate 42.46% (target: 15%) -2025-09-15T14:20:43.158Z | [OTHER] | Attempt 2836: Error rate 59.57% (target: 15%) -2025-09-15T14:20:43.162Z | [OTHER] | Attempt 2837: Error rate 50% (target: 15%) -2025-09-15T14:20:43.166Z | [OTHER] | Attempt 2838: Error rate 51.06% (target: 15%) -2025-09-15T14:20:43.169Z | [OTHER] | Attempt 2839: Error rate 53.33% (target: 15%) -2025-09-15T14:20:43.173Z | [OTHER] | Attempt 2840: Error rate 59.78% (target: 15%) -2025-09-15T14:20:43.176Z | [OTHER] | Attempt 2841: Error rate 56.06% (target: 15%) -2025-09-15T14:20:43.179Z | [OTHER] | Attempt 2842: Error rate 50% (target: 15%) -2025-09-15T14:20:43.182Z | [OTHER] | Attempt 2843: Error rate 49.63% (target: 15%) -2025-09-15T14:20:43.186Z | [OTHER] | Attempt 2844: Error rate 59.42% (target: 15%) -2025-09-15T14:20:43.189Z | [OTHER] | Attempt 2845: Error rate 51.48% (target: 15%) -2025-09-15T14:20:43.192Z | [OTHER] | Attempt 2846: Error rate 54.81% (target: 15%) -2025-09-15T14:20:43.195Z | [OTHER] | Attempt 2847: Error rate 54.82% (target: 15%) -2025-09-15T14:20:43.199Z | [OTHER] | Attempt 2848: Error rate 55.32% (target: 15%) -2025-09-15T14:20:43.202Z | [OTHER] | Attempt 2849: Error rate 51.94% (target: 15%) -2025-09-15T14:20:43.205Z | [OTHER] | Attempt 2850: Error rate 48.26% (target: 15%) -2025-09-15T14:20:43.208Z | [OTHER] | Attempt 2851: Error rate 59.52% (target: 15%) -2025-09-15T14:20:43.211Z | [OTHER] | Attempt 2852: Error rate 48.84% (target: 15%) -2025-09-15T14:20:43.214Z | [OTHER] | Attempt 2853: Error rate 53.9% (target: 15%) -2025-09-15T14:20:43.218Z | [OTHER] | Attempt 2854: Error rate 53.03% (target: 15%) -2025-09-15T14:20:43.221Z | [OTHER] | Attempt 2855: Error rate 56.98% (target: 15%) -2025-09-15T14:20:43.224Z | [OTHER] | Attempt 2856: Error rate 57.75% (target: 15%) -2025-09-15T14:20:43.227Z | [OTHER] | Attempt 2857: Error rate 53.75% (target: 15%) -2025-09-15T14:20:43.230Z | [OTHER] | Attempt 2858: Error rate 55.13% (target: 15%) -2025-09-15T14:20:43.234Z | [OTHER] | Attempt 2859: Error rate 47.67% (target: 15%) -2025-09-15T14:20:43.237Z | [OTHER] | Attempt 2860: Error rate 50.39% (target: 15%) -2025-09-15T14:20:43.241Z | [OTHER] | Attempt 2861: Error rate 51.22% (target: 15%) -2025-09-15T14:20:43.244Z | [OTHER] | Attempt 2862: Error rate 53.97% (target: 15%) -2025-09-15T14:20:43.247Z | [OTHER] | Attempt 2863: Error rate 56.82% (target: 15%) -2025-09-15T14:20:43.250Z | [OTHER] | Attempt 2864: Error rate 43.84% (target: 15%) -2025-09-15T14:20:43.254Z | [OTHER] | Attempt 2865: Error rate 45.63% (target: 15%) -2025-09-15T14:20:43.257Z | [OTHER] | Attempt 2866: Error rate 51.94% (target: 15%) -2025-09-15T14:20:43.261Z | [OTHER] | Attempt 2867: Error rate 49.6% (target: 15%) -2025-09-15T14:20:43.264Z | [OTHER] | Attempt 2868: Error rate 48.06% (target: 15%) -2025-09-15T14:20:43.267Z | [OTHER] | Attempt 2869: Error rate 53.88% (target: 15%) -2025-09-15T14:20:43.270Z | [OTHER] | Attempt 2870: Error rate 57.41% (target: 15%) -2025-09-15T14:20:43.273Z | [OTHER] | Attempt 2871: Error rate 59.4% (target: 15%) -2025-09-15T14:20:43.277Z | [OTHER] | Attempt 2872: Error rate 46.43% (target: 15%) -2025-09-15T14:20:43.280Z | [OTHER] | Attempt 2873: Error rate 53.47% (target: 15%) -2025-09-15T14:20:43.284Z | [OTHER] | Attempt 2874: Error rate 48.86% (target: 15%) -2025-09-15T14:20:43.287Z | [OTHER] | Attempt 2875: Error rate 55.04% (target: 15%) -2025-09-15T14:20:43.290Z | [OTHER] | Attempt 2876: Error rate 51.11% (target: 15%) -2025-09-15T14:20:43.294Z | [OTHER] | Attempt 2877: Error rate 44.07% (target: 15%) -2025-09-15T14:20:43.297Z | [OTHER] | Attempt 2878: Error rate 53.33% (target: 15%) -2025-09-15T14:20:43.300Z | [OTHER] | Attempt 2879: Error rate 41.25% (target: 15%) -2025-09-15T14:20:43.303Z | [OTHER] | Attempt 2880: Error rate 54.07% (target: 15%) -2025-09-15T14:20:43.307Z | [OTHER] | Attempt 2881: Error rate 48.48% (target: 15%) -2025-09-15T14:20:43.310Z | [OTHER] | Attempt 2882: Error rate 52.38% (target: 15%) -2025-09-15T14:20:43.314Z | [OTHER] | Attempt 2883: Error rate 52.61% (target: 15%) -2025-09-15T14:20:43.317Z | [OTHER] | Attempt 2884: Error rate 51.52% (target: 15%) -2025-09-15T14:20:43.320Z | [OTHER] | Attempt 2885: Error rate 41.85% (target: 15%) -2025-09-15T14:20:43.323Z | [OTHER] | Attempt 2886: Error rate 53.1% (target: 15%) -2025-09-15T14:20:43.327Z | [OTHER] | Attempt 2887: Error rate 55.1% (target: 15%) -2025-09-15T14:20:43.330Z | [OTHER] | Attempt 2888: Error rate 63.57% (target: 15%) -2025-09-15T14:20:43.334Z | [OTHER] | Attempt 2889: Error rate 51.11% (target: 15%) -2025-09-15T14:20:43.338Z | [OTHER] | Attempt 2890: Error rate 53.49% (target: 15%) -2025-09-15T14:20:43.341Z | [OTHER] | Attempt 2891: Error rate 54.55% (target: 15%) -2025-09-15T14:20:43.345Z | [OTHER] | Attempt 2892: Error rate 52.92% (target: 15%) -2025-09-15T14:20:43.349Z | [OTHER] | Attempt 2893: Error rate 46.25% (target: 15%) -2025-09-15T14:20:43.352Z | [OTHER] | Attempt 2894: Error rate 50.39% (target: 15%) -2025-09-15T14:20:43.356Z | [OTHER] | Attempt 2895: Error rate 39.77% (target: 15%) -2025-09-15T14:20:43.359Z | [OTHER] | Attempt 2896: Error rate 48.02% (target: 15%) -2025-09-15T14:20:43.363Z | [OTHER] | Attempt 2897: Error rate 52.71% (target: 15%) -2025-09-15T14:20:43.366Z | [OTHER] | Attempt 2898: Error rate 57.04% (target: 15%) -2025-09-15T14:20:43.370Z | [OTHER] | Attempt 2899: Error rate 51.28% (target: 15%) -2025-09-15T14:20:43.374Z | [OTHER] | Attempt 2900: Error rate 58.52% (target: 15%) -2025-09-15T14:20:43.377Z | [OTHER] | Attempt 2901: Error rate 56.98% (target: 15%) -2025-09-15T14:20:43.382Z | [OTHER] | Attempt 2902: Error rate 49.28% (target: 15%) -2025-09-15T14:20:43.385Z | [OTHER] | Attempt 2903: Error rate 52.59% (target: 15%) -2025-09-15T14:20:43.390Z | [OTHER] | Attempt 2904: Error rate 56.82% (target: 15%) -2025-09-15T14:20:43.394Z | [OTHER] | Attempt 2905: Error rate 48.33% (target: 15%) -2025-09-15T14:20:43.398Z | [OTHER] | Attempt 2906: Error rate 46.97% (target: 15%) -2025-09-15T14:20:43.402Z | [OTHER] | Attempt 2907: Error rate 55.8% (target: 15%) -2025-09-15T14:20:43.406Z | [OTHER] | Attempt 2908: Error rate 50.79% (target: 15%) -2025-09-15T14:20:43.410Z | [OTHER] | Attempt 2909: Error rate 40.74% (target: 15%) -2025-09-15T14:20:43.414Z | [OTHER] | Attempt 2910: Error rate 44.44% (target: 15%) -2025-09-15T14:20:43.417Z | [OTHER] | Attempt 2911: Error rate 51.45% (target: 15%) -2025-09-15T14:20:43.420Z | [OTHER] | Attempt 2912: Error rate 53.79% (target: 15%) -2025-09-15T14:20:43.424Z | [OTHER] | Attempt 2913: Error rate 55.3% (target: 15%) -2025-09-15T14:20:43.427Z | [OTHER] | Attempt 2914: Error rate 46.83% (target: 15%) -2025-09-15T14:20:43.431Z | [OTHER] | Attempt 2915: Error rate 54.76% (target: 15%) -2025-09-15T14:20:43.435Z | [OTHER] | Attempt 2916: Error rate 45.14% (target: 15%) -2025-09-15T14:20:43.438Z | [OTHER] | Attempt 2917: Error rate 59.52% (target: 15%) -2025-09-15T14:20:43.442Z | [OTHER] | Attempt 2918: Error rate 53.47% (target: 15%) -2025-09-15T14:20:43.445Z | [OTHER] | Attempt 2919: Error rate 53.03% (target: 15%) -2025-09-15T14:20:43.449Z | [OTHER] | Attempt 2920: Error rate 49.63% (target: 15%) -2025-09-15T14:20:43.452Z | [OTHER] | Attempt 2921: Error rate 59.18% (target: 15%) -2025-09-15T14:20:43.455Z | [OTHER] | Attempt 2922: Error rate 50% (target: 15%) -2025-09-15T14:20:43.459Z | [OTHER] | Attempt 2923: Error rate 38.62% (target: 15%) -2025-09-15T14:20:43.462Z | [OTHER] | Attempt 2924: Error rate 52.43% (target: 15%) -2025-09-15T14:20:43.466Z | [OTHER] | Attempt 2925: Error rate 46.03% (target: 15%) -2025-09-15T14:20:43.469Z | [OTHER] | Attempt 2926: Error rate 53% (target: 15%) -2025-09-15T14:20:43.473Z | [OTHER] | Attempt 2927: Error rate 56.2% (target: 15%) -2025-09-15T14:20:43.476Z | [OTHER] | Attempt 2928: Error rate 51.55% (target: 15%) -2025-09-15T14:20:43.479Z | [OTHER] | Attempt 2929: Error rate 56.12% (target: 15%) -2025-09-15T14:20:43.483Z | [OTHER] | Attempt 2930: Error rate 52.9% (target: 15%) -2025-09-15T14:20:43.486Z | [OTHER] | Attempt 2931: Error rate 53.26% (target: 15%) -2025-09-15T14:20:43.490Z | [OTHER] | Attempt 2932: Error rate 57.25% (target: 15%) -2025-09-15T14:20:43.493Z | [OTHER] | Attempt 2933: Error rate 54.37% (target: 15%) -2025-09-15T14:20:43.496Z | [OTHER] | Attempt 2934: Error rate 51.04% (target: 15%) -2025-09-15T14:20:43.500Z | [OTHER] | Attempt 2935: Error rate 52.44% (target: 15%) -2025-09-15T14:20:43.503Z | [OTHER] | Attempt 2936: Error rate 53.57% (target: 15%) -2025-09-15T14:20:43.507Z | [OTHER] | Attempt 2937: Error rate 49.63% (target: 15%) -2025-09-15T14:20:43.510Z | [OTHER] | Attempt 2938: Error rate 54.47% (target: 15%) -2025-09-15T14:20:43.513Z | [OTHER] | Attempt 2939: Error rate 34.47% (target: 15%) -2025-09-15T14:20:43.517Z | [OTHER] | Attempt 2940: Error rate 47.04% (target: 15%) -2025-09-15T14:20:43.520Z | [OTHER] | Attempt 2941: Error rate 54.61% (target: 15%) -2025-09-15T14:20:43.523Z | [OTHER] | Attempt 2942: Error rate 51.89% (target: 15%) -2025-09-15T14:20:43.527Z | [OTHER] | Attempt 2943: Error rate 47.35% (target: 15%) -2025-09-15T14:20:43.530Z | [OTHER] | Attempt 2944: Error rate 50.81% (target: 15%) -2025-09-15T14:20:43.533Z | [OTHER] | Attempt 2945: Error rate 50% (target: 15%) -2025-09-15T14:20:43.537Z | [OTHER] | Attempt 2946: Error rate 53.55% (target: 15%) -2025-09-15T14:20:43.540Z | [OTHER] | Attempt 2947: Error rate 50.43% (target: 15%) -2025-09-15T14:20:43.543Z | [OTHER] | Attempt 2948: Error rate 54.44% (target: 15%) -2025-09-15T14:20:43.546Z | [OTHER] | Attempt 2949: Error rate 54.17% (target: 15%) -2025-09-15T14:20:43.550Z | [OTHER] | Attempt 2950: Error rate 57.78% (target: 15%) -2025-09-15T14:20:43.554Z | [OTHER] | Attempt 2951: Error rate 44.96% (target: 15%) -2025-09-15T14:20:43.557Z | [OTHER] | Attempt 2952: Error rate 49.59% (target: 15%) -2025-09-15T14:20:43.561Z | [OTHER] | Attempt 2953: Error rate 46.45% (target: 15%) -2025-09-15T14:20:43.566Z | [OTHER] | Attempt 2954: Error rate 55.68% (target: 15%) -2025-09-15T14:20:43.570Z | [OTHER] | Attempt 2955: Error rate 55.3% (target: 15%) -2025-09-15T14:20:43.573Z | [OTHER] | Attempt 2956: Error rate 52.96% (target: 15%) -2025-09-15T14:20:43.576Z | [OTHER] | Attempt 2957: Error rate 55.43% (target: 15%) -2025-09-15T14:20:43.580Z | [OTHER] | Attempt 2958: Error rate 51.59% (target: 15%) -2025-09-15T14:20:43.583Z | [OTHER] | Attempt 2959: Error rate 57.25% (target: 15%) -2025-09-15T14:20:43.587Z | [OTHER] | Attempt 2960: Error rate 55.69% (target: 15%) -2025-09-15T14:20:43.590Z | [OTHER] | Attempt 2961: Error rate 55.28% (target: 15%) -2025-09-15T14:20:43.593Z | [OTHER] | Attempt 2962: Error rate 52.78% (target: 15%) -2025-09-15T14:20:43.597Z | [OTHER] | Attempt 2963: Error rate 45.35% (target: 15%) -2025-09-15T14:20:43.600Z | [OTHER] | Attempt 2964: Error rate 59.69% (target: 15%) -2025-09-15T14:20:43.604Z | [OTHER] | Attempt 2965: Error rate 45.24% (target: 15%) -2025-09-15T14:20:43.607Z | [OTHER] | Attempt 2966: Error rate 57.36% (target: 15%) -2025-09-15T14:20:43.611Z | [OTHER] | Attempt 2967: Error rate 57.14% (target: 15%) -2025-09-15T14:20:43.614Z | [OTHER] | Attempt 2968: Error rate 50.35% (target: 15%) -2025-09-15T14:20:43.617Z | [OTHER] | Attempt 2969: Error rate 52.17% (target: 15%) -2025-09-15T14:20:43.621Z | [OTHER] | Attempt 2970: Error rate 55.21% (target: 15%) -2025-09-15T14:20:43.624Z | [OTHER] | Attempt 2971: Error rate 43.84% (target: 15%) -2025-09-15T14:20:43.628Z | [OTHER] | Attempt 2972: Error rate 53.62% (target: 15%) -2025-09-15T14:20:43.631Z | [OTHER] | Attempt 2973: Error rate 55.81% (target: 15%) -2025-09-15T14:20:43.635Z | [OTHER] | Attempt 2974: Error rate 51.94% (target: 15%) -2025-09-15T14:20:43.638Z | [OTHER] | Attempt 2975: Error rate 51.28% (target: 15%) -2025-09-15T14:20:43.641Z | [OTHER] | Attempt 2976: Error rate 57.48% (target: 15%) -2025-09-15T14:20:43.644Z | [OTHER] | Attempt 2977: Error rate 53.25% (target: 15%) -2025-09-15T14:20:43.648Z | [OTHER] | Attempt 2978: Error rate 57.54% (target: 15%) -2025-09-15T14:20:43.651Z | [OTHER] | Attempt 2979: Error rate 50.42% (target: 15%) -2025-09-15T14:20:43.654Z | [OTHER] | Attempt 2980: Error rate 47.35% (target: 15%) -2025-09-15T14:20:43.658Z | [OTHER] | Attempt 2981: Error rate 52.92% (target: 15%) -2025-09-15T14:20:43.661Z | [OTHER] | Attempt 2982: Error rate 52.78% (target: 15%) -2025-09-15T14:20:43.664Z | [OTHER] | Attempt 2983: Error rate 50.35% (target: 15%) -2025-09-15T14:20:43.668Z | [OTHER] | Attempt 2984: Error rate 43.8% (target: 15%) -2025-09-15T14:20:43.671Z | [OTHER] | Attempt 2985: Error rate 50.36% (target: 15%) -2025-09-15T14:20:43.675Z | [OTHER] | Attempt 2986: Error rate 53% (target: 15%) -2025-09-15T14:20:43.678Z | [OTHER] | Attempt 2987: Error rate 48.91% (target: 15%) -2025-09-15T14:20:43.682Z | [OTHER] | Attempt 2988: Error rate 52.84% (target: 15%) -2025-09-15T14:20:43.685Z | [OTHER] | Attempt 2989: Error rate 45.93% (target: 15%) -2025-09-15T14:20:43.689Z | [OTHER] | Attempt 2990: Error rate 48.26% (target: 15%) -2025-09-15T14:20:43.692Z | [OTHER] | Attempt 2991: Error rate 54.76% (target: 15%) -2025-09-15T14:20:43.696Z | [OTHER] | Attempt 2992: Error rate 53.1% (target: 15%) -2025-09-15T14:20:43.700Z | [OTHER] | Attempt 2993: Error rate 48.48% (target: 15%) -2025-09-15T14:20:43.703Z | [OTHER] | Attempt 2994: Error rate 47.73% (target: 15%) -2025-09-15T14:20:43.706Z | [OTHER] | Attempt 2995: Error rate 55.43% (target: 15%) -2025-09-15T14:20:43.710Z | [OTHER] | Attempt 2996: Error rate 51.67% (target: 15%) -2025-09-15T14:20:43.713Z | [OTHER] | Attempt 2997: Error rate 52.59% (target: 15%) -2025-09-15T14:20:43.716Z | [OTHER] | Attempt 2998: Error rate 47.46% (target: 15%) -2025-09-15T14:20:43.720Z | [OTHER] | Attempt 2999: Error rate 47.78% (target: 15%) -2025-09-15T14:20:43.723Z | [OTHER] | Attempt 3000: Error rate 55.3% (target: 15%) -2025-09-15T14:20:43.727Z | [OTHER] | Attempt 3001: Error rate 50.39% (target: 15%) -2025-09-15T14:20:43.730Z | [OTHER] | Attempt 3002: Error rate 55.19% (target: 15%) -2025-09-15T14:20:43.734Z | [OTHER] | Attempt 3003: Error rate 51.52% (target: 15%) -2025-09-15T14:20:43.738Z | [OTHER] | Attempt 3004: Error rate 51.48% (target: 15%) -2025-09-15T14:20:43.741Z | [OTHER] | Attempt 3005: Error rate 50.42% (target: 15%) -2025-09-15T14:20:43.745Z | [OTHER] | Attempt 3006: Error rate 48.81% (target: 15%) -2025-09-15T14:20:43.748Z | [OTHER] | Attempt 3007: Error rate 46.67% (target: 15%) -2025-09-15T14:20:43.752Z | [OTHER] | Attempt 3008: Error rate 48.91% (target: 15%) -2025-09-15T14:20:43.755Z | [OTHER] | Attempt 3009: Error rate 50.78% (target: 15%) -2025-09-15T14:20:43.759Z | [OTHER] | Attempt 3010: Error rate 49.59% (target: 15%) -2025-09-15T14:20:43.762Z | [OTHER] | Attempt 3011: Error rate 53.13% (target: 15%) -2025-09-15T14:20:43.765Z | [OTHER] | Attempt 3012: Error rate 63.01% (target: 15%) -2025-09-15T14:20:43.769Z | [OTHER] | Attempt 3013: Error rate 50.72% (target: 15%) -2025-09-15T14:20:43.772Z | [OTHER] | Attempt 3014: Error rate 50.37% (target: 15%) -2025-09-15T14:20:43.775Z | [OTHER] | Attempt 3015: Error rate 49.22% (target: 15%) -2025-09-15T14:20:43.779Z | [OTHER] | Attempt 3016: Error rate 55.56% (target: 15%) -2025-09-15T14:20:43.783Z | [OTHER] | Attempt 3017: Error rate 56.44% (target: 15%) -2025-09-15T14:20:43.786Z | [OTHER] | Attempt 3018: Error rate 46.88% (target: 15%) -2025-09-15T14:20:43.789Z | [OTHER] | Attempt 3019: Error rate 49.22% (target: 15%) -2025-09-15T14:20:43.793Z | [OTHER] | Attempt 3020: Error rate 49.6% (target: 15%) -2025-09-15T14:20:43.796Z | [OTHER] | Attempt 3021: Error rate 59.18% (target: 15%) -2025-09-15T14:20:43.800Z | [OTHER] | Attempt 3022: Error rate 58.94% (target: 15%) -2025-09-15T14:20:43.804Z | [OTHER] | Attempt 3023: Error rate 46.59% (target: 15%) -2025-09-15T14:20:43.807Z | [OTHER] | Attempt 3024: Error rate 57.97% (target: 15%) -2025-09-15T14:20:43.811Z | [OTHER] | Attempt 3025: Error rate 52.08% (target: 15%) -2025-09-15T14:20:43.814Z | [OTHER] | Attempt 3026: Error rate 45.56% (target: 15%) -2025-09-15T14:20:43.818Z | [OTHER] | Attempt 3027: Error rate 47.04% (target: 15%) -2025-09-15T14:20:43.821Z | [OTHER] | Attempt 3028: Error rate 54.71% (target: 15%) -2025-09-15T14:20:43.825Z | [OTHER] | Attempt 3029: Error rate 51.22% (target: 15%) -2025-09-15T14:20:43.828Z | [OTHER] | Attempt 3030: Error rate 51.55% (target: 15%) -2025-09-15T14:20:43.831Z | [OTHER] | Attempt 3031: Error rate 59.78% (target: 15%) -2025-09-15T14:20:43.835Z | [OTHER] | Attempt 3032: Error rate 54.76% (target: 15%) -2025-09-15T14:20:43.838Z | [OTHER] | Attempt 3033: Error rate 57.67% (target: 15%) -2025-09-15T14:20:43.843Z | [OTHER] | Attempt 3034: Error rate 59.18% (target: 15%) -2025-09-15T14:20:43.846Z | [OTHER] | Attempt 3035: Error rate 48.86% (target: 15%) -2025-09-15T14:20:43.849Z | [OTHER] | Attempt 3036: Error rate 57.78% (target: 15%) -2025-09-15T14:20:43.852Z | [OTHER] | Attempt 3037: Error rate 52.9% (target: 15%) -2025-09-15T14:20:43.856Z | [OTHER] | Attempt 3038: Error rate 57.41% (target: 15%) -2025-09-15T14:20:43.860Z | [OTHER] | Attempt 3039: Error rate 50.76% (target: 15%) -2025-09-15T14:20:43.863Z | [OTHER] | Attempt 3040: Error rate 60.87% (target: 15%) -2025-09-15T14:20:43.866Z | [OTHER] | Attempt 3041: Error rate 49.28% (target: 15%) -2025-09-15T14:20:43.870Z | [OTHER] | Attempt 3042: Error rate 48.78% (target: 15%) -2025-09-15T14:20:43.873Z | [OTHER] | Attempt 3043: Error rate 51.94% (target: 15%) -2025-09-15T14:20:43.877Z | [OTHER] | Attempt 3044: Error rate 52.63% (target: 15%) -2025-09-15T14:20:43.880Z | [OTHER] | Attempt 3045: Error rate 53.06% (target: 15%) -2025-09-15T14:20:43.884Z | [OTHER] | Attempt 3046: Error rate 53.03% (target: 15%) -2025-09-15T14:20:43.887Z | [OTHER] | Attempt 3047: Error rate 45.24% (target: 15%) -2025-09-15T14:20:43.890Z | [OTHER] | Attempt 3048: Error rate 59.09% (target: 15%) -2025-09-15T14:20:43.894Z | [OTHER] | Attempt 3049: Error rate 46.34% (target: 15%) -2025-09-15T14:20:43.897Z | [OTHER] | Attempt 3050: Error rate 51.63% (target: 15%) -2025-09-15T14:20:43.901Z | [OTHER] | Attempt 3051: Error rate 55.93% (target: 15%) -2025-09-15T14:20:43.904Z | [OTHER] | Attempt 3052: Error rate 50.78% (target: 15%) -2025-09-15T14:20:43.908Z | [OTHER] | Attempt 3053: Error rate 52.44% (target: 15%) -2025-09-15T14:20:43.911Z | [OTHER] | Attempt 3054: Error rate 59.85% (target: 15%) -2025-09-15T14:20:43.915Z | [OTHER] | Attempt 3055: Error rate 51.48% (target: 15%) -2025-09-15T14:20:43.918Z | [OTHER] | Attempt 3056: Error rate 56.06% (target: 15%) -2025-09-15T14:20:43.921Z | [OTHER] | Attempt 3057: Error rate 55.83% (target: 15%) -2025-09-15T14:20:43.925Z | [OTHER] | Attempt 3058: Error rate 49.19% (target: 15%) -2025-09-15T14:20:43.928Z | [OTHER] | Attempt 3059: Error rate 57.95% (target: 15%) -2025-09-15T14:20:43.932Z | [OTHER] | Attempt 3060: Error rate 51.14% (target: 15%) -2025-09-15T14:20:43.935Z | [OTHER] | Attempt 3061: Error rate 47.15% (target: 15%) -2025-09-15T14:20:43.939Z | [OTHER] | Attempt 3062: Error rate 56.67% (target: 15%) -2025-09-15T14:20:43.942Z | [OTHER] | Attempt 3063: Error rate 44.07% (target: 15%) -2025-09-15T14:20:43.948Z | [OTHER] | Attempt 3064: Error rate 52.27% (target: 15%) -2025-09-15T14:20:43.954Z | [OTHER] | Attempt 3065: Error rate 58.13% (target: 15%) -2025-09-15T14:20:43.959Z | [OTHER] | Attempt 3066: Error rate 45.93% (target: 15%) -2025-09-15T14:20:43.966Z | [OTHER] | Attempt 3067: Error rate 53.75% (target: 15%) -2025-09-15T14:20:43.971Z | [OTHER] | Attempt 3068: Error rate 46.1% (target: 15%) -2025-09-15T14:20:43.976Z | [OTHER] | Attempt 3069: Error rate 55.07% (target: 15%) -2025-09-15T14:20:43.980Z | [OTHER] | Attempt 3070: Error rate 52.44% (target: 15%) -2025-09-15T14:20:43.985Z | [OTHER] | Attempt 3071: Error rate 53.13% (target: 15%) -2025-09-15T14:20:43.989Z | [OTHER] | Attempt 3072: Error rate 48.75% (target: 15%) -2025-09-15T14:20:43.993Z | [OTHER] | Attempt 3073: Error rate 57.2% (target: 15%) -2025-09-15T14:20:43.996Z | [OTHER] | Attempt 3074: Error rate 51.25% (target: 15%) -2025-09-15T14:20:44.000Z | [OTHER] | Attempt 3075: Error rate 44.58% (target: 15%) -2025-09-15T14:20:44.004Z | [OTHER] | Attempt 3076: Error rate 50.76% (target: 15%) -2025-09-15T14:20:44.009Z | [OTHER] | Attempt 3077: Error rate 51.14% (target: 15%) -2025-09-15T14:20:44.012Z | [OTHER] | Attempt 3078: Error rate 49.62% (target: 15%) -2025-09-15T14:20:44.015Z | [OTHER] | Attempt 3079: Error rate 52.48% (target: 15%) -2025-09-15T14:20:44.019Z | [OTHER] | Attempt 3080: Error rate 57.54% (target: 15%) -2025-09-15T14:20:44.022Z | [OTHER] | Attempt 3081: Error rate 52.04% (target: 15%) -2025-09-15T14:20:44.025Z | [OTHER] | Attempt 3082: Error rate 57.36% (target: 15%) -2025-09-15T14:20:44.029Z | [OTHER] | Attempt 3083: Error rate 49.26% (target: 15%) -2025-09-15T14:20:44.032Z | [OTHER] | Attempt 3084: Error rate 48.91% (target: 15%) -2025-09-15T14:20:44.035Z | [OTHER] | Attempt 3085: Error rate 58.33% (target: 15%) -2025-09-15T14:20:44.039Z | [OTHER] | Attempt 3086: Error rate 49.61% (target: 15%) -2025-09-15T14:20:44.042Z | [OTHER] | Attempt 3087: Error rate 43.94% (target: 15%) -2025-09-15T14:20:44.046Z | [OTHER] | Attempt 3088: Error rate 48.26% (target: 15%) -2025-09-15T14:20:44.049Z | [OTHER] | Attempt 3089: Error rate 45% (target: 15%) -2025-09-15T14:20:44.053Z | [OTHER] | Attempt 3090: Error rate 57.75% (target: 15%) -2025-09-15T14:20:44.056Z | [OTHER] | Attempt 3091: Error rate 50.4% (target: 15%) -2025-09-15T14:20:44.060Z | [OTHER] | Attempt 3092: Error rate 48.33% (target: 15%) -2025-09-15T14:20:44.063Z | [OTHER] | Attempt 3093: Error rate 50% (target: 15%) -2025-09-15T14:20:44.066Z | [OTHER] | Attempt 3094: Error rate 47.92% (target: 15%) -2025-09-15T14:20:44.070Z | [OTHER] | Attempt 3095: Error rate 53.97% (target: 15%) -2025-09-15T14:20:44.074Z | [OTHER] | Attempt 3096: Error rate 51.55% (target: 15%) -2025-09-15T14:20:44.078Z | [OTHER] | Attempt 3097: Error rate 54.61% (target: 15%) -2025-09-15T14:20:44.081Z | [OTHER] | Attempt 3098: Error rate 55.67% (target: 15%) -2025-09-15T14:20:44.085Z | [OTHER] | Attempt 3099: Error rate 49.24% (target: 15%) -2025-09-15T14:20:44.088Z | [OTHER] | Attempt 3100: Error rate 52.72% (target: 15%) -2025-09-15T14:20:44.092Z | [OTHER] | Attempt 3101: Error rate 52.38% (target: 15%) -2025-09-15T14:20:44.096Z | [OTHER] | Attempt 3102: Error rate 51.85% (target: 15%) -2025-09-15T14:20:44.099Z | [OTHER] | Attempt 3103: Error rate 48.84% (target: 15%) -2025-09-15T14:20:44.103Z | [OTHER] | Attempt 3104: Error rate 53.62% (target: 15%) -2025-09-15T14:20:44.106Z | [OTHER] | Attempt 3105: Error rate 56.67% (target: 15%) -2025-09-15T14:20:44.110Z | [OTHER] | Attempt 3106: Error rate 53.03% (target: 15%) -2025-09-15T14:20:44.113Z | [OTHER] | Attempt 3107: Error rate 53.66% (target: 15%) -2025-09-15T14:20:44.117Z | [OTHER] | Attempt 3108: Error rate 44.44% (target: 15%) -2025-09-15T14:20:44.120Z | [OTHER] | Attempt 3109: Error rate 55.07% (target: 15%) -2025-09-15T14:20:44.124Z | [OTHER] | Attempt 3110: Error rate 51.85% (target: 15%) -2025-09-15T14:20:44.127Z | [OTHER] | Attempt 3111: Error rate 55.3% (target: 15%) -2025-09-15T14:20:44.131Z | [OTHER] | Attempt 3112: Error rate 55.68% (target: 15%) -2025-09-15T14:20:44.135Z | [OTHER] | Attempt 3113: Error rate 56.25% (target: 15%) -2025-09-15T14:20:44.138Z | [OTHER] | Attempt 3114: Error rate 53.19% (target: 15%) -2025-09-15T14:20:44.142Z | [OTHER] | Attempt 3115: Error rate 54.81% (target: 15%) -2025-09-15T14:20:44.145Z | [OTHER] | Attempt 3116: Error rate 50.72% (target: 15%) -2025-09-15T14:20:44.149Z | [OTHER] | Attempt 3117: Error rate 52.5% (target: 15%) -2025-09-15T14:20:44.153Z | [OTHER] | Attempt 3118: Error rate 52.96% (target: 15%) -2025-09-15T14:20:44.156Z | [OTHER] | Attempt 3119: Error rate 55.04% (target: 15%) -2025-09-15T14:20:44.159Z | [OTHER] | Attempt 3120: Error rate 55.81% (target: 15%) -2025-09-15T14:20:44.163Z | [OTHER] | Attempt 3121: Error rate 59% (target: 15%) -2025-09-15T14:20:44.166Z | [OTHER] | Attempt 3122: Error rate 51.19% (target: 15%) -2025-09-15T14:20:44.170Z | [OTHER] | Attempt 3123: Error rate 50% (target: 15%) -2025-09-15T14:20:44.173Z | [OTHER] | Attempt 3124: Error rate 53.25% (target: 15%) -2025-09-15T14:20:44.177Z | [OTHER] | Attempt 3125: Error rate 55.67% (target: 15%) -2025-09-15T14:20:44.181Z | [OTHER] | Attempt 3126: Error rate 58.73% (target: 15%) -2025-09-15T14:20:44.184Z | [OTHER] | Attempt 3127: Error rate 55.16% (target: 15%) -2025-09-15T14:20:44.187Z | [OTHER] | Attempt 3128: Error rate 50.78% (target: 15%) -2025-09-15T14:20:44.191Z | [OTHER] | Attempt 3129: Error rate 52.27% (target: 15%) -2025-09-15T14:20:44.194Z | [OTHER] | Attempt 3130: Error rate 52.78% (target: 15%) -2025-09-15T14:20:44.198Z | [OTHER] | Attempt 3131: Error rate 57.78% (target: 15%) -2025-09-15T14:20:44.201Z | [OTHER] | Attempt 3132: Error rate 53.4% (target: 15%) -2025-09-15T14:20:44.205Z | [OTHER] | Attempt 3133: Error rate 55.67% (target: 15%) -2025-09-15T14:20:44.208Z | [OTHER] | Attempt 3134: Error rate 56.12% (target: 15%) -2025-09-15T14:20:44.212Z | [OTHER] | Attempt 3135: Error rate 61.74% (target: 15%) -2025-09-15T14:20:44.215Z | [OTHER] | Attempt 3136: Error rate 48.68% (target: 15%) -2025-09-15T14:20:44.218Z | [OTHER] | Attempt 3137: Error rate 48.84% (target: 15%) -2025-09-15T14:20:44.222Z | [OTHER] | Attempt 3138: Error rate 49.67% (target: 15%) -2025-09-15T14:20:44.225Z | [OTHER] | Attempt 3139: Error rate 48.15% (target: 15%) -2025-09-15T14:20:44.229Z | [OTHER] | Attempt 3140: Error rate 48.84% (target: 15%) -2025-09-15T14:20:44.232Z | [OTHER] | Attempt 3141: Error rate 61.79% (target: 15%) -2025-09-15T14:20:44.236Z | [OTHER] | Attempt 3142: Error rate 57.36% (target: 15%) -2025-09-15T14:20:44.240Z | [OTHER] | Attempt 3143: Error rate 50.71% (target: 15%) -2025-09-15T14:20:44.244Z | [OTHER] | Attempt 3144: Error rate 49.64% (target: 15%) -2025-09-15T14:20:44.247Z | [OTHER] | Attempt 3145: Error rate 55.16% (target: 15%) -2025-09-15T14:20:44.251Z | [OTHER] | Attempt 3146: Error rate 49.61% (target: 15%) -2025-09-15T14:20:44.254Z | [OTHER] | Attempt 3147: Error rate 52.71% (target: 15%) -2025-09-15T14:20:44.258Z | [OTHER] | Attempt 3148: Error rate 45.93% (target: 15%) -2025-09-15T14:20:44.261Z | [OTHER] | Attempt 3149: Error rate 56.1% (target: 15%) -2025-09-15T14:20:44.265Z | [OTHER] | Attempt 3150: Error rate 55.78% (target: 15%) -2025-09-15T14:20:44.268Z | [OTHER] | Attempt 3151: Error rate 57.04% (target: 15%) -2025-09-15T14:20:44.272Z | [OTHER] | Attempt 3152: Error rate 54.86% (target: 15%) -2025-09-15T14:20:44.275Z | [OTHER] | Attempt 3153: Error rate 49.61% (target: 15%) -2025-09-15T14:20:44.279Z | [OTHER] | Attempt 3154: Error rate 55.42% (target: 15%) -2025-09-15T14:20:44.282Z | [OTHER] | Attempt 3155: Error rate 57.75% (target: 15%) -2025-09-15T14:20:44.286Z | [OTHER] | Attempt 3156: Error rate 58.71% (target: 15%) -2025-09-15T14:20:44.289Z | [OTHER] | Attempt 3157: Error rate 52.85% (target: 15%) -2025-09-15T14:20:44.293Z | [OTHER] | Attempt 3158: Error rate 50.38% (target: 15%) -2025-09-15T14:20:44.297Z | [OTHER] | Attempt 3159: Error rate 54.92% (target: 15%) -2025-09-15T14:20:44.301Z | [OTHER] | Attempt 3160: Error rate 56.14% (target: 15%) -2025-09-15T14:20:44.304Z | [OTHER] | Attempt 3161: Error rate 56.75% (target: 15%) -2025-09-15T14:20:44.307Z | [OTHER] | Attempt 3162: Error rate 43.48% (target: 15%) -2025-09-15T14:20:44.311Z | [OTHER] | Attempt 3163: Error rate 47.22% (target: 15%) -2025-09-15T14:20:44.315Z | [OTHER] | Attempt 3164: Error rate 63.48% (target: 15%) -2025-09-15T14:20:44.318Z | [OTHER] | Attempt 3165: Error rate 56.35% (target: 15%) -2025-09-15T14:20:44.322Z | [OTHER] | Attempt 3166: Error rate 50.74% (target: 15%) -2025-09-15T14:20:44.325Z | [OTHER] | Attempt 3167: Error rate 50.79% (target: 15%) -2025-09-15T14:20:44.330Z | [OTHER] | Attempt 3168: Error rate 43.06% (target: 15%) -2025-09-15T14:20:44.333Z | [OTHER] | Attempt 3169: Error rate 45.63% (target: 15%) -2025-09-15T14:20:44.337Z | [OTHER] | Attempt 3170: Error rate 52.08% (target: 15%) -2025-09-15T14:20:44.341Z | [OTHER] | Attempt 3171: Error rate 49.62% (target: 15%) -2025-09-15T14:20:44.345Z | [OTHER] | Attempt 3172: Error rate 48.45% (target: 15%) -2025-09-15T14:20:44.348Z | [OTHER] | Attempt 3173: Error rate 53.9% (target: 15%) -2025-09-15T14:20:44.352Z | [OTHER] | Attempt 3174: Error rate 48.84% (target: 15%) -2025-09-15T14:20:44.355Z | [OTHER] | Attempt 3175: Error rate 45.74% (target: 15%) -2025-09-15T14:20:44.359Z | [OTHER] | Attempt 3176: Error rate 58.89% (target: 15%) -2025-09-15T14:20:44.362Z | [OTHER] | Attempt 3177: Error rate 51.19% (target: 15%) -2025-09-15T14:20:44.366Z | [OTHER] | Attempt 3178: Error rate 48.45% (target: 15%) -2025-09-15T14:20:44.369Z | [OTHER] | Attempt 3179: Error rate 54.92% (target: 15%) -2025-09-15T14:20:44.373Z | [OTHER] | Attempt 3180: Error rate 53.25% (target: 15%) -2025-09-15T14:20:44.376Z | [OTHER] | Attempt 3181: Error rate 55.43% (target: 15%) -2025-09-15T14:20:44.380Z | [OTHER] | Attempt 3182: Error rate 52.38% (target: 15%) -2025-09-15T14:20:44.383Z | [OTHER] | Attempt 3183: Error rate 50.37% (target: 15%) -2025-09-15T14:20:44.387Z | [OTHER] | Attempt 3184: Error rate 59% (target: 15%) -2025-09-15T14:20:44.391Z | [OTHER] | Attempt 3185: Error rate 56.88% (target: 15%) -2025-09-15T14:20:44.395Z | [OTHER] | Attempt 3186: Error rate 53.42% (target: 15%) -2025-09-15T14:20:44.398Z | [OTHER] | Attempt 3187: Error rate 53.7% (target: 15%) -2025-09-15T14:20:44.402Z | [OTHER] | Attempt 3188: Error rate 47.46% (target: 15%) -2025-09-15T14:20:44.405Z | [OTHER] | Attempt 3189: Error rate 61.11% (target: 15%) -2025-09-15T14:20:44.409Z | [OTHER] | Attempt 3190: Error rate 50.4% (target: 15%) -2025-09-15T14:20:44.413Z | [OTHER] | Attempt 3191: Error rate 48.15% (target: 15%) -2025-09-15T14:20:44.416Z | [OTHER] | Attempt 3192: Error rate 49.22% (target: 15%) -2025-09-15T14:20:44.420Z | [OTHER] | Attempt 3193: Error rate 44.57% (target: 15%) -2025-09-15T14:20:44.423Z | [OTHER] | Attempt 3194: Error rate 60.61% (target: 15%) -2025-09-15T14:20:44.427Z | [OTHER] | Attempt 3195: Error rate 57.36% (target: 15%) -2025-09-15T14:20:44.431Z | [OTHER] | Attempt 3196: Error rate 52.27% (target: 15%) -2025-09-15T14:20:44.434Z | [OTHER] | Attempt 3197: Error rate 53.88% (target: 15%) -2025-09-15T14:20:44.438Z | [OTHER] | Attempt 3198: Error rate 53.33% (target: 15%) -2025-09-15T14:20:44.442Z | [OTHER] | Attempt 3199: Error rate 46.83% (target: 15%) -2025-09-15T14:20:44.446Z | [OTHER] | Attempt 3200: Error rate 56.3% (target: 15%) -2025-09-15T14:20:44.449Z | [OTHER] | Attempt 3201: Error rate 51.25% (target: 15%) -2025-09-15T14:20:44.454Z | [OTHER] | Attempt 3202: Error rate 42.5% (target: 15%) -2025-09-15T14:20:44.457Z | [OTHER] | Attempt 3203: Error rate 45.18% (target: 15%) -2025-09-15T14:20:44.460Z | [OTHER] | Attempt 3204: Error rate 48.78% (target: 15%) -2025-09-15T14:20:44.464Z | [OTHER] | Attempt 3205: Error rate 53.79% (target: 15%) -2025-09-15T14:20:44.468Z | [OTHER] | Attempt 3206: Error rate 54.08% (target: 15%) -2025-09-15T14:20:44.471Z | [OTHER] | Attempt 3207: Error rate 50% (target: 15%) -2025-09-15T14:20:44.475Z | [OTHER] | Attempt 3208: Error rate 45.08% (target: 15%) -2025-09-15T14:20:44.479Z | [OTHER] | Attempt 3209: Error rate 50.76% (target: 15%) -2025-09-15T14:20:44.483Z | [OTHER] | Attempt 3210: Error rate 43.8% (target: 15%) -2025-09-15T14:20:44.486Z | [OTHER] | Attempt 3211: Error rate 57.32% (target: 15%) -2025-09-15T14:20:44.490Z | [OTHER] | Attempt 3212: Error rate 57.92% (target: 15%) -2025-09-15T14:20:44.493Z | [OTHER] | Attempt 3213: Error rate 47.22% (target: 15%) -2025-09-15T14:20:44.498Z | [OTHER] | Attempt 3214: Error rate 53.75% (target: 15%) -2025-09-15T14:20:44.502Z | [OTHER] | Attempt 3215: Error rate 51.48% (target: 15%) -2025-09-15T14:20:44.506Z | [OTHER] | Attempt 3216: Error rate 47.15% (target: 15%) -2025-09-15T14:20:44.509Z | [OTHER] | Attempt 3217: Error rate 61.63% (target: 15%) -2025-09-15T14:20:44.513Z | [OTHER] | Attempt 3218: Error rate 54.17% (target: 15%) -2025-09-15T14:20:44.516Z | [OTHER] | Attempt 3219: Error rate 48.19% (target: 15%) -2025-09-15T14:20:44.520Z | [OTHER] | Attempt 3220: Error rate 50% (target: 15%) -2025-09-15T14:20:44.523Z | [OTHER] | Attempt 3221: Error rate 48.94% (target: 15%) -2025-09-15T14:20:44.527Z | [OTHER] | Attempt 3222: Error rate 53.25% (target: 15%) -2025-09-15T14:20:44.530Z | [OTHER] | Attempt 3223: Error rate 55.21% (target: 15%) -2025-09-15T14:20:44.534Z | [OTHER] | Attempt 3224: Error rate 56.59% (target: 15%) -2025-09-15T14:20:44.538Z | [OTHER] | Attempt 3225: Error rate 61.48% (target: 15%) -2025-09-15T14:20:44.541Z | [OTHER] | Attempt 3226: Error rate 43.94% (target: 15%) -2025-09-15T14:20:44.544Z | [OTHER] | Attempt 3227: Error rate 53.79% (target: 15%) -2025-09-15T14:20:44.548Z | [OTHER] | Attempt 3228: Error rate 57.09% (target: 15%) -2025-09-15T14:20:44.552Z | [OTHER] | Attempt 3229: Error rate 57.61% (target: 15%) -2025-09-15T14:20:44.555Z | [OTHER] | Attempt 3230: Error rate 56.44% (target: 15%) -2025-09-15T14:20:44.559Z | [OTHER] | Attempt 3231: Error rate 47.87% (target: 15%) -2025-09-15T14:20:44.562Z | [OTHER] | Attempt 3232: Error rate 58.14% (target: 15%) -2025-09-15T14:20:44.566Z | [OTHER] | Attempt 3233: Error rate 55.07% (target: 15%) -2025-09-15T14:20:44.570Z | [OTHER] | Attempt 3234: Error rate 53.26% (target: 15%) -2025-09-15T14:20:44.573Z | [OTHER] | Attempt 3235: Error rate 49.6% (target: 15%) -2025-09-15T14:20:44.577Z | [OTHER] | Attempt 3236: Error rate 51.71% (target: 15%) -2025-09-15T14:20:44.581Z | [OTHER] | Attempt 3237: Error rate 55.28% (target: 15%) -2025-09-15T14:20:44.585Z | [OTHER] | Attempt 3238: Error rate 48.94% (target: 15%) -2025-09-15T14:20:44.589Z | [OTHER] | Attempt 3239: Error rate 50.4% (target: 15%) -2025-09-15T14:20:44.592Z | [OTHER] | Attempt 3240: Error rate 53.57% (target: 15%) -2025-09-15T14:20:44.596Z | [OTHER] | Attempt 3241: Error rate 49.22% (target: 15%) -2025-09-15T14:20:44.600Z | [OTHER] | Attempt 3242: Error rate 55.81% (target: 15%) -2025-09-15T14:20:44.604Z | [OTHER] | Attempt 3243: Error rate 48.29% (target: 15%) -2025-09-15T14:20:44.608Z | [OTHER] | Attempt 3244: Error rate 55.93% (target: 15%) -2025-09-15T14:20:44.611Z | [OTHER] | Attempt 3245: Error rate 43.8% (target: 15%) -2025-09-15T14:20:44.615Z | [OTHER] | Attempt 3246: Error rate 59.13% (target: 15%) -2025-09-15T14:20:44.619Z | [OTHER] | Attempt 3247: Error rate 50.74% (target: 15%) -2025-09-15T14:20:44.623Z | [OTHER] | Attempt 3248: Error rate 53.33% (target: 15%) -2025-09-15T14:20:44.626Z | [OTHER] | Attempt 3249: Error rate 47.92% (target: 15%) -2025-09-15T14:20:44.631Z | [OTHER] | Attempt 3250: Error rate 48.11% (target: 15%) -2025-09-15T14:20:44.634Z | [OTHER] | Attempt 3251: Error rate 64.33% (target: 15%) -2025-09-15T14:20:44.638Z | [OTHER] | Attempt 3252: Error rate 56.1% (target: 15%) -2025-09-15T14:20:44.641Z | [OTHER] | Attempt 3253: Error rate 58.75% (target: 15%) -2025-09-15T14:20:44.645Z | [OTHER] | Attempt 3254: Error rate 54.44% (target: 15%) -2025-09-15T14:20:44.649Z | [OTHER] | Attempt 3255: Error rate 54.17% (target: 15%) -2025-09-15T14:20:44.653Z | [OTHER] | Attempt 3256: Error rate 46.03% (target: 15%) -2025-09-15T14:20:44.656Z | [OTHER] | Attempt 3257: Error rate 44.05% (target: 15%) -2025-09-15T14:20:44.660Z | [OTHER] | Attempt 3258: Error rate 46.75% (target: 15%) -2025-09-15T14:20:44.664Z | [OTHER] | Attempt 3259: Error rate 49.22% (target: 15%) -2025-09-15T14:20:44.667Z | [OTHER] | Attempt 3260: Error rate 46.12% (target: 15%) -2025-09-15T14:20:44.671Z | [OTHER] | Attempt 3261: Error rate 54.65% (target: 15%) -2025-09-15T14:20:44.675Z | [OTHER] | Attempt 3262: Error rate 52.27% (target: 15%) -2025-09-15T14:20:44.678Z | [OTHER] | Attempt 3263: Error rate 55% (target: 15%) -2025-09-15T14:20:44.682Z | [OTHER] | Attempt 3264: Error rate 44.2% (target: 15%) -2025-09-15T14:20:44.685Z | [OTHER] | Attempt 3265: Error rate 53.33% (target: 15%) -2025-09-15T14:20:44.690Z | [OTHER] | Attempt 3266: Error rate 52.17% (target: 15%) -2025-09-15T14:20:44.694Z | [OTHER] | Attempt 3267: Error rate 50% (target: 15%) -2025-09-15T14:20:44.697Z | [OTHER] | Attempt 3268: Error rate 65.22% (target: 15%) -2025-09-15T14:20:44.701Z | [OTHER] | Attempt 3269: Error rate 52.17% (target: 15%) -2025-09-15T14:20:44.705Z | [OTHER] | Attempt 3270: Error rate 48.89% (target: 15%) -2025-09-15T14:20:44.709Z | [OTHER] | Attempt 3271: Error rate 41.67% (target: 15%) -2025-09-15T14:20:44.713Z | [OTHER] | Attempt 3272: Error rate 44.33% (target: 15%) -2025-09-15T14:20:44.716Z | [OTHER] | Attempt 3273: Error rate 49.29% (target: 15%) -2025-09-15T14:20:44.720Z | [OTHER] | Attempt 3274: Error rate 49.21% (target: 15%) -2025-09-15T14:20:44.723Z | [OTHER] | Attempt 3275: Error rate 53.57% (target: 15%) -2025-09-15T14:20:44.727Z | [OTHER] | Attempt 3276: Error rate 50.79% (target: 15%) -2025-09-15T14:20:44.731Z | [OTHER] | Attempt 3277: Error rate 62.39% (target: 15%) -2025-09-15T14:20:44.734Z | [OTHER] | Attempt 3278: Error rate 56.03% (target: 15%) -2025-09-15T14:20:44.738Z | [OTHER] | Attempt 3279: Error rate 49.24% (target: 15%) -2025-09-15T14:20:44.742Z | [OTHER] | Attempt 3280: Error rate 52.78% (target: 15%) -2025-09-15T14:20:44.746Z | [OTHER] | Attempt 3281: Error rate 54.17% (target: 15%) -2025-09-15T14:20:44.750Z | [OTHER] | Attempt 3282: Error rate 56.35% (target: 15%) -2025-09-15T14:20:44.754Z | [OTHER] | Attempt 3283: Error rate 59.47% (target: 15%) -2025-09-15T14:20:44.758Z | [OTHER] | Attempt 3284: Error rate 51.14% (target: 15%) -2025-09-15T14:20:44.763Z | [OTHER] | Attempt 3285: Error rate 54.26% (target: 15%) -2025-09-15T14:20:44.766Z | [OTHER] | Attempt 3286: Error rate 51.11% (target: 15%) -2025-09-15T14:20:44.770Z | [OTHER] | Attempt 3287: Error rate 46.51% (target: 15%) -2025-09-15T14:20:44.774Z | [OTHER] | Attempt 3288: Error rate 56.02% (target: 15%) -2025-09-15T14:20:44.777Z | [OTHER] | Attempt 3289: Error rate 46.75% (target: 15%) -2025-09-15T14:20:44.781Z | [OTHER] | Attempt 3290: Error rate 53.41% (target: 15%) -2025-09-15T14:20:44.785Z | [OTHER] | Attempt 3291: Error rate 50% (target: 15%) -2025-09-15T14:20:44.789Z | [OTHER] | Attempt 3292: Error rate 48.15% (target: 15%) -2025-09-15T14:20:44.793Z | [OTHER] | Attempt 3293: Error rate 50.37% (target: 15%) -2025-09-15T14:20:44.797Z | [OTHER] | Attempt 3294: Error rate 54.35% (target: 15%) -2025-09-15T14:20:44.801Z | [OTHER] | Attempt 3295: Error rate 55.32% (target: 15%) -2025-09-15T14:20:44.804Z | [OTHER] | Attempt 3296: Error rate 44.1% (target: 15%) -2025-09-15T14:20:44.808Z | [OTHER] | Attempt 3297: Error rate 46.53% (target: 15%) -2025-09-15T14:20:44.812Z | [OTHER] | Attempt 3298: Error rate 57.14% (target: 15%) -2025-09-15T14:20:44.816Z | [OTHER] | Attempt 3299: Error rate 47.56% (target: 15%) -2025-09-15T14:20:44.819Z | [OTHER] | Attempt 3300: Error rate 46.74% (target: 15%) -2025-09-15T14:20:44.824Z | [OTHER] | Attempt 3301: Error rate 55.04% (target: 15%) -2025-09-15T14:20:44.827Z | [OTHER] | Attempt 3302: Error rate 50.42% (target: 15%) -2025-09-15T14:20:44.831Z | [OTHER] | Attempt 3303: Error rate 57.36% (target: 15%) -2025-09-15T14:20:44.836Z | [OTHER] | Attempt 3304: Error rate 53.97% (target: 15%) -2025-09-15T14:20:44.839Z | [OTHER] | Attempt 3305: Error rate 54.81% (target: 15%) -2025-09-15T14:20:44.843Z | [OTHER] | Attempt 3306: Error rate 56.1% (target: 15%) -2025-09-15T14:20:44.847Z | [OTHER] | Attempt 3307: Error rate 55.8% (target: 15%) -2025-09-15T14:20:44.851Z | [OTHER] | Attempt 3308: Error rate 48.58% (target: 15%) -2025-09-15T14:20:44.854Z | [OTHER] | Attempt 3309: Error rate 54.47% (target: 15%) -2025-09-15T14:20:44.858Z | [OTHER] | Attempt 3310: Error rate 48.48% (target: 15%) -2025-09-15T14:20:44.861Z | [OTHER] | Attempt 3311: Error rate 56.59% (target: 15%) -2025-09-15T14:20:44.865Z | [OTHER] | Attempt 3312: Error rate 50.72% (target: 15%) -2025-09-15T14:20:44.869Z | [OTHER] | Attempt 3313: Error rate 49.64% (target: 15%) -2025-09-15T14:20:44.873Z | [OTHER] | Attempt 3314: Error rate 53.03% (target: 15%) -2025-09-15T14:20:44.876Z | [OTHER] | Attempt 3315: Error rate 53.33% (target: 15%) -2025-09-15T14:20:44.880Z | [OTHER] | Attempt 3316: Error rate 60.74% (target: 15%) -2025-09-15T14:20:44.884Z | [OTHER] | Attempt 3317: Error rate 58.84% (target: 15%) -2025-09-15T14:20:44.887Z | [OTHER] | Attempt 3318: Error rate 54.07% (target: 15%) -2025-09-15T14:20:44.891Z | [OTHER] | Attempt 3319: Error rate 49.59% (target: 15%) -2025-09-15T14:20:44.895Z | [OTHER] | Attempt 3320: Error rate 54.17% (target: 15%) -2025-09-15T14:20:44.898Z | [OTHER] | Attempt 3321: Error rate 48.23% (target: 15%) -2025-09-15T14:20:44.902Z | [OTHER] | Attempt 3322: Error rate 59.3% (target: 15%) -2025-09-15T14:20:44.906Z | [OTHER] | Attempt 3323: Error rate 48.11% (target: 15%) -2025-09-15T14:20:44.910Z | [OTHER] | Attempt 3324: Error rate 53.75% (target: 15%) -2025-09-15T14:20:44.914Z | [OTHER] | Attempt 3325: Error rate 43.84% (target: 15%) -2025-09-15T14:20:44.918Z | [OTHER] | Attempt 3326: Error rate 55.07% (target: 15%) -2025-09-15T14:20:44.923Z | [OTHER] | Attempt 3327: Error rate 45.93% (target: 15%) -2025-09-15T14:20:44.927Z | [OTHER] | Attempt 3328: Error rate 46.59% (target: 15%) -2025-09-15T14:20:44.931Z | [OTHER] | Attempt 3329: Error rate 53.66% (target: 15%) -2025-09-15T14:20:44.935Z | [OTHER] | Attempt 3330: Error rate 55.04% (target: 15%) -2025-09-15T14:20:44.939Z | [OTHER] | Attempt 3331: Error rate 52.59% (target: 15%) -2025-09-15T14:20:44.943Z | [OTHER] | Attempt 3332: Error rate 54.26% (target: 15%) -2025-09-15T14:20:44.946Z | [OTHER] | Attempt 3333: Error rate 53.1% (target: 15%) -2025-09-15T14:20:44.950Z | [OTHER] | Attempt 3334: Error rate 64.02% (target: 15%) -2025-09-15T14:20:44.953Z | [OTHER] | Attempt 3335: Error rate 46.3% (target: 15%) -2025-09-15T14:20:44.957Z | [OTHER] | Attempt 3336: Error rate 57.04% (target: 15%) -2025-09-15T14:20:44.962Z | [OTHER] | Attempt 3337: Error rate 49.22% (target: 15%) -2025-09-15T14:20:44.965Z | [OTHER] | Attempt 3338: Error rate 53.51% (target: 15%) -2025-09-15T14:20:44.969Z | [OTHER] | Attempt 3339: Error rate 56.59% (target: 15%) -2025-09-15T14:20:44.973Z | [OTHER] | Attempt 3340: Error rate 49.15% (target: 15%) -2025-09-15T14:20:44.977Z | [OTHER] | Attempt 3341: Error rate 53.95% (target: 15%) -2025-09-15T14:20:44.980Z | [OTHER] | Attempt 3342: Error rate 57.36% (target: 15%) -2025-09-15T14:20:44.984Z | [OTHER] | Attempt 3343: Error rate 59.57% (target: 15%) -2025-09-15T14:20:44.988Z | [OTHER] | Attempt 3344: Error rate 50.36% (target: 15%) -2025-09-15T14:20:44.992Z | [OTHER] | Attempt 3345: Error rate 53.66% (target: 15%) -2025-09-15T14:20:44.995Z | [OTHER] | Attempt 3346: Error rate 50.32% (target: 15%) -2025-09-15T14:20:45.000Z | [OTHER] | Attempt 3347: Error rate 49.61% (target: 15%) -2025-09-15T14:20:45.004Z | [OTHER] | Attempt 3348: Error rate 55.04% (target: 15%) -2025-09-15T14:20:45.008Z | [OTHER] | Attempt 3349: Error rate 51.11% (target: 15%) -2025-09-15T14:20:45.012Z | [OTHER] | Attempt 3350: Error rate 54.65% (target: 15%) -2025-09-15T14:20:45.015Z | [OTHER] | Attempt 3351: Error rate 45.53% (target: 15%) -2025-09-15T14:20:45.019Z | [OTHER] | Attempt 3352: Error rate 54.17% (target: 15%) -2025-09-15T14:20:45.023Z | [OTHER] | Attempt 3353: Error rate 63.57% (target: 15%) -2025-09-15T14:20:45.027Z | [OTHER] | Attempt 3354: Error rate 48.41% (target: 15%) -2025-09-15T14:20:45.031Z | [OTHER] | Attempt 3355: Error rate 51.36% (target: 15%) -2025-09-15T14:20:45.035Z | [OTHER] | Attempt 3356: Error rate 47.73% (target: 15%) -2025-09-15T14:20:45.038Z | [OTHER] | Attempt 3357: Error rate 44.12% (target: 15%) -2025-09-15T14:20:45.043Z | [OTHER] | Attempt 3358: Error rate 50% (target: 15%) -2025-09-15T14:20:45.046Z | [OTHER] | Attempt 3359: Error rate 52.33% (target: 15%) -2025-09-15T14:20:45.050Z | [OTHER] | Attempt 3360: Error rate 51.85% (target: 15%) -2025-09-15T14:20:45.053Z | [OTHER] | Attempt 3361: Error rate 49.58% (target: 15%) -2025-09-15T14:20:45.057Z | [OTHER] | Attempt 3362: Error rate 51.25% (target: 15%) -2025-09-15T14:20:45.061Z | [OTHER] | Attempt 3363: Error rate 54.26% (target: 15%) -2025-09-15T14:20:45.065Z | [OTHER] | Attempt 3364: Error rate 50% (target: 15%) -2025-09-15T14:20:45.069Z | [OTHER] | Attempt 3365: Error rate 53.9% (target: 15%) -2025-09-15T14:20:45.072Z | [OTHER] | Attempt 3366: Error rate 50.43% (target: 15%) -2025-09-15T14:20:45.076Z | [OTHER] | Attempt 3367: Error rate 52.59% (target: 15%) -2025-09-15T14:20:45.079Z | [OTHER] | Attempt 3368: Error rate 57.04% (target: 15%) -2025-09-15T14:20:45.084Z | [OTHER] | Attempt 3369: Error rate 47.41% (target: 15%) -2025-09-15T14:20:45.087Z | [OTHER] | Attempt 3370: Error rate 47.62% (target: 15%) -2025-09-15T14:20:45.091Z | [OTHER] | Attempt 3371: Error rate 56.35% (target: 15%) -2025-09-15T14:20:45.094Z | [OTHER] | Attempt 3372: Error rate 52.78% (target: 15%) -2025-09-15T14:20:45.098Z | [OTHER] | Attempt 3373: Error rate 56.75% (target: 15%) -2025-09-15T14:20:45.102Z | [OTHER] | Attempt 3374: Error rate 53.79% (target: 15%) -2025-09-15T14:20:45.105Z | [OTHER] | Attempt 3375: Error rate 48.68% (target: 15%) -2025-09-15T14:20:45.109Z | [OTHER] | Attempt 3376: Error rate 49.62% (target: 15%) -2025-09-15T14:20:45.113Z | [OTHER] | Attempt 3377: Error rate 45.04% (target: 15%) -2025-09-15T14:20:45.116Z | [OTHER] | Attempt 3378: Error rate 53.1% (target: 15%) -2025-09-15T14:20:45.120Z | [OTHER] | Attempt 3379: Error rate 56.25% (target: 15%) -2025-09-15T14:20:45.124Z | [OTHER] | Attempt 3380: Error rate 54.65% (target: 15%) -2025-09-15T14:20:45.127Z | [OTHER] | Attempt 3381: Error rate 47.56% (target: 15%) -2025-09-15T14:20:45.131Z | [OTHER] | Attempt 3382: Error rate 55.78% (target: 15%) -2025-09-15T14:20:45.135Z | [OTHER] | Attempt 3383: Error rate 52.27% (target: 15%) -2025-09-15T14:20:45.139Z | [OTHER] | Attempt 3384: Error rate 52.65% (target: 15%) -2025-09-15T14:20:45.143Z | [OTHER] | Attempt 3385: Error rate 47.41% (target: 15%) -2025-09-15T14:20:45.146Z | [OTHER] | Attempt 3386: Error rate 55.19% (target: 15%) -2025-09-15T14:20:45.150Z | [OTHER] | Attempt 3387: Error rate 45.61% (target: 15%) -2025-09-15T14:20:45.154Z | [OTHER] | Attempt 3388: Error rate 52.85% (target: 15%) -2025-09-15T14:20:45.157Z | [OTHER] | Attempt 3389: Error rate 60.98% (target: 15%) -2025-09-15T14:20:45.161Z | [OTHER] | Attempt 3390: Error rate 51.09% (target: 15%) -2025-09-15T14:20:45.165Z | [OTHER] | Attempt 3391: Error rate 47.92% (target: 15%) -2025-09-15T14:20:45.169Z | [OTHER] | Attempt 3392: Error rate 57.54% (target: 15%) -2025-09-15T14:20:45.174Z | [OTHER] | Attempt 3393: Error rate 45.74% (target: 15%) -2025-09-15T14:20:45.178Z | [OTHER] | Attempt 3394: Error rate 52.67% (target: 15%) -2025-09-15T14:20:45.181Z | [OTHER] | Attempt 3395: Error rate 56.46% (target: 15%) -2025-09-15T14:20:45.186Z | [OTHER] | Attempt 3396: Error rate 54.71% (target: 15%) -2025-09-15T14:20:45.189Z | [OTHER] | Attempt 3397: Error rate 47.04% (target: 15%) -2025-09-15T14:20:45.193Z | [OTHER] | Attempt 3398: Error rate 47.52% (target: 15%) -2025-09-15T14:20:45.196Z | [OTHER] | Attempt 3399: Error rate 56.44% (target: 15%) -2025-09-15T14:20:45.200Z | [OTHER] | Attempt 3400: Error rate 48.48% (target: 15%) -2025-09-15T14:20:45.203Z | [OTHER] | Attempt 3401: Error rate 57.72% (target: 15%) -2025-09-15T14:20:45.207Z | [OTHER] | Attempt 3402: Error rate 58.71% (target: 15%) -2025-09-15T14:20:45.210Z | [OTHER] | Attempt 3403: Error rate 54.65% (target: 15%) -2025-09-15T14:20:45.214Z | [OTHER] | Attempt 3404: Error rate 59.26% (target: 15%) -2025-09-15T14:20:45.218Z | [OTHER] | Attempt 3405: Error rate 51.36% (target: 15%) -2025-09-15T14:20:45.221Z | [OTHER] | Attempt 3406: Error rate 52.22% (target: 15%) -2025-09-15T14:20:45.225Z | [OTHER] | Attempt 3407: Error rate 47.73% (target: 15%) -2025-09-15T14:20:45.229Z | [OTHER] | Attempt 3408: Error rate 54.61% (target: 15%) -2025-09-15T14:20:45.232Z | [OTHER] | Attempt 3409: Error rate 49.6% (target: 15%) -2025-09-15T14:20:45.235Z | [OTHER] | Attempt 3410: Error rate 43.33% (target: 15%) -2025-09-15T14:20:45.240Z | [OTHER] | Attempt 3411: Error rate 47.67% (target: 15%) -2025-09-15T14:20:45.243Z | [OTHER] | Attempt 3412: Error rate 49.24% (target: 15%) -2025-09-15T14:20:45.247Z | [OTHER] | Attempt 3413: Error rate 54.88% (target: 15%) -2025-09-15T14:20:45.252Z | [OTHER] | Attempt 3414: Error rate 58.16% (target: 15%) -2025-09-15T14:20:45.256Z | [OTHER] | Attempt 3415: Error rate 52.27% (target: 15%) -2025-09-15T14:20:45.260Z | [OTHER] | Attempt 3416: Error rate 51.39% (target: 15%) -2025-09-15T14:20:45.263Z | [OTHER] | Attempt 3417: Error rate 50.42% (target: 15%) -2025-09-15T14:20:45.267Z | [OTHER] | Attempt 3418: Error rate 49.61% (target: 15%) -2025-09-15T14:20:45.271Z | [OTHER] | Attempt 3419: Error rate 52.99% (target: 15%) -2025-09-15T14:20:45.274Z | [OTHER] | Attempt 3420: Error rate 52.33% (target: 15%) -2025-09-15T14:20:45.279Z | [OTHER] | Attempt 3421: Error rate 53.13% (target: 15%) -2025-09-15T14:20:45.283Z | [OTHER] | Attempt 3422: Error rate 57.78% (target: 15%) -2025-09-15T14:20:45.286Z | [OTHER] | Attempt 3423: Error rate 51.59% (target: 15%) -2025-09-15T14:20:45.290Z | [OTHER] | Attempt 3424: Error rate 53.66% (target: 15%) -2025-09-15T14:20:45.294Z | [OTHER] | Attempt 3425: Error rate 54.17% (target: 15%) -2025-09-15T14:20:45.298Z | [OTHER] | Attempt 3426: Error rate 50.76% (target: 15%) -2025-09-15T14:20:45.302Z | [OTHER] | Attempt 3427: Error rate 55.69% (target: 15%) -2025-09-15T14:20:45.305Z | [OTHER] | Attempt 3428: Error rate 47.83% (target: 15%) -2025-09-15T14:20:45.309Z | [OTHER] | Attempt 3429: Error rate 53.03% (target: 15%) -2025-09-15T14:20:45.313Z | [OTHER] | Attempt 3430: Error rate 45.35% (target: 15%) -2025-09-15T14:20:45.317Z | [OTHER] | Attempt 3431: Error rate 60.64% (target: 15%) -2025-09-15T14:20:45.321Z | [OTHER] | Attempt 3432: Error rate 60.08% (target: 15%) -2025-09-15T14:20:45.324Z | [OTHER] | Attempt 3433: Error rate 50.71% (target: 15%) -2025-09-15T14:20:45.328Z | [OTHER] | Attempt 3434: Error rate 47.92% (target: 15%) -2025-09-15T14:20:45.332Z | [OTHER] | Attempt 3435: Error rate 62.22% (target: 15%) -2025-09-15T14:20:45.335Z | [OTHER] | Attempt 3436: Error rate 58.13% (target: 15%) -2025-09-15T14:20:45.339Z | [OTHER] | Attempt 3437: Error rate 55.67% (target: 15%) -2025-09-15T14:20:45.343Z | [OTHER] | Attempt 3438: Error rate 49.64% (target: 15%) -2025-09-15T14:20:45.346Z | [OTHER] | Attempt 3439: Error rate 49.24% (target: 15%) -2025-09-15T14:20:45.350Z | [OTHER] | Attempt 3440: Error rate 54.17% (target: 15%) -2025-09-15T14:20:45.354Z | [OTHER] | Attempt 3441: Error rate 48.94% (target: 15%) -2025-09-15T14:20:45.357Z | [OTHER] | Attempt 3442: Error rate 57.97% (target: 15%) -2025-09-15T14:20:45.361Z | [OTHER] | Attempt 3443: Error rate 48.37% (target: 15%) -2025-09-15T14:20:45.364Z | [OTHER] | Attempt 3444: Error rate 44.57% (target: 15%) -2025-09-15T14:20:45.368Z | [OTHER] | Attempt 3445: Error rate 52.7% (target: 15%) -2025-09-15T14:20:45.372Z | [OTHER] | Attempt 3446: Error rate 47.57% (target: 15%) -2025-09-15T14:20:45.376Z | [OTHER] | Attempt 3447: Error rate 48.45% (target: 15%) -2025-09-15T14:20:45.379Z | [OTHER] | Attempt 3448: Error rate 59% (target: 15%) -2025-09-15T14:20:45.383Z | [OTHER] | Attempt 3449: Error rate 48.89% (target: 15%) -2025-09-15T14:20:45.387Z | [OTHER] | Attempt 3450: Error rate 61.81% (target: 15%) -2025-09-15T14:20:45.390Z | [OTHER] | Attempt 3451: Error rate 49.29% (target: 15%) -2025-09-15T14:20:45.395Z | [OTHER] | Attempt 3452: Error rate 43.56% (target: 15%) -2025-09-15T14:20:45.398Z | [OTHER] | Attempt 3453: Error rate 54.86% (target: 15%) -2025-09-15T14:20:45.402Z | [OTHER] | Attempt 3454: Error rate 54.55% (target: 15%) -2025-09-15T14:20:45.406Z | [OTHER] | Attempt 3455: Error rate 56.88% (target: 15%) -2025-09-15T14:20:45.410Z | [OTHER] | Attempt 3456: Error rate 46.51% (target: 15%) -2025-09-15T14:20:45.414Z | [OTHER] | Attempt 3457: Error rate 52.17% (target: 15%) -2025-09-15T14:20:45.418Z | [OTHER] | Attempt 3458: Error rate 52.9% (target: 15%) -2025-09-15T14:20:45.421Z | [OTHER] | Attempt 3459: Error rate 40.53% (target: 15%) -2025-09-15T14:20:45.425Z | [OTHER] | Attempt 3460: Error rate 56.06% (target: 15%) -2025-09-15T14:20:45.429Z | [OTHER] | Attempt 3461: Error rate 53.49% (target: 15%) -2025-09-15T14:20:45.433Z | [OTHER] | Attempt 3462: Error rate 50.76% (target: 15%) -2025-09-15T14:20:45.436Z | [OTHER] | Attempt 3463: Error rate 49.19% (target: 15%) -2025-09-15T14:20:45.440Z | [OTHER] | Attempt 3464: Error rate 55.81% (target: 15%) -2025-09-15T14:20:45.444Z | [OTHER] | Attempt 3465: Error rate 55.81% (target: 15%) -2025-09-15T14:20:45.448Z | [OTHER] | Attempt 3466: Error rate 60.09% (target: 15%) -2025-09-15T14:20:45.452Z | [OTHER] | Attempt 3467: Error rate 51.14% (target: 15%) -2025-09-15T14:20:45.456Z | [OTHER] | Attempt 3468: Error rate 54.88% (target: 15%) -2025-09-15T14:20:45.460Z | [OTHER] | Attempt 3469: Error rate 47.97% (target: 15%) -2025-09-15T14:20:45.463Z | [OTHER] | Attempt 3470: Error rate 47.62% (target: 15%) -2025-09-15T14:20:45.467Z | [OTHER] | Attempt 3471: Error rate 52.17% (target: 15%) -2025-09-15T14:20:45.471Z | [OTHER] | Attempt 3472: Error rate 49.26% (target: 15%) -2025-09-15T14:20:45.477Z | [OTHER] | Attempt 3473: Error rate 55.78% (target: 15%) -2025-09-15T14:20:45.481Z | [OTHER] | Attempt 3474: Error rate 49.22% (target: 15%) -2025-09-15T14:20:45.485Z | [OTHER] | Attempt 3475: Error rate 46.67% (target: 15%) -2025-09-15T14:20:45.489Z | [OTHER] | Attempt 3476: Error rate 55.68% (target: 15%) -2025-09-15T14:20:45.493Z | [OTHER] | Attempt 3477: Error rate 54.07% (target: 15%) -2025-09-15T14:20:45.497Z | [OTHER] | Attempt 3478: Error rate 60.57% (target: 15%) -2025-09-15T14:20:45.502Z | [OTHER] | Attempt 3479: Error rate 53.19% (target: 15%) -2025-09-15T14:20:45.506Z | [OTHER] | Attempt 3480: Error rate 53.99% (target: 15%) -2025-09-15T14:20:45.509Z | [OTHER] | Attempt 3481: Error rate 58.14% (target: 15%) -2025-09-15T14:20:45.513Z | [OTHER] | Attempt 3482: Error rate 50.34% (target: 15%) -2025-09-15T14:20:45.517Z | [OTHER] | Attempt 3483: Error rate 58.16% (target: 15%) -2025-09-15T14:20:45.521Z | [OTHER] | Attempt 3484: Error rate 53.49% (target: 15%) -2025-09-15T14:20:45.525Z | [OTHER] | Attempt 3485: Error rate 51.59% (target: 15%) -2025-09-15T14:20:45.529Z | [OTHER] | Attempt 3486: Error rate 41.67% (target: 15%) -2025-09-15T14:20:45.533Z | [OTHER] | Attempt 3487: Error rate 48.65% (target: 15%) -2025-09-15T14:20:45.538Z | [OTHER] | Attempt 3488: Error rate 43.7% (target: 15%) -2025-09-15T14:20:45.541Z | [OTHER] | Attempt 3489: Error rate 45.45% (target: 15%) -2025-09-15T14:20:45.545Z | [OTHER] | Attempt 3490: Error rate 47.29% (target: 15%) -2025-09-15T14:20:45.549Z | [OTHER] | Attempt 3491: Error rate 52% (target: 15%) -2025-09-15T14:20:45.553Z | [OTHER] | Attempt 3492: Error rate 51.06% (target: 15%) -2025-09-15T14:20:45.557Z | [OTHER] | Attempt 3493: Error rate 58.5% (target: 15%) -2025-09-15T14:20:45.562Z | [OTHER] | Attempt 3494: Error rate 59.92% (target: 15%) -2025-09-15T14:20:45.566Z | [OTHER] | Attempt 3495: Error rate 47.46% (target: 15%) -2025-09-15T14:20:45.569Z | [OTHER] | Attempt 3496: Error rate 40.58% (target: 15%) -2025-09-15T14:20:45.573Z | [OTHER] | Attempt 3497: Error rate 56.75% (target: 15%) -2025-09-15T14:20:45.577Z | [OTHER] | Attempt 3498: Error rate 51.09% (target: 15%) -2025-09-15T14:20:45.581Z | [OTHER] | Attempt 3499: Error rate 54.81% (target: 15%) -2025-09-15T14:20:45.585Z | [OTHER] | Attempt 3500: Error rate 44.96% (target: 15%) -2025-09-15T14:20:45.589Z | [OTHER] | Attempt 3501: Error rate 43.97% (target: 15%) -2025-09-15T14:20:45.593Z | [OTHER] | Attempt 3502: Error rate 47.92% (target: 15%) -2025-09-15T14:20:45.597Z | [OTHER] | Attempt 3503: Error rate 60.26% (target: 15%) -2025-09-15T14:20:45.601Z | [OTHER] | Attempt 3504: Error rate 48.3% (target: 15%) -2025-09-15T14:20:45.605Z | [OTHER] | Attempt 3505: Error rate 53.62% (target: 15%) -2025-09-15T14:20:45.609Z | [OTHER] | Attempt 3506: Error rate 42.03% (target: 15%) -2025-09-15T14:20:45.613Z | [OTHER] | Attempt 3507: Error rate 54.37% (target: 15%) -2025-09-15T14:20:45.617Z | [OTHER] | Attempt 3508: Error rate 54.5% (target: 15%) -2025-09-15T14:20:45.620Z | [OTHER] | Attempt 3509: Error rate 57.75% (target: 15%) -2025-09-15T14:20:45.624Z | [OTHER] | Attempt 3510: Error rate 55.93% (target: 15%) -2025-09-15T14:20:45.628Z | [OTHER] | Attempt 3511: Error rate 58.51% (target: 15%) -2025-09-15T14:20:45.632Z | [OTHER] | Attempt 3512: Error rate 50.74% (target: 15%) -2025-09-15T14:20:45.635Z | [OTHER] | Attempt 3513: Error rate 51.67% (target: 15%) -2025-09-15T14:20:45.639Z | [OTHER] | Attempt 3514: Error rate 50.69% (target: 15%) -2025-09-15T14:20:45.643Z | [OTHER] | Attempt 3515: Error rate 49.65% (target: 15%) -2025-09-15T14:20:45.647Z | [OTHER] | Attempt 3516: Error rate 47.29% (target: 15%) -2025-09-15T14:20:45.651Z | [OTHER] | Attempt 3517: Error rate 57.36% (target: 15%) -2025-09-15T14:20:45.655Z | [OTHER] | Attempt 3518: Error rate 48.11% (target: 15%) -2025-09-15T14:20:45.659Z | [OTHER] | Attempt 3519: Error rate 50.38% (target: 15%) -2025-09-15T14:20:45.662Z | [OTHER] | Attempt 3520: Error rate 56.52% (target: 15%) -2025-09-15T14:20:45.666Z | [OTHER] | Attempt 3521: Error rate 52.33% (target: 15%) -2025-09-15T14:20:45.671Z | [OTHER] | Attempt 3522: Error rate 58.14% (target: 15%) -2025-09-15T14:20:45.674Z | [OTHER] | Attempt 3523: Error rate 46.74% (target: 15%) -2025-09-15T14:20:45.679Z | [OTHER] | Attempt 3524: Error rate 54.26% (target: 15%) -2025-09-15T14:20:45.683Z | [OTHER] | Attempt 3525: Error rate 45.83% (target: 15%) -2025-09-15T14:20:45.687Z | [OTHER] | Attempt 3526: Error rate 50.74% (target: 15%) -2025-09-15T14:20:45.691Z | [OTHER] | Attempt 3527: Error rate 51.89% (target: 15%) -2025-09-15T14:20:45.695Z | [OTHER] | Attempt 3528: Error rate 50.38% (target: 15%) -2025-09-15T14:20:45.698Z | [OTHER] | Attempt 3529: Error rate 53.03% (target: 15%) -2025-09-15T14:20:45.702Z | [OTHER] | Attempt 3530: Error rate 50% (target: 15%) -2025-09-15T14:20:45.706Z | [OTHER] | Attempt 3531: Error rate 48.52% (target: 15%) -2025-09-15T14:20:45.710Z | [OTHER] | Attempt 3532: Error rate 55.07% (target: 15%) -2025-09-15T14:20:45.713Z | [OTHER] | Attempt 3533: Error rate 53.7% (target: 15%) -2025-09-15T14:20:45.717Z | [OTHER] | Attempt 3534: Error rate 48.15% (target: 15%) -2025-09-15T14:20:45.721Z | [OTHER] | Attempt 3535: Error rate 50% (target: 15%) -2025-09-15T14:20:45.724Z | [OTHER] | Attempt 3536: Error rate 57.04% (target: 15%) -2025-09-15T14:20:45.729Z | [OTHER] | Attempt 3537: Error rate 54.07% (target: 15%) -2025-09-15T14:20:45.732Z | [OTHER] | Attempt 3538: Error rate 58.54% (target: 15%) -2025-09-15T14:20:45.736Z | [OTHER] | Attempt 3539: Error rate 51.67% (target: 15%) -2025-09-15T14:20:45.740Z | [OTHER] | Attempt 3540: Error rate 56.75% (target: 15%) -2025-09-15T14:20:45.744Z | [OTHER] | Attempt 3541: Error rate 49.62% (target: 15%) -2025-09-15T14:20:45.747Z | [OTHER] | Attempt 3542: Error rate 53.66% (target: 15%) -2025-09-15T14:20:45.751Z | [OTHER] | Attempt 3543: Error rate 47.73% (target: 15%) -2025-09-15T14:20:45.755Z | [OTHER] | Attempt 3544: Error rate 45.35% (target: 15%) -2025-09-15T14:20:45.759Z | [OTHER] | Attempt 3545: Error rate 61.79% (target: 15%) -2025-09-15T14:20:45.763Z | [OTHER] | Attempt 3546: Error rate 53.79% (target: 15%) -2025-09-15T14:20:45.767Z | [OTHER] | Attempt 3547: Error rate 60.26% (target: 15%) -2025-09-15T14:20:45.771Z | [OTHER] | Attempt 3548: Error rate 54.86% (target: 15%) -2025-09-15T14:20:45.775Z | [OTHER] | Attempt 3549: Error rate 46.03% (target: 15%) -2025-09-15T14:20:45.779Z | [OTHER] | Attempt 3550: Error rate 54.07% (target: 15%) -2025-09-15T14:20:45.782Z | [OTHER] | Attempt 3551: Error rate 54.37% (target: 15%) -2025-09-15T14:20:45.787Z | [OTHER] | Attempt 3552: Error rate 55.21% (target: 15%) -2025-09-15T14:20:45.790Z | [OTHER] | Attempt 3553: Error rate 60.53% (target: 15%) -2025-09-15T14:20:45.794Z | [OTHER] | Attempt 3554: Error rate 51.22% (target: 15%) -2025-09-15T14:20:45.798Z | [OTHER] | Attempt 3555: Error rate 46.97% (target: 15%) -2025-09-15T14:20:45.801Z | [OTHER] | Attempt 3556: Error rate 52.43% (target: 15%) -2025-09-15T14:20:45.806Z | [OTHER] | Attempt 3557: Error rate 54.07% (target: 15%) -2025-09-15T14:20:45.809Z | [OTHER] | Attempt 3558: Error rate 52.9% (target: 15%) -2025-09-15T14:20:45.813Z | [OTHER] | Attempt 3559: Error rate 51.59% (target: 15%) -2025-09-15T14:20:45.817Z | [OTHER] | Attempt 3560: Error rate 54.5% (target: 15%) -2025-09-15T14:20:45.821Z | [OTHER] | Attempt 3561: Error rate 48.48% (target: 15%) -2025-09-15T14:20:45.825Z | [OTHER] | Attempt 3562: Error rate 54.55% (target: 15%) -2025-09-15T14:20:45.828Z | [OTHER] | Attempt 3563: Error rate 56.82% (target: 15%) -2025-09-15T14:20:45.832Z | [OTHER] | Attempt 3564: Error rate 54.51% (target: 15%) -2025-09-15T14:20:45.836Z | [OTHER] | Attempt 3565: Error rate 62.7% (target: 15%) -2025-09-15T14:20:45.840Z | [OTHER] | Attempt 3566: Error rate 56.3% (target: 15%) -2025-09-15T14:20:45.844Z | [OTHER] | Attempt 3567: Error rate 53.47% (target: 15%) -2025-09-15T14:20:45.848Z | [OTHER] | Attempt 3568: Error rate 59.3% (target: 15%) -2025-09-15T14:20:45.852Z | [OTHER] | Attempt 3569: Error rate 57.04% (target: 15%) -2025-09-15T14:20:45.855Z | [OTHER] | Attempt 3570: Error rate 50.88% (target: 15%) -2025-09-15T14:20:45.859Z | [OTHER] | Attempt 3571: Error rate 40.94% (target: 15%) -2025-09-15T14:20:45.863Z | [OTHER] | Attempt 3572: Error rate 51.14% (target: 15%) -2025-09-15T14:20:45.867Z | [OTHER] | Attempt 3573: Error rate 52.5% (target: 15%) -2025-09-15T14:20:45.870Z | [OTHER] | Attempt 3574: Error rate 55.95% (target: 15%) -2025-09-15T14:20:45.874Z | [OTHER] | Attempt 3575: Error rate 60.48% (target: 15%) -2025-09-15T14:20:45.879Z | [OTHER] | Attempt 3576: Error rate 60.42% (target: 15%) -2025-09-15T14:20:45.883Z | [OTHER] | Attempt 3577: Error rate 52.03% (target: 15%) -2025-09-15T14:20:45.886Z | [OTHER] | Attempt 3578: Error rate 48.48% (target: 15%) -2025-09-15T14:20:45.891Z | [OTHER] | Attempt 3579: Error rate 61.24% (target: 15%) -2025-09-15T14:20:45.894Z | [OTHER] | Attempt 3580: Error rate 51.89% (target: 15%) -2025-09-15T14:20:45.898Z | [OTHER] | Attempt 3581: Error rate 43.16% (target: 15%) -2025-09-15T14:20:45.902Z | [OTHER] | Attempt 3582: Error rate 48.06% (target: 15%) -2025-09-15T14:20:45.905Z | [OTHER] | Attempt 3583: Error rate 54.65% (target: 15%) -2025-09-15T14:20:45.909Z | [OTHER] | Attempt 3584: Error rate 51.04% (target: 15%) -2025-09-15T14:20:45.913Z | [OTHER] | Attempt 3585: Error rate 49.58% (target: 15%) -2025-09-15T14:20:45.917Z | [OTHER] | Attempt 3586: Error rate 48.89% (target: 15%) -2025-09-15T14:20:45.921Z | [OTHER] | Attempt 3587: Error rate 48.45% (target: 15%) -2025-09-15T14:20:45.925Z | [OTHER] | Attempt 3588: Error rate 54.37% (target: 15%) -2025-09-15T14:20:45.929Z | [OTHER] | Attempt 3589: Error rate 51.39% (target: 15%) -2025-09-15T14:20:45.933Z | [OTHER] | Attempt 3590: Error rate 53.74% (target: 15%) -2025-09-15T14:20:45.937Z | [OTHER] | Attempt 3591: Error rate 55.81% (target: 15%) -2025-09-15T14:20:45.941Z | [OTHER] | Attempt 3592: Error rate 50.72% (target: 15%) -2025-09-15T14:20:45.945Z | [OTHER] | Attempt 3593: Error rate 53.88% (target: 15%) -2025-09-15T14:20:45.949Z | [OTHER] | Attempt 3594: Error rate 55.93% (target: 15%) -2025-09-15T14:20:45.953Z | [OTHER] | Attempt 3595: Error rate 51.11% (target: 15%) -2025-09-15T14:20:45.957Z | [OTHER] | Attempt 3596: Error rate 54.44% (target: 15%) -2025-09-15T14:20:45.961Z | [OTHER] | Attempt 3597: Error rate 54.26% (target: 15%) -2025-09-15T14:20:45.965Z | [OTHER] | Attempt 3598: Error rate 53.25% (target: 15%) -2025-09-15T14:20:45.969Z | [OTHER] | Attempt 3599: Error rate 48.45% (target: 15%) -2025-09-15T14:20:45.973Z | [OTHER] | Attempt 3600: Error rate 55.43% (target: 15%) -2025-09-15T14:20:45.977Z | [OTHER] | Attempt 3601: Error rate 58.89% (target: 15%) -2025-09-15T14:20:45.981Z | [OTHER] | Attempt 3602: Error rate 49.62% (target: 15%) -2025-09-15T14:20:45.986Z | [OTHER] | Attempt 3603: Error rate 58.33% (target: 15%) -2025-09-15T14:20:45.988Z | [OTHER] | Attempt 3604: Error rate 56.67% (target: 15%) -2025-09-15T14:20:45.992Z | [OTHER] | Attempt 3605: Error rate 45.83% (target: 15%) -2025-09-15T14:20:45.996Z | [OTHER] | Attempt 3606: Error rate 57.64% (target: 15%) -2025-09-15T14:20:46.000Z | [OTHER] | Attempt 3607: Error rate 56.88% (target: 15%) -2025-09-15T14:20:46.004Z | [OTHER] | Attempt 3608: Error rate 56.59% (target: 15%) -2025-09-15T14:20:46.008Z | [OTHER] | Attempt 3609: Error rate 51.48% (target: 15%) -2025-09-15T14:20:46.012Z | [OTHER] | Attempt 3610: Error rate 56.2% (target: 15%) -2025-09-15T14:20:46.016Z | [OTHER] | Attempt 3611: Error rate 57.61% (target: 15%) -2025-09-15T14:20:46.020Z | [OTHER] | Attempt 3612: Error rate 48.02% (target: 15%) -2025-09-15T14:20:46.024Z | [OTHER] | Attempt 3613: Error rate 60.32% (target: 15%) -2025-09-15T14:20:46.028Z | [OTHER] | Attempt 3614: Error rate 48.15% (target: 15%) -2025-09-15T14:20:46.032Z | [OTHER] | Attempt 3615: Error rate 52.71% (target: 15%) -2025-09-15T14:20:46.036Z | [OTHER] | Attempt 3616: Error rate 48.11% (target: 15%) -2025-09-15T14:20:46.040Z | [OTHER] | Attempt 3617: Error rate 56.98% (target: 15%) -2025-09-15T14:20:46.043Z | [OTHER] | Attempt 3618: Error rate 54.81% (target: 15%) -2025-09-15T14:20:46.048Z | [OTHER] | Attempt 3619: Error rate 54.71% (target: 15%) -2025-09-15T14:20:46.053Z | [OTHER] | Attempt 3620: Error rate 50.83% (target: 15%) -2025-09-15T14:20:46.057Z | [OTHER] | Attempt 3621: Error rate 52.72% (target: 15%) -2025-09-15T14:20:46.061Z | [OTHER] | Attempt 3622: Error rate 52.22% (target: 15%) -2025-09-15T14:20:46.066Z | [OTHER] | Attempt 3623: Error rate 50.39% (target: 15%) -2025-09-15T14:20:46.070Z | [OTHER] | Attempt 3624: Error rate 49.62% (target: 15%) -2025-09-15T14:20:46.074Z | [OTHER] | Attempt 3625: Error rate 51.42% (target: 15%) -2025-09-15T14:20:46.078Z | [OTHER] | Attempt 3626: Error rate 54.44% (target: 15%) -2025-09-15T14:20:46.082Z | [OTHER] | Attempt 3627: Error rate 45.35% (target: 15%) -2025-09-15T14:20:46.086Z | [OTHER] | Attempt 3628: Error rate 42.46% (target: 15%) -2025-09-15T14:20:46.090Z | [OTHER] | Attempt 3629: Error rate 52.96% (target: 15%) -2025-09-15T14:20:46.094Z | [OTHER] | Attempt 3630: Error rate 60.28% (target: 15%) -2025-09-15T14:20:46.098Z | [OTHER] | Attempt 3631: Error rate 60.42% (target: 15%) -2025-09-15T14:20:46.102Z | [OTHER] | Attempt 3632: Error rate 50.79% (target: 15%) -2025-09-15T14:20:46.107Z | [OTHER] | Attempt 3633: Error rate 52.38% (target: 15%) -2025-09-15T14:20:46.111Z | [OTHER] | Attempt 3634: Error rate 60.08% (target: 15%) -2025-09-15T14:20:46.115Z | [OTHER] | Attempt 3635: Error rate 57.92% (target: 15%) -2025-09-15T14:20:46.119Z | [OTHER] | Attempt 3636: Error rate 52.48% (target: 15%) -2025-09-15T14:20:46.123Z | [OTHER] | Attempt 3637: Error rate 52.78% (target: 15%) -2025-09-15T14:20:46.127Z | [OTHER] | Attempt 3638: Error rate 50% (target: 15%) -2025-09-15T14:20:46.131Z | [OTHER] | Attempt 3639: Error rate 56.52% (target: 15%) -2025-09-15T14:20:46.134Z | [OTHER] | Attempt 3640: Error rate 50.85% (target: 15%) -2025-09-15T14:20:46.139Z | [OTHER] | Attempt 3641: Error rate 55.19% (target: 15%) -2025-09-15T14:20:46.143Z | [OTHER] | Attempt 3642: Error rate 48.81% (target: 15%) -2025-09-15T14:20:46.146Z | [OTHER] | Attempt 3643: Error rate 48.52% (target: 15%) -2025-09-15T14:20:46.150Z | [OTHER] | Attempt 3644: Error rate 42.06% (target: 15%) -2025-09-15T14:20:46.155Z | [OTHER] | Attempt 3645: Error rate 48.72% (target: 15%) -2025-09-15T14:20:46.158Z | [OTHER] | Attempt 3646: Error rate 51.63% (target: 15%) -2025-09-15T14:20:46.162Z | [OTHER] | Attempt 3647: Error rate 53.79% (target: 15%) -2025-09-15T14:20:46.166Z | [OTHER] | Attempt 3648: Error rate 57.69% (target: 15%) -2025-09-15T14:20:46.170Z | [OTHER] | Attempt 3649: Error rate 48.52% (target: 15%) -2025-09-15T14:20:46.174Z | [OTHER] | Attempt 3650: Error rate 55.3% (target: 15%) -2025-09-15T14:20:46.178Z | [OTHER] | Attempt 3651: Error rate 40.7% (target: 15%) -2025-09-15T14:20:46.182Z | [OTHER] | Attempt 3652: Error rate 61.11% (target: 15%) -2025-09-15T14:20:46.186Z | [OTHER] | Attempt 3653: Error rate 49.63% (target: 15%) -2025-09-15T14:20:46.190Z | [OTHER] | Attempt 3654: Error rate 51.55% (target: 15%) -2025-09-15T14:20:46.194Z | [OTHER] | Attempt 3655: Error rate 57.75% (target: 15%) -2025-09-15T14:20:46.198Z | [OTHER] | Attempt 3656: Error rate 56.44% (target: 15%) -2025-09-15T14:20:46.202Z | [OTHER] | Attempt 3657: Error rate 51.09% (target: 15%) -2025-09-15T14:20:46.206Z | [OTHER] | Attempt 3658: Error rate 49.31% (target: 15%) -2025-09-15T14:20:46.210Z | [OTHER] | Attempt 3659: Error rate 53.7% (target: 15%) -2025-09-15T14:20:46.215Z | [OTHER] | Attempt 3660: Error rate 44.79% (target: 15%) -2025-09-15T14:20:46.218Z | [OTHER] | Attempt 3661: Error rate 51.11% (target: 15%) -2025-09-15T14:20:46.222Z | [OTHER] | Attempt 3662: Error rate 50.79% (target: 15%) -2025-09-15T14:20:46.227Z | [OTHER] | Attempt 3663: Error rate 51.89% (target: 15%) -2025-09-15T14:20:46.231Z | [OTHER] | Attempt 3664: Error rate 48.41% (target: 15%) -2025-09-15T14:20:46.234Z | [OTHER] | Attempt 3665: Error rate 51.48% (target: 15%) -2025-09-15T14:20:46.238Z | [OTHER] | Attempt 3666: Error rate 53.33% (target: 15%) -2025-09-15T14:20:46.242Z | [OTHER] | Attempt 3667: Error rate 55.67% (target: 15%) -2025-09-15T14:20:46.246Z | [OTHER] | Attempt 3668: Error rate 61.51% (target: 15%) -2025-09-15T14:20:46.250Z | [OTHER] | Attempt 3669: Error rate 56.6% (target: 15%) -2025-09-15T14:20:46.254Z | [OTHER] | Attempt 3670: Error rate 51.89% (target: 15%) -2025-09-15T14:20:46.259Z | [OTHER] | Attempt 3671: Error rate 53.26% (target: 15%) -2025-09-15T14:20:46.263Z | [OTHER] | Attempt 3672: Error rate 48.37% (target: 15%) -2025-09-15T14:20:46.267Z | [OTHER] | Attempt 3673: Error rate 45.39% (target: 15%) -2025-09-15T14:20:46.271Z | [OTHER] | Attempt 3674: Error rate 50.72% (target: 15%) -2025-09-15T14:20:46.276Z | [OTHER] | Attempt 3675: Error rate 60.54% (target: 15%) -2025-09-15T14:20:46.279Z | [OTHER] | Attempt 3676: Error rate 51.98% (target: 15%) -2025-09-15T14:20:46.284Z | [OTHER] | Attempt 3677: Error rate 51.59% (target: 15%) -2025-09-15T14:20:46.288Z | [OTHER] | Attempt 3678: Error rate 39.01% (target: 15%) -2025-09-15T14:20:46.292Z | [OTHER] | Attempt 3679: Error rate 48.48% (target: 15%) -2025-09-15T14:20:46.296Z | [OTHER] | Attempt 3680: Error rate 57.8% (target: 15%) -2025-09-15T14:20:46.300Z | [OTHER] | Attempt 3681: Error rate 47.15% (target: 15%) -2025-09-15T14:20:46.304Z | [OTHER] | Attempt 3682: Error rate 58.15% (target: 15%) -2025-09-15T14:20:46.308Z | [OTHER] | Attempt 3683: Error rate 55.19% (target: 15%) -2025-09-15T14:20:46.312Z | [OTHER] | Attempt 3684: Error rate 54.39% (target: 15%) -2025-09-15T14:20:46.316Z | [OTHER] | Attempt 3685: Error rate 58.16% (target: 15%) -2025-09-15T14:20:46.320Z | [OTHER] | Attempt 3686: Error rate 52.9% (target: 15%) -2025-09-15T14:20:46.324Z | [OTHER] | Attempt 3687: Error rate 53.88% (target: 15%) -2025-09-15T14:20:46.328Z | [OTHER] | Attempt 3688: Error rate 47.35% (target: 15%) -2025-09-15T14:20:46.332Z | [OTHER] | Attempt 3689: Error rate 56.25% (target: 15%) -2025-09-15T14:20:46.336Z | [OTHER] | Attempt 3690: Error rate 55.95% (target: 15%) -2025-09-15T14:20:46.340Z | [OTHER] | Attempt 3691: Error rate 51.85% (target: 15%) -2025-09-15T14:20:46.344Z | [OTHER] | Attempt 3692: Error rate 57.94% (target: 15%) -2025-09-15T14:20:46.348Z | [OTHER] | Attempt 3693: Error rate 49.26% (target: 15%) -2025-09-15T14:20:46.352Z | [OTHER] | Attempt 3694: Error rate 49.65% (target: 15%) -2025-09-15T14:20:46.356Z | [OTHER] | Attempt 3695: Error rate 55.81% (target: 15%) -2025-09-15T14:20:46.361Z | [OTHER] | Attempt 3696: Error rate 51.63% (target: 15%) -2025-09-15T14:20:46.365Z | [OTHER] | Attempt 3697: Error rate 60.08% (target: 15%) -2025-09-15T14:20:46.369Z | [OTHER] | Attempt 3698: Error rate 43.9% (target: 15%) -2025-09-15T14:20:46.373Z | [OTHER] | Attempt 3699: Error rate 53.99% (target: 15%) -2025-09-15T14:20:46.377Z | [OTHER] | Attempt 3700: Error rate 51.81% (target: 15%) -2025-09-15T14:20:46.381Z | [OTHER] | Attempt 3701: Error rate 50.74% (target: 15%) -2025-09-15T14:20:46.385Z | [OTHER] | Attempt 3702: Error rate 53.79% (target: 15%) -2025-09-15T14:20:46.389Z | [OTHER] | Attempt 3703: Error rate 50% (target: 15%) -2025-09-15T14:20:46.393Z | [OTHER] | Attempt 3704: Error rate 51.81% (target: 15%) -2025-09-15T14:20:46.399Z | [OTHER] | Attempt 3705: Error rate 52.27% (target: 15%) -2025-09-15T14:20:46.402Z | [OTHER] | Attempt 3706: Error rate 47.83% (target: 15%) -2025-09-15T14:20:46.406Z | [OTHER] | Attempt 3707: Error rate 53.17% (target: 15%) -2025-09-15T14:20:46.411Z | [OTHER] | Attempt 3708: Error rate 42.01% (target: 15%) -2025-09-15T14:20:46.415Z | [OTHER] | Attempt 3709: Error rate 54.65% (target: 15%) -2025-09-15T14:20:46.418Z | [OTHER] | Attempt 3710: Error rate 52.99% (target: 15%) -2025-09-15T14:20:46.422Z | [OTHER] | Attempt 3711: Error rate 64.07% (target: 15%) -2025-09-15T14:20:46.427Z | [OTHER] | Attempt 3712: Error rate 51.55% (target: 15%) -2025-09-15T14:20:46.430Z | [OTHER] | Attempt 3713: Error rate 56.59% (target: 15%) -2025-09-15T14:20:46.435Z | [OTHER] | Attempt 3714: Error rate 49.24% (target: 15%) -2025-09-15T14:20:46.439Z | [OTHER] | Attempt 3715: Error rate 52.38% (target: 15%) -2025-09-15T14:20:46.442Z | [OTHER] | Attempt 3716: Error rate 58.14% (target: 15%) -2025-09-15T14:20:46.446Z | [OTHER] | Attempt 3717: Error rate 60.42% (target: 15%) -2025-09-15T14:20:46.450Z | [OTHER] | Attempt 3718: Error rate 48.48% (target: 15%) -2025-09-15T14:20:46.454Z | [OTHER] | Attempt 3719: Error rate 54.5% (target: 15%) -2025-09-15T14:20:46.458Z | [OTHER] | Attempt 3720: Error rate 53.66% (target: 15%) -2025-09-15T14:20:46.462Z | [OTHER] | Attempt 3721: Error rate 53.82% (target: 15%) -2025-09-15T14:20:46.467Z | [OTHER] | Attempt 3722: Error rate 52.22% (target: 15%) -2025-09-15T14:20:46.471Z | [OTHER] | Attempt 3723: Error rate 43.41% (target: 15%) -2025-09-15T14:20:46.475Z | [OTHER] | Attempt 3724: Error rate 54.07% (target: 15%) -2025-09-15T14:20:46.479Z | [OTHER] | Attempt 3725: Error rate 41.67% (target: 15%) -2025-09-15T14:20:46.484Z | [OTHER] | Attempt 3726: Error rate 52.78% (target: 15%) -2025-09-15T14:20:46.488Z | [OTHER] | Attempt 3727: Error rate 50% (target: 15%) -2025-09-15T14:20:46.492Z | [OTHER] | Attempt 3728: Error rate 51.59% (target: 15%) -2025-09-15T14:20:46.496Z | [OTHER] | Attempt 3729: Error rate 50.4% (target: 15%) -2025-09-15T14:20:46.500Z | [OTHER] | Attempt 3730: Error rate 49.15% (target: 15%) -2025-09-15T14:20:46.504Z | [OTHER] | Attempt 3731: Error rate 51.81% (target: 15%) -2025-09-15T14:20:46.508Z | [OTHER] | Attempt 3732: Error rate 42.96% (target: 15%) -2025-09-15T14:20:46.512Z | [OTHER] | Attempt 3733: Error rate 52.08% (target: 15%) -2025-09-15T14:20:46.516Z | [OTHER] | Attempt 3734: Error rate 51.16% (target: 15%) -2025-09-15T14:20:46.520Z | [OTHER] | Attempt 3735: Error rate 55.56% (target: 15%) -2025-09-15T14:20:46.524Z | [OTHER] | Attempt 3736: Error rate 56.82% (target: 15%) -2025-09-15T14:20:46.528Z | [OTHER] | Attempt 3737: Error rate 45.56% (target: 15%) -2025-09-15T14:20:46.532Z | [OTHER] | Attempt 3738: Error rate 53.75% (target: 15%) -2025-09-15T14:20:46.536Z | [OTHER] | Attempt 3739: Error rate 51.94% (target: 15%) -2025-09-15T14:20:46.540Z | [OTHER] | Attempt 3740: Error rate 54.17% (target: 15%) -2025-09-15T14:20:46.544Z | [OTHER] | Attempt 3741: Error rate 50% (target: 15%) -2025-09-15T14:20:46.549Z | [OTHER] | Attempt 3742: Error rate 53.49% (target: 15%) -2025-09-15T14:20:46.553Z | [OTHER] | Attempt 3743: Error rate 41.67% (target: 15%) -2025-09-15T14:20:46.557Z | [OTHER] | Attempt 3744: Error rate 51.63% (target: 15%) -2025-09-15T14:20:46.561Z | [OTHER] | Attempt 3745: Error rate 55.93% (target: 15%) -2025-09-15T14:20:46.565Z | [OTHER] | Attempt 3746: Error rate 50.74% (target: 15%) -2025-09-15T14:20:46.570Z | [OTHER] | Attempt 3747: Error rate 48.84% (target: 15%) -2025-09-15T14:20:46.574Z | [OTHER] | Attempt 3748: Error rate 60.47% (target: 15%) -2025-09-15T14:20:46.578Z | [OTHER] | Attempt 3749: Error rate 55.81% (target: 15%) -2025-09-15T14:20:46.582Z | [OTHER] | Attempt 3750: Error rate 54.17% (target: 15%) -2025-09-15T14:20:46.586Z | [OTHER] | Attempt 3751: Error rate 58.33% (target: 15%) -2025-09-15T14:20:46.590Z | [OTHER] | Attempt 3752: Error rate 52.65% (target: 15%) -2025-09-15T14:20:46.594Z | [OTHER] | Attempt 3753: Error rate 50% (target: 15%) -2025-09-15T14:20:46.598Z | [OTHER] | Attempt 3754: Error rate 52.85% (target: 15%) -2025-09-15T14:20:46.602Z | [OTHER] | Attempt 3755: Error rate 48.86% (target: 15%) -2025-09-15T14:20:46.606Z | [OTHER] | Attempt 3756: Error rate 52.78% (target: 15%) -2025-09-15T14:20:46.611Z | [OTHER] | Attempt 3757: Error rate 47.92% (target: 15%) -2025-09-15T14:20:46.615Z | [OTHER] | Attempt 3758: Error rate 55.16% (target: 15%) -2025-09-15T14:20:46.619Z | [OTHER] | Attempt 3759: Error rate 50% (target: 15%) -2025-09-15T14:20:46.622Z | [OTHER] | Attempt 3760: Error rate 57.2% (target: 15%) -2025-09-15T14:20:46.626Z | [OTHER] | Attempt 3761: Error rate 52.71% (target: 15%) -2025-09-15T14:20:46.630Z | [OTHER] | Attempt 3762: Error rate 53.62% (target: 15%) -2025-09-15T14:20:46.635Z | [OTHER] | Attempt 3763: Error rate 48.61% (target: 15%) -2025-09-15T14:20:46.639Z | [OTHER] | Attempt 3764: Error rate 57.92% (target: 15%) -2025-09-15T14:20:46.643Z | [OTHER] | Attempt 3765: Error rate 64.39% (target: 15%) -2025-09-15T14:20:46.647Z | [OTHER] | Attempt 3766: Error rate 54.51% (target: 15%) -2025-09-15T14:20:46.651Z | [OTHER] | Attempt 3767: Error rate 48.89% (target: 15%) -2025-09-15T14:20:46.655Z | [OTHER] | Attempt 3768: Error rate 54.42% (target: 15%) -2025-09-15T14:20:46.659Z | [OTHER] | Attempt 3769: Error rate 63.82% (target: 15%) -2025-09-15T14:20:46.663Z | [OTHER] | Attempt 3770: Error rate 47.78% (target: 15%) -2025-09-15T14:20:46.667Z | [OTHER] | Attempt 3771: Error rate 51.14% (target: 15%) -2025-09-15T14:20:46.670Z | [OTHER] | Attempt 3772: Error rate 44.07% (target: 15%) -2025-09-15T14:20:46.674Z | [OTHER] | Attempt 3773: Error rate 54.17% (target: 15%) -2025-09-15T14:20:46.678Z | [OTHER] | Attempt 3774: Error rate 53.7% (target: 15%) -2025-09-15T14:20:46.683Z | [OTHER] | Attempt 3775: Error rate 50.98% (target: 15%) -2025-09-15T14:20:46.687Z | [OTHER] | Attempt 3776: Error rate 56.67% (target: 15%) -2025-09-15T14:20:46.691Z | [OTHER] | Attempt 3777: Error rate 51.19% (target: 15%) -2025-09-15T14:20:46.695Z | [OTHER] | Attempt 3778: Error rate 62.32% (target: 15%) -2025-09-15T14:20:46.699Z | [OTHER] | Attempt 3779: Error rate 51.14% (target: 15%) -2025-09-15T14:20:46.703Z | [OTHER] | Attempt 3780: Error rate 54.96% (target: 15%) -2025-09-15T14:20:46.707Z | [OTHER] | Attempt 3781: Error rate 48.55% (target: 15%) -2025-09-15T14:20:46.711Z | [OTHER] | Attempt 3782: Error rate 53.1% (target: 15%) -2025-09-15T14:20:46.715Z | [OTHER] | Attempt 3783: Error rate 51.14% (target: 15%) -2025-09-15T14:20:46.719Z | [OTHER] | Attempt 3784: Error rate 49.32% (target: 15%) -2025-09-15T14:20:46.723Z | [OTHER] | Attempt 3785: Error rate 40.42% (target: 15%) -2025-09-15T14:20:46.727Z | [OTHER] | Attempt 3786: Error rate 48.78% (target: 15%) -2025-09-15T14:20:46.731Z | [OTHER] | Attempt 3787: Error rate 59.13% (target: 15%) -2025-09-15T14:20:46.737Z | [OTHER] | Attempt 3788: Error rate 51.22% (target: 15%) -2025-09-15T14:20:46.740Z | [OTHER] | Attempt 3789: Error rate 48.48% (target: 15%) -2025-09-15T14:20:46.744Z | [OTHER] | Attempt 3790: Error rate 59.38% (target: 15%) -2025-09-15T14:20:46.748Z | [OTHER] | Attempt 3791: Error rate 53.33% (target: 15%) -2025-09-15T14:20:46.752Z | [OTHER] | Attempt 3792: Error rate 51.55% (target: 15%) -2025-09-15T14:20:46.756Z | [OTHER] | Attempt 3793: Error rate 51.89% (target: 15%) -2025-09-15T14:20:46.760Z | [OTHER] | Attempt 3794: Error rate 45.74% (target: 15%) -2025-09-15T14:20:46.765Z | [OTHER] | Attempt 3795: Error rate 51.48% (target: 15%) -2025-09-15T14:20:46.769Z | [OTHER] | Attempt 3796: Error rate 48.91% (target: 15%) -2025-09-15T14:20:46.773Z | [OTHER] | Attempt 3797: Error rate 42.39% (target: 15%) -2025-09-15T14:20:46.777Z | [OTHER] | Attempt 3798: Error rate 51.14% (target: 15%) -2025-09-15T14:20:46.781Z | [OTHER] | Attempt 3799: Error rate 49.62% (target: 15%) -2025-09-15T14:20:46.785Z | [OTHER] | Attempt 3800: Error rate 56.2% (target: 15%) -2025-09-15T14:20:46.789Z | [OTHER] | Attempt 3801: Error rate 55.83% (target: 15%) -2025-09-15T14:20:46.793Z | [OTHER] | Attempt 3802: Error rate 51.85% (target: 15%) -2025-09-15T14:20:46.797Z | [OTHER] | Attempt 3803: Error rate 41.67% (target: 15%) -2025-09-15T14:20:46.801Z | [OTHER] | Attempt 3804: Error rate 55.3% (target: 15%) -2025-09-15T14:20:46.805Z | [OTHER] | Attempt 3805: Error rate 56.59% (target: 15%) -2025-09-15T14:20:46.809Z | [OTHER] | Attempt 3806: Error rate 56.75% (target: 15%) -2025-09-15T14:20:46.813Z | [OTHER] | Attempt 3807: Error rate 50.83% (target: 15%) -2025-09-15T14:20:46.817Z | [OTHER] | Attempt 3808: Error rate 51.02% (target: 15%) -2025-09-15T14:20:46.821Z | [OTHER] | Attempt 3809: Error rate 47.62% (target: 15%) -2025-09-15T14:20:46.825Z | [OTHER] | Attempt 3810: Error rate 62.12% (target: 15%) -2025-09-15T14:20:46.829Z | [OTHER] | Attempt 3811: Error rate 52.38% (target: 15%) -2025-09-15T14:20:46.833Z | [OTHER] | Attempt 3812: Error rate 46.58% (target: 15%) -2025-09-15T14:20:46.837Z | [OTHER] | Attempt 3813: Error rate 45.18% (target: 15%) -2025-09-15T14:20:46.842Z | [OTHER] | Attempt 3814: Error rate 53.55% (target: 15%) -2025-09-15T14:20:46.846Z | [OTHER] | Attempt 3815: Error rate 53.26% (target: 15%) -2025-09-15T14:20:46.850Z | [OTHER] | Attempt 3816: Error rate 47.73% (target: 15%) -2025-09-15T14:20:46.854Z | [OTHER] | Attempt 3817: Error rate 58.77% (target: 15%) -2025-09-15T14:20:46.858Z | [OTHER] | Attempt 3818: Error rate 49.28% (target: 15%) -2025-09-15T14:20:46.862Z | [OTHER] | Attempt 3819: Error rate 57.45% (target: 15%) -2025-09-15T14:20:46.866Z | [OTHER] | Attempt 3820: Error rate 50% (target: 15%) -2025-09-15T14:20:46.870Z | [OTHER] | Attempt 3821: Error rate 39.32% (target: 15%) -2025-09-15T14:20:46.874Z | [OTHER] | Attempt 3822: Error rate 49.59% (target: 15%) -2025-09-15T14:20:46.878Z | [OTHER] | Attempt 3823: Error rate 54.92% (target: 15%) -2025-09-15T14:20:46.883Z | [OTHER] | Attempt 3824: Error rate 50% (target: 15%) -2025-09-15T14:20:46.887Z | [OTHER] | Attempt 3825: Error rate 55.81% (target: 15%) -2025-09-15T14:20:46.891Z | [OTHER] | Attempt 3826: Error rate 55.3% (target: 15%) -2025-09-15T14:20:46.894Z | [OTHER] | Attempt 3827: Error rate 44.44% (target: 15%) -2025-09-15T14:20:46.898Z | [OTHER] | Attempt 3828: Error rate 53.26% (target: 15%) -2025-09-15T14:20:46.903Z | [OTHER] | Attempt 3829: Error rate 54.35% (target: 15%) -2025-09-15T14:20:46.908Z | [OTHER] | Attempt 3830: Error rate 50.71% (target: 15%) -2025-09-15T14:20:46.911Z | [OTHER] | Attempt 3831: Error rate 50% (target: 15%) -2025-09-15T14:20:46.915Z | [OTHER] | Attempt 3832: Error rate 52.54% (target: 15%) -2025-09-15T14:20:46.920Z | [OTHER] | Attempt 3833: Error rate 50.76% (target: 15%) -2025-09-15T14:20:46.924Z | [OTHER] | Attempt 3834: Error rate 51.25% (target: 15%) -2025-09-15T14:20:46.928Z | [OTHER] | Attempt 3835: Error rate 51.39% (target: 15%) -2025-09-15T14:20:46.933Z | [OTHER] | Attempt 3836: Error rate 43.33% (target: 15%) -2025-09-15T14:20:46.938Z | [OTHER] | Attempt 3837: Error rate 53.42% (target: 15%) -2025-09-15T14:20:46.942Z | [OTHER] | Attempt 3838: Error rate 57.95% (target: 15%) -2025-09-15T14:20:46.946Z | [OTHER] | Attempt 3839: Error rate 53.33% (target: 15%) -2025-09-15T14:20:46.951Z | [OTHER] | Attempt 3840: Error rate 54.26% (target: 15%) -2025-09-15T14:20:46.954Z | [OTHER] | Attempt 3841: Error rate 51.48% (target: 15%) -2025-09-15T14:20:46.959Z | [OTHER] | Attempt 3842: Error rate 56.88% (target: 15%) -2025-09-15T14:20:46.963Z | [OTHER] | Attempt 3843: Error rate 46.74% (target: 15%) -2025-09-15T14:20:46.967Z | [OTHER] | Attempt 3844: Error rate 57.2% (target: 15%) -2025-09-15T14:20:46.971Z | [OTHER] | Attempt 3845: Error rate 50.78% (target: 15%) -2025-09-15T14:20:46.975Z | [OTHER] | Attempt 3846: Error rate 54.07% (target: 15%) -2025-09-15T14:20:46.980Z | [OTHER] | Attempt 3847: Error rate 62.68% (target: 15%) -2025-09-15T14:20:46.984Z | [OTHER] | Attempt 3848: Error rate 55.3% (target: 15%) -2025-09-15T14:20:46.988Z | [OTHER] | Attempt 3849: Error rate 55.43% (target: 15%) -2025-09-15T14:20:46.992Z | [OTHER] | Attempt 3850: Error rate 45.39% (target: 15%) -2025-09-15T14:20:46.996Z | [OTHER] | Attempt 3851: Error rate 51.22% (target: 15%) -2025-09-15T14:20:47.000Z | [OTHER] | Attempt 3852: Error rate 58.33% (target: 15%) -2025-09-15T14:20:47.005Z | [OTHER] | Attempt 3853: Error rate 59.09% (target: 15%) -2025-09-15T14:20:47.010Z | [OTHER] | Attempt 3854: Error rate 48.15% (target: 15%) -2025-09-15T14:20:47.014Z | [OTHER] | Attempt 3855: Error rate 44% (target: 15%) -2025-09-15T14:20:47.018Z | [OTHER] | Attempt 3856: Error rate 53.99% (target: 15%) -2025-09-15T14:20:47.022Z | [OTHER] | Attempt 3857: Error rate 51.45% (target: 15%) -2025-09-15T14:20:47.026Z | [OTHER] | Attempt 3858: Error rate 53.07% (target: 15%) -2025-09-15T14:20:47.030Z | [OTHER] | Attempt 3859: Error rate 51.14% (target: 15%) -2025-09-15T14:20:47.034Z | [OTHER] | Attempt 3860: Error rate 50.35% (target: 15%) -2025-09-15T14:20:47.039Z | [OTHER] | Attempt 3861: Error rate 48.23% (target: 15%) -2025-09-15T14:20:47.043Z | [OTHER] | Attempt 3862: Error rate 50.83% (target: 15%) -2025-09-15T14:20:47.047Z | [OTHER] | Attempt 3863: Error rate 58.7% (target: 15%) -2025-09-15T14:20:47.051Z | [OTHER] | Attempt 3864: Error rate 57.67% (target: 15%) -2025-09-15T14:20:47.055Z | [OTHER] | Attempt 3865: Error rate 53.1% (target: 15%) -2025-09-15T14:20:47.059Z | [OTHER] | Attempt 3866: Error rate 44.84% (target: 15%) -2025-09-15T14:20:47.063Z | [OTHER] | Attempt 3867: Error rate 51.09% (target: 15%) -2025-09-15T14:20:47.067Z | [OTHER] | Attempt 3868: Error rate 55.56% (target: 15%) -2025-09-15T14:20:47.071Z | [OTHER] | Attempt 3869: Error rate 43.33% (target: 15%) -2025-09-15T14:20:47.075Z | [OTHER] | Attempt 3870: Error rate 52.56% (target: 15%) -2025-09-15T14:20:47.079Z | [OTHER] | Attempt 3871: Error rate 54.44% (target: 15%) -2025-09-15T14:20:47.084Z | [OTHER] | Attempt 3872: Error rate 58.55% (target: 15%) -2025-09-15T14:20:47.087Z | [OTHER] | Attempt 3873: Error rate 47.04% (target: 15%) -2025-09-15T14:20:47.091Z | [OTHER] | Attempt 3874: Error rate 53.62% (target: 15%) -2025-09-15T14:20:47.095Z | [OTHER] | Attempt 3875: Error rate 45.74% (target: 15%) -2025-09-15T14:20:47.100Z | [OTHER] | Attempt 3876: Error rate 45.83% (target: 15%) -2025-09-15T14:20:47.104Z | [OTHER] | Attempt 3877: Error rate 47.29% (target: 15%) -2025-09-15T14:20:47.108Z | [OTHER] | Attempt 3878: Error rate 55.13% (target: 15%) -2025-09-15T14:20:47.112Z | [OTHER] | Attempt 3879: Error rate 43.12% (target: 15%) -2025-09-15T14:20:47.116Z | [OTHER] | Attempt 3880: Error rate 48.61% (target: 15%) -2025-09-15T14:20:47.120Z | [OTHER] | Attempt 3881: Error rate 50.69% (target: 15%) -2025-09-15T14:20:47.124Z | [OTHER] | Attempt 3882: Error rate 52.78% (target: 15%) -2025-09-15T14:20:47.128Z | [OTHER] | Attempt 3883: Error rate 58.33% (target: 15%) -2025-09-15T14:20:47.133Z | [OTHER] | Attempt 3884: Error rate 52.08% (target: 15%) -2025-09-15T14:20:47.137Z | [OTHER] | Attempt 3885: Error rate 53.66% (target: 15%) -2025-09-15T14:20:47.141Z | [OTHER] | Attempt 3886: Error rate 53.25% (target: 15%) -2025-09-15T14:20:47.145Z | [OTHER] | Attempt 3887: Error rate 53.55% (target: 15%) -2025-09-15T14:20:47.149Z | [OTHER] | Attempt 3888: Error rate 46.25% (target: 15%) -2025-09-15T14:20:47.154Z | [OTHER] | Attempt 3889: Error rate 48.11% (target: 15%) -2025-09-15T14:20:47.158Z | [OTHER] | Attempt 3890: Error rate 47.41% (target: 15%) -2025-09-15T14:20:47.162Z | [OTHER] | Attempt 3891: Error rate 52.27% (target: 15%) -2025-09-15T14:20:47.166Z | [OTHER] | Attempt 3892: Error rate 56.88% (target: 15%) -2025-09-15T14:20:47.170Z | [OTHER] | Attempt 3893: Error rate 51.33% (target: 15%) -2025-09-15T14:20:47.176Z | [OTHER] | Attempt 3894: Error rate 53.47% (target: 15%) -2025-09-15T14:20:47.180Z | [OTHER] | Attempt 3895: Error rate 54.47% (target: 15%) -2025-09-15T14:20:47.185Z | [OTHER] | Attempt 3896: Error rate 55.68% (target: 15%) -2025-09-15T14:20:47.189Z | [OTHER] | Attempt 3897: Error rate 52.17% (target: 15%) -2025-09-15T14:20:47.194Z | [OTHER] | Attempt 3898: Error rate 55.81% (target: 15%) -2025-09-15T14:20:47.198Z | [OTHER] | Attempt 3899: Error rate 54.17% (target: 15%) -2025-09-15T14:20:47.202Z | [OTHER] | Attempt 3900: Error rate 54.17% (target: 15%) -2025-09-15T14:20:47.206Z | [OTHER] | Attempt 3901: Error rate 58.52% (target: 15%) -2025-09-15T14:20:47.211Z | [OTHER] | Attempt 3902: Error rate 53.62% (target: 15%) -2025-09-15T14:20:47.215Z | [OTHER] | Attempt 3903: Error rate 54.26% (target: 15%) -2025-09-15T14:20:47.219Z | [OTHER] | Attempt 3904: Error rate 57.92% (target: 15%) -2025-09-15T14:20:47.224Z | [OTHER] | Attempt 3905: Error rate 54.17% (target: 15%) -2025-09-15T14:20:47.228Z | [OTHER] | Attempt 3906: Error rate 51.94% (target: 15%) -2025-09-15T14:20:47.233Z | [OTHER] | Attempt 3907: Error rate 53.17% (target: 15%) -2025-09-15T14:20:47.237Z | [OTHER] | Attempt 3908: Error rate 45.1% (target: 15%) -2025-09-15T14:20:47.241Z | [OTHER] | Attempt 3909: Error rate 53.57% (target: 15%) -2025-09-15T14:20:47.246Z | [OTHER] | Attempt 3910: Error rate 54.76% (target: 15%) -2025-09-15T14:20:47.250Z | [OTHER] | Attempt 3911: Error rate 48.23% (target: 15%) -2025-09-15T14:20:47.254Z | [OTHER] | Attempt 3912: Error rate 47.04% (target: 15%) -2025-09-15T14:20:47.258Z | [OTHER] | Attempt 3913: Error rate 55.69% (target: 15%) -2025-09-15T14:20:47.263Z | [OTHER] | Attempt 3914: Error rate 66.67% (target: 15%) -2025-09-15T14:20:47.267Z | [OTHER] | Attempt 3915: Error rate 56.31% (target: 15%) -2025-09-15T14:20:47.271Z | [OTHER] | Attempt 3916: Error rate 50.37% (target: 15%) -2025-09-15T14:20:47.275Z | [OTHER] | Attempt 3917: Error rate 56.06% (target: 15%) -2025-09-15T14:20:47.280Z | [OTHER] | Attempt 3918: Error rate 52.71% (target: 15%) -2025-09-15T14:20:47.284Z | [OTHER] | Attempt 3919: Error rate 47.62% (target: 15%) -2025-09-15T14:20:47.288Z | [OTHER] | Attempt 3920: Error rate 52.84% (target: 15%) -2025-09-15T14:20:47.292Z | [OTHER] | Attempt 3921: Error rate 45.04% (target: 15%) -2025-09-15T14:20:47.297Z | [OTHER] | Attempt 3922: Error rate 56.25% (target: 15%) -2025-09-15T14:20:47.302Z | [OTHER] | Attempt 3923: Error rate 47.73% (target: 15%) -2025-09-15T14:20:47.306Z | [OTHER] | Attempt 3924: Error rate 56.06% (target: 15%) -2025-09-15T14:20:47.311Z | [OTHER] | Attempt 3925: Error rate 52.22% (target: 15%) -2025-09-15T14:20:47.315Z | [OTHER] | Attempt 3926: Error rate 53.88% (target: 15%) -2025-09-15T14:20:47.320Z | [OTHER] | Attempt 3927: Error rate 54.37% (target: 15%) -2025-09-15T14:20:47.324Z | [OTHER] | Attempt 3928: Error rate 45.29% (target: 15%) -2025-09-15T14:20:47.329Z | [OTHER] | Attempt 3929: Error rate 45.08% (target: 15%) -2025-09-15T14:20:47.333Z | [OTHER] | Attempt 3930: Error rate 57.54% (target: 15%) -2025-09-15T14:20:47.338Z | [OTHER] | Attempt 3931: Error rate 50.36% (target: 15%) -2025-09-15T14:20:47.343Z | [OTHER] | Attempt 3932: Error rate 54.55% (target: 15%) -2025-09-15T14:20:47.348Z | [OTHER] | Attempt 3933: Error rate 52.96% (target: 15%) -2025-09-15T14:20:47.352Z | [OTHER] | Attempt 3934: Error rate 49.62% (target: 15%) -2025-09-15T14:20:47.357Z | [OTHER] | Attempt 3935: Error rate 47.86% (target: 15%) -2025-09-15T14:20:47.363Z | [OTHER] | Attempt 3936: Error rate 50.76% (target: 15%) -2025-09-15T14:20:47.367Z | [OTHER] | Attempt 3937: Error rate 56.59% (target: 15%) -2025-09-15T14:20:47.373Z | [OTHER] | Attempt 3938: Error rate 47.87% (target: 15%) -2025-09-15T14:20:47.378Z | [OTHER] | Attempt 3939: Error rate 52.85% (target: 15%) -2025-09-15T14:20:47.383Z | [OTHER] | Attempt 3940: Error rate 57.21% (target: 15%) -2025-09-15T14:20:47.388Z | [OTHER] | Attempt 3941: Error rate 48.89% (target: 15%) -2025-09-15T14:20:47.393Z | [OTHER] | Attempt 3942: Error rate 53.49% (target: 15%) -2025-09-15T14:20:47.399Z | [OTHER] | Attempt 3943: Error rate 51.48% (target: 15%) -2025-09-15T14:20:47.404Z | [OTHER] | Attempt 3944: Error rate 52.17% (target: 15%) -2025-09-15T14:20:47.409Z | [OTHER] | Attempt 3945: Error rate 47.73% (target: 15%) -2025-09-15T14:20:47.413Z | [OTHER] | Attempt 3946: Error rate 48.41% (target: 15%) -2025-09-15T14:20:47.418Z | [OTHER] | Attempt 3947: Error rate 56.2% (target: 15%) -2025-09-15T14:20:47.423Z | [OTHER] | Attempt 3948: Error rate 50% (target: 15%) -2025-09-15T14:20:47.427Z | [OTHER] | Attempt 3949: Error rate 51.59% (target: 15%) -2025-09-15T14:20:47.432Z | [OTHER] | Attempt 3950: Error rate 46.03% (target: 15%) -2025-09-15T14:20:47.438Z | [OTHER] | Attempt 3951: Error rate 46% (target: 15%) -2025-09-15T14:20:47.443Z | [OTHER] | Attempt 3952: Error rate 46.34% (target: 15%) -2025-09-15T14:20:47.448Z | [OTHER] | Attempt 3953: Error rate 56.67% (target: 15%) -2025-09-15T14:20:47.452Z | [OTHER] | Attempt 3954: Error rate 51.11% (target: 15%) -2025-09-15T14:20:47.457Z | [OTHER] | Attempt 3955: Error rate 48.33% (target: 15%) -2025-09-15T14:20:47.462Z | [OTHER] | Attempt 3956: Error rate 48.52% (target: 15%) -2025-09-15T14:20:47.467Z | [OTHER] | Attempt 3957: Error rate 50.38% (target: 15%) -2025-09-15T14:20:47.472Z | [OTHER] | Attempt 3958: Error rate 52.56% (target: 15%) -2025-09-15T14:20:47.479Z | [OTHER] | Attempt 3959: Error rate 55.19% (target: 15%) -2025-09-15T14:20:47.483Z | [OTHER] | Attempt 3960: Error rate 51.85% (target: 15%) -2025-09-15T14:20:47.487Z | [OTHER] | Attempt 3961: Error rate 50.72% (target: 15%) -2025-09-15T14:20:47.492Z | [OTHER] | Attempt 3962: Error rate 52.48% (target: 15%) -2025-09-15T14:20:47.497Z | [OTHER] | Attempt 3963: Error rate 53.82% (target: 15%) -2025-09-15T14:20:47.502Z | [OTHER] | Attempt 3964: Error rate 56.91% (target: 15%) -2025-09-15T14:20:47.506Z | [OTHER] | Attempt 3965: Error rate 51.52% (target: 15%) -2025-09-15T14:20:47.511Z | [OTHER] | Attempt 3966: Error rate 52.38% (target: 15%) -2025-09-15T14:20:47.515Z | [OTHER] | Attempt 3967: Error rate 50.79% (target: 15%) -2025-09-15T14:20:47.519Z | [OTHER] | Attempt 3968: Error rate 54.07% (target: 15%) -2025-09-15T14:20:47.524Z | [OTHER] | Attempt 3969: Error rate 51.48% (target: 15%) -2025-09-15T14:20:47.528Z | [OTHER] | Attempt 3970: Error rate 49.26% (target: 15%) -2025-09-15T14:20:47.532Z | [OTHER] | Attempt 3971: Error rate 55.9% (target: 15%) -2025-09-15T14:20:47.537Z | [OTHER] | Attempt 3972: Error rate 54.76% (target: 15%) -2025-09-15T14:20:47.541Z | [OTHER] | Attempt 3973: Error rate 60.61% (target: 15%) -2025-09-15T14:20:47.545Z | [OTHER] | Attempt 3974: Error rate 40.53% (target: 15%) -2025-09-15T14:20:47.552Z | [OTHER] | Attempt 3975: Error rate 52.71% (target: 15%) -2025-09-15T14:20:47.559Z | [OTHER] | Attempt 3976: Error rate 56.3% (target: 15%) -2025-09-15T14:20:47.564Z | [OTHER] | Attempt 3977: Error rate 53.41% (target: 15%) -2025-09-15T14:20:47.569Z | [OTHER] | Attempt 3978: Error rate 44.07% (target: 15%) -2025-09-15T14:20:47.573Z | [OTHER] | Attempt 3979: Error rate 54.26% (target: 15%) -2025-09-15T14:20:47.578Z | [OTHER] | Attempt 3980: Error rate 58.53% (target: 15%) -2025-09-15T14:20:47.582Z | [OTHER] | Attempt 3981: Error rate 62.22% (target: 15%) -2025-09-15T14:20:47.587Z | [OTHER] | Attempt 3982: Error rate 47.96% (target: 15%) -2025-09-15T14:20:47.592Z | [OTHER] | Attempt 3983: Error rate 52.78% (target: 15%) -2025-09-15T14:20:47.596Z | [OTHER] | Attempt 3984: Error rate 55.68% (target: 15%) -2025-09-15T14:20:47.601Z | [OTHER] | Attempt 3985: Error rate 53.33% (target: 15%) -2025-09-15T14:20:47.606Z | [OTHER] | Attempt 3986: Error rate 51.22% (target: 15%) -2025-09-15T14:20:47.611Z | [OTHER] | Attempt 3987: Error rate 50% (target: 15%) -2025-09-15T14:20:47.615Z | [OTHER] | Attempt 3988: Error rate 51.14% (target: 15%) -2025-09-15T14:20:47.619Z | [OTHER] | Attempt 3989: Error rate 54.65% (target: 15%) -2025-09-15T14:20:47.623Z | [OTHER] | Attempt 3990: Error rate 54.51% (target: 15%) -2025-09-15T14:20:47.628Z | [OTHER] | Attempt 3991: Error rate 48.02% (target: 15%) -2025-09-15T14:20:47.632Z | [OTHER] | Attempt 3992: Error rate 53.4% (target: 15%) -2025-09-15T14:20:47.636Z | [OTHER] | Attempt 3993: Error rate 60.14% (target: 15%) -2025-09-15T14:20:47.640Z | [OTHER] | Attempt 3994: Error rate 47.56% (target: 15%) -2025-09-15T14:20:47.645Z | [OTHER] | Attempt 3995: Error rate 46.34% (target: 15%) -2025-09-15T14:20:47.649Z | [OTHER] | Attempt 3996: Error rate 51.11% (target: 15%) -2025-09-15T14:20:47.653Z | [OTHER] | Attempt 3997: Error rate 56.06% (target: 15%) -2025-09-15T14:20:47.657Z | [OTHER] | Attempt 3998: Error rate 46.25% (target: 15%) -2025-09-15T14:20:47.663Z | [OTHER] | Attempt 3999: Error rate 47.78% (target: 15%) -2025-09-15T14:20:47.666Z | [OTHER] | Attempt 4000: Error rate 53.41% (target: 15%) -2025-09-15T14:20:47.671Z | [OTHER] | Attempt 4001: Error rate 55.69% (target: 15%) -2025-09-15T14:20:47.676Z | [OTHER] | Attempt 4002: Error rate 54.92% (target: 15%) -2025-09-15T14:20:47.680Z | [OTHER] | Attempt 4003: Error rate 57.94% (target: 15%) -2025-09-15T14:20:47.684Z | [OTHER] | Attempt 4004: Error rate 53.55% (target: 15%) -2025-09-15T14:20:47.689Z | [OTHER] | Attempt 4005: Error rate 51.04% (target: 15%) -2025-09-15T14:20:47.693Z | [OTHER] | Attempt 4006: Error rate 52.48% (target: 15%) -2025-09-15T14:20:47.697Z | [OTHER] | Attempt 4007: Error rate 46.75% (target: 15%) -2025-09-15T14:20:47.702Z | [OTHER] | Attempt 4008: Error rate 54.55% (target: 15%) -2025-09-15T14:20:47.706Z | [OTHER] | Attempt 4009: Error rate 45.63% (target: 15%) -2025-09-15T14:20:47.710Z | [OTHER] | Attempt 4010: Error rate 44.32% (target: 15%) -2025-09-15T14:20:47.714Z | [OTHER] | Attempt 4011: Error rate 51.55% (target: 15%) -2025-09-15T14:20:47.719Z | [OTHER] | Attempt 4012: Error rate 57.69% (target: 15%) -2025-09-15T14:20:47.723Z | [OTHER] | Attempt 4013: Error rate 51.98% (target: 15%) -2025-09-15T14:20:47.728Z | [OTHER] | Attempt 4014: Error rate 47.83% (target: 15%) -2025-09-15T14:20:47.733Z | [OTHER] | Attempt 4015: Error rate 52.48% (target: 15%) -2025-09-15T14:20:47.737Z | [OTHER] | Attempt 4016: Error rate 47.78% (target: 15%) -2025-09-15T14:20:47.741Z | [OTHER] | Attempt 4017: Error rate 53.9% (target: 15%) -2025-09-15T14:20:47.745Z | [OTHER] | Attempt 4018: Error rate 58.7% (target: 15%) -2025-09-15T14:20:47.750Z | [OTHER] | Attempt 4019: Error rate 51.11% (target: 15%) -2025-09-15T14:20:47.754Z | [OTHER] | Attempt 4020: Error rate 52.54% (target: 15%) -2025-09-15T14:20:47.758Z | [OTHER] | Attempt 4021: Error rate 50.74% (target: 15%) -2025-09-15T14:20:47.763Z | [OTHER] | Attempt 4022: Error rate 50.79% (target: 15%) -2025-09-15T14:20:47.768Z | [OTHER] | Attempt 4023: Error rate 54.71% (target: 15%) -2025-09-15T14:20:47.772Z | [OTHER] | Attempt 4024: Error rate 58.52% (target: 15%) -2025-09-15T14:20:47.777Z | [OTHER] | Attempt 4025: Error rate 54.96% (target: 15%) -2025-09-15T14:20:47.782Z | [OTHER] | Attempt 4026: Error rate 54.58% (target: 15%) -2025-09-15T14:20:47.786Z | [OTHER] | Attempt 4027: Error rate 44.44% (target: 15%) -2025-09-15T14:20:47.790Z | [OTHER] | Attempt 4028: Error rate 56.44% (target: 15%) -2025-09-15T14:20:47.795Z | [OTHER] | Attempt 4029: Error rate 55% (target: 15%) -2025-09-15T14:20:47.799Z | [OTHER] | Attempt 4030: Error rate 55.56% (target: 15%) -2025-09-15T14:20:47.803Z | [OTHER] | Attempt 4031: Error rate 59.92% (target: 15%) -2025-09-15T14:20:47.808Z | [OTHER] | Attempt 4032: Error rate 55.3% (target: 15%) -2025-09-15T14:20:47.812Z | [OTHER] | Attempt 4033: Error rate 57.75% (target: 15%) -2025-09-15T14:20:47.817Z | [OTHER] | Attempt 4034: Error rate 50.76% (target: 15%) -2025-09-15T14:20:47.821Z | [OTHER] | Attempt 4035: Error rate 55.43% (target: 15%) -2025-09-15T14:20:47.826Z | [OTHER] | Attempt 4036: Error rate 60% (target: 15%) -2025-09-15T14:20:47.831Z | [OTHER] | Attempt 4037: Error rate 53.55% (target: 15%) -2025-09-15T14:20:47.835Z | [OTHER] | Attempt 4038: Error rate 56.1% (target: 15%) -2025-09-15T14:20:47.840Z | [OTHER] | Attempt 4039: Error rate 52.17% (target: 15%) -2025-09-15T14:20:47.844Z | [OTHER] | Attempt 4040: Error rate 58.67% (target: 15%) -2025-09-15T14:20:47.848Z | [OTHER] | Attempt 4041: Error rate 58.15% (target: 15%) -2025-09-15T14:20:47.852Z | [OTHER] | Attempt 4042: Error rate 57.02% (target: 15%) -2025-09-15T14:20:47.857Z | [OTHER] | Attempt 4043: Error rate 46.81% (target: 15%) -2025-09-15T14:20:47.861Z | [OTHER] | Attempt 4044: Error rate 50.76% (target: 15%) -2025-09-15T14:20:47.865Z | [OTHER] | Attempt 4045: Error rate 46.83% (target: 15%) -2025-09-15T14:20:47.870Z | [OTHER] | Attempt 4046: Error rate 51.48% (target: 15%) -2025-09-15T14:20:47.874Z | [OTHER] | Attempt 4047: Error rate 56.3% (target: 15%) -2025-09-15T14:20:47.878Z | [OTHER] | Attempt 4048: Error rate 47.16% (target: 15%) -2025-09-15T14:20:47.883Z | [OTHER] | Attempt 4049: Error rate 55.3% (target: 15%) -2025-09-15T14:20:47.887Z | [OTHER] | Attempt 4050: Error rate 48.48% (target: 15%) -2025-09-15T14:20:47.891Z | [OTHER] | Attempt 4051: Error rate 47.44% (target: 15%) -2025-09-15T14:20:47.896Z | [OTHER] | Attempt 4052: Error rate 55.95% (target: 15%) -2025-09-15T14:20:47.900Z | [OTHER] | Attempt 4053: Error rate 52.71% (target: 15%) -2025-09-15T14:20:47.905Z | [OTHER] | Attempt 4054: Error rate 58.33% (target: 15%) -2025-09-15T14:20:47.909Z | [OTHER] | Attempt 4055: Error rate 50.74% (target: 15%) -2025-09-15T14:20:47.913Z | [OTHER] | Attempt 4056: Error rate 54.65% (target: 15%) -2025-09-15T14:20:47.917Z | [OTHER] | Attempt 4057: Error rate 58.33% (target: 15%) -2025-09-15T14:20:47.921Z | [OTHER] | Attempt 4058: Error rate 55.43% (target: 15%) -2025-09-15T14:20:47.926Z | [OTHER] | Attempt 4059: Error rate 54.26% (target: 15%) -2025-09-15T14:20:47.930Z | [OTHER] | Attempt 4060: Error rate 53.97% (target: 15%) -2025-09-15T14:20:47.935Z | [OTHER] | Attempt 4061: Error rate 52.27% (target: 15%) -2025-09-15T14:20:47.939Z | [OTHER] | Attempt 4062: Error rate 56.74% (target: 15%) -2025-09-15T14:20:47.944Z | [OTHER] | Attempt 4063: Error rate 54.58% (target: 15%) -2025-09-15T14:20:47.949Z | [OTHER] | Attempt 4064: Error rate 50.41% (target: 15%) -2025-09-15T14:20:47.953Z | [OTHER] | Attempt 4065: Error rate 55.68% (target: 15%) -2025-09-15T14:20:47.958Z | [OTHER] | Attempt 4066: Error rate 41.09% (target: 15%) -2025-09-15T14:20:47.962Z | [OTHER] | Attempt 4067: Error rate 42.28% (target: 15%) -2025-09-15T14:20:47.967Z | [OTHER] | Attempt 4068: Error rate 50% (target: 15%) -2025-09-15T14:20:47.971Z | [OTHER] | Attempt 4069: Error rate 53.66% (target: 15%) -2025-09-15T14:20:47.976Z | [OTHER] | Attempt 4070: Error rate 54.61% (target: 15%) -2025-09-15T14:20:47.980Z | [OTHER] | Attempt 4071: Error rate 57.72% (target: 15%) -2025-09-15T14:20:47.985Z | [OTHER] | Attempt 4072: Error rate 53.33% (target: 15%) -2025-09-15T14:20:47.989Z | [OTHER] | Attempt 4073: Error rate 54.58% (target: 15%) -2025-09-15T14:20:47.993Z | [OTHER] | Attempt 4074: Error rate 46.88% (target: 15%) -2025-09-15T14:20:47.998Z | [OTHER] | Attempt 4075: Error rate 50.38% (target: 15%) -2025-09-15T14:20:48.003Z | [OTHER] | Attempt 4076: Error rate 46.43% (target: 15%) -2025-09-15T14:20:48.007Z | [OTHER] | Attempt 4077: Error rate 53.27% (target: 15%) -2025-09-15T14:20:48.012Z | [OTHER] | Attempt 4078: Error rate 51.59% (target: 15%) -2025-09-15T14:20:48.016Z | [OTHER] | Attempt 4079: Error rate 49.62% (target: 15%) -2025-09-15T14:20:48.021Z | [OTHER] | Attempt 4080: Error rate 55.8% (target: 15%) -2025-09-15T14:20:48.025Z | [OTHER] | Attempt 4081: Error rate 59.3% (target: 15%) -2025-09-15T14:20:48.030Z | [OTHER] | Attempt 4082: Error rate 43.9% (target: 15%) -2025-09-15T14:20:48.036Z | [OTHER] | Attempt 4083: Error rate 52.03% (target: 15%) -2025-09-15T14:20:48.040Z | [OTHER] | Attempt 4084: Error rate 57.14% (target: 15%) -2025-09-15T14:20:48.045Z | [OTHER] | Attempt 4085: Error rate 49.15% (target: 15%) -2025-09-15T14:20:48.049Z | [OTHER] | Attempt 4086: Error rate 48.91% (target: 15%) -2025-09-15T14:20:48.054Z | [OTHER] | Attempt 4087: Error rate 55.93% (target: 15%) -2025-09-15T14:20:48.058Z | [OTHER] | Attempt 4088: Error rate 53.99% (target: 15%) -2025-09-15T14:20:48.062Z | [OTHER] | Attempt 4089: Error rate 63.83% (target: 15%) -2025-09-15T14:20:48.067Z | [OTHER] | Attempt 4090: Error rate 54.47% (target: 15%) -2025-09-15T14:20:48.072Z | [OTHER] | Attempt 4091: Error rate 47.56% (target: 15%) -2025-09-15T14:20:48.076Z | [OTHER] | Attempt 4092: Error rate 50.36% (target: 15%) -2025-09-15T14:20:48.080Z | [OTHER] | Attempt 4093: Error rate 47.37% (target: 15%) -2025-09-15T14:20:48.085Z | [OTHER] | Attempt 4094: Error rate 55.28% (target: 15%) -2025-09-15T14:20:48.089Z | [OTHER] | Attempt 4095: Error rate 51.19% (target: 15%) -2025-09-15T14:20:48.093Z | [OTHER] | Attempt 4096: Error rate 64.04% (target: 15%) -2025-09-15T14:20:48.097Z | [OTHER] | Attempt 4097: Error rate 50.36% (target: 15%) -2025-09-15T14:20:48.102Z | [OTHER] | Attempt 4098: Error rate 54.35% (target: 15%) -2025-09-15T14:20:48.107Z | [OTHER] | Attempt 4099: Error rate 51.63% (target: 15%) -2025-09-15T14:20:48.111Z | [OTHER] | Attempt 4100: Error rate 51.28% (target: 15%) -2025-09-15T14:20:48.116Z | [OTHER] | Attempt 4101: Error rate 43.41% (target: 15%) -2025-09-15T14:20:48.120Z | [OTHER] | Attempt 4102: Error rate 41.88% (target: 15%) -2025-09-15T14:20:48.125Z | [OTHER] | Attempt 4103: Error rate 50.67% (target: 15%) -2025-09-15T14:20:48.130Z | [OTHER] | Attempt 4104: Error rate 39.01% (target: 15%) -2025-09-15T14:20:48.134Z | [OTHER] | Attempt 4105: Error rate 60.64% (target: 15%) -2025-09-15T14:20:48.139Z | [OTHER] | Attempt 4106: Error rate 54.07% (target: 15%) -2025-09-15T14:20:48.143Z | [OTHER] | Attempt 4107: Error rate 57.69% (target: 15%) -2025-09-15T14:20:48.147Z | [OTHER] | Attempt 4108: Error rate 53.49% (target: 15%) -2025-09-15T14:20:48.151Z | [OTHER] | Attempt 4109: Error rate 50% (target: 15%) -2025-09-15T14:20:48.155Z | [OTHER] | Attempt 4110: Error rate 56.91% (target: 15%) -2025-09-15T14:20:48.160Z | [OTHER] | Attempt 4111: Error rate 50.33% (target: 15%) -2025-09-15T14:20:48.164Z | [OTHER] | Attempt 4112: Error rate 51.09% (target: 15%) -2025-09-15T14:20:48.169Z | [OTHER] | Attempt 4113: Error rate 44.44% (target: 15%) -2025-09-15T14:20:48.173Z | [OTHER] | Attempt 4114: Error rate 54.17% (target: 15%) -2025-09-15T14:20:48.178Z | [OTHER] | Attempt 4115: Error rate 50.42% (target: 15%) -2025-09-15T14:20:48.182Z | [OTHER] | Attempt 4116: Error rate 50.85% (target: 15%) -2025-09-15T14:20:48.187Z | [OTHER] | Attempt 4117: Error rate 52.78% (target: 15%) -2025-09-15T14:20:48.192Z | [OTHER] | Attempt 4118: Error rate 56.1% (target: 15%) -2025-09-15T14:20:48.197Z | [OTHER] | Attempt 4119: Error rate 53.33% (target: 15%) -2025-09-15T14:20:48.201Z | [OTHER] | Attempt 4120: Error rate 50.4% (target: 15%) -2025-09-15T14:20:48.205Z | [OTHER] | Attempt 4121: Error rate 46.9% (target: 15%) -2025-09-15T14:20:48.210Z | [OTHER] | Attempt 4122: Error rate 42.8% (target: 15%) -2025-09-15T14:20:48.214Z | [OTHER] | Attempt 4123: Error rate 48.98% (target: 15%) -2025-09-15T14:20:48.218Z | [OTHER] | Attempt 4124: Error rate 49.15% (target: 15%) -2025-09-15T14:20:48.224Z | [OTHER] | Attempt 4125: Error rate 47.92% (target: 15%) -2025-09-15T14:20:48.228Z | [OTHER] | Attempt 4126: Error rate 55.21% (target: 15%) -2025-09-15T14:20:48.232Z | [OTHER] | Attempt 4127: Error rate 56.38% (target: 15%) -2025-09-15T14:20:48.237Z | [OTHER] | Attempt 4128: Error rate 54.17% (target: 15%) -2025-09-15T14:20:48.241Z | [OTHER] | Attempt 4129: Error rate 59.92% (target: 15%) -2025-09-15T14:20:48.246Z | [OTHER] | Attempt 4130: Error rate 55.07% (target: 15%) -2025-09-15T14:20:48.250Z | [OTHER] | Attempt 4131: Error rate 55.69% (target: 15%) -2025-09-15T14:20:48.255Z | [OTHER] | Attempt 4132: Error rate 55.86% (target: 15%) -2025-09-15T14:20:48.260Z | [OTHER] | Attempt 4133: Error rate 46.67% (target: 15%) -2025-09-15T14:20:48.265Z | [OTHER] | Attempt 4134: Error rate 47.29% (target: 15%) -2025-09-15T14:20:48.270Z | [OTHER] | Attempt 4135: Error rate 50.37% (target: 15%) -2025-09-15T14:20:48.274Z | [OTHER] | Attempt 4136: Error rate 51.45% (target: 15%) -2025-09-15T14:20:48.278Z | [OTHER] | Attempt 4137: Error rate 49.22% (target: 15%) -2025-09-15T14:20:48.283Z | [OTHER] | Attempt 4138: Error rate 39.52% (target: 15%) -2025-09-15T14:20:48.287Z | [OTHER] | Attempt 4139: Error rate 48.58% (target: 15%) -2025-09-15T14:20:48.291Z | [OTHER] | Attempt 4140: Error rate 52.44% (target: 15%) -2025-09-15T14:20:48.296Z | [OTHER] | Attempt 4141: Error rate 54.58% (target: 15%) -2025-09-15T14:20:48.300Z | [OTHER] | Attempt 4142: Error rate 47.15% (target: 15%) -2025-09-15T14:20:48.305Z | [OTHER] | Attempt 4143: Error rate 51.42% (target: 15%) -2025-09-15T14:20:48.309Z | [OTHER] | Attempt 4144: Error rate 57.46% (target: 15%) -2025-09-15T14:20:48.314Z | [OTHER] | Attempt 4145: Error rate 47.15% (target: 15%) -2025-09-15T14:20:48.318Z | [OTHER] | Attempt 4146: Error rate 55.56% (target: 15%) -2025-09-15T14:20:48.322Z | [OTHER] | Attempt 4147: Error rate 55.81% (target: 15%) -2025-09-15T14:20:48.326Z | [OTHER] | Attempt 4148: Error rate 49.59% (target: 15%) -2025-09-15T14:20:48.331Z | [OTHER] | Attempt 4149: Error rate 52.08% (target: 15%) -2025-09-15T14:20:48.335Z | [OTHER] | Attempt 4150: Error rate 50.76% (target: 15%) -2025-09-15T14:20:48.339Z | [OTHER] | Attempt 4151: Error rate 59.69% (target: 15%) -2025-09-15T14:20:48.344Z | [OTHER] | Attempt 4152: Error rate 44.72% (target: 15%) -2025-09-15T14:20:48.348Z | [OTHER] | Attempt 4153: Error rate 50.81% (target: 15%) -2025-09-15T14:20:48.352Z | [OTHER] | Attempt 4154: Error rate 54.35% (target: 15%) -2025-09-15T14:20:48.356Z | [OTHER] | Attempt 4155: Error rate 46.67% (target: 15%) -2025-09-15T14:20:48.361Z | [OTHER] | Attempt 4156: Error rate 49.29% (target: 15%) -2025-09-15T14:20:48.365Z | [OTHER] | Attempt 4157: Error rate 56.1% (target: 15%) -2025-09-15T14:20:48.369Z | [OTHER] | Attempt 4158: Error rate 45.83% (target: 15%) -2025-09-15T14:20:48.374Z | [OTHER] | Attempt 4159: Error rate 50.41% (target: 15%) -2025-09-15T14:20:48.379Z | [OTHER] | Attempt 4160: Error rate 51.02% (target: 15%) -2025-09-15T14:20:48.383Z | [OTHER] | Attempt 4161: Error rate 49.64% (target: 15%) -2025-09-15T14:20:48.388Z | [OTHER] | Attempt 4162: Error rate 47.67% (target: 15%) -2025-09-15T14:20:48.393Z | [OTHER] | Attempt 4163: Error rate 53.26% (target: 15%) -2025-09-15T14:20:48.398Z | [OTHER] | Attempt 4164: Error rate 55.56% (target: 15%) -2025-09-15T14:20:48.403Z | [OTHER] | Attempt 4165: Error rate 52.65% (target: 15%) -2025-09-15T14:20:48.409Z | [OTHER] | Attempt 4166: Error rate 53.62% (target: 15%) -2025-09-15T14:20:48.414Z | [OTHER] | Attempt 4167: Error rate 54.86% (target: 15%) -2025-09-15T14:20:48.419Z | [OTHER] | Attempt 4168: Error rate 48.11% (target: 15%) -2025-09-15T14:20:48.425Z | [OTHER] | Attempt 4169: Error rate 52.13% (target: 15%) -2025-09-15T14:20:48.429Z | [OTHER] | Attempt 4170: Error rate 52.17% (target: 15%) -2025-09-15T14:20:48.434Z | [OTHER] | Attempt 4171: Error rate 53.9% (target: 15%) -2025-09-15T14:20:48.438Z | [OTHER] | Attempt 4172: Error rate 61.24% (target: 15%) -2025-09-15T14:20:48.443Z | [OTHER] | Attempt 4173: Error rate 50% (target: 15%) -2025-09-15T14:20:48.447Z | [OTHER] | Attempt 4174: Error rate 47.35% (target: 15%) -2025-09-15T14:20:48.452Z | [OTHER] | Attempt 4175: Error rate 50% (target: 15%) -2025-09-15T14:20:48.456Z | [OTHER] | Attempt 4176: Error rate 52.61% (target: 15%) -2025-09-15T14:20:48.461Z | [OTHER] | Attempt 4177: Error rate 57.25% (target: 15%) -2025-09-15T14:20:48.465Z | [OTHER] | Attempt 4178: Error rate 44.93% (target: 15%) -2025-09-15T14:20:48.470Z | [OTHER] | Attempt 4179: Error rate 45.35% (target: 15%) -2025-09-15T14:20:48.474Z | [OTHER] | Attempt 4180: Error rate 56.98% (target: 15%) -2025-09-15T14:20:48.478Z | [OTHER] | Attempt 4181: Error rate 50% (target: 15%) -2025-09-15T14:20:48.483Z | [OTHER] | Attempt 4182: Error rate 48.81% (target: 15%) -2025-09-15T14:20:48.488Z | [OTHER] | Attempt 4183: Error rate 50.37% (target: 15%) -2025-09-15T14:20:48.492Z | [OTHER] | Attempt 4184: Error rate 52.5% (target: 15%) -2025-09-15T14:20:48.497Z | [OTHER] | Attempt 4185: Error rate 49.24% (target: 15%) -2025-09-15T14:20:48.502Z | [OTHER] | Attempt 4186: Error rate 53.99% (target: 15%) -2025-09-15T14:20:48.506Z | [OTHER] | Attempt 4187: Error rate 52.22% (target: 15%) -2025-09-15T14:20:48.511Z | [OTHER] | Attempt 4188: Error rate 56.59% (target: 15%) -2025-09-15T14:20:48.516Z | [OTHER] | Attempt 4189: Error rate 53.57% (target: 15%) -2025-09-15T14:20:48.520Z | [OTHER] | Attempt 4190: Error rate 54.26% (target: 15%) -2025-09-15T14:20:48.525Z | [OTHER] | Attempt 4191: Error rate 53.97% (target: 15%) -2025-09-15T14:20:48.530Z | [OTHER] | Attempt 4192: Error rate 51.25% (target: 15%) -2025-09-15T14:20:48.534Z | [OTHER] | Attempt 4193: Error rate 51.42% (target: 15%) -2025-09-15T14:20:48.540Z | [OTHER] | Attempt 4194: Error rate 48.25% (target: 15%) -2025-09-15T14:20:48.544Z | [OTHER] | Attempt 4195: Error rate 50.36% (target: 15%) -2025-09-15T14:20:48.549Z | [OTHER] | Attempt 4196: Error rate 46.03% (target: 15%) -2025-09-15T14:20:48.554Z | [OTHER] | Attempt 4197: Error rate 49.28% (target: 15%) -2025-09-15T14:20:48.558Z | [OTHER] | Attempt 4198: Error rate 44.32% (target: 15%) -2025-09-15T14:20:48.563Z | [OTHER] | Attempt 4199: Error rate 49.21% (target: 15%) -2025-09-15T14:20:48.568Z | [OTHER] | Attempt 4200: Error rate 50.83% (target: 15%) -2025-09-15T14:20:48.573Z | [OTHER] | Attempt 4201: Error rate 49.57% (target: 15%) -2025-09-15T14:20:48.577Z | [OTHER] | Attempt 4202: Error rate 49.29% (target: 15%) -2025-09-15T14:20:48.582Z | [OTHER] | Attempt 4203: Error rate 51.71% (target: 15%) -2025-09-15T14:20:48.587Z | [OTHER] | Attempt 4204: Error rate 55.93% (target: 15%) -2025-09-15T14:20:48.592Z | [OTHER] | Attempt 4205: Error rate 49.63% (target: 15%) -2025-09-15T14:20:48.596Z | [OTHER] | Attempt 4206: Error rate 47.46% (target: 15%) -2025-09-15T14:20:48.601Z | [OTHER] | Attempt 4207: Error rate 52.72% (target: 15%) -2025-09-15T14:20:48.606Z | [OTHER] | Attempt 4208: Error rate 50.78% (target: 15%) -2025-09-15T14:20:48.611Z | [OTHER] | Attempt 4209: Error rate 54.17% (target: 15%) -2025-09-15T14:20:48.617Z | [OTHER] | Attempt 4210: Error rate 49.17% (target: 15%) -2025-09-15T14:20:48.621Z | [OTHER] | Attempt 4211: Error rate 47.92% (target: 15%) -2025-09-15T14:20:48.626Z | [OTHER] | Attempt 4212: Error rate 46.59% (target: 15%) -2025-09-15T14:20:48.631Z | [OTHER] | Attempt 4213: Error rate 44.2% (target: 15%) -2025-09-15T14:20:48.635Z | [OTHER] | Attempt 4214: Error rate 56.59% (target: 15%) -2025-09-15T14:20:48.639Z | [OTHER] | Attempt 4215: Error rate 47.01% (target: 15%) -2025-09-15T14:20:48.644Z | [OTHER] | Attempt 4216: Error rate 45.83% (target: 15%) -2025-09-15T14:20:48.649Z | [OTHER] | Attempt 4217: Error rate 52.03% (target: 15%) -2025-09-15T14:20:48.654Z | [OTHER] | Attempt 4218: Error rate 51.11% (target: 15%) -2025-09-15T14:20:48.659Z | [OTHER] | Attempt 4219: Error rate 54.26% (target: 15%) -2025-09-15T14:20:48.664Z | [OTHER] | Attempt 4220: Error rate 59.69% (target: 15%) -2025-09-15T14:20:48.668Z | [OTHER] | Attempt 4221: Error rate 58.52% (target: 15%) -2025-09-15T14:20:48.673Z | [OTHER] | Attempt 4222: Error rate 61.35% (target: 15%) -2025-09-15T14:20:48.677Z | [OTHER] | Attempt 4223: Error rate 52.27% (target: 15%) -2025-09-15T14:20:48.682Z | [OTHER] | Attempt 4224: Error rate 48.29% (target: 15%) -2025-09-15T14:20:48.686Z | [OTHER] | Attempt 4225: Error rate 51.11% (target: 15%) -2025-09-15T14:20:48.692Z | [OTHER] | Attempt 4226: Error rate 48.37% (target: 15%) -2025-09-15T14:20:48.697Z | [OTHER] | Attempt 4227: Error rate 51.33% (target: 15%) -2025-09-15T14:20:48.701Z | [OTHER] | Attempt 4228: Error rate 52.59% (target: 15%) -2025-09-15T14:20:48.706Z | [OTHER] | Attempt 4229: Error rate 51.22% (target: 15%) -2025-09-15T14:20:48.711Z | [OTHER] | Attempt 4230: Error rate 50.76% (target: 15%) -2025-09-15T14:20:48.715Z | [OTHER] | Attempt 4231: Error rate 53.97% (target: 15%) -2025-09-15T14:20:48.721Z | [OTHER] | Attempt 4232: Error rate 54.92% (target: 15%) -2025-09-15T14:20:48.725Z | [OTHER] | Attempt 4233: Error rate 50% (target: 15%) -2025-09-15T14:20:48.730Z | [OTHER] | Attempt 4234: Error rate 53.41% (target: 15%) -2025-09-15T14:20:48.734Z | [OTHER] | Attempt 4235: Error rate 47.22% (target: 15%) -2025-09-15T14:20:48.739Z | [OTHER] | Attempt 4236: Error rate 47.35% (target: 15%) -2025-09-15T14:20:48.743Z | [OTHER] | Attempt 4237: Error rate 45.35% (target: 15%) -2025-09-15T14:20:48.748Z | [OTHER] | Attempt 4238: Error rate 52.08% (target: 15%) -2025-09-15T14:20:48.752Z | [OTHER] | Attempt 4239: Error rate 46.59% (target: 15%) -2025-09-15T14:20:48.757Z | [OTHER] | Attempt 4240: Error rate 48.15% (target: 15%) -2025-09-15T14:20:48.762Z | [OTHER] | Attempt 4241: Error rate 53.1% (target: 15%) -2025-09-15T14:20:48.767Z | [OTHER] | Attempt 4242: Error rate 54.26% (target: 15%) -2025-09-15T14:20:48.771Z | [OTHER] | Attempt 4243: Error rate 53.7% (target: 15%) -2025-09-15T14:20:48.776Z | [OTHER] | Attempt 4244: Error rate 62.77% (target: 15%) -2025-09-15T14:20:48.782Z | [OTHER] | Attempt 4245: Error rate 46.15% (target: 15%) -2025-09-15T14:20:48.790Z | [OTHER] | Attempt 4246: Error rate 49.21% (target: 15%) -2025-09-15T14:20:48.797Z | [OTHER] | Attempt 4247: Error rate 53.42% (target: 15%) -2025-09-15T14:20:48.806Z | [OTHER] | Attempt 4248: Error rate 47.62% (target: 15%) -2025-09-15T14:20:48.812Z | [OTHER] | Attempt 4249: Error rate 57.04% (target: 15%) -2025-09-15T14:20:48.818Z | [OTHER] | Attempt 4250: Error rate 54.07% (target: 15%) -2025-09-15T14:20:48.825Z | [OTHER] | Attempt 4251: Error rate 53.99% (target: 15%) -2025-09-15T14:20:48.830Z | [OTHER] | Attempt 4252: Error rate 52.9% (target: 15%) -2025-09-15T14:20:48.835Z | [OTHER] | Attempt 4253: Error rate 55.68% (target: 15%) -2025-09-15T14:20:48.839Z | [OTHER] | Attempt 4254: Error rate 53.33% (target: 15%) -2025-09-15T14:20:48.844Z | [OTHER] | Attempt 4255: Error rate 53.62% (target: 15%) -2025-09-15T14:20:48.848Z | [OTHER] | Attempt 4256: Error rate 47.04% (target: 15%) -2025-09-15T14:20:48.854Z | [OTHER] | Attempt 4257: Error rate 53.41% (target: 15%) -2025-09-15T14:20:48.858Z | [OTHER] | Attempt 4258: Error rate 53.27% (target: 15%) -2025-09-15T14:20:48.863Z | [OTHER] | Attempt 4259: Error rate 46.25% (target: 15%) -2025-09-15T14:20:48.867Z | [OTHER] | Attempt 4260: Error rate 50.74% (target: 15%) -2025-09-15T14:20:48.872Z | [OTHER] | Attempt 4261: Error rate 53.9% (target: 15%) -2025-09-15T14:20:48.877Z | [OTHER] | Attempt 4262: Error rate 51.55% (target: 15%) -2025-09-15T14:20:48.881Z | [OTHER] | Attempt 4263: Error rate 47.08% (target: 15%) -2025-09-15T14:20:48.886Z | [OTHER] | Attempt 4264: Error rate 51.94% (target: 15%) -2025-09-15T14:20:48.890Z | [OTHER] | Attempt 4265: Error rate 56.5% (target: 15%) -2025-09-15T14:20:48.895Z | [OTHER] | Attempt 4266: Error rate 49.12% (target: 15%) -2025-09-15T14:20:48.900Z | [OTHER] | Attempt 4267: Error rate 54.42% (target: 15%) -2025-09-15T14:20:48.904Z | [OTHER] | Attempt 4268: Error rate 53.19% (target: 15%) -2025-09-15T14:20:48.909Z | [OTHER] | Attempt 4269: Error rate 58.53% (target: 15%) -2025-09-15T14:20:48.913Z | [OTHER] | Attempt 4270: Error rate 48.41% (target: 15%) -2025-09-15T14:20:48.918Z | [OTHER] | Attempt 4271: Error rate 52.44% (target: 15%) -2025-09-15T14:20:48.922Z | [OTHER] | Attempt 4272: Error rate 50% (target: 15%) -2025-09-15T14:20:48.928Z | [OTHER] | Attempt 4273: Error rate 42.25% (target: 15%) -2025-09-15T14:20:48.932Z | [OTHER] | Attempt 4274: Error rate 55.9% (target: 15%) -2025-09-15T14:20:48.937Z | [OTHER] | Attempt 4275: Error rate 54.26% (target: 15%) -2025-09-15T14:20:48.942Z | [OTHER] | Attempt 4276: Error rate 56.98% (target: 15%) -2025-09-15T14:20:48.946Z | [OTHER] | Attempt 4277: Error rate 44.96% (target: 15%) -2025-09-15T14:20:48.951Z | [OTHER] | Attempt 4278: Error rate 56.33% (target: 15%) -2025-09-15T14:20:48.956Z | [OTHER] | Attempt 4279: Error rate 53.41% (target: 15%) -2025-09-15T14:20:48.962Z | [OTHER] | Attempt 4280: Error rate 57.32% (target: 15%) -2025-09-15T14:20:48.966Z | [OTHER] | Attempt 4281: Error rate 47.16% (target: 15%) -2025-09-15T14:20:48.971Z | [OTHER] | Attempt 4282: Error rate 47.1% (target: 15%) -2025-09-15T14:20:48.976Z | [OTHER] | Attempt 4283: Error rate 44.57% (target: 15%) -2025-09-15T14:20:48.981Z | [OTHER] | Attempt 4284: Error rate 55.28% (target: 15%) -2025-09-15T14:20:48.985Z | [OTHER] | Attempt 4285: Error rate 50% (target: 15%) -2025-09-15T14:20:48.989Z | [OTHER] | Attempt 4286: Error rate 50.68% (target: 15%) -2025-09-15T14:20:48.994Z | [OTHER] | Attempt 4287: Error rate 48.06% (target: 15%) -2025-09-15T14:20:48.998Z | [OTHER] | Attempt 4288: Error rate 55.56% (target: 15%) -2025-09-15T14:20:49.002Z | [OTHER] | Attempt 4289: Error rate 56.2% (target: 15%) -2025-09-15T14:20:49.007Z | [OTHER] | Attempt 4290: Error rate 51.11% (target: 15%) -2025-09-15T14:20:49.011Z | [OTHER] | Attempt 4291: Error rate 46.74% (target: 15%) -2025-09-15T14:20:49.016Z | [OTHER] | Attempt 4292: Error rate 50.85% (target: 15%) -2025-09-15T14:20:49.021Z | [OTHER] | Attempt 4293: Error rate 49.62% (target: 15%) -2025-09-15T14:20:49.026Z | [OTHER] | Attempt 4294: Error rate 53.42% (target: 15%) -2025-09-15T14:20:49.031Z | [OTHER] | Attempt 4295: Error rate 45.56% (target: 15%) -2025-09-15T14:20:49.035Z | [OTHER] | Attempt 4296: Error rate 53.19% (target: 15%) -2025-09-15T14:20:49.040Z | [OTHER] | Attempt 4297: Error rate 64.07% (target: 15%) -2025-09-15T14:20:49.045Z | [OTHER] | Attempt 4298: Error rate 52.84% (target: 15%) -2025-09-15T14:20:49.050Z | [OTHER] | Attempt 4299: Error rate 47.15% (target: 15%) -2025-09-15T14:20:49.054Z | [OTHER] | Attempt 4300: Error rate 53.7% (target: 15%) -2025-09-15T14:20:49.059Z | [OTHER] | Attempt 4301: Error rate 53.49% (target: 15%) -2025-09-15T14:20:49.064Z | [OTHER] | Attempt 4302: Error rate 56.41% (target: 15%) -2025-09-15T14:20:49.069Z | [OTHER] | Attempt 4303: Error rate 52.78% (target: 15%) -2025-09-15T14:20:49.073Z | [OTHER] | Attempt 4304: Error rate 53.25% (target: 15%) -2025-09-15T14:20:49.078Z | [OTHER] | Attempt 4305: Error rate 58.16% (target: 15%) -2025-09-15T14:20:49.082Z | [OTHER] | Attempt 4306: Error rate 53.25% (target: 15%) -2025-09-15T14:20:49.087Z | [OTHER] | Attempt 4307: Error rate 53.26% (target: 15%) -2025-09-15T14:20:49.091Z | [OTHER] | Attempt 4308: Error rate 51.59% (target: 15%) -2025-09-15T14:20:49.096Z | [OTHER] | Attempt 4309: Error rate 48.37% (target: 15%) -2025-09-15T14:20:49.101Z | [OTHER] | Attempt 4310: Error rate 54.51% (target: 15%) -2025-09-15T14:20:49.106Z | [OTHER] | Attempt 4311: Error rate 54.55% (target: 15%) -2025-09-15T14:20:49.110Z | [OTHER] | Attempt 4312: Error rate 46.34% (target: 15%) -2025-09-15T14:20:49.115Z | [OTHER] | Attempt 4313: Error rate 61.51% (target: 15%) -2025-09-15T14:20:49.120Z | [OTHER] | Attempt 4314: Error rate 53.41% (target: 15%) -2025-09-15T14:20:49.125Z | [OTHER] | Attempt 4315: Error rate 52.27% (target: 15%) -2025-09-15T14:20:49.130Z | [OTHER] | Attempt 4316: Error rate 51.25% (target: 15%) -2025-09-15T14:20:49.134Z | [OTHER] | Attempt 4317: Error rate 46.59% (target: 15%) -2025-09-15T14:20:49.139Z | [OTHER] | Attempt 4318: Error rate 55.04% (target: 15%) -2025-09-15T14:20:49.143Z | [OTHER] | Attempt 4319: Error rate 52.27% (target: 15%) -2025-09-15T14:20:49.148Z | [OTHER] | Attempt 4320: Error rate 44.96% (target: 15%) -2025-09-15T14:20:49.152Z | [OTHER] | Attempt 4321: Error rate 51.89% (target: 15%) -2025-09-15T14:20:49.157Z | [OTHER] | Attempt 4322: Error rate 50.33% (target: 15%) -2025-09-15T14:20:49.161Z | [OTHER] | Attempt 4323: Error rate 52.92% (target: 15%) -2025-09-15T14:20:49.166Z | [OTHER] | Attempt 4324: Error rate 51.16% (target: 15%) -2025-09-15T14:20:49.170Z | [OTHER] | Attempt 4325: Error rate 53.19% (target: 15%) -2025-09-15T14:20:49.175Z | [OTHER] | Attempt 4326: Error rate 50.76% (target: 15%) -2025-09-15T14:20:49.179Z | [OTHER] | Attempt 4327: Error rate 51.16% (target: 15%) -2025-09-15T14:20:49.184Z | [OTHER] | Attempt 4328: Error rate 56.91% (target: 15%) -2025-09-15T14:20:49.189Z | [OTHER] | Attempt 4329: Error rate 53.88% (target: 15%) -2025-09-15T14:20:49.193Z | [OTHER] | Attempt 4330: Error rate 52.22% (target: 15%) -2025-09-15T14:20:49.198Z | [OTHER] | Attempt 4331: Error rate 48.78% (target: 15%) -2025-09-15T14:20:49.203Z | [OTHER] | Attempt 4332: Error rate 46.34% (target: 15%) -2025-09-15T14:20:49.207Z | [OTHER] | Attempt 4333: Error rate 50.41% (target: 15%) -2025-09-15T14:20:49.212Z | [OTHER] | Attempt 4334: Error rate 57.41% (target: 15%) -2025-09-15T14:20:49.217Z | [OTHER] | Attempt 4335: Error rate 55.68% (target: 15%) -2025-09-15T14:20:49.223Z | [OTHER] | Attempt 4336: Error rate 52.78% (target: 15%) -2025-09-15T14:20:49.228Z | [OTHER] | Attempt 4337: Error rate 50% (target: 15%) -2025-09-15T14:20:49.232Z | [OTHER] | Attempt 4338: Error rate 49.61% (target: 15%) -2025-09-15T14:20:49.237Z | [OTHER] | Attempt 4339: Error rate 50.37% (target: 15%) -2025-09-15T14:20:49.241Z | [OTHER] | Attempt 4340: Error rate 48.86% (target: 15%) -2025-09-15T14:20:49.246Z | [OTHER] | Attempt 4341: Error rate 51.19% (target: 15%) -2025-09-15T14:20:49.250Z | [OTHER] | Attempt 4342: Error rate 56.3% (target: 15%) -2025-09-15T14:20:49.254Z | [OTHER] | Attempt 4343: Error rate 50.78% (target: 15%) -2025-09-15T14:20:49.259Z | [OTHER] | Attempt 4344: Error rate 47.81% (target: 15%) -2025-09-15T14:20:49.264Z | [OTHER] | Attempt 4345: Error rate 48.72% (target: 15%) -2025-09-15T14:20:49.268Z | [OTHER] | Attempt 4346: Error rate 58.14% (target: 15%) -2025-09-15T14:20:49.272Z | [OTHER] | Attempt 4347: Error rate 56.82% (target: 15%) -2025-09-15T14:20:49.277Z | [OTHER] | Attempt 4348: Error rate 47.78% (target: 15%) -2025-09-15T14:20:49.282Z | [OTHER] | Attempt 4349: Error rate 56.1% (target: 15%) -2025-09-15T14:20:49.286Z | [OTHER] | Attempt 4350: Error rate 59.06% (target: 15%) -2025-09-15T14:20:49.291Z | [OTHER] | Attempt 4351: Error rate 38.26% (target: 15%) -2025-09-15T14:20:49.296Z | [OTHER] | Attempt 4352: Error rate 48.89% (target: 15%) -2025-09-15T14:20:49.302Z | [OTHER] | Attempt 4353: Error rate 46.9% (target: 15%) -2025-09-15T14:20:49.307Z | [OTHER] | Attempt 4354: Error rate 48.86% (target: 15%) -2025-09-15T14:20:49.311Z | [OTHER] | Attempt 4355: Error rate 62.79% (target: 15%) -2025-09-15T14:20:49.316Z | [OTHER] | Attempt 4356: Error rate 55.98% (target: 15%) -2025-09-15T14:20:49.321Z | [OTHER] | Attempt 4357: Error rate 57.09% (target: 15%) -2025-09-15T14:20:49.326Z | [OTHER] | Attempt 4358: Error rate 52.27% (target: 15%) -2025-09-15T14:20:49.330Z | [OTHER] | Attempt 4359: Error rate 50.71% (target: 15%) -2025-09-15T14:20:49.335Z | [OTHER] | Attempt 4360: Error rate 43.56% (target: 15%) -2025-09-15T14:20:49.340Z | [OTHER] | Attempt 4361: Error rate 54.55% (target: 15%) -2025-09-15T14:20:49.345Z | [OTHER] | Attempt 4362: Error rate 55.3% (target: 15%) -2025-09-15T14:20:49.349Z | [OTHER] | Attempt 4363: Error rate 59.57% (target: 15%) -2025-09-15T14:20:49.354Z | [OTHER] | Attempt 4364: Error rate 56.35% (target: 15%) -2025-09-15T14:20:49.358Z | [OTHER] | Attempt 4365: Error rate 50.79% (target: 15%) -2025-09-15T14:20:49.363Z | [OTHER] | Attempt 4366: Error rate 44.44% (target: 15%) -2025-09-15T14:20:49.367Z | [OTHER] | Attempt 4367: Error rate 53.88% (target: 15%) -2025-09-15T14:20:49.372Z | [OTHER] | Attempt 4368: Error rate 51.14% (target: 15%) -2025-09-15T14:20:49.377Z | [OTHER] | Attempt 4369: Error rate 42.92% (target: 15%) -2025-09-15T14:20:49.382Z | [OTHER] | Attempt 4370: Error rate 52.48% (target: 15%) -2025-09-15T14:20:49.387Z | [OTHER] | Attempt 4371: Error rate 52.33% (target: 15%) -2025-09-15T14:20:49.392Z | [OTHER] | Attempt 4372: Error rate 59.63% (target: 15%) -2025-09-15T14:20:49.396Z | [OTHER] | Attempt 4373: Error rate 54.5% (target: 15%) -2025-09-15T14:20:49.401Z | [OTHER] | Attempt 4374: Error rate 55.8% (target: 15%) -2025-09-15T14:20:49.406Z | [OTHER] | Attempt 4375: Error rate 52.33% (target: 15%) -2025-09-15T14:20:49.411Z | [OTHER] | Attempt 4376: Error rate 46.3% (target: 15%) -2025-09-15T14:20:49.417Z | [OTHER] | Attempt 4377: Error rate 51.71% (target: 15%) -2025-09-15T14:20:49.423Z | [OTHER] | Attempt 4378: Error rate 53.33% (target: 15%) -2025-09-15T14:20:49.429Z | [OTHER] | Attempt 4379: Error rate 53.26% (target: 15%) -2025-09-15T14:20:49.435Z | [OTHER] | Attempt 4380: Error rate 53.26% (target: 15%) -2025-09-15T14:20:49.439Z | [OTHER] | Attempt 4381: Error rate 50% (target: 15%) -2025-09-15T14:20:49.444Z | [OTHER] | Attempt 4382: Error rate 46.25% (target: 15%) -2025-09-15T14:20:49.449Z | [OTHER] | Attempt 4383: Error rate 49.24% (target: 15%) -2025-09-15T14:20:49.453Z | [OTHER] | Attempt 4384: Error rate 57.04% (target: 15%) -2025-09-15T14:20:49.458Z | [OTHER] | Attempt 4385: Error rate 52.13% (target: 15%) -2025-09-15T14:20:49.463Z | [OTHER] | Attempt 4386: Error rate 55.16% (target: 15%) -2025-09-15T14:20:49.467Z | [OTHER] | Attempt 4387: Error rate 50% (target: 15%) -2025-09-15T14:20:49.472Z | [OTHER] | Attempt 4388: Error rate 55.16% (target: 15%) -2025-09-15T14:20:49.477Z | [OTHER] | Attempt 4389: Error rate 52.33% (target: 15%) -2025-09-15T14:20:49.481Z | [OTHER] | Attempt 4390: Error rate 50.41% (target: 15%) -2025-09-15T14:20:49.485Z | [OTHER] | Attempt 4391: Error rate 55.56% (target: 15%) -2025-09-15T14:20:49.490Z | [OTHER] | Attempt 4392: Error rate 44.79% (target: 15%) -2025-09-15T14:20:49.495Z | [OTHER] | Attempt 4393: Error rate 48.06% (target: 15%) -2025-09-15T14:20:49.500Z | [OTHER] | Attempt 4394: Error rate 57.58% (target: 15%) -2025-09-15T14:20:49.505Z | [OTHER] | Attempt 4395: Error rate 53.82% (target: 15%) -2025-09-15T14:20:49.509Z | [OTHER] | Attempt 4396: Error rate 50.71% (target: 15%) -2025-09-15T14:20:49.514Z | [OTHER] | Attempt 4397: Error rate 52.04% (target: 15%) -2025-09-15T14:20:49.519Z | [OTHER] | Attempt 4398: Error rate 39.13% (target: 15%) -2025-09-15T14:20:49.524Z | [OTHER] | Attempt 4399: Error rate 51.45% (target: 15%) -2025-09-15T14:20:49.528Z | [OTHER] | Attempt 4400: Error rate 48.84% (target: 15%) -2025-09-15T14:20:49.533Z | [OTHER] | Attempt 4401: Error rate 48.48% (target: 15%) -2025-09-15T14:20:49.539Z | [OTHER] | Attempt 4402: Error rate 54.44% (target: 15%) -2025-09-15T14:20:49.544Z | [OTHER] | Attempt 4403: Error rate 55.21% (target: 15%) -2025-09-15T14:20:49.548Z | [OTHER] | Attempt 4404: Error rate 51.11% (target: 15%) -2025-09-15T14:20:49.553Z | [OTHER] | Attempt 4405: Error rate 52.44% (target: 15%) -2025-09-15T14:20:49.558Z | [OTHER] | Attempt 4406: Error rate 50.79% (target: 15%) -2025-09-15T14:20:49.562Z | [OTHER] | Attempt 4407: Error rate 50.76% (target: 15%) -2025-09-15T14:20:49.567Z | [OTHER] | Attempt 4408: Error rate 47.67% (target: 15%) -2025-09-15T14:20:49.572Z | [OTHER] | Attempt 4409: Error rate 52.22% (target: 15%) -2025-09-15T14:20:49.576Z | [OTHER] | Attempt 4410: Error rate 44.17% (target: 15%) -2025-09-15T14:20:49.581Z | [OTHER] | Attempt 4411: Error rate 53.85% (target: 15%) -2025-09-15T14:20:49.586Z | [OTHER] | Attempt 4412: Error rate 52.78% (target: 15%) -2025-09-15T14:20:49.590Z | [OTHER] | Attempt 4413: Error rate 51.85% (target: 15%) -2025-09-15T14:20:49.595Z | [OTHER] | Attempt 4414: Error rate 49.26% (target: 15%) -2025-09-15T14:20:49.600Z | [OTHER] | Attempt 4415: Error rate 52.78% (target: 15%) -2025-09-15T14:20:49.605Z | [OTHER] | Attempt 4416: Error rate 56.59% (target: 15%) -2025-09-15T14:20:49.610Z | [OTHER] | Attempt 4417: Error rate 54.35% (target: 15%) -2025-09-15T14:20:49.614Z | [OTHER] | Attempt 4418: Error rate 48.02% (target: 15%) -2025-09-15T14:20:49.619Z | [OTHER] | Attempt 4419: Error rate 54.92% (target: 15%) -2025-09-15T14:20:49.624Z | [OTHER] | Attempt 4420: Error rate 55.68% (target: 15%) -2025-09-15T14:20:49.630Z | [OTHER] | Attempt 4421: Error rate 44.2% (target: 15%) -2025-09-15T14:20:49.636Z | [OTHER] | Attempt 4422: Error rate 50.71% (target: 15%) -2025-09-15T14:20:49.643Z | [OTHER] | Attempt 4423: Error rate 55% (target: 15%) -2025-09-15T14:20:49.649Z | [OTHER] | Attempt 4424: Error rate 58.91% (target: 15%) -2025-09-15T14:20:49.654Z | [OTHER] | Attempt 4425: Error rate 55.93% (target: 15%) -2025-09-15T14:20:49.659Z | [OTHER] | Attempt 4426: Error rate 56.25% (target: 15%) -2025-09-15T14:20:49.664Z | [OTHER] | Attempt 4427: Error rate 47.67% (target: 15%) -2025-09-15T14:20:49.669Z | [OTHER] | Attempt 4428: Error rate 47.22% (target: 15%) -2025-09-15T14:20:49.674Z | [OTHER] | Attempt 4429: Error rate 49.56% (target: 15%) -2025-09-15T14:20:49.679Z | [OTHER] | Attempt 4430: Error rate 42.11% (target: 15%) -2025-09-15T14:20:49.684Z | [OTHER] | Attempt 4431: Error rate 55.69% (target: 15%) -2025-09-15T14:20:49.689Z | [OTHER] | Attempt 4432: Error rate 54.07% (target: 15%) -2025-09-15T14:20:49.694Z | [OTHER] | Attempt 4433: Error rate 59.63% (target: 15%) -2025-09-15T14:20:49.699Z | [OTHER] | Attempt 4434: Error rate 51.11% (target: 15%) -2025-09-15T14:20:49.703Z | [OTHER] | Attempt 4435: Error rate 52.17% (target: 15%) -2025-09-15T14:20:49.709Z | [OTHER] | Attempt 4436: Error rate 52.9% (target: 15%) -2025-09-15T14:20:49.714Z | [OTHER] | Attempt 4437: Error rate 49.62% (target: 15%) -2025-09-15T14:20:49.719Z | [OTHER] | Attempt 4438: Error rate 55% (target: 15%) -2025-09-15T14:20:49.723Z | [OTHER] | Attempt 4439: Error rate 55.1% (target: 15%) -2025-09-15T14:20:49.728Z | [OTHER] | Attempt 4440: Error rate 51.94% (target: 15%) -2025-09-15T14:20:49.733Z | [OTHER] | Attempt 4441: Error rate 61.11% (target: 15%) -2025-09-15T14:20:49.738Z | [OTHER] | Attempt 4442: Error rate 55.28% (target: 15%) -2025-09-15T14:20:49.743Z | [OTHER] | Attempt 4443: Error rate 48.45% (target: 15%) -2025-09-15T14:20:49.747Z | [OTHER] | Attempt 4444: Error rate 47.1% (target: 15%) -2025-09-15T14:20:49.752Z | [OTHER] | Attempt 4445: Error rate 59.48% (target: 15%) -2025-09-15T14:20:49.757Z | [OTHER] | Attempt 4446: Error rate 45.93% (target: 15%) -2025-09-15T14:20:49.762Z | [OTHER] | Attempt 4447: Error rate 52.56% (target: 15%) -2025-09-15T14:20:49.767Z | [OTHER] | Attempt 4448: Error rate 52.84% (target: 15%) -2025-09-15T14:20:49.771Z | [OTHER] | Attempt 4449: Error rate 47.35% (target: 15%) -2025-09-15T14:20:49.776Z | [OTHER] | Attempt 4450: Error rate 46.25% (target: 15%) -2025-09-15T14:20:49.781Z | [OTHER] | Attempt 4451: Error rate 50.45% (target: 15%) -2025-09-15T14:20:49.785Z | [OTHER] | Attempt 4452: Error rate 53.26% (target: 15%) -2025-09-15T14:20:49.790Z | [OTHER] | Attempt 4453: Error rate 50.35% (target: 15%) -2025-09-15T14:20:49.794Z | [OTHER] | Attempt 4454: Error rate 52.44% (target: 15%) -2025-09-15T14:20:49.799Z | [OTHER] | Attempt 4455: Error rate 45.95% (target: 15%) -2025-09-15T14:20:49.804Z | [OTHER] | Attempt 4456: Error rate 48.89% (target: 15%) -2025-09-15T14:20:49.809Z | [OTHER] | Attempt 4457: Error rate 52.92% (target: 15%) -2025-09-15T14:20:49.814Z | [OTHER] | Attempt 4458: Error rate 50% (target: 15%) -2025-09-15T14:20:49.818Z | [OTHER] | Attempt 4459: Error rate 50.72% (target: 15%) -2025-09-15T14:20:49.823Z | [OTHER] | Attempt 4460: Error rate 60.42% (target: 15%) -2025-09-15T14:20:49.828Z | [OTHER] | Attempt 4461: Error rate 47.29% (target: 15%) -2025-09-15T14:20:49.832Z | [OTHER] | Attempt 4462: Error rate 53.41% (target: 15%) -2025-09-15T14:20:49.837Z | [OTHER] | Attempt 4463: Error rate 50% (target: 15%) -2025-09-15T14:20:49.842Z | [OTHER] | Attempt 4464: Error rate 63.33% (target: 15%) -2025-09-15T14:20:49.846Z | [OTHER] | Attempt 4465: Error rate 57.61% (target: 15%) -2025-09-15T14:20:49.852Z | [OTHER] | Attempt 4466: Error rate 50.83% (target: 15%) -2025-09-15T14:20:49.856Z | [OTHER] | Attempt 4467: Error rate 46.34% (target: 15%) -2025-09-15T14:20:49.861Z | [OTHER] | Attempt 4468: Error rate 61.51% (target: 15%) -2025-09-15T14:20:49.866Z | [OTHER] | Attempt 4469: Error rate 50.4% (target: 15%) -2025-09-15T14:20:49.870Z | [OTHER] | Attempt 4470: Error rate 55.42% (target: 15%) -2025-09-15T14:20:49.875Z | [OTHER] | Attempt 4471: Error rate 46.97% (target: 15%) -2025-09-15T14:20:49.879Z | [OTHER] | Attempt 4472: Error rate 52.78% (target: 15%) -2025-09-15T14:20:49.884Z | [OTHER] | Attempt 4473: Error rate 52.99% (target: 15%) -2025-09-15T14:20:49.889Z | [OTHER] | Attempt 4474: Error rate 48.45% (target: 15%) -2025-09-15T14:20:49.894Z | [OTHER] | Attempt 4475: Error rate 53.67% (target: 15%) -2025-09-15T14:20:49.899Z | [OTHER] | Attempt 4476: Error rate 45.56% (target: 15%) -2025-09-15T14:20:49.904Z | [OTHER] | Attempt 4477: Error rate 52.33% (target: 15%) -2025-09-15T14:20:49.909Z | [OTHER] | Attempt 4478: Error rate 55.19% (target: 15%) -2025-09-15T14:20:49.913Z | [OTHER] | Attempt 4479: Error rate 48.06% (target: 15%) -2025-09-15T14:20:49.918Z | [OTHER] | Attempt 4480: Error rate 58.54% (target: 15%) -2025-09-15T14:20:49.923Z | [OTHER] | Attempt 4481: Error rate 55.43% (target: 15%) -2025-09-15T14:20:49.927Z | [OTHER] | Attempt 4482: Error rate 50% (target: 15%) -2025-09-15T14:20:49.932Z | [OTHER] | Attempt 4483: Error rate 48.19% (target: 15%) -2025-09-15T14:20:49.937Z | [OTHER] | Attempt 4484: Error rate 47.37% (target: 15%) -2025-09-15T14:20:49.948Z | [OTHER] | Attempt 4485: Error rate 61.25% (target: 15%) -2025-09-15T14:20:49.957Z | [OTHER] | Attempt 4486: Error rate 50.41% (target: 15%) -2025-09-15T14:20:49.968Z | [OTHER] | Attempt 4487: Error rate 61.11% (target: 15%) -2025-09-15T14:20:49.975Z | [OTHER] | Attempt 4488: Error rate 45.65% (target: 15%) -2025-09-15T14:20:49.982Z | [OTHER] | Attempt 4489: Error rate 58.14% (target: 15%) -2025-09-15T14:20:49.988Z | [OTHER] | Attempt 4490: Error rate 50.74% (target: 15%) -2025-09-15T14:20:49.993Z | [OTHER] | Attempt 4491: Error rate 51.14% (target: 15%) -2025-09-15T14:20:49.999Z | [OTHER] | Attempt 4492: Error rate 53.1% (target: 15%) -2025-09-15T14:20:50.005Z | [OTHER] | Attempt 4493: Error rate 50% (target: 15%) -2025-09-15T14:20:50.011Z | [OTHER] | Attempt 4494: Error rate 53.79% (target: 15%) -2025-09-15T14:20:50.018Z | [OTHER] | Attempt 4495: Error rate 53.55% (target: 15%) -2025-09-15T14:20:50.024Z | [OTHER] | Attempt 4496: Error rate 52.54% (target: 15%) -2025-09-15T14:20:50.029Z | [OTHER] | Attempt 4497: Error rate 51.11% (target: 15%) -2025-09-15T14:20:50.034Z | [OTHER] | Attempt 4498: Error rate 53.88% (target: 15%) -2025-09-15T14:20:50.038Z | [OTHER] | Attempt 4499: Error rate 47.1% (target: 15%) -2025-09-15T14:20:50.044Z | [OTHER] | Attempt 4500: Error rate 52.08% (target: 15%) -2025-09-15T14:20:50.049Z | [OTHER] | Attempt 4501: Error rate 48.81% (target: 15%) -2025-09-15T14:20:50.055Z | [OTHER] | Attempt 4502: Error rate 51.45% (target: 15%) -2025-09-15T14:20:50.061Z | [OTHER] | Attempt 4503: Error rate 51.42% (target: 15%) -2025-09-15T14:20:50.066Z | [OTHER] | Attempt 4504: Error rate 45.53% (target: 15%) -2025-09-15T14:20:50.072Z | [OTHER] | Attempt 4505: Error rate 55.56% (target: 15%) -2025-09-15T14:20:50.077Z | [OTHER] | Attempt 4506: Error rate 52.71% (target: 15%) -2025-09-15T14:20:50.082Z | [OTHER] | Attempt 4507: Error rate 62.22% (target: 15%) -2025-09-15T14:20:50.087Z | [OTHER] | Attempt 4508: Error rate 56.35% (target: 15%) -2025-09-15T14:20:50.092Z | [OTHER] | Attempt 4509: Error rate 50.35% (target: 15%) -2025-09-15T14:20:50.096Z | [OTHER] | Attempt 4510: Error rate 54.96% (target: 15%) -2025-09-15T14:20:50.101Z | [OTHER] | Attempt 4511: Error rate 53.75% (target: 15%) -2025-09-15T14:20:50.106Z | [OTHER] | Attempt 4512: Error rate 57.5% (target: 15%) -2025-09-15T14:20:50.110Z | [OTHER] | Attempt 4513: Error rate 46.9% (target: 15%) -2025-09-15T14:20:50.115Z | [OTHER] | Attempt 4514: Error rate 56.67% (target: 15%) -2025-09-15T14:20:50.120Z | [OTHER] | Attempt 4515: Error rate 59.22% (target: 15%) -2025-09-15T14:20:50.125Z | [OTHER] | Attempt 4516: Error rate 51.48% (target: 15%) -2025-09-15T14:20:50.131Z | [OTHER] | Attempt 4517: Error rate 51.63% (target: 15%) -2025-09-15T14:20:50.136Z | [OTHER] | Attempt 4518: Error rate 51.89% (target: 15%) -2025-09-15T14:20:50.140Z | [OTHER] | Attempt 4519: Error rate 48.84% (target: 15%) -2025-09-15T14:20:50.147Z | [OTHER] | Attempt 4520: Error rate 58.52% (target: 15%) -2025-09-15T14:20:50.152Z | [OTHER] | Attempt 4521: Error rate 55.8% (target: 15%) -2025-09-15T14:20:50.158Z | [OTHER] | Attempt 4522: Error rate 49.19% (target: 15%) -2025-09-15T14:20:50.162Z | [OTHER] | Attempt 4523: Error rate 51.89% (target: 15%) -2025-09-15T14:20:50.167Z | [OTHER] | Attempt 4524: Error rate 60.99% (target: 15%) -2025-09-15T14:20:50.172Z | [OTHER] | Attempt 4525: Error rate 56.6% (target: 15%) -2025-09-15T14:20:50.176Z | [OTHER] | Attempt 4526: Error rate 59.57% (target: 15%) -2025-09-15T14:20:50.182Z | [OTHER] | Attempt 4527: Error rate 54.71% (target: 15%) -2025-09-15T14:20:50.187Z | [OTHER] | Attempt 4528: Error rate 47.57% (target: 15%) -2025-09-15T14:20:50.192Z | [OTHER] | Attempt 4529: Error rate 53.42% (target: 15%) -2025-09-15T14:20:50.197Z | [OTHER] | Attempt 4530: Error rate 42.74% (target: 15%) -2025-09-15T14:20:50.202Z | [OTHER] | Attempt 4531: Error rate 52.63% (target: 15%) -2025-09-15T14:20:50.206Z | [OTHER] | Attempt 4532: Error rate 53.17% (target: 15%) -2025-09-15T14:20:50.211Z | [OTHER] | Attempt 4533: Error rate 56.88% (target: 15%) -2025-09-15T14:20:50.216Z | [OTHER] | Attempt 4534: Error rate 52.9% (target: 15%) -2025-09-15T14:20:50.222Z | [OTHER] | Attempt 4535: Error rate 51.43% (target: 15%) -2025-09-15T14:20:50.226Z | [OTHER] | Attempt 4536: Error rate 58.33% (target: 15%) -2025-09-15T14:20:50.232Z | [OTHER] | Attempt 4537: Error rate 48.84% (target: 15%) -2025-09-15T14:20:50.236Z | [OTHER] | Attempt 4538: Error rate 52.65% (target: 15%) -2025-09-15T14:20:50.241Z | [OTHER] | Attempt 4539: Error rate 53.7% (target: 15%) -2025-09-15T14:20:50.246Z | [OTHER] | Attempt 4540: Error rate 50% (target: 15%) -2025-09-15T14:20:50.251Z | [OTHER] | Attempt 4541: Error rate 54.44% (target: 15%) -2025-09-15T14:20:50.255Z | [OTHER] | Attempt 4542: Error rate 56.1% (target: 15%) -2025-09-15T14:20:50.260Z | [OTHER] | Attempt 4543: Error rate 50.35% (target: 15%) -2025-09-15T14:20:50.265Z | [OTHER] | Attempt 4544: Error rate 54.5% (target: 15%) -2025-09-15T14:20:50.270Z | [OTHER] | Attempt 4545: Error rate 56.25% (target: 15%) -2025-09-15T14:20:50.275Z | [OTHER] | Attempt 4546: Error rate 53.03% (target: 15%) -2025-09-15T14:20:50.280Z | [OTHER] | Attempt 4547: Error rate 58.87% (target: 15%) -2025-09-15T14:20:50.285Z | [OTHER] | Attempt 4548: Error rate 55.21% (target: 15%) -2025-09-15T14:20:50.290Z | [OTHER] | Attempt 4549: Error rate 46.83% (target: 15%) -2025-09-15T14:20:50.295Z | [OTHER] | Attempt 4550: Error rate 49.62% (target: 15%) -2025-09-15T14:20:50.301Z | [OTHER] | Attempt 4551: Error rate 51.67% (target: 15%) -2025-09-15T14:20:50.306Z | [OTHER] | Attempt 4552: Error rate 48.75% (target: 15%) -2025-09-15T14:20:50.311Z | [OTHER] | Attempt 4553: Error rate 52.78% (target: 15%) -2025-09-15T14:20:50.316Z | [OTHER] | Attempt 4554: Error rate 48.19% (target: 15%) -2025-09-15T14:20:50.321Z | [OTHER] | Attempt 4555: Error rate 48.81% (target: 15%) -2025-09-15T14:20:50.327Z | [OTHER] | Attempt 4556: Error rate 55.07% (target: 15%) -2025-09-15T14:20:50.333Z | [OTHER] | Attempt 4557: Error rate 56.6% (target: 15%) -2025-09-15T14:20:50.338Z | [OTHER] | Attempt 4558: Error rate 55.83% (target: 15%) -2025-09-15T14:20:50.343Z | [OTHER] | Attempt 4559: Error rate 51.48% (target: 15%) -2025-09-15T14:20:50.348Z | [OTHER] | Attempt 4560: Error rate 49.63% (target: 15%) -2025-09-15T14:20:50.353Z | [OTHER] | Attempt 4561: Error rate 56.94% (target: 15%) -2025-09-15T14:20:50.358Z | [OTHER] | Attempt 4562: Error rate 54.71% (target: 15%) -2025-09-15T14:20:50.363Z | [OTHER] | Attempt 4563: Error rate 55.19% (target: 15%) -2025-09-15T14:20:50.368Z | [OTHER] | Attempt 4564: Error rate 56.75% (target: 15%) -2025-09-15T14:20:50.372Z | [OTHER] | Attempt 4565: Error rate 50% (target: 15%) -2025-09-15T14:20:50.377Z | [OTHER] | Attempt 4566: Error rate 51.06% (target: 15%) -2025-09-15T14:20:50.382Z | [OTHER] | Attempt 4567: Error rate 51.14% (target: 15%) -2025-09-15T14:20:50.387Z | [OTHER] | Attempt 4568: Error rate 53.51% (target: 15%) -2025-09-15T14:20:50.392Z | [OTHER] | Attempt 4569: Error rate 51.52% (target: 15%) -2025-09-15T14:20:50.396Z | [OTHER] | Attempt 4570: Error rate 56.88% (target: 15%) -2025-09-15T14:20:50.401Z | [OTHER] | Attempt 4571: Error rate 50% (target: 15%) -2025-09-15T14:20:50.406Z | [OTHER] | Attempt 4572: Error rate 56.82% (target: 15%) -2025-09-15T14:20:50.410Z | [OTHER] | Attempt 4573: Error rate 49.28% (target: 15%) -2025-09-15T14:20:50.415Z | [OTHER] | Attempt 4574: Error rate 46.75% (target: 15%) -2025-09-15T14:20:50.420Z | [OTHER] | Attempt 4575: Error rate 53.47% (target: 15%) -2025-09-15T14:20:50.425Z | [OTHER] | Attempt 4576: Error rate 51.14% (target: 15%) -2025-09-15T14:20:50.430Z | [OTHER] | Attempt 4577: Error rate 46.01% (target: 15%) -2025-09-15T14:20:50.435Z | [OTHER] | Attempt 4578: Error rate 53.7% (target: 15%) -2025-09-15T14:20:50.440Z | [OTHER] | Attempt 4579: Error rate 45.74% (target: 15%) -2025-09-15T14:20:50.444Z | [OTHER] | Attempt 4580: Error rate 53.9% (target: 15%) -2025-09-15T14:20:50.449Z | [OTHER] | Attempt 4581: Error rate 57.64% (target: 15%) -2025-09-15T14:20:50.453Z | [OTHER] | Attempt 4582: Error rate 48.15% (target: 15%) -2025-09-15T14:20:50.459Z | [OTHER] | Attempt 4583: Error rate 53.55% (target: 15%) -2025-09-15T14:20:50.464Z | [OTHER] | Attempt 4584: Error rate 57.48% (target: 15%) -2025-09-15T14:20:50.468Z | [OTHER] | Attempt 4585: Error rate 50% (target: 15%) -2025-09-15T14:20:50.473Z | [OTHER] | Attempt 4586: Error rate 53% (target: 15%) -2025-09-15T14:20:50.478Z | [OTHER] | Attempt 4587: Error rate 47.97% (target: 15%) -2025-09-15T14:20:50.483Z | [OTHER] | Attempt 4588: Error rate 47.22% (target: 15%) -2025-09-15T14:20:50.488Z | [OTHER] | Attempt 4589: Error rate 51.89% (target: 15%) -2025-09-15T14:20:50.493Z | [OTHER] | Attempt 4590: Error rate 57.29% (target: 15%) -2025-09-15T14:20:50.498Z | [OTHER] | Attempt 4591: Error rate 64.73% (target: 15%) -2025-09-15T14:20:50.503Z | [OTHER] | Attempt 4592: Error rate 53.26% (target: 15%) -2025-09-15T14:20:50.510Z | [OTHER] | Attempt 4593: Error rate 52.33% (target: 15%) -2025-09-15T14:20:50.514Z | [OTHER] | Attempt 4594: Error rate 53.25% (target: 15%) -2025-09-15T14:20:50.519Z | [OTHER] | Attempt 4595: Error rate 54.35% (target: 15%) -2025-09-15T14:20:50.524Z | [OTHER] | Attempt 4596: Error rate 55.43% (target: 15%) -2025-09-15T14:20:50.528Z | [OTHER] | Attempt 4597: Error rate 53.99% (target: 15%) -2025-09-15T14:20:50.533Z | [OTHER] | Attempt 4598: Error rate 39.92% (target: 15%) -2025-09-15T14:20:50.539Z | [OTHER] | Attempt 4599: Error rate 49.15% (target: 15%) -2025-09-15T14:20:50.543Z | [OTHER] | Attempt 4600: Error rate 52.9% (target: 15%) -2025-09-15T14:20:50.548Z | [OTHER] | Attempt 4601: Error rate 49.24% (target: 15%) -2025-09-15T14:20:50.553Z | [OTHER] | Attempt 4602: Error rate 55.43% (target: 15%) -2025-09-15T14:20:50.558Z | [OTHER] | Attempt 4603: Error rate 51.67% (target: 15%) -2025-09-15T14:20:50.563Z | [OTHER] | Attempt 4604: Error rate 55.3% (target: 15%) -2025-09-15T14:20:50.568Z | [OTHER] | Attempt 4605: Error rate 43.56% (target: 15%) -2025-09-15T14:20:50.573Z | [OTHER] | Attempt 4606: Error rate 60.26% (target: 15%) -2025-09-15T14:20:50.578Z | [OTHER] | Attempt 4607: Error rate 56.38% (target: 15%) -2025-09-15T14:20:50.583Z | [OTHER] | Attempt 4608: Error rate 50.67% (target: 15%) -2025-09-15T14:20:50.588Z | [OTHER] | Attempt 4609: Error rate 49.31% (target: 15%) -2025-09-15T14:20:50.593Z | [OTHER] | Attempt 4610: Error rate 53.06% (target: 15%) -2025-09-15T14:20:50.598Z | [OTHER] | Attempt 4611: Error rate 43.9% (target: 15%) -2025-09-15T14:20:50.603Z | [OTHER] | Attempt 4612: Error rate 47.67% (target: 15%) -2025-09-15T14:20:50.608Z | [OTHER] | Attempt 4613: Error rate 56.91% (target: 15%) -2025-09-15T14:20:50.613Z | [OTHER] | Attempt 4614: Error rate 46.03% (target: 15%) -2025-09-15T14:20:50.618Z | [OTHER] | Attempt 4615: Error rate 55.98% (target: 15%) -2025-09-15T14:20:50.623Z | [OTHER] | Attempt 4616: Error rate 55.81% (target: 15%) -2025-09-15T14:20:50.628Z | [OTHER] | Attempt 4617: Error rate 50.85% (target: 15%) -2025-09-15T14:20:50.633Z | [OTHER] | Attempt 4618: Error rate 47.22% (target: 15%) -2025-09-15T14:20:50.637Z | [OTHER] | Attempt 4619: Error rate 56.44% (target: 15%) -2025-09-15T14:20:50.643Z | [OTHER] | Attempt 4620: Error rate 55.16% (target: 15%) -2025-09-15T14:20:50.648Z | [OTHER] | Attempt 4621: Error rate 63.1% (target: 15%) -2025-09-15T14:20:50.653Z | [OTHER] | Attempt 4622: Error rate 49.58% (target: 15%) -2025-09-15T14:20:50.657Z | [OTHER] | Attempt 4623: Error rate 54.26% (target: 15%) -2025-09-15T14:20:50.662Z | [OTHER] | Attempt 4624: Error rate 52.14% (target: 15%) -2025-09-15T14:20:50.667Z | [OTHER] | Attempt 4625: Error rate 55.42% (target: 15%) -2025-09-15T14:20:50.671Z | [OTHER] | Attempt 4626: Error rate 48.84% (target: 15%) -2025-09-15T14:20:50.677Z | [OTHER] | Attempt 4627: Error rate 51.45% (target: 15%) -2025-09-15T14:20:50.683Z | [OTHER] | Attempt 4628: Error rate 47.15% (target: 15%) -2025-09-15T14:20:50.688Z | [OTHER] | Attempt 4629: Error rate 50.81% (target: 15%) -2025-09-15T14:20:50.693Z | [OTHER] | Attempt 4630: Error rate 44.1% (target: 15%) -2025-09-15T14:20:50.698Z | [OTHER] | Attempt 4631: Error rate 48.78% (target: 15%) -2025-09-15T14:20:50.702Z | [OTHER] | Attempt 4632: Error rate 50% (target: 15%) -2025-09-15T14:20:50.708Z | [OTHER] | Attempt 4633: Error rate 48.11% (target: 15%) -2025-09-15T14:20:50.713Z | [OTHER] | Attempt 4634: Error rate 52.22% (target: 15%) -2025-09-15T14:20:50.719Z | [OTHER] | Attempt 4635: Error rate 50.41% (target: 15%) -2025-09-15T14:20:50.724Z | [OTHER] | Attempt 4636: Error rate 54.35% (target: 15%) -2025-09-15T14:20:50.729Z | [OTHER] | Attempt 4637: Error rate 55.04% (target: 15%) -2025-09-15T14:20:50.733Z | [OTHER] | Attempt 4638: Error rate 56.44% (target: 15%) -2025-09-15T14:20:50.738Z | [OTHER] | Attempt 4639: Error rate 57.14% (target: 15%) -2025-09-15T14:20:50.743Z | [OTHER] | Attempt 4640: Error rate 53.55% (target: 15%) -2025-09-15T14:20:50.747Z | [OTHER] | Attempt 4641: Error rate 47.52% (target: 15%) -2025-09-15T14:20:50.752Z | [OTHER] | Attempt 4642: Error rate 49.15% (target: 15%) -2025-09-15T14:20:50.757Z | [OTHER] | Attempt 4643: Error rate 46.12% (target: 15%) -2025-09-15T14:20:50.762Z | [OTHER] | Attempt 4644: Error rate 62.33% (target: 15%) -2025-09-15T14:20:50.767Z | [OTHER] | Attempt 4645: Error rate 51.22% (target: 15%) -2025-09-15T14:20:50.771Z | [OTHER] | Attempt 4646: Error rate 57.95% (target: 15%) -2025-09-15T14:20:50.776Z | [OTHER] | Attempt 4647: Error rate 55.56% (target: 15%) -2025-09-15T14:20:50.782Z | [OTHER] | Attempt 4648: Error rate 55.93% (target: 15%) -2025-09-15T14:20:50.786Z | [OTHER] | Attempt 4649: Error rate 57.2% (target: 15%) -2025-09-15T14:20:50.791Z | [OTHER] | Attempt 4650: Error rate 56.1% (target: 15%) -2025-09-15T14:20:50.796Z | [OTHER] | Attempt 4651: Error rate 50% (target: 15%) -2025-09-15T14:20:50.801Z | [OTHER] | Attempt 4652: Error rate 52.33% (target: 15%) -2025-09-15T14:20:50.806Z | [OTHER] | Attempt 4653: Error rate 48.84% (target: 15%) -2025-09-15T14:20:50.811Z | [OTHER] | Attempt 4654: Error rate 57.61% (target: 15%) -2025-09-15T14:20:50.816Z | [OTHER] | Attempt 4655: Error rate 43.12% (target: 15%) -2025-09-15T14:20:50.822Z | [OTHER] | Attempt 4656: Error rate 50% (target: 15%) -2025-09-15T14:20:50.827Z | [OTHER] | Attempt 4657: Error rate 58.7% (target: 15%) -2025-09-15T14:20:50.832Z | [OTHER] | Attempt 4658: Error rate 53.33% (target: 15%) -2025-09-15T14:20:50.837Z | [OTHER] | Attempt 4659: Error rate 47.83% (target: 15%) -2025-09-15T14:20:50.842Z | [OTHER] | Attempt 4660: Error rate 51.85% (target: 15%) -2025-09-15T14:20:50.847Z | [OTHER] | Attempt 4661: Error rate 55.21% (target: 15%) -2025-09-15T14:20:50.851Z | [OTHER] | Attempt 4662: Error rate 46.9% (target: 15%) -2025-09-15T14:20:50.856Z | [OTHER] | Attempt 4663: Error rate 59.86% (target: 15%) -2025-09-15T14:20:50.861Z | [OTHER] | Attempt 4664: Error rate 55.93% (target: 15%) -2025-09-15T14:20:50.866Z | [OTHER] | Attempt 4665: Error rate 52.27% (target: 15%) -2025-09-15T14:20:50.872Z | [OTHER] | Attempt 4666: Error rate 47.62% (target: 15%) -2025-09-15T14:20:50.876Z | [OTHER] | Attempt 4667: Error rate 54.81% (target: 15%) -2025-09-15T14:20:50.882Z | [OTHER] | Attempt 4668: Error rate 49.64% (target: 15%) -2025-09-15T14:20:50.887Z | [OTHER] | Attempt 4669: Error rate 52.71% (target: 15%) -2025-09-15T14:20:50.893Z | [OTHER] | Attempt 4670: Error rate 50% (target: 15%) -2025-09-15T14:20:50.898Z | [OTHER] | Attempt 4671: Error rate 48.52% (target: 15%) -2025-09-15T14:20:50.902Z | [OTHER] | Attempt 4672: Error rate 50.81% (target: 15%) -2025-09-15T14:20:50.908Z | [OTHER] | Attempt 4673: Error rate 59.8% (target: 15%) -2025-09-15T14:20:50.913Z | [OTHER] | Attempt 4674: Error rate 53.88% (target: 15%) -2025-09-15T14:20:50.918Z | [OTHER] | Attempt 4675: Error rate 48.11% (target: 15%) -2025-09-15T14:20:50.922Z | [OTHER] | Attempt 4676: Error rate 54.26% (target: 15%) -2025-09-15T14:20:50.927Z | [OTHER] | Attempt 4677: Error rate 60.57% (target: 15%) -2025-09-15T14:20:50.933Z | [OTHER] | Attempt 4678: Error rate 57.36% (target: 15%) -2025-09-15T14:20:50.937Z | [OTHER] | Attempt 4679: Error rate 56.75% (target: 15%) -2025-09-15T14:20:50.942Z | [OTHER] | Attempt 4680: Error rate 42.05% (target: 15%) -2025-09-15T14:20:50.948Z | [OTHER] | Attempt 4681: Error rate 49.15% (target: 15%) -2025-09-15T14:20:50.953Z | [OTHER] | Attempt 4682: Error rate 48.78% (target: 15%) -2025-09-15T14:20:50.959Z | [OTHER] | Attempt 4683: Error rate 54.08% (target: 15%) -2025-09-15T14:20:50.964Z | [OTHER] | Attempt 4684: Error rate 56.35% (target: 15%) -2025-09-15T14:20:50.969Z | [OTHER] | Attempt 4685: Error rate 50.39% (target: 15%) -2025-09-15T14:20:50.974Z | [OTHER] | Attempt 4686: Error rate 50.4% (target: 15%) -2025-09-15T14:20:50.980Z | [OTHER] | Attempt 4687: Error rate 52.63% (target: 15%) -2025-09-15T14:20:50.985Z | [OTHER] | Attempt 4688: Error rate 51.63% (target: 15%) -2025-09-15T14:20:50.990Z | [OTHER] | Attempt 4689: Error rate 51.45% (target: 15%) -2025-09-15T14:20:50.995Z | [OTHER] | Attempt 4690: Error rate 50.41% (target: 15%) -2025-09-15T14:20:51.000Z | [OTHER] | Attempt 4691: Error rate 52.33% (target: 15%) -2025-09-15T14:20:51.005Z | [OTHER] | Attempt 4692: Error rate 53.26% (target: 15%) -2025-09-15T14:20:51.010Z | [OTHER] | Attempt 4693: Error rate 48.19% (target: 15%) -2025-09-15T14:20:51.015Z | [OTHER] | Attempt 4694: Error rate 58.33% (target: 15%) -2025-09-15T14:20:51.020Z | [OTHER] | Attempt 4695: Error rate 63.33% (target: 15%) -2025-09-15T14:20:51.025Z | [OTHER] | Attempt 4696: Error rate 63.41% (target: 15%) -2025-09-15T14:20:51.030Z | [OTHER] | Attempt 4697: Error rate 57.2% (target: 15%) -2025-09-15T14:20:51.035Z | [OTHER] | Attempt 4698: Error rate 55.56% (target: 15%) -2025-09-15T14:20:51.040Z | [OTHER] | Attempt 4699: Error rate 44.72% (target: 15%) -2025-09-15T14:20:51.045Z | [OTHER] | Attempt 4700: Error rate 58.71% (target: 15%) -2025-09-15T14:20:51.050Z | [OTHER] | Attempt 4701: Error rate 52.59% (target: 15%) -2025-09-15T14:20:51.055Z | [OTHER] | Attempt 4702: Error rate 46.9% (target: 15%) -2025-09-15T14:20:51.061Z | [OTHER] | Attempt 4703: Error rate 46.21% (target: 15%) -2025-09-15T14:20:51.066Z | [OTHER] | Attempt 4704: Error rate 51.85% (target: 15%) -2025-09-15T14:20:51.071Z | [OTHER] | Attempt 4705: Error rate 48.91% (target: 15%) -2025-09-15T14:20:51.076Z | [OTHER] | Attempt 4706: Error rate 60.51% (target: 15%) -2025-09-15T14:20:51.081Z | [OTHER] | Attempt 4707: Error rate 54.81% (target: 15%) -2025-09-15T14:20:51.086Z | [OTHER] | Attempt 4708: Error rate 52.54% (target: 15%) -2025-09-15T14:20:51.091Z | [OTHER] | Attempt 4709: Error rate 46.88% (target: 15%) -2025-09-15T14:20:51.096Z | [OTHER] | Attempt 4710: Error rate 53.62% (target: 15%) -2025-09-15T14:20:51.101Z | [OTHER] | Attempt 4711: Error rate 53.1% (target: 15%) -2025-09-15T14:20:51.106Z | [OTHER] | Attempt 4712: Error rate 57.58% (target: 15%) -2025-09-15T14:20:51.111Z | [OTHER] | Attempt 4713: Error rate 46.19% (target: 15%) -2025-09-15T14:20:51.116Z | [OTHER] | Attempt 4714: Error rate 45.56% (target: 15%) -2025-09-15T14:20:51.121Z | [OTHER] | Attempt 4715: Error rate 43.09% (target: 15%) -2025-09-15T14:20:51.126Z | [OTHER] | Attempt 4716: Error rate 57.8% (target: 15%) -2025-09-15T14:20:51.131Z | [OTHER] | Attempt 4717: Error rate 55.68% (target: 15%) -2025-09-15T14:20:51.136Z | [OTHER] | Attempt 4718: Error rate 54.88% (target: 15%) -2025-09-15T14:20:51.141Z | [OTHER] | Attempt 4719: Error rate 51.19% (target: 15%) -2025-09-15T14:20:51.147Z | [OTHER] | Attempt 4720: Error rate 54.58% (target: 15%) -2025-09-15T14:20:51.152Z | [OTHER] | Attempt 4721: Error rate 39.63% (target: 15%) -2025-09-15T14:20:51.157Z | [OTHER] | Attempt 4722: Error rate 48.26% (target: 15%) -2025-09-15T14:20:51.162Z | [OTHER] | Attempt 4723: Error rate 54.35% (target: 15%) -2025-09-15T14:20:51.167Z | [OTHER] | Attempt 4724: Error rate 44.31% (target: 15%) -2025-09-15T14:20:51.173Z | [OTHER] | Attempt 4725: Error rate 54.81% (target: 15%) -2025-09-15T14:20:51.178Z | [OTHER] | Attempt 4726: Error rate 55.93% (target: 15%) -2025-09-15T14:20:51.183Z | [OTHER] | Attempt 4727: Error rate 51.67% (target: 15%) -2025-09-15T14:20:51.188Z | [OTHER] | Attempt 4728: Error rate 50% (target: 15%) -2025-09-15T14:20:51.193Z | [OTHER] | Attempt 4729: Error rate 49.55% (target: 15%) -2025-09-15T14:20:51.198Z | [OTHER] | Attempt 4730: Error rate 52.59% (target: 15%) -2025-09-15T14:20:51.203Z | [OTHER] | Attempt 4731: Error rate 55.95% (target: 15%) -2025-09-15T14:20:51.208Z | [OTHER] | Attempt 4732: Error rate 52.96% (target: 15%) -2025-09-15T14:20:51.213Z | [OTHER] | Attempt 4733: Error rate 60% (target: 15%) -2025-09-15T14:20:51.218Z | [OTHER] | Attempt 4734: Error rate 51.19% (target: 15%) -2025-09-15T14:20:51.223Z | [OTHER] | Attempt 4735: Error rate 51.89% (target: 15%) -2025-09-15T14:20:51.228Z | [OTHER] | Attempt 4736: Error rate 50.38% (target: 15%) -2025-09-15T14:20:51.234Z | [OTHER] | Attempt 4737: Error rate 46.38% (target: 15%) -2025-09-15T14:20:51.239Z | [OTHER] | Attempt 4738: Error rate 55.16% (target: 15%) -2025-09-15T14:20:51.243Z | [OTHER] | Attempt 4739: Error rate 54.26% (target: 15%) -2025-09-15T14:20:51.249Z | [OTHER] | Attempt 4740: Error rate 52.33% (target: 15%) -2025-09-15T14:20:51.254Z | [OTHER] | Attempt 4741: Error rate 48.58% (target: 15%) -2025-09-15T14:20:51.259Z | [OTHER] | Attempt 4742: Error rate 56.52% (target: 15%) -2025-09-15T14:20:51.265Z | [OTHER] | Attempt 4743: Error rate 54.88% (target: 15%) -2025-09-15T14:20:51.270Z | [OTHER] | Attempt 4744: Error rate 53.17% (target: 15%) -2025-09-15T14:20:51.275Z | [OTHER] | Attempt 4745: Error rate 55.13% (target: 15%) -2025-09-15T14:20:51.280Z | [OTHER] | Attempt 4746: Error rate 47.06% (target: 15%) -2025-09-15T14:20:51.285Z | [OTHER] | Attempt 4747: Error rate 53.49% (target: 15%) -2025-09-15T14:20:51.290Z | [OTHER] | Attempt 4748: Error rate 59.52% (target: 15%) -2025-09-15T14:20:51.294Z | [OTHER] | Attempt 4749: Error rate 59.47% (target: 15%) -2025-09-15T14:20:51.299Z | [OTHER] | Attempt 4750: Error rate 51.45% (target: 15%) -2025-09-15T14:20:51.304Z | [OTHER] | Attempt 4751: Error rate 46.51% (target: 15%) -2025-09-15T14:20:51.309Z | [OTHER] | Attempt 4752: Error rate 58.54% (target: 15%) -2025-09-15T14:20:51.314Z | [OTHER] | Attempt 4753: Error rate 46.59% (target: 15%) -2025-09-15T14:20:51.319Z | [OTHER] | Attempt 4754: Error rate 48.81% (target: 15%) -2025-09-15T14:20:51.324Z | [OTHER] | Attempt 4755: Error rate 52.65% (target: 15%) -2025-09-15T14:20:51.329Z | [OTHER] | Attempt 4756: Error rate 53.55% (target: 15%) -2025-09-15T14:20:51.334Z | [OTHER] | Attempt 4757: Error rate 60.98% (target: 15%) -2025-09-15T14:20:51.339Z | [OTHER] | Attempt 4758: Error rate 47.46% (target: 15%) -2025-09-15T14:20:51.344Z | [OTHER] | Attempt 4759: Error rate 46.45% (target: 15%) -2025-09-15T14:20:51.349Z | [OTHER] | Attempt 4760: Error rate 54.07% (target: 15%) -2025-09-15T14:20:51.353Z | [OTHER] | Attempt 4761: Error rate 50% (target: 15%) -2025-09-15T14:20:51.358Z | [OTHER] | Attempt 4762: Error rate 49.24% (target: 15%) -2025-09-15T14:20:51.364Z | [OTHER] | Attempt 4763: Error rate 50% (target: 15%) -2025-09-15T14:20:51.369Z | [OTHER] | Attempt 4764: Error rate 55.43% (target: 15%) -2025-09-15T14:20:51.374Z | [OTHER] | Attempt 4765: Error rate 51.02% (target: 15%) -2025-09-15T14:20:51.379Z | [OTHER] | Attempt 4766: Error rate 49.24% (target: 15%) -2025-09-15T14:20:51.384Z | [OTHER] | Attempt 4767: Error rate 50.74% (target: 15%) -2025-09-15T14:20:51.388Z | [OTHER] | Attempt 4768: Error rate 53.99% (target: 15%) -2025-09-15T14:20:51.394Z | [OTHER] | Attempt 4769: Error rate 55.56% (target: 15%) -2025-09-15T14:20:51.398Z | [OTHER] | Attempt 4770: Error rate 54.37% (target: 15%) -2025-09-15T14:20:51.403Z | [OTHER] | Attempt 4771: Error rate 49.59% (target: 15%) -2025-09-15T14:20:51.409Z | [OTHER] | Attempt 4772: Error rate 53.66% (target: 15%) -2025-09-15T14:20:51.413Z | [OTHER] | Attempt 4773: Error rate 59.63% (target: 15%) -2025-09-15T14:20:51.418Z | [OTHER] | Attempt 4774: Error rate 54.81% (target: 15%) -2025-09-15T14:20:51.423Z | [OTHER] | Attempt 4775: Error rate 50% (target: 15%) -2025-09-15T14:20:51.428Z | [OTHER] | Attempt 4776: Error rate 56.82% (target: 15%) -2025-09-15T14:20:51.433Z | [OTHER] | Attempt 4777: Error rate 45.19% (target: 15%) -2025-09-15T14:20:51.438Z | [OTHER] | Attempt 4778: Error rate 46.67% (target: 15%) -2025-09-15T14:20:51.443Z | [OTHER] | Attempt 4779: Error rate 56.98% (target: 15%) -2025-09-15T14:20:51.448Z | [OTHER] | Attempt 4780: Error rate 43.56% (target: 15%) -2025-09-15T14:20:51.453Z | [OTHER] | Attempt 4781: Error rate 55.67% (target: 15%) -2025-09-15T14:20:51.458Z | [OTHER] | Attempt 4782: Error rate 56.44% (target: 15%) -2025-09-15T14:20:51.463Z | [OTHER] | Attempt 4783: Error rate 58.53% (target: 15%) -2025-09-15T14:20:51.468Z | [OTHER] | Attempt 4784: Error rate 53.97% (target: 15%) -2025-09-15T14:20:51.473Z | [OTHER] | Attempt 4785: Error rate 56.75% (target: 15%) -2025-09-15T14:20:51.479Z | [OTHER] | Attempt 4786: Error rate 52.96% (target: 15%) -2025-09-15T14:20:51.484Z | [OTHER] | Attempt 4787: Error rate 55.93% (target: 15%) -2025-09-15T14:20:51.488Z | [OTHER] | Attempt 4788: Error rate 52.65% (target: 15%) -2025-09-15T14:20:51.494Z | [OTHER] | Attempt 4789: Error rate 47.28% (target: 15%) -2025-09-15T14:20:51.499Z | [OTHER] | Attempt 4790: Error rate 51.48% (target: 15%) -2025-09-15T14:20:51.504Z | [OTHER] | Attempt 4791: Error rate 47.78% (target: 15%) -2025-09-15T14:20:51.509Z | [OTHER] | Attempt 4792: Error rate 49.24% (target: 15%) -2025-09-15T14:20:51.515Z | [OTHER] | Attempt 4793: Error rate 54.37% (target: 15%) -2025-09-15T14:20:51.520Z | [OTHER] | Attempt 4794: Error rate 52.17% (target: 15%) -2025-09-15T14:20:51.525Z | [OTHER] | Attempt 4795: Error rate 59.63% (target: 15%) -2025-09-15T14:20:51.530Z | [OTHER] | Attempt 4796: Error rate 48.29% (target: 15%) -2025-09-15T14:20:51.535Z | [OTHER] | Attempt 4797: Error rate 44.81% (target: 15%) -2025-09-15T14:20:51.540Z | [OTHER] | Attempt 4798: Error rate 55.3% (target: 15%) -2025-09-15T14:20:51.545Z | [OTHER] | Attempt 4799: Error rate 56.3% (target: 15%) -2025-09-15T14:20:51.550Z | [OTHER] | Attempt 4800: Error rate 53.33% (target: 15%) -2025-09-15T14:20:51.555Z | [OTHER] | Attempt 4801: Error rate 55.04% (target: 15%) -2025-09-15T14:20:51.560Z | [OTHER] | Attempt 4802: Error rate 47.67% (target: 15%) -2025-09-15T14:20:51.565Z | [OTHER] | Attempt 4803: Error rate 52.33% (target: 15%) -2025-09-15T14:20:51.571Z | [OTHER] | Attempt 4804: Error rate 44.96% (target: 15%) -2025-09-15T14:20:51.576Z | [OTHER] | Attempt 4805: Error rate 54.88% (target: 15%) -2025-09-15T14:20:51.582Z | [OTHER] | Attempt 4806: Error rate 58.33% (target: 15%) -2025-09-15T14:20:51.587Z | [OTHER] | Attempt 4807: Error rate 56.94% (target: 15%) -2025-09-15T14:20:51.592Z | [OTHER] | Attempt 4808: Error rate 54.44% (target: 15%) -2025-09-15T14:20:51.597Z | [OTHER] | Attempt 4809: Error rate 59.06% (target: 15%) -2025-09-15T14:20:51.602Z | [OTHER] | Attempt 4810: Error rate 50% (target: 15%) -2025-09-15T14:20:51.607Z | [OTHER] | Attempt 4811: Error rate 47.57% (target: 15%) -2025-09-15T14:20:51.612Z | [OTHER] | Attempt 4812: Error rate 43.12% (target: 15%) -2025-09-15T14:20:51.617Z | [OTHER] | Attempt 4813: Error rate 57.58% (target: 15%) -2025-09-15T14:20:51.622Z | [OTHER] | Attempt 4814: Error rate 45.04% (target: 15%) -2025-09-15T14:20:51.628Z | [OTHER] | Attempt 4815: Error rate 47.83% (target: 15%) -2025-09-15T14:20:51.634Z | [OTHER] | Attempt 4816: Error rate 58.33% (target: 15%) -2025-09-15T14:20:51.638Z | [OTHER] | Attempt 4817: Error rate 52.5% (target: 15%) -2025-09-15T14:20:51.643Z | [OTHER] | Attempt 4818: Error rate 53.62% (target: 15%) -2025-09-15T14:20:51.648Z | [OTHER] | Attempt 4819: Error rate 47.97% (target: 15%) -2025-09-15T14:20:51.653Z | [OTHER] | Attempt 4820: Error rate 57.29% (target: 15%) -2025-09-15T14:20:51.659Z | [OTHER] | Attempt 4821: Error rate 60.33% (target: 15%) -2025-09-15T14:20:51.664Z | [OTHER] | Attempt 4822: Error rate 58.33% (target: 15%) -2025-09-15T14:20:51.669Z | [OTHER] | Attempt 4823: Error rate 47.22% (target: 15%) -2025-09-15T14:20:51.674Z | [OTHER] | Attempt 4824: Error rate 55.3% (target: 15%) -2025-09-15T14:20:51.679Z | [OTHER] | Attempt 4825: Error rate 53.57% (target: 15%) -2025-09-15T14:20:51.684Z | [OTHER] | Attempt 4826: Error rate 52.59% (target: 15%) -2025-09-15T14:20:51.689Z | [OTHER] | Attempt 4827: Error rate 52.59% (target: 15%) -2025-09-15T14:20:51.694Z | [OTHER] | Attempt 4828: Error rate 55.04% (target: 15%) -2025-09-15T14:20:51.699Z | [OTHER] | Attempt 4829: Error rate 64.1% (target: 15%) -2025-09-15T14:20:51.703Z | [OTHER] | Attempt 4830: Error rate 52.17% (target: 15%) -2025-09-15T14:20:51.709Z | [OTHER] | Attempt 4831: Error rate 54.76% (target: 15%) -2025-09-15T14:20:51.714Z | [OTHER] | Attempt 4832: Error rate 54.76% (target: 15%) -2025-09-15T14:20:51.721Z | [OTHER] | Attempt 4833: Error rate 54.86% (target: 15%) -2025-09-15T14:20:51.730Z | [OTHER] | Attempt 4834: Error rate 48.06% (target: 15%) -2025-09-15T14:20:51.735Z | [OTHER] | Attempt 4835: Error rate 51.42% (target: 15%) -2025-09-15T14:20:51.741Z | [OTHER] | Attempt 4836: Error rate 55.81% (target: 15%) -2025-09-15T14:20:51.746Z | [OTHER] | Attempt 4837: Error rate 50% (target: 15%) -2025-09-15T14:20:51.752Z | [OTHER] | Attempt 4838: Error rate 46.75% (target: 15%) -2025-09-15T14:20:51.757Z | [OTHER] | Attempt 4839: Error rate 50.72% (target: 15%) -2025-09-15T14:20:51.763Z | [OTHER] | Attempt 4840: Error rate 54.65% (target: 15%) -2025-09-15T14:20:51.768Z | [OTHER] | Attempt 4841: Error rate 51.94% (target: 15%) -2025-09-15T14:20:51.773Z | [OTHER] | Attempt 4842: Error rate 53.88% (target: 15%) -2025-09-15T14:20:51.779Z | [OTHER] | Attempt 4843: Error rate 50.35% (target: 15%) -2025-09-15T14:20:51.785Z | [OTHER] | Attempt 4844: Error rate 59.3% (target: 15%) -2025-09-15T14:20:51.790Z | [OTHER] | Attempt 4845: Error rate 46.45% (target: 15%) -2025-09-15T14:20:51.795Z | [OTHER] | Attempt 4846: Error rate 50.74% (target: 15%) -2025-09-15T14:20:51.801Z | [OTHER] | Attempt 4847: Error rate 46.67% (target: 15%) -2025-09-15T14:20:51.806Z | [OTHER] | Attempt 4848: Error rate 52.59% (target: 15%) -2025-09-15T14:20:51.811Z | [OTHER] | Attempt 4849: Error rate 49.58% (target: 15%) -2025-09-15T14:20:51.816Z | [OTHER] | Attempt 4850: Error rate 51.59% (target: 15%) -2025-09-15T14:20:51.821Z | [OTHER] | Attempt 4851: Error rate 54.88% (target: 15%) -2025-09-15T14:20:51.826Z | [OTHER] | Attempt 4852: Error rate 50% (target: 15%) -2025-09-15T14:20:51.831Z | [OTHER] | Attempt 4853: Error rate 45.12% (target: 15%) -2025-09-15T14:20:51.836Z | [OTHER] | Attempt 4854: Error rate 51.22% (target: 15%) -2025-09-15T14:20:51.841Z | [OTHER] | Attempt 4855: Error rate 54.37% (target: 15%) -2025-09-15T14:20:51.846Z | [OTHER] | Attempt 4856: Error rate 53.57% (target: 15%) -2025-09-15T14:20:51.851Z | [OTHER] | Attempt 4857: Error rate 60.98% (target: 15%) -2025-09-15T14:20:51.856Z | [OTHER] | Attempt 4858: Error rate 48.72% (target: 15%) -2025-09-15T14:20:51.861Z | [OTHER] | Attempt 4859: Error rate 45.49% (target: 15%) -2025-09-15T14:20:51.866Z | [OTHER] | Attempt 4860: Error rate 57.72% (target: 15%) -2025-09-15T14:20:51.871Z | [OTHER] | Attempt 4861: Error rate 43.8% (target: 15%) -2025-09-15T14:20:51.876Z | [OTHER] | Attempt 4862: Error rate 55.19% (target: 15%) -2025-09-15T14:20:51.881Z | [OTHER] | Attempt 4863: Error rate 49.59% (target: 15%) -2025-09-15T14:20:51.886Z | [OTHER] | Attempt 4864: Error rate 49.6% (target: 15%) -2025-09-15T14:20:51.891Z | [OTHER] | Attempt 4865: Error rate 54.26% (target: 15%) -2025-09-15T14:20:51.896Z | [OTHER] | Attempt 4866: Error rate 51.22% (target: 15%) -2025-09-15T14:20:51.902Z | [OTHER] | Attempt 4867: Error rate 45.24% (target: 15%) -2025-09-15T14:20:51.907Z | [OTHER] | Attempt 4868: Error rate 56.59% (target: 15%) -2025-09-15T14:20:51.912Z | [OTHER] | Attempt 4869: Error rate 53.1% (target: 15%) -2025-09-15T14:20:51.917Z | [OTHER] | Attempt 4870: Error rate 53.1% (target: 15%) -2025-09-15T14:20:51.922Z | [OTHER] | Attempt 4871: Error rate 54.44% (target: 15%) -2025-09-15T14:20:51.927Z | [OTHER] | Attempt 4872: Error rate 49.64% (target: 15%) -2025-09-15T14:20:51.932Z | [OTHER] | Attempt 4873: Error rate 49.22% (target: 15%) -2025-09-15T14:20:51.937Z | [OTHER] | Attempt 4874: Error rate 59.13% (target: 15%) -2025-09-15T14:20:51.943Z | [OTHER] | Attempt 4875: Error rate 51.09% (target: 15%) -2025-09-15T14:20:51.947Z | [OTHER] | Attempt 4876: Error rate 52.04% (target: 15%) -2025-09-15T14:20:51.952Z | [OTHER] | Attempt 4877: Error rate 48.84% (target: 15%) -2025-09-15T14:20:51.958Z | [OTHER] | Attempt 4878: Error rate 62.6% (target: 15%) -2025-09-15T14:20:51.963Z | [OTHER] | Attempt 4879: Error rate 56.06% (target: 15%) -2025-09-15T14:20:51.969Z | [OTHER] | Attempt 4880: Error rate 55.56% (target: 15%) -2025-09-15T14:20:51.973Z | [OTHER] | Attempt 4881: Error rate 54.07% (target: 15%) -2025-09-15T14:20:51.979Z | [OTHER] | Attempt 4882: Error rate 59.3% (target: 15%) -2025-09-15T14:20:51.984Z | [OTHER] | Attempt 4883: Error rate 52.44% (target: 15%) -2025-09-15T14:20:51.989Z | [OTHER] | Attempt 4884: Error rate 54.26% (target: 15%) -2025-09-15T14:20:51.994Z | [OTHER] | Attempt 4885: Error rate 50.78% (target: 15%) -2025-09-15T14:20:51.999Z | [OTHER] | Attempt 4886: Error rate 56.84% (target: 15%) -2025-09-15T14:20:52.004Z | [OTHER] | Attempt 4887: Error rate 48.45% (target: 15%) -2025-09-15T14:20:52.009Z | [OTHER] | Attempt 4888: Error rate 56.5% (target: 15%) -2025-09-15T14:20:52.015Z | [OTHER] | Attempt 4889: Error rate 41.46% (target: 15%) -2025-09-15T14:20:52.020Z | [OTHER] | Attempt 4890: Error rate 61.48% (target: 15%) -2025-09-15T14:20:52.025Z | [OTHER] | Attempt 4891: Error rate 48.19% (target: 15%) -2025-09-15T14:20:52.030Z | [OTHER] | Attempt 4892: Error rate 54.88% (target: 15%) -2025-09-15T14:20:52.036Z | [OTHER] | Attempt 4893: Error rate 57.21% (target: 15%) -2025-09-15T14:20:52.041Z | [OTHER] | Attempt 4894: Error rate 52.71% (target: 15%) -2025-09-15T14:20:52.046Z | [OTHER] | Attempt 4895: Error rate 52.71% (target: 15%) -2025-09-15T14:20:52.051Z | [OTHER] | Attempt 4896: Error rate 51.94% (target: 15%) -2025-09-15T14:20:52.055Z | [OTHER] | Attempt 4897: Error rate 50.38% (target: 15%) -2025-09-15T14:20:52.061Z | [OTHER] | Attempt 4898: Error rate 65.91% (target: 15%) -2025-09-15T14:20:52.066Z | [OTHER] | Attempt 4899: Error rate 55.56% (target: 15%) -2025-09-15T14:20:52.073Z | [OTHER] | Attempt 4900: Error rate 50.38% (target: 15%) -2025-09-15T14:20:52.078Z | [OTHER] | Attempt 4901: Error rate 51.45% (target: 15%) -2025-09-15T14:20:52.083Z | [OTHER] | Attempt 4902: Error rate 46.38% (target: 15%) -2025-09-15T14:20:52.089Z | [OTHER] | Attempt 4903: Error rate 43.9% (target: 15%) -2025-09-15T14:20:52.094Z | [OTHER] | Attempt 4904: Error rate 57.14% (target: 15%) -2025-09-15T14:20:52.099Z | [OTHER] | Attempt 4905: Error rate 53.25% (target: 15%) -2025-09-15T14:20:52.105Z | [OTHER] | Attempt 4906: Error rate 52.48% (target: 15%) -2025-09-15T14:20:52.110Z | [OTHER] | Attempt 4907: Error rate 55.8% (target: 15%) -2025-09-15T14:20:52.116Z | [OTHER] | Attempt 4908: Error rate 41.32% (target: 15%) -2025-09-15T14:20:52.121Z | [OTHER] | Attempt 4909: Error rate 52.78% (target: 15%) -2025-09-15T14:20:52.127Z | [OTHER] | Attempt 4910: Error rate 53.75% (target: 15%) -2025-09-15T14:20:52.132Z | [OTHER] | Attempt 4911: Error rate 52.96% (target: 15%) -2025-09-15T14:20:52.138Z | [OTHER] | Attempt 4912: Error rate 46.74% (target: 15%) -2025-09-15T14:20:52.150Z | [OTHER] | Attempt 4913: Error rate 43.84% (target: 15%) -2025-09-15T14:20:52.161Z | [OTHER] | Attempt 4914: Error rate 52.78% (target: 15%) -2025-09-15T14:20:52.170Z | [OTHER] | Attempt 4915: Error rate 45.39% (target: 15%) -2025-09-15T14:20:52.181Z | [OTHER] | Attempt 4916: Error rate 53.42% (target: 15%) -2025-09-15T14:20:52.192Z | [OTHER] | Attempt 4917: Error rate 52.54% (target: 15%) -2025-09-15T14:20:52.200Z | [OTHER] | Attempt 4918: Error rate 50% (target: 15%) -2025-09-15T14:20:52.208Z | [OTHER] | Attempt 4919: Error rate 47.92% (target: 15%) -2025-09-15T14:20:52.217Z | [OTHER] | Attempt 4920: Error rate 49.65% (target: 15%) -2025-09-15T14:20:52.223Z | [OTHER] | Attempt 4921: Error rate 61.96% (target: 15%) -2025-09-15T14:20:52.229Z | [OTHER] | Attempt 4922: Error rate 55.19% (target: 15%) -2025-09-15T14:20:52.234Z | [OTHER] | Attempt 4923: Error rate 45.56% (target: 15%) -2025-09-15T14:20:52.239Z | [OTHER] | Attempt 4924: Error rate 41.49% (target: 15%) -2025-09-15T14:20:52.244Z | [OTHER] | Attempt 4925: Error rate 59.42% (target: 15%) -2025-09-15T14:20:52.250Z | [OTHER] | Attempt 4926: Error rate 51.98% (target: 15%) -2025-09-15T14:20:52.255Z | [OTHER] | Attempt 4927: Error rate 52.33% (target: 15%) -2025-09-15T14:20:52.260Z | [OTHER] | Attempt 4928: Error rate 44.2% (target: 15%) -2025-09-15T14:20:52.265Z | [OTHER] | Attempt 4929: Error rate 54.44% (target: 15%) -2025-09-15T14:20:52.270Z | [OTHER] | Attempt 4930: Error rate 45.83% (target: 15%) -2025-09-15T14:20:52.275Z | [OTHER] | Attempt 4931: Error rate 56.76% (target: 15%) -2025-09-15T14:20:52.281Z | [OTHER] | Attempt 4932: Error rate 54.44% (target: 15%) -2025-09-15T14:20:52.285Z | [OTHER] | Attempt 4933: Error rate 47.73% (target: 15%) -2025-09-15T14:20:52.290Z | [OTHER] | Attempt 4934: Error rate 52.59% (target: 15%) -2025-09-15T14:20:52.296Z | [OTHER] | Attempt 4935: Error rate 50% (target: 15%) -2025-09-15T14:20:52.301Z | [OTHER] | Attempt 4936: Error rate 48.78% (target: 15%) -2025-09-15T14:20:52.306Z | [OTHER] | Attempt 4937: Error rate 57.14% (target: 15%) -2025-09-15T14:20:52.310Z | [OTHER] | Attempt 4938: Error rate 54.81% (target: 15%) -2025-09-15T14:20:52.316Z | [OTHER] | Attempt 4939: Error rate 48.37% (target: 15%) -2025-09-15T14:20:52.321Z | [OTHER] | Attempt 4940: Error rate 49.63% (target: 15%) -2025-09-15T14:20:52.326Z | [OTHER] | Attempt 4941: Error rate 50% (target: 15%) -2025-09-15T14:20:52.331Z | [OTHER] | Attempt 4942: Error rate 53.17% (target: 15%) -2025-09-15T14:20:52.336Z | [OTHER] | Attempt 4943: Error rate 53.41% (target: 15%) -2025-09-15T14:20:52.341Z | [OTHER] | Attempt 4944: Error rate 52.85% (target: 15%) -2025-09-15T14:20:52.346Z | [OTHER] | Attempt 4945: Error rate 54.76% (target: 15%) -2025-09-15T14:20:52.351Z | [OTHER] | Attempt 4946: Error rate 52.7% (target: 15%) -2025-09-15T14:20:52.356Z | [OTHER] | Attempt 4947: Error rate 53.92% (target: 15%) -2025-09-15T14:20:52.361Z | [OTHER] | Attempt 4948: Error rate 52.96% (target: 15%) -2025-09-15T14:20:52.366Z | [OTHER] | Attempt 4949: Error rate 61.9% (target: 15%) -2025-09-15T14:20:52.371Z | [OTHER] | Attempt 4950: Error rate 51.39% (target: 15%) -2025-09-15T14:20:52.376Z | [OTHER] | Attempt 4951: Error rate 56.82% (target: 15%) -2025-09-15T14:20:52.381Z | [OTHER] | Attempt 4952: Error rate 52.65% (target: 15%) -2025-09-15T14:20:52.386Z | [OTHER] | Attempt 4953: Error rate 56.82% (target: 15%) -2025-09-15T14:20:52.391Z | [OTHER] | Attempt 4954: Error rate 54.17% (target: 15%) -2025-09-15T14:20:52.396Z | [OTHER] | Attempt 4955: Error rate 60.23% (target: 15%) -2025-09-15T14:20:52.401Z | [OTHER] | Attempt 4956: Error rate 50% (target: 15%) -2025-09-15T14:20:52.407Z | [OTHER] | Attempt 4957: Error rate 55.41% (target: 15%) -2025-09-15T14:20:52.412Z | [OTHER] | Attempt 4958: Error rate 46.43% (target: 15%) -2025-09-15T14:20:52.418Z | [OTHER] | Attempt 4959: Error rate 50.81% (target: 15%) -2025-09-15T14:20:52.423Z | [OTHER] | Attempt 4960: Error rate 52.03% (target: 15%) -2025-09-15T14:20:52.428Z | [OTHER] | Attempt 4961: Error rate 56.2% (target: 15%) -2025-09-15T14:20:52.433Z | [OTHER] | Attempt 4962: Error rate 52.63% (target: 15%) -2025-09-15T14:20:52.438Z | [OTHER] | Attempt 4963: Error rate 48.19% (target: 15%) -2025-09-15T14:20:52.443Z | [OTHER] | Attempt 4964: Error rate 48.89% (target: 15%) -2025-09-15T14:20:52.448Z | [OTHER] | Attempt 4965: Error rate 49.61% (target: 15%) -2025-09-15T14:20:52.453Z | [OTHER] | Attempt 4966: Error rate 53.97% (target: 15%) -2025-09-15T14:20:52.459Z | [OTHER] | Attempt 4967: Error rate 48.61% (target: 15%) -2025-09-15T14:20:52.464Z | [OTHER] | Attempt 4968: Error rate 50% (target: 15%) -2025-09-15T14:20:52.469Z | [OTHER] | Attempt 4969: Error rate 50% (target: 15%) -2025-09-15T14:20:52.474Z | [OTHER] | Attempt 4970: Error rate 48.23% (target: 15%) -2025-09-15T14:20:52.479Z | [OTHER] | Attempt 4971: Error rate 56.75% (target: 15%) -2025-09-15T14:20:52.484Z | [OTHER] | Attempt 4972: Error rate 53.66% (target: 15%) -2025-09-15T14:20:52.489Z | [OTHER] | Attempt 4973: Error rate 52.59% (target: 15%) -2025-09-15T14:20:52.495Z | [OTHER] | Attempt 4974: Error rate 46.01% (target: 15%) -2025-09-15T14:20:52.500Z | [OTHER] | Attempt 4975: Error rate 48.65% (target: 15%) -2025-09-15T14:20:52.505Z | [OTHER] | Attempt 4976: Error rate 40.91% (target: 15%) -2025-09-15T14:20:52.510Z | [OTHER] | Attempt 4977: Error rate 51.45% (target: 15%) -2025-09-15T14:20:52.515Z | [OTHER] | Attempt 4978: Error rate 54.17% (target: 15%) -2025-09-15T14:20:52.520Z | [OTHER] | Attempt 4979: Error rate 43.56% (target: 15%) -2025-09-15T14:20:52.525Z | [OTHER] | Attempt 4980: Error rate 57.02% (target: 15%) -2025-09-15T14:20:52.531Z | [OTHER] | Attempt 4981: Error rate 54.37% (target: 15%) -2025-09-15T14:20:52.536Z | [OTHER] | Attempt 4982: Error rate 53.88% (target: 15%) -2025-09-15T14:20:52.541Z | [OTHER] | Attempt 4983: Error rate 51.16% (target: 15%) -2025-09-15T14:20:52.546Z | [OTHER] | Attempt 4984: Error rate 51.09% (target: 15%) -2025-09-15T14:20:52.551Z | [OTHER] | Attempt 4985: Error rate 53.26% (target: 15%) -2025-09-15T14:20:52.556Z | [OTHER] | Attempt 4986: Error rate 58.71% (target: 15%) -2025-09-15T14:20:52.562Z | [OTHER] | Attempt 4987: Error rate 50% (target: 15%) -2025-09-15T14:20:52.568Z | [OTHER] | Attempt 4988: Error rate 53.67% (target: 15%) -2025-09-15T14:20:52.573Z | [OTHER] | Attempt 4989: Error rate 53.03% (target: 15%) -2025-09-15T14:20:52.579Z | [OTHER] | Attempt 4990: Error rate 57.04% (target: 15%) -2025-09-15T14:20:52.584Z | [OTHER] | Attempt 4991: Error rate 56.98% (target: 15%) -2025-09-15T14:20:52.589Z | [OTHER] | Attempt 4992: Error rate 49.17% (target: 15%) -2025-09-15T14:20:52.594Z | [OTHER] | Attempt 4993: Error rate 52.38% (target: 15%) -2025-09-15T14:20:52.600Z | [OTHER] | Attempt 4994: Error rate 51.28% (target: 15%) -2025-09-15T14:20:52.605Z | [OTHER] | Attempt 4995: Error rate 48.45% (target: 15%) -2025-09-15T14:20:52.610Z | [OTHER] | Attempt 4996: Error rate 55.67% (target: 15%) -2025-09-15T14:20:52.615Z | [OTHER] | Attempt 4997: Error rate 52.78% (target: 15%) -2025-09-15T14:20:52.620Z | [OTHER] | Attempt 4998: Error rate 53.41% (target: 15%) -2025-09-15T14:20:52.625Z | [OTHER] | Attempt 4999: Error rate 50.79% (target: 15%) -2025-09-15T14:20:52.630Z | [OTHER] | Attempt 5000: Error rate 54.76% (target: 15%) -2025-09-15T14:20:52.636Z | [OTHER] | Attempt 5001: Error rate 64.86% (target: 15%) -2025-09-15T14:20:52.641Z | [OTHER] | Attempt 5002: Error rate 52.08% (target: 15%) -2025-09-15T14:20:52.646Z | [OTHER] | Attempt 5003: Error rate 58.73% (target: 15%) -2025-09-15T14:20:52.651Z | [OTHER] | Attempt 5004: Error rate 43.65% (target: 15%) -2025-09-15T14:20:52.656Z | [OTHER] | Attempt 5005: Error rate 51.04% (target: 15%) -2025-09-15T14:20:52.663Z | [OTHER] | Attempt 5006: Error rate 43.7% (target: 15%) -2025-09-15T14:20:52.668Z | [OTHER] | Attempt 5007: Error rate 53.19% (target: 15%) -2025-09-15T14:20:52.673Z | [OTHER] | Attempt 5008: Error rate 47.46% (target: 15%) -2025-09-15T14:20:52.678Z | [OTHER] | Attempt 5009: Error rate 48.65% (target: 15%) -2025-09-15T14:20:52.683Z | [OTHER] | Attempt 5010: Error rate 50% (target: 15%) -2025-09-15T14:20:52.689Z | [OTHER] | Attempt 5011: Error rate 52.85% (target: 15%) -2025-09-15T14:20:52.694Z | [OTHER] | Attempt 5012: Error rate 50.4% (target: 15%) -2025-09-15T14:20:52.699Z | [OTHER] | Attempt 5013: Error rate 58.33% (target: 15%) -2025-09-15T14:20:52.704Z | [OTHER] | Attempt 5014: Error rate 58.33% (target: 15%) -2025-09-15T14:20:52.709Z | [OTHER] | Attempt 5015: Error rate 46.74% (target: 15%) -2025-09-15T14:20:52.714Z | [OTHER] | Attempt 5016: Error rate 57.58% (target: 15%) -2025-09-15T14:20:52.718Z | [OTHER] | Attempt 5017: Error rate 53.33% (target: 15%) -2025-09-15T14:20:52.725Z | [OTHER] | Attempt 5018: Error rate 53.7% (target: 15%) -2025-09-15T14:20:52.729Z | [OTHER] | Attempt 5019: Error rate 57.14% (target: 15%) -2025-09-15T14:20:52.734Z | [OTHER] | Attempt 5020: Error rate 48.91% (target: 15%) -2025-09-15T14:20:52.739Z | [OTHER] | Attempt 5021: Error rate 48.45% (target: 15%) -2025-09-15T14:20:52.745Z | [OTHER] | Attempt 5022: Error rate 55.43% (target: 15%) -2025-09-15T14:20:52.750Z | [OTHER] | Attempt 5023: Error rate 51.81% (target: 15%) -2025-09-15T14:20:52.755Z | [OTHER] | Attempt 5024: Error rate 52.27% (target: 15%) -2025-09-15T14:20:52.760Z | [OTHER] | Attempt 5025: Error rate 47.62% (target: 15%) -2025-09-15T14:20:52.765Z | [OTHER] | Attempt 5026: Error rate 48.81% (target: 15%) -2025-09-15T14:20:52.770Z | [OTHER] | Attempt 5027: Error rate 43.94% (target: 15%) -2025-09-15T14:20:52.775Z | [OTHER] | Attempt 5028: Error rate 47.62% (target: 15%) -2025-09-15T14:20:52.780Z | [OTHER] | Attempt 5029: Error rate 47.35% (target: 15%) -2025-09-15T14:20:52.786Z | [OTHER] | Attempt 5030: Error rate 54.71% (target: 15%) -2025-09-15T14:20:52.791Z | [OTHER] | Attempt 5031: Error rate 44.1% (target: 15%) -2025-09-15T14:20:52.796Z | [OTHER] | Attempt 5032: Error rate 50.68% (target: 15%) -2025-09-15T14:20:52.801Z | [OTHER] | Attempt 5033: Error rate 41.13% (target: 15%) -2025-09-15T14:20:52.806Z | [OTHER] | Attempt 5034: Error rate 52.78% (target: 15%) -2025-09-15T14:20:52.811Z | [OTHER] | Attempt 5035: Error rate 56.5% (target: 15%) -2025-09-15T14:20:52.816Z | [OTHER] | Attempt 5036: Error rate 52.44% (target: 15%) -2025-09-15T14:20:52.822Z | [OTHER] | Attempt 5037: Error rate 53.03% (target: 15%) -2025-09-15T14:20:52.828Z | [OTHER] | Attempt 5038: Error rate 51.59% (target: 15%) -2025-09-15T14:20:52.833Z | [OTHER] | Attempt 5039: Error rate 53.62% (target: 15%) -2025-09-15T14:20:52.839Z | [OTHER] | Attempt 5040: Error rate 57.04% (target: 15%) -2025-09-15T14:20:52.844Z | [OTHER] | Attempt 5041: Error rate 56.84% (target: 15%) -2025-09-15T14:20:52.849Z | [OTHER] | Attempt 5042: Error rate 52.27% (target: 15%) -2025-09-15T14:20:52.854Z | [OTHER] | Attempt 5043: Error rate 47.22% (target: 15%) -2025-09-15T14:20:52.859Z | [OTHER] | Attempt 5044: Error rate 56.91% (target: 15%) -2025-09-15T14:20:52.864Z | [OTHER] | Attempt 5045: Error rate 57.25% (target: 15%) -2025-09-15T14:20:52.869Z | [OTHER] | Attempt 5046: Error rate 57.64% (target: 15%) -2025-09-15T14:20:52.874Z | [OTHER] | Attempt 5047: Error rate 46.21% (target: 15%) -2025-09-15T14:20:52.879Z | [OTHER] | Attempt 5048: Error rate 55.56% (target: 15%) -2025-09-15T14:20:52.885Z | [OTHER] | Attempt 5049: Error rate 56.91% (target: 15%) -2025-09-15T14:20:52.890Z | [OTHER] | Attempt 5050: Error rate 48.96% (target: 15%) -2025-09-15T14:20:52.895Z | [OTHER] | Attempt 5051: Error rate 55.3% (target: 15%) -2025-09-15T14:20:52.900Z | [OTHER] | Attempt 5052: Error rate 52.65% (target: 15%) -2025-09-15T14:20:52.905Z | [OTHER] | Attempt 5053: Error rate 49.65% (target: 15%) -2025-09-15T14:20:52.910Z | [OTHER] | Attempt 5054: Error rate 51.16% (target: 15%) -2025-09-15T14:20:52.918Z | [OTHER] | Attempt 5055: Error rate 53.66% (target: 15%) -2025-09-15T14:20:52.924Z | [OTHER] | Attempt 5056: Error rate 55.81% (target: 15%) -2025-09-15T14:20:52.929Z | [OTHER] | Attempt 5057: Error rate 54.58% (target: 15%) -2025-09-15T14:20:52.935Z | [OTHER] | Attempt 5058: Error rate 50.39% (target: 15%) -2025-09-15T14:20:52.940Z | [OTHER] | Attempt 5059: Error rate 45.14% (target: 15%) -2025-09-15T14:20:52.946Z | [OTHER] | Attempt 5060: Error rate 54.17% (target: 15%) -2025-09-15T14:20:52.951Z | [OTHER] | Attempt 5061: Error rate 50.43% (target: 15%) -2025-09-15T14:20:52.958Z | [OTHER] | Attempt 5062: Error rate 42.31% (target: 15%) -2025-09-15T14:20:52.963Z | [OTHER] | Attempt 5063: Error rate 44.33% (target: 15%) -2025-09-15T14:20:52.968Z | [OTHER] | Attempt 5064: Error rate 45.56% (target: 15%) -2025-09-15T14:20:52.974Z | [OTHER] | Attempt 5065: Error rate 53.99% (target: 15%) -2025-09-15T14:20:52.979Z | [OTHER] | Attempt 5066: Error rate 51.09% (target: 15%) -2025-09-15T14:20:52.984Z | [OTHER] | Attempt 5067: Error rate 45.93% (target: 15%) -2025-09-15T14:20:52.989Z | [OTHER] | Attempt 5068: Error rate 55.43% (target: 15%) -2025-09-15T14:20:52.995Z | [OTHER] | Attempt 5069: Error rate 54.07% (target: 15%) -2025-09-15T14:20:53.001Z | [OTHER] | Attempt 5070: Error rate 49.62% (target: 15%) -2025-09-15T14:20:53.006Z | [OTHER] | Attempt 5071: Error rate 57.2% (target: 15%) -2025-09-15T14:20:53.012Z | [OTHER] | Attempt 5072: Error rate 50.74% (target: 15%) -2025-09-15T14:20:53.017Z | [OTHER] | Attempt 5073: Error rate 60.98% (target: 15%) -2025-09-15T14:20:53.023Z | [OTHER] | Attempt 5074: Error rate 48.33% (target: 15%) -2025-09-15T14:20:53.029Z | [OTHER] | Attempt 5075: Error rate 51.48% (target: 15%) -2025-09-15T14:20:53.035Z | [OTHER] | Attempt 5076: Error rate 53.7% (target: 15%) -2025-09-15T14:20:53.041Z | [OTHER] | Attempt 5077: Error rate 56.5% (target: 15%) -2025-09-15T14:20:53.046Z | [OTHER] | Attempt 5078: Error rate 48.98% (target: 15%) -2025-09-15T14:20:53.052Z | [OTHER] | Attempt 5079: Error rate 51.77% (target: 15%) -2025-09-15T14:20:53.058Z | [OTHER] | Attempt 5080: Error rate 50% (target: 15%) -2025-09-15T14:20:53.064Z | [OTHER] | Attempt 5081: Error rate 49.19% (target: 15%) -2025-09-15T14:20:53.069Z | [OTHER] | Attempt 5082: Error rate 50.88% (target: 15%) -2025-09-15T14:20:53.075Z | [OTHER] | Attempt 5083: Error rate 52.38% (target: 15%) -2025-09-15T14:20:53.081Z | [OTHER] | Attempt 5084: Error rate 45.42% (target: 15%) -2025-09-15T14:20:53.087Z | [OTHER] | Attempt 5085: Error rate 53.7% (target: 15%) -2025-09-15T14:20:53.093Z | [OTHER] | Attempt 5086: Error rate 48.11% (target: 15%) -2025-09-15T14:20:53.099Z | [OTHER] | Attempt 5087: Error rate 63.54% (target: 15%) -2025-09-15T14:20:53.105Z | [OTHER] | Attempt 5088: Error rate 51.67% (target: 15%) -2025-09-15T14:20:53.111Z | [OTHER] | Attempt 5089: Error rate 56.25% (target: 15%) -2025-09-15T14:20:53.117Z | [OTHER] | Attempt 5090: Error rate 48.89% (target: 15%) -2025-09-15T14:20:53.123Z | [OTHER] | Attempt 5091: Error rate 59.06% (target: 15%) -2025-09-15T14:20:53.129Z | [OTHER] | Attempt 5092: Error rate 60.08% (target: 15%) -2025-09-15T14:20:53.134Z | [OTHER] | Attempt 5093: Error rate 50% (target: 15%) -2025-09-15T14:20:53.140Z | [OTHER] | Attempt 5094: Error rate 55.56% (target: 15%) -2025-09-15T14:20:53.146Z | [OTHER] | Attempt 5095: Error rate 53.88% (target: 15%) -2025-09-15T14:20:53.151Z | [OTHER] | Attempt 5096: Error rate 47.52% (target: 15%) -2025-09-15T14:20:53.157Z | [OTHER] | Attempt 5097: Error rate 60.07% (target: 15%) -2025-09-15T14:20:53.162Z | [OTHER] | Attempt 5098: Error rate 55.56% (target: 15%) -2025-09-15T14:20:53.168Z | [OTHER] | Attempt 5099: Error rate 53.41% (target: 15%) -2025-09-15T14:20:53.173Z | [OTHER] | Attempt 5100: Error rate 48.06% (target: 15%) -2025-09-15T14:20:53.178Z | [OTHER] | Attempt 5101: Error rate 55.3% (target: 15%) -2025-09-15T14:20:53.185Z | [OTHER] | Attempt 5102: Error rate 46.21% (target: 15%) -2025-09-15T14:20:53.189Z | [OTHER] | Attempt 5103: Error rate 53.7% (target: 15%) -2025-09-15T14:20:53.194Z | [OTHER] | Attempt 5104: Error rate 57.36% (target: 15%) -2025-09-15T14:20:53.200Z | [OTHER] | Attempt 5105: Error rate 54.96% (target: 15%) -2025-09-15T14:20:53.205Z | [OTHER] | Attempt 5106: Error rate 47.1% (target: 15%) -2025-09-15T14:20:53.210Z | [OTHER] | Attempt 5107: Error rate 48.78% (target: 15%) -2025-09-15T14:20:53.215Z | [OTHER] | Attempt 5108: Error rate 45.29% (target: 15%) -2025-09-15T14:20:53.221Z | [OTHER] | Attempt 5109: Error rate 51.45% (target: 15%) -2025-09-15T14:20:53.226Z | [OTHER] | Attempt 5110: Error rate 40.08% (target: 15%) -2025-09-15T14:20:53.232Z | [OTHER] | Attempt 5111: Error rate 53.88% (target: 15%) -2025-09-15T14:20:53.237Z | [OTHER] | Attempt 5112: Error rate 50.83% (target: 15%) -2025-09-15T14:20:53.243Z | [OTHER] | Attempt 5113: Error rate 50.83% (target: 15%) -2025-09-15T14:20:53.249Z | [OTHER] | Attempt 5114: Error rate 56.74% (target: 15%) -2025-09-15T14:20:53.255Z | [OTHER] | Attempt 5115: Error rate 51.55% (target: 15%) -2025-09-15T14:20:53.260Z | [OTHER] | Attempt 5116: Error rate 59.47% (target: 15%) -2025-09-15T14:20:53.265Z | [OTHER] | Attempt 5117: Error rate 62.12% (target: 15%) -2025-09-15T14:20:53.271Z | [OTHER] | Attempt 5118: Error rate 47.73% (target: 15%) -2025-09-15T14:20:53.276Z | [OTHER] | Attempt 5119: Error rate 53.66% (target: 15%) -2025-09-15T14:20:53.281Z | [OTHER] | Attempt 5120: Error rate 57.04% (target: 15%) -2025-09-15T14:20:53.286Z | [OTHER] | Attempt 5121: Error rate 56.94% (target: 15%) -2025-09-15T14:20:53.291Z | [OTHER] | Attempt 5122: Error rate 54.25% (target: 15%) -2025-09-15T14:20:53.296Z | [OTHER] | Attempt 5123: Error rate 53.97% (target: 15%) -2025-09-15T14:20:53.301Z | [OTHER] | Attempt 5124: Error rate 51.74% (target: 15%) -2025-09-15T14:20:53.306Z | [OTHER] | Attempt 5125: Error rate 55.56% (target: 15%) -2025-09-15T14:20:53.311Z | [OTHER] | Attempt 5126: Error rate 46.59% (target: 15%) -2025-09-15T14:20:53.316Z | [OTHER] | Attempt 5127: Error rate 52.78% (target: 15%) -2025-09-15T14:20:53.321Z | [OTHER] | Attempt 5128: Error rate 52.27% (target: 15%) -2025-09-15T14:20:53.327Z | [OTHER] | Attempt 5129: Error rate 60% (target: 15%) -2025-09-15T14:20:53.332Z | [OTHER] | Attempt 5130: Error rate 45.74% (target: 15%) -2025-09-15T14:20:53.337Z | [OTHER] | Attempt 5131: Error rate 54.17% (target: 15%) -2025-09-15T14:20:53.342Z | [OTHER] | Attempt 5132: Error rate 46.15% (target: 15%) -2025-09-15T14:20:53.347Z | [OTHER] | Attempt 5133: Error rate 49.22% (target: 15%) -2025-09-15T14:20:53.352Z | [OTHER] | Attempt 5134: Error rate 59.35% (target: 15%) -2025-09-15T14:20:53.357Z | [OTHER] | Attempt 5135: Error rate 46.9% (target: 15%) -2025-09-15T14:20:53.362Z | [OTHER] | Attempt 5136: Error rate 50.79% (target: 15%) -2025-09-15T14:20:53.367Z | [OTHER] | Attempt 5137: Error rate 46.75% (target: 15%) -2025-09-15T14:20:53.372Z | [OTHER] | Attempt 5138: Error rate 55.95% (target: 15%) -2025-09-15T14:20:53.377Z | [OTHER] | Attempt 5139: Error rate 55.28% (target: 15%) -2025-09-15T14:20:53.382Z | [OTHER] | Attempt 5140: Error rate 51.11% (target: 15%) -2025-09-15T14:20:53.387Z | [OTHER] | Attempt 5141: Error rate 57.14% (target: 15%) -2025-09-15T14:20:53.392Z | [OTHER] | Attempt 5142: Error rate 56.06% (target: 15%) -2025-09-15T14:20:53.397Z | [OTHER] | Attempt 5143: Error rate 46.74% (target: 15%) -2025-09-15T14:20:53.402Z | [OTHER] | Attempt 5144: Error rate 48.91% (target: 15%) -2025-09-15T14:20:53.407Z | [OTHER] | Attempt 5145: Error rate 55.95% (target: 15%) -2025-09-15T14:20:53.412Z | [OTHER] | Attempt 5146: Error rate 42.42% (target: 15%) -2025-09-15T14:20:53.417Z | [OTHER] | Attempt 5147: Error rate 54.05% (target: 15%) -2025-09-15T14:20:53.422Z | [OTHER] | Attempt 5148: Error rate 53.79% (target: 15%) -2025-09-15T14:20:53.427Z | [OTHER] | Attempt 5149: Error rate 64.29% (target: 15%) -2025-09-15T14:20:53.432Z | [OTHER] | Attempt 5150: Error rate 51.45% (target: 15%) -2025-09-15T14:20:53.438Z | [OTHER] | Attempt 5151: Error rate 55.43% (target: 15%) -2025-09-15T14:20:53.443Z | [OTHER] | Attempt 5152: Error rate 47.62% (target: 15%) -2025-09-15T14:20:53.448Z | [OTHER] | Attempt 5153: Error rate 56.3% (target: 15%) -2025-09-15T14:20:53.453Z | [OTHER] | Attempt 5154: Error rate 52.17% (target: 15%) -2025-09-15T14:20:53.458Z | [OTHER] | Attempt 5155: Error rate 53.03% (target: 15%) -2025-09-15T14:20:53.463Z | [OTHER] | Attempt 5156: Error rate 49.32% (target: 15%) -2025-09-15T14:20:53.468Z | [OTHER] | Attempt 5157: Error rate 53.75% (target: 15%) -2025-09-15T14:20:53.474Z | [OTHER] | Attempt 5158: Error rate 55% (target: 15%) -2025-09-15T14:20:53.479Z | [OTHER] | Attempt 5159: Error rate 51.89% (target: 15%) -2025-09-15T14:20:53.484Z | [OTHER] | Attempt 5160: Error rate 53.47% (target: 15%) -2025-09-15T14:20:53.489Z | [OTHER] | Attempt 5161: Error rate 57.04% (target: 15%) -2025-09-15T14:20:53.494Z | [OTHER] | Attempt 5162: Error rate 57.78% (target: 15%) -2025-09-15T14:20:53.499Z | [OTHER] | Attempt 5163: Error rate 52.84% (target: 15%) -2025-09-15T14:20:53.504Z | [OTHER] | Attempt 5164: Error rate 51.22% (target: 15%) -2025-09-15T14:20:53.510Z | [OTHER] | Attempt 5165: Error rate 46.81% (target: 15%) -2025-09-15T14:20:53.515Z | [OTHER] | Attempt 5166: Error rate 50.68% (target: 15%) -2025-09-15T14:20:53.520Z | [OTHER] | Attempt 5167: Error rate 50.78% (target: 15%) -2025-09-15T14:20:53.525Z | [OTHER] | Attempt 5168: Error rate 53.17% (target: 15%) -2025-09-15T14:20:53.530Z | [OTHER] | Attempt 5169: Error rate 54.96% (target: 15%) -2025-09-15T14:20:53.535Z | [OTHER] | Attempt 5170: Error rate 52.65% (target: 15%) -2025-09-15T14:20:53.540Z | [OTHER] | Attempt 5171: Error rate 53.03% (target: 15%) -2025-09-15T14:20:53.545Z | [OTHER] | Attempt 5172: Error rate 49.24% (target: 15%) -2025-09-15T14:20:53.551Z | [OTHER] | Attempt 5173: Error rate 39.15% (target: 15%) -2025-09-15T14:20:53.560Z | [OTHER] | Attempt 5174: Error rate 52.61% (target: 15%) -2025-09-15T14:20:53.568Z | [OTHER] | Attempt 5175: Error rate 54.71% (target: 15%) -2025-09-15T14:20:53.575Z | [OTHER] | Attempt 5176: Error rate 50% (target: 15%) -2025-09-15T14:20:53.583Z | [OTHER] | Attempt 5177: Error rate 47.46% (target: 15%) -2025-09-15T14:20:53.590Z | [OTHER] | Attempt 5178: Error rate 55.28% (target: 15%) -2025-09-15T14:20:53.596Z | [OTHER] | Attempt 5179: Error rate 55.28% (target: 15%) -2025-09-15T14:20:53.604Z | [OTHER] | Attempt 5180: Error rate 48.11% (target: 15%) -2025-09-15T14:20:53.610Z | [OTHER] | Attempt 5181: Error rate 54.44% (target: 15%) -2025-09-15T14:20:53.616Z | [OTHER] | Attempt 5182: Error rate 56.5% (target: 15%) -2025-09-15T14:20:53.621Z | [OTHER] | Attempt 5183: Error rate 56.91% (target: 15%) -2025-09-15T14:20:53.627Z | [OTHER] | Attempt 5184: Error rate 52.08% (target: 15%) -2025-09-15T14:20:53.632Z | [OTHER] | Attempt 5185: Error rate 51.52% (target: 15%) -2025-09-15T14:20:53.638Z | [OTHER] | Attempt 5186: Error rate 56.3% (target: 15%) -2025-09-15T14:20:53.644Z | [OTHER] | Attempt 5187: Error rate 47.33% (target: 15%) -2025-09-15T14:20:53.648Z | [OTHER] | Attempt 5188: Error rate 53.57% (target: 15%) -2025-09-15T14:20:53.653Z | [OTHER] | Attempt 5189: Error rate 44.61% (target: 15%) -2025-09-15T14:20:53.659Z | [OTHER] | Attempt 5190: Error rate 56.03% (target: 15%) -2025-09-15T14:20:53.664Z | [OTHER] | Attempt 5191: Error rate 54.55% (target: 15%) -2025-09-15T14:20:53.669Z | [OTHER] | Attempt 5192: Error rate 53.49% (target: 15%) -2025-09-15T14:20:53.674Z | [OTHER] | Attempt 5193: Error rate 51.06% (target: 15%) -2025-09-15T14:20:53.680Z | [OTHER] | Attempt 5194: Error rate 54.17% (target: 15%) -2025-09-15T14:20:53.685Z | [OTHER] | Attempt 5195: Error rate 51.11% (target: 15%) -2025-09-15T14:20:53.690Z | [OTHER] | Attempt 5196: Error rate 41.67% (target: 15%) -2025-09-15T14:20:53.696Z | [OTHER] | Attempt 5197: Error rate 53.26% (target: 15%) -2025-09-15T14:20:53.701Z | [OTHER] | Attempt 5198: Error rate 56.06% (target: 15%) -2025-09-15T14:20:53.706Z | [OTHER] | Attempt 5199: Error rate 51.19% (target: 15%) -2025-09-15T14:20:53.711Z | [OTHER] | Attempt 5200: Error rate 50.74% (target: 15%) -2025-09-15T14:20:53.716Z | [OTHER] | Attempt 5201: Error rate 49.62% (target: 15%) -2025-09-15T14:20:53.721Z | [OTHER] | Attempt 5202: Error rate 55.28% (target: 15%) -2025-09-15T14:20:53.726Z | [OTHER] | Attempt 5203: Error rate 48.81% (target: 15%) -2025-09-15T14:20:53.731Z | [OTHER] | Attempt 5204: Error rate 52.54% (target: 15%) -2025-09-15T14:20:53.736Z | [OTHER] | Attempt 5205: Error rate 52.33% (target: 15%) -2025-09-15T14:20:53.741Z | [OTHER] | Attempt 5206: Error rate 50.85% (target: 15%) -2025-09-15T14:20:53.746Z | [OTHER] | Attempt 5207: Error rate 54.07% (target: 15%) -2025-09-15T14:20:53.752Z | [OTHER] | Attempt 5208: Error rate 44.02% (target: 15%) -2025-09-15T14:20:53.757Z | [OTHER] | Attempt 5209: Error rate 52.13% (target: 15%) -2025-09-15T14:20:53.763Z | [OTHER] | Attempt 5210: Error rate 48.26% (target: 15%) -2025-09-15T14:20:53.769Z | [OTHER] | Attempt 5211: Error rate 55.95% (target: 15%) -2025-09-15T14:20:53.774Z | [OTHER] | Attempt 5212: Error rate 51.52% (target: 15%) -2025-09-15T14:20:53.779Z | [OTHER] | Attempt 5213: Error rate 44.44% (target: 15%) -2025-09-15T14:20:53.784Z | [OTHER] | Attempt 5214: Error rate 48.72% (target: 15%) -2025-09-15T14:20:53.789Z | [OTHER] | Attempt 5215: Error rate 46.51% (target: 15%) -2025-09-15T14:20:53.794Z | [OTHER] | Attempt 5216: Error rate 47.37% (target: 15%) -2025-09-15T14:20:53.800Z | [OTHER] | Attempt 5217: Error rate 54.07% (target: 15%) -2025-09-15T14:20:53.805Z | [OTHER] | Attempt 5218: Error rate 47.22% (target: 15%) -2025-09-15T14:20:53.810Z | [OTHER] | Attempt 5219: Error rate 46.21% (target: 15%) -2025-09-15T14:20:53.815Z | [OTHER] | Attempt 5220: Error rate 49.26% (target: 15%) -2025-09-15T14:20:53.821Z | [OTHER] | Attempt 5221: Error rate 58.7% (target: 15%) -2025-09-15T14:20:53.826Z | [OTHER] | Attempt 5222: Error rate 47.39% (target: 15%) -2025-09-15T14:20:53.831Z | [OTHER] | Attempt 5223: Error rate 54.55% (target: 15%) -2025-09-15T14:20:53.837Z | [OTHER] | Attempt 5224: Error rate 51.63% (target: 15%) -2025-09-15T14:20:53.843Z | [OTHER] | Attempt 5225: Error rate 53.26% (target: 15%) -2025-09-15T14:20:53.849Z | [OTHER] | Attempt 5226: Error rate 52.71% (target: 15%) -2025-09-15T14:20:53.855Z | [OTHER] | Attempt 5227: Error rate 49.6% (target: 15%) -2025-09-15T14:20:53.860Z | [OTHER] | Attempt 5228: Error rate 54% (target: 15%) -2025-09-15T14:20:53.865Z | [OTHER] | Attempt 5229: Error rate 45.19% (target: 15%) -2025-09-15T14:20:53.870Z | [OTHER] | Attempt 5230: Error rate 47.22% (target: 15%) -2025-09-15T14:20:53.875Z | [OTHER] | Attempt 5231: Error rate 51.22% (target: 15%) -2025-09-15T14:20:53.881Z | [OTHER] | Attempt 5232: Error rate 50.38% (target: 15%) -2025-09-15T14:20:53.886Z | [OTHER] | Attempt 5233: Error rate 52.56% (target: 15%) -2025-09-15T14:20:53.891Z | [OTHER] | Attempt 5234: Error rate 51.11% (target: 15%) -2025-09-15T14:20:53.897Z | [OTHER] | Attempt 5235: Error rate 61.24% (target: 15%) -2025-09-15T14:20:53.902Z | [OTHER] | Attempt 5236: Error rate 54.07% (target: 15%) -2025-09-15T14:20:53.907Z | [OTHER] | Attempt 5237: Error rate 61.63% (target: 15%) -2025-09-15T14:20:53.912Z | [OTHER] | Attempt 5238: Error rate 54.95% (target: 15%) -2025-09-15T14:20:53.917Z | [OTHER] | Attempt 5239: Error rate 47.15% (target: 15%) -2025-09-15T14:20:53.922Z | [OTHER] | Attempt 5240: Error rate 53.49% (target: 15%) -2025-09-15T14:20:53.928Z | [OTHER] | Attempt 5241: Error rate 45.24% (target: 15%) -2025-09-15T14:20:53.933Z | [OTHER] | Attempt 5242: Error rate 43.12% (target: 15%) -2025-09-15T14:20:53.938Z | [OTHER] | Attempt 5243: Error rate 40.22% (target: 15%) -2025-09-15T14:20:53.943Z | [OTHER] | Attempt 5244: Error rate 54.65% (target: 15%) -2025-09-15T14:20:53.948Z | [OTHER] | Attempt 5245: Error rate 53.33% (target: 15%) -2025-09-15T14:20:53.953Z | [OTHER] | Attempt 5246: Error rate 58.33% (target: 15%) -2025-09-15T14:20:53.958Z | [OTHER] | Attempt 5247: Error rate 51.06% (target: 15%) -2025-09-15T14:20:53.964Z | [OTHER] | Attempt 5248: Error rate 56.82% (target: 15%) -2025-09-15T14:20:53.969Z | [OTHER] | Attempt 5249: Error rate 56.25% (target: 15%) -2025-09-15T14:20:53.974Z | [OTHER] | Attempt 5250: Error rate 59.09% (target: 15%) -2025-09-15T14:20:53.980Z | [OTHER] | Attempt 5251: Error rate 51.11% (target: 15%) -2025-09-15T14:20:53.985Z | [OTHER] | Attempt 5252: Error rate 53.47% (target: 15%) -2025-09-15T14:20:53.990Z | [OTHER] | Attempt 5253: Error rate 52.38% (target: 15%) -2025-09-15T14:20:53.995Z | [OTHER] | Attempt 5254: Error rate 48.15% (target: 15%) -2025-09-15T14:20:54.000Z | [OTHER] | Attempt 5255: Error rate 53.79% (target: 15%) -2025-09-15T14:20:54.005Z | [OTHER] | Attempt 5256: Error rate 54.37% (target: 15%) -2025-09-15T14:20:54.010Z | [OTHER] | Attempt 5257: Error rate 52.78% (target: 15%) -2025-09-15T14:20:54.016Z | [OTHER] | Attempt 5258: Error rate 50% (target: 15%) -2025-09-15T14:20:54.021Z | [OTHER] | Attempt 5259: Error rate 50.38% (target: 15%) -2025-09-15T14:20:54.026Z | [OTHER] | Attempt 5260: Error rate 44.44% (target: 15%) -2025-09-15T14:20:54.031Z | [OTHER] | Attempt 5261: Error rate 53.85% (target: 15%) -2025-09-15T14:20:54.036Z | [OTHER] | Attempt 5262: Error rate 41.3% (target: 15%) -2025-09-15T14:20:54.041Z | [OTHER] | Attempt 5263: Error rate 46.12% (target: 15%) -2025-09-15T14:20:54.046Z | [OTHER] | Attempt 5264: Error rate 53.17% (target: 15%) -2025-09-15T14:20:54.052Z | [OTHER] | Attempt 5265: Error rate 54.92% (target: 15%) -2025-09-15T14:20:54.057Z | [OTHER] | Attempt 5266: Error rate 57.02% (target: 15%) -2025-09-15T14:20:54.062Z | [OTHER] | Attempt 5267: Error rate 53.49% (target: 15%) -2025-09-15T14:20:54.067Z | [OTHER] | Attempt 5268: Error rate 59.09% (target: 15%) -2025-09-15T14:20:54.073Z | [OTHER] | Attempt 5269: Error rate 57.78% (target: 15%) -2025-09-15T14:20:54.078Z | [OTHER] | Attempt 5270: Error rate 54.58% (target: 15%) -2025-09-15T14:20:54.083Z | [OTHER] | Attempt 5271: Error rate 48.91% (target: 15%) -2025-09-15T14:20:54.089Z | [OTHER] | Attempt 5272: Error rate 51.98% (target: 15%) -2025-09-15T14:20:54.093Z | [OTHER] | Attempt 5273: Error rate 52.54% (target: 15%) -2025-09-15T14:20:54.098Z | [OTHER] | Attempt 5274: Error rate 49.63% (target: 15%) -2025-09-15T14:20:54.104Z | [OTHER] | Attempt 5275: Error rate 56.52% (target: 15%) -2025-09-15T14:20:54.109Z | [OTHER] | Attempt 5276: Error rate 57.48% (target: 15%) -2025-09-15T14:20:54.114Z | [OTHER] | Attempt 5277: Error rate 50% (target: 15%) -2025-09-15T14:20:54.119Z | [OTHER] | Attempt 5278: Error rate 52.27% (target: 15%) -2025-09-15T14:20:54.124Z | [OTHER] | Attempt 5279: Error rate 49.65% (target: 15%) -2025-09-15T14:20:54.129Z | [OTHER] | Attempt 5280: Error rate 57.5% (target: 15%) -2025-09-15T14:20:54.135Z | [OTHER] | Attempt 5281: Error rate 51.89% (target: 15%) -2025-09-15T14:20:54.140Z | [OTHER] | Attempt 5282: Error rate 56.03% (target: 15%) -2025-09-15T14:20:54.145Z | [OTHER] | Attempt 5283: Error rate 53.41% (target: 15%) -2025-09-15T14:20:54.150Z | [OTHER] | Attempt 5284: Error rate 45.24% (target: 15%) -2025-09-15T14:20:54.155Z | [OTHER] | Attempt 5285: Error rate 57.2% (target: 15%) -2025-09-15T14:20:54.160Z | [OTHER] | Attempt 5286: Error rate 51.89% (target: 15%) -2025-09-15T14:20:54.166Z | [OTHER] | Attempt 5287: Error rate 50.38% (target: 15%) -2025-09-15T14:20:54.171Z | [OTHER] | Attempt 5288: Error rate 43.26% (target: 15%) -2025-09-15T14:20:54.176Z | [OTHER] | Attempt 5289: Error rate 47.97% (target: 15%) -2025-09-15T14:20:54.182Z | [OTHER] | Attempt 5290: Error rate 51.45% (target: 15%) -2025-09-15T14:20:54.187Z | [OTHER] | Attempt 5291: Error rate 54.39% (target: 15%) -2025-09-15T14:20:54.193Z | [OTHER] | Attempt 5292: Error rate 51.42% (target: 15%) -2025-09-15T14:20:54.198Z | [OTHER] | Attempt 5293: Error rate 44.32% (target: 15%) -2025-09-15T14:20:54.203Z | [OTHER] | Attempt 5294: Error rate 56.44% (target: 15%) -2025-09-15T14:20:54.209Z | [OTHER] | Attempt 5295: Error rate 57.36% (target: 15%) -2025-09-15T14:20:54.214Z | [OTHER] | Attempt 5296: Error rate 52.96% (target: 15%) -2025-09-15T14:20:54.219Z | [OTHER] | Attempt 5297: Error rate 50.36% (target: 15%) -2025-09-15T14:20:54.224Z | [OTHER] | Attempt 5298: Error rate 51.14% (target: 15%) -2025-09-15T14:20:54.230Z | [OTHER] | Attempt 5299: Error rate 53.99% (target: 15%) -2025-09-15T14:20:54.235Z | [OTHER] | Attempt 5300: Error rate 51.63% (target: 15%) -2025-09-15T14:20:54.241Z | [OTHER] | Attempt 5301: Error rate 50.85% (target: 15%) -2025-09-15T14:20:54.245Z | [OTHER] | Attempt 5302: Error rate 54.86% (target: 15%) -2025-09-15T14:20:54.250Z | [OTHER] | Attempt 5303: Error rate 49.59% (target: 15%) -2025-09-15T14:20:54.256Z | [OTHER] | Attempt 5304: Error rate 52.27% (target: 15%) -2025-09-15T14:20:54.261Z | [OTHER] | Attempt 5305: Error rate 45.42% (target: 15%) -2025-09-15T14:20:54.267Z | [OTHER] | Attempt 5306: Error rate 55.3% (target: 15%) -2025-09-15T14:20:54.272Z | [OTHER] | Attempt 5307: Error rate 50.79% (target: 15%) -2025-09-15T14:20:54.277Z | [OTHER] | Attempt 5308: Error rate 52.71% (target: 15%) -2025-09-15T14:20:54.282Z | [OTHER] | Attempt 5309: Error rate 48.81% (target: 15%) -2025-09-15T14:20:54.287Z | [OTHER] | Attempt 5310: Error rate 56.67% (target: 15%) -2025-09-15T14:20:54.292Z | [OTHER] | Attempt 5311: Error rate 58.68% (target: 15%) -2025-09-15T14:20:54.297Z | [OTHER] | Attempt 5312: Error rate 50% (target: 15%) -2025-09-15T14:20:54.303Z | [OTHER] | Attempt 5313: Error rate 58.51% (target: 15%) -2025-09-15T14:20:54.307Z | [OTHER] | Attempt 5314: Error rate 48.81% (target: 15%) -2025-09-15T14:20:54.313Z | [OTHER] | Attempt 5315: Error rate 46.12% (target: 15%) -2025-09-15T14:20:54.318Z | [OTHER] | Attempt 5316: Error rate 53.62% (target: 15%) -2025-09-15T14:20:54.324Z | [OTHER] | Attempt 5317: Error rate 48.78% (target: 15%) -2025-09-15T14:20:54.330Z | [OTHER] | Attempt 5318: Error rate 53.17% (target: 15%) -2025-09-15T14:20:54.336Z | [OTHER] | Attempt 5319: Error rate 52.03% (target: 15%) -2025-09-15T14:20:54.342Z | [OTHER] | Attempt 5320: Error rate 55.07% (target: 15%) -2025-09-15T14:20:54.348Z | [OTHER] | Attempt 5321: Error rate 56.44% (target: 15%) -2025-09-15T14:20:54.353Z | [OTHER] | Attempt 5322: Error rate 50.76% (target: 15%) -2025-09-15T14:20:54.359Z | [OTHER] | Attempt 5323: Error rate 56.98% (target: 15%) -2025-09-15T14:20:54.364Z | [OTHER] | Attempt 5324: Error rate 51.39% (target: 15%) -2025-09-15T14:20:54.370Z | [OTHER] | Attempt 5325: Error rate 51.81% (target: 15%) -2025-09-15T14:20:54.375Z | [OTHER] | Attempt 5326: Error rate 54.65% (target: 15%) -2025-09-15T14:20:54.381Z | [OTHER] | Attempt 5327: Error rate 49.24% (target: 15%) -2025-09-15T14:20:54.386Z | [OTHER] | Attempt 5328: Error rate 51.11% (target: 15%) -2025-09-15T14:20:54.391Z | [OTHER] | Attempt 5329: Error rate 52.48% (target: 15%) -2025-09-15T14:20:54.396Z | [OTHER] | Attempt 5330: Error rate 48.86% (target: 15%) -2025-09-15T14:20:54.402Z | [OTHER] | Attempt 5331: Error rate 50.74% (target: 15%) -2025-09-15T14:20:54.406Z | [OTHER] | Attempt 5332: Error rate 46.12% (target: 15%) -2025-09-15T14:20:54.412Z | [OTHER] | Attempt 5333: Error rate 57.2% (target: 15%) -2025-09-15T14:20:54.417Z | [OTHER] | Attempt 5334: Error rate 50.38% (target: 15%) -2025-09-15T14:20:54.422Z | [OTHER] | Attempt 5335: Error rate 46.51% (target: 15%) -2025-09-15T14:20:54.427Z | [OTHER] | Attempt 5336: Error rate 49.63% (target: 15%) -2025-09-15T14:20:54.432Z | [OTHER] | Attempt 5337: Error rate 48.02% (target: 15%) -2025-09-15T14:20:54.439Z | [OTHER] | Attempt 5338: Error rate 51.85% (target: 15%) -2025-09-15T14:20:54.444Z | [OTHER] | Attempt 5339: Error rate 56.1% (target: 15%) -2025-09-15T14:20:54.449Z | [OTHER] | Attempt 5340: Error rate 48.91% (target: 15%) -2025-09-15T14:20:54.455Z | [OTHER] | Attempt 5341: Error rate 58.33% (target: 15%) -2025-09-15T14:20:54.460Z | [OTHER] | Attempt 5342: Error rate 47.41% (target: 15%) -2025-09-15T14:20:54.465Z | [OTHER] | Attempt 5343: Error rate 59.3% (target: 15%) -2025-09-15T14:20:54.470Z | [OTHER] | Attempt 5344: Error rate 50.36% (target: 15%) -2025-09-15T14:20:54.475Z | [OTHER] | Attempt 5345: Error rate 50% (target: 15%) -2025-09-15T14:20:54.481Z | [OTHER] | Attempt 5346: Error rate 53.17% (target: 15%) -2025-09-15T14:20:54.487Z | [OTHER] | Attempt 5347: Error rate 52.78% (target: 15%) -2025-09-15T14:20:54.493Z | [OTHER] | Attempt 5348: Error rate 55.93% (target: 15%) -2025-09-15T14:20:54.498Z | [OTHER] | Attempt 5349: Error rate 51.89% (target: 15%) -2025-09-15T14:20:54.503Z | [OTHER] | Attempt 5350: Error rate 51.89% (target: 15%) -2025-09-15T14:20:54.508Z | [OTHER] | Attempt 5351: Error rate 48.48% (target: 15%) -2025-09-15T14:20:54.514Z | [OTHER] | Attempt 5352: Error rate 47.92% (target: 15%) -2025-09-15T14:20:54.519Z | [OTHER] | Attempt 5353: Error rate 46.21% (target: 15%) -2025-09-15T14:20:54.525Z | [OTHER] | Attempt 5354: Error rate 47.73% (target: 15%) -2025-09-15T14:20:54.530Z | [OTHER] | Attempt 5355: Error rate 47.29% (target: 15%) -2025-09-15T14:20:54.536Z | [OTHER] | Attempt 5356: Error rate 50.42% (target: 15%) -2025-09-15T14:20:54.540Z | [OTHER] | Attempt 5357: Error rate 57.46% (target: 15%) -2025-09-15T14:20:54.545Z | [OTHER] | Attempt 5358: Error rate 47.78% (target: 15%) -2025-09-15T14:20:54.550Z | [OTHER] | Attempt 5359: Error rate 54.76% (target: 15%) -2025-09-15T14:20:54.556Z | [OTHER] | Attempt 5360: Error rate 54.17% (target: 15%) -2025-09-15T14:20:54.561Z | [OTHER] | Attempt 5361: Error rate 54.07% (target: 15%) -2025-09-15T14:20:54.566Z | [OTHER] | Attempt 5362: Error rate 49.29% (target: 15%) -2025-09-15T14:20:54.571Z | [OTHER] | Attempt 5363: Error rate 52.54% (target: 15%) -2025-09-15T14:20:54.577Z | [OTHER] | Attempt 5364: Error rate 54.35% (target: 15%) -2025-09-15T14:20:54.582Z | [OTHER] | Attempt 5365: Error rate 56.75% (target: 15%) -2025-09-15T14:20:54.588Z | [OTHER] | Attempt 5366: Error rate 59.93% (target: 15%) -2025-09-15T14:20:54.593Z | [OTHER] | Attempt 5367: Error rate 47.41% (target: 15%) -2025-09-15T14:20:54.598Z | [OTHER] | Attempt 5368: Error rate 57.36% (target: 15%) -2025-09-15T14:20:54.604Z | [OTHER] | Attempt 5369: Error rate 45.56% (target: 15%) -2025-09-15T14:20:54.609Z | [OTHER] | Attempt 5370: Error rate 52.27% (target: 15%) -2025-09-15T14:20:54.614Z | [OTHER] | Attempt 5371: Error rate 56.88% (target: 15%) -2025-09-15T14:20:54.619Z | [OTHER] | Attempt 5372: Error rate 52.27% (target: 15%) -2025-09-15T14:20:54.625Z | [OTHER] | Attempt 5373: Error rate 51.39% (target: 15%) -2025-09-15T14:20:54.630Z | [OTHER] | Attempt 5374: Error rate 49.59% (target: 15%) -2025-09-15T14:20:54.635Z | [OTHER] | Attempt 5375: Error rate 48.29% (target: 15%) -2025-09-15T14:20:54.640Z | [OTHER] | Attempt 5376: Error rate 44.93% (target: 15%) -2025-09-15T14:20:54.645Z | [OTHER] | Attempt 5377: Error rate 44.05% (target: 15%) -2025-09-15T14:20:54.650Z | [OTHER] | Attempt 5378: Error rate 48.84% (target: 15%) -2025-09-15T14:20:54.656Z | [OTHER] | Attempt 5379: Error rate 46.12% (target: 15%) -2025-09-15T14:20:54.661Z | [OTHER] | Attempt 5380: Error rate 49.62% (target: 15%) -2025-09-15T14:20:54.666Z | [OTHER] | Attempt 5381: Error rate 53.33% (target: 15%) -2025-09-15T14:20:54.671Z | [OTHER] | Attempt 5382: Error rate 47.62% (target: 15%) -2025-09-15T14:20:54.676Z | [OTHER] | Attempt 5383: Error rate 53.07% (target: 15%) -2025-09-15T14:20:54.681Z | [OTHER] | Attempt 5384: Error rate 52.14% (target: 15%) -2025-09-15T14:20:54.686Z | [OTHER] | Attempt 5385: Error rate 51.11% (target: 15%) -2025-09-15T14:20:54.692Z | [OTHER] | Attempt 5386: Error rate 49.67% (target: 15%) -2025-09-15T14:20:54.697Z | [OTHER] | Attempt 5387: Error rate 52.78% (target: 15%) -2025-09-15T14:20:54.703Z | [OTHER] | Attempt 5388: Error rate 51.52% (target: 15%) -2025-09-15T14:20:54.708Z | [OTHER] | Attempt 5389: Error rate 46.15% (target: 15%) -2025-09-15T14:20:54.713Z | [OTHER] | Attempt 5390: Error rate 62.68% (target: 15%) -2025-09-15T14:20:54.718Z | [OTHER] | Attempt 5391: Error rate 54.81% (target: 15%) -2025-09-15T14:20:54.723Z | [OTHER] | Attempt 5392: Error rate 46.21% (target: 15%) -2025-09-15T14:20:54.728Z | [OTHER] | Attempt 5393: Error rate 60.28% (target: 15%) -2025-09-15T14:20:54.734Z | [OTHER] | Attempt 5394: Error rate 51.81% (target: 15%) -2025-09-15T14:20:54.739Z | [OTHER] | Attempt 5395: Error rate 49.6% (target: 15%) -2025-09-15T14:20:54.744Z | [OTHER] | Attempt 5396: Error rate 45.93% (target: 15%) -2025-09-15T14:20:54.749Z | [OTHER] | Attempt 5397: Error rate 51.14% (target: 15%) -2025-09-15T14:20:54.754Z | [OTHER] | Attempt 5398: Error rate 47.29% (target: 15%) -2025-09-15T14:20:54.760Z | [OTHER] | Attempt 5399: Error rate 49.62% (target: 15%) -2025-09-15T14:20:54.765Z | [OTHER] | Attempt 5400: Error rate 53.33% (target: 15%) -2025-09-15T14:20:54.771Z | [OTHER] | Attempt 5401: Error rate 58.13% (target: 15%) -2025-09-15T14:20:54.776Z | [OTHER] | Attempt 5402: Error rate 57.14% (target: 15%) -2025-09-15T14:20:54.782Z | [OTHER] | Attempt 5403: Error rate 36.59% (target: 15%) -2025-09-15T14:20:54.787Z | [OTHER] | Attempt 5404: Error rate 44.74% (target: 15%) -2025-09-15T14:20:54.792Z | [OTHER] | Attempt 5405: Error rate 50.74% (target: 15%) -2025-09-15T14:20:54.797Z | [OTHER] | Attempt 5406: Error rate 49.17% (target: 15%) -2025-09-15T14:20:54.803Z | [OTHER] | Attempt 5407: Error rate 42.5% (target: 15%) -2025-09-15T14:20:54.808Z | [OTHER] | Attempt 5408: Error rate 60.81% (target: 15%) -2025-09-15T14:20:54.813Z | [OTHER] | Attempt 5409: Error rate 56.75% (target: 15%) -2025-09-15T14:20:54.819Z | [OTHER] | Attempt 5410: Error rate 48.52% (target: 15%) -2025-09-15T14:20:54.824Z | [OTHER] | Attempt 5411: Error rate 44.7% (target: 15%) -2025-09-15T14:20:54.830Z | [OTHER] | Attempt 5412: Error rate 53.99% (target: 15%) -2025-09-15T14:20:54.835Z | [OTHER] | Attempt 5413: Error rate 54.05% (target: 15%) -2025-09-15T14:20:54.840Z | [OTHER] | Attempt 5414: Error rate 47.78% (target: 15%) -2025-09-15T14:20:54.846Z | [OTHER] | Attempt 5415: Error rate 50.36% (target: 15%) -2025-09-15T14:20:54.851Z | [OTHER] | Attempt 5416: Error rate 64.34% (target: 15%) -2025-09-15T14:20:54.856Z | [OTHER] | Attempt 5417: Error rate 55.95% (target: 15%) -2025-09-15T14:20:54.861Z | [OTHER] | Attempt 5418: Error rate 55.78% (target: 15%) -2025-09-15T14:20:54.867Z | [OTHER] | Attempt 5419: Error rate 48.1% (target: 15%) -2025-09-15T14:20:54.872Z | [OTHER] | Attempt 5420: Error rate 59.58% (target: 15%) -2025-09-15T14:20:54.877Z | [OTHER] | Attempt 5421: Error rate 45.35% (target: 15%) -2025-09-15T14:20:54.883Z | [OTHER] | Attempt 5422: Error rate 47.62% (target: 15%) -2025-09-15T14:20:54.888Z | [OTHER] | Attempt 5423: Error rate 55.67% (target: 15%) -2025-09-15T14:20:54.893Z | [OTHER] | Attempt 5424: Error rate 53.26% (target: 15%) -2025-09-15T14:20:54.898Z | [OTHER] | Attempt 5425: Error rate 49.62% (target: 15%) -2025-09-15T14:20:54.903Z | [OTHER] | Attempt 5426: Error rate 50.76% (target: 15%) -2025-09-15T14:20:54.908Z | [OTHER] | Attempt 5427: Error rate 50% (target: 15%) -2025-09-15T14:20:54.914Z | [OTHER] | Attempt 5428: Error rate 59.17% (target: 15%) -2025-09-15T14:20:54.919Z | [OTHER] | Attempt 5429: Error rate 55.81% (target: 15%) -2025-09-15T14:20:54.924Z | [OTHER] | Attempt 5430: Error rate 46.43% (target: 15%) -2025-09-15T14:20:54.929Z | [OTHER] | Attempt 5431: Error rate 51.59% (target: 15%) -2025-09-15T14:20:54.935Z | [OTHER] | Attempt 5432: Error rate 60.57% (target: 15%) -2025-09-15T14:20:54.941Z | [OTHER] | Attempt 5433: Error rate 56.3% (target: 15%) -2025-09-15T14:20:54.946Z | [OTHER] | Attempt 5434: Error rate 45.29% (target: 15%) -2025-09-15T14:20:54.952Z | [OTHER] | Attempt 5435: Error rate 47.1% (target: 15%) -2025-09-15T14:20:54.958Z | [OTHER] | Attempt 5436: Error rate 52.03% (target: 15%) -2025-09-15T14:20:54.964Z | [OTHER] | Attempt 5437: Error rate 54.88% (target: 15%) -2025-09-15T14:20:54.970Z | [OTHER] | Attempt 5438: Error rate 60.47% (target: 15%) -2025-09-15T14:20:54.975Z | [OTHER] | Attempt 5439: Error rate 47.78% (target: 15%) -2025-09-15T14:20:54.980Z | [OTHER] | Attempt 5440: Error rate 50.41% (target: 15%) -2025-09-15T14:20:54.986Z | [OTHER] | Attempt 5441: Error rate 43.75% (target: 15%) -2025-09-15T14:20:54.992Z | [OTHER] | Attempt 5442: Error rate 51% (target: 15%) -2025-09-15T14:20:54.997Z | [OTHER] | Attempt 5443: Error rate 57.41% (target: 15%) -2025-09-15T14:20:55.002Z | [OTHER] | Attempt 5444: Error rate 56.44% (target: 15%) -2025-09-15T14:20:55.007Z | [OTHER] | Attempt 5445: Error rate 49.64% (target: 15%) -2025-09-15T14:20:55.012Z | [OTHER] | Attempt 5446: Error rate 39.84% (target: 15%) -2025-09-15T14:20:55.018Z | [OTHER] | Attempt 5447: Error rate 52.44% (target: 15%) -2025-09-15T14:20:55.024Z | [OTHER] | Attempt 5448: Error rate 50.85% (target: 15%) -2025-09-15T14:20:55.029Z | [OTHER] | Attempt 5449: Error rate 57.04% (target: 15%) -2025-09-15T14:20:55.034Z | [OTHER] | Attempt 5450: Error rate 63.95% (target: 15%) -2025-09-15T14:20:55.039Z | [OTHER] | Attempt 5451: Error rate 52.96% (target: 15%) -2025-09-15T14:20:55.044Z | [OTHER] | Attempt 5452: Error rate 48.89% (target: 15%) -2025-09-15T14:20:55.050Z | [OTHER] | Attempt 5453: Error rate 50.36% (target: 15%) -2025-09-15T14:20:55.055Z | [OTHER] | Attempt 5454: Error rate 46.74% (target: 15%) -2025-09-15T14:20:55.061Z | [OTHER] | Attempt 5455: Error rate 53.62% (target: 15%) -2025-09-15T14:20:55.066Z | [OTHER] | Attempt 5456: Error rate 59.76% (target: 15%) -2025-09-15T14:20:55.071Z | [OTHER] | Attempt 5457: Error rate 51.39% (target: 15%) -2025-09-15T14:20:55.076Z | [OTHER] | Attempt 5458: Error rate 53.57% (target: 15%) -2025-09-15T14:20:55.081Z | [OTHER] | Attempt 5459: Error rate 55.19% (target: 15%) -2025-09-15T14:20:55.087Z | [OTHER] | Attempt 5460: Error rate 52.22% (target: 15%) -2025-09-15T14:20:55.092Z | [OTHER] | Attempt 5461: Error rate 52.54% (target: 15%) -2025-09-15T14:20:55.097Z | [OTHER] | Attempt 5462: Error rate 51.04% (target: 15%) -2025-09-15T14:20:55.102Z | [OTHER] | Attempt 5463: Error rate 47.01% (target: 15%) -2025-09-15T14:20:55.108Z | [OTHER] | Attempt 5464: Error rate 54.55% (target: 15%) -2025-09-15T14:20:55.113Z | [OTHER] | Attempt 5465: Error rate 51.16% (target: 15%) -2025-09-15T14:20:55.118Z | [OTHER] | Attempt 5466: Error rate 57.09% (target: 15%) -2025-09-15T14:20:55.124Z | [OTHER] | Attempt 5467: Error rate 45.65% (target: 15%) -2025-09-15T14:20:55.129Z | [OTHER] | Attempt 5468: Error rate 50.78% (target: 15%) -2025-09-15T14:20:55.134Z | [OTHER] | Attempt 5469: Error rate 58.33% (target: 15%) -2025-09-15T14:20:55.140Z | [OTHER] | Attempt 5470: Error rate 52.99% (target: 15%) -2025-09-15T14:20:55.145Z | [OTHER] | Attempt 5471: Error rate 52.27% (target: 15%) -2025-09-15T14:20:55.150Z | [OTHER] | Attempt 5472: Error rate 49.24% (target: 15%) -2025-09-15T14:20:55.156Z | [OTHER] | Attempt 5473: Error rate 53.57% (target: 15%) -2025-09-15T14:20:55.161Z | [OTHER] | Attempt 5474: Error rate 55.93% (target: 15%) -2025-09-15T14:20:55.166Z | [OTHER] | Attempt 5475: Error rate 53.17% (target: 15%) -2025-09-15T14:20:55.172Z | [OTHER] | Attempt 5476: Error rate 46.9% (target: 15%) -2025-09-15T14:20:55.177Z | [OTHER] | Attempt 5477: Error rate 59.85% (target: 15%) -2025-09-15T14:20:55.182Z | [OTHER] | Attempt 5478: Error rate 51.25% (target: 15%) -2025-09-15T14:20:55.187Z | [OTHER] | Attempt 5479: Error rate 49.61% (target: 15%) -2025-09-15T14:20:55.193Z | [OTHER] | Attempt 5480: Error rate 49.24% (target: 15%) -2025-09-15T14:20:55.198Z | [OTHER] | Attempt 5481: Error rate 54.55% (target: 15%) -2025-09-15T14:20:55.203Z | [OTHER] | Attempt 5482: Error rate 50% (target: 15%) -2025-09-15T14:20:55.208Z | [OTHER] | Attempt 5483: Error rate 53.62% (target: 15%) -2025-09-15T14:20:55.214Z | [OTHER] | Attempt 5484: Error rate 46% (target: 15%) -2025-09-15T14:20:55.219Z | [OTHER] | Attempt 5485: Error rate 53.03% (target: 15%) -2025-09-15T14:20:55.225Z | [OTHER] | Attempt 5486: Error rate 55.16% (target: 15%) -2025-09-15T14:20:55.230Z | [OTHER] | Attempt 5487: Error rate 51.22% (target: 15%) -2025-09-15T14:20:55.235Z | [OTHER] | Attempt 5488: Error rate 49.26% (target: 15%) -2025-09-15T14:20:55.241Z | [OTHER] | Attempt 5489: Error rate 57.29% (target: 15%) -2025-09-15T14:20:55.246Z | [OTHER] | Attempt 5490: Error rate 55.04% (target: 15%) -2025-09-15T14:20:55.251Z | [OTHER] | Attempt 5491: Error rate 50% (target: 15%) -2025-09-15T14:20:55.257Z | [OTHER] | Attempt 5492: Error rate 56.06% (target: 15%) -2025-09-15T14:20:55.262Z | [OTHER] | Attempt 5493: Error rate 55.19% (target: 15%) -2025-09-15T14:20:55.267Z | [OTHER] | Attempt 5494: Error rate 49.63% (target: 15%) -2025-09-15T14:20:55.272Z | [OTHER] | Attempt 5495: Error rate 56.59% (target: 15%) -2025-09-15T14:20:55.278Z | [OTHER] | Attempt 5496: Error rate 53.49% (target: 15%) -2025-09-15T14:20:55.283Z | [OTHER] | Attempt 5497: Error rate 56.5% (target: 15%) -2025-09-15T14:20:55.289Z | [OTHER] | Attempt 5498: Error rate 52.92% (target: 15%) -2025-09-15T14:20:55.295Z | [OTHER] | Attempt 5499: Error rate 57.04% (target: 15%) -2025-09-15T14:20:55.301Z | [OTHER] | Attempt 5500: Error rate 47.46% (target: 15%) -2025-09-15T14:20:55.306Z | [OTHER] | Attempt 5501: Error rate 53.17% (target: 15%) -2025-09-15T14:20:55.311Z | [OTHER] | Attempt 5502: Error rate 53.79% (target: 15%) -2025-09-15T14:20:55.317Z | [OTHER] | Attempt 5503: Error rate 48.86% (target: 15%) -2025-09-15T14:20:55.322Z | [OTHER] | Attempt 5504: Error rate 57.8% (target: 15%) -2025-09-15T14:20:55.327Z | [OTHER] | Attempt 5505: Error rate 48.72% (target: 15%) -2025-09-15T14:20:55.332Z | [OTHER] | Attempt 5506: Error rate 50% (target: 15%) -2025-09-15T14:20:55.338Z | [OTHER] | Attempt 5507: Error rate 50.37% (target: 15%) -2025-09-15T14:20:55.343Z | [OTHER] | Attempt 5508: Error rate 44.19% (target: 15%) -2025-09-15T14:20:55.348Z | [OTHER] | Attempt 5509: Error rate 55.19% (target: 15%) -2025-09-15T14:20:55.354Z | [OTHER] | Attempt 5510: Error rate 51.67% (target: 15%) -2025-09-15T14:20:55.360Z | [OTHER] | Attempt 5511: Error rate 46.45% (target: 15%) -2025-09-15T14:20:55.365Z | [OTHER] | Attempt 5512: Error rate 51.94% (target: 15%) -2025-09-15T14:20:55.371Z | [OTHER] | Attempt 5513: Error rate 54.08% (target: 15%) -2025-09-15T14:20:55.377Z | [OTHER] | Attempt 5514: Error rate 59.13% (target: 15%) -2025-09-15T14:20:55.382Z | [OTHER] | Attempt 5515: Error rate 46.03% (target: 15%) -2025-09-15T14:20:55.388Z | [OTHER] | Attempt 5516: Error rate 54.71% (target: 15%) -2025-09-15T14:20:55.393Z | [OTHER] | Attempt 5517: Error rate 50% (target: 15%) -2025-09-15T14:20:55.398Z | [OTHER] | Attempt 5518: Error rate 47.35% (target: 15%) -2025-09-15T14:20:55.403Z | [OTHER] | Attempt 5519: Error rate 49% (target: 15%) -2025-09-15T14:20:55.408Z | [OTHER] | Attempt 5520: Error rate 52.78% (target: 15%) -2025-09-15T14:20:55.414Z | [OTHER] | Attempt 5521: Error rate 55.56% (target: 15%) -2025-09-15T14:20:55.420Z | [OTHER] | Attempt 5522: Error rate 52.96% (target: 15%) -2025-09-15T14:20:55.425Z | [OTHER] | Attempt 5523: Error rate 60.47% (target: 15%) -2025-09-15T14:20:55.430Z | [OTHER] | Attempt 5524: Error rate 52.38% (target: 15%) -2025-09-15T14:20:55.435Z | [OTHER] | Attempt 5525: Error rate 49.21% (target: 15%) -2025-09-15T14:20:55.442Z | [OTHER] | Attempt 5526: Error rate 49.63% (target: 15%) -2025-09-15T14:20:55.446Z | [OTHER] | Attempt 5527: Error rate 53.25% (target: 15%) -2025-09-15T14:20:55.451Z | [OTHER] | Attempt 5528: Error rate 47.35% (target: 15%) -2025-09-15T14:20:55.457Z | [OTHER] | Attempt 5529: Error rate 53.99% (target: 15%) -2025-09-15T14:20:55.462Z | [OTHER] | Attempt 5530: Error rate 60.98% (target: 15%) -2025-09-15T14:20:55.467Z | [OTHER] | Attempt 5531: Error rate 47.46% (target: 15%) -2025-09-15T14:20:55.473Z | [OTHER] | Attempt 5532: Error rate 50.71% (target: 15%) -2025-09-15T14:20:55.478Z | [OTHER] | Attempt 5533: Error rate 45.24% (target: 15%) -2025-09-15T14:20:55.483Z | [OTHER] | Attempt 5534: Error rate 45.93% (target: 15%) -2025-09-15T14:20:55.489Z | [OTHER] | Attempt 5535: Error rate 47.41% (target: 15%) -2025-09-15T14:20:55.494Z | [OTHER] | Attempt 5536: Error rate 53.75% (target: 15%) -2025-09-15T14:20:55.499Z | [OTHER] | Attempt 5537: Error rate 55.21% (target: 15%) -2025-09-15T14:20:55.505Z | [OTHER] | Attempt 5538: Error rate 49.62% (target: 15%) -2025-09-15T14:20:55.510Z | [OTHER] | Attempt 5539: Error rate 52.33% (target: 15%) -2025-09-15T14:20:55.515Z | [OTHER] | Attempt 5540: Error rate 57.61% (target: 15%) -2025-09-15T14:20:55.520Z | [OTHER] | Attempt 5541: Error rate 52.27% (target: 15%) -2025-09-15T14:20:55.526Z | [OTHER] | Attempt 5542: Error rate 59.93% (target: 15%) -2025-09-15T14:20:55.531Z | [OTHER] | Attempt 5543: Error rate 57.04% (target: 15%) -2025-09-15T14:20:55.536Z | [OTHER] | Attempt 5544: Error rate 55.43% (target: 15%) -2025-09-15T14:20:55.542Z | [OTHER] | Attempt 5545: Error rate 51.67% (target: 15%) -2025-09-15T14:20:55.547Z | [OTHER] | Attempt 5546: Error rate 52.44% (target: 15%) -2025-09-15T14:20:55.553Z | [OTHER] | Attempt 5547: Error rate 50% (target: 15%) -2025-09-15T14:20:55.558Z | [OTHER] | Attempt 5548: Error rate 48.81% (target: 15%) -2025-09-15T14:20:55.563Z | [OTHER] | Attempt 5549: Error rate 52.44% (target: 15%) -2025-09-15T14:20:55.570Z | [OTHER] | Attempt 5550: Error rate 55.98% (target: 15%) -2025-09-15T14:20:55.575Z | [OTHER] | Attempt 5551: Error rate 52.9% (target: 15%) -2025-09-15T14:20:55.581Z | [OTHER] | Attempt 5552: Error rate 56.2% (target: 15%) -2025-09-15T14:20:55.586Z | [OTHER] | Attempt 5553: Error rate 58.14% (target: 15%) -2025-09-15T14:20:55.592Z | [OTHER] | Attempt 5554: Error rate 43.56% (target: 15%) -2025-09-15T14:20:55.597Z | [OTHER] | Attempt 5555: Error rate 52.59% (target: 15%) -2025-09-15T14:20:55.602Z | [OTHER] | Attempt 5556: Error rate 58.51% (target: 15%) -2025-09-15T14:20:55.608Z | [OTHER] | Attempt 5557: Error rate 47.37% (target: 15%) -2025-09-15T14:20:55.613Z | [OTHER] | Attempt 5558: Error rate 53.1% (target: 15%) -2025-09-15T14:20:55.619Z | [OTHER] | Attempt 5559: Error rate 42.8% (target: 15%) -2025-09-15T14:20:55.624Z | [OTHER] | Attempt 5560: Error rate 48.48% (target: 15%) -2025-09-15T14:20:55.629Z | [OTHER] | Attempt 5561: Error rate 49.26% (target: 15%) -2025-09-15T14:20:55.635Z | [OTHER] | Attempt 5562: Error rate 59.3% (target: 15%) -2025-09-15T14:20:55.640Z | [OTHER] | Attempt 5563: Error rate 50.37% (target: 15%) -2025-09-15T14:20:55.645Z | [OTHER] | Attempt 5564: Error rate 52.38% (target: 15%) -2025-09-15T14:20:55.651Z | [OTHER] | Attempt 5565: Error rate 56.03% (target: 15%) -2025-09-15T14:20:55.656Z | [OTHER] | Attempt 5566: Error rate 55.95% (target: 15%) -2025-09-15T14:20:55.662Z | [OTHER] | Attempt 5567: Error rate 54.76% (target: 15%) -2025-09-15T14:20:55.667Z | [OTHER] | Attempt 5568: Error rate 54.47% (target: 15%) -2025-09-15T14:20:55.673Z | [OTHER] | Attempt 5569: Error rate 49.64% (target: 15%) -2025-09-15T14:20:55.678Z | [OTHER] | Attempt 5570: Error rate 51.85% (target: 15%) -2025-09-15T14:20:55.684Z | [OTHER] | Attempt 5571: Error rate 46.51% (target: 15%) -2025-09-15T14:20:55.690Z | [OTHER] | Attempt 5572: Error rate 55.26% (target: 15%) -2025-09-15T14:20:55.695Z | [OTHER] | Attempt 5573: Error rate 50.68% (target: 15%) -2025-09-15T14:20:55.701Z | [OTHER] | Attempt 5574: Error rate 48.33% (target: 15%) -2025-09-15T14:20:55.706Z | [OTHER] | Attempt 5575: Error rate 48.91% (target: 15%) -2025-09-15T14:20:55.711Z | [OTHER] | Attempt 5576: Error rate 47.97% (target: 15%) -2025-09-15T14:20:55.717Z | [OTHER] | Attempt 5577: Error rate 53.7% (target: 15%) -2025-09-15T14:20:55.722Z | [OTHER] | Attempt 5578: Error rate 53.26% (target: 15%) -2025-09-15T14:20:55.728Z | [OTHER] | Attempt 5579: Error rate 50% (target: 15%) -2025-09-15T14:20:55.734Z | [OTHER] | Attempt 5580: Error rate 53.67% (target: 15%) -2025-09-15T14:20:55.740Z | [OTHER] | Attempt 5581: Error rate 53.57% (target: 15%) -2025-09-15T14:20:55.745Z | [OTHER] | Attempt 5582: Error rate 50% (target: 15%) -2025-09-15T14:20:55.750Z | [OTHER] | Attempt 5583: Error rate 53.03% (target: 15%) -2025-09-15T14:20:55.755Z | [OTHER] | Attempt 5584: Error rate 57.64% (target: 15%) -2025-09-15T14:20:55.760Z | [OTHER] | Attempt 5585: Error rate 55.21% (target: 15%) -2025-09-15T14:20:55.766Z | [OTHER] | Attempt 5586: Error rate 53.57% (target: 15%) -2025-09-15T14:20:55.771Z | [OTHER] | Attempt 5587: Error rate 58.12% (target: 15%) -2025-09-15T14:20:55.776Z | [OTHER] | Attempt 5588: Error rate 55.8% (target: 15%) -2025-09-15T14:20:55.782Z | [OTHER] | Attempt 5589: Error rate 51.59% (target: 15%) -2025-09-15T14:20:55.787Z | [OTHER] | Attempt 5590: Error rate 56.67% (target: 15%) -2025-09-15T14:20:55.793Z | [OTHER] | Attempt 5591: Error rate 51.16% (target: 15%) -2025-09-15T14:20:55.798Z | [OTHER] | Attempt 5592: Error rate 55.68% (target: 15%) -2025-09-15T14:20:55.803Z | [OTHER] | Attempt 5593: Error rate 59.09% (target: 15%) -2025-09-15T14:20:55.809Z | [OTHER] | Attempt 5594: Error rate 50.36% (target: 15%) -2025-09-15T14:20:55.814Z | [OTHER] | Attempt 5595: Error rate 54.26% (target: 15%) -2025-09-15T14:20:55.820Z | [OTHER] | Attempt 5596: Error rate 50.74% (target: 15%) -2025-09-15T14:20:55.825Z | [OTHER] | Attempt 5597: Error rate 52.78% (target: 15%) -2025-09-15T14:20:55.831Z | [OTHER] | Attempt 5598: Error rate 48.52% (target: 15%) -2025-09-15T14:20:55.836Z | [OTHER] | Attempt 5599: Error rate 53.25% (target: 15%) -2025-09-15T14:20:55.841Z | [OTHER] | Attempt 5600: Error rate 47.37% (target: 15%) -2025-09-15T14:20:55.847Z | [OTHER] | Attempt 5601: Error rate 53.19% (target: 15%) -2025-09-15T14:20:55.852Z | [OTHER] | Attempt 5602: Error rate 55.43% (target: 15%) -2025-09-15T14:20:55.857Z | [OTHER] | Attempt 5603: Error rate 49.26% (target: 15%) -2025-09-15T14:20:55.863Z | [OTHER] | Attempt 5604: Error rate 57.94% (target: 15%) -2025-09-15T14:20:55.868Z | [OTHER] | Attempt 5605: Error rate 49.61% (target: 15%) -2025-09-15T14:20:55.873Z | [OTHER] | Attempt 5606: Error rate 52.9% (target: 15%) -2025-09-15T14:20:55.879Z | [OTHER] | Attempt 5607: Error rate 52.43% (target: 15%) -2025-09-15T14:20:55.885Z | [OTHER] | Attempt 5608: Error rate 54.27% (target: 15%) -2025-09-15T14:20:55.890Z | [OTHER] | Attempt 5609: Error rate 48.37% (target: 15%) -2025-09-15T14:20:55.896Z | [OTHER] | Attempt 5610: Error rate 55.42% (target: 15%) -2025-09-15T14:20:55.903Z | [OTHER] | Attempt 5611: Error rate 51.42% (target: 15%) -2025-09-15T14:20:55.908Z | [OTHER] | Attempt 5612: Error rate 51.55% (target: 15%) -2025-09-15T14:20:55.913Z | [OTHER] | Attempt 5613: Error rate 48.91% (target: 15%) -2025-09-15T14:20:55.919Z | [OTHER] | Attempt 5614: Error rate 58.89% (target: 15%) -2025-09-15T14:20:55.925Z | [OTHER] | Attempt 5615: Error rate 52.48% (target: 15%) -2025-09-15T14:20:55.930Z | [OTHER] | Attempt 5616: Error rate 58.73% (target: 15%) -2025-09-15T14:20:55.936Z | [OTHER] | Attempt 5617: Error rate 55.13% (target: 15%) -2025-09-15T14:20:55.942Z | [OTHER] | Attempt 5618: Error rate 53.67% (target: 15%) -2025-09-15T14:20:55.951Z | [OTHER] | Attempt 5619: Error rate 50% (target: 15%) -2025-09-15T14:20:55.960Z | [OTHER] | Attempt 5620: Error rate 51.42% (target: 15%) -2025-09-15T14:20:55.968Z | [OTHER] | Attempt 5621: Error rate 55.67% (target: 15%) -2025-09-15T14:20:55.976Z | [OTHER] | Attempt 5622: Error rate 51.39% (target: 15%) -2025-09-15T14:20:55.982Z | [OTHER] | Attempt 5623: Error rate 48.86% (target: 15%) -2025-09-15T14:20:55.989Z | [OTHER] | Attempt 5624: Error rate 55.3% (target: 15%) -2025-09-15T14:20:55.995Z | [OTHER] | Attempt 5625: Error rate 48.94% (target: 15%) -2025-09-15T14:20:56.001Z | [OTHER] | Attempt 5626: Error rate 51.55% (target: 15%) -2025-09-15T14:20:56.007Z | [OTHER] | Attempt 5627: Error rate 54.17% (target: 15%) -2025-09-15T14:20:56.012Z | [OTHER] | Attempt 5628: Error rate 53.42% (target: 15%) -2025-09-15T14:20:56.017Z | [OTHER] | Attempt 5629: Error rate 55.32% (target: 15%) -2025-09-15T14:20:56.023Z | [OTHER] | Attempt 5630: Error rate 51.36% (target: 15%) -2025-09-15T14:20:56.028Z | [OTHER] | Attempt 5631: Error rate 45.63% (target: 15%) -2025-09-15T14:20:56.034Z | [OTHER] | Attempt 5632: Error rate 52.65% (target: 15%) -2025-09-15T14:20:56.039Z | [OTHER] | Attempt 5633: Error rate 48.89% (target: 15%) -2025-09-15T14:20:56.045Z | [OTHER] | Attempt 5634: Error rate 52.9% (target: 15%) -2025-09-15T14:20:56.050Z | [OTHER] | Attempt 5635: Error rate 51.98% (target: 15%) -2025-09-15T14:20:56.055Z | [OTHER] | Attempt 5636: Error rate 51.19% (target: 15%) -2025-09-15T14:20:56.061Z | [OTHER] | Attempt 5637: Error rate 52.96% (target: 15%) -2025-09-15T14:20:56.067Z | [OTHER] | Attempt 5638: Error rate 47.92% (target: 15%) -2025-09-15T14:20:56.072Z | [OTHER] | Attempt 5639: Error rate 50.39% (target: 15%) -2025-09-15T14:20:56.077Z | [OTHER] | Attempt 5640: Error rate 53.55% (target: 15%) -2025-09-15T14:20:56.083Z | [OTHER] | Attempt 5641: Error rate 52.38% (target: 15%) -2025-09-15T14:20:56.088Z | [OTHER] | Attempt 5642: Error rate 49.65% (target: 15%) -2025-09-15T14:20:56.093Z | [OTHER] | Attempt 5643: Error rate 50.43% (target: 15%) -2025-09-15T14:20:56.099Z | [OTHER] | Attempt 5644: Error rate 53.41% (target: 15%) -2025-09-15T14:20:56.104Z | [OTHER] | Attempt 5645: Error rate 56.35% (target: 15%) -2025-09-15T14:20:56.110Z | [OTHER] | Attempt 5646: Error rate 51.48% (target: 15%) -2025-09-15T14:20:56.115Z | [OTHER] | Attempt 5647: Error rate 51.16% (target: 15%) -2025-09-15T14:20:56.121Z | [OTHER] | Attempt 5648: Error rate 46.75% (target: 15%) -2025-09-15T14:20:56.126Z | [OTHER] | Attempt 5649: Error rate 53.7% (target: 15%) -2025-09-15T14:20:56.131Z | [OTHER] | Attempt 5650: Error rate 53.33% (target: 15%) -2025-09-15T14:20:56.137Z | [OTHER] | Attempt 5651: Error rate 45.74% (target: 15%) -2025-09-15T14:20:56.142Z | [OTHER] | Attempt 5652: Error rate 55.28% (target: 15%) -2025-09-15T14:20:56.147Z | [OTHER] | Attempt 5653: Error rate 58.71% (target: 15%) -2025-09-15T14:20:56.153Z | [OTHER] | Attempt 5654: Error rate 54.81% (target: 15%) -2025-09-15T14:20:56.159Z | [OTHER] | Attempt 5655: Error rate 53.03% (target: 15%) -2025-09-15T14:20:56.164Z | [OTHER] | Attempt 5656: Error rate 54.88% (target: 15%) -2025-09-15T14:20:56.170Z | [OTHER] | Attempt 5657: Error rate 53.7% (target: 15%) -2025-09-15T14:20:56.175Z | [OTHER] | Attempt 5658: Error rate 48.55% (target: 15%) -2025-09-15T14:20:56.181Z | [OTHER] | Attempt 5659: Error rate 53.99% (target: 15%) -2025-09-15T14:20:56.186Z | [OTHER] | Attempt 5660: Error rate 50.43% (target: 15%) -2025-09-15T14:20:56.191Z | [OTHER] | Attempt 5661: Error rate 54.42% (target: 15%) -2025-09-15T14:20:56.197Z | [OTHER] | Attempt 5662: Error rate 51.74% (target: 15%) -2025-09-15T14:20:56.202Z | [OTHER] | Attempt 5663: Error rate 56.16% (target: 15%) -2025-09-15T14:20:56.209Z | [OTHER] | Attempt 5664: Error rate 47.56% (target: 15%) -2025-09-15T14:20:56.214Z | [OTHER] | Attempt 5665: Error rate 53.62% (target: 15%) -2025-09-15T14:20:56.220Z | [OTHER] | Attempt 5666: Error rate 61.25% (target: 15%) -2025-09-15T14:20:56.226Z | [OTHER] | Attempt 5667: Error rate 55.56% (target: 15%) -2025-09-15T14:20:56.232Z | [OTHER] | Attempt 5668: Error rate 61.11% (target: 15%) -2025-09-15T14:20:56.237Z | [OTHER] | Attempt 5669: Error rate 52.44% (target: 15%) -2025-09-15T14:20:56.243Z | [OTHER] | Attempt 5670: Error rate 51.63% (target: 15%) -2025-09-15T14:20:56.248Z | [OTHER] | Attempt 5671: Error rate 60.16% (target: 15%) -2025-09-15T14:20:56.254Z | [OTHER] | Attempt 5672: Error rate 49.64% (target: 15%) -2025-09-15T14:20:56.259Z | [OTHER] | Attempt 5673: Error rate 46.43% (target: 15%) -2025-09-15T14:20:56.264Z | [OTHER] | Attempt 5674: Error rate 52.96% (target: 15%) -2025-09-15T14:20:56.269Z | [OTHER] | Attempt 5675: Error rate 53.41% (target: 15%) -2025-09-15T14:20:56.275Z | [OTHER] | Attempt 5676: Error rate 58.75% (target: 15%) -2025-09-15T14:20:56.281Z | [OTHER] | Attempt 5677: Error rate 51.09% (target: 15%) -2025-09-15T14:20:56.287Z | [OTHER] | Attempt 5678: Error rate 46.97% (target: 15%) -2025-09-15T14:20:56.293Z | [OTHER] | Attempt 5679: Error rate 53.99% (target: 15%) -2025-09-15T14:20:56.298Z | [OTHER] | Attempt 5680: Error rate 49.61% (target: 15%) -2025-09-15T14:20:56.303Z | [OTHER] | Attempt 5681: Error rate 57.32% (target: 15%) -2025-09-15T14:20:56.309Z | [OTHER] | Attempt 5682: Error rate 52.38% (target: 15%) -2025-09-15T14:20:56.315Z | [OTHER] | Attempt 5683: Error rate 47.78% (target: 15%) -2025-09-15T14:20:56.321Z | [OTHER] | Attempt 5684: Error rate 52.13% (target: 15%) -2025-09-15T14:20:56.326Z | [OTHER] | Attempt 5685: Error rate 48.58% (target: 15%) -2025-09-15T14:20:56.331Z | [OTHER] | Attempt 5686: Error rate 45.53% (target: 15%) -2025-09-15T14:20:56.336Z | [OTHER] | Attempt 5687: Error rate 52.65% (target: 15%) -2025-09-15T14:20:56.342Z | [OTHER] | Attempt 5688: Error rate 40.83% (target: 15%) -2025-09-15T14:20:56.348Z | [OTHER] | Attempt 5689: Error rate 56.59% (target: 15%) -2025-09-15T14:20:56.354Z | [OTHER] | Attempt 5690: Error rate 50.83% (target: 15%) -2025-09-15T14:20:56.360Z | [OTHER] | Attempt 5691: Error rate 51.45% (target: 15%) -2025-09-15T14:20:56.366Z | [OTHER] | Attempt 5692: Error rate 48.91% (target: 15%) -2025-09-15T14:20:56.371Z | [OTHER] | Attempt 5693: Error rate 57.41% (target: 15%) -2025-09-15T14:20:56.377Z | [OTHER] | Attempt 5694: Error rate 49.24% (target: 15%) -2025-09-15T14:20:56.383Z | [OTHER] | Attempt 5695: Error rate 50.74% (target: 15%) -2025-09-15T14:20:56.389Z | [OTHER] | Attempt 5696: Error rate 58.87% (target: 15%) -2025-09-15T14:20:56.394Z | [OTHER] | Attempt 5697: Error rate 56.59% (target: 15%) -2025-09-15T14:20:56.399Z | [OTHER] | Attempt 5698: Error rate 51.63% (target: 15%) -2025-09-15T14:20:56.405Z | [OTHER] | Attempt 5699: Error rate 56.06% (target: 15%) -2025-09-15T14:20:56.410Z | [OTHER] | Attempt 5700: Error rate 61.81% (target: 15%) -2025-09-15T14:20:56.415Z | [OTHER] | Attempt 5701: Error rate 50.72% (target: 15%) -2025-09-15T14:20:56.421Z | [OTHER] | Attempt 5702: Error rate 54.17% (target: 15%) -2025-09-15T14:20:56.426Z | [OTHER] | Attempt 5703: Error rate 56.67% (target: 15%) -2025-09-15T14:20:56.432Z | [OTHER] | Attempt 5704: Error rate 52.96% (target: 15%) -2025-09-15T14:20:56.437Z | [OTHER] | Attempt 5705: Error rate 48.55% (target: 15%) -2025-09-15T14:20:56.442Z | [OTHER] | Attempt 5706: Error rate 50.76% (target: 15%) -2025-09-15T14:20:56.448Z | [OTHER] | Attempt 5707: Error rate 58.16% (target: 15%) -2025-09-15T14:20:56.453Z | [OTHER] | Attempt 5708: Error rate 58.33% (target: 15%) -2025-09-15T14:20:56.459Z | [OTHER] | Attempt 5709: Error rate 50% (target: 15%) -2025-09-15T14:20:56.464Z | [OTHER] | Attempt 5710: Error rate 57.64% (target: 15%) -2025-09-15T14:20:56.470Z | [OTHER] | Attempt 5711: Error rate 56.82% (target: 15%) -2025-09-15T14:20:56.475Z | [OTHER] | Attempt 5712: Error rate 46.58% (target: 15%) -2025-09-15T14:20:56.480Z | [OTHER] | Attempt 5713: Error rate 53.33% (target: 15%) -2025-09-15T14:20:56.487Z | [OTHER] | Attempt 5714: Error rate 51.48% (target: 15%) -2025-09-15T14:20:56.492Z | [OTHER] | Attempt 5715: Error rate 54.35% (target: 15%) -2025-09-15T14:20:56.498Z | [OTHER] | Attempt 5716: Error rate 58.7% (target: 15%) -2025-09-15T14:20:56.503Z | [OTHER] | Attempt 5717: Error rate 42.08% (target: 15%) -2025-09-15T14:20:56.509Z | [OTHER] | Attempt 5718: Error rate 52.08% (target: 15%) -2025-09-15T14:20:56.514Z | [OTHER] | Attempt 5719: Error rate 47.01% (target: 15%) -2025-09-15T14:20:56.520Z | [OTHER] | Attempt 5720: Error rate 52.44% (target: 15%) -2025-09-15T14:20:56.525Z | [OTHER] | Attempt 5721: Error rate 53.1% (target: 15%) -2025-09-15T14:20:56.531Z | [OTHER] | Attempt 5722: Error rate 53.57% (target: 15%) -2025-09-15T14:20:56.536Z | [OTHER] | Attempt 5723: Error rate 44.17% (target: 15%) -2025-09-15T14:20:56.541Z | [OTHER] | Using best attempt with error rate: 34.47% -2025-09-15T14:20:56.547Z | [OTHER] | Game created successfully | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, gameCode: 6BDKNI, executionTime: 20055ms" -2025-09-15T14:20:56.553Z | [OTHER] | Game started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","deckCount":3,"totalCards":5,"executionTime":20064} -2025-09-15T14:20:56.558Z | [REQUEST] | Game started successfully | ReqId:jtvdevyrj | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","deckCount":3,"totalCards":5} -2025-09-15T14:20:56.564Z | [REQUEST] | Request completed | ReqId:jtvdevyrj | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | Time:20083ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:20:56.570Z | [OTHER] | Board generation completed for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 in 20032ms. Error rate: 34.47% -2025-09-15T14:24:23.321Z | [REQUEST] | Incoming request | ReqId:ysj3ofthx | IP:::ffff:172.20.0.1 | POST /api/games/join | UA:PostmanRuntime/7.45.0 -2025-09-15T14:24:23.323Z | [REQUEST] | POST /api/games/join | ReqId:ysj3ofthx | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:24:23.332Z | [AUTH] | Optional auth - user authenticated | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":""} -2025-09-15T14:24:23.340Z | [REQUEST] | Join game endpoint accessed | ReqId:ysj3ofthx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"gameCode":"6BDKNI","playerName":"tesztuser","hasAuth":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":null} -2025-09-15T14:24:23.360Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 12ms, gameCode: 6BDKNI, found: true"} -2025-09-15T14:24:23.362Z | [OTHER] | GameService.joinGame called | Meta:{"gameCode":"6BDKNI","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","playerName":"tesztuser","orgId":null,"loginType":0} -2025-09-15T14:24:23.369Z | [OTHER] | Join game input validation passed | Meta:{"gameCode":"6BDKNI","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","loginType":0} -2025-09-15T14:24:23.375Z | [OTHER] | Joining game | Meta:"gameCode: 6BDKNI, playerId: ffa31617-2cf9-403e-ab9d-87eeec85ce58, loginType: 0" -2025-09-15T14:24:23.383Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 2ms, gameCode: 6BDKNI, found: true"} -2025-09-15T14:24:23.387Z | [OTHER] | Game join validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","currentPlayers":0,"maxPlayers":2,"gameState":0,"loginType":0,"playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","isAuthenticated":true} -2025-09-15T14:24:23.394Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:24:23.404Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 1ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:24:23.406Z | [DATABASE] | Game update completed | Meta:{"query":"executionTime: 6ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, updated: true"} -2025-09-15T14:24:23.412Z | [DATABASE] | Player added to game | Meta:{"query":"executionTime: 19ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, playerId: ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:24:23.422Z | [OTHER] | Game data updated in Redis | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","redisKey":"game:9e7ae048-8bc7-4d4b-b3aa-c173465bb003","playerCount":1,"websocketRoom":"game_6BDKNI","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:24:23.424Z | [OTHER] | Player joined game successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","playerCount":1,"maxPlayers":2,"loginType":0,"executionTime":49} -2025-09-15T14:24:23.430Z | [OTHER] | Player joined game successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","playerCount":1,"maxPlayers":2,"executionTime":68} -2025-09-15T14:24:23.436Z | [REQUEST] | Player joined game successfully | ReqId:ysj3ofthx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","gameType":"PUBLIC","playerCount":1,"maxPlayers":2,"playerName":"tesztuser"} -2025-09-15T14:24:23.442Z | [REQUEST] | Request completed | ReqId:ysj3ofthx | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | Time:121ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:25:09.320Z | [REQUEST] | Incoming request | ReqId:j950jni9m | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:25:09.322Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:j950jni9m | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:25:09.331Z | [AUTH] | Authentication successful | ReqId:j950jni9m | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:25:09.336Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:j950jni9m | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:25:09.343Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:25:09.350Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:25:09.357Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T14:25:09.373Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 9ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:25:09.376Z | [ERROR] | Failed to start game play | Meta:{"name":"Error","message":"Game needs at least 2 players to start","stack":"Error: Game needs at least 2 players to start\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:113:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:229:24"} -2025-09-15T14:25:09.381Z | [OTHER] | Game start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":18} -2025-09-15T14:25:09.388Z | [ERROR] | GameService.startGamePlay failed | Meta:{"name":"Error","message":"Game needs at least 2 players to start","stack":"Error: Game needs at least 2 players to start\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:113:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:229:24"} -2025-09-15T14:25:09.395Z | [OTHER] | Game play start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":45,"error":"Game needs at least 2 players to start"} -2025-09-15T14:25:09.401Z | [ERROR] | Start gameplay endpoint error | ReqId:j950jni9m | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Game needs at least 2 players to start","stack":"Error: Game needs at least 2 players to start\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:113:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:229:24"} -2025-09-15T14:25:09.408Z | [REQUEST] | Request completed | ReqId:j950jni9m | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:500 | Time:88ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:16.806Z | [REQUEST] | Incoming request | ReqId:kvyur8w2q | IP:::ffff:172.20.0.1 | GET /api/user/create | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:16.807Z | [REQUEST] | GET /api/user/create | ReqId:kvyur8w2q | IP:::ffff:172.20.0.1 | GET /api/user/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:16.815Z | [REQUEST] | Request completed | ReqId:kvyur8w2q | IP:::ffff:172.20.0.1 | GET /api/user/create | Status:404 | Time:9ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:21.367Z | [REQUEST] | Incoming request | ReqId:cw7l07s05 | IP:::ffff:172.20.0.1 | POST /api/user/create | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:21.369Z | [REQUEST] | POST /api/user/create | ReqId:cw7l07s05 | IP:::ffff:172.20.0.1 | POST /api/user/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:21.376Z | [REQUEST] | Request completed | ReqId:cw7l07s05 | IP:::ffff:172.20.0.1 | POST /api/user/create | Status:404 | Time:9ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:29.379Z | [REQUEST] | Incoming request | ReqId:tmy40e667 | IP:::ffff:172.20.0.1 | POST /api/users/create | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:29.382Z | [REQUEST] | POST /api/users/create | ReqId:tmy40e667 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:29.390Z | [REQUEST] | Create user endpoint accessed | ReqId:tmy40e667 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser","email":"teszt@example.com"} -2025-09-15T14:26:29.560Z | [DATABASE] | User created successfully | Meta:{"executionTime":13,"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","email":"teszt@example.com"} -2025-09-15T14:26:29.566Z | [REQUEST] | User created successfully | ReqId:tmy40e667 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser"} -2025-09-15T14:26:29.568Z | [REQUEST] | Request completed | ReqId:tmy40e667 | IP:::ffff:172.20.0.1 | POST /api/users/create | Status:201 | Time:189ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:29.876Z | [ERROR] | Email sending failed | Meta:{"name":"Error","message":"Missing credentials for \"PLAIN\"","stack":"Error: Missing credentials for \"PLAIN\"\n at SMTPConnection._formatError (/app/node_modules/nodemailer/lib/smtp-connection/index.js:809:19)\n at SMTPConnection.login (/app/node_modules/nodemailer/lib/smtp-connection/index.js:454:38)\n at /app/node_modules/nodemailer/lib/smtp-transport/index.js:272:32\n at SMTPConnection. (/app/node_modules/nodemailer/lib/smtp-connection/index.js:215:17)\n at Object.onceWrapper (node:events:638:28)\n at SMTPConnection.emit (node:events:524:28)\n at SMTPConnection.emit (node:domain:489:12)\n at SMTPConnection._actionEHLO (/app/node_modules/nodemailer/lib/smtp-connection/index.js:1371:14)\n at SMTPConnection._processResponse (/app/node_modules/nodemailer/lib/smtp-connection/index.js:993:20)\n at SMTPConnection._onData (/app/node_modules/nodemailer/lib/smtp-connection/index.js:774:14)"} -2025-09-15T14:26:29.878Z | [WARNING] | Failed to send verification email | Meta:{"email":"teszt@example.com","userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:26:42.825Z | [REQUEST] | Incoming request | ReqId:gwclmpupv | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:42.827Z | [REQUEST] | POST /api/users/login | ReqId:gwclmpupv | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:26:42.835Z | [REQUEST] | Login endpoint accessed | ReqId:gwclmpupv | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:26:42.842Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:26:42.860Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":10,"found":true,"username":"TesztUser"} -2025-09-15T14:26:42.862Z | [DATABASE] | User lookup completed | Meta:{"executionTime":20,"found":true,"searchBy":"username"} -2025-09-15T14:26:42.870Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","userState":0,"stateDescription":"Email not verified"} -2025-09-15T14:26:42.878Z | [REQUEST] | Request completed | ReqId:gwclmpupv | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:53ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:27:31.305Z | [REQUEST] | Incoming request | ReqId:ihg2j8kx5 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:27:31.307Z | [REQUEST] | POST /api/users/login | ReqId:ihg2j8kx5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:27:31.314Z | [REQUEST] | Login endpoint accessed | ReqId:ihg2j8kx5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:27:31.320Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:27:31.336Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":10,"found":true,"username":"TesztUser"} -2025-09-15T14:27:31.338Z | [DATABASE] | User lookup completed | Meta:{"executionTime":18,"found":true,"searchBy":"username"} -2025-09-15T14:27:31.346Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","userState":0,"stateDescription":"Email not verified"} -2025-09-15T14:27:31.352Z | [REQUEST] | Request completed | ReqId:ihg2j8kx5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:47ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-30-59-513Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-30-59-513Z.log deleted file mode 100644 index 9e0a2fb6..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-30-59-513Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:30:59.513Z -# Max entries per file: 10000 - -2025-09-15T14:31:01.570Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:31:01.584Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:31:01.584Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:31:02.522Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:31:02.528Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:31:02.530Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:31:02.532Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-31-29-169Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-31-29-169Z.log deleted file mode 100644 index 58fd2b66..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-31-29-169Z.log +++ /dev/null @@ -1,19 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:31:29.169Z -# Max entries per file: 10000 - -2025-09-15T14:31:30.954Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:31:30.969Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:31:30.969Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:31:31.757Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:31:31.761Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:31:31.763Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:31:31.765Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:31:34.808Z | [REQUEST] | Incoming request | ReqId:nplvxzsxj | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:31:34.810Z | [REQUEST] | POST /api/users/login | ReqId:nplvxzsxj | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:31:34.812Z | [REQUEST] | Login endpoint accessed | ReqId:nplvxzsxj | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:31:34.814Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:31:34.825Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":9,"found":true,"username":"TesztUser"} -2025-09-15T14:31:34.827Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-09-15T14:31:34.828Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","userState":0,"stateDescription":"Email not verified"} -2025-09-15T14:31:34.834Z | [ERROR] | Login endpoint error | ReqId:nplvxzsxj | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Login failed: null","stack":"Error: Login failed: null\n at /app/src/Api/routers/userRouter.ts:35:10\n at processTicksAndRejections (node:internal/process/task_queues:95:5)"} -2025-09-15T14:31:34.837Z | [REQUEST] | Request completed | ReqId:nplvxzsxj | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:500 | Time:29ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-33-42-527Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-33-42-527Z.log deleted file mode 100644 index c6719c99..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-33-42-527Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:33:42.527Z -# Max entries per file: 10000 - -2025-09-15T14:33:44.303Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:33:44.317Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:33:44.317Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:33:45.193Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:33:45.197Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:33:45.199Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:33:45.201Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-34-01-960Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-34-01-960Z.log deleted file mode 100644 index a6018d63..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-34-01-960Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:34:01.960Z -# Max entries per file: 10000 - -2025-09-15T14:34:03.872Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:34:03.886Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:34:03.886Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:34:04.808Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:34:04.812Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:34:04.814Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:34:04.816Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-35-09-998Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-35-09-998Z.log deleted file mode 100644 index 42d350e8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-35-09-998Z.log +++ /dev/null @@ -1,21 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:35:09.998Z -# Max entries per file: 10000 - -2025-09-15T14:35:11.708Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:35:11.722Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:35:11.722Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:35:12.519Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:35:12.525Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:35:12.526Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:35:12.529Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:35:38.401Z | [REQUEST] | Incoming request | ReqId:ateyog4vw | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:35:38.404Z | [REQUEST] | POST /api/users/login | ReqId:ateyog4vw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:35:38.406Z | [REQUEST] | Login endpoint accessed | ReqId:ateyog4vw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:35:38.408Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:35:38.425Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":16,"found":true,"username":"TesztUser"} -2025-09-15T14:35:38.427Z | [DATABASE] | User lookup completed | Meta:{"executionTime":19,"found":true,"searchBy":"username"} -2025-09-15T14:35:38.428Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","userState":0,"stateDescription":"Email not verified"} -2025-09-15T14:35:38.435Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"User account not verified","stack":"Error: User account not verified\n at LoginCommandHandler.execute (/app/src/Application/User/commands/LoginCommandHandler.ts:76:15)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:29:18"} -2025-09-15T14:35:38.437Z | [DATABASE] | Unexpected database error during login | Meta:{"executionTime":29} -2025-09-15T14:35:38.439Z | [ERROR] | Login endpoint error | ReqId:ateyog4vw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Database connection error","stack":"Error: Database connection error\n at LoginCommandHandler.execute (/app/src/Application/User/commands/LoginCommandHandler.ts:189:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:29:18"} -2025-09-15T14:35:38.442Z | [REQUEST] | Request completed | ReqId:ateyog4vw | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:500 | Time:41ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-37-03-360Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-37-03-360Z.log deleted file mode 100644 index 67f74be7..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-37-03-360Z.log +++ /dev/null @@ -1,21 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:37:03.360Z -# Max entries per file: 10000 - -2025-09-15T14:37:05.167Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:37:05.180Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:37:05.180Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:37:06.036Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:37:06.041Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:37:06.043Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:37:06.045Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:37:07.040Z | [REQUEST] | Incoming request | ReqId:7v1156kp7 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:37:07.042Z | [REQUEST] | POST /api/users/login | ReqId:7v1156kp7 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:37:07.044Z | [REQUEST] | Login endpoint accessed | ReqId:7v1156kp7 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:37:07.046Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:37:07.057Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":9,"found":true,"username":"TesztUser"} -2025-09-15T14:37:07.059Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-09-15T14:37:07.061Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","userState":0,"stateDescription":"Email not verified"} -2025-09-15T14:37:07.067Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"User account not verified","stack":"Error: User account not verified\n at LoginCommandHandler.execute (/app/src/Application/User/commands/LoginCommandHandler.ts:76:15)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:29:18"} -2025-09-15T14:37:07.068Z | [DATABASE] | Unexpected database error during login | Meta:{"executionTime":22} -2025-09-15T14:37:07.070Z | [ERROR] | Login endpoint error | ReqId:7v1156kp7 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Database connection error","stack":"Error: Database connection error\n at LoginCommandHandler.execute (/app/src/Application/User/commands/LoginCommandHandler.ts:189:13)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:29:18"} -2025-09-15T14:37:07.073Z | [REQUEST] | Request completed | ReqId:7v1156kp7 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:500 | Time:33ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-38-21-111Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-38-21-111Z.log deleted file mode 100644 index f6c01be2..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-38-21-111Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:38:21.111Z -# Max entries per file: 10000 - -2025-09-15T14:38:23.075Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:38:23.091Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:38:23.091Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:38:24.053Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:38:24.058Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:38:24.059Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:38:24.061Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-38-54-177Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-38-54-177Z.log deleted file mode 100644 index 4a1fd385..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-38-54-177Z.log +++ /dev/null @@ -1,36 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:38:54.177Z -# Max entries per file: 10000 - -2025-09-15T14:38:55.824Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:38:55.837Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:38:55.837Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:38:56.709Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:38:56.714Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:38:56.715Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:38:56.717Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:38:58.509Z | [REQUEST] | Incoming request | ReqId:o9gh2wl32 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:38:58.512Z | [REQUEST] | POST /api/users/login | ReqId:o9gh2wl32 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:38:58.514Z | [REQUEST] | Login endpoint accessed | ReqId:o9gh2wl32 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:38:58.516Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:38:58.527Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":9,"found":true,"username":"TesztUser"} -2025-09-15T14:38:58.528Z | [DATABASE] | User lookup completed | Meta:{"executionTime":12,"found":true,"searchBy":"username"} -2025-09-15T14:38:58.529Z | [AUTH] | Login failed - Account state restriction | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser","userState":0,"stateDescription":"Email not verified"} -2025-09-15T14:38:58.535Z | [ERROR] | Login handler error | Meta:{"name":"Error","message":"User account not verified","stack":"Error: User account not verified\n at LoginCommandHandler.execute (/app/src/Application/User/commands/LoginCommandHandler.ts:76:15)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:29:18"} -2025-09-15T14:38:58.536Z | [ERROR] | Login endpoint error | ReqId:o9gh2wl32 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"User account not verified","stack":"Error: User account not verified\n at LoginCommandHandler.execute (/app/src/Application/User/commands/LoginCommandHandler.ts:76:15)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async /app/src/Api/routers/userRouter.ts:29:18"} -2025-09-15T14:38:58.538Z | [REQUEST] | Request completed | ReqId:o9gh2wl32 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:401 | Time:29ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:39:16.183Z | [REQUEST] | Incoming request | ReqId:sqysthqmt | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:39:16.185Z | [REQUEST] | POST /api/users/login | ReqId:sqysthqmt | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:39:16.187Z | [REQUEST] | Login endpoint accessed | ReqId:sqysthqmt | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztUser"} -2025-09-15T14:39:16.189Z | [AUTH] | Login attempt | Meta:{"username":"TesztUser"} -2025-09-15T14:39:16.203Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztUser })","executionTime":13,"found":true,"username":"TesztUser"} -2025-09-15T14:39:16.205Z | [DATABASE] | User lookup completed | Meta:{"executionTime":16,"found":true,"searchBy":"username"} -2025-09-15T14:39:16.363Z | [AUTH] | Password verification completed | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","valid":true,"verificationTime":157} -2025-09-15T14:39:16.370Z | [AUTH] | Login successful | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","authLevel":0,"userStatus":1,"orgId":"","requiresOrgReauth":false,"totalLoginTime":181} -2025-09-15T14:39:16.372Z | [AUTH] | User login successful | ReqId:sqysthqmt | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser"} -2025-09-15T14:39:16.374Z | [REQUEST] | Request completed | ReqId:sqysthqmt | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:191ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:40:01.536Z | [REQUEST] | Incoming request | ReqId:37oddpar8 | IP:::ffff:172.20.0.1 | POST /api/games/join | UA:PostmanRuntime/7.45.0 -2025-09-15T14:40:01.537Z | [REQUEST] | POST /api/games/join | ReqId:37oddpar8 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:40:01.542Z | [AUTH] | Optional auth - user authenticated | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","authLevel":0,"userStatus":1,"orgId":""} -2025-09-15T14:40:01.544Z | [REQUEST] | Join game endpoint accessed | ReqId:37oddpar8 | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"gameCode":"6BDKNI","hasAuth":true,"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","orgId":null} -2025-09-15T14:40:01.558Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 13ms, gameCode: 6BDKNI, found: true"} -2025-09-15T14:40:01.560Z | [REQUEST] | Request completed | ReqId:37oddpar8 | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:400 | Time:25ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-41-57-666Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-41-57-666Z.log deleted file mode 100644 index 2f032a27..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-41-57-666Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:41:57.666Z -# Max entries per file: 10000 - -2025-09-15T14:41:59.550Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:41:59.564Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:41:59.564Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:42:00.470Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:42:00.475Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:42:00.477Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:42:00.479Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-42-52-921Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-42-52-921Z.log deleted file mode 100644 index 249b8dc3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-42-52-921Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:42:52.921Z -# Max entries per file: 10000 - -2025-09-15T14:42:54.879Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:42:54.893Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:42:54.893Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:42:55.786Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:42:55.791Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:42:55.792Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:42:55.794Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-44-41-360Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-44-41-360Z.log deleted file mode 100644 index 604b4b49..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-44-41-360Z.log +++ /dev/null @@ -1,90 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:44:41.360Z -# Max entries per file: 10000 - -2025-09-15T14:44:43.137Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:44:43.150Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:44:43.150Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:44:44.056Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:44:44.060Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:44:44.062Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:44:44.064Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:44:46.624Z | [ERROR] | Unhandled error: Expected ',' or '}' after property value in JSON at position 37 | ReqId:ho56dnkn1 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"stack":"SyntaxError: Expected ',' or '}' after property value in JSON at position 37\n at JSON.parse ()\n at parse (/app/node_modules/body-parser/lib/types/json.js:77:19)\n at /app/node_modules/body-parser/lib/read.js:123:18\n at AsyncResource.runInAsyncScope (node:async_hooks:206:9)\n at invokeCallback (/app/node_modules/raw-body/index.js:238:16)\n at done (/app/node_modules/raw-body/index.js:227:7)\n at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7)\n at IncomingMessage.emit (node:events:524:28)\n at IncomingMessage.emit (node:domain:489:12)\n at endReadableNT (node:internal/streams/readable:1698:12)","name":"SyntaxError"} -2025-09-15T14:44:46.628Z | [ERROR] | Global error handler caught unhandled error | ReqId:tw8k68yoe | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"SyntaxError","message":"Expected ',' or '}' after property value in JSON at position 37","stack":"SyntaxError: Expected ',' or '}' after property value in JSON at position 37\n at JSON.parse ()\n at parse (/app/node_modules/body-parser/lib/types/json.js:77:19)\n at /app/node_modules/body-parser/lib/read.js:123:18\n at AsyncResource.runInAsyncScope (node:async_hooks:206:9)\n at invokeCallback (/app/node_modules/raw-body/index.js:238:16)\n at done (/app/node_modules/raw-body/index.js:227:7)\n at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7)\n at IncomingMessage.emit (node:events:524:28)\n at IncomingMessage.emit (node:domain:489:12)\n at endReadableNT (node:internal/streams/readable:1698:12)"} -2025-09-15T14:44:49.955Z | [REQUEST] | Incoming request | ReqId:qloq3deev | IP:::ffff:172.20.0.1 | POST /api/games/join | UA:PostmanRuntime/7.45.0 -2025-09-15T14:44:49.957Z | [REQUEST] | POST /api/games/join | ReqId:qloq3deev | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:44:49.961Z | [AUTH] | Optional auth - user authenticated | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","authLevel":0,"userStatus":1,"orgId":""} -2025-09-15T14:44:49.964Z | [REQUEST] | Join game endpoint accessed | ReqId:qloq3deev | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"gameCode":"6BDKNI","hasAuth":true,"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","orgId":null} -2025-09-15T14:44:49.974Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 9ms, gameCode: 6BDKNI, found: true"} -2025-09-15T14:44:49.978Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: 0c7bfa37-77c9-4c73-a7f7-ca4199055456 })","executionTime":2,"found":true,"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:44:49.980Z | [REQUEST] | Using logged-in user's username as playerName | ReqId:qloq3deev | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser"} -2025-09-15T14:44:49.982Z | [OTHER] | GameService.joinGame called | Meta:{"gameCode":"6BDKNI","playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","playerName":"TesztUser","orgId":null,"loginType":0} -2025-09-15T14:44:49.984Z | [OTHER] | Join game input validation passed | Meta:{"gameCode":"6BDKNI","playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","loginType":0} -2025-09-15T14:44:49.985Z | [OTHER] | Joining game | Meta:"gameCode: 6BDKNI, playerId: 0c7bfa37-77c9-4c73-a7f7-ca4199055456, loginType: 0" -2025-09-15T14:44:49.989Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 2ms, gameCode: 6BDKNI, found: true"} -2025-09-15T14:44:49.990Z | [OTHER] | Game join validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","currentPlayers":1,"maxPlayers":2,"gameState":0,"loginType":0,"playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","isAuthenticated":true} -2025-09-15T14:44:49.994Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:44:50.002Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:44:50.004Z | [DATABASE] | Game update completed | Meta:{"query":"executionTime: 8ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, updated: true"} -2025-09-15T14:44:50.005Z | [DATABASE] | Player added to game | Meta:{"query":"executionTime: 13ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, playerId: 0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:44:50.010Z | [OTHER] | Game data updated in Redis | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","redisKey":"game:9e7ae048-8bc7-4d4b-b3aa-c173465bb003","playerCount":2,"websocketRoom":"game_6BDKNI","playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:44:50.011Z | [OTHER] | Player joined game successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","playerCount":2,"maxPlayers":2,"loginType":0,"executionTime":26} -2025-09-15T14:44:50.013Z | [OTHER] | Player joined game successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","playerCount":2,"maxPlayers":2,"executionTime":31} -2025-09-15T14:44:50.014Z | [REQUEST] | Player joined game successfully | ReqId:qloq3deev | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","gameType":"PUBLIC","playerCount":2,"maxPlayers":2,"playerName":"TesztUser"} -2025-09-15T14:44:50.016Z | [REQUEST] | Request completed | ReqId:qloq3deev | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | Time:61ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:44:56.123Z | [REQUEST] | Incoming request | ReqId:6ddm54o5r | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:44:56.125Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:6ddm54o5r | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:44:56.128Z | [AUTH] | Authentication successful | ReqId:6ddm54o5r | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","authLevel":0,"orgId":""} -2025-09-15T14:44:56.130Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:6ddm54o5r | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:44:56.132Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:44:56.133Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:44:56.135Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: 0c7bfa37-77c9-4c73-a7f7-ca4199055456" -2025-09-15T14:44:56.138Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:44:56.145Z | [ERROR] | Failed to start game play | Meta:{"name":"Error","message":"Only the game master can start this game","stack":"Error: Only the game master can start this game\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:118:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:44:56.147Z | [OTHER] | Game start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","executionTime":5} -2025-09-15T14:44:56.149Z | [ERROR] | GameService.startGamePlay failed | Meta:{"name":"Error","message":"Only the game master can start this game","stack":"Error: Only the game master can start this game\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:118:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:44:56.150Z | [OTHER] | Game play start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","executionTime":17,"error":"Only the game master can start this game"} -2025-09-15T14:44:56.152Z | [ERROR] | Start gameplay endpoint error | ReqId:6ddm54o5r | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Only the game master can start this game","stack":"Error: Only the game master can start this game\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:118:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:44:56.154Z | [REQUEST] | Request completed | ReqId:6ddm54o5r | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:403 | Time:31ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:45:23.860Z | [REQUEST] | Incoming request | ReqId:lbq1eq3ta | IP:::ffff:172.20.0.1 | POST /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T14:45:23.862Z | [REQUEST] | POST /api/users/profile | ReqId:lbq1eq3ta | IP:::ffff:172.20.0.1 | POST /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:45:23.864Z | [REQUEST] | Request completed | ReqId:lbq1eq3ta | IP:::ffff:172.20.0.1 | POST /api/users/profile | Status:404 | Time:4ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:45:28.010Z | [REQUEST] | Incoming request | ReqId:bftwrokt9 | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 -2025-09-15T14:45:28.012Z | [REQUEST] | GET /api/users/profile | ReqId:bftwrokt9 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:45:28.016Z | [AUTH] | Authentication successful | ReqId:bftwrokt9 | IP:::ffff:172.20.0.1 | GET /api/users/profile | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","authLevel":0,"orgId":""} -2025-09-15T14:45:28.018Z | [REQUEST] | Get user profile endpoint accessed | ReqId:bftwrokt9 | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:45:28.035Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: 0c7bfa37-77c9-4c73-a7f7-ca4199055456 })","executionTime":15,"found":true,"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456"} -2025-09-15T14:45:28.037Z | [REQUEST] | User profile retrieved successfully | ReqId:bftwrokt9 | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","username":"TesztUser"} -2025-09-15T14:45:28.039Z | [REQUEST] | Request completed | ReqId:bftwrokt9 | UserId:0c7bfa37-77c9-4c73-a7f7-ca4199055456 | IP:::ffff:172.20.0.1 | GET /api/users/profile | Status:200 | Time:29ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:04.502Z | [REQUEST] | Incoming request | ReqId:1ylgy91h5 | IP:::ffff:172.20.0.1 | GET /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:04.504Z | [REQUEST] | GET /api/users/login | ReqId:1ylgy91h5 | IP:::ffff:172.20.0.1 | GET /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:04.506Z | [REQUEST] | Request completed | ReqId:1ylgy91h5 | IP:::ffff:172.20.0.1 | GET /api/users/login | Status:404 | Time:4ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:08.138Z | [REQUEST] | Incoming request | ReqId:l6py1qnm5 | IP:::ffff:172.20.0.1 | POST /api/users/login | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:08.140Z | [REQUEST] | POST /api/users/login | ReqId:l6py1qnm5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:08.142Z | [REQUEST] | Login endpoint accessed | ReqId:l6py1qnm5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"username":"TesztAdmin"} -2025-09-15T14:46:08.144Z | [AUTH] | Login attempt | Meta:{"username":"TesztAdmin"} -2025-09-15T14:46:08.155Z | [DATABASE] | User findByUsername query completed | Meta:{"query":"findOneBy({ username: TesztAdmin })","executionTime":9,"found":true,"username":"TesztAdmin"} -2025-09-15T14:46:08.157Z | [DATABASE] | User lookup completed | Meta:{"executionTime":13,"found":true,"searchBy":"username"} -2025-09-15T14:46:08.307Z | [AUTH] | Password verification completed | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","valid":true,"verificationTime":148} -2025-09-15T14:46:08.311Z | [AUTH] | Login successful | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":"","requiresOrgReauth":false,"totalLoginTime":167} -2025-09-15T14:46:08.313Z | [AUTH] | User login successful | ReqId:l6py1qnm5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztAdmin"} -2025-09-15T14:46:08.315Z | [REQUEST] | Request completed | ReqId:l6py1qnm5 | IP:::ffff:172.20.0.1 | POST /api/users/login | Status:200 | Time:177ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:15.371Z | [REQUEST] | Incoming request | ReqId:jgvbhtgsa | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:15.373Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:jgvbhtgsa | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:46:15.377Z | [AUTH] | Authentication successful | ReqId:jgvbhtgsa | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:46:15.379Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:jgvbhtgsa | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:46:15.380Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:46:15.382Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:46:15.383Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T14:46:15.388Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 3ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:46:15.390Z | [OTHER] | Game start validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"gameState":0,"isGameMaster":true} -2025-09-15T14:46:15.391Z | [OTHER] | Waiting for board generation for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"maxWaitTime":20,"pollInterval":500} -2025-09-15T14:46:15.394Z | [OTHER] | Board generation completed for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"errorRate":34.47,"fieldCount":100,"borderLength":100,"waitTime":3} -2025-09-15T14:46:15.400Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:46:15.402Z | [DATABASE] | Game update completed | Meta:{"query":"executionTime: 7ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, updated: true"} -2025-09-15T14:46:15.404Z | [OTHER] | Player positions initialized | Meta:{"playerCount":2,"turnOrders":[1,2],"playersData":[{"playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","position":0,"turnOrder":1},{"playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","position":0,"turnOrder":2}]} -2025-09-15T14:46:15.407Z | [OTHER] | Game play initialized in Redis | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"turnSequence":["ffa31617-2cf9-403e-ab9d-87eeec85ce58","0c7bfa37-77c9-4c73-a7f7-ca4199055456"],"currentPlayer":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","redisKey":"gameplay:9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:46:15.409Z | [OTHER] | Game start notifications prepared | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"websocketRoom":"game_6BDKNI"} -2025-09-15T14:46:15.410Z | [OTHER] | Game play started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"executionTime":27} -2025-09-15T14:46:15.412Z | [OTHER] | Game play started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"gameState":1,"executionTime":31} -2025-09-15T14:46:15.413Z | [REQUEST] | Game gameplay started successfully | ReqId:jgvbhtgsa | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","playerCount":2} -2025-09-15T14:46:15.415Z | [REQUEST] | Request completed | ReqId:jgvbhtgsa | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | Time:44ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-51-18-355Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-51-18-355Z.log deleted file mode 100644 index 2f9d1005..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-51-18-355Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:51:18.355Z -# Max entries per file: 10000 - -2025-09-15T14:51:20.163Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:51:20.176Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:51:20.176Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:51:21.045Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:51:21.049Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:51:21.051Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:51:21.053Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-51-49-176Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-51-49-176Z.log deleted file mode 100644 index 1261f567..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-51-49-176Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:51:49.176Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-52-08-246Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-52-08-246Z.log deleted file mode 100644 index deece16e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-52-08-246Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:52:08.246Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-52-30-120Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-52-30-120Z.log deleted file mode 100644 index 1edaa400..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-52-30-120Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:52:30.120Z -# Max entries per file: 10000 - -2025-09-15T14:52:32.060Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:52:32.074Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:52:32.074Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:52:32.950Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:52:32.954Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:52:32.956Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:52:32.958Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-54-17-346Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-54-17-346Z.log deleted file mode 100644 index fc1f6602..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-54-17-346Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:54:17.346Z -# Max entries per file: 10000 - -2025-09-15T14:54:19.336Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:54:19.353Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:54:19.353Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:54:20.329Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:54:20.334Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:54:20.335Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:54:20.337Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-54-38-736Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-54-38-736Z.log deleted file mode 100644 index eb8e5b6b..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-54-38-736Z.log +++ /dev/null @@ -1,60 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:54:38.736Z -# Max entries per file: 10000 - -2025-09-15T14:54:40.403Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:54:40.417Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:54:40.417Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:54:41.229Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:54:41.233Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:54:41.234Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:54:41.235Z | [STARTUP] | Redis client connected successfully -2025-09-15T14:54:44.323Z | [REQUEST] | Incoming request | ReqId:r0wu4jdjh | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:54:44.325Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:r0wu4jdjh | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:54:44.330Z | [AUTH] | Authentication successful | ReqId:r0wu4jdjh | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:54:44.331Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:r0wu4jdjh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:54:44.333Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:54:44.334Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:54:44.336Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T14:54:44.345Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 8ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:54:44.352Z | [ERROR] | Failed to start game play | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:103:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:54:44.354Z | [OTHER] | Game start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":11} -2025-09-15T14:54:44.355Z | [ERROR] | GameService.startGamePlay failed | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:103:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:54:44.357Z | [OTHER] | Game play start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":23,"error":"Game is not in waiting state and cannot be started"} -2025-09-15T14:54:44.358Z | [ERROR] | Start gameplay endpoint error | ReqId:r0wu4jdjh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:103:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:54:44.361Z | [REQUEST] | Request completed | ReqId:r0wu4jdjh | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:500 | Time:38ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:55:21.586Z | [REQUEST] | Incoming request | ReqId:2fgicgl4c | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:55:21.588Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:2fgicgl4c | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:55:21.593Z | [AUTH] | Authentication successful | ReqId:2fgicgl4c | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:55:21.596Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:2fgicgl4c | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:55:21.598Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:55:21.599Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:55:21.601Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T14:55:21.615Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 12ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:55:21.617Z | [ERROR] | Failed to start game play | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:103:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:55:21.619Z | [OTHER] | Game start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":16} -2025-09-15T14:55:21.621Z | [ERROR] | GameService.startGamePlay failed | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:103:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:55:21.622Z | [OTHER] | Game play start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":23,"error":"Game is not in waiting state and cannot be started"} -2025-09-15T14:55:21.623Z | [ERROR] | Start gameplay endpoint error | ReqId:2fgicgl4c | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:103:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:56:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:26)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T14:55:21.625Z | [REQUEST] | Request completed | ReqId:2fgicgl4c | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:500 | Time:39ms | UA:PostmanRuntime/7.45.0 -2025-09-15T14:55:55.741Z | [REQUEST] | Incoming request | ReqId:n01v9yqwa | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T14:55:55.743Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:n01v9yqwa | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T14:55:55.746Z | [AUTH] | Authentication successful | ReqId:n01v9yqwa | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T14:55:55.748Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:n01v9yqwa | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:55:55.750Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T14:55:55.751Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:55:55.753Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T14:55:55.766Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 12ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:55:55.767Z | [OTHER] | Game start validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"gameState":0,"isGameMaster":true} -2025-09-15T14:55:55.769Z | [OTHER] | Waiting for board generation for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"maxWaitTime":20,"pollInterval":500,"redisKey":"game_board_9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:55:55.771Z | [OTHER] | Board generation check for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"attempt":1,"hasData":true,"dataLength":5526,"waitTime":2} -2025-09-15T14:55:55.772Z | [OTHER] | Board data found for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"generationComplete":true,"hasError":false,"fieldsCount":100,"borderLength":100,"totalErrorRate":34.47} -2025-09-15T14:55:55.774Z | [OTHER] | Board generation completed for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"errorRate":34.47,"fieldCount":100,"borderLength":100,"waitTime":5} -2025-09-15T14:55:55.781Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 1ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T14:55:55.782Z | [DATABASE] | Game update completed | Meta:{"query":"executionTime: 7ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, updated: true"} -2025-09-15T14:55:55.784Z | [OTHER] | Player positions initialized | Meta:{"playerCount":2,"turnOrders":[2,1],"playersData":[{"playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","position":0,"turnOrder":2},{"playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","position":0,"turnOrder":1}]} -2025-09-15T14:55:55.787Z | [OTHER] | Game play initialized in Redis | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"turnSequence":["0c7bfa37-77c9-4c73-a7f7-ca4199055456","ffa31617-2cf9-403e-ab9d-87eeec85ce58"],"currentPlayer":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","redisKey":"gameplay:9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T14:55:55.788Z | [OTHER] | Game start notifications prepared | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"websocketRoom":"game_6BDKNI"} -2025-09-15T14:55:55.790Z | [OTHER] | Game play started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"executionTime":37} -2025-09-15T14:55:55.791Z | [OTHER] | Game play started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"gameState":1,"executionTime":41} -2025-09-15T14:55:55.793Z | [REQUEST] | Game gameplay started successfully | ReqId:n01v9yqwa | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","playerCount":2} -2025-09-15T14:55:55.794Z | [REQUEST] | Request completed | ReqId:n01v9yqwa | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | Time:53ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-58-47-659Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-58-47-659Z.log deleted file mode 100644 index b7d3dc6c..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-58-47-659Z.log +++ /dev/null @@ -1,4 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:58:47.659Z -# Max entries per file: 10000 - diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-59-18-251Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-59-18-251Z.log deleted file mode 100644 index d45b779e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-59-18-251Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:59:18.251Z -# Max entries per file: 10000 - -2025-09-15T14:59:20.126Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:59:20.140Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:59:20.140Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:59:21.083Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:59:21.087Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:59:21.089Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:59:21.091Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-59-39-010Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-59-39-010Z.log deleted file mode 100644 index 3da1a1a3..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T14-59-39-010Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T14:59:39.010Z -# Max entries per file: 10000 - -2025-09-15T14:59:40.830Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T14:59:40.846Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T14:59:40.846Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T14:59:41.770Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T14:59:41.775Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T14:59:41.777Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T14:59:41.779Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-02-49-386Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-02-49-386Z.log deleted file mode 100644 index 06bcf658..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-02-49-386Z.log +++ /dev/null @@ -1,24 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:02:49.386Z -# Max entries per file: 10000 - -2025-09-15T15:02:51.122Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:02:51.135Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:02:51.135Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:02:52.038Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:02:52.042Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:02:52.044Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:02:52.046Z | [STARTUP] | Redis client connected successfully -2025-09-15T15:02:55.984Z | [REQUEST] | Incoming request | ReqId:teg470jjc | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T15:02:55.986Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:teg470jjc | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T15:02:55.992Z | [AUTH] | Authentication successful | ReqId:teg470jjc | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T15:02:55.994Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:teg470jjc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:02:55.996Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T15:02:55.998Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:02:55.999Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T15:02:56.010Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 9ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T15:02:56.017Z | [ERROR] | Failed to start game play | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:111:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:61:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:28)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T15:02:56.019Z | [OTHER] | Game start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":12} -2025-09-15T15:02:56.021Z | [ERROR] | GameService.startGamePlay failed | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:111:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:61:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:28)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T15:02:56.023Z | [OTHER] | Game play start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":25,"error":"Game is not in waiting state and cannot be started"} -2025-09-15T15:02:56.024Z | [ERROR] | Start gameplay endpoint error | ReqId:teg470jjc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:111:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:61:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:28)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T15:02:56.028Z | [REQUEST] | Request completed | ReqId:teg470jjc | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:500 | Time:44ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-04-26-653Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-04-26-653Z.log deleted file mode 100644 index a21af985..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-04-26-653Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:04:26.653Z -# Max entries per file: 10000 - -2025-09-15T15:04:28.468Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:04:28.481Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:04:28.481Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:04:29.323Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:04:29.328Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:04:29.330Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:04:29.332Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-04-39-136Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-04-39-136Z.log deleted file mode 100644 index c54f7226..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-04-39-136Z.log +++ /dev/null @@ -1,46 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:04:39.136Z -# Max entries per file: 10000 - -2025-09-15T15:04:40.787Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:04:40.803Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:04:40.803Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:04:41.619Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:04:41.623Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:04:41.624Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:04:41.626Z | [STARTUP] | Redis client connected successfully -2025-09-15T15:04:46.727Z | [REQUEST] | Incoming request | ReqId:yvyeo0ik4 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T15:04:46.730Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:yvyeo0ik4 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T15:04:46.738Z | [AUTH] | Authentication successful | ReqId:yvyeo0ik4 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T15:04:46.740Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:yvyeo0ik4 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:04:46.742Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T15:04:46.743Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:04:46.745Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T15:04:46.754Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 8ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T15:04:46.762Z | [ERROR] | Failed to start game play | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:111:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:61:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:28)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T15:04:46.764Z | [OTHER] | Game start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":11} -2025-09-15T15:04:46.765Z | [ERROR] | GameService.startGamePlay failed | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:111:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:61:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:28)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T15:04:46.767Z | [OTHER] | Game play start failed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","executionTime":24,"error":"Game is not in waiting state and cannot be started"} -2025-09-15T15:04:46.769Z | [ERROR] | Start gameplay endpoint error | ReqId:yvyeo0ik4 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"name":"Error","message":"Game is not in waiting state and cannot be started","stack":"Error: Game is not in waiting state and cannot be started\n at StartGamePlayCommandHandler.validateGameCanStart (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:111:19)\n at StartGamePlayCommandHandler.handle (/app/src/Application/Game/commands/StartGamePlayCommandHandler.ts:61:18)\n at processTicksAndRejections (node:internal/process/task_queues:95:5)\n at async GameService.startGamePlay (/app/src/Application/Game/GameService.ts:177:28)\n at async /app/src/Api/routers/gameRouter.ts:256:24"} -2025-09-15T15:04:46.771Z | [REQUEST] | Request completed | ReqId:yvyeo0ik4 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:409 | Time:44ms | UA:PostmanRuntime/7.45.0 -2025-09-15T15:05:14.722Z | [REQUEST] | Incoming request | ReqId:f3765wwty | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 -2025-09-15T15:05:14.724Z | [REQUEST] | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | ReqId:f3765wwty | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T15:05:14.727Z | [AUTH] | Authentication successful | ReqId:f3765wwty | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T15:05:14.729Z | [REQUEST] | Start gameplay endpoint accessed | ReqId:f3765wwty | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:05:14.730Z | [OTHER] | GameService.startGamePlay called | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T15:05:14.732Z | [OTHER] | Start game play input validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:05:14.734Z | [OTHER] | Starting game play | Meta:"gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, userId: ffa31617-2cf9-403e-ab9d-87eeec85ce58" -2025-09-15T15:05:14.748Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 13ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T15:05:14.749Z | [OTHER] | Game start validation passed | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"gameState":0,"isGameMaster":true} -2025-09-15T15:05:14.751Z | [OTHER] | Waiting for board generation for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"maxWaitTime":20,"pollInterval":500,"redisKey":"game_board_9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:05:14.754Z | [OTHER] | Board generation check for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"attempt":1,"hasData":true,"dataLength":5526,"waitTime":3} -2025-09-15T15:05:14.756Z | [OTHER] | Board data found for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"generationComplete":true,"hasError":false,"fieldsCount":100,"borderLength":100,"totalErrorRate":34.47} -2025-09-15T15:05:14.757Z | [OTHER] | Board generation completed for game 9e7ae048-8bc7-4d4b-b3aa-c173465bb003 | Meta:{"errorRate":34.47,"fieldCount":100,"borderLength":100,"waitTime":6} -2025-09-15T15:05:14.766Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, found: true"} -2025-09-15T15:05:14.768Z | [DATABASE] | Game update completed | Meta:{"query":"executionTime: 9ms, gameId: 9e7ae048-8bc7-4d4b-b3aa-c173465bb003, updated: true"} -2025-09-15T15:05:14.770Z | [OTHER] | Player positions initialized | Meta:{"playerCount":2,"turnOrders":[2,1],"playersData":[{"playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","position":0,"turnOrder":2},{"playerId":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","position":0,"turnOrder":1}]} -2025-09-15T15:05:14.773Z | [OTHER] | Game play initialized in Redis | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"turnSequence":["0c7bfa37-77c9-4c73-a7f7-ca4199055456","ffa31617-2cf9-403e-ab9d-87eeec85ce58"],"currentPlayer":"0c7bfa37-77c9-4c73-a7f7-ca4199055456","redisKey":"gameplay:9e7ae048-8bc7-4d4b-b3aa-c173465bb003"} -2025-09-15T15:05:14.775Z | [OTHER] | Game start notifications prepared | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"websocketRoom":"game_6BDKNI"} -2025-09-15T15:05:14.776Z | [OTHER] | Game play started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"executionTime":43} -2025-09-15T15:05:14.778Z | [OTHER] | Game play started successfully | Meta:{"gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","gameCode":"6BDKNI","playerCount":2,"gameState":1,"executionTime":47} -2025-09-15T15:05:14.779Z | [REQUEST] | Game gameplay started successfully | ReqId:f3765wwty | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"9e7ae048-8bc7-4d4b-b3aa-c173465bb003","playerCount":2} -2025-09-15T15:05:14.781Z | [REQUEST] | Request completed | ReqId:f3765wwty | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/9e7ae048-8bc7-4d4b-b3aa-c173465bb003/start | Status:200 | Time:59ms | UA:PostmanRuntime/7.45.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-06-33-437Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-06-33-437Z.log deleted file mode 100644 index 6aedb70e..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-06-33-437Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:06:33.437Z -# Max entries per file: 10000 - -2025-09-15T15:06:35.332Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:06:35.347Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:06:35.347Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:06:36.253Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:06:36.258Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:06:36.260Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:06:36.263Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-10-03-401Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-10-03-401Z.log deleted file mode 100644 index 3d34ab81..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-10-03-401Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:10:03.401Z -# Max entries per file: 10000 - -2025-09-15T15:10:05.384Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:10:05.399Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:10:05.399Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:10:06.298Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:10:06.303Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:10:06.305Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:10:06.307Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-11-21-267Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-11-21-267Z.log deleted file mode 100644 index 37859b67..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-11-21-267Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:11:21.267Z -# Max entries per file: 10000 - -2025-09-15T15:11:23.252Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:11:23.265Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:11:23.265Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:11:24.111Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:11:24.115Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:11:24.117Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:11:24.119Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-11-33-854Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-11-33-854Z.log deleted file mode 100644 index 2ae68764..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-11-33-854Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:11:33.854Z -# Max entries per file: 10000 - -2025-09-15T15:11:35.564Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:11:35.578Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:11:35.578Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:11:36.405Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:11:36.409Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:11:36.410Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:11:36.412Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-13-47-367Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-13-47-367Z.log deleted file mode 100644 index 8d56b9f6..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-13-47-367Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:13:47.367Z -# Max entries per file: 10000 - -2025-09-15T15:13:49.173Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:13:49.188Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:13:49.188Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:13:50.002Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:13:50.006Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:13:50.007Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:13:50.009Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-14-03-510Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-14-03-510Z.log deleted file mode 100644 index 2b8726e7..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-14-03-510Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:14:03.510Z -# Max entries per file: 10000 - -2025-09-15T15:14:05.302Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:14:05.315Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:14:05.315Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:14:06.249Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:14:06.254Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:14:06.256Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:14:06.258Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-14-28-727Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-14-28-727Z.log deleted file mode 100644 index 31de825c..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-14-28-727Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:14:28.727Z -# Max entries per file: 10000 - -2025-09-15T15:14:30.461Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:14:30.474Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:14:30.474Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:14:31.306Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:14:31.311Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:14:31.313Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:14:31.315Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-18-53-560Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-18-53-560Z.log deleted file mode 100644 index 882f02b8..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-18-53-560Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:18:53.560Z -# Max entries per file: 10000 - -2025-09-15T15:18:55.531Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:18:55.544Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:18:55.544Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:18:56.484Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:18:56.489Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:18:56.490Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:18:56.493Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-19-05-527Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-19-05-527Z.log deleted file mode 100644 index 70fe0d4d..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-19-05-527Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:19:05.527Z -# Max entries per file: 10000 - -2025-09-15T15:19:07.382Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:19:07.394Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:19:07.394Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:19:08.276Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:19:08.280Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:19:08.282Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:19:08.284Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-19-57-880Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-19-57-880Z.log deleted file mode 100644 index d2bd8750..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T15-19-57-880Z.log +++ /dev/null @@ -1,112 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T15:19:57.880Z -# Max entries per file: 10000 - -2025-09-15T15:19:59.701Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T15:19:59.716Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T15:19:59.716Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T15:20:00.573Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T15:20:00.578Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T15:20:00.579Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T15:20:00.589Z | [REQUEST] | Incoming request | ReqId:vpy7nl5pr | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.45.0 -2025-09-15T15:20:00.591Z | [REQUEST] | POST /api/games/start | ReqId:vpy7nl5pr | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 -2025-09-15T15:20:00.594Z | [STARTUP] | Redis client connected successfully -2025-09-15T15:20:00.600Z | [AUTH] | Authentication successful | ReqId:vpy7nl5pr | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T15:20:00.602Z | [REQUEST] | Start game endpoint accessed | ReqId:vpy7nl5pr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.45.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":""} -2025-09-15T15:20:00.605Z | [REQUEST] | Request completed | ReqId:vpy7nl5pr | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:400 | Time:16ms | UA:PostmanRuntime/7.45.0 -2025-09-15T16:20:00.516Z | [DATABASE] | Inactive chats retrieved | Meta:{"query":"findInactiveChats(30min)","executionTime":19,"inactivityMinutes":30,"count":0,"cutoffDate":"2025-09-15T15:50:00.496Z"} -2025-09-15T16:20:00.521Z | [DATABASE] | Chat archive cleanup completed | Meta:{"query":"cleanup(28 days)","executionTime":4,"olderThanDays":28,"deleted":0,"cutoffDate":"2025-08-18T16:20:00.517Z"} -2025-09-15T16:20:00.525Z | [DATABASE] | Chats page retrieved successfully (including deleted) | Meta:{"executionTime":3,"from":0,"to":1000,"returned":0,"totalCount":0} -2025-09-15T16:20:00.527Z | [REQUEST] | Old message cleanup completed | Meta:{"cutoffDate":"2025-08-18T16:20:00.517Z","cleanupWeeks":4,"deletedArchives":0,"deletedChats":0,"note":"Cleanup completed using both ChatRepository and ChatArchiveRepository"} -2025-09-15T16:43:19.273Z | [REQUEST] | Incoming request | ReqId:gav2fa5s6 | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.46.0 -2025-09-15T16:43:19.275Z | [REQUEST] | POST /api/games/start | ReqId:gav2fa5s6 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 -2025-09-15T16:43:19.280Z | [AUTH] | Authentication successful | ReqId:gav2fa5s6 | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T16:43:19.282Z | [REQUEST] | Start game endpoint accessed | ReqId:gav2fa5s6 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":""} -2025-09-15T16:43:19.284Z | [REQUEST] | Request completed | ReqId:gav2fa5s6 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:400 | Time:11ms | UA:PostmanRuntime/7.46.0 -2025-09-15T16:45:27.252Z | [ERROR] | Unhandled error: Expected ',' or ']' after array element in JSON at position 21 | ReqId:4zuf0uf68 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"stack":"SyntaxError: Expected ',' or ']' after array element in JSON at position 21\n at JSON.parse ()\n at parse (/app/node_modules/body-parser/lib/types/json.js:77:19)\n at /app/node_modules/body-parser/lib/read.js:123:18\n at AsyncResource.runInAsyncScope (node:async_hooks:206:9)\n at invokeCallback (/app/node_modules/raw-body/index.js:238:16)\n at done (/app/node_modules/raw-body/index.js:227:7)\n at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7)\n at IncomingMessage.emit (node:events:524:28)\n at IncomingMessage.emit (node:domain:489:12)\n at endReadableNT (node:internal/streams/readable:1698:12)","name":"SyntaxError"} -2025-09-15T16:45:27.254Z | [ERROR] | Global error handler caught unhandled error | ReqId:1j43mrgq3 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"name":"SyntaxError","message":"Expected ',' or ']' after array element in JSON at position 21","stack":"SyntaxError: Expected ',' or ']' after array element in JSON at position 21\n at JSON.parse ()\n at parse (/app/node_modules/body-parser/lib/types/json.js:77:19)\n at /app/node_modules/body-parser/lib/read.js:123:18\n at AsyncResource.runInAsyncScope (node:async_hooks:206:9)\n at invokeCallback (/app/node_modules/raw-body/index.js:238:16)\n at done (/app/node_modules/raw-body/index.js:227:7)\n at IncomingMessage.onEnd (/app/node_modules/raw-body/index.js:287:7)\n at IncomingMessage.emit (node:events:524:28)\n at IncomingMessage.emit (node:domain:489:12)\n at endReadableNT (node:internal/streams/readable:1698:12)"} -2025-09-15T16:45:40.823Z | [REQUEST] | Incoming request | ReqId:aq0mxjxe3 | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.46.0 -2025-09-15T16:45:40.824Z | [REQUEST] | POST /api/games/start | ReqId:aq0mxjxe3 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 -2025-09-15T16:45:40.827Z | [AUTH] | Authentication successful | ReqId:aq0mxjxe3 | IP:::ffff:172.20.0.1 | POST /api/games/start | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"orgId":""} -2025-09-15T16:45:40.829Z | [REQUEST] | Start game endpoint accessed | ReqId:aq0mxjxe3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":"","deckCount":3,"maxplayers":2,"logintype":0} -2025-09-15T16:45:40.831Z | [OTHER] | GameService.startGame called | Meta:{"deckCount":3,"maxplayers":2,"logintype":0,"userid":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgid":""} -2025-09-15T16:45:40.833Z | [OTHER] | Start game input validation passed | Meta:{"deckCount":3,"maxplayers":2,"logintype":0} -2025-09-15T16:45:40.835Z | [OTHER] | Starting game creation | Meta:"deckCount: 3, maxPlayers: 2, loginType: 0" -2025-09-15T16:45:40.853Z | [OTHER] | Deck types validation passed | Meta:"foundTypes: [2, 1, 0]" -2025-09-15T16:45:40.855Z | [OTHER] | Created shuffled game deck | Meta:"type: 2, cardCount: 1, sourceDecks: 1" -2025-09-15T16:45:40.856Z | [OTHER] | Created shuffled game deck | Meta:"type: 1, cardCount: 1, sourceDecks: 1" -2025-09-15T16:45:40.858Z | [OTHER] | Created shuffled game deck | Meta:"type: 0, cardCount: 3, sourceDecks: 1" -2025-09-15T16:45:40.875Z | [DATABASE] | Game created | Meta:{"query":"executionTime: 16ms, gameId: 15b8df04-302a-496d-80f3-f667e1a7d7c5, gameCode: 1KTEV7"} -2025-09-15T16:45:40.879Z | [OTHER] | Game created in Redis | Meta:{"gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","hostId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","websocketRoom":"game_1KTEV7","redisKey":"game:15b8df04-302a-496d-80f3-f667e1a7d7c5"} -2025-09-15T16:45:40.881Z | [OTHER] | Triggering async board generation for game 15b8df04-302a-496d-80f3-f667e1a7d7c5 | Meta:{"positiveFieldCount":40,"negativeFieldCount":16,"luckFieldCount":10,"totalSpecialFields":66} -2025-09-15T16:45:40.883Z | [OTHER] | Starting board generation for game 15b8df04-302a-496d-80f3-f667e1a7d7c5 -2025-09-15T16:45:40.885Z | [OTHER] | Calculated step value for negative field at position 1 | Meta:{"targetField":8,"targetIndexInBorder":0,"startBorderIndex":0,"calculatedStepValue":-1,"fieldType":"negative"} -2025-09-15T16:45:40.887Z | [OTHER] | Calculated step value for negative field at position 2 | Meta:{"targetField":1,"targetIndexInBorder":2,"startBorderIndex":1,"calculatedStepValue":0,"fieldType":"negative"} -2025-09-15T16:45:40.888Z | [OTHER] | Calculated step value for positive field at position 6 | Meta:{"targetField":1,"targetIndexInBorder":2,"startBorderIndex":5,"calculatedStepValue":96,"fieldType":"positive"} -2025-09-15T16:45:40.889Z | [OTHER] | Calculated step value for negative field at position 7 | Meta:{"targetField":4,"targetIndexInBorder":6,"startBorderIndex":6,"calculatedStepValue":-1,"fieldType":"negative"} -2025-09-15T16:45:40.891Z | [OTHER] | Calculated step value for positive field at position 8 | Meta:{"targetField":10,"targetIndexInBorder":20,"startBorderIndex":7,"calculatedStepValue":12,"fieldType":"positive"} -2025-09-15T16:45:40.892Z | [OTHER] | Calculated step value for positive field at position 10 | Meta:{"targetField":1,"targetIndexInBorder":2,"startBorderIndex":9,"calculatedStepValue":92,"fieldType":"positive"} -2025-09-15T16:45:40.893Z | [OTHER] | Calculated step value for negative field at position 11 | Meta:{"targetField":10,"targetIndexInBorder":20,"startBorderIndex":10,"calculatedStepValue":9,"fieldType":"negative"} -2025-09-15T16:45:40.895Z | [OTHER] | Calculated step value for positive field at position 15 | Meta:{"targetField":11,"targetIndexInBorder":5,"startBorderIndex":14,"calculatedStepValue":90,"fieldType":"positive"} -2025-09-15T16:45:40.896Z | [OTHER] | Calculated step value for positive field at position 19 | Meta:{"targetField":16,"targetIndexInBorder":24,"startBorderIndex":18,"calculatedStepValue":5,"fieldType":"positive"} -2025-09-15T16:45:40.898Z | [OTHER] | Calculated step value for positive field at position 20 | Meta:{"targetField":18,"targetIndexInBorder":27,"startBorderIndex":19,"calculatedStepValue":7,"fieldType":"positive"} -2025-09-15T16:45:40.899Z | [OTHER] | Calculated step value for positive field at position 22 | Meta:{"targetField":6,"targetIndexInBorder":8,"startBorderIndex":21,"calculatedStepValue":86,"fieldType":"positive"} -2025-09-15T16:45:40.901Z | [OTHER] | Calculated step value for positive field at position 23 | Meta:{"targetField":16,"targetIndexInBorder":24,"startBorderIndex":22,"calculatedStepValue":1,"fieldType":"positive"} -2025-09-15T16:45:40.902Z | [OTHER] | Calculated step value for positive field at position 26 | Meta:{"targetField":16,"targetIndexInBorder":24,"startBorderIndex":25,"calculatedStepValue":98,"fieldType":"positive"} -2025-09-15T16:45:40.904Z | [OTHER] | Calculated step value for negative field at position 31 | Meta:{"targetField":16,"targetIndexInBorder":24,"startBorderIndex":30,"calculatedStepValue":-7,"fieldType":"negative"} -2025-09-15T16:45:40.905Z | [OTHER] | Calculated step value for positive field at position 32 | Meta:{"targetField":48,"targetIndexInBorder":37,"startBorderIndex":31,"calculatedStepValue":5,"fieldType":"positive"} -2025-09-15T16:45:40.907Z | [OTHER] | Calculated step value for positive field at position 33 | Meta:{"targetField":45,"targetIndexInBorder":39,"startBorderIndex":32,"calculatedStepValue":6,"fieldType":"positive"} -2025-09-15T16:45:40.908Z | [OTHER] | Calculated step value for positive field at position 36 | Meta:{"targetField":24,"targetIndexInBorder":35,"startBorderIndex":35,"calculatedStepValue":99,"fieldType":"positive"} -2025-09-15T16:45:40.909Z | [OTHER] | Calculated step value for negative field at position 37 | Meta:{"targetField":53,"targetIndexInBorder":44,"startBorderIndex":36,"calculatedStepValue":7,"fieldType":"negative"} -2025-09-15T16:45:40.911Z | [OTHER] | Calculated step value for positive field at position 38 | Meta:{"targetField":48,"targetIndexInBorder":37,"startBorderIndex":37,"calculatedStepValue":99,"fieldType":"positive"} -2025-09-15T16:45:40.912Z | [OTHER] | Calculated step value for positive field at position 39 | Meta:{"targetField":42,"targetIndexInBorder":48,"startBorderIndex":38,"calculatedStepValue":9,"fieldType":"positive"} -2025-09-15T16:45:40.914Z | [OTHER] | Calculated step value for negative field at position 41 | Meta:{"targetField":35,"targetIndexInBorder":29,"startBorderIndex":40,"calculatedStepValue":-12,"fieldType":"negative"} -2025-09-15T16:45:40.915Z | [OTHER] | Calculated step value for negative field at position 45 | Meta:{"targetField":48,"targetIndexInBorder":37,"startBorderIndex":44,"calculatedStepValue":-8,"fieldType":"negative"} -2025-09-15T16:45:40.917Z | [OTHER] | Calculated step value for positive field at position 48 | Meta:{"targetField":46,"targetIndexInBorder":47,"startBorderIndex":47,"calculatedStepValue":99,"fieldType":"positive"} -2025-09-15T16:45:40.918Z | [OTHER] | Calculated step value for positive field at position 50 | Meta:{"targetField":35,"targetIndexInBorder":29,"startBorderIndex":49,"calculatedStepValue":79,"fieldType":"positive"} -2025-09-15T16:45:40.920Z | [OTHER] | Calculated step value for positive field at position 52 | Meta:{"targetField":51,"targetIndexInBorder":51,"startBorderIndex":51,"calculatedStepValue":99,"fieldType":"positive"} -2025-09-15T16:45:40.921Z | [OTHER] | Calculated step value for positive field at position 56 | Meta:{"targetField":37,"targetIndexInBorder":55,"startBorderIndex":55,"calculatedStepValue":99,"fieldType":"positive"} -2025-09-15T16:45:40.923Z | [OTHER] | Calculated step value for negative field at position 61 | Meta:{"targetField":46,"targetIndexInBorder":47,"startBorderIndex":60,"calculatedStepValue":-14,"fieldType":"negative"} -2025-09-15T16:45:40.924Z | [OTHER] | Calculated step value for positive field at position 62 | Meta:{"targetField":65,"targetIndexInBorder":66,"startBorderIndex":61,"calculatedStepValue":4,"fieldType":"positive"} -2025-09-15T16:45:40.926Z | [OTHER] | Calculated step value for negative field at position 65 | Meta:{"targetField":84,"targetIndexInBorder":68,"startBorderIndex":64,"calculatedStepValue":3,"fieldType":"negative"} -2025-09-15T16:45:40.927Z | [OTHER] | Calculated step value for negative field at position 67 | Meta:{"targetField":65,"targetIndexInBorder":66,"startBorderIndex":66,"calculatedStepValue":-1,"fieldType":"negative"} -2025-09-15T16:45:40.928Z | [OTHER] | Calculated step value for positive field at position 70 | Meta:{"targetField":75,"targetIndexInBorder":63,"startBorderIndex":69,"calculatedStepValue":93,"fieldType":"positive"} -2025-09-15T16:45:40.930Z | [OTHER] | Calculated step value for negative field at position 71 | Meta:{"targetField":70,"targetIndexInBorder":76,"startBorderIndex":70,"calculatedStepValue":5,"fieldType":"negative"} -2025-09-15T16:45:40.931Z | [OTHER] | Calculated step value for negative field at position 72 | Meta:{"targetField":84,"targetIndexInBorder":68,"startBorderIndex":71,"calculatedStepValue":-4,"fieldType":"negative"} -2025-09-15T16:45:40.933Z | [OTHER] | Calculated step value for positive field at position 73 | Meta:{"targetField":70,"targetIndexInBorder":76,"startBorderIndex":72,"calculatedStepValue":3,"fieldType":"positive"} -2025-09-15T16:45:40.934Z | [OTHER] | Calculated step value for positive field at position 78 | Meta:{"targetField":95,"targetIndexInBorder":84,"startBorderIndex":77,"calculatedStepValue":6,"fieldType":"positive"} -2025-09-15T16:45:40.935Z | [OTHER] | Calculated step value for positive field at position 85 | Meta:{"targetField":91,"targetIndexInBorder":83,"startBorderIndex":84,"calculatedStepValue":98,"fieldType":"positive"} -2025-09-15T16:45:40.937Z | [OTHER] | Calculated step value for positive field at position 86 | Meta:{"targetField":79,"targetIndexInBorder":82,"startBorderIndex":85,"calculatedStepValue":96,"fieldType":"positive"} -2025-09-15T16:45:40.939Z | [OTHER] | Calculated step value for positive field at position 92 | Meta:{"targetField":99,"targetIndexInBorder":89,"startBorderIndex":91,"calculatedStepValue":97,"fieldType":"positive"} -2025-09-15T16:45:40.940Z | [OTHER] | Calculated step value for positive field at position 94 | Meta:{"targetField":77,"targetIndexInBorder":96,"startBorderIndex":93,"calculatedStepValue":2,"fieldType":"positive"} -2025-09-15T16:45:40.941Z | [OTHER] | Calculated step value for positive field at position 95 | Meta:{"targetField":100,"targetIndexInBorder":90,"startBorderIndex":94,"calculatedStepValue":95,"fieldType":"positive"} -2025-09-15T16:45:40.943Z | [OTHER] | Calculated step value for negative field at position 97 | Meta:{"targetField":95,"targetIndexInBorder":84,"startBorderIndex":96,"calculatedStepValue":-13,"fieldType":"negative"} -2025-09-15T16:45:40.944Z | [OTHER] | Calculated step value for negative field at position 99 | Meta:{"targetField":94,"targetIndexInBorder":98,"startBorderIndex":98,"calculatedStepValue":-1,"fieldType":"negative"} -2025-09-15T16:45:40.946Z | [OTHER] | Calculated step value for positive field at position 100 | Meta:{"targetField":100,"targetIndexInBorder":90,"startBorderIndex":99,"calculatedStepValue":90,"fieldType":"positive"} -2025-09-15T16:45:40.948Z | [OTHER] | Board generation attempt completed | Meta:{"totalFields":100,"specialFields":51,"positiveFields":28,"negativeFields":15,"luckFields":8,"errorRate":13.18,"targetCount":258} -2025-09-15T16:45:40.950Z | [OTHER] | Board generation successful on attempt 1. Error rate: 13.18% -2025-09-15T16:45:40.951Z | [OTHER] | Game created successfully | Meta:"gameId: 15b8df04-302a-496d-80f3-f667e1a7d7c5, gameCode: 1KTEV7, executionTime: 116ms" -2025-09-15T16:45:40.953Z | [OTHER] | Game started successfully | Meta:{"gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","deckCount":3,"totalCards":5,"executionTime":122} -2025-09-15T16:45:40.954Z | [REQUEST] | Game started successfully | ReqId:aq0mxjxe3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","deckCount":3,"totalCards":5} -2025-09-15T16:45:40.956Z | [REQUEST] | Request completed | ReqId:aq0mxjxe3 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/start | Status:200 | Time:133ms | UA:PostmanRuntime/7.46.0 -2025-09-15T16:45:40.958Z | [OTHER] | Board generation completed for game 15b8df04-302a-496d-80f3-f667e1a7d7c5 in 74ms. Error rate: 13.18% -2025-09-15T16:49:12.785Z | [REQUEST] | Incoming request | ReqId:sr0zkbk63 | IP:::ffff:172.20.0.1 | POST /api/games/join | UA:PostmanRuntime/7.46.0 -2025-09-15T16:49:12.787Z | [REQUEST] | POST /api/games/join | ReqId:sr0zkbk63 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.46.0 -2025-09-15T16:49:12.790Z | [AUTH] | Optional auth - user authenticated | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","authLevel":1,"userStatus":5,"orgId":""} -2025-09-15T16:49:12.792Z | [REQUEST] | Join game endpoint accessed | ReqId:sr0zkbk63 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"gameCode":"1KTEV7","hasAuth":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","orgId":null} -2025-09-15T16:49:12.805Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 11ms, gameCode: 1KTEV7, found: true"} -2025-09-15T16:49:12.810Z | [DATABASE] | User findById query completed | Meta:{"query":"findOneBy({ id: ffa31617-2cf9-403e-ab9d-87eeec85ce58 })","executionTime":3,"found":true,"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T16:49:12.812Z | [REQUEST] | Using logged-in user's username as playerName | ReqId:sr0zkbk63 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","username":"TesztAdmin"} -2025-09-15T16:49:12.814Z | [OTHER] | GameService.joinGame called | Meta:{"gameCode":"1KTEV7","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","playerName":"TesztAdmin","orgId":null,"loginType":0} -2025-09-15T16:49:12.815Z | [OTHER] | Join game input validation passed | Meta:{"gameCode":"1KTEV7","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","loginType":0} -2025-09-15T16:49:12.817Z | [OTHER] | Joining game | Meta:"gameCode: 1KTEV7, playerId: ffa31617-2cf9-403e-ab9d-87eeec85ce58, loginType: 0" -2025-09-15T16:49:12.823Z | [DATABASE] | Game findByGameCode completed | Meta:{"query":"executionTime: 4ms, gameCode: 1KTEV7, found: true"} -2025-09-15T16:49:12.824Z | [OTHER] | Game join validation passed | Meta:{"gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","currentPlayers":0,"maxPlayers":2,"gameState":0,"loginType":0,"playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","isAuthenticated":true} -2025-09-15T16:49:12.828Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 15b8df04-302a-496d-80f3-f667e1a7d7c5, found: true"} -2025-09-15T16:49:12.835Z | [DATABASE] | Game findById completed | Meta:{"query":"executionTime: 2ms, gameId: 15b8df04-302a-496d-80f3-f667e1a7d7c5, found: true"} -2025-09-15T16:49:12.837Z | [DATABASE] | Game update completed | Meta:{"query":"executionTime: 8ms, gameId: 15b8df04-302a-496d-80f3-f667e1a7d7c5, updated: true"} -2025-09-15T16:49:12.839Z | [DATABASE] | Player added to game | Meta:{"query":"executionTime: 13ms, gameId: 15b8df04-302a-496d-80f3-f667e1a7d7c5, playerId: ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T16:49:12.843Z | [OTHER] | Game data updated in Redis | Meta:{"gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","redisKey":"game:15b8df04-302a-496d-80f3-f667e1a7d7c5","playerCount":1,"websocketRoom":"game_1KTEV7","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58"} -2025-09-15T16:49:12.845Z | [OTHER] | Player joined game successfully | Meta:{"gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","playerCount":1,"maxPlayers":2,"loginType":0,"executionTime":28} -2025-09-15T16:49:12.846Z | [OTHER] | Player joined game successfully | Meta:{"gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","playerId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","playerCount":1,"maxPlayers":2,"executionTime":33} -2025-09-15T16:49:12.848Z | [REQUEST] | Player joined game successfully | ReqId:sr0zkbk63 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | UA:PostmanRuntime/7.46.0 | Meta:{"userId":"ffa31617-2cf9-403e-ab9d-87eeec85ce58","gameId":"15b8df04-302a-496d-80f3-f667e1a7d7c5","gameCode":"1KTEV7","gameType":"PUBLIC","playerCount":1,"maxPlayers":2,"playerName":"TesztAdmin"} -2025-09-15T16:49:12.850Z | [REQUEST] | Request completed | ReqId:sr0zkbk63 | UserId:ffa31617-2cf9-403e-ab9d-87eeec85ce58 | IP:::ffff:172.20.0.1 | POST /api/games/join | Status:200 | Time:65ms | UA:PostmanRuntime/7.46.0 diff --git a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T16-59-16-198Z.log b/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T16-59-16-198Z.log deleted file mode 100644 index a85912ce..00000000 --- a/SerpentRace_Backend/logs/2025-09/serpentrace-2025-09-15T16-59-16-198Z.log +++ /dev/null @@ -1,10 +0,0 @@ -# SerpentRace Backend Logs -# Started: 2025-09-15T16:59:16.198Z -# Max entries per file: 10000 - -2025-09-15T16:59:18.173Z | [STARTUP] | SerpentRace Backend starting up | Meta:{"environment":"development","port":"3000","nodeVersion":"v20.19.5","chatInactivityTimeout":"30"} -2025-09-15T16:59:18.187Z | [STARTUP] | Server started successfully | Meta:{"port":"3000","environment":"development","timestamp":"2025-09-15T16:59:18.187Z","endpoints":{"health":"/health","swagger":"/api-docs","users":"/api/users","organizations":"/api/organizations","decks":"/api/decks","chats":"/api/chats"},"websocket":{"enabled":true,"chatInactivityTimeout":"30 minutes"}} -2025-09-15T16:59:19.056Z | [CONNECTION] | Database connection established | Meta:{"connectionType":"postgresql","status":"success","type":"postgres","host":"postgres","database":"serpentrace"} -2025-09-15T16:59:19.060Z | [REQUEST] | WebSocket service initialized | Meta:{"chatTimeoutMinutes":30} -2025-09-15T16:59:19.062Z | [STARTUP] | WebSocket service initialized | Meta:{"chatInactivityTimeout":"30"} -2025-09-15T16:59:19.064Z | [STARTUP] | Redis client connected successfully diff --git a/SerpentRace_Backend/node_modules/jest-runner/build/testWorker.js b/SerpentRace_Backend/node_modules/jest-runner/build/testWorker.js deleted file mode 100644 index b5e793de..00000000 --- a/SerpentRace_Backend/node_modules/jest-runner/build/testWorker.js +++ /dev/null @@ -1,510 +0,0 @@ -/*! - * /** - * * Copyright (c) Meta Platforms, Inc. and affiliates. - * * - * * This source code is licensed under the MIT license found in the - * * LICENSE file in the root directory of this source tree. - * * / - */ -/******/ (() => { // webpackBootstrap -/******/ "use strict"; -/******/ var __webpack_modules__ = ({ - -/***/ "./src/runTest.ts": -/***/ ((__unused_webpack_module, exports) => { - - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports["default"] = runTest; -function _nodeVm() { - const data = require("node:vm"); - _nodeVm = function () { - return data; - }; - return data; -} -function _chalk() { - const data = _interopRequireDefault(require("chalk")); - _chalk = function () { - return data; - }; - return data; -} -function fs() { - const data = _interopRequireWildcard(require("graceful-fs")); - fs = function () { - return data; - }; - return data; -} -function sourcemapSupport() { - const data = _interopRequireWildcard(require("source-map-support")); - sourcemapSupport = function () { - return data; - }; - return data; -} -function _console() { - const data = require("@jest/console"); - _console = function () { - return data; - }; - return data; -} -function _transform() { - const data = require("@jest/transform"); - _transform = function () { - return data; - }; - return data; -} -function docblock() { - const data = _interopRequireWildcard(require("jest-docblock")); - docblock = function () { - return data; - }; - return data; -} -function _jestLeakDetector() { - const data = _interopRequireDefault(require("jest-leak-detector")); - _jestLeakDetector = function () { - return data; - }; - return data; -} -function _jestMessageUtil() { - const data = require("jest-message-util"); - _jestMessageUtil = function () { - return data; - }; - return data; -} -function _jestResolve() { - const data = require("jest-resolve"); - _jestResolve = function () { - return data; - }; - return data; -} -function _jestUtil() { - const data = require("jest-util"); - _jestUtil = function () { - return data; - }; - return data; -} -function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function (e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != typeof e && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (const t in e) "default" !== t && {}.hasOwnProperty.call(e, t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, t)) && (i.get || i.set) ? o(f, t, i) : f[t] = e[t]); return f; })(e, t); } -function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -// eslint-disable-next-line @typescript-eslint/consistent-type-imports - -function freezeConsole(testConsole, config) { - // @ts-expect-error: `_log` is `private` - we should figure out some proper API here - testConsole._log = function fakeConsolePush(_type, message) { - const error = new (_jestUtil().ErrorWithStack)(`${_chalk().default.red(`${_chalk().default.bold('Cannot log after tests are done.')} Did you forget to wait for something async in your test?`)}\nAttempted to log "${message}".`, fakeConsolePush); - const formattedError = (0, _jestMessageUtil().formatExecError)(error, config, { - noStackTrace: false - }, undefined, true); - process.stderr.write(`\n${formattedError}\n`); - process.exitCode = 1; - }; -} - -// Keeping the core of "runTest" as a separate function (as "runTestInternal") -// is key to be able to detect memory leaks. Since all variables are local to -// the function, when "runTestInternal" finishes its execution, they can all be -// freed, UNLESS something else is leaking them (and that's why we can detect -// the leak!). -// -// If we had all the code in a single function, we should manually nullify all -// references to verify if there is a leak, which is not maintainable and error -// prone. That's why "runTestInternal" CANNOT be inlined inside "runTest". -async function runTestInternal(path, globalConfig, projectConfig, resolver, context, sendMessageToJest) { - const testSource = fs().readFileSync(path, 'utf8'); - const docblockPragmas = docblock().parse(docblock().extract(testSource)); - const customEnvironment = docblockPragmas['jest-environment']; - const loadTestEnvironmentStart = Date.now(); - let testEnvironment = projectConfig.testEnvironment; - if (customEnvironment) { - if (Array.isArray(customEnvironment)) { - throw new TypeError(`You can only define a single test environment through docblocks, got "${customEnvironment.join(', ')}"`); - } - testEnvironment = (0, _jestResolve().resolveTestEnvironment)({ - ...projectConfig, - // we wanna avoid webpack trying to be clever - requireResolveFunction: module => require.resolve(module), - testEnvironment: customEnvironment - }); - } - const cacheFS = new Map([[path, testSource]]); - const transformer = await (0, _transform().createScriptTransformer)(projectConfig, cacheFS); - const TestEnvironment = await transformer.requireAndTranspileModule(testEnvironment); - const testFramework = await transformer.requireAndTranspileModule(process.env.JEST_JASMINE === '1' ? require.resolve('jest-jasmine2') : projectConfig.testRunner); - const Runtime = (0, _jestUtil().interopRequireDefault)(projectConfig.runtime ? require(projectConfig.runtime) : require('jest-runtime')).default; - const consoleOut = globalConfig.useStderr ? process.stderr : process.stdout; - const consoleFormatter = (type, message) => (0, _console().getConsoleOutput)( - // 4 = the console call is buried 4 stack frames deep - _console().BufferedConsole.write([], type, message, 4), projectConfig, globalConfig); - let testConsole; - if (globalConfig.silent) { - testConsole = new (_console().NullConsole)(consoleOut, consoleOut, consoleFormatter); - } else if (globalConfig.verbose) { - testConsole = new (_console().CustomConsole)(consoleOut, consoleOut, consoleFormatter); - } else { - testConsole = new (_console().BufferedConsole)(); - } - let extraTestEnvironmentOptions; - const docblockEnvironmentOptions = docblockPragmas['jest-environment-options']; - if (typeof docblockEnvironmentOptions === 'string') { - extraTestEnvironmentOptions = JSON.parse(docblockEnvironmentOptions); - } - const environment = new TestEnvironment({ - globalConfig, - projectConfig: extraTestEnvironmentOptions ? { - ...projectConfig, - testEnvironmentOptions: { - ...projectConfig.testEnvironmentOptions, - ...extraTestEnvironmentOptions - } - } : projectConfig - }, { - console: testConsole, - docblockPragmas, - testPath: path - }); - const loadTestEnvironmentEnd = Date.now(); - if (typeof environment.getVmContext !== 'function') { - console.error(`Test environment found at "${testEnvironment}" does not export a "getVmContext" method, which is mandatory from Jest 27. This method is a replacement for "runScript".`); - process.exit(1); - } - const leakDetector = projectConfig.detectLeaks ? new (_jestLeakDetector().default)(environment) : null; - (0, _jestUtil().setGlobal)(environment.global, 'console', testConsole, 'retain'); - const runtime = new Runtime(projectConfig, environment, resolver, transformer, cacheFS, { - changedFiles: context.changedFiles, - collectCoverage: globalConfig.collectCoverage, - collectCoverageFrom: globalConfig.collectCoverageFrom, - coverageProvider: globalConfig.coverageProvider, - sourcesRelatedToTestsInChangedFiles: context.sourcesRelatedToTestsInChangedFiles - }, path, globalConfig); - let isTornDown = false; - const tearDownEnv = async () => { - if (!isTornDown) { - runtime.teardown(); - - // source-map-support keeps memory leftovers in `Error.prepareStackTrace` - (0, _nodeVm().runInContext)("Error.prepareStackTrace = () => '';", environment.getVmContext()); - sourcemapSupport().resetRetrieveHandlers(); - try { - await environment.teardown(); - } finally { - isTornDown = true; - } - } - }; - const start = Date.now(); - const setupFilesStart = Date.now(); - for (const path of projectConfig.setupFiles) { - const esm = runtime.unstable_shouldLoadAsEsm(path); - if (esm) { - await runtime.unstable_importModule(path); - } else { - const setupFile = runtime.requireModule(path); - if (typeof setupFile === 'function') { - await setupFile(); - } - } - } - const setupFilesEnd = Date.now(); - const sourcemapOptions = { - environment: 'node', - handleUncaughtExceptions: false, - retrieveSourceMap: source => { - const sourceMapSource = runtime.getSourceMaps()?.get(source); - if (sourceMapSource) { - try { - return { - map: JSON.parse(fs().readFileSync(sourceMapSource, 'utf8')), - url: source - }; - } catch {} - } - return null; - } - }; - - // For tests - runtime.requireInternalModule(require.resolve('source-map-support')).install(sourcemapOptions); - - // For runtime errors - sourcemapSupport().install(sourcemapOptions); - if (environment.global && environment.global.process && environment.global.process.exit) { - const realExit = environment.global.process.exit; - environment.global.process.exit = function exit(...args) { - const error = new (_jestUtil().ErrorWithStack)(`process.exit called with "${args.join(', ')}"`, exit); - const formattedError = (0, _jestMessageUtil().formatExecError)(error, projectConfig, { - noStackTrace: false - }, undefined, true); - process.stderr.write(formattedError); - return realExit(...args); - }; - } - - // if we don't have `getVmContext` on the env skip coverage - const collectV8Coverage = globalConfig.collectCoverage && globalConfig.coverageProvider === 'v8' && typeof environment.getVmContext === 'function'; - - // Node's error-message stack size is limited at 10, but it's pretty useful - // to see more than that when a test fails. - Error.stackTraceLimit = 100; - try { - await environment.setup(); - let result; - try { - if (collectV8Coverage) { - await runtime.collectV8Coverage(); - } - result = await testFramework(globalConfig, projectConfig, environment, runtime, path, sendMessageToJest); - } catch (error) { - // Access all stacks before uninstalling sourcemaps - let e = error; - while (typeof e === 'object' && e !== null && 'stack' in e) { - // eslint-disable-next-line @typescript-eslint/no-unused-expressions - e.stack; - e = e?.cause; - } - throw error; - } finally { - if (collectV8Coverage) { - await runtime.stopCollectingV8Coverage(); - } - } - freezeConsole(testConsole, projectConfig); - const testCount = result.numPassingTests + result.numFailingTests + result.numPendingTests + result.numTodoTests; - const end = Date.now(); - const testRuntime = end - start; - result.perfStats = { - ...result.perfStats, - end, - loadTestEnvironmentEnd, - loadTestEnvironmentStart, - runtime: testRuntime, - setupFilesEnd, - setupFilesStart, - slow: testRuntime / 1000 > projectConfig.slowTestThreshold, - start - }; - result.testFilePath = path; - result.console = testConsole.getBuffer(); - result.skipped = testCount === result.numPendingTests; - result.displayName = projectConfig.displayName; - const coverage = runtime.getAllCoverageInfoCopy(); - if (coverage) { - const coverageKeys = Object.keys(coverage); - if (coverageKeys.length > 0) { - result.coverage = coverage; - } - } - if (collectV8Coverage) { - const v8Coverage = runtime.getAllV8CoverageInfoCopy(); - if (v8Coverage && v8Coverage.length > 0) { - result.v8Coverage = v8Coverage; - } - } - if (globalConfig.logHeapUsage) { - globalThis.gc?.(); - result.memoryUsage = process.memoryUsage().heapUsed; - } - await tearDownEnv(); - - // Delay the resolution to allow log messages to be output. - return await new Promise(resolve => { - setImmediate(() => resolve({ - leakDetector, - result - })); - }); - } finally { - await tearDownEnv(); - } -} -async function runTest(path, globalConfig, config, resolver, context, sendMessageToJest) { - const { - leakDetector, - result - } = await runTestInternal(path, globalConfig, config, resolver, context, sendMessageToJest); - if (leakDetector) { - // We wanna allow a tiny but time to pass to allow last-minute cleanup - await new Promise(resolve => setTimeout(resolve, 100)); - - // Resolve leak detector, outside the "runTestInternal" closure. - result.leaks = await leakDetector.isLeaking(); - } else { - result.leaks = false; - } - return result; -} - -/***/ }) - -/******/ }); -/************************************************************************/ -/******/ // The module cache -/******/ var __webpack_module_cache__ = {}; -/******/ -/******/ // The require function -/******/ function __webpack_require__(moduleId) { -/******/ // Check if module is in cache -/******/ var cachedModule = __webpack_module_cache__[moduleId]; -/******/ if (cachedModule !== undefined) { -/******/ return cachedModule.exports; -/******/ } -/******/ // Create a new module (and put it into the cache) -/******/ var module = __webpack_module_cache__[moduleId] = { -/******/ // no module.id needed -/******/ // no module.loaded needed -/******/ exports: {} -/******/ }; -/******/ -/******/ // Execute the module function -/******/ __webpack_modules__[moduleId](module, module.exports, __webpack_require__); -/******/ -/******/ // Return the exports of the module -/******/ return module.exports; -/******/ } -/******/ -/************************************************************************/ -var __webpack_exports__ = {}; -// This entry needs to be wrapped in an IIFE because it uses a non-standard name for the exports (exports). -(() => { -var exports = __webpack_exports__; - - -Object.defineProperty(exports, "__esModule", ({ - value: true -})); -exports.setup = setup; -exports.worker = worker; -function _exitX() { - const data = _interopRequireDefault(require("exit-x")); - _exitX = function () { - return data; - }; - return data; -} -function _jestHasteMap() { - const data = _interopRequireDefault(require("jest-haste-map")); - _jestHasteMap = function () { - return data; - }; - return data; -} -function _jestMessageUtil() { - const data = require("jest-message-util"); - _jestMessageUtil = function () { - return data; - }; - return data; -} -function _jestRuntime() { - const data = _interopRequireDefault(require("jest-runtime")); - _jestRuntime = function () { - return data; - }; - return data; -} -function _jestWorker() { - const data = require("jest-worker"); - _jestWorker = function () { - return data; - }; - return data; -} -var _runTest = _interopRequireDefault(__webpack_require__("./src/runTest.ts")); -function _interopRequireDefault(e) { return e && e.__esModule ? e : { default: e }; } -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - * - */ - -// Make sure uncaught errors are logged before we exit. -process.on('uncaughtException', err => { - if (err.stack) { - console.error(err.stack); - } else { - console.error(err); - } - (0, _exitX().default)(1); -}); -const formatError = error => { - if (typeof error === 'string') { - const { - message, - stack - } = (0, _jestMessageUtil().separateMessageFromStack)(error); - return { - message, - stack, - type: 'Error' - }; - } - return { - code: error.code || undefined, - message: error.message, - stack: error.stack, - type: 'Error' - }; -}; -const resolvers = new Map(); -const getResolver = config => { - const resolver = resolvers.get(config.id); - if (!resolver) { - throw new Error(`Cannot find resolver for: ${config.id}`); - } - return resolver; -}; -function setup(setupData) { - // Module maps that will be needed for the test runs are passed. - for (const { - config, - serializableModuleMap - } of setupData.serializableResolvers) { - const moduleMap = _jestHasteMap().default.getStatic(config).getModuleMapFromJSON(serializableModuleMap); - resolvers.set(config.id, _jestRuntime().default.createResolver(config, moduleMap)); - } -} -const sendMessageToJest = (eventName, args) => { - (0, _jestWorker().messageParent)([eventName, args]); -}; -async function worker({ - config, - globalConfig, - path, - context -}) { - try { - return await (0, _runTest.default)(path, globalConfig, config, getResolver(config), { - ...context, - changedFiles: context.changedFiles && new Set(context.changedFiles), - sourcesRelatedToTestsInChangedFiles: context.sourcesRelatedToTestsInChangedFiles && new Set(context.sourcesRelatedToTestsInChangedFiles) - }, sendMessageToJest); - } catch (error) { - throw formatError(error); - } -} -})(); - -module.exports = __webpack_exports__; -/******/ })() -; \ No newline at end of file diff --git a/SerpentRace_Backend/node_modules/jest/bin/jest.js b/SerpentRace_Backend/node_modules/jest/bin/jest.js deleted file mode 100644 index f3be8f9d..00000000 --- a/SerpentRace_Backend/node_modules/jest/bin/jest.js +++ /dev/null @@ -1,13 +0,0 @@ -#!/usr/bin/env node -/** - * Copyright (c) Meta Platforms, Inc. and affiliates. - * - * This source code is licensed under the MIT license found in the - * LICENSE file in the root directory of this source tree. - */ - -const importLocal = require('import-local'); - -if (!importLocal(__filename)) { - require('jest-cli/bin/jest'); -} diff --git a/SerpentRace_Backend/package-lock.json b/SerpentRace_Backend/package-lock.json deleted file mode 100644 index 65a34a45..00000000 --- a/SerpentRace_Backend/package-lock.json +++ /dev/null @@ -1,9894 +0,0 @@ -{ - "name": "serpentrace_backend", - "version": "1.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "serpentrace_backend", - "version": "1.0.0", - "license": "ISC", - "dependencies": { - "@types/multer": "^2.0.0", - "@types/nodemailer": "^7.0.1", - "@types/uuid": "^10.0.0", - "bcrypt": "^6.0.0", - "cookie-parser": "^1.4.7", - "express": "^5.1.0", - "helmet": "^8.1.0", - "jsonwebtoken": "^9.0.2", - "minio": "^8.0.5", - "multer": "^2.0.2", - "nodemailer": "^7.0.5", - "pg": "^8.16.3", - "redis": "^5.8.1", - "socket.io": "^4.8.1", - "tsconfig-paths": "^4.2.0", - "typeorm": "^0.3.26", - "uuid": "^11.1.0", - "winston": "^3.17.0" - }, - "devDependencies": { - "@jest/globals": "^30.0.5", - "@types/bcrypt": "^6.0.0", - "@types/cookie-parser": "^1.4.9", - "@types/express": "^5.0.3", - "@types/jest": "^30.0.0", - "@types/jsonwebtoken": "^9.0.10", - "@types/node": "^24.3.3", - "@types/pg": "^8.15.5", - "@types/redis": "^4.0.10", - "@types/socket.io": "^3.0.1", - "@types/socket.io-client": "^1.4.36", - "@types/supertest": "^6.0.3", - "@types/swagger-jsdoc": "^6.0.4", - "@types/swagger-ui-express": "^4.1.8", - "jest": "^30.0.5", - "nodemon": "^3.1.10", - "rimraf": "^5.0.10", - "socket.io-client": "^4.8.1", - "supertest": "^7.1.4", - "swagger-jsdoc": "^6.2.8", - "swagger-ui-express": "^5.0.1", - "ts-jest": "^29.4.1", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@ampproject/remapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@apidevtools/json-schema-ref-parser": { - "version": "9.1.2", - "resolved": "https://registry.npmjs.org/@apidevtools/json-schema-ref-parser/-/json-schema-ref-parser-9.1.2.tgz", - "integrity": "sha512-r1w81DpR+KyRWd3f+rk6TNqMgedmAxZP5v5KWlXQWlgMUUtyEJch0DKEci1SorPMiSeM8XPl7MZ3miJ60JIpQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jsdevtools/ono": "^7.1.3", - "@types/json-schema": "^7.0.6", - "call-me-maybe": "^1.0.1", - "js-yaml": "^4.1.0" - } - }, - "node_modules/@apidevtools/openapi-schemas": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@apidevtools/openapi-schemas/-/openapi-schemas-2.1.0.tgz", - "integrity": "sha512-Zc1AlqrJlX3SlpupFGpiLi2EbteyP7fXmUOGup6/DnkRgjP9bgMM/ag+n91rsv0U1Gpz0H3VILA/o3bW7Ua6BQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/@apidevtools/swagger-methods": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-methods/-/swagger-methods-3.0.2.tgz", - "integrity": "sha512-QAkD5kK2b1WfjDS/UQn/qQkbwF31uqRjPTrsCs5ZG9BQGAkjwvqGFjjPqAuzac/IYzpPtRzjCP1WrTuAIjMrXg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@apidevtools/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/@apidevtools/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-sNiLY51vZOmSPFZA5TF35KZ2HbgYklQnTSDnkghamzLb3EkNtcQnrBQEj5AOCxHpTtXpqMCRM1CrmV2rG6nw4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/json-schema-ref-parser": "^9.0.6", - "@apidevtools/openapi-schemas": "^2.0.4", - "@apidevtools/swagger-methods": "^3.0.2", - "@jsdevtools/ono": "^7.1.3", - "call-me-maybe": "^1.0.1", - "z-schema": "^5.0.1" - }, - "peerDependencies": { - "openapi-types": ">=7" - } - }, - "node_modules/@aws-crypto/sha256-browser": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-browser/-/sha256-browser-5.2.0.tgz", - "integrity": "sha512-AXfN/lGotSQwu6HNcEsIASo7kWXZ5HYWvfOmSNKDsEqC4OashTp8alTmaz+F7TC2L083SFv5RdB+qU3Vs1kZqw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-js": "^5.2.0", - "@aws-crypto/supports-web-crypto": "^5.2.0", - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "@aws-sdk/util-locate-window": "^3.0.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-browser/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/sha256-js": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/sha256-js/-/sha256-js-5.2.0.tgz", - "integrity": "sha512-FFQQyu7edu4ufvIZ+OadFpHHOt+eSTBaYaki44c+akjg7qZg9oOQeLlk77F6tSYqjDAFClrHJk9tMf0HdVyOvA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/util": "^5.2.0", - "@aws-sdk/types": "^3.222.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/@aws-crypto/supports-web-crypto": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/supports-web-crypto/-/supports-web-crypto-5.2.0.tgz", - "integrity": "sha512-iAvUotm021kM33eCdNfwIN//F77/IADDSs58i+MDaOqFrVjZo9bAal0NK7HurRuWLLpF1iLX7gbWrjHjeo+YFg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/@aws-crypto/util/-/util-5.2.0.tgz", - "integrity": "sha512-4RkU9EsI6ZpBve5fseQlGNUWKMa1RLPQ1dnjnQoe07ldfIzcsGb5hC5W0Dm7u423KWzawlrpbjXBrXCEv9zazQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "^3.222.0", - "@smithy/util-utf8": "^2.0.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/is-array-buffer": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-2.2.0.tgz", - "integrity": "sha512-GGP3O9QFD24uGeAXYUjwSTXARoqpZykHadOmA8G5vfJPK0/DC67qa//0qvqrJzL1xc8WQWX7/yc7fwudjPHPhA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-buffer-from": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-2.2.0.tgz", - "integrity": "sha512-IJdWBbTcMQ6DA0gdNhh/BwrLkDR+ADW5Kr1aZmd4k3DIF6ezMV4R2NIAmT08wQJ3yUK82thHWmC/TnK/wpMMIA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-crypto/util/node_modules/@smithy/util-utf8": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-2.3.0.tgz", - "integrity": "sha512-R8Rdn8Hy72KKcebgLiv8jQcQkXoLMOGGv5uI1/k0l+snqkOzQ1R0ChUBCxWMlBsFMekWjq0wRudIweFs7sKT5A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^2.2.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@aws-sdk/client-sesv2": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sesv2/-/client-sesv2-3.864.0.tgz", - "integrity": "sha512-pwn4/3bs7ccucS9sYpMbzptEhEFQQy8TXtmKNzmyY7OIDBGTiJrxsWYDTULO4nxsMmGXi39mSEowlK4QUCyC+w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.864.0", - "@aws-sdk/credential-provider-node": "3.864.0", - "@aws-sdk/middleware-host-header": "3.862.0", - "@aws-sdk/middleware-logger": "3.862.0", - "@aws-sdk/middleware-recursion-detection": "3.862.0", - "@aws-sdk/middleware-user-agent": "3.864.0", - "@aws-sdk/region-config-resolver": "3.862.0", - "@aws-sdk/signature-v4-multi-region": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.862.0", - "@aws-sdk/util-user-agent-browser": "3.862.0", - "@aws-sdk/util-user-agent-node": "3.864.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/client-sso": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/client-sso/-/client-sso-3.864.0.tgz", - "integrity": "sha512-THiOp0OpQROEKZ6IdDCDNNh3qnNn/kFFaTSOiugDpgcE5QdsOxh1/RXq7LmHpTJum3cmnFf8jG59PHcz9Tjnlw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.864.0", - "@aws-sdk/middleware-host-header": "3.862.0", - "@aws-sdk/middleware-logger": "3.862.0", - "@aws-sdk/middleware-recursion-detection": "3.862.0", - "@aws-sdk/middleware-user-agent": "3.864.0", - "@aws-sdk/region-config-resolver": "3.862.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.862.0", - "@aws-sdk/util-user-agent-browser": "3.862.0", - "@aws-sdk/util-user-agent-node": "3.864.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/core": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/core/-/core-3.864.0.tgz", - "integrity": "sha512-LFUREbobleHEln+Zf7IG83lAZwvHZG0stI7UU0CtwyuhQy5Yx0rKksHNOCmlM7MpTEbSCfntEhYi3jUaY5e5lg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@aws-sdk/xml-builder": "3.862.0", - "@smithy/core": "^3.8.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/property-provider": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-utf8": "^4.0.0", - "fast-xml-parser": "5.2.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-env": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-env/-/credential-provider-env-3.864.0.tgz", - "integrity": "sha512-StJPOI2Rt8UE6lYjXUpg6tqSZaM72xg46ljPg8kIevtBAAfdtq9K20qT/kSliWGIBocMFAv0g2mC0hAa+ECyvg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-http": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-http/-/credential-provider-http-3.864.0.tgz", - "integrity": "sha512-E/RFVxGTuGnuD+9pFPH2j4l6HvrXzPhmpL8H8nOoJUosjx7d4v93GJMbbl1v/fkDLqW9qN4Jx2cI6PAjohA6OA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/property-provider": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-stream": "^4.2.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-ini": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-ini/-/credential-provider-ini-3.864.0.tgz", - "integrity": "sha512-PlxrijguR1gxyPd5EYam6OfWLarj2MJGf07DvCx9MAuQkw77HBnsu6+XbV8fQriFuoJVTBLn9ROhMr/ROAYfUg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/credential-provider-env": "3.864.0", - "@aws-sdk/credential-provider-http": "3.864.0", - "@aws-sdk/credential-provider-process": "3.864.0", - "@aws-sdk/credential-provider-sso": "3.864.0", - "@aws-sdk/credential-provider-web-identity": "3.864.0", - "@aws-sdk/nested-clients": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-node": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-node/-/credential-provider-node-3.864.0.tgz", - "integrity": "sha512-2BEymFeXURS+4jE9tP3vahPwbYRl0/1MVaFZcijj6pq+nf5EPGvkFillbdBRdc98ZI2NedZgSKu3gfZXgYdUhQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/credential-provider-env": "3.864.0", - "@aws-sdk/credential-provider-http": "3.864.0", - "@aws-sdk/credential-provider-ini": "3.864.0", - "@aws-sdk/credential-provider-process": "3.864.0", - "@aws-sdk/credential-provider-sso": "3.864.0", - "@aws-sdk/credential-provider-web-identity": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-process": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-process/-/credential-provider-process-3.864.0.tgz", - "integrity": "sha512-Zxnn1hxhq7EOqXhVYgkF4rI9MnaO3+6bSg/tErnBQ3F8kDpA7CFU24G1YxwaJXp2X4aX3LwthefmSJHwcVP/2g==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-sso": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-sso/-/credential-provider-sso-3.864.0.tgz", - "integrity": "sha512-UPyPNQbxDwHVGmgWdGg9/9yvzuedRQVF5jtMkmP565YX9pKZ8wYAcXhcYdNPWFvH0GYdB0crKOmvib+bmCuwkw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/client-sso": "3.864.0", - "@aws-sdk/core": "3.864.0", - "@aws-sdk/token-providers": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/credential-provider-web-identity": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/credential-provider-web-identity/-/credential-provider-web-identity-3.864.0.tgz", - "integrity": "sha512-nNcjPN4SYg8drLwqK0vgVeSvxeGQiD0FxOaT38mV2H8cu0C5NzpvA+14Xy+W6vT84dxgmJYKk71Cr5QL2Oz+rA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/nested-clients": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-host-header": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-host-header/-/middleware-host-header-3.862.0.tgz", - "integrity": "sha512-jDje8dCFeFHfuCAxMDXBs8hy8q9NCTlyK4ThyyfAj3U4Pixly2mmzY2u7b7AyGhWsjJNx8uhTjlYq5zkQPQCYw==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-logger": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-logger/-/middleware-logger-3.862.0.tgz", - "integrity": "sha512-N/bXSJznNBR/i7Ofmf9+gM6dx/SPBK09ZWLKsW5iQjqKxAKn/2DozlnE54uiEs1saHZWoNDRg69Ww4XYYSlG1Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-recursion-detection": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-recursion-detection/-/middleware-recursion-detection-3.862.0.tgz", - "integrity": "sha512-KVoo3IOzEkTq97YKM4uxZcYFSNnMkhW/qj22csofLegZi5fk90ztUnnaeKfaEJHfHp/tm1Y3uSoOXH45s++kKQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-sdk-s3": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-sdk-s3/-/middleware-sdk-s3-3.864.0.tgz", - "integrity": "sha512-GjYPZ6Xnqo17NnC8NIQyvvdzzO7dm+Ks7gpxD/HsbXPmV2aEfuFveJXneGW9e1BheSKFff6FPDWu8Gaj2Iu1yg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-arn-parser": "3.804.0", - "@smithy/core": "^3.8.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", - "@smithy/signature-v4": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/middleware-user-agent": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/middleware-user-agent/-/middleware-user-agent-3.864.0.tgz", - "integrity": "sha512-wrddonw4EyLNSNBrApzEhpSrDwJiNfjxDm5E+bn8n32BbAojXASH8W8jNpxz/jMgNkkJNxCfyqybGKzBX0OhbQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.862.0", - "@smithy/core": "^3.8.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/nested-clients": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/nested-clients/-/nested-clients-3.864.0.tgz", - "integrity": "sha512-H1C+NjSmz2y8Tbgh7Yy89J20yD/hVyk15hNoZDbCYkXg0M358KS7KVIEYs8E2aPOCr1sK3HBE819D/yvdMgokA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-crypto/sha256-browser": "5.2.0", - "@aws-crypto/sha256-js": "5.2.0", - "@aws-sdk/core": "3.864.0", - "@aws-sdk/middleware-host-header": "3.862.0", - "@aws-sdk/middleware-logger": "3.862.0", - "@aws-sdk/middleware-recursion-detection": "3.862.0", - "@aws-sdk/middleware-user-agent": "3.864.0", - "@aws-sdk/region-config-resolver": "3.862.0", - "@aws-sdk/types": "3.862.0", - "@aws-sdk/util-endpoints": "3.862.0", - "@aws-sdk/util-user-agent-browser": "3.862.0", - "@aws-sdk/util-user-agent-node": "3.864.0", - "@smithy/config-resolver": "^4.1.5", - "@smithy/core": "^3.8.0", - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/hash-node": "^4.0.5", - "@smithy/invalid-dependency": "^4.0.5", - "@smithy/middleware-content-length": "^4.0.5", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-retry": "^4.1.19", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/protocol-http": "^5.1.3", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-body-length-node": "^4.0.0", - "@smithy/util-defaults-mode-browser": "^4.0.26", - "@smithy/util-defaults-mode-node": "^4.0.26", - "@smithy/util-endpoints": "^3.0.7", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/region-config-resolver": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/region-config-resolver/-/region-config-resolver-3.862.0.tgz", - "integrity": "sha512-VisR+/HuVFICrBPY+q9novEiE4b3mvDofWqyvmxHcWM7HumTz9ZQSuEtnlB/92GVM3KDUrR9EmBHNRrfXYZkcQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/signature-v4-multi-region": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/signature-v4-multi-region/-/signature-v4-multi-region-3.864.0.tgz", - "integrity": "sha512-w2HIn/WIcUyv1bmyCpRUKHXB5KdFGzyxPkp/YK5g+/FuGdnFFYWGfcO8O+How4jwrZTarBYsAHW9ggoKvwr37w==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-sdk-s3": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/signature-v4": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/token-providers": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/token-providers/-/token-providers-3.864.0.tgz", - "integrity": "sha512-gTc2QHOBo05SCwVA65dUtnJC6QERvFaPiuppGDSxoF7O5AQNK0UR/kMSenwLqN8b5E1oLYvQTv3C1idJLRX0cg==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/core": "3.864.0", - "@aws-sdk/nested-clients": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/types": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/types/-/types-3.862.0.tgz", - "integrity": "sha512-Bei+RL0cDxxV+lW2UezLbCYYNeJm6Nzee0TpW0FfyTRBhH9C1XQh4+x+IClriXvgBnRquTMMYsmJfvx8iyLKrg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-arn-parser": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-arn-parser/-/util-arn-parser-3.804.0.tgz", - "integrity": "sha512-wmBJqn1DRXnZu3b4EkE6CWnoWMo1ZMvlfkqU5zPz67xx1GMaXlDCchFvKAXMjk4jn/L1O3tKnoFDNsoLV1kgNQ==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-endpoints": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-endpoints/-/util-endpoints-3.862.0.tgz", - "integrity": "sha512-eCZuScdE9MWWkHGM2BJxm726MCmWk/dlHjOKvkM0sN1zxBellBMw5JohNss1Z8/TUmnW2gb9XHTOiHuGjOdksA==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-endpoints": "^3.0.7", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-locate-window": { - "version": "3.804.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-locate-window/-/util-locate-window-3.804.0.tgz", - "integrity": "sha512-zVoRfpmBVPodYlnMjgVjfGoEZagyRF5IPn3Uo6ZvOZp24chnW/FRstH7ESDHDDRga4z3V+ElUQHKpFDXWyBW5A==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@aws-sdk/util-user-agent-browser": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-browser/-/util-user-agent-browser-3.862.0.tgz", - "integrity": "sha512-BmPTlm0r9/10MMr5ND9E92r8KMZbq5ltYXYpVcUbAsnB1RJ8ASJuRoLne5F7mB3YMx0FJoOTuSq7LdQM3LgW3Q==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/types": "3.862.0", - "@smithy/types": "^4.3.2", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - } - }, - "node_modules/@aws-sdk/util-user-agent-node": { - "version": "3.864.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/util-user-agent-node/-/util-user-agent-node-3.864.0.tgz", - "integrity": "sha512-d+FjUm2eJEpP+FRpVR3z6KzMdx1qwxEYDz8jzNKwxYLBBquaBaP/wfoMtMQKAcbrR7aT9FZVZF7zDgzNxUvQlQ==", - "license": "Apache-2.0", - "dependencies": { - "@aws-sdk/middleware-user-agent": "3.864.0", - "@aws-sdk/types": "3.862.0", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - }, - "peerDependencies": { - "aws-crt": ">=1.0.0" - }, - "peerDependenciesMeta": { - "aws-crt": { - "optional": true - } - } - }, - "node_modules/@aws-sdk/xml-builder": { - "version": "3.862.0", - "resolved": "https://registry.npmjs.org/@aws-sdk/xml-builder/-/xml-builder-3.862.0.tgz", - "integrity": "sha512-6Ed0kmC1NMbuFTEgNmamAUU1h5gShgxL1hBVLbEzUa3trX5aJBz1vU4bXaBTvOYUAnOHtiy1Ml4AMStd6hJnFA==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.28.0.tgz", - "integrity": "sha512-60X7qkglvrap8mn1lh2ebxXdZYtUcpd7gsmy9kLaBJ4i/WdY8PqTSdxyA8qraikqKQK5C1KRBKXqznrVapyNaw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.28.3.tgz", - "integrity": "sha512-yDBHV9kQNcr2/sUr9jghVyz9C3Y5G2zUM2H2lo+9mKv4sFgbA8s8Z9t8D1jiTkGoO/NoIfKMyKWr4s6CN23ZwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-compilation-targets": "^7.27.2", - "@babel/helper-module-transforms": "^7.28.3", - "@babel/helpers": "^7.28.3", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/traverse": "^7.28.3", - "@babel/types": "^7.28.2", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/core/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/generator": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.28.3.tgz", - "integrity": "sha512-3lSpxGgvnmZznmBkCRnVREPUFJv2wrv9iAoFDvADJc0ypmdOxdUtcLeBgBJ6zE0PMeTKnxeQzyk0xTBq4Ep7zw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.28.3", - "@babel/types": "^7.28.2", - "@jridgewell/gen-mapping": "^0.3.12", - "@jridgewell/trace-mapping": "^0.3.28", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/generator/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/@babel/helper-compilation-targets/node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/@babel/helper-globals": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@babel/helper-globals/-/helper-globals-7.28.0.tgz", - "integrity": "sha512-+W6cISkXFa1jXsDEdYA8HeevQT/FULhxzR99pxphltZcVaugps53THCeiWA8SguxxpSp3gKPiuYfSWopkLQ4hw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.28.3.tgz", - "integrity": "sha512-gytXUbs8k2sXS9PnQptz5o0QnpLL51SwASIORY6XaBKF88nsOT0Zw9szLqlSGQDP/4TljBAD5y98p2U1fqkdsw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.28.3" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.28.3.tgz", - "integrity": "sha512-PTNtvUQihsAsDHMOP5pfobP8C6CM4JWXmP8DrEIt46c3r2bf87Ua1zoqevsMo9g+tWDwgWrFP5EIxuBx5RudAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.28.3.tgz", - "integrity": "sha512-7+Ey1mAgYqFAx2h0RuoxcQT5+MlG3GTV0TQrgr7/ZliKsm/MNDxVVutlWaziMq7wJNAz8MTqz55XLpWvva6StA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-syntax-async-generators": { - "version": "7.8.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-async-generators/-/plugin-syntax-async-generators-7.8.4.tgz", - "integrity": "sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-bigint": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-bigint/-/plugin-syntax-bigint-7.8.3.tgz", - "integrity": "sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-properties": { - "version": "7.12.13", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-properties/-/plugin-syntax-class-properties-7.12.13.tgz", - "integrity": "sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.12.13" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-class-static-block": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-class-static-block/-/plugin-syntax-class-static-block-7.14.5.tgz", - "integrity": "sha512-b+YyPmr6ldyNnM6sqYeMWE+bgJcJpO6yS4QD7ymxgH34GBPNDM/THBh8iunyvKIZztiwLH4CJZ0RxTk9emgpjw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-attributes": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-attributes/-/plugin-syntax-import-attributes-7.27.1.tgz", - "integrity": "sha512-oFT0FrKHgF53f4vOsZGi2Hh3I35PfSmVs4IBFLFj4dnafP+hIWDLg3VyKmUHfLoLHlyxY4C7DGtmHuJgn+IGww==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-import-meta": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-import-meta/-/plugin-syntax-import-meta-7.10.4.tgz", - "integrity": "sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-json-strings": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-json-strings/-/plugin-syntax-json-strings-7.8.3.tgz", - "integrity": "sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-jsx": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-jsx/-/plugin-syntax-jsx-7.27.1.tgz", - "integrity": "sha512-y8YTNIeKoyhGd9O0Jiyzyyqk8gdjnumGTQPsz0xOZOQ2RmkVJeZ1vmmfIvFEKqucBG6axJGBZDE/7iI5suUI/w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-logical-assignment-operators": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-logical-assignment-operators/-/plugin-syntax-logical-assignment-operators-7.10.4.tgz", - "integrity": "sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-nullish-coalescing-operator": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-nullish-coalescing-operator/-/plugin-syntax-nullish-coalescing-operator-7.8.3.tgz", - "integrity": "sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-numeric-separator": { - "version": "7.10.4", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-numeric-separator/-/plugin-syntax-numeric-separator-7.10.4.tgz", - "integrity": "sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.10.4" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-object-rest-spread": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-object-rest-spread/-/plugin-syntax-object-rest-spread-7.8.3.tgz", - "integrity": "sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-catch-binding": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-catch-binding/-/plugin-syntax-optional-catch-binding-7.8.3.tgz", - "integrity": "sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-optional-chaining": { - "version": "7.8.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-optional-chaining/-/plugin-syntax-optional-chaining-7.8.3.tgz", - "integrity": "sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.8.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-private-property-in-object": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-private-property-in-object/-/plugin-syntax-private-property-in-object-7.14.5.tgz", - "integrity": "sha512-0wVnp9dxJ72ZUJDV27ZfbSj6iHLoytYZmh3rFcxNnvsJF3ktkzLDZPy/mA17HGsaQT3/DQsWYX1f1QGWkCoVUg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-top-level-await": { - "version": "7.14.5", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-top-level-await/-/plugin-syntax-top-level-await-7.14.5.tgz", - "integrity": "sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.14.5" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-syntax-typescript": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-syntax-typescript/-/plugin-syntax-typescript-7.27.1.tgz", - "integrity": "sha512-xfYCBMxveHrRMnAWl1ZlPXOZjzkN82THFvLhQhFXFt81Z5HnN+EtUkZhv/zcKpmT3fzmWZB0ywiBrbC3vogbwQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.28.3", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.28.3.tgz", - "integrity": "sha512-7w4kZYHneL3A6NP2nxzHvT3HCZ7puDZZjFMqDpBPECub79sTtSO5CGXDkKrTQq8ksAwfD/XI2MRFX23njdDaIQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.28.3", - "@babel/helper-globals": "^7.28.0", - "@babel/parser": "^7.28.3", - "@babel/template": "^7.27.2", - "@babel/types": "^7.28.2", - "debug": "^4.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/types": { - "version": "7.28.2", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.28.2.tgz", - "integrity": "sha512-ruv7Ae4J5dUYULmeXw1gmb7rYRz57OWCPM57pHojnLq/3Z1CK2lNSLTCVjxVk1F/TZHwOZZrOWi0ur95BbLxNQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@bcoe/v8-coverage": { - "version": "0.2.3", - "resolved": "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz", - "integrity": "sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@colors/colors": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.6.0.tgz", - "integrity": "sha512-Ir+AOibqzrIsL6ajt3Rz3LskB7OiMVHqltZmspbW/TJuTVuyOMirVqAkjfY6JISiLHgyNqicAC8AyHHGzNd/dA==", - "license": "MIT", - "engines": { - "node": ">=0.1.90" - } - }, - "node_modules/@cspotcode/source-map-support": { - "version": "0.8.1", - "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", - "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "0.3.9" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@dabh/diagnostics": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@dabh/diagnostics/-/diagnostics-2.0.3.tgz", - "integrity": "sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==", - "license": "MIT", - "dependencies": { - "colorspace": "1.1.x", - "enabled": "2.0.x", - "kuler": "^2.0.0" - } - }, - "node_modules/@emnapi/core": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/core/-/core-1.4.5.tgz", - "integrity": "sha512-XsLw1dEOpkSX/WucdqUhPWP7hDxSvZiY+fsUC14h+FtQ2Ifni4znbBt8punRX+Uj2JG/uDb8nEHVKvrVlvdZ5Q==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/wasi-threads": "1.0.4", - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/runtime": { - "version": "1.4.5", - "resolved": "https://registry.npmjs.org/@emnapi/runtime/-/runtime-1.4.5.tgz", - "integrity": "sha512-++LApOtY0pEEz1zrd9vy1/zXVaVJJ/EbAF3u0fXIzPJEDtnITsBGbbK0EkM72amhl/R5b+5xx0Y/QhcVOpuulg==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@emnapi/wasi-threads": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@emnapi/wasi-threads/-/wasi-threads-1.0.4.tgz", - "integrity": "sha512-PJR+bOmMOPH8AtcTGAyYNiuJ3/Fcoj2XN/gBEWzDIKh254XO+mM9XoXHk5GNEhodxeMznbg7BlRojVbKN+gC6g==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@isaacs/cliui": { - "version": "8.0.2", - "resolved": "https://registry.npmjs.org/@isaacs/cliui/-/cliui-8.0.2.tgz", - "integrity": "sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==", - "license": "ISC", - "dependencies": { - "string-width": "^5.1.2", - "string-width-cjs": "npm:string-width@^4.2.0", - "strip-ansi": "^7.0.1", - "strip-ansi-cjs": "npm:strip-ansi@^6.0.1", - "wrap-ansi": "^8.1.0", - "wrap-ansi-cjs": "npm:wrap-ansi@^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "license": "MIT", - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, - "node_modules/@istanbuljs/load-nyc-config/node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/@istanbuljs/schema": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", - "integrity": "sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/@jest/console": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/console/-/console-30.0.5.tgz", - "integrity": "sha512-xY6b0XiL0Nav3ReresUarwl2oIz1gTnxGbGpho9/rbUWsLH0f1OD/VT84xs8c7VmH7MChnLb0pag6PhZhAdDiA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/core": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/core/-/core-30.0.5.tgz", - "integrity": "sha512-fKD0OulvRsXF1hmaFgHhVJzczWzA1RXMMo9LTPuFXo9q/alDbME3JIyWYqovWsUBWSoBcsHaGPSLF9rz4l9Qeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.0.5", - "@jest/pattern": "30.0.1", - "@jest/reporters": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-changed-files": "30.0.5", - "jest-config": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-resolve-dependencies": "30.0.5", - "jest-runner": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "jest-watcher": "30.0.5", - "micromatch": "^4.0.8", - "pretty-format": "30.0.5", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/diff-sequences": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/diff-sequences/-/diff-sequences-30.0.1.tgz", - "integrity": "sha512-n5H8QLDJ47QqbCNn5SuFjCRDrOLEZ0h8vAHCK5RL9Ls7Xa8AQLa/YxAc9UjFqoEDM48muwtBGjtMY5cr0PLDCw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/environment": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/environment/-/environment-30.0.5.tgz", - "integrity": "sha512-aRX7WoaWx1oaOkDQvCWImVQ8XNtdv5sEWgk4gxR6NXb7WBUnL5sRak4WRzIQRZ1VTWPvV4VI4mgGjNL9TeKMYA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-mock": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-6udac8KKrtTtC+AXZ2iUN/R7dp7Ydry+Fo6FPFnDG54wjVMnb6vW/XNlf7Xj8UDjAE3aAVAsR4KFyKk3TCXmTA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "30.0.5", - "jest-snapshot": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/expect-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/expect-utils/-/expect-utils-30.0.5.tgz", - "integrity": "sha512-F3lmTT7CXWYywoVUGTCmom0vXq3HTTkaZyTAzIy+bXSBizB7o5qzlC9VCtq0arOa8GqmNsbg/cE9C6HLn7Szew==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/fake-timers": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/fake-timers/-/fake-timers-30.0.5.tgz", - "integrity": "sha512-ZO5DHfNV+kgEAeP3gK3XlpJLL4U3Sz6ebl/n68Uwt64qFFs5bv4bfEEjyRGK5uM0C90ewooNgFuKMdkbEoMEXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@sinonjs/fake-timers": "^13.0.0", - "@types/node": "*", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/get-type": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/get-type/-/get-type-30.0.1.tgz", - "integrity": "sha512-AyYdemXCptSRFirI5EPazNxyPwAL0jXt3zceFjaj8NFiKP9pOi0bfXonf6qkf82z2t3QWPeLCWWw4stPBzctLw==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/globals": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/globals/-/globals-30.0.5.tgz", - "integrity": "sha512-7oEJT19WW4oe6HR7oLRvHxwlJk2gev0U9px3ufs8sX9PoD1Eza68KF0/tlN7X0dq/WVsBScXQGgCldA1V9Y/jA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/types": "30.0.5", - "jest-mock": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/pattern": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/pattern/-/pattern-30.0.1.tgz", - "integrity": "sha512-gWp7NfQW27LaBQz3TITS8L7ZCQ0TLvtmI//4OwlQRx4rnWxcPNIYjxZpDcN4+UlGxgm3jS5QPz8IPTCkb59wZA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "jest-regex-util": "30.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/reporters": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/reporters/-/reporters-30.0.5.tgz", - "integrity": "sha512-mafft7VBX4jzED1FwGC1o/9QUM2xebzavImZMeqnsklgcyxBto8mV4HzNSzUrryJ+8R9MFOM3HgYuDradWR+4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@bcoe/v8-coverage": "^0.2.3", - "@jest/console": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@jridgewell/trace-mapping": "^0.3.25", - "@types/node": "*", - "chalk": "^4.1.2", - "collect-v8-coverage": "^1.0.2", - "exit-x": "^0.2.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "istanbul-lib-coverage": "^3.0.0", - "istanbul-lib-instrument": "^6.0.0", - "istanbul-lib-report": "^3.0.0", - "istanbul-lib-source-maps": "^5.0.0", - "istanbul-reports": "^3.1.3", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", - "slash": "^3.0.0", - "string-length": "^4.0.2", - "v8-to-istanbul": "^9.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/@jest/reporters/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/schemas": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/schemas/-/schemas-30.0.5.tgz", - "integrity": "sha512-DmdYgtezMkh3cpU8/1uyXakv3tJRcmcXxBOcO0tbaozPwpmh4YMsnWrQm9ZmZMfa5ocbxzbFk6O4bDPEc/iAnA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@sinclair/typebox": "^0.34.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/snapshot-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/snapshot-utils/-/snapshot-utils-30.0.5.tgz", - "integrity": "sha512-XcCQ5qWHLvi29UUrowgDFvV4t7ETxX91CbDczMnoqXPOIcZOxyNdSjm6kV5XMc8+HkxfRegU/MUmnTbJRzGrUQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "natural-compare": "^1.4.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/@jest/source-map/-/source-map-30.0.1.tgz", - "integrity": "sha512-MIRWMUUR3sdbP36oyNyhbThLHyJ2eEDClPCiHVbrYAe5g3CHRArIVpBw7cdSB5fr+ofSfIb2Tnsw8iEHL0PYQg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.25", - "callsites": "^3.1.0", - "graceful-fs": "^4.2.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/source-map/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/test-result": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-result/-/test-result-30.0.5.tgz", - "integrity": "sha512-wPyztnK0gbDMQAJZ43tdMro+qblDHH1Ru/ylzUo21TBKqt88ZqnKKK2m30LKmLLoKtR2lxdpCC/P3g1vfKcawQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.0.5", - "@jest/types": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "collect-v8-coverage": "^1.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/test-sequencer": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/test-sequencer/-/test-sequencer-30.0.5.tgz", - "integrity": "sha512-Aea/G1egWoIIozmDD7PBXUOxkekXl7ueGzrsGGi1SbeKgQqCYCIf+wfbflEbf2LiPxL8j2JZGLyrzZagjvW4YQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.0.5", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/transform/-/transform-30.0.5.tgz", - "integrity": "sha512-Vk8amLQCmuZyy6GbBht1Jfo9RSdBtg7Lks+B0PecnjI8J+PCLQPGh7uI8Q/2wwpW2gLdiAfiHNsmekKlywULqg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/types": "30.0.5", - "@jridgewell/trace-mapping": "^0.3.25", - "babel-plugin-istanbul": "^7.0.0", - "chalk": "^4.1.2", - "convert-source-map": "^2.0.0", - "fast-json-stable-stringify": "^2.1.0", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "micromatch": "^4.0.8", - "pirates": "^4.0.7", - "slash": "^3.0.0", - "write-file-atomic": "^5.0.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jest/transform/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jest/types": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/@jest/types/-/types-30.0.5.tgz", - "integrity": "sha512-aREYa3aku9SSnea4aX6bhKn4bgv3AXkgijoQgbYV3yvbiGt6z+MQ85+6mIhx9DsKW2BuB/cLR/A+tcMThx+KLQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/pattern": "30.0.1", - "@jest/schemas": "30.0.5", - "@types/istanbul-lib-coverage": "^2.0.6", - "@types/istanbul-reports": "^3.0.4", - "@types/node": "*", - "@types/yargs": "^17.0.33", - "chalk": "^4.1.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.13", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.13.tgz", - "integrity": "sha512-2kkt/7niJ6MgEPxF0bYdQ6etZaA+fQvDcLKckhy1yIQOzaoKjBBjSj63/aLVjYE3qhRt5dvM+uUyfCg6UKCBbA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0", - "@jridgewell/trace-mapping": "^0.3.24" - } - }, - "node_modules/@jridgewell/gen-mapping/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.5", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.5.tgz", - "integrity": "sha512-cYQ9310grqxueWbl+WuIUIaiUaDcj7WOq5fVhEljNVgRfOUhY9fy2zTvfoqWsnebh8Sl70VScFbICvJnLKB0Og==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.9", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", - "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.0.3", - "@jridgewell/sourcemap-codec": "^1.4.10" - } - }, - "node_modules/@jsdevtools/ono": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/@jsdevtools/ono/-/ono-7.1.3.tgz", - "integrity": "sha512-4JQNk+3mVzK3xh2rqd6RB4J46qUR19azEHBneZyTZM+c456qOrbbM/5xcR8huNCCcbVt7+UmizG6GuUvPvKUYg==", - "dev": true, - "license": "MIT" - }, - "node_modules/@napi-rs/wasm-runtime": { - "version": "0.2.12", - "resolved": "https://registry.npmjs.org/@napi-rs/wasm-runtime/-/wasm-runtime-0.2.12.tgz", - "integrity": "sha512-ZVWUcfwY4E/yPitQJl481FjFo3K22D6qF0DuFH6Y/nbnE11GY5uguDxZMGXPQ8WQ0128MXQD7TnfHyK4oWoIJQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@tybys/wasm-util": "^0.10.0" - } - }, - "node_modules/@noble/hashes": { - "version": "1.8.0", - "resolved": "https://registry.npmjs.org/@noble/hashes/-/hashes-1.8.0.tgz", - "integrity": "sha512-jCs9ldd7NwzpgXDIf6P3+NrHh9/sD6CQdxHyjQI+h/6rDNo88ypBxxz45UDuZHz9r3tNz7N/VInSVoVdtXEI4A==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^14.21.3 || >=16" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - } - }, - "node_modules/@paralleldrive/cuid2": { - "version": "2.2.2", - "resolved": "https://registry.npmjs.org/@paralleldrive/cuid2/-/cuid2-2.2.2.tgz", - "integrity": "sha512-ZOBkgDwEdoYVlSeRbYYXs0S9MejQofiVYoTbKzy/6GQa39/q5tQU2IX46+shYnUkpEl3wc+J6wRlar7r2EK2xA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@noble/hashes": "^1.1.5" - } - }, - "node_modules/@pkgjs/parseargs": { - "version": "0.11.0", - "resolved": "https://registry.npmjs.org/@pkgjs/parseargs/-/parseargs-0.11.0.tgz", - "integrity": "sha512-+1VkjdD0QBLPodGrJUeqarH8VAIvQODIbwh9XpP5Syisf7YoQgsJKPNFoqqLQlu+VQ/tVSshMR6loPMn8U+dPg==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=14" - } - }, - "node_modules/@pkgr/core": { - "version": "0.2.9", - "resolved": "https://registry.npmjs.org/@pkgr/core/-/core-0.2.9.tgz", - "integrity": "sha512-QNqXyfVS2wm9hweSYD2O7F0G06uurj9kZ96TRQE5Y9hU7+tgdZwIkbAKc5Ocy1HxEY2kuDQa6cQ1WRs/O5LFKA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/pkgr" - } - }, - "node_modules/@redis/bloom": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@redis/bloom/-/bloom-5.8.1.tgz", - "integrity": "sha512-hJOJr/yX6BttnyZ+nxD3Ddiu2lPig4XJjyAK1v7OSHOJNUTfn3RHBryB9wgnBMBdkg9glVh2AjItxIXmr600MA==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.1" - } - }, - "node_modules/@redis/client": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@redis/client/-/client-5.8.1.tgz", - "integrity": "sha512-hD5Tvv7G0t8b3w8ao3kQ4jEPUmUUC6pqA18c8ciYF5xZGfUGBg0olQHW46v6qSt4O5bxOuB3uV7pM6H5wEjBwA==", - "license": "MIT", - "dependencies": { - "cluster-key-slot": "1.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/@redis/json": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@redis/json/-/json-5.8.1.tgz", - "integrity": "sha512-kyvM8Vn+WjJI++nRsIoI9TbdfCs1/TgD0Hp7Z7GiG6W4IEBzkXGQakli+R5BoJzUfgh7gED2fkncYy1NLprMNg==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.1" - } - }, - "node_modules/@redis/search": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@redis/search/-/search-5.8.1.tgz", - "integrity": "sha512-CzuKNTInTNQkxqehSn7QiYcM+th+fhjQn5ilTvksP1wPjpxqK0qWt92oYg3XZc3tO2WuXkqDvTujc4D7kb6r/A==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.1" - } - }, - "node_modules/@redis/time-series": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/@redis/time-series/-/time-series-5.8.1.tgz", - "integrity": "sha512-klvdR96U9oSOyqvcectoAGhYlMOnMS3I5UWUOgdBn1buMODiwM/E4Eds7gxldKmtowe4rLJSF1CyIqyZTjy8Ow==", - "license": "MIT", - "engines": { - "node": ">= 18" - }, - "peerDependencies": { - "@redis/client": "^5.8.1" - } - }, - "node_modules/@scarf/scarf": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz", - "integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==", - "dev": true, - "hasInstallScript": true, - "license": "Apache-2.0" - }, - "node_modules/@sinclair/typebox": { - "version": "0.34.40", - "resolved": "https://registry.npmjs.org/@sinclair/typebox/-/typebox-0.34.40.tgz", - "integrity": "sha512-gwBNIP8ZAYev/ORDWW0QvxdwPXwxBtLsdsJgSc7eDIRt8ubP+rxUBzPsrwnu16fgEF8Bx4lh/+mvQvJzcTM6Kw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@sinonjs/commons": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz", - "integrity": "sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "type-detect": "4.0.8" - } - }, - "node_modules/@sinonjs/fake-timers": { - "version": "13.0.5", - "resolved": "https://registry.npmjs.org/@sinonjs/fake-timers/-/fake-timers-13.0.5.tgz", - "integrity": "sha512-36/hTbH2uaWuGVERyC6da9YwGWnzUZXuPro/F2LfsdOsLnCojz/iSH8MxUt/FD2S5XBSVPhmArFUXcpCQ2Hkiw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@sinonjs/commons": "^3.0.1" - } - }, - "node_modules/@smithy/abort-controller": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/abort-controller/-/abort-controller-4.0.5.tgz", - "integrity": "sha512-jcrqdTQurIrBbUm4W2YdLVMQDoL0sA9DTxYd2s+R/y+2U9NLOP7Xf/YqfSg1FZhlZIYEnvk2mwbyvIfdLEPo8g==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/config-resolver": { - "version": "4.1.5", - "resolved": "https://registry.npmjs.org/@smithy/config-resolver/-/config-resolver-4.1.5.tgz", - "integrity": "sha512-viuHMxBAqydkB0AfWwHIdwf/PRH2z5KHGUzqyRtS/Wv+n3IHI993Sk76VCA7dD/+GzgGOmlJDITfPcJC1nIVIw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", - "@smithy/util-config-provider": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core": { - "version": "3.8.0", - "resolved": "https://registry.npmjs.org/@smithy/core/-/core-3.8.0.tgz", - "integrity": "sha512-EYqsIYJmkR1VhVE9pccnk353xhs+lB6btdutJEtsp7R055haMJp2yE16eSxw8fv+G0WUY6vqxyYOP8kOqawxYQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/middleware-serde": "^4.0.9", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-body-length-browser": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-stream": "^4.2.4", - "@smithy/util-utf8": "^4.0.0", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/core/node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "license": "MIT" - }, - "node_modules/@smithy/core/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@smithy/credential-provider-imds": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/credential-provider-imds/-/credential-provider-imds-4.0.7.tgz", - "integrity": "sha512-dDzrMXA8d8riFNiPvytxn0mNwR4B3h8lgrQ5UjAGu6T9z/kRg/Xncf4tEQHE/+t25sY8IH3CowcmWi+1U5B1Gw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/property-provider": "^4.0.5", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/fetch-http-handler": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/@smithy/fetch-http-handler/-/fetch-http-handler-5.1.1.tgz", - "integrity": "sha512-61WjM0PWmZJR+SnmzaKI7t7G0UkkNFboDpzIdzSoy7TByUzlxo18Qlh9s71qug4AY4hlH/CwXdubMtkcNEb/sQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.1.3", - "@smithy/querystring-builder": "^4.0.5", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/hash-node": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/hash-node/-/hash-node-4.0.5.tgz", - "integrity": "sha512-cv1HHkKhpyRb6ahD8Vcfb2Hgz67vNIXEp2vnhzfxLFGRukLCNEA5QdsorbUEzXma1Rco0u3rx5VTqbM06GcZqQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/invalid-dependency": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/invalid-dependency/-/invalid-dependency-4.0.5.tgz", - "integrity": "sha512-IVnb78Qtf7EJpoEVo7qJ8BEXQwgC4n3igeJNNKEj/MLYtapnx8A67Zt/J3RXAj2xSO1910zk0LdFiygSemuLow==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/is-array-buffer": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/is-array-buffer/-/is-array-buffer-4.0.0.tgz", - "integrity": "sha512-saYhF8ZZNoJDTvJBEWgeBccCg+yvp1CX+ed12yORU3NilJScfc6gfch2oVb4QgxZrGUx3/ZJlb+c/dJbyupxlw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-content-length": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-content-length/-/middleware-content-length-4.0.5.tgz", - "integrity": "sha512-l1jlNZoYzoCC7p0zCtBDE5OBXZ95yMKlRlftooE5jPWQn4YBPLgsp+oeHp7iMHaTGoUdFqmHOPa8c9G3gBsRpQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-endpoint": { - "version": "4.1.18", - "resolved": "https://registry.npmjs.org/@smithy/middleware-endpoint/-/middleware-endpoint-4.1.18.tgz", - "integrity": "sha512-ZhvqcVRPZxnZlokcPaTwb+r+h4yOIOCJmx0v2d1bpVlmP465g3qpVSf7wxcq5zZdu4jb0H4yIMxuPwDJSQc3MQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.8.0", - "@smithy/middleware-serde": "^4.0.9", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "@smithy/url-parser": "^4.0.5", - "@smithy/util-middleware": "^4.0.5", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry": { - "version": "4.1.19", - "resolved": "https://registry.npmjs.org/@smithy/middleware-retry/-/middleware-retry-4.1.19.tgz", - "integrity": "sha512-X58zx/NVECjeuUB6A8HBu4bhx72EoUz+T5jTMIyeNKx2lf+Gs9TmWPNNkH+5QF0COjpInP/xSpJGJ7xEnAklQQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/protocol-http": "^5.1.3", - "@smithy/service-error-classification": "^4.0.7", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-retry": "^4.0.7", - "@types/uuid": "^9.0.1", - "tslib": "^2.6.2", - "uuid": "^9.0.1" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-retry/node_modules/@types/uuid": { - "version": "9.0.8", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", - "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", - "license": "MIT" - }, - "node_modules/@smithy/middleware-retry/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/bin/uuid" - } - }, - "node_modules/@smithy/middleware-serde": { - "version": "4.0.9", - "resolved": "https://registry.npmjs.org/@smithy/middleware-serde/-/middleware-serde-4.0.9.tgz", - "integrity": "sha512-uAFFR4dpeoJPGz8x9mhxp+RPjo5wW0QEEIPPPbLXiRRWeCATf/Km3gKIVR5vaP8bN1kgsPhcEeh+IZvUlBv6Xg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/middleware-stack": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/middleware-stack/-/middleware-stack-4.0.5.tgz", - "integrity": "sha512-/yoHDXZPh3ocRVyeWQFvC44u8seu3eYzZRveCMfgMOBcNKnAmOvjbL9+Cp5XKSIi9iYA9PECUuW2teDAk8T+OQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-config-provider": { - "version": "4.1.4", - "resolved": "https://registry.npmjs.org/@smithy/node-config-provider/-/node-config-provider-4.1.4.tgz", - "integrity": "sha512-+UDQV/k42jLEPPHSn39l0Bmc4sB1xtdI9Gd47fzo/0PbXzJ7ylgaOByVjF5EeQIumkepnrJyfx86dPa9p47Y+w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.0.5", - "@smithy/shared-ini-file-loader": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/node-http-handler": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/@smithy/node-http-handler/-/node-http-handler-4.1.1.tgz", - "integrity": "sha512-RHnlHqFpoVdjSPPiYy/t40Zovf3BBHc2oemgD7VsVTFFZrU5erFFe0n52OANZZ/5sbshgD93sOh5r6I35Xmpaw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/abort-controller": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/querystring-builder": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/property-provider": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/property-provider/-/property-provider-4.0.5.tgz", - "integrity": "sha512-R/bswf59T/n9ZgfgUICAZoWYKBHcsVDurAGX88zsiUtOTA/xUAPyiT+qkNCPwFn43pZqN84M4MiUsbSGQmgFIQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/protocol-http": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@smithy/protocol-http/-/protocol-http-5.1.3.tgz", - "integrity": "sha512-fCJd2ZR7D22XhDY0l+92pUag/7je2BztPRQ01gU5bMChcyI0rlly7QFibnYHzcxDvccMjlpM/Q1ev8ceRIb48w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-builder": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-builder/-/querystring-builder-4.0.5.tgz", - "integrity": "sha512-NJeSCU57piZ56c+/wY+AbAw6rxCCAOZLCIniRE7wqvndqxcKKDOXzwWjrY7wGKEISfhL9gBbAaWWgHsUGedk+A==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "@smithy/util-uri-escape": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/querystring-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/querystring-parser/-/querystring-parser-4.0.5.tgz", - "integrity": "sha512-6SV7md2CzNG/WUeTjVe6Dj8noH32r4MnUeFKZrnVYsQxpGSIcphAanQMayi8jJLZAWm6pdM9ZXvKCpWOsIGg0w==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/service-error-classification": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/service-error-classification/-/service-error-classification-4.0.7.tgz", - "integrity": "sha512-XvRHOipqpwNhEjDf2L5gJowZEm5nsxC16pAZOeEcsygdjv9A2jdOh3YoDQvOXBGTsaJk6mNWtzWalOB9976Wlg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/shared-ini-file-loader": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/shared-ini-file-loader/-/shared-ini-file-loader-4.0.5.tgz", - "integrity": "sha512-YVVwehRDuehgoXdEL4r1tAAzdaDgaC9EQvhK0lEbfnbrd0bd5+CTQumbdPryX3J2shT7ZqQE+jPW4lmNBAB8JQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/signature-v4": { - "version": "5.1.3", - "resolved": "https://registry.npmjs.org/@smithy/signature-v4/-/signature-v4-5.1.3.tgz", - "integrity": "sha512-mARDSXSEgllNzMw6N+mC+r1AQlEBO3meEAkR/UlfAgnMzJUB3goRBWgip1EAMG99wh36MDqzo86SfIX5Y+VEaw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-middleware": "^4.0.5", - "@smithy/util-uri-escape": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/smithy-client": { - "version": "4.4.10", - "resolved": "https://registry.npmjs.org/@smithy/smithy-client/-/smithy-client-4.4.10.tgz", - "integrity": "sha512-iW6HjXqN0oPtRS0NK/zzZ4zZeGESIFcxj2FkWed3mcK8jdSdHzvnCKXSjvewESKAgGKAbJRA+OsaqKhkdYRbQQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/core": "^3.8.0", - "@smithy/middleware-endpoint": "^4.1.18", - "@smithy/middleware-stack": "^4.0.5", - "@smithy/protocol-http": "^5.1.3", - "@smithy/types": "^4.3.2", - "@smithy/util-stream": "^4.2.4", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/types": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/@smithy/types/-/types-4.3.2.tgz", - "integrity": "sha512-QO4zghLxiQ5W9UZmX2Lo0nta2PuE1sSrXUYDoaB6HMR762C0P7v/HEPHf6ZdglTVssJG1bsrSBxdc3quvDSihw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/url-parser": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/url-parser/-/url-parser-4.0.5.tgz", - "integrity": "sha512-j+733Um7f1/DXjYhCbvNXABV53NyCRRA54C7bNEIxNPs0YjfRxeMKjjgm2jvTYrciZyCjsicHwQ6Q0ylo+NAUw==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/querystring-parser": "^4.0.5", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-base64": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-base64/-/util-base64-4.0.0.tgz", - "integrity": "sha512-CvHfCmO2mchox9kjrtzoHkWHxjHZzaFojLc8quxXY7WAAMAg43nuxwv95tATVgQFNDwd4M9S1qFzj40Ul41Kmg==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-browser": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-browser/-/util-body-length-browser-4.0.0.tgz", - "integrity": "sha512-sNi3DL0/k64/LO3A256M+m3CDdG6V7WKWHdAiBBMUN8S3hK3aMPhwnPik2A/a2ONN+9doY9UxaLfgqsIRg69QA==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-body-length-node": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-body-length-node/-/util-body-length-node-4.0.0.tgz", - "integrity": "sha512-q0iDP3VsZzqJyje8xJWEJCNIu3lktUGVoSy1KB0UWym2CL1siV3artm+u1DFYTLejpsrdGyCSWBdGNjJzfDPjg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-buffer-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-buffer-from/-/util-buffer-from-4.0.0.tgz", - "integrity": "sha512-9TOQ7781sZvddgO8nxueKi3+yGvkY35kotA0Y6BWRajAv8jjmigQ1sBwz0UX47pQMYXJPahSKEKYFgt+rXdcug==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/is-array-buffer": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-config-provider": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-config-provider/-/util-config-provider-4.0.0.tgz", - "integrity": "sha512-L1RBVzLyfE8OXH+1hsJ8p+acNUSirQnWQ6/EgpchV88G6zGBTDPdXiiExei6Z1wR2RxYvxY/XLw6AMNCCt8H3w==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-browser": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-browser/-/util-defaults-mode-browser-4.0.26.tgz", - "integrity": "sha512-xgl75aHIS/3rrGp7iTxQAOELYeyiwBu+eEgAk4xfKwJJ0L8VUjhO2shsDpeil54BOFsqmk5xfdesiewbUY5tKQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/property-provider": "^4.0.5", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "bowser": "^2.11.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-defaults-mode-node": { - "version": "4.0.26", - "resolved": "https://registry.npmjs.org/@smithy/util-defaults-mode-node/-/util-defaults-mode-node-4.0.26.tgz", - "integrity": "sha512-z81yyIkGiLLYVDetKTUeCZQ8x20EEzvQjrqJtb/mXnevLq2+w3XCEWTJ2pMp401b6BkEkHVfXb/cROBpVauLMQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/config-resolver": "^4.1.5", - "@smithy/credential-provider-imds": "^4.0.7", - "@smithy/node-config-provider": "^4.1.4", - "@smithy/property-provider": "^4.0.5", - "@smithy/smithy-client": "^4.4.10", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-endpoints": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-endpoints/-/util-endpoints-3.0.7.tgz", - "integrity": "sha512-klGBP+RpBp6V5JbrY2C/VKnHXn3d5V2YrifZbmMY8os7M6m8wdYFoO6w/fe5VkP+YVwrEktW3IWYaSQVNZJ8oQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/node-config-provider": "^4.1.4", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-hex-encoding": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-hex-encoding/-/util-hex-encoding-4.0.0.tgz", - "integrity": "sha512-Yk5mLhHtfIgW2W2WQZWSg5kuMZCVbvhFmC7rV4IO2QqnZdbEFPmQnCcGMAX2z/8Qj3B9hYYNjZOhWym+RwhePw==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-middleware": { - "version": "4.0.5", - "resolved": "https://registry.npmjs.org/@smithy/util-middleware/-/util-middleware-4.0.5.tgz", - "integrity": "sha512-N40PfqsZHRSsByGB81HhSo+uvMxEHT+9e255S53pfBw/wI6WKDI7Jw9oyu5tJTLwZzV5DsMha3ji8jk9dsHmQQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-retry": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/@smithy/util-retry/-/util-retry-4.0.7.tgz", - "integrity": "sha512-TTO6rt0ppK70alZpkjwy+3nQlTiqNfoXja+qwuAchIEAIoSZW8Qyd76dvBv3I5bCpE38APafG23Y/u270NspiQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/service-error-classification": "^4.0.7", - "@smithy/types": "^4.3.2", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-stream": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/@smithy/util-stream/-/util-stream-4.2.4.tgz", - "integrity": "sha512-vSKnvNZX2BXzl0U2RgCLOwWaAP9x/ddd/XobPK02pCbzRm5s55M53uwb1rl/Ts7RXZvdJZerPkA+en2FDghLuQ==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/fetch-http-handler": "^5.1.1", - "@smithy/node-http-handler": "^4.1.1", - "@smithy/types": "^4.3.2", - "@smithy/util-base64": "^4.0.0", - "@smithy/util-buffer-from": "^4.0.0", - "@smithy/util-hex-encoding": "^4.0.0", - "@smithy/util-utf8": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-uri-escape": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-uri-escape/-/util-uri-escape-4.0.0.tgz", - "integrity": "sha512-77yfbCbQMtgtTylO9itEAdpPXSog3ZxMe09AEhm0dU0NLTalV70ghDZFR+Nfi1C60jnJoh/Re4090/DuZh2Omg==", - "license": "Apache-2.0", - "dependencies": { - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@smithy/util-utf8": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/@smithy/util-utf8/-/util-utf8-4.0.0.tgz", - "integrity": "sha512-b+zebfKCfRdgNJDknHCob3O7FpeYQN6ZG6YLExMcasDHsCXlsXCEuiPZeLnJLpwa5dvPetGlnGCiMHuLwGvFow==", - "license": "Apache-2.0", - "dependencies": { - "@smithy/util-buffer-from": "^4.0.0", - "tslib": "^2.6.2" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@socket.io/component-emitter": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz", - "integrity": "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA==", - "license": "MIT" - }, - "node_modules/@sqltools/formatter": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/@sqltools/formatter/-/formatter-1.2.5.tgz", - "integrity": "sha512-Uy0+khmZqUrUGm5dmMqVlnvufZRSK0FbYzVgp0UMstm+F5+W2/jnEEQyc9vo1ZR/E5ZI/B1WjjoTqBqwJL6Krw==", - "license": "MIT" - }, - "node_modules/@tsconfig/node10": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.11.tgz", - "integrity": "sha512-DcRjDCujK/kCk/cUe8Xz8ZSpm8mS3mNNpta+jGCA6USEDfktlNvm1+IuZ9eTcDbNk41BHwpHHeW+N1lKCz4zOw==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node12": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node14": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tsconfig/node16": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/@tybys/wasm-util": { - "version": "0.10.0", - "resolved": "https://registry.npmjs.org/@tybys/wasm-util/-/wasm-util-0.10.0.tgz", - "integrity": "sha512-VyyPYFlOMNylG45GoAe0xDoLwWuowvf92F9kySqzYh8vmYm7D2u4iUJKa1tOUpS70Ku13ASrOkS4ScXFsTaCNQ==", - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "tslib": "^2.4.0" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.28.0", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.28.0.tgz", - "integrity": "sha512-8PvcXf70gTDZBgt9ptxJ8elBeBjcLOAcOtoO/mPJjtji1+CdGbHgm77om1GrsPxsiE+uXIpNSK64UYaIwQXd4Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.28.2" - } - }, - "node_modules/@types/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/@types/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-/oJGukuH3D2+D+3H4JWLaAsJ/ji86dhRidzZ/Od7H/i8g+aCmvkeCc6Ni/f9uxGLSQVCRZkX2/lqEFG2BvWtlQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/body-parser": { - "version": "1.19.6", - "resolved": "https://registry.npmjs.org/@types/body-parser/-/body-parser-1.19.6.tgz", - "integrity": "sha512-HLFeCYgz89uk22N5Qg3dvGvsv46B8GLvKKo1zKG4NybA8U2DiEO3w9lqGg29t/tfLRJpJ6iQxnVw4OnB7MoM9g==", - "license": "MIT", - "dependencies": { - "@types/connect": "*", - "@types/node": "*" - } - }, - "node_modules/@types/connect": { - "version": "3.4.38", - "resolved": "https://registry.npmjs.org/@types/connect/-/connect-3.4.38.tgz", - "integrity": "sha512-K6uROf1LD88uDQqJCktA4yzL1YYAK6NgfsI0v/mTgyPKWsX1CnJ0XPSDhViejru1GcRkLWb8RlzFYJRqGUbaug==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/cookie-parser": { - "version": "1.4.9", - "resolved": "https://registry.npmjs.org/@types/cookie-parser/-/cookie-parser-1.4.9.tgz", - "integrity": "sha512-tGZiZ2Gtc4m3wIdLkZ8mkj1T6CEHb35+VApbL2T14Dew8HA7c+04dmKqsKRNC+8RJPm16JEK0tFSwdZqubfc4g==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/cookiejar": { - "version": "2.1.5", - "resolved": "https://registry.npmjs.org/@types/cookiejar/-/cookiejar-2.1.5.tgz", - "integrity": "sha512-he+DHOWReW0nghN24E1WUqM0efK4kI9oTqDm6XmK8ZPe2djZ90BSNdGnIyCLzCPw7/pogPlGbzI2wHGGmi4O/Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/cors": { - "version": "2.8.19", - "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.19.tgz", - "integrity": "sha512-mFNylyeyqN93lfe/9CSxOGREz8cpzAhH+E93xJ4xWQf62V8sQ/24reV2nyzUWM6H6Xji+GGHpkbLe7pVoUEskg==", - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, - "node_modules/@types/express": { - "version": "5.0.3", - "resolved": "https://registry.npmjs.org/@types/express/-/express-5.0.3.tgz", - "integrity": "sha512-wGA0NX93b19/dZC1J18tKWVIYWyyF2ZjT9vin/NRu0qzzvfVzWjs04iq2rQ3H65vCTQYlRqs3YHfY7zjdV+9Kw==", - "license": "MIT", - "dependencies": { - "@types/body-parser": "*", - "@types/express-serve-static-core": "^5.0.0", - "@types/serve-static": "*" - } - }, - "node_modules/@types/express-serve-static-core": { - "version": "5.0.7", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-5.0.7.tgz", - "integrity": "sha512-R+33OsgWw7rOhD1emjU7dzCDHucJrgJXMA5PYCzJxVil0dsyx5iBEPHqpPfiKNJQb7lZ1vxwoLR4Z87bBUpeGQ==", - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@types/qs": "*", - "@types/range-parser": "*", - "@types/send": "*" - } - }, - "node_modules/@types/http-errors": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/@types/http-errors/-/http-errors-2.0.5.tgz", - "integrity": "sha512-r8Tayk8HJnX0FztbZN7oVqGccWgw98T/0neJphO91KkmOzug1KkofZURD4UaD5uH8AqcFLfdPErnBod0u71/qg==", - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-coverage": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.6.tgz", - "integrity": "sha512-2QF/t/auWm0lsy8XtKVPG19v3sSOQlJe/YHZgfjb/KBBHOGSV+J2q/S671rcq9uTBrLAXmZpqJiaQbMT+zNU1w==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/istanbul-lib-report": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/@types/istanbul-lib-report/-/istanbul-lib-report-3.0.3.tgz", - "integrity": "sha512-NQn7AHQnk/RSLOxrBbGyJM/aVQ+pjj5HCgasFxc0K/KhoATfQ/47AyUl15I2yBUpihjmas+a+VJBOqecrFH+uA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-coverage": "*" - } - }, - "node_modules/@types/istanbul-reports": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/@types/istanbul-reports/-/istanbul-reports-3.0.4.tgz", - "integrity": "sha512-pk2B1NWalF9toCRu6gjBzR69syFjP4Od8WRAX+0mmf9lAjCRicLOWc+ZrxZHx/0XRjotgkF9t6iaMJ+aXcOdZQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/istanbul-lib-report": "*" - } - }, - "node_modules/@types/jest": { - "version": "30.0.0", - "resolved": "https://registry.npmjs.org/@types/jest/-/jest-30.0.0.tgz", - "integrity": "sha512-XTYugzhuwqWjws0CVz8QpM36+T+Dz5mTEBKhNs/esGLnCIlGdRy+Dq78NRjd7ls7r8BC8ZRMOrKlkO1hU0JOwA==", - "dev": true, - "license": "MIT", - "dependencies": { - "expect": "^30.0.0", - "pretty-format": "^30.0.0" - } - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/jsonwebtoken": { - "version": "9.0.10", - "resolved": "https://registry.npmjs.org/@types/jsonwebtoken/-/jsonwebtoken-9.0.10.tgz", - "integrity": "sha512-asx5hIG9Qmf/1oStypjanR7iKTv0gXQ1Ov/jfrX6kS/EO0OFni8orbmGCn0672NHR3kXHwpAwR+B368ZGN/2rA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/ms": "*", - "@types/node": "*" - } - }, - "node_modules/@types/methods": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/@types/methods/-/methods-1.1.4.tgz", - "integrity": "sha512-ymXWVrDiCxTBE3+RIrrP533E70eA+9qu7zdWoHuOmGujkYtzf4HQF96b8nwHLqhuf4ykX61IGRIB38CC6/sImQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/mime": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/mime/-/mime-1.3.5.tgz", - "integrity": "sha512-/pyBZWSLD2n0dcHE3hq8s8ZvcETHtEuF+3E7XVt0Ig2nvsVQXdghHVcEkIWjy9A0wKfTn97a/PSDYohKIlnP/w==", - "license": "MIT" - }, - "node_modules/@types/ms": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/@types/ms/-/ms-2.1.0.tgz", - "integrity": "sha512-GsCCIZDE/p3i96vtEqx+7dBUGXrc7zeSK3wwPHIaRThS+9OhWIXRqzs4d6k1SVU8g91DrNRWxWUGhp5KXQb2VA==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/multer": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/@types/multer/-/multer-2.0.0.tgz", - "integrity": "sha512-C3Z9v9Evij2yST3RSBktxP9STm6OdMc5uR1xF1SGr98uv8dUlAL2hqwrZ3GVB3uyMyiegnscEK6PGtYvNrjTjw==", - "license": "MIT", - "dependencies": { - "@types/express": "*" - } - }, - "node_modules/@types/node": { - "version": "24.3.3", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.3.3.tgz", - "integrity": "sha512-GKBNHjoNw3Kra1Qg5UXttsY5kiWMEfoHq2TmXb+b1rcm6N7B3wTrFYIf/oSZ1xNQ+hVVijgLkiDZh7jRRsh+Gw==", - "license": "MIT", - "dependencies": { - "undici-types": "~7.10.0" - } - }, - "node_modules/@types/nodemailer": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/@types/nodemailer/-/nodemailer-7.0.1.tgz", - "integrity": "sha512-UfHAghPmGZVzaL8x9y+mKZMWyHC399+iq0MOmya5tIyenWX3lcdSb60vOmp0DocR6gCDTYTozv/ULQnREyyjkg==", - "license": "MIT", - "dependencies": { - "@aws-sdk/client-sesv2": "^3.839.0", - "@types/node": "*" - } - }, - "node_modules/@types/pg": { - "version": "8.15.5", - "resolved": "https://registry.npmjs.org/@types/pg/-/pg-8.15.5.tgz", - "integrity": "sha512-LF7lF6zWEKxuT3/OR8wAZGzkg4ENGXFNyiV/JeOt9z5B+0ZVwbql9McqX5c/WStFq1GaGso7H1AzP/qSzmlCKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "pg-protocol": "*", - "pg-types": "^2.2.0" - } - }, - "node_modules/@types/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-eOunJqu0K1923aExK6y8p6fsihYEn/BYuQ4g0CxAAgFc4b/ZLN4CrsRZ55srTdqoiLzU2B2evC+apEIxprEzkQ==", - "license": "MIT" - }, - "node_modules/@types/range-parser": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/@types/range-parser/-/range-parser-1.2.7.tgz", - "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", - "license": "MIT" - }, - "node_modules/@types/redis": { - "version": "4.0.10", - "resolved": "https://registry.npmjs.org/@types/redis/-/redis-4.0.10.tgz", - "integrity": "sha512-7CLy5b5fzzEGVcOccgZjoMlNpPhX6d10jEeRy2YWbFuaMNrSPc9ExRsMYsd+0VxvEHucf4EWx24Ja7cSU1FGUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "redis": "*" - } - }, - "node_modules/@types/send": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.5.tgz", - "integrity": "sha512-z6F2D3cOStZvuk2SaP6YrwkNO65iTZcwA2ZkSABegdkAh/lf+Aa/YQndZVfmEXT5vgAp6zv06VQ3ejSVjAny4w==", - "license": "MIT", - "dependencies": { - "@types/mime": "^1", - "@types/node": "*" - } - }, - "node_modules/@types/serve-static": { - "version": "1.15.8", - "resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.15.8.tgz", - "integrity": "sha512-roei0UY3LhpOJvjbIP6ZZFngyLKl5dskOtDhxY5THRSpO+ZI+nzJ+m5yUMzGrp89YRa7lvknKkMYjqQFGwA7Sg==", - "license": "MIT", - "dependencies": { - "@types/http-errors": "*", - "@types/node": "*", - "@types/send": "*" - } - }, - "node_modules/@types/socket.io": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/@types/socket.io/-/socket.io-3.0.1.tgz", - "integrity": "sha512-XSma2FhVD78ymvoxYV4xGXrIH/0EKQ93rR+YR0Y+Kw1xbPzLDCip/UWSejZ08FpxYeYNci/PZPQS9anrvJRqMA==", - "dev": true, - "license": "MIT", - "dependencies": { - "socket.io": "*" - } - }, - "node_modules/@types/socket.io-client": { - "version": "1.4.36", - "resolved": "https://registry.npmjs.org/@types/socket.io-client/-/socket.io-client-1.4.36.tgz", - "integrity": "sha512-ZJWjtFBeBy1kRSYpVbeGYTElf6BqPQUkXDlHHD4k/42byCN5Rh027f4yARHCink9sKAkbtGZXEAmR0ZCnc2/Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/stack-utils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz", - "integrity": "sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/superagent": { - "version": "8.1.9", - "resolved": "https://registry.npmjs.org/@types/superagent/-/superagent-8.1.9.tgz", - "integrity": "sha512-pTVjI73witn+9ILmoJdajHGW2jkSaOzhiFYF1Rd3EQ94kymLqB9PjD9ISg7WaALC7+dCHT0FGe9T2LktLq/3GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/cookiejar": "^2.1.5", - "@types/methods": "^1.1.4", - "@types/node": "*", - "form-data": "^4.0.0" - } - }, - "node_modules/@types/supertest": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/@types/supertest/-/supertest-6.0.3.tgz", - "integrity": "sha512-8WzXq62EXFhJ7QsH3Ocb/iKQ/Ty9ZVWnVzoTKc9tyyFRRF3a74Tk2+TLFgaFFw364Ere+npzHKEJ6ga2LzIL7w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/methods": "^1.1.4", - "@types/superagent": "^8.1.0" - } - }, - "node_modules/@types/swagger-jsdoc": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/@types/swagger-jsdoc/-/swagger-jsdoc-6.0.4.tgz", - "integrity": "sha512-W+Xw5epcOZrF/AooUM/PccNMSAFOKWZA5dasNyMujTwsBkU74njSJBpvCCJhHAJ95XRMzQrrW844Btu0uoetwQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@types/swagger-ui-express": { - "version": "4.1.8", - "resolved": "https://registry.npmjs.org/@types/swagger-ui-express/-/swagger-ui-express-4.1.8.tgz", - "integrity": "sha512-AhZV8/EIreHFmBV5wAs0gzJUNq9JbbSXgJLQubCC0jtIo6prnI9MIRRxnU4MZX9RB9yXxF1V4R7jtLl/Wcj31g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/express": "*", - "@types/serve-static": "*" - } - }, - "node_modules/@types/triple-beam": { - "version": "1.3.5", - "resolved": "https://registry.npmjs.org/@types/triple-beam/-/triple-beam-1.3.5.tgz", - "integrity": "sha512-6WaYesThRMCl19iryMYP7/x2OVgCtbIVflDGFpWnb9irXI3UjYE4AzmYuiUKY1AJstGijoY+MgUszMgRxIYTYw==", - "license": "MIT" - }, - "node_modules/@types/uuid": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-10.0.0.tgz", - "integrity": "sha512-7gqG38EyHgyP1S+7+xomFtL+ZNHcKv6DwNaCZmJmo1vgMugyF3TCnXVg4t1uk89mLNwnLtnY3TpOpCOyp1/xHQ==", - "license": "MIT" - }, - "node_modules/@types/yargs": { - "version": "17.0.33", - "resolved": "https://registry.npmjs.org/@types/yargs/-/yargs-17.0.33.tgz", - "integrity": "sha512-WpxBCKWPLr4xSsHgz511rFJAM+wS28w2zEO1QDNY5zM/S8ok70NNfztH0xwhqKyaK0OHCbN98LDAZuy1ctxDkA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/yargs-parser": "*" - } - }, - "node_modules/@types/yargs-parser": { - "version": "21.0.3", - "resolved": "https://registry.npmjs.org/@types/yargs-parser/-/yargs-parser-21.0.3.tgz", - "integrity": "sha512-I4q9QU9MQv4oEOz4tAHJtNz1cwuLxn2F3xcc2iV5WdqLPpUnj30aUuxt1mAxYTG+oe8CZMV/+6rU4S4gRDzqtQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/@ungap/structured-clone": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.3.0.tgz", - "integrity": "sha512-WmoN8qaIAo7WTYWbAZuG8PYEhn5fkz7dZrqTBZ7dtt//lL2Gwms1IcnQ5yHqjDfX8Ft5j4YzDM23f87zBfDe9g==", - "dev": true, - "license": "ISC" - }, - "node_modules/@unrs/resolver-binding-android-arm-eabi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm-eabi/-/resolver-binding-android-arm-eabi-1.11.1.tgz", - "integrity": "sha512-ppLRUgHVaGRWUx0R0Ut06Mjo9gBaBkg3v/8AxusGLhsIotbBLuRk51rAzqLC8gq6NyyAojEXglNjzf6R948DNw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-android-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-android-arm64/-/resolver-binding-android-arm64-1.11.1.tgz", - "integrity": "sha512-lCxkVtb4wp1v+EoN+HjIG9cIIzPkX5OtM03pQYkG+U5O/wL53LC4QbIeazgiKqluGeVEeBlZahHalCaBvU1a2g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-arm64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-arm64/-/resolver-binding-darwin-arm64-1.11.1.tgz", - "integrity": "sha512-gPVA1UjRu1Y/IsB/dQEsp2V1pm44Of6+LWvbLc9SDk1c2KhhDRDBUkQCYVWe6f26uJb3fOK8saWMgtX8IrMk3g==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-darwin-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-darwin-x64/-/resolver-binding-darwin-x64-1.11.1.tgz", - "integrity": "sha512-cFzP7rWKd3lZaCsDze07QX1SC24lO8mPty9vdP+YVa3MGdVgPmFc59317b2ioXtgCMKGiCLxJ4HQs62oz6GfRQ==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@unrs/resolver-binding-freebsd-x64": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-freebsd-x64/-/resolver-binding-freebsd-x64-1.11.1.tgz", - "integrity": "sha512-fqtGgak3zX4DCB6PFpsH5+Kmt/8CIi4Bry4rb1ho6Av2QHTREM+47y282Uqiu3ZRF5IQioJQ5qWRV6jduA+iGw==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-gnueabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-gnueabihf/-/resolver-binding-linux-arm-gnueabihf-1.11.1.tgz", - "integrity": "sha512-u92mvlcYtp9MRKmP+ZvMmtPN34+/3lMHlyMj7wXJDeXxuM0Vgzz0+PPJNsro1m3IZPYChIkn944wW8TYgGKFHw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm-musleabihf": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm-musleabihf/-/resolver-binding-linux-arm-musleabihf-1.11.1.tgz", - "integrity": "sha512-cINaoY2z7LVCrfHkIcmvj7osTOtm6VVT16b5oQdS4beibX2SYBwgYLmqhBjA1t51CarSaBuX5YNsWLjsqfW5Cw==", - "cpu": [ - "arm" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-gnu/-/resolver-binding-linux-arm64-gnu-1.11.1.tgz", - "integrity": "sha512-34gw7PjDGB9JgePJEmhEqBhWvCiiWCuXsL9hYphDF7crW7UgI05gyBAi6MF58uGcMOiOqSJ2ybEeCvHcq0BCmQ==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-arm64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-arm64-musl/-/resolver-binding-linux-arm64-musl-1.11.1.tgz", - "integrity": "sha512-RyMIx6Uf53hhOtJDIamSbTskA99sPHS96wxVE/bJtePJJtpdKGXO1wY90oRdXuYOGOTuqjT8ACccMc4K6QmT3w==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-ppc64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-ppc64-gnu/-/resolver-binding-linux-ppc64-gnu-1.11.1.tgz", - "integrity": "sha512-D8Vae74A4/a+mZH0FbOkFJL9DSK2R6TFPC9M+jCWYia/q2einCubX10pecpDiTmkJVUH+y8K3BZClycD8nCShA==", - "cpu": [ - "ppc64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-gnu/-/resolver-binding-linux-riscv64-gnu-1.11.1.tgz", - "integrity": "sha512-frxL4OrzOWVVsOc96+V3aqTIQl1O2TjgExV4EKgRY09AJ9leZpEg8Ak9phadbuX0BA4k8U5qtvMSQQGGmaJqcQ==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-riscv64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-riscv64-musl/-/resolver-binding-linux-riscv64-musl-1.11.1.tgz", - "integrity": "sha512-mJ5vuDaIZ+l/acv01sHoXfpnyrNKOk/3aDoEdLO/Xtn9HuZlDD6jKxHlkN8ZhWyLJsRBxfv9GYM2utQ1SChKew==", - "cpu": [ - "riscv64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-s390x-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-s390x-gnu/-/resolver-binding-linux-s390x-gnu-1.11.1.tgz", - "integrity": "sha512-kELo8ebBVtb9sA7rMe1Cph4QHreByhaZ2QEADd9NzIQsYNQpt9UkM9iqr2lhGr5afh885d/cB5QeTXSbZHTYPg==", - "cpu": [ - "s390x" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-gnu": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-gnu/-/resolver-binding-linux-x64-gnu-1.11.1.tgz", - "integrity": "sha512-C3ZAHugKgovV5YvAMsxhq0gtXuwESUKc5MhEtjBpLoHPLYM+iuwSj3lflFwK3DPm68660rZ7G8BMcwSro7hD5w==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-linux-x64-musl": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-linux-x64-musl/-/resolver-binding-linux-x64-musl-1.11.1.tgz", - "integrity": "sha512-rV0YSoyhK2nZ4vEswT/QwqzqQXw5I6CjoaYMOX0TqBlWhojUf8P94mvI7nuJTeaCkkds3QE4+zS8Ko+GdXuZtA==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@unrs/resolver-binding-wasm32-wasi": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-wasm32-wasi/-/resolver-binding-wasm32-wasi-1.11.1.tgz", - "integrity": "sha512-5u4RkfxJm+Ng7IWgkzi3qrFOvLvQYnPBmjmZQ8+szTK/b31fQCnleNl1GgEt7nIsZRIf5PLhPwT0WM+q45x/UQ==", - "cpu": [ - "wasm32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "dependencies": { - "@napi-rs/wasm-runtime": "^0.2.11" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@unrs/resolver-binding-win32-arm64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-arm64-msvc/-/resolver-binding-win32-arm64-msvc-1.11.1.tgz", - "integrity": "sha512-nRcz5Il4ln0kMhfL8S3hLkxI85BXs3o8EYoattsJNdsX4YUU89iOkVn7g0VHSRxFuVMdM4Q1jEpIId1Ihim/Uw==", - "cpu": [ - "arm64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-ia32-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-ia32-msvc/-/resolver-binding-win32-ia32-msvc-1.11.1.tgz", - "integrity": "sha512-DCEI6t5i1NmAZp6pFonpD5m7i6aFrpofcp4LA2i8IIq60Jyo28hamKBxNrZcyOwVOZkgsRp9O2sXWBWP8MnvIQ==", - "cpu": [ - "ia32" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@unrs/resolver-binding-win32-x64-msvc": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/@unrs/resolver-binding-win32-x64-msvc/-/resolver-binding-win32-x64-msvc-1.11.1.tgz", - "integrity": "sha512-lrW200hZdbfRtztbygyaq/6jP6AKE8qQN2KvPcJ+x7wiD038YtnYtZ82IMNJ69GJibV7bwL3y9FgK+5w/pYt6g==", - "cpu": [ - "x64" - ], - "dev": true, - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@zxing/text-encoding": { - "version": "0.9.0", - "resolved": "https://registry.npmjs.org/@zxing/text-encoding/-/text-encoding-0.9.0.tgz", - "integrity": "sha512-U/4aVJ2mxI0aDNI8Uq0wEhMgY+u4CNtEb0om3+y3+niDAsoTCOB33UF0sxpzqzdqXLqmvc+vZyAt4O8pPdfkwA==", - "license": "(Unlicense OR Apache-2.0)", - "optional": true - }, - "node_modules/accepts": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-2.0.0.tgz", - "integrity": "sha512-5cvg6CtKwfgdmVqY1WIiXKc3Q1bkRqGLi+2W/6ao+6Y7gu/RCwRuAhGEzh5B4KlszSuTLgZYuqFqo5bImjNKng==", - "license": "MIT", - "dependencies": { - "mime-types": "^3.0.0", - "negotiator": "^1.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "devOptional": true, - "license": "MIT", - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-walk": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.4.tgz", - "integrity": "sha512-ueEepnujpqee2o5aIYnvHU6C0A42MNdsIDeqy5BydrkuC5R1ZuUFnm27EeFJGoEHJQgn3uleRvmTXaJgfXbt4g==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "acorn": "^8.11.0" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/ansi-escapes": { - "version": "4.3.2", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz", - "integrity": "sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "type-fest": "^0.21.3" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ansi-regex": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.2.0.tgz", - "integrity": "sha512-TKY5pyBkHyADOPYlRT9Lx6F544mPl0vS5Ew7BJ45hA08Q+t3GjbueLliBWN3sMICk6+y7HdyxSzC4bWS8baBdg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/ansis": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/ansis/-/ansis-3.17.0.tgz", - "integrity": "sha512-0qWUglt9JEqLFr3w1I1pbrChn1grhaiAR2ocX1PP/flRmxgtwTzPFFFnfIlD6aMOLQZgSuCRlidD70lvx8yhzg==", - "license": "ISC", - "engines": { - "node": ">=14" - } - }, - "node_modules/anymatch": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", - "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "normalize-path": "^3.0.0", - "picomatch": "^2.0.4" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/app-root-path": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/app-root-path/-/app-root-path-3.1.0.tgz", - "integrity": "sha512-biN3PwB2gUtjaYy/isrU3aNWI5w+fAfvHkSvCKeQGxhmYpwKFUxudR3Yya+KqVRHBmEDYh+/lTozYCFbmzX4nA==", - "license": "MIT", - "engines": { - "node": ">= 6.0.0" - } - }, - "node_modules/append-field": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/append-field/-/append-field-1.0.0.tgz", - "integrity": "sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==", - "license": "MIT" - }, - "node_modules/arg": { - "version": "4.1.3", - "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/asap": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", - "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", - "dev": true, - "license": "MIT" - }, - "node_modules/async": { - "version": "3.2.6", - "resolved": "https://registry.npmjs.org/async/-/async-3.2.6.tgz", - "integrity": "sha512-htCUDlxyyCLMgaM3xXg0C0LW2xqfuQ6p05pCEIsXuyQ+a1koYKTuBMzRNwmybfLgvJDMd0r1LTn4+E0Ti6C2AA==", - "license": "MIT" - }, - "node_modules/asynckit": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/asynckit/-/asynckit-0.4.0.tgz", - "integrity": "sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/available-typed-arrays": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/available-typed-arrays/-/available-typed-arrays-1.0.7.tgz", - "integrity": "sha512-wvUjBtSGN7+7SjNpq/9M2Tg350UZD3q62IFZLbRAR1bSMlCo1ZaeW+BJ+D090e4hIIZLBcTDWe4Mh4jvUDajzQ==", - "license": "MIT", - "dependencies": { - "possible-typed-array-names": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/babel-jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-30.0.5.tgz", - "integrity": "sha512-mRijnKimhGDMsizTvBTWotwNpzrkHr+VvZUQBof2AufXKB8NXrL1W69TG20EvOz7aevx6FTJIaBuBkYxS8zolg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/transform": "30.0.5", - "@types/babel__core": "^7.20.5", - "babel-plugin-istanbul": "^7.0.0", - "babel-preset-jest": "30.0.1", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "slash": "^3.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/babel-plugin-istanbul": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-7.0.0.tgz", - "integrity": "sha512-C5OzENSx/A+gt7t4VH1I2XsflxyPUmXRFPKBxt33xncdOmq7oROVM3bZv9Ysjjkv8OJYDMa+tKuKMvqU/H3xdw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-instrument": "^6.0.2", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/babel-plugin-jest-hoist": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-plugin-jest-hoist/-/babel-plugin-jest-hoist-30.0.1.tgz", - "integrity": "sha512-zTPME3pI50NsFW8ZBaVIOeAxzEY7XHlmWeXXu9srI+9kNfzCUTy8MFan46xOGZY8NZThMqq+e3qZUKsvXbasnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.2", - "@babel/types": "^7.27.3", - "@types/babel__core": "^7.20.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/babel-preset-current-node-syntax": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/babel-preset-current-node-syntax/-/babel-preset-current-node-syntax-1.2.0.tgz", - "integrity": "sha512-E/VlAEzRrsLEb2+dv8yp3bo4scof3l9nR4lrld+Iy5NyVqgVYUJnDAmunkhPMisRI32Qc4iRiz425d8vM++2fg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/plugin-syntax-async-generators": "^7.8.4", - "@babel/plugin-syntax-bigint": "^7.8.3", - "@babel/plugin-syntax-class-properties": "^7.12.13", - "@babel/plugin-syntax-class-static-block": "^7.14.5", - "@babel/plugin-syntax-import-attributes": "^7.24.7", - "@babel/plugin-syntax-import-meta": "^7.10.4", - "@babel/plugin-syntax-json-strings": "^7.8.3", - "@babel/plugin-syntax-logical-assignment-operators": "^7.10.4", - "@babel/plugin-syntax-nullish-coalescing-operator": "^7.8.3", - "@babel/plugin-syntax-numeric-separator": "^7.10.4", - "@babel/plugin-syntax-object-rest-spread": "^7.8.3", - "@babel/plugin-syntax-optional-catch-binding": "^7.8.3", - "@babel/plugin-syntax-optional-chaining": "^7.8.3", - "@babel/plugin-syntax-private-property-in-object": "^7.14.5", - "@babel/plugin-syntax-top-level-await": "^7.14.5" - }, - "peerDependencies": { - "@babel/core": "^7.0.0 || ^8.0.0-0" - } - }, - "node_modules/babel-preset-jest": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/babel-preset-jest/-/babel-preset-jest-30.0.1.tgz", - "integrity": "sha512-+YHejD5iTWI46cZmcc/YtX4gaKBtdqCHCVfuVinizVpbmyjO3zYmeuyFdfA8duRqQZfgCAMlsfmkVbJ+e2MAJw==", - "dev": true, - "license": "MIT", - "dependencies": { - "babel-plugin-jest-hoist": "30.0.1", - "babel-preset-current-node-syntax": "^1.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@babel/core": "^7.11.0" - } - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "license": "MIT" - }, - "node_modules/base64-js": { - "version": "1.5.1", - "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", - "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/base64id": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", - "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", - "license": "MIT", - "engines": { - "node": "^4.5.0 || >= 5.9" - } - }, - "node_modules/bcrypt": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/bcrypt/-/bcrypt-6.0.0.tgz", - "integrity": "sha512-cU8v/EGSrnH+HnxV2z0J7/blxH8gq7Xh2JFT6Aroax7UohdmiJJlxApMxtKfuI7z68NvvVcmR78k2LbT6efhRg==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "node-addon-api": "^8.3.0", - "node-gyp-build": "^4.8.4" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/binary-extensions": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", - "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/block-stream2": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/block-stream2/-/block-stream2-2.1.0.tgz", - "integrity": "sha512-suhjmLI57Ewpmq00qaygS8UgEq2ly2PCItenIyhMqVjo4t4pGzqMvfgJuX8iWTeSDdfSSqS6j38fL4ToNL7Pfg==", - "license": "MIT", - "dependencies": { - "readable-stream": "^3.4.0" - } - }, - "node_modules/body-parser": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.2.0.tgz", - "integrity": "sha512-02qvAaxv8tp7fBa/mw1ga98OGm+eCbqzJOKoRt70sLmfEEi+jyBYVTDGfCL/k06/4EMk/z01gCe7HoCH/f2LTg==", - "license": "MIT", - "dependencies": { - "bytes": "^3.1.2", - "content-type": "^1.0.5", - "debug": "^4.4.0", - "http-errors": "^2.0.0", - "iconv-lite": "^0.6.3", - "on-finished": "^2.4.1", - "qs": "^6.14.0", - "raw-body": "^3.0.0", - "type-is": "^2.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/bowser": { - "version": "2.12.0", - "resolved": "https://registry.npmjs.org/bowser/-/bowser-2.12.0.tgz", - "integrity": "sha512-HcOcTudTeEWgbHh0Y1Tyb6fdeR71m4b/QACf0D4KswGTsNeIJQmg38mRENZPAYPZvGFN3fk3604XbQEPdxXdKg==", - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.2.tgz", - "integrity": "sha512-Jt0vHyM+jmUBqojB7E1NIYadt0vI0Qxjxd2TErW94wDz+E2LAm5vKMXXwg6ZZBTHPuUlDgQHKXvjGBdfcF1ZDQ==", - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/braces": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", - "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", - "dev": true, - "license": "MIT", - "dependencies": { - "fill-range": "^7.1.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/browser-or-node": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/browser-or-node/-/browser-or-node-2.1.1.tgz", - "integrity": "sha512-8CVjaLJGuSKMVTxJ2DpBl5XnlNDiT4cQFeuCJJrvJmts9YrTZDizTX7PjC2s6W4x+MBGZeEY6dGMrF04/6Hgqg==", - "license": "MIT" - }, - "node_modules/browserslist": { - "version": "4.25.3", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.3.tgz", - "integrity": "sha512-cDGv1kkDI4/0e5yON9yM5G/0A5u8sf5TnmdX5C9qHzI9PPu++sQ9zjm1k9NiOrf3riY4OkK0zSGqfvJyJsgCBQ==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001735", - "electron-to-chromium": "^1.5.204", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/bs-logger": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/bs-logger/-/bs-logger-0.2.6.tgz", - "integrity": "sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-json-stable-stringify": "2.x" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/bser": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/bser/-/bser-2.1.1.tgz", - "integrity": "sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "node-int64": "^0.4.0" - } - }, - "node_modules/buffer": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz", - "integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT", - "dependencies": { - "base64-js": "^1.3.1", - "ieee754": "^1.2.1" - } - }, - "node_modules/buffer-crc32": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-1.0.0.tgz", - "integrity": "sha512-Db1SbgBS/fg/392AblrMJk97KggmvYhr4pB5ZIMTWtaivCPMWLkmb7m21cJvpvgK+J3nsU2CmmixNBZx4vFj/w==", - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/buffer-equal-constant-time": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/buffer-equal-constant-time/-/buffer-equal-constant-time-1.0.1.tgz", - "integrity": "sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==", - "license": "BSD-3-Clause" - }, - "node_modules/buffer-from": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", - "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", - "license": "MIT" - }, - "node_modules/busboy": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/busboy/-/busboy-1.6.0.tgz", - "integrity": "sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==", - "dependencies": { - "streamsearch": "^1.1.0" - }, - "engines": { - "node": ">=10.16.0" - } - }, - "node_modules/bytes": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", - "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/call-bind": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/call-bind/-/call-bind-1.0.8.tgz", - "integrity": "sha512-oKlSFMcMwpUg2ednkhQ454wfWiU/ul3CkJe/PEHcTKuiX6RpbehUiFMXu13HalGZxfUwCQzZG747YXBn1im9ww==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.0", - "es-define-property": "^1.0.0", - "get-intrinsic": "^1.2.4", - "set-function-length": "^1.2.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-bind-apply-helpers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-bind-apply-helpers/-/call-bind-apply-helpers-1.0.2.tgz", - "integrity": "sha512-Sp1ablJ0ivDkSzjcaJdxEunN5/XvksFJ2sMBFfq6x0ryhQV/2b/KwFe21cMpmHtPOSij8K99/wSfoEuTObmuMQ==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/call-bound": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/call-bound/-/call-bound-1.0.4.tgz", - "integrity": "sha512-+ys997U96po4Kx/ABpBCqhA9EuxJaQWDQg7295H4hBphv3IZg0boBKuwYpt4YXp6MZ5AmZQnU/tyMTlRpaSejg==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "get-intrinsic": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/call-me-maybe": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/call-me-maybe/-/call-me-maybe-1.0.2.tgz", - "integrity": "sha512-HpX65o1Hnr9HH25ojC1YGs7HCQLq0GCOibSaWER0eNpgJ/Z1MZv2mTc7+xh6WOPxbRVcmgbv4hGU+uSQ/2xFZQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001735", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001735.tgz", - "integrity": "sha512-EV/laoX7Wq2J9TQlyIXRxTJqIw4sxfXS4OYgudGxBYRuTv0q7AM6yMEpU/Vo1I94thg9U6EZ2NfZx9GJq83u7w==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chalk/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/chalk/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/chalk/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/char-regex": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", - "integrity": "sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/chokidar": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", - "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "anymatch": "~3.1.2", - "braces": "~3.0.2", - "glob-parent": "~5.1.2", - "is-binary-path": "~2.1.0", - "is-glob": "~4.0.1", - "normalize-path": "~3.0.0", - "readdirp": "~3.6.0" - }, - "engines": { - "node": ">= 8.10.0" - }, - "funding": { - "url": "https://paulmillr.com/funding/" - }, - "optionalDependencies": { - "fsevents": "~2.3.2" - } - }, - "node_modules/ci-info": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-4.3.0.tgz", - "integrity": "sha512-l+2bNRMiQgcfILUi33labAZYIWlH1kWDp+ecNo5iisRKrbm0xcRyCww71/YU0Fkw0mAFpz9bJayXPjey6vkmaQ==", - "dev": true, - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/sibiraj-s" - } - ], - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cjs-module-lexer": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-2.1.0.tgz", - "integrity": "sha512-UX0OwmYRYQQetfrLEZeewIFFI+wSTofC+pMBLNuH3RUuu/xzG1oz84UCEDOSoQlN3fZ4+AzmV50ZYvGqkMh9yA==", - "dev": true, - "license": "MIT" - }, - "node_modules/cliui": { - "version": "8.0.1", - "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", - "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", - "license": "ISC", - "dependencies": { - "string-width": "^4.2.0", - "strip-ansi": "^6.0.1", - "wrap-ansi": "^7.0.0" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/cliui/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/cliui/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/cliui/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/cliui/node_modules/wrap-ansi": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/cluster-key-slot": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/cluster-key-slot/-/cluster-key-slot-1.1.2.tgz", - "integrity": "sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==", - "license": "Apache-2.0", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/co": { - "version": "4.6.0", - "resolved": "https://registry.npmjs.org/co/-/co-4.6.0.tgz", - "integrity": "sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==", - "dev": true, - "license": "MIT", - "engines": { - "iojs": ">= 1.0.0", - "node": ">= 0.12.0" - } - }, - "node_modules/collect-v8-coverage": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/collect-v8-coverage/-/collect-v8-coverage-1.0.2.tgz", - "integrity": "sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/color": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/color/-/color-3.2.1.tgz", - "integrity": "sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.3", - "color-string": "^1.6.0" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "license": "MIT" - }, - "node_modules/color-string": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/color-string/-/color-string-1.9.1.tgz", - "integrity": "sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==", - "license": "MIT", - "dependencies": { - "color-name": "^1.0.0", - "simple-swizzle": "^0.2.2" - } - }, - "node_modules/color/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/color/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/colorspace": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/colorspace/-/colorspace-1.1.4.tgz", - "integrity": "sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==", - "license": "MIT", - "dependencies": { - "color": "^3.1.3", - "text-hex": "1.0.x" - } - }, - "node_modules/combined-stream": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/combined-stream/-/combined-stream-1.0.8.tgz", - "integrity": "sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==", - "dev": true, - "license": "MIT", - "dependencies": { - "delayed-stream": "~1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/commander": { - "version": "6.2.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-6.2.0.tgz", - "integrity": "sha512-zP4jEKbe8SHzKJYQmq8Y9gYjtO/POJLgIdKgV7B9qNmABVFVc+ctqSX6iXh4mCpJfRBOabiZ2YKPg8ciDw6C+Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/component-emitter": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/component-emitter/-/component-emitter-1.3.1.tgz", - "integrity": "sha512-T0+barUSQRTUQASh8bx02dl+DhF54GtIDY13Y3m9oWTklKbb3Wv974meRpeZ3lp1JpLVECWWNHC4vaG2XHXouQ==", - "dev": true, - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", - "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", - "engines": [ - "node >= 6.0" - ], - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "inherits": "^2.0.3", - "readable-stream": "^3.0.2", - "typedarray": "^0.0.6" - } - }, - "node_modules/content-disposition": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-1.0.0.tgz", - "integrity": "sha512-Au9nRL8VNUut/XSzbQA38+M78dzP4D+eqg3gfJHMIHHYa3bg067xj1KxMUWj+VULbiZMowKngFFbKczUrNJ1mg==", - "license": "MIT", - "dependencies": { - "safe-buffer": "5.2.1" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/content-type": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.5.tgz", - "integrity": "sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cookie": { - "version": "0.7.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.2.tgz", - "integrity": "sha512-yki5XnKuf750l50uGTllt6kKILY4nQ1eNIQatoXEByZ5dWgnKqbnqmTrBE5B4N7lrMJKQ2ytWMiTO2o0v6Ew/w==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/cookie-parser": { - "version": "1.4.7", - "resolved": "https://registry.npmjs.org/cookie-parser/-/cookie-parser-1.4.7.tgz", - "integrity": "sha512-nGUvgXnotP3BsjiLX2ypbQnWoGUPIIfHQNZkkC668ntrzGWEZVW70HDEB1qnNGMicPje6EttlIgzo51YSwNQGw==", - "license": "MIT", - "dependencies": { - "cookie": "0.7.2", - "cookie-signature": "1.0.6" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/cookie-signature": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", - "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", - "license": "MIT" - }, - "node_modules/cookiejar": { - "version": "2.1.4", - "resolved": "https://registry.npmjs.org/cookiejar/-/cookiejar-2.1.4.tgz", - "integrity": "sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==", - "dev": true, - "license": "MIT" - }, - "node_modules/cors": { - "version": "2.8.5", - "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", - "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", - "license": "MIT", - "dependencies": { - "object-assign": "^4", - "vary": "^1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/create-require": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "license": "MIT", - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/dayjs": { - "version": "1.11.13", - "resolved": "https://registry.npmjs.org/dayjs/-/dayjs-1.11.13.tgz", - "integrity": "sha512-oaMBel6gjolK862uaPQOVTA7q3TZhuSvuMQAAglQDOWYO9A91IrAOUJEyKVlqJlHE0vq5p5UXxzdPfMH/x6xNg==", - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/decode-uri-component": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/decode-uri-component/-/decode-uri-component-0.2.2.tgz", - "integrity": "sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==", - "license": "MIT", - "engines": { - "node": ">=0.10" - } - }, - "node_modules/dedent": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/dedent/-/dedent-1.6.0.tgz", - "integrity": "sha512-F1Z+5UCFpmQUzJa11agbyPVMbpgT/qA3/SKyJ1jyBgm7dUcUEa8v9JwDkerSQXfakBwFljIxhOJqGkjUwZ9FSA==", - "license": "MIT", - "peerDependencies": { - "babel-plugin-macros": "^3.1.0" - }, - "peerDependenciesMeta": { - "babel-plugin-macros": { - "optional": true - } - } - }, - "node_modules/deepmerge": { - "version": "4.3.1", - "resolved": "https://registry.npmjs.org/deepmerge/-/deepmerge-4.3.1.tgz", - "integrity": "sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/define-data-property": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/define-data-property/-/define-data-property-1.1.4.tgz", - "integrity": "sha512-rBMvIzlpA8v6E+SJZoo++HAYqsLrkg7MSfIinMPFhmkorw7X+dOXVJQs+QT69zGkzMyfDnIMN2Wid1+NbL3T+A==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0", - "es-errors": "^1.3.0", - "gopd": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/delayed-stream": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", - "integrity": "sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/depd": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/depd/-/depd-2.0.0.tgz", - "integrity": "sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/detect-newline": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/detect-newline/-/detect-newline-3.1.0.tgz", - "integrity": "sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/dezalgo": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", - "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", - "dev": true, - "license": "ISC", - "dependencies": { - "asap": "^2.0.0", - "wrappy": "1" - } - }, - "node_modules/diff": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", - "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", - "devOptional": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.3.1" - } - }, - "node_modules/doctrine": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", - "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "esutils": "^2.0.2" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/dotenv": { - "version": "16.6.1", - "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-16.6.1.tgz", - "integrity": "sha512-uBq4egWHTcTt33a72vpSG0z3HnPuIl6NqYcTrKEg2azoEyl2hpW0zqlxysq2pK9HlDIHyHyakeYaYnSAwd8bow==", - "license": "BSD-2-Clause", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://dotenvx.com" - } - }, - "node_modules/dunder-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", - "integrity": "sha512-KIN/nDJBQRcXw0MLVhZE9iQHmG68qAVIBg9CqmUYjmQIhgij9U5MFvrqkUL5FbtyyzZuOeOt0zdeRe4UY7ct+A==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.1", - "es-errors": "^1.3.0", - "gopd": "^1.2.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, - "node_modules/ecdsa-sig-formatter": { - "version": "1.0.11", - "resolved": "https://registry.npmjs.org/ecdsa-sig-formatter/-/ecdsa-sig-formatter-1.0.11.tgz", - "integrity": "sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==", - "license": "Apache-2.0", - "dependencies": { - "safe-buffer": "^5.0.1" - } - }, - "node_modules/ee-first": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", - "integrity": "sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==", - "license": "MIT" - }, - "node_modules/electron-to-chromium": { - "version": "1.5.207", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.207.tgz", - "integrity": "sha512-mryFrrL/GXDTmAtIVMVf+eIXM09BBPlO5IQ7lUyKmK8d+A4VpRGG+M3ofoVef6qyF8s60rJei8ymlJxjUA8Faw==", - "dev": true, - "license": "ISC" - }, - "node_modules/emittery": { - "version": "0.13.1", - "resolved": "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz", - "integrity": "sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sindresorhus/emittery?sponsor=1" - } - }, - "node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/enabled": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/enabled/-/enabled-2.0.0.tgz", - "integrity": "sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==", - "license": "MIT" - }, - "node_modules/encodeurl": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-2.0.0.tgz", - "integrity": "sha512-Q0n9HRi4m6JuGIV1eFlmvJB7ZEVxu93IrMyiMsGC0lrMJMWzRgx6WGquyfQgZVb31vhGgXnfmPNNXmxnOkRBrg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/engine.io": { - "version": "6.6.4", - "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.6.4.tgz", - "integrity": "sha512-ZCkIjSYNDyGn0R6ewHDtXgns/Zre/NT6Agvq1/WobF7JXgFff4SeDroKiCO3fNJreU9YG429Sc81o4w5ok/W5g==", - "license": "MIT", - "dependencies": { - "@types/cors": "^2.8.12", - "@types/node": ">=10.0.0", - "accepts": "~1.3.4", - "base64id": "2.0.0", - "cookie": "~0.7.2", - "cors": "~2.8.5", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/engine.io-client": { - "version": "6.6.3", - "resolved": "https://registry.npmjs.org/engine.io-client/-/engine.io-client-6.6.3.tgz", - "integrity": "sha512-T0iLjnyNWahNyv/lcjS2y4oE358tVS/SYQNxYXGAJ9/GLgH4VCvOQ/mhTjqU88mLZCQgiG8RIegFHYCdVC+j5w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1", - "engine.io-parser": "~5.2.1", - "ws": "~8.17.1", - "xmlhttprequest-ssl": "~2.1.1" - } - }, - "node_modules/engine.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io-parser": { - "version": "5.2.3", - "resolved": "https://registry.npmjs.org/engine.io-parser/-/engine.io-parser-5.2.3.tgz", - "integrity": "sha512-HqD3yTBfnBxIrbnM1DoD6Pcq8NECnh8d4As1Qgh0z5Gg3jRRIqijury0CL3ghu/edArpUYiYqQiDUQBIs4np3Q==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/engine.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/engine.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/engine.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/error-ex": { - "version": "1.3.2", - "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", - "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.2.1" - } - }, - "node_modules/error-ex/node_modules/is-arrayish": { - "version": "0.2.1", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", - "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", - "dev": true, - "license": "MIT" - }, - "node_modules/es-define-property": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.1.tgz", - "integrity": "sha512-e3nRfgfUZ4rNGL232gUgX06QNyyez04KdjFrF+LTRoOXmrOgFKDg4BCdsjW8EnT69eqdYGmRpJwiPVYNrCaW3g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-errors": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/es-errors/-/es-errors-1.3.0.tgz", - "integrity": "sha512-Zf5H2Kxt2xjTvbJvP2ZWLEICxA6j+hAmMzIlypy4xcBg1vKVnx89Wy0GbS+kf5cwCVFFzdCFh2XSCFNULS6csw==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-object-atoms": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.1.1.tgz", - "integrity": "sha512-FGgH2h8zKNim9ljj7dankFPcICIK9Cp5bm+c2gQSYePhpaG5+esrLODihIorn+Pe6FGJzWhXQotPv73jTaldXA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/es-set-tostringtag": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.1.0.tgz", - "integrity": "sha512-j6vWzfrGVfyXxge+O0x5sh6cvxAog0a/4Rdd2K36zCMV5eJ+/+tOAngRO8cODMNWbVRdVlmGZQL2YS3yR8bIUA==", - "dev": true, - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.6", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-html": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", - "integrity": "sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==", - "license": "MIT" - }, - "node_modules/escape-string-regexp": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-2.0.0.tgz", - "integrity": "sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "license": "BSD-2-Clause", - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/etag": { - "version": "1.8.1", - "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", - "integrity": "sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/eventemitter3": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/eventemitter3/-/eventemitter3-5.0.1.tgz", - "integrity": "sha512-GWkBvjiSZK87ELrYOSESUYeVIc9mvLLf/nXalMOS5dYrgZq9o5OVkbZAVM06CVxYsCwH9BDZFPlQTlPA1j4ahA==", - "license": "MIT" - }, - "node_modules/execa": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", - "integrity": "sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==", - "dev": true, - "license": "MIT", - "dependencies": { - "cross-spawn": "^7.0.3", - "get-stream": "^6.0.0", - "human-signals": "^2.1.0", - "is-stream": "^2.0.0", - "merge-stream": "^2.0.0", - "npm-run-path": "^4.0.1", - "onetime": "^5.1.2", - "signal-exit": "^3.0.3", - "strip-final-newline": "^2.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sindresorhus/execa?sponsor=1" - } - }, - "node_modules/execa/node_modules/signal-exit": { - "version": "3.0.7", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-3.0.7.tgz", - "integrity": "sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/exit-x": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/exit-x/-/exit-x-0.2.2.tgz", - "integrity": "sha512-+I6B/IkJc1o/2tiURyz/ivu/O0nKNEArIUB5O7zBrlDVJr22SCLH3xTeEry428LvFhRzIA1g8izguxJ/gbNcVQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/expect": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/expect/-/expect-30.0.5.tgz", - "integrity": "sha512-P0te2pt+hHI5qLJkIR+iMvS+lYUZml8rKKsohVHAGY+uClp9XVbdyYNJOIjSRpHVp8s8YqxJCiHUkSYZGr8rtQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-util": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/express": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/express/-/express-5.1.0.tgz", - "integrity": "sha512-DT9ck5YIRU+8GYzzU5kT3eHGA5iL+1Zd0EutOmTE9Dtk+Tvuzd23VBU+ec7HPNSTxXYO55gPV/hq4pSBJDjFpA==", - "license": "MIT", - "dependencies": { - "accepts": "^2.0.0", - "body-parser": "^2.2.0", - "content-disposition": "^1.0.0", - "content-type": "^1.0.5", - "cookie": "^0.7.1", - "cookie-signature": "^1.2.1", - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "finalhandler": "^2.1.0", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "merge-descriptors": "^2.0.0", - "mime-types": "^3.0.0", - "on-finished": "^2.4.1", - "once": "^1.4.0", - "parseurl": "^1.3.3", - "proxy-addr": "^2.0.7", - "qs": "^6.14.0", - "range-parser": "^1.2.1", - "router": "^2.2.0", - "send": "^1.1.0", - "serve-static": "^2.2.0", - "statuses": "^2.0.1", - "type-is": "^2.0.1", - "vary": "^1.1.2" - }, - "engines": { - "node": ">= 18" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/express" - } - }, - "node_modules/express/node_modules/cookie-signature": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.2.2.tgz", - "integrity": "sha512-D76uU73ulSXrD1UXF4KE2TMxVVwhsnCgfAyTg9k8P6KGZjlXKrOLe4dJQKI3Bxi5wjesZoFXJWElNWBjPZMbhg==", - "license": "MIT", - "engines": { - "node": ">=6.6.0" - } - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-safe-stringify": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/fast-safe-stringify/-/fast-safe-stringify-2.1.1.tgz", - "integrity": "sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-xml-parser": { - "version": "5.2.5", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-5.2.5.tgz", - "integrity": "sha512-pfX9uG9Ki0yekDHx2SiuRIyFdyAr1kMIMitPvb0YBo8SUfKvia7w7FIyd/l6av85pFYRhZscS75MwMnbvY+hcQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^2.1.0" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/fb-watchman": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz", - "integrity": "sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "bser": "2.1.1" - } - }, - "node_modules/fecha": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/fecha/-/fecha-4.2.3.tgz", - "integrity": "sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==", - "license": "MIT" - }, - "node_modules/fill-range": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", - "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", - "dev": true, - "license": "MIT", - "dependencies": { - "to-regex-range": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/filter-obj": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/filter-obj/-/filter-obj-1.1.0.tgz", - "integrity": "sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/finalhandler": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-2.1.0.tgz", - "integrity": "sha512-/t88Ty3d5JWQbWYgaOGCCYfXRwV1+be02WqYYlL6h0lEiUAMPM8o8qKGO01YIkOHzka2up08wvgYD0mDiI+q3Q==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "on-finished": "^2.4.1", - "parseurl": "^1.3.3", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/fn.name": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/fn.name/-/fn.name-1.1.0.tgz", - "integrity": "sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==", - "license": "MIT" - }, - "node_modules/for-each": { - "version": "0.3.5", - "resolved": "https://registry.npmjs.org/for-each/-/for-each-0.3.5.tgz", - "integrity": "sha512-dKx12eRCVIzqCxFGplyFKJMPvLEWgmNtUrpTiJIR5u97zEhRG8ySrtboPHZXx7daLxQVrl643cTzbab2tkQjxg==", - "license": "MIT", - "dependencies": { - "is-callable": "^1.2.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/foreground-child": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/foreground-child/-/foreground-child-3.3.1.tgz", - "integrity": "sha512-gIXjKqtFuWEgzFRJA9WCQeSJLZDjgJUOMCMzxtvFq/37KojM1BFGufqsCy0r4qSQmYLsZYMeyRqzIWOMup03sw==", - "license": "ISC", - "dependencies": { - "cross-spawn": "^7.0.6", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/form-data": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/form-data/-/form-data-4.0.4.tgz", - "integrity": "sha512-KrGhL9Q4zjj0kiUt5OO4Mr/A/jlI2jDYs5eHBpYHPcBEVSiipAvn2Ko2HnPe20rmcuuvMHNdZFp+4IlGTMF0Ow==", - "dev": true, - "license": "MIT", - "dependencies": { - "asynckit": "^0.4.0", - "combined-stream": "^1.0.8", - "es-set-tostringtag": "^2.1.0", - "hasown": "^2.0.2", - "mime-types": "^2.1.12" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/form-data/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/form-data/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/formidable": { - "version": "3.5.4", - "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.4.tgz", - "integrity": "sha512-YikH+7CUTOtP44ZTnUhR7Ic2UASBPOqmaRkRKxRbywPTe5VxF7RRCck4af9wutiZ/QKM5nME9Bie2fFaPz5Gug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@paralleldrive/cuid2": "^2.2.2", - "dezalgo": "^1.0.4", - "once": "^1.4.0" - }, - "engines": { - "node": ">=14.0.0" - }, - "funding": { - "url": "https://ko-fi.com/tunnckoCore/commissions" - } - }, - "node_modules/forwarded": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", - "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/fresh": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/fresh/-/fresh-2.0.0.tgz", - "integrity": "sha512-Rx/WycZ60HOaqLKAi6cHRKKI7zxWbJ31MhntmtwMoaTeF7XFH9hhBp8vITaMidfljRQ6eYWCKkaTK+ykVJHP2A==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/fs.realpath": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true, - "license": "ISC" - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/function-bind": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/function-bind/-/function-bind-1.1.2.tgz", - "integrity": "sha512-7XHNxH7qX9xG5mIwxkhumTox/MIRNcOgDrxWsMt2pAr23WHp6MrRlN7FBSFpCpr+oVO0F744iUgR82nJMfG2SA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/get-caller-file": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", - "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "license": "ISC", - "engines": { - "node": "6.* || 8.* || >= 10.*" - } - }, - "node_modules/get-intrinsic": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", - "integrity": "sha512-9fSjSaos/fRIVIp+xSJlE6lfwhES7LNtKaCBIamHsjr2na1BiABJPo0mOjjz8GJDURarmCPGqaiVg5mfjb98CQ==", - "license": "MIT", - "dependencies": { - "call-bind-apply-helpers": "^1.0.2", - "es-define-property": "^1.0.1", - "es-errors": "^1.3.0", - "es-object-atoms": "^1.1.1", - "function-bind": "^1.1.2", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-symbols": "^1.1.0", - "hasown": "^2.0.2", - "math-intrinsics": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/get-proto": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/get-proto/-/get-proto-1.0.1.tgz", - "integrity": "sha512-sTSfBjoXBp89JvIKIefqw7U2CCebsc74kiY6awiGogKtoSGbgjYE/G/+l9sF3MWFPNc9IcoOC4ODfKHfxFmp0g==", - "license": "MIT", - "dependencies": { - "dunder-proto": "^1.0.1", - "es-object-atoms": "^1.0.0" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/get-stream": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", - "integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/glob": { - "version": "10.4.5", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.5.tgz", - "integrity": "sha512-7Bv8RF0k6xjo7d4A/PxYLbUCfb6c+Vpd2/mB2yRDlew7Jb5hEXiCD9ibfO7wpk8i4sevK6DFny9h7EYbM3/sHg==", - "license": "ISC", - "dependencies": { - "foreground-child": "^3.1.0", - "jackspeak": "^3.1.2", - "minimatch": "^9.0.4", - "minipass": "^7.1.2", - "package-json-from-dist": "^1.0.0", - "path-scurry": "^1.11.1" - }, - "bin": { - "glob": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/glob-parent": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", - "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/gopd": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/gopd/-/gopd-1.2.0.tgz", - "integrity": "sha512-ZUKRh6/kUFoAiTAtTYPZJ3hw9wNxx+BIBOijnlG9PnrJsCcSjs1wyyD6vJpaYtgnzDrKYRSqf3OO6Rfa93xsRg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "dev": true, - "license": "ISC" - }, - "node_modules/handlebars": { - "version": "4.7.8", - "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", - "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "minimist": "^1.2.5", - "neo-async": "^2.6.2", - "source-map": "^0.6.1", - "wordwrap": "^1.0.0" - }, - "bin": { - "handlebars": "bin/handlebars" - }, - "engines": { - "node": ">=0.4.7" - }, - "optionalDependencies": { - "uglify-js": "^3.1.4" - } - }, - "node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/has-property-descriptors": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.2.tgz", - "integrity": "sha512-55JNKuIW+vq4Ke1BjOTjM2YctQIvCT7GFzHwmfZPGo5wnrgkid0YQtnAleFSqumZm4az3n2BS+erby5ipJdgrg==", - "license": "MIT", - "dependencies": { - "es-define-property": "^1.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-symbols": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/has-symbols/-/has-symbols-1.1.0.tgz", - "integrity": "sha512-1cDNdwJ2Jaohmb3sg4OmKaMBwuC48sYni5HUw2DvsC8LjGTLK9h+eb1X6RyuOHe4hT0ULCW68iomhjUoKUqlPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/has-tostringtag": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/has-tostringtag/-/has-tostringtag-1.0.2.tgz", - "integrity": "sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==", - "license": "MIT", - "dependencies": { - "has-symbols": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/hasown": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", - "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", - "license": "MIT", - "dependencies": { - "function-bind": "^1.1.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/helmet": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/helmet/-/helmet-8.1.0.tgz", - "integrity": "sha512-jOiHyAZsmnr8LqoPGmCjYAaiuWwjAPLgY8ZX2XrmHawt99/u1y6RgrZMTeoPfpUbV96HOalYgz1qzkRbw54Pmg==", - "license": "MIT", - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/html-escaper": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", - "integrity": "sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==", - "dev": true, - "license": "MIT" - }, - "node_modules/http-errors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.0.tgz", - "integrity": "sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==", - "license": "MIT", - "dependencies": { - "depd": "2.0.0", - "inherits": "2.0.4", - "setprototypeof": "1.2.0", - "statuses": "2.0.1", - "toidentifier": "1.0.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/http-errors/node_modules/statuses": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.1.tgz", - "integrity": "sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/human-signals": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-2.1.0.tgz", - "integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=10.17.0" - } - }, - "node_modules/iconv-lite": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz", - "integrity": "sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==", - "license": "MIT", - "dependencies": { - "safer-buffer": ">= 2.1.2 < 3.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ieee754": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", - "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "BSD-3-Clause" - }, - "node_modules/ignore-by-default": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/ignore-by-default/-/ignore-by-default-1.0.1.tgz", - "integrity": "sha512-Ius2VYcGNk7T90CppJqcIkS5ooHUZyIQK+ClZfMfMNFEF9VSE73Fq+906u/CWu92x4gzZMWOwfFYckPObzdEbA==", - "dev": true, - "license": "ISC" - }, - "node_modules/import-local": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/import-local/-/import-local-3.2.0.tgz", - "integrity": "sha512-2SPlun1JUPWoM6t3F0dw0FkCF/jWY8kttcY4f599GLTSjh2OCuuhdTkJQsEcZzBqbXZGKMK2OqW1oZsjtf/gQA==", - "dev": true, - "license": "MIT", - "dependencies": { - "pkg-dir": "^4.2.0", - "resolve-cwd": "^3.0.0" - }, - "bin": { - "import-local-fixture": "fixtures/cli.js" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/inflight": { - "version": "1.0.6", - "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", - "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "deprecated": "This module is not supported, and leaks memory. Do not use it. Check out lru-cache if you want a good and tested way to coalesce async requests by a key value, which is much more comprehensive and powerful.", - "dev": true, - "license": "ISC", - "dependencies": { - "once": "^1.3.0", - "wrappy": "1" - } - }, - "node_modules/inherits": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "license": "ISC" - }, - "node_modules/ipaddr.js": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", - "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/is-arguments": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/is-arguments/-/is-arguments-1.2.0.tgz", - "integrity": "sha512-7bVbi0huj/wrIAOzb8U1aszg9kdi3KN/CyU19CTI7tAoZYEZoL9yCDXpbXN+uPsuWnP02cyug1gleqq+TU+YCA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-arrayish": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.3.2.tgz", - "integrity": "sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==", - "license": "MIT" - }, - "node_modules/is-binary-path": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", - "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "binary-extensions": "^2.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/is-callable": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/is-callable/-/is-callable-1.2.7.tgz", - "integrity": "sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-fullwidth-code-point": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz", - "integrity": "sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/is-generator-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", - "integrity": "sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/is-generator-function": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/is-generator-function/-/is-generator-function-1.1.0.tgz", - "integrity": "sha512-nPUB5km40q9e8UfN/Zc24eLlzdSf9OfKByBw9CIdw4H1giPMeA0OIJvbchsCu4npfI2QcMVBsGEBHKZ7wLTWmQ==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "get-proto": "^1.0.0", - "has-tostringtag": "^1.0.2", - "safe-regex-test": "^1.1.0" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-number": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", - "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.12.0" - } - }, - "node_modules/is-promise": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", - "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==", - "license": "MIT" - }, - "node_modules/is-regex": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.2.1.tgz", - "integrity": "sha512-MjYsKHO5O7mCsmRGxWcLWheFqN9DJ/2TmngvjKXihe6efViPqc274+Fx/4fYj/r03+ESvBdTXK0V6tA3rgez1g==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2", - "hasown": "^2.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/is-stream": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-2.0.1.tgz", - "integrity": "sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==", - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/is-typed-array": { - "version": "1.1.15", - "resolved": "https://registry.npmjs.org/is-typed-array/-/is-typed-array-1.1.15.tgz", - "integrity": "sha512-p3EcsicXjit7SaskXHs1hA91QxgTw46Fv6EFKKGS5DRFLD8yKnohjF3hxoju94b/OcMZoQukzpPpBE9uLVKzgQ==", - "license": "MIT", - "dependencies": { - "which-typed-array": "^1.1.16" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/isarray": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-2.0.5.tgz", - "integrity": "sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==", - "license": "MIT" - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "license": "ISC" - }, - "node_modules/istanbul-lib-coverage": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/istanbul-lib-coverage/-/istanbul-lib-coverage-3.2.2.tgz", - "integrity": "sha512-O8dpsF+r0WV/8MNRKfnmrtCWhuKjxrq2w+jpzBL5UZKTi2LeVWnWOmWRxFlesJONmc+wLAGvKQZEOanko0LFTg==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-instrument": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.3.tgz", - "integrity": "sha512-Vtgk7L/R2JHyyGW07spoFlB8/lpjiOLTjMdms6AFMraYt3BaJauod/NGrfnVG/y4Ix1JEuMRPDPEj2ua+zz1/Q==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@babel/core": "^7.23.9", - "@babel/parser": "^7.23.9", - "@istanbuljs/schema": "^0.1.3", - "istanbul-lib-coverage": "^3.2.0", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", - "integrity": "sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "istanbul-lib-coverage": "^3.0.0", - "make-dir": "^4.0.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-report/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-report/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/istanbul-lib-source-maps": { - "version": "5.0.6", - "resolved": "https://registry.npmjs.org/istanbul-lib-source-maps/-/istanbul-lib-source-maps-5.0.6.tgz", - "integrity": "sha512-yg2d+Em4KizZC5niWhQaIomgf5WlL4vOOjZ5xGCmF8SnPE/mDWWXgvRExdcpCgh9lLRRa1/fSYp2ymmbJ1pI+A==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.23", - "debug": "^4.1.1", - "istanbul-lib-coverage": "^3.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/istanbul-lib-source-maps/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/istanbul-reports": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/istanbul-reports/-/istanbul-reports-3.2.0.tgz", - "integrity": "sha512-HGYWWS/ehqTV3xN10i23tkPkpH46MLCIMFNCaaKNavAXTF1RkqxawEPtnjnGZ6XKSInBKkiOA5BKS+aZiY3AvA==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "html-escaper": "^2.0.0", - "istanbul-lib-report": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/jackspeak": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/jackspeak/-/jackspeak-3.4.3.tgz", - "integrity": "sha512-OGlZQpz2yfahA/Rd1Y8Cd9SIEsqvXkLVoSw/cgwhnhFMDbsQFeZYoJJ7bIZBS9BcamUW96asq/npPWugM+RQBw==", - "license": "BlueOak-1.0.0", - "dependencies": { - "@isaacs/cliui": "^8.0.2" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - }, - "optionalDependencies": { - "@pkgjs/parseargs": "^0.11.0" - } - }, - "node_modules/jest": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest/-/jest-30.0.5.tgz", - "integrity": "sha512-y2mfcJywuTUkvLm2Lp1/pFX8kTgMO5yyQGq/Sk/n2mN7XWYp4JsCZ/QXW34M8YScgk8bPZlREH04f6blPnoHnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.0.5", - "@jest/types": "30.0.5", - "import-local": "^3.2.0", - "jest-cli": "30.0.5" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-changed-files": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-changed-files/-/jest-changed-files-30.0.5.tgz", - "integrity": "sha512-bGl2Ntdx0eAwXuGpdLdVYVr5YQHnSZlQ0y9HVDu565lCUAe9sj6JOtBbMmBBikGIegne9piDDIOeiLVoqTkz4A==", - "dev": true, - "license": "MIT", - "dependencies": { - "execa": "^5.1.1", - "jest-util": "30.0.5", - "p-limit": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-circus": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-circus/-/jest-circus-30.0.5.tgz", - "integrity": "sha512-h/sjXEs4GS+NFFfqBDYT7y5Msfxh04EwWLhQi0F8kuWpe+J/7tICSlswU8qvBqumR3kFgHbfu7vU6qruWWBPug==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/expect": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "co": "^4.6.0", - "dedent": "^1.6.0", - "is-generator-fn": "^2.1.0", - "jest-each": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-runtime": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "p-limit": "^3.1.0", - "pretty-format": "30.0.5", - "pure-rand": "^7.0.0", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-cli": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-cli/-/jest-cli-30.0.5.tgz", - "integrity": "sha512-Sa45PGMkBZzF94HMrlX4kUyPOwUpdZasaliKN3mifvDmkhLYqLLg8HQTzn6gq7vJGahFYMQjXgyJWfYImKZzOw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/core": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", - "chalk": "^4.1.2", - "exit-x": "^0.2.2", - "import-local": "^3.2.0", - "jest-config": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "yargs": "^17.7.2" - }, - "bin": { - "jest": "bin/jest.js" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "node-notifier": "^8.0.1 || ^9.0.0 || ^10.0.0" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/jest-config": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-config/-/jest-config-30.0.5.tgz", - "integrity": "sha512-aIVh+JNOOpzUgzUnPn5FLtyVnqc3TQHVMupYtyeURSb//iLColiMIR8TxCIDKyx9ZgjKnXGucuW68hCxgbrwmA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@jest/get-type": "30.0.1", - "@jest/pattern": "30.0.1", - "@jest/test-sequencer": "30.0.5", - "@jest/types": "30.0.5", - "babel-jest": "30.0.5", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "deepmerge": "^4.3.1", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-circus": "30.0.5", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-runner": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "micromatch": "^4.0.8", - "parse-json": "^5.2.0", - "pretty-format": "30.0.5", - "slash": "^3.0.0", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "peerDependencies": { - "@types/node": "*", - "esbuild-register": ">=3.4.0", - "ts-node": ">=9.0.0" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "esbuild-register": { - "optional": true - }, - "ts-node": { - "optional": true - } - } - }, - "node_modules/jest-diff": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-diff/-/jest-diff-30.0.5.tgz", - "integrity": "sha512-1UIqE9PoEKaHcIKvq2vbibrCog4Y8G0zmOxgQUVEiTqwR5hJVMCoDsN1vFvI5JvwD37hjueZ1C4l2FyGnfpE0A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/diff-sequences": "30.0.1", - "@jest/get-type": "30.0.1", - "chalk": "^4.1.2", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-docblock": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-docblock/-/jest-docblock-30.0.1.tgz", - "integrity": "sha512-/vF78qn3DYphAaIc3jy4gA7XSAz167n9Bm/wn/1XhTLW7tTBIzXtCJpb/vcmc73NIIeeohCbdL94JasyXUZsGA==", - "dev": true, - "license": "MIT", - "dependencies": { - "detect-newline": "^3.1.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-each": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-each/-/jest-each-30.0.5.tgz", - "integrity": "sha512-dKjRsx1uZ96TVyejD3/aAWcNKy6ajMaN531CwWIsrazIqIoXI9TnnpPlkrEYku/8rkS3dh2rbH+kMOyiEIv0xQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", - "chalk": "^4.1.2", - "jest-util": "30.0.5", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-environment-node": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-environment-node/-/jest-environment-node-30.0.5.tgz", - "integrity": "sha512-ppYizXdLMSvciGsRsMEnv/5EFpvOdXBaXRBzFUDPWrsfmog4kYrOGWXarLllz6AXan6ZAA/kYokgDWuos1IKDA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-mock": "30.0.5", - "jest-util": "30.0.5", - "jest-validate": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-haste-map": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-haste-map/-/jest-haste-map-30.0.5.tgz", - "integrity": "sha512-dkmlWNlsTSR0nH3nRfW5BKbqHefLZv0/6LCccG0xFCTWcJu8TuEwG+5Cm75iBfjVoockmO6J35o5gxtFSn5xeg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "anymatch": "^3.1.3", - "fb-watchman": "^2.0.2", - "graceful-fs": "^4.2.11", - "jest-regex-util": "30.0.1", - "jest-util": "30.0.5", - "jest-worker": "30.0.5", - "micromatch": "^4.0.8", - "walker": "^1.0.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - }, - "optionalDependencies": { - "fsevents": "^2.3.3" - } - }, - "node_modules/jest-leak-detector": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-leak-detector/-/jest-leak-detector-30.0.5.tgz", - "integrity": "sha512-3Uxr5uP8jmHMcsOtYMRB/zf1gXN3yUIc+iPorhNETG54gErFIiUhLvyY/OggYpSMOEYqsmRxmuU4ZOoX5jpRFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-matcher-utils": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-matcher-utils/-/jest-matcher-utils-30.0.5.tgz", - "integrity": "sha512-uQgGWt7GOrRLP1P7IwNWwK1WAQbq+m//ZY0yXygyfWp0rJlksMSLQAA4wYQC3b6wl3zfnchyTx+k3HZ5aPtCbQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "chalk": "^4.1.2", - "jest-diff": "30.0.5", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-message-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-message-util/-/jest-message-util-30.0.5.tgz", - "integrity": "sha512-NAiDOhsK3V7RU0Aa/HnrQo+E4JlbarbmI3q6Pi4KcxicdtjV82gcIUrejOtczChtVQR4kddu1E1EJlW6EN9IyA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@jest/types": "30.0.5", - "@types/stack-utils": "^2.0.3", - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "micromatch": "^4.0.8", - "pretty-format": "30.0.5", - "slash": "^3.0.0", - "stack-utils": "^2.0.6" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-mock": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-mock/-/jest-mock-30.0.5.tgz", - "integrity": "sha512-Od7TyasAAQX/6S+QCbN6vZoWOMwlTtzzGuxJku1GhGanAjz9y+QsQkpScDmETvdc9aSXyJ/Op4rhpMYBWW91wQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "jest-util": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-pnp-resolver": { - "version": "1.2.3", - "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.3.tgz", - "integrity": "sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - }, - "peerDependencies": { - "jest-resolve": "*" - }, - "peerDependenciesMeta": { - "jest-resolve": { - "optional": true - } - } - }, - "node_modules/jest-regex-util": { - "version": "30.0.1", - "resolved": "https://registry.npmjs.org/jest-regex-util/-/jest-regex-util-30.0.1.tgz", - "integrity": "sha512-jHEQgBXAgc+Gh4g0p3bCevgRCVRkB4VB70zhoAE48gxeSr1hfUOsM/C2WoJgVL7Eyg//hudYENbm3Ne+/dRVVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve/-/jest-resolve-30.0.5.tgz", - "integrity": "sha512-d+DjBQ1tIhdz91B79mywH5yYu76bZuE96sSbxj8MkjWVx5WNdt1deEFRONVL4UkKLSrAbMkdhb24XN691yDRHg==", - "dev": true, - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-pnp-resolver": "^1.2.3", - "jest-util": "30.0.5", - "jest-validate": "30.0.5", - "slash": "^3.0.0", - "unrs-resolver": "^1.7.11" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-resolve-dependencies": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-resolve-dependencies/-/jest-resolve-dependencies-30.0.5.tgz", - "integrity": "sha512-/xMvBR4MpwkrHW4ikZIWRttBBRZgWK4d6xt3xW1iRDSKt4tXzYkMkyPfBnSCgv96cpkrctfXs6gexeqMYqdEpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "jest-regex-util": "30.0.1", - "jest-snapshot": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runner": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runner/-/jest-runner-30.0.5.tgz", - "integrity": "sha512-JcCOucZmgp+YuGgLAXHNy7ualBx4wYSgJVWrYMRBnb79j9PD0Jxh0EHvR5Cx/r0Ce+ZBC4hCdz2AzFFLl9hCiw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/console": "30.0.5", - "@jest/environment": "30.0.5", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "exit-x": "^0.2.2", - "graceful-fs": "^4.2.11", - "jest-docblock": "30.0.1", - "jest-environment-node": "30.0.5", - "jest-haste-map": "30.0.5", - "jest-leak-detector": "30.0.5", - "jest-message-util": "30.0.5", - "jest-resolve": "30.0.5", - "jest-runtime": "30.0.5", - "jest-util": "30.0.5", - "jest-watcher": "30.0.5", - "jest-worker": "30.0.5", - "p-limit": "^3.1.0", - "source-map-support": "0.5.13" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-runtime/-/jest-runtime-30.0.5.tgz", - "integrity": "sha512-7oySNDkqpe4xpX5PPiJTe5vEa+Ak/NnNz2bGYZrA1ftG3RL3EFlHaUkA1Cjx+R8IhK0Vg43RML5mJedGTPNz3A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/environment": "30.0.5", - "@jest/fake-timers": "30.0.5", - "@jest/globals": "30.0.5", - "@jest/source-map": "30.0.1", - "@jest/test-result": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "cjs-module-lexer": "^2.1.0", - "collect-v8-coverage": "^1.0.2", - "glob": "^10.3.10", - "graceful-fs": "^4.2.11", - "jest-haste-map": "30.0.5", - "jest-message-util": "30.0.5", - "jest-mock": "30.0.5", - "jest-regex-util": "30.0.1", - "jest-resolve": "30.0.5", - "jest-snapshot": "30.0.5", - "jest-util": "30.0.5", - "slash": "^3.0.0", - "strip-bom": "^4.0.0" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-runtime/node_modules/strip-bom": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", - "integrity": "sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-snapshot": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-snapshot/-/jest-snapshot-30.0.5.tgz", - "integrity": "sha512-T00dWU/Ek3LqTp4+DcW6PraVxjk28WY5Ua/s+3zUKSERZSNyxTqhDXCWKG5p2HAJ+crVQ3WJ2P9YVHpj1tkW+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.27.4", - "@babel/generator": "^7.27.5", - "@babel/plugin-syntax-jsx": "^7.27.1", - "@babel/plugin-syntax-typescript": "^7.27.1", - "@babel/types": "^7.27.3", - "@jest/expect-utils": "30.0.5", - "@jest/get-type": "30.0.1", - "@jest/snapshot-utils": "30.0.5", - "@jest/transform": "30.0.5", - "@jest/types": "30.0.5", - "babel-preset-current-node-syntax": "^1.1.0", - "chalk": "^4.1.2", - "expect": "30.0.5", - "graceful-fs": "^4.2.11", - "jest-diff": "30.0.5", - "jest-matcher-utils": "30.0.5", - "jest-message-util": "30.0.5", - "jest-util": "30.0.5", - "pretty-format": "30.0.5", - "semver": "^7.7.2", - "synckit": "^0.11.8" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-util/-/jest-util-30.0.5.tgz", - "integrity": "sha512-pvyPWssDZR0FlfMxCBoc0tvM8iUEskaRFALUtGQYzVEAqisAztmy+R8LnU14KT4XA0H/a5HMVTXat1jLne010g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/types": "30.0.5", - "@types/node": "*", - "chalk": "^4.1.2", - "ci-info": "^4.2.0", - "graceful-fs": "^4.2.11", - "picomatch": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-util/node_modules/picomatch": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.3.tgz", - "integrity": "sha512-5gTmgEY/sqK6gFXLIsQNH19lWb4ebPDLA4SdLP7dsWkIXHWlG66oPuVvXSGFPppYZz8ZDZq0dYYrbHfBCVUb1Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/jest-validate": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-validate/-/jest-validate-30.0.5.tgz", - "integrity": "sha512-ouTm6VFHaS2boyl+k4u+Qip4TSH7Uld5tyD8psQ8abGgt2uYYB8VwVfAHWHjHc0NWmGGbwO5h0sCPOGHHevefw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/get-type": "30.0.1", - "@jest/types": "30.0.5", - "camelcase": "^6.3.0", - "chalk": "^4.1.2", - "leven": "^3.1.0", - "pretty-format": "30.0.5" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-validate/node_modules/camelcase": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-6.3.0.tgz", - "integrity": "sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/jest-watcher": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-watcher/-/jest-watcher-30.0.5.tgz", - "integrity": "sha512-z9slj/0vOwBDBjN3L4z4ZYaA+pG56d6p3kTUhFRYGvXbXMWhXmb/FIxREZCD06DYUwDKKnj2T80+Pb71CQ0KEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/test-result": "30.0.5", - "@jest/types": "30.0.5", - "@types/node": "*", - "ansi-escapes": "^4.3.2", - "chalk": "^4.1.2", - "emittery": "^0.13.1", - "jest-util": "30.0.5", - "string-length": "^4.0.2" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/jest-worker/-/jest-worker-30.0.5.tgz", - "integrity": "sha512-ojRXsWzEP16NdUuBw/4H/zkZdHOa7MMYCk4E430l+8fELeLg/mqmMlRhjL7UNZvQrDmnovWZV4DxX03fZF48fQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*", - "@ungap/structured-clone": "^1.3.0", - "jest-util": "30.0.5", - "merge-stream": "^2.0.0", - "supports-color": "^8.1.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/jest-worker/node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/jest-worker/node_modules/supports-color": { - "version": "8.1.1", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-8.1.1.tgz", - "integrity": "sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/supports-color?sponsor=1" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-parse-even-better-errors": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", - "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/jsonwebtoken": { - "version": "9.0.2", - "resolved": "https://registry.npmjs.org/jsonwebtoken/-/jsonwebtoken-9.0.2.tgz", - "integrity": "sha512-PRp66vJ865SSqOlgqS8hujT5U4AOgMfhrwYIuIhfKaoSCZcirrmASQr8CX7cUg+RMih+hgznrjp99o+W4pJLHQ==", - "license": "MIT", - "dependencies": { - "jws": "^3.2.2", - "lodash.includes": "^4.3.0", - "lodash.isboolean": "^3.0.3", - "lodash.isinteger": "^4.0.4", - "lodash.isnumber": "^3.0.3", - "lodash.isplainobject": "^4.0.6", - "lodash.isstring": "^4.0.1", - "lodash.once": "^4.0.0", - "ms": "^2.1.1", - "semver": "^7.5.4" - }, - "engines": { - "node": ">=12", - "npm": ">=6" - } - }, - "node_modules/jwa": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/jwa/-/jwa-1.4.2.tgz", - "integrity": "sha512-eeH5JO+21J78qMvTIDdBXidBd6nG2kZjg5Ohz/1fpa28Z4CcsWUzJ1ZZyFq/3z3N17aZy+ZuBoHljASbL1WfOw==", - "license": "MIT", - "dependencies": { - "buffer-equal-constant-time": "^1.0.1", - "ecdsa-sig-formatter": "1.0.11", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/jws": { - "version": "3.2.2", - "resolved": "https://registry.npmjs.org/jws/-/jws-3.2.2.tgz", - "integrity": "sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==", - "license": "MIT", - "dependencies": { - "jwa": "^1.4.1", - "safe-buffer": "^5.0.1" - } - }, - "node_modules/kuler": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/kuler/-/kuler-2.0.0.tgz", - "integrity": "sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==", - "license": "MIT" - }, - "node_modules/leven": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/leven/-/leven-3.1.0.tgz", - "integrity": "sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/lines-and-columns": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", - "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", - "dev": true, - "license": "MIT" - }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/lodash": { - "version": "4.17.21", - "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", - "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==", - "license": "MIT" - }, - "node_modules/lodash.get": { - "version": "4.4.2", - "resolved": "https://registry.npmjs.org/lodash.get/-/lodash.get-4.4.2.tgz", - "integrity": "sha512-z+Uw/vLuy6gQe8cfaFWD7p0wVv8fJl3mbzXh33RS+0oW2wvUqiRXiQ69gLWSLpgB5/6sU+r6BlQR0MBILadqTQ==", - "deprecated": "This package is deprecated. Use the optional chaining (?.) operator instead.", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.includes": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/lodash.includes/-/lodash.includes-4.3.0.tgz", - "integrity": "sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==", - "license": "MIT" - }, - "node_modules/lodash.isboolean": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isboolean/-/lodash.isboolean-3.0.3.tgz", - "integrity": "sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==", - "license": "MIT" - }, - "node_modules/lodash.isequal": { - "version": "4.5.0", - "resolved": "https://registry.npmjs.org/lodash.isequal/-/lodash.isequal-4.5.0.tgz", - "integrity": "sha512-pDo3lu8Jhfjqls6GkMgpahsF9kCyayhgykjyLMNFTKWrpVdAQtYyB4muAMWozBB4ig/dtWAmsMxLEI8wuz+DYQ==", - "deprecated": "This package is deprecated. Use require('node:util').isDeepStrictEqual instead.", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.isinteger": { - "version": "4.0.4", - "resolved": "https://registry.npmjs.org/lodash.isinteger/-/lodash.isinteger-4.0.4.tgz", - "integrity": "sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==", - "license": "MIT" - }, - "node_modules/lodash.isnumber": { - "version": "3.0.3", - "resolved": "https://registry.npmjs.org/lodash.isnumber/-/lodash.isnumber-3.0.3.tgz", - "integrity": "sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==", - "license": "MIT" - }, - "node_modules/lodash.isplainobject": { - "version": "4.0.6", - "resolved": "https://registry.npmjs.org/lodash.isplainobject/-/lodash.isplainobject-4.0.6.tgz", - "integrity": "sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==", - "license": "MIT" - }, - "node_modules/lodash.isstring": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/lodash.isstring/-/lodash.isstring-4.0.1.tgz", - "integrity": "sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==", - "license": "MIT" - }, - "node_modules/lodash.memoize": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/lodash.memoize/-/lodash.memoize-4.1.2.tgz", - "integrity": "sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.mergewith": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.mergewith/-/lodash.mergewith-4.6.2.tgz", - "integrity": "sha512-GK3g5RPZWTRSeLSpgP8Xhra+pnjBC56q9FZYe1d5RN3TJ35dbkGy3YqBSMbyCrlbi+CM9Z3Jk5yTL7RCsqboyQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lodash.once": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/lodash.once/-/lodash.once-4.1.1.tgz", - "integrity": "sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==", - "license": "MIT" - }, - "node_modules/logform": { - "version": "2.7.0", - "resolved": "https://registry.npmjs.org/logform/-/logform-2.7.0.tgz", - "integrity": "sha512-TFYA4jnP7PVbmlBIfhlSe+WKxs9dklXMTEGcBCIvLhE/Tn3H6Gk1norupVW7m5Cnd4bLcr08AytbyV/xj7f/kQ==", - "license": "MIT", - "dependencies": { - "@colors/colors": "1.6.0", - "@types/triple-beam": "^1.3.2", - "fecha": "^4.2.0", - "ms": "^2.1.1", - "safe-stable-stringify": "^2.3.1", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/lru-cache": { - "version": "10.4.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.4.3.tgz", - "integrity": "sha512-JNAzZcXrCt42VGLuYz0zfAzDfAvJWW6AfYlDBQyDV5DClI2m5sAmK+OIO7s59XfsRsWHp02jAJrRadPRGTt6SQ==", - "license": "ISC" - }, - "node_modules/make-dir": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/make-dir/-/make-dir-4.0.0.tgz", - "integrity": "sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/make-error": { - "version": "1.3.6", - "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", - "devOptional": true, - "license": "ISC" - }, - "node_modules/makeerror": { - "version": "1.0.12", - "resolved": "https://registry.npmjs.org/makeerror/-/makeerror-1.0.12.tgz", - "integrity": "sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "tmpl": "1.0.5" - } - }, - "node_modules/math-intrinsics": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", - "integrity": "sha512-/IXtbwEk5HTPyEwyKX6hGkYXxM9nbj64B+ilVJnC/R6B0pH5G4V3b0pVbL7DBj4tkhBAppbQUlf6F6Xl9LHu1g==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/media-typer": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", - "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/merge-descriptors": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-2.0.0.tgz", - "integrity": "sha512-Snk314V5ayFLhp3fkUREub6WtjBfPdCPY1Ln8/8munuLuiYhsABgBVWsozAG+MWMbVEvcdcpbi9R7ww22l9Q3g==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/merge-stream": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", - "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", - "dev": true, - "license": "MIT" - }, - "node_modules/methods": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", - "integrity": "sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/micromatch": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.8.tgz", - "integrity": "sha512-PXwfBhYu0hBCPw8Dn0E+WDYb7af3dSLVWKi3HGv84IdF4TyFoC0ysxFd0Goxw7nSv4T/PzEJQxsYsEiFCKo2BA==", - "dev": true, - "license": "MIT", - "dependencies": { - "braces": "^3.0.3", - "picomatch": "^2.3.1" - }, - "engines": { - "node": ">=8.6" - } - }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "dev": true, - "license": "MIT", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/mime-db": { - "version": "1.54.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.54.0.tgz", - "integrity": "sha512-aU5EJuIN2WDemCcAp2vFBfp/m4EAhWJnUNSSw0ixs7/kXbd6Pg64EmwJkNdFhB8aWt1sH2CTXrLxo/iAGV3oPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mime-types": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-3.0.1.tgz", - "integrity": "sha512-xRc4oEhT6eaBpU1XF7AjpOFD+xQmXNB5OVKwp4tqCuBpHLS/ZbBDrc07mYTDqVMg6PfxUjjNp85O6Cd2Z/5HWA==", - "license": "MIT", - "dependencies": { - "mime-db": "^1.54.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/mimic-fn": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", - "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/minimatch": { - "version": "9.0.5", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.5.tgz", - "integrity": "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow==", - "license": "ISC", - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/minimist": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz", - "integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==", - "license": "MIT", - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/minio": { - "version": "8.0.5", - "resolved": "https://registry.npmjs.org/minio/-/minio-8.0.5.tgz", - "integrity": "sha512-/vAze1uyrK2R/DSkVutE4cjVoAowvIQ18RAwn7HrqnLecLlMazFnY0oNBqfuoAWvu7mZIGX75AzpuV05TJeoHg==", - "license": "Apache-2.0", - "dependencies": { - "async": "^3.2.4", - "block-stream2": "^2.1.0", - "browser-or-node": "^2.1.1", - "buffer-crc32": "^1.0.0", - "eventemitter3": "^5.0.1", - "fast-xml-parser": "^4.4.1", - "ipaddr.js": "^2.0.1", - "lodash": "^4.17.21", - "mime-types": "^2.1.35", - "query-string": "^7.1.3", - "stream-json": "^1.8.0", - "through2": "^4.0.2", - "web-encoding": "^1.1.5", - "xml2js": "^0.5.0 || ^0.6.2" - }, - "engines": { - "node": "^16 || ^18 || >=20" - } - }, - "node_modules/minio/node_modules/fast-xml-parser": { - "version": "4.5.3", - "resolved": "https://registry.npmjs.org/fast-xml-parser/-/fast-xml-parser-4.5.3.tgz", - "integrity": "sha512-RKihhV+SHsIUGXObeVy9AXiBbFwkVk7Syp8XgwN5U3JV416+Gwp/GO9i0JYKmikykgz/UHRrrV4ROuZEo/T0ig==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT", - "dependencies": { - "strnum": "^1.1.1" - }, - "bin": { - "fxparser": "src/cli/cli.js" - } - }, - "node_modules/minio/node_modules/ipaddr.js": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-2.2.0.tgz", - "integrity": "sha512-Ag3wB2o37wslZS19hZqorUnrnzSkpOVy+IiiDEiTqNubEYpYuHWIf6K4psgN2ZWKExS4xhVCrRVfb/wfW8fWJA==", - "license": "MIT", - "engines": { - "node": ">= 10" - } - }, - "node_modules/minio/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minio/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/minio/node_modules/strnum": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-1.1.2.tgz", - "integrity": "sha512-vrN+B7DBIoTTZjnPNewwhx6cBA/H+IS7rfW68n7XxC1y7uoiGQBxaKzqucGUgavX15dJgiGztLJ8vxuEzwqBdA==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/mkdirp": { - "version": "0.5.6", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", - "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", - "license": "MIT", - "dependencies": { - "minimist": "^1.2.6" - }, - "bin": { - "mkdirp": "bin/cmd.js" - } - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "license": "MIT" - }, - "node_modules/multer": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", - "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", - "license": "MIT", - "dependencies": { - "append-field": "^1.0.0", - "busboy": "^1.6.0", - "concat-stream": "^2.0.0", - "mkdirp": "^0.5.6", - "object-assign": "^4.1.1", - "type-is": "^1.6.18", - "xtend": "^4.0.2" - }, - "engines": { - "node": ">= 10.16.0" - } - }, - "node_modules/multer/node_modules/media-typer": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", - "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/multer/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/multer/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/multer/node_modules/type-is": { - "version": "1.6.18", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", - "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", - "license": "MIT", - "dependencies": { - "media-typer": "0.3.0", - "mime-types": "~2.1.24" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/napi-postinstall": { - "version": "0.3.3", - "resolved": "https://registry.npmjs.org/napi-postinstall/-/napi-postinstall-0.3.3.tgz", - "integrity": "sha512-uTp172LLXSxuSYHv/kou+f6KW3SMppU9ivthaVTXian9sOt3XM/zHYHpRZiLgQoxeWfYUnslNWQHF1+G71xcow==", - "dev": true, - "license": "MIT", - "bin": { - "napi-postinstall": "lib/cli.js" - }, - "engines": { - "node": "^12.20.0 || ^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/napi-postinstall" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/negotiator": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-1.0.0.tgz", - "integrity": "sha512-8Ofs/AUQh8MaEcrlq5xOX0CQ9ypTF5dl78mjlMNfOK08fzpgTHQRQPBxcPlEtIw0yRpws+Zo/3r+5WRby7u3Gg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/neo-async": { - "version": "2.6.2", - "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", - "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-addon-api": { - "version": "8.5.0", - "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-8.5.0.tgz", - "integrity": "sha512-/bRZty2mXUIFY/xU5HLvveNHlswNJej+RnxBjOMkidWfwZzgTbPG1E3K5TOxRLOR+5hX7bSofy8yf1hZevMS8A==", - "license": "MIT", - "engines": { - "node": "^18 || ^20 || >= 21" - } - }, - "node_modules/node-gyp-build": { - "version": "4.8.4", - "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.4.tgz", - "integrity": "sha512-LA4ZjwlnUblHVgq0oBF3Jl/6h/Nvs5fzBLwdEF4nuxnFdsfajde4WfxtJr3CaiH+F6ewcIB/q4jQ4UzPyid+CQ==", - "license": "MIT", - "bin": { - "node-gyp-build": "bin.js", - "node-gyp-build-optional": "optional.js", - "node-gyp-build-test": "build-test.js" - } - }, - "node_modules/node-int64": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", - "integrity": "sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/nodemailer": { - "version": "7.0.5", - "resolved": "https://registry.npmjs.org/nodemailer/-/nodemailer-7.0.5.tgz", - "integrity": "sha512-nsrh2lO3j4GkLLXoeEksAMgAOqxOv6QumNRVQTJwKH4nuiww6iC2y7GyANs9kRAxCexg3+lTWM3PZ91iLlVjfg==", - "license": "MIT-0", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/nodemon": { - "version": "3.1.10", - "resolved": "https://registry.npmjs.org/nodemon/-/nodemon-3.1.10.tgz", - "integrity": "sha512-WDjw3pJ0/0jMFmyNDp3gvY2YizjLmmOUQo6DEBY+JgdvW/yQ9mEeSw6H5ythl5Ny2ytb7f9C2nIbjSxMNzbJXw==", - "dev": true, - "license": "MIT", - "dependencies": { - "chokidar": "^3.5.2", - "debug": "^4", - "ignore-by-default": "^1.0.1", - "minimatch": "^3.1.2", - "pstree.remy": "^1.1.8", - "semver": "^7.5.3", - "simple-update-notifier": "^2.0.0", - "supports-color": "^5.5.0", - "touch": "^3.1.0", - "undefsafe": "^2.0.5" - }, - "bin": { - "nodemon": "bin/nodemon.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/nodemon" - } - }, - "node_modules/nodemon/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/nodemon/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/normalize-path": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", - "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/npm-run-path": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-4.0.1.tgz", - "integrity": "sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "path-key": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/object-assign": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/object-assign/-/object-assign-4.1.1.tgz", - "integrity": "sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/object-inspect": { - "version": "1.13.4", - "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.4.tgz", - "integrity": "sha512-W67iLl4J2EXEGTbfeHCffrjDfitvLANg0UlX3wFUUSTx92KXRFegMHUVgSqE+wvhAbi4WqjGg9czysTV2Epbew==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/on-finished": { - "version": "2.4.1", - "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.4.1.tgz", - "integrity": "sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==", - "license": "MIT", - "dependencies": { - "ee-first": "1.1.1" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/once": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", - "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "license": "ISC", - "dependencies": { - "wrappy": "1" - } - }, - "node_modules/one-time": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/one-time/-/one-time-1.0.0.tgz", - "integrity": "sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==", - "license": "MIT", - "dependencies": { - "fn.name": "1.x.x" - } - }, - "node_modules/onetime": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", - "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "mimic-fn": "^2.1.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/openapi-types": { - "version": "12.1.3", - "resolved": "https://registry.npmjs.org/openapi-types/-/openapi-types-12.1.3.tgz", - "integrity": "sha512-N4YtSYJqghVu4iek2ZUvcN/0aqH1kRDuNqzcycDxhOUpg7GdvLa2F3DgS6yBNhInhv2r/6I0Flkn7CqL8+nIcw==", - "dev": true, - "license": "MIT", - "peer": true - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/p-locate/node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/package-json-from-dist": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.1.tgz", - "integrity": "sha512-UEZIS3/by4OC8vL3P2dTXRETpebLI2NiI5vIrjaD/5UtrkFX/tNbwjTSRAGC/+7CAo2pIcBaRgWmcBBHcsaCIw==", - "license": "BlueOak-1.0.0" - }, - "node_modules/parse-json": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", - "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.0.0", - "error-ex": "^1.3.1", - "json-parse-even-better-errors": "^2.3.0", - "lines-and-columns": "^1.1.6" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parseurl": { - "version": "1.3.3", - "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", - "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-is-absolute": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", - "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-scurry": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", - "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", - "license": "BlueOak-1.0.0", - "dependencies": { - "lru-cache": "^10.2.0", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" - }, - "engines": { - "node": ">=16 || 14 >=14.18" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/path-to-regexp": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-8.2.0.tgz", - "integrity": "sha512-TdrF7fW9Rphjq4RjrW0Kp2AW0Ahwu9sRGTkS6bvDi0SCwZlEZYmcfDbEsTz8RVk0EHIS/Vd1bv3JhG+1xZuAyQ==", - "license": "MIT", - "engines": { - "node": ">=16" - } - }, - "node_modules/pg": { - "version": "8.16.3", - "resolved": "https://registry.npmjs.org/pg/-/pg-8.16.3.tgz", - "integrity": "sha512-enxc1h0jA/aq5oSDMvqyW3q89ra6XIIDZgCX9vkMrnz5DFTw/Ny3Li2lFQ+pt3L6MCgm/5o2o8HW9hiJji+xvw==", - "license": "MIT", - "dependencies": { - "pg-connection-string": "^2.9.1", - "pg-pool": "^3.10.1", - "pg-protocol": "^1.10.3", - "pg-types": "2.2.0", - "pgpass": "1.0.5" - }, - "engines": { - "node": ">= 16.0.0" - }, - "optionalDependencies": { - "pg-cloudflare": "^1.2.7" - }, - "peerDependencies": { - "pg-native": ">=3.0.1" - }, - "peerDependenciesMeta": { - "pg-native": { - "optional": true - } - } - }, - "node_modules/pg-cloudflare": { - "version": "1.2.7", - "resolved": "https://registry.npmjs.org/pg-cloudflare/-/pg-cloudflare-1.2.7.tgz", - "integrity": "sha512-YgCtzMH0ptvZJslLM1ffsY4EuGaU0cx4XSdXLRFae8bPP4dS5xL1tNB3k2o/N64cHJpwU7dxKli/nZ2lUa5fLg==", - "license": "MIT", - "optional": true - }, - "node_modules/pg-connection-string": { - "version": "2.9.1", - "resolved": "https://registry.npmjs.org/pg-connection-string/-/pg-connection-string-2.9.1.tgz", - "integrity": "sha512-nkc6NpDcvPVpZXxrreI/FOtX3XemeLl8E0qFr6F2Lrm/I8WOnaWNhIPK2Z7OHpw7gh5XJThi6j6ppgNoaT1w4w==", - "license": "MIT" - }, - "node_modules/pg-int8": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/pg-int8/-/pg-int8-1.0.1.tgz", - "integrity": "sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==", - "license": "ISC", - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/pg-pool": { - "version": "3.10.1", - "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.10.1.tgz", - "integrity": "sha512-Tu8jMlcX+9d8+QVzKIvM/uJtp07PKr82IUOYEphaWcoBhIYkoHpLXN3qO59nAI11ripznDsEzEv8nUxBVWajGg==", - "license": "MIT", - "peerDependencies": { - "pg": ">=8.0" - } - }, - "node_modules/pg-protocol": { - "version": "1.10.3", - "resolved": "https://registry.npmjs.org/pg-protocol/-/pg-protocol-1.10.3.tgz", - "integrity": "sha512-6DIBgBQaTKDJyxnXaLiLR8wBpQQcGWuAESkRBX/t6OwA8YsqP+iVSiond2EDy6Y/dsGk8rh/jtax3js5NeV7JQ==", - "license": "MIT" - }, - "node_modules/pg-types": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/pg-types/-/pg-types-2.2.0.tgz", - "integrity": "sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==", - "license": "MIT", - "dependencies": { - "pg-int8": "1.0.1", - "postgres-array": "~2.0.0", - "postgres-bytea": "~1.0.0", - "postgres-date": "~1.0.4", - "postgres-interval": "^1.1.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/pgpass": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/pgpass/-/pgpass-1.0.5.tgz", - "integrity": "sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==", - "license": "MIT", - "dependencies": { - "split2": "^4.1.0" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "dev": true, - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", - "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8.6" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/pirates": { - "version": "4.0.7", - "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", - "integrity": "sha512-TfySrs/5nm8fQJDcBDuUng3VOUKsd7S+zqvbOTiGXHfxX4wK31ard+hoNuvkicM/2YFzlpDgABOevKSsB4G/FA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 6" - } - }, - "node_modules/pkg-dir": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", - "integrity": "sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "find-up": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/possible-typed-array-names": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/possible-typed-array-names/-/possible-typed-array-names-1.1.0.tgz", - "integrity": "sha512-/+5VFTchJDoVj3bhoqi6UeymcD00DAwb1nJwamzPvHEszJ4FpF6SNNbUbOS8yI56qHzdV8eK0qEfOSiodkTdxg==", - "license": "MIT", - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/postgres-array": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/postgres-array/-/postgres-array-2.0.0.tgz", - "integrity": "sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/postgres-bytea": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/postgres-bytea/-/postgres-bytea-1.0.0.tgz", - "integrity": "sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-date": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/postgres-date/-/postgres-date-1.0.7.tgz", - "integrity": "sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/postgres-interval": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/postgres-interval/-/postgres-interval-1.2.0.tgz", - "integrity": "sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==", - "license": "MIT", - "dependencies": { - "xtend": "^4.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/pretty-format": { - "version": "30.0.5", - "resolved": "https://registry.npmjs.org/pretty-format/-/pretty-format-30.0.5.tgz", - "integrity": "sha512-D1tKtYvByrBkFLe2wHJl2bwMJIiT8rW+XA+TiataH79/FszLQMrpGEvzUVkzPau7OCO0Qnrhpe87PqtOAIB8Yw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jest/schemas": "30.0.5", - "ansi-styles": "^5.2.0", - "react-is": "^18.3.1" - }, - "engines": { - "node": "^18.14.0 || ^20.0.0 || ^22.0.0 || >=24.0.0" - } - }, - "node_modules/pretty-format/node_modules/ansi-styles": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz", - "integrity": "sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/proxy-addr": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", - "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", - "license": "MIT", - "dependencies": { - "forwarded": "0.2.0", - "ipaddr.js": "1.9.1" - }, - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/pstree.remy": { - "version": "1.1.8", - "resolved": "https://registry.npmjs.org/pstree.remy/-/pstree.remy-1.1.8.tgz", - "integrity": "sha512-77DZwxQmxKnu3aR542U+X8FypNzbfJ+C5XQDk3uWjWxn6151aIMGthWYRXTqT1E5oJvg+ljaa2OJi+VfvCOQ8w==", - "dev": true, - "license": "MIT" - }, - "node_modules/pure-rand": { - "version": "7.0.1", - "resolved": "https://registry.npmjs.org/pure-rand/-/pure-rand-7.0.1.tgz", - "integrity": "sha512-oTUZM/NAZS8p7ANR3SHh30kXB+zK2r2BPcEn/awJIbOvq82WoMN4p62AWWp3Hhw50G0xMsw1mhIBLqHw64EcNQ==", - "dev": true, - "funding": [ - { - "type": "individual", - "url": "https://github.com/sponsors/dubzzz" - }, - { - "type": "opencollective", - "url": "https://opencollective.com/fast-check" - } - ], - "license": "MIT" - }, - "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", - "license": "BSD-3-Clause", - "dependencies": { - "side-channel": "^1.1.0" - }, - "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/query-string": { - "version": "7.1.3", - "resolved": "https://registry.npmjs.org/query-string/-/query-string-7.1.3.tgz", - "integrity": "sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==", - "license": "MIT", - "dependencies": { - "decode-uri-component": "^0.2.2", - "filter-obj": "^1.1.0", - "split-on-first": "^1.0.0", - "strict-uri-encode": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/range-parser": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", - "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/raw-body": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0.tgz", - "integrity": "sha512-RmkhL8CAyCRPXCE28MMH0z2PNWQBNk2Q09ZdxM9IOOXwxwZbN+qbWaatPkdkWIKL2ZVDImrN/pK5HTRz2PcS4g==", - "license": "MIT", - "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.6.3", - "unpipe": "1.0.0" - }, - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/react-is": { - "version": "18.3.1", - "resolved": "https://registry.npmjs.org/react-is/-/react-is-18.3.1.tgz", - "integrity": "sha512-/LLMVyas0ljjAtoYiPqYiL8VWXzUUdThrmU5+n20DZv+a+ClRoevUzw5JxU+Ieh5/c87ytoTBV9G1FiKfNJdmg==", - "dev": true, - "license": "MIT" - }, - "node_modules/readable-stream": { - "version": "3.6.2", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", - "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "string_decoder": "^1.1.1", - "util-deprecate": "^1.0.1" - }, - "engines": { - "node": ">= 6" - } - }, - "node_modules/readdirp": { - "version": "3.6.0", - "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", - "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "picomatch": "^2.2.1" - }, - "engines": { - "node": ">=8.10.0" - } - }, - "node_modules/redis": { - "version": "5.8.1", - "resolved": "https://registry.npmjs.org/redis/-/redis-5.8.1.tgz", - "integrity": "sha512-RZjBKYX/qFF809x6vDcE5VA6L3MmiuT+BkbXbIyyyeU0lPD47V4z8qTzN+Z/kKFwpojwCItOfaItYuAjNs8pTQ==", - "license": "MIT", - "dependencies": { - "@redis/bloom": "5.8.1", - "@redis/client": "5.8.1", - "@redis/json": "5.8.1", - "@redis/search": "5.8.1", - "@redis/time-series": "5.8.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/reflect-metadata": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/reflect-metadata/-/reflect-metadata-0.2.2.tgz", - "integrity": "sha512-urBwgfrvVP/eAyXx4hluJivBKzuEbSQs9rKWCrCkbSxNv8mxPcUZKeuoF3Uy4mJl3Lwprp6yy5/39VWigZ4K6Q==", - "license": "Apache-2.0", - "peer": true - }, - "node_modules/require-directory": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", - "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/resolve-cwd": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/resolve-cwd/-/resolve-cwd-3.0.0.tgz", - "integrity": "sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/rimraf": { - "version": "5.0.10", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.10.tgz", - "integrity": "sha512-l0OE8wL34P4nJH/H2ffoaniAokM2qSmrtXHmlpvYr5AVVX8msAyW0l8NVJFDxlSK4u3Uh/f41cQheDVdnYijwQ==", - "dev": true, - "license": "ISC", - "dependencies": { - "glob": "^10.3.7" - }, - "bin": { - "rimraf": "dist/esm/bin.mjs" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/router": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/router/-/router-2.2.0.tgz", - "integrity": "sha512-nLTrUKm2UyiL7rlhapu/Zl45FwNgkZGaCpZbIHajDYgwlJCOzLSk+cIPAnsEqV955GjILJnKbdQC1nVPz+gAYQ==", - "license": "MIT", - "dependencies": { - "debug": "^4.4.0", - "depd": "^2.0.0", - "is-promise": "^4.0.0", - "parseurl": "^1.3.3", - "path-to-regexp": "^8.0.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/safe-buffer": { - "version": "5.2.1", - "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", - "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/feross" - }, - { - "type": "patreon", - "url": "https://www.patreon.com/feross" - }, - { - "type": "consulting", - "url": "https://feross.org/support" - } - ], - "license": "MIT" - }, - "node_modules/safe-regex-test": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.1.0.tgz", - "integrity": "sha512-x/+Cz4YrimQxQccJf5mKEbIa1NzeCRNI5Ecl/ekmlYaampdNLPalVyIcCZNNH3MvmqBugV5TMYZXv0ljslUlaw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "is-regex": "^1.2.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/safe-stable-stringify": { - "version": "2.5.0", - "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.5.0.tgz", - "integrity": "sha512-b3rppTKm9T+PsVCBEOUR46GWI7fdOs00VKZ1+9c1EWDaDMvjQc6tUwuFyIprgGgTcWoVHSKrU8H31ZHA2e0RHA==", - "license": "MIT", - "engines": { - "node": ">=10" - } - }, - "node_modules/safer-buffer": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", - "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", - "license": "MIT" - }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, - "node_modules/semver": { - "version": "7.7.2", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.7.2.tgz", - "integrity": "sha512-RF0Fw+rO5AMf9MAyaRXI4AV0Ulj5lMHqVxxdSgiVbixSCXoEmmX/jk0CuJw4+3SqroYO9VoUh+HcuJivvtJemA==", - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/send": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/send/-/send-1.2.0.tgz", - "integrity": "sha512-uaW0WwXKpL9blXE2o0bRhoL2EGXIrZxQ2ZQ4mgcfoBxdFmQold+qWsD2jLrfZ0trjKL6vOw0j//eAwcALFjKSw==", - "license": "MIT", - "dependencies": { - "debug": "^4.3.5", - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "etag": "^1.8.1", - "fresh": "^2.0.0", - "http-errors": "^2.0.0", - "mime-types": "^3.0.1", - "ms": "^2.1.3", - "on-finished": "^2.4.1", - "range-parser": "^1.2.1", - "statuses": "^2.0.1" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/serve-static": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.2.0.tgz", - "integrity": "sha512-61g9pCh0Vnh7IutZjtLGGpTA355+OPn2TyDv/6ivP2h/AdAVX9azsoxmg2/M6nZeQZNYBEwIcsne1mJd9oQItQ==", - "license": "MIT", - "dependencies": { - "encodeurl": "^2.0.0", - "escape-html": "^1.0.3", - "parseurl": "^1.3.3", - "send": "^1.2.0" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/set-function-length": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", - "integrity": "sha512-pgRc4hJ4/sNjWCSS9AmnS40x3bNMDTknHgL5UaMBTMyJnU90EgWh1Rz+MC9eFu4BuN/UwZjKQuY/1v3rM7HMfg==", - "license": "MIT", - "dependencies": { - "define-data-property": "^1.1.4", - "es-errors": "^1.3.0", - "function-bind": "^1.1.2", - "get-intrinsic": "^1.2.4", - "gopd": "^1.0.1", - "has-property-descriptors": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/setprototypeof": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.2.0.tgz", - "integrity": "sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==", - "license": "ISC" - }, - "node_modules/sha.js": { - "version": "2.4.12", - "resolved": "https://registry.npmjs.org/sha.js/-/sha.js-2.4.12.tgz", - "integrity": "sha512-8LzC5+bvI45BjpfXU8V5fdU2mfeKiQe1D1gIMn7XUlF3OTUrpdJpPPH4EMAnF0DsHHdSZqCdSss5qCmJKuiO3w==", - "license": "(MIT AND BSD-3-Clause)", - "dependencies": { - "inherits": "^2.0.4", - "safe-buffer": "^5.2.1", - "to-buffer": "^1.2.0" - }, - "bin": { - "sha.js": "bin.js" - }, - "engines": { - "node": ">= 0.10" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "license": "MIT", - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/side-channel": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.1.0.tgz", - "integrity": "sha512-ZX99e6tRweoUXqR+VBrslhda51Nh5MTQwou5tnUDgbtyM0dBgmhEDtWGP/xbKn6hqfPRHujUNwz5fy/wbbhnpw==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3", - "side-channel-list": "^1.0.0", - "side-channel-map": "^1.0.1", - "side-channel-weakmap": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-list": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/side-channel-list/-/side-channel-list-1.0.0.tgz", - "integrity": "sha512-FCLHtRD/gnpCiCHEiJLOwdmFP+wzCmDEkc9y7NsYxeF4u7Btsn1ZuwgwJGxImImHicJArLP4R0yX4c2KCrMrTA==", - "license": "MIT", - "dependencies": { - "es-errors": "^1.3.0", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-map": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/side-channel-map/-/side-channel-map-1.0.1.tgz", - "integrity": "sha512-VCjCNfgMsby3tTdo02nbjtM/ewra6jPHmpThenkTYh8pG9ucZ/1P8So4u4FGBek/BjpOVsDCMoLA/iuBKIFXRA==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/side-channel-weakmap": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/side-channel-weakmap/-/side-channel-weakmap-1.0.2.tgz", - "integrity": "sha512-WPS/HvHQTYnHisLo9McqBHOJk2FkHO/tlpvldyrnem4aeQp4hai3gythswg6p01oSoTl58rcpiFAjF2br2Ak2A==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.2", - "es-errors": "^1.3.0", - "get-intrinsic": "^1.2.5", - "object-inspect": "^1.13.3", - "side-channel-map": "^1.0.1" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/signal-exit": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", - "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", - "license": "ISC", - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/simple-swizzle": { - "version": "0.2.2", - "resolved": "https://registry.npmjs.org/simple-swizzle/-/simple-swizzle-0.2.2.tgz", - "integrity": "sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==", - "license": "MIT", - "dependencies": { - "is-arrayish": "^0.3.1" - } - }, - "node_modules/simple-update-notifier": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz", - "integrity": "sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "semver": "^7.5.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/slash": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", - "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/socket.io": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.8.1.tgz", - "integrity": "sha512-oZ7iUCxph8WYRHHcjBEc9unw3adt5CmSNlppj/5Q4k2RIrhl8Z5yY2Xr4j9zj0+wzVZ0bxmYoGSzKJnRl6A4yg==", - "license": "MIT", - "dependencies": { - "accepts": "~1.3.4", - "base64id": "~2.0.0", - "cors": "~2.8.5", - "debug": "~4.3.2", - "engine.io": "~6.6.0", - "socket.io-adapter": "~2.5.2", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.2.0" - } - }, - "node_modules/socket.io-adapter": { - "version": "2.5.5", - "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.5.tgz", - "integrity": "sha512-eLDQas5dzPgOWCk9GuuJC2lBqItuhKI4uxGgo9aIV7MYbk2h9Q6uULEh8WBzThoI7l+qU9Ast9fVUmkqPP9wYg==", - "license": "MIT", - "dependencies": { - "debug": "~4.3.4", - "ws": "~8.17.1" - } - }, - "node_modules/socket.io-adapter/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-client": { - "version": "4.8.1", - "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.8.1.tgz", - "integrity": "sha512-hJVXfu3E28NmzGk8o1sHhN3om52tRvwYeidbj7xKy2eIIse5IoKX3USlS6Tqt3BHAtflLIkCQBkzVrEEfWUyYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.2", - "engine.io-client": "~6.6.1", - "socket.io-parser": "~4.2.4" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-client/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io-parser": { - "version": "4.2.4", - "resolved": "https://registry.npmjs.org/socket.io-parser/-/socket.io-parser-4.2.4.tgz", - "integrity": "sha512-/GbIKmo8ioc+NIWIhwdecY0ge+qVBSMdgxGygevmdHj24bsfgtCmcUUcQ5ZzcylGFHsN3k4HB4Cgkl96KVnuew==", - "license": "MIT", - "dependencies": { - "@socket.io/component-emitter": "~3.1.0", - "debug": "~4.3.1" - }, - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/socket.io-parser/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/accepts": { - "version": "1.3.8", - "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.8.tgz", - "integrity": "sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==", - "license": "MIT", - "dependencies": { - "mime-types": "~2.1.34", - "negotiator": "0.6.3" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/debug": { - "version": "4.3.7", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.7.tgz", - "integrity": "sha512-Er2nc/H7RrMXZBFCEim6TCmMk02Z8vLC2Rbi1KEBggpo0fS6l0S1nnapwmIi3yW/+GOJap1Krg4w0Hg80oCqgQ==", - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/socket.io/node_modules/mime-db": { - "version": "1.52.0", - "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", - "integrity": "sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/mime-types": { - "version": "2.1.35", - "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.35.tgz", - "integrity": "sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==", - "license": "MIT", - "dependencies": { - "mime-db": "1.52.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/socket.io/node_modules/negotiator": { - "version": "0.6.3", - "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.3.tgz", - "integrity": "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==", - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/source-map": { - "version": "0.6.1", - "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", - "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", - "dev": true, - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/source-map-support": { - "version": "0.5.13", - "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz", - "integrity": "sha512-SHSKFHadjVA5oR4PPqhtAVdcBWwRYVd6g6cAXnIbRiIwc2EhPrTuKUBdSLvlEKyIP3GCf89fltvcZiP9MMFA1w==", - "dev": true, - "license": "MIT", - "dependencies": { - "buffer-from": "^1.0.0", - "source-map": "^0.6.0" - } - }, - "node_modules/split-on-first": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/split-on-first/-/split-on-first-1.1.0.tgz", - "integrity": "sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/split2": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/split2/-/split2-4.2.0.tgz", - "integrity": "sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==", - "license": "ISC", - "engines": { - "node": ">= 10.x" - } - }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/sql-highlight": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/sql-highlight/-/sql-highlight-6.1.0.tgz", - "integrity": "sha512-ed7OK4e9ywpE7pgRMkMQmZDPKSVdm0oX5IEtZiKnFucSF0zu6c80GZBe38UqHuVhTWJ9xsKgSMjCG2bml86KvA==", - "funding": [ - "https://github.com/scriptcoded/sql-highlight?sponsor=1", - { - "type": "github", - "url": "https://github.com/sponsors/scriptcoded" - } - ], - "license": "MIT", - "engines": { - "node": ">=14" - } - }, - "node_modules/stack-trace": { - "version": "0.0.10", - "resolved": "https://registry.npmjs.org/stack-trace/-/stack-trace-0.0.10.tgz", - "integrity": "sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==", - "license": "MIT", - "engines": { - "node": "*" - } - }, - "node_modules/stack-utils": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/stack-utils/-/stack-utils-2.0.6.tgz", - "integrity": "sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^2.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/statuses": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", - "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/stream-chain": { - "version": "2.2.5", - "resolved": "https://registry.npmjs.org/stream-chain/-/stream-chain-2.2.5.tgz", - "integrity": "sha512-1TJmBx6aSWqZ4tx7aTpBDXK0/e2hhcNSTV8+CbFJtDjbb+I1mZ8lHit0Grw9GRT+6JbIrrDd8esncgBi8aBXGA==", - "license": "BSD-3-Clause" - }, - "node_modules/stream-json": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/stream-json/-/stream-json-1.9.1.tgz", - "integrity": "sha512-uWkjJ+2Nt/LO9Z/JyKZbMusL8Dkh97uUBTv3AJQ74y07lVahLY4eEFsPsE97pxYBwr8nnjMAIch5eqI0gPShyw==", - "license": "BSD-3-Clause", - "dependencies": { - "stream-chain": "^2.2.5" - } - }, - "node_modules/streamsearch": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/streamsearch/-/streamsearch-1.1.0.tgz", - "integrity": "sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==", - "engines": { - "node": ">=10.0.0" - } - }, - "node_modules/strict-uri-encode": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strict-uri-encode/-/strict-uri-encode-2.0.0.tgz", - "integrity": "sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/string_decoder": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", - "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", - "license": "MIT", - "dependencies": { - "safe-buffer": "~5.2.0" - } - }, - "node_modules/string-length": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", - "integrity": "sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "char-regex": "^1.0.2", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/string-length/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-length/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", - "license": "MIT", - "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/string-width-cjs": { - "name": "string-width", - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/string-width-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/string-width-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/strip-ansi-cjs": { - "name": "strip-ansi", - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/strip-final-newline": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-2.0.0.tgz", - "integrity": "sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/strnum": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/strnum/-/strnum-2.1.1.tgz", - "integrity": "sha512-7ZvoFTiCnGxBtDqJ//Cu6fWtZtc7Y3x+QOirG15wztbdngGSkht27o2pyGWrVy0b4WAy3jbKmnoK6g5VlVNUUw==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/NaturalIntelligence" - } - ], - "license": "MIT" - }, - "node_modules/superagent": { - "version": "10.2.3", - "resolved": "https://registry.npmjs.org/superagent/-/superagent-10.2.3.tgz", - "integrity": "sha512-y/hkYGeXAj7wUMjxRbB21g/l6aAEituGXM9Rwl4o20+SX3e8YOSV6BxFXl+dL3Uk0mjSL3kCbNkwURm8/gEDig==", - "dev": true, - "license": "MIT", - "dependencies": { - "component-emitter": "^1.3.1", - "cookiejar": "^2.1.4", - "debug": "^4.3.7", - "fast-safe-stringify": "^2.1.1", - "form-data": "^4.0.4", - "formidable": "^3.5.4", - "methods": "^1.1.2", - "mime": "2.6.0", - "qs": "^6.11.2" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/supertest": { - "version": "7.1.4", - "resolved": "https://registry.npmjs.org/supertest/-/supertest-7.1.4.tgz", - "integrity": "sha512-tjLPs7dVyqgItVFirHYqe2T+MfWc2VOBQ8QFKKbWTA3PU7liZR8zoSpAi/C1k1ilm9RsXIKYf197oap9wXGVYg==", - "dev": true, - "license": "MIT", - "dependencies": { - "methods": "^1.1.2", - "superagent": "^10.2.3" - }, - "engines": { - "node": ">=14.18.0" - } - }, - "node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/swagger-jsdoc": { - "version": "6.2.8", - "resolved": "https://registry.npmjs.org/swagger-jsdoc/-/swagger-jsdoc-6.2.8.tgz", - "integrity": "sha512-VPvil1+JRpmJ55CgAtn8DIcpBs0bL5L3q5bVQvF4tAW/k/9JYSj7dCpaYCAv5rufe0vcCbBRQXGvzpkWjvLklQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "commander": "6.2.0", - "doctrine": "3.0.0", - "glob": "7.1.6", - "lodash.mergewith": "^4.6.2", - "swagger-parser": "^10.0.3", - "yaml": "2.0.0-1" - }, - "bin": { - "swagger-jsdoc": "bin/swagger-jsdoc.js" - }, - "engines": { - "node": ">=12.0.0" - } - }, - "node_modules/swagger-jsdoc/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/swagger-jsdoc/node_modules/glob": { - "version": "7.1.6", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", - "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.0.4", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/swagger-jsdoc/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/swagger-parser": { - "version": "10.0.3", - "resolved": "https://registry.npmjs.org/swagger-parser/-/swagger-parser-10.0.3.tgz", - "integrity": "sha512-nF7oMeL4KypldrQhac8RyHerJeGPD1p2xDh900GPvc+Nk7nWP6jX2FcC7WmkinMoAmoO774+AFXcWsW8gMWEIg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@apidevtools/swagger-parser": "10.0.3" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/swagger-ui-dist": { - "version": "5.27.1", - "resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.27.1.tgz", - "integrity": "sha512-oGtpYO3lnoaqyGtlJalvryl7TwzgRuxpOVWqEHx8af0YXI+Kt+4jMpLdgMtMcmWmuQ0QTCHLKExwrBFMSxvAUA==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@scarf/scarf": "=1.4.0" - } - }, - "node_modules/swagger-ui-express": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz", - "integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==", - "dev": true, - "license": "MIT", - "dependencies": { - "swagger-ui-dist": ">=5.0.0" - }, - "engines": { - "node": ">= v0.10.32" - }, - "peerDependencies": { - "express": ">=4.0.0 || >=5.0.0-beta" - } - }, - "node_modules/synckit": { - "version": "0.11.11", - "resolved": "https://registry.npmjs.org/synckit/-/synckit-0.11.11.tgz", - "integrity": "sha512-MeQTA1r0litLUf0Rp/iisCaL8761lKAZHaimlbGK4j0HysC4PLfqygQj9srcs0m2RdtDYnF8UuYyKpbjHYp7Jw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@pkgr/core": "^0.2.9" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/synckit" - } - }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "license": "ISC", - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/test-exclude/node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "license": "MIT", - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/test-exclude/node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "deprecated": "Glob versions prior to v9 are no longer supported", - "dev": true, - "license": "ISC", - "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" - }, - "engines": { - "node": "*" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/test-exclude/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/text-hex": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/text-hex/-/text-hex-1.0.0.tgz", - "integrity": "sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==", - "license": "MIT" - }, - "node_modules/through2": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/through2/-/through2-4.0.2.tgz", - "integrity": "sha512-iOqSav00cVxEEICeD7TjLB1sueEL+81Wpzp2bY17uZjZN0pWZPuo4suZ/61VujxmqSGFfgOcNuTZ85QJwNZQpw==", - "license": "MIT", - "dependencies": { - "readable-stream": "3" - } - }, - "node_modules/tmpl": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/tmpl/-/tmpl-1.0.5.tgz", - "integrity": "sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==", - "dev": true, - "license": "BSD-3-Clause" - }, - "node_modules/to-buffer": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/to-buffer/-/to-buffer-1.2.1.tgz", - "integrity": "sha512-tB82LpAIWjhLYbqjx3X4zEeHN6M8CiuOEy2JY8SEQVdYRe3CCHOFaqrBW1doLDrfpWhplcW7BL+bO3/6S3pcDQ==", - "license": "MIT", - "dependencies": { - "isarray": "^2.0.5", - "safe-buffer": "^5.2.1", - "typed-array-buffer": "^1.0.3" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/to-regex-range": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", - "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-number": "^7.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/toidentifier": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.1.tgz", - "integrity": "sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==", - "license": "MIT", - "engines": { - "node": ">=0.6" - } - }, - "node_modules/touch": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/touch/-/touch-3.1.1.tgz", - "integrity": "sha512-r0eojU4bI8MnHr8c5bNo7lJDdI2qXlWWJk6a9EAFG7vbhTjElYhBVS3/miuE0uOuoLdb8Mc/rVfsmm6eo5o9GA==", - "dev": true, - "license": "ISC", - "bin": { - "nodetouch": "bin/nodetouch.js" - } - }, - "node_modules/triple-beam": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/triple-beam/-/triple-beam-1.4.1.tgz", - "integrity": "sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==", - "license": "MIT", - "engines": { - "node": ">= 14.0.0" - } - }, - "node_modules/ts-jest": { - "version": "29.4.1", - "resolved": "https://registry.npmjs.org/ts-jest/-/ts-jest-29.4.1.tgz", - "integrity": "sha512-SaeUtjfpg9Uqu8IbeDKtdaS0g8lS6FT6OzM3ezrDfErPJPHNDo/Ey+VFGP1bQIDfagYDLyRpd7O15XpG1Es2Uw==", - "dev": true, - "license": "MIT", - "dependencies": { - "bs-logger": "^0.2.6", - "fast-json-stable-stringify": "^2.1.0", - "handlebars": "^4.7.8", - "json5": "^2.2.3", - "lodash.memoize": "^4.1.2", - "make-error": "^1.3.6", - "semver": "^7.7.2", - "type-fest": "^4.41.0", - "yargs-parser": "^21.1.1" - }, - "bin": { - "ts-jest": "cli.js" - }, - "engines": { - "node": "^14.15.0 || ^16.10.0 || ^18.0.0 || >=20.0.0" - }, - "peerDependencies": { - "@babel/core": ">=7.0.0-beta.0 <8", - "@jest/transform": "^29.0.0 || ^30.0.0", - "@jest/types": "^29.0.0 || ^30.0.0", - "babel-jest": "^29.0.0 || ^30.0.0", - "jest": "^29.0.0 || ^30.0.0", - "jest-util": "^29.0.0 || ^30.0.0", - "typescript": ">=4.3 <6" - }, - "peerDependenciesMeta": { - "@babel/core": { - "optional": true - }, - "@jest/transform": { - "optional": true - }, - "@jest/types": { - "optional": true - }, - "babel-jest": { - "optional": true - }, - "esbuild": { - "optional": true - }, - "jest-util": { - "optional": true - } - } - }, - "node_modules/ts-jest/node_modules/type-fest": { - "version": "4.41.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz", - "integrity": "sha512-TeTSQ6H5YHvpqVwBRcnLDCBnDOHWYu7IvGbHT6N8AOymcr9PJGjc1GTtiWZTYg0NCgYwvnYWEkVChQAr9bjfwA==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/ts-node": { - "version": "10.9.2", - "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", - "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", - "devOptional": true, - "license": "MIT", - "dependencies": { - "@cspotcode/source-map-support": "^0.8.0", - "@tsconfig/node10": "^1.0.7", - "@tsconfig/node12": "^1.0.7", - "@tsconfig/node14": "^1.0.0", - "@tsconfig/node16": "^1.0.2", - "acorn": "^8.4.1", - "acorn-walk": "^8.1.1", - "arg": "^4.1.0", - "create-require": "^1.1.0", - "diff": "^4.0.1", - "make-error": "^1.1.1", - "v8-compile-cache-lib": "^3.0.1", - "yn": "3.1.1" - }, - "bin": { - "ts-node": "dist/bin.js", - "ts-node-cwd": "dist/bin-cwd.js", - "ts-node-esm": "dist/bin-esm.js", - "ts-node-script": "dist/bin-script.js", - "ts-node-transpile-only": "dist/bin-transpile.js", - "ts-script": "dist/bin-script-deprecated.js" - }, - "peerDependencies": { - "@swc/core": ">=1.2.50", - "@swc/wasm": ">=1.2.50", - "@types/node": "*", - "typescript": ">=2.7" - }, - "peerDependenciesMeta": { - "@swc/core": { - "optional": true - }, - "@swc/wasm": { - "optional": true - } - } - }, - "node_modules/tsconfig-paths": { - "version": "4.2.0", - "resolved": "https://registry.npmjs.org/tsconfig-paths/-/tsconfig-paths-4.2.0.tgz", - "integrity": "sha512-NoZ4roiN7LnbKn9QqE1amc9DJfzvZXxF4xDavcOWt1BPkdx+m+0gJuPM+S0vCe7zTJMYUP0R8pO2XMr+Y8oLIg==", - "license": "MIT", - "dependencies": { - "json5": "^2.2.2", - "minimist": "^1.2.6", - "strip-bom": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-detect": { - "version": "4.0.8", - "resolved": "https://registry.npmjs.org/type-detect/-/type-detect-4.0.8.tgz", - "integrity": "sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/type-fest": { - "version": "0.21.3", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz", - "integrity": "sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==", - "dev": true, - "license": "(MIT OR CC0-1.0)", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/type-is": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/type-is/-/type-is-2.0.1.tgz", - "integrity": "sha512-OZs6gsjF4vMp32qrCbiVSkrFmXtG/AZhY3t0iAMrMBiAZyV9oALtXO8hsrHbMXF9x6L3grlFuwW2oAz7cav+Gw==", - "license": "MIT", - "dependencies": { - "content-type": "^1.0.5", - "media-typer": "^1.1.0", - "mime-types": "^3.0.0" - }, - "engines": { - "node": ">= 0.6" - } - }, - "node_modules/typed-array-buffer": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/typed-array-buffer/-/typed-array-buffer-1.0.3.tgz", - "integrity": "sha512-nAYYwfY3qnzX30IkA6AQZjVbtK6duGontcQm1WSG1MD94YLqK0515GNApXkoxKOWMusVssAHWLh9SeaoefYFGw==", - "license": "MIT", - "dependencies": { - "call-bound": "^1.0.3", - "es-errors": "^1.3.0", - "is-typed-array": "^1.1.14" - }, - "engines": { - "node": ">= 0.4" - } - }, - "node_modules/typedarray": { - "version": "0.0.6", - "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", - "integrity": "sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==", - "license": "MIT" - }, - "node_modules/typeorm": { - "version": "0.3.26", - "resolved": "https://registry.npmjs.org/typeorm/-/typeorm-0.3.26.tgz", - "integrity": "sha512-o2RrBNn3lczx1qv4j+JliVMmtkPSqEGpG0UuZkt9tCfWkoXKu8MZnjvp2GjWPll1SehwemQw6xrbVRhmOglj8Q==", - "license": "MIT", - "dependencies": { - "@sqltools/formatter": "^1.2.5", - "ansis": "^3.17.0", - "app-root-path": "^3.1.0", - "buffer": "^6.0.3", - "dayjs": "^1.11.13", - "debug": "^4.4.0", - "dedent": "^1.6.0", - "dotenv": "^16.4.7", - "glob": "^10.4.5", - "sha.js": "^2.4.11", - "sql-highlight": "^6.0.0", - "tslib": "^2.8.1", - "uuid": "^11.1.0", - "yargs": "^17.7.2" - }, - "bin": { - "typeorm": "cli.js", - "typeorm-ts-node-commonjs": "cli-ts-node-commonjs.js", - "typeorm-ts-node-esm": "cli-ts-node-esm.js" - }, - "engines": { - "node": ">=16.13.0" - }, - "funding": { - "url": "https://opencollective.com/typeorm" - }, - "peerDependencies": { - "@google-cloud/spanner": "^5.18.0 || ^6.0.0 || ^7.0.0", - "@sap/hana-client": "^2.14.22", - "better-sqlite3": "^8.0.0 || ^9.0.0 || ^10.0.0 || ^11.0.0 || ^12.0.0", - "ioredis": "^5.0.4", - "mongodb": "^5.8.0 || ^6.0.0", - "mssql": "^9.1.1 || ^10.0.1 || ^11.0.1", - "mysql2": "^2.2.5 || ^3.0.1", - "oracledb": "^6.3.0", - "pg": "^8.5.1", - "pg-native": "^3.0.0", - "pg-query-stream": "^4.0.0", - "redis": "^3.1.1 || ^4.0.0 || ^5.0.14", - "reflect-metadata": "^0.1.14 || ^0.2.0", - "sql.js": "^1.4.0", - "sqlite3": "^5.0.3", - "ts-node": "^10.7.0", - "typeorm-aurora-data-api-driver": "^2.0.0 || ^3.0.0" - }, - "peerDependenciesMeta": { - "@google-cloud/spanner": { - "optional": true - }, - "@sap/hana-client": { - "optional": true - }, - "better-sqlite3": { - "optional": true - }, - "ioredis": { - "optional": true - }, - "mongodb": { - "optional": true - }, - "mssql": { - "optional": true - }, - "mysql2": { - "optional": true - }, - "oracledb": { - "optional": true - }, - "pg": { - "optional": true - }, - "pg-native": { - "optional": true - }, - "pg-query-stream": { - "optional": true - }, - "redis": { - "optional": true - }, - "sql.js": { - "optional": true - }, - "sqlite3": { - "optional": true - }, - "ts-node": { - "optional": true - }, - "typeorm-aurora-data-api-driver": { - "optional": true - } - } - }, - "node_modules/typescript": { - "version": "5.9.2", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.9.2.tgz", - "integrity": "sha512-CWBzXQrc/qOkhidw1OzBTQuYRbfyxDXJMVJ1XNwUHGROVmuaeiEm3OslpZ1RV96d7SKKjZKrSJu3+t/xlw3R9A==", - "devOptional": true, - "license": "Apache-2.0", - "bin": { - "tsc": "bin/tsc", - "tsserver": "bin/tsserver" - }, - "engines": { - "node": ">=14.17" - } - }, - "node_modules/uglify-js": { - "version": "3.19.3", - "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.19.3.tgz", - "integrity": "sha512-v3Xu+yuwBXisp6QYTcH4UbH+xYJXqnq2m/LtQVWKWzYc1iehYnLixoQDN9FH6/j9/oybfd6W9Ghwkl8+UMKTKQ==", - "dev": true, - "license": "BSD-2-Clause", - "optional": true, - "bin": { - "uglifyjs": "bin/uglifyjs" - }, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/undefsafe": { - "version": "2.0.5", - "resolved": "https://registry.npmjs.org/undefsafe/-/undefsafe-2.0.5.tgz", - "integrity": "sha512-WxONCrssBM8TSPRqN5EmsjVrsv4A8X12J4ArBiiayv3DyyG3ZlIg6yysuuSYdZsVz3TKcTg2fd//Ujd4CHV1iA==", - "dev": true, - "license": "MIT" - }, - "node_modules/undici-types": { - "version": "7.10.0", - "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.10.0.tgz", - "integrity": "sha512-t5Fy/nfn+14LuOc2KNYg75vZqClpAiqscVvMygNnlsHBFpSXdJaYtXMcdNLpl/Qvc3P2cB3s6lOV51nqsFq4ag==", - "license": "MIT" - }, - "node_modules/unpipe": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", - "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/unrs-resolver": { - "version": "1.11.1", - "resolved": "https://registry.npmjs.org/unrs-resolver/-/unrs-resolver-1.11.1.tgz", - "integrity": "sha512-bSjt9pjaEBnNiGgc9rUiHGKv5l4/TGzDmYw3RhnkJGtLhbnnA/5qJj7x3dNDCRx/PJxu774LlH8lCOlB4hEfKg==", - "dev": true, - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "napi-postinstall": "^0.3.0" - }, - "funding": { - "url": "https://opencollective.com/unrs-resolver" - }, - "optionalDependencies": { - "@unrs/resolver-binding-android-arm-eabi": "1.11.1", - "@unrs/resolver-binding-android-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-arm64": "1.11.1", - "@unrs/resolver-binding-darwin-x64": "1.11.1", - "@unrs/resolver-binding-freebsd-x64": "1.11.1", - "@unrs/resolver-binding-linux-arm-gnueabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm-musleabihf": "1.11.1", - "@unrs/resolver-binding-linux-arm64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-arm64-musl": "1.11.1", - "@unrs/resolver-binding-linux-ppc64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-riscv64-musl": "1.11.1", - "@unrs/resolver-binding-linux-s390x-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-gnu": "1.11.1", - "@unrs/resolver-binding-linux-x64-musl": "1.11.1", - "@unrs/resolver-binding-wasm32-wasi": "1.11.1", - "@unrs/resolver-binding-win32-arm64-msvc": "1.11.1", - "@unrs/resolver-binding-win32-ia32-msvc": "1.11.1", - "@unrs/resolver-binding-win32-x64-msvc": "1.11.1" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/util": { - "version": "0.12.5", - "resolved": "https://registry.npmjs.org/util/-/util-0.12.5.tgz", - "integrity": "sha512-kZf/K6hEIrWHI6XqOFUiiMa+79wE/D8Q+NCNAWclkyg3b4d2k7s0QGepNjiABc+aR3N1PAyHL7p6UcLY6LmrnA==", - "license": "MIT", - "dependencies": { - "inherits": "^2.0.3", - "is-arguments": "^1.0.4", - "is-generator-function": "^1.0.7", - "is-typed-array": "^1.1.3", - "which-typed-array": "^1.1.2" - } - }, - "node_modules/util-deprecate": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", - "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==", - "license": "MIT" - }, - "node_modules/uuid": { - "version": "11.1.0", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-11.1.0.tgz", - "integrity": "sha512-0/A9rDy9P7cJ+8w1c9WD9V//9Wj15Ce2MPz8Ri6032usz+NfePxx5AcN3bN+r6ZL6jEo066/yNYB3tn4pQEx+A==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "license": "MIT", - "bin": { - "uuid": "dist/esm/bin/uuid" - } - }, - "node_modules/v8-compile-cache-lib": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", - "devOptional": true, - "license": "MIT" - }, - "node_modules/v8-to-istanbul": { - "version": "9.3.0", - "resolved": "https://registry.npmjs.org/v8-to-istanbul/-/v8-to-istanbul-9.3.0.tgz", - "integrity": "sha512-kiGUalWN+rgBJ/1OHZsBtU4rXZOfj/7rKQxULKlIzwzQSvMJUUNgPwJEEh7gU6xEVxC0ahoOBvN2YI8GH6FNgA==", - "dev": true, - "license": "ISC", - "dependencies": { - "@jridgewell/trace-mapping": "^0.3.12", - "@types/istanbul-lib-coverage": "^2.0.1", - "convert-source-map": "^2.0.0" - }, - "engines": { - "node": ">=10.12.0" - } - }, - "node_modules/v8-to-istanbul/node_modules/@jridgewell/trace-mapping": { - "version": "0.3.30", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.30.tgz", - "integrity": "sha512-GQ7Nw5G2lTu/BtHTKfXhKHok2WGetd4XYcVKGx00SjAk8GMwgJM3zr6zORiPGuOE+/vkc90KtTosSSvaCjKb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/validator": { - "version": "13.15.15", - "resolved": "https://registry.npmjs.org/validator/-/validator-13.15.15.tgz", - "integrity": "sha512-BgWVbCI72aIQy937xbawcs+hrVaN/CZ2UwutgaJ36hGqRrLNM+f5LUT/YPRbo8IV/ASeFzXszezV+y2+rq3l8A==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.10" - } - }, - "node_modules/vary": { - "version": "1.1.2", - "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", - "integrity": "sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==", - "license": "MIT", - "engines": { - "node": ">= 0.8" - } - }, - "node_modules/walker": { - "version": "1.0.8", - "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", - "integrity": "sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "makeerror": "1.0.12" - } - }, - "node_modules/web-encoding": { - "version": "1.1.5", - "resolved": "https://registry.npmjs.org/web-encoding/-/web-encoding-1.1.5.tgz", - "integrity": "sha512-HYLeVCdJ0+lBYV2FvNZmv3HJ2Nt0QYXqZojk3d9FJOLkwnuhzM9tmamh8d7HPM8QqjKH8DeHkFTx+CFlWpZZDA==", - "license": "MIT", - "dependencies": { - "util": "^0.12.3" - }, - "optionalDependencies": { - "@zxing/text-encoding": "0.9.0" - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "license": "ISC", - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/which-typed-array": { - "version": "1.1.19", - "resolved": "https://registry.npmjs.org/which-typed-array/-/which-typed-array-1.1.19.tgz", - "integrity": "sha512-rEvr90Bck4WZt9HHFC4DJMsjvu7x+r6bImz0/BrbWb7A2djJ8hnZMrWnHo9F8ssv0OMErasDhftrfROTyqSDrw==", - "license": "MIT", - "dependencies": { - "available-typed-arrays": "^1.0.7", - "call-bind": "^1.0.8", - "call-bound": "^1.0.4", - "for-each": "^0.3.5", - "get-proto": "^1.0.1", - "gopd": "^1.2.0", - "has-tostringtag": "^1.0.2" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, - "node_modules/winston": { - "version": "3.17.0", - "resolved": "https://registry.npmjs.org/winston/-/winston-3.17.0.tgz", - "integrity": "sha512-DLiFIXYC5fMPxaRg832S6F5mJYvePtmO5G9v9IgUFPhXm9/GkXarH/TUrBAVzhTCzAj9anE/+GjrgXp/54nOgw==", - "license": "MIT", - "dependencies": { - "@colors/colors": "^1.6.0", - "@dabh/diagnostics": "^2.0.2", - "async": "^3.2.3", - "is-stream": "^2.0.0", - "logform": "^2.7.0", - "one-time": "^1.0.0", - "readable-stream": "^3.4.0", - "safe-stable-stringify": "^2.3.1", - "stack-trace": "0.0.x", - "triple-beam": "^1.3.0", - "winston-transport": "^4.9.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/winston-transport": { - "version": "4.9.0", - "resolved": "https://registry.npmjs.org/winston-transport/-/winston-transport-4.9.0.tgz", - "integrity": "sha512-8drMJ4rkgaPo1Me4zD/3WLfI/zPdA9o2IipKODunnGDcuqbHwjsbB79ylv04LCGGzU0xQ6vTznOMpQGaLhhm6A==", - "license": "MIT", - "dependencies": { - "logform": "^2.7.0", - "readable-stream": "^3.6.2", - "triple-beam": "^1.3.0" - }, - "engines": { - "node": ">= 12.0.0" - } - }, - "node_modules/wordwrap": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", - "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs": { - "name": "wrap-ansi", - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", - "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.0.0", - "string-width": "^4.1.0", - "strip-ansi": "^6.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/wrap-ansi-cjs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrap-ansi-cjs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/wrappy": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", - "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", - "license": "ISC" - }, - "node_modules/write-file-atomic": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/write-file-atomic/-/write-file-atomic-5.0.1.tgz", - "integrity": "sha512-+QU2zd6OTD8XWIJCbffaiQeH9U73qIqafo1x6V1snCWYGJf6cVE0cDR4D8xRzcEnfI21IFrUPzPGtcPf8AC+Rw==", - "dev": true, - "license": "ISC", - "dependencies": { - "imurmurhash": "^0.1.4", - "signal-exit": "^4.0.1" - }, - "engines": { - "node": "^14.17.0 || ^16.13.0 || >=18.0.0" - } - }, - "node_modules/ws": { - "version": "8.17.1", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", - "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/xml2js": { - "version": "0.6.2", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.6.2.tgz", - "integrity": "sha512-T4rieHaC1EXcES0Kxxj4JWgaUQHDk+qwHcYOCFHfiwKz7tOVPLq7Hjq9dM1WCMhylqMEfP7hMcOIChvotiZegA==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/xmlhttprequest-ssl": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/xmlhttprequest-ssl/-/xmlhttprequest-ssl-2.1.2.tgz", - "integrity": "sha512-TEU+nJVUUnA4CYJFLvK5X9AOeH4KvDvhIfm0vV1GaQRtchnG0hgK5p8hw/xjv8cunWYCsiPCSDzObPyhEwq3KQ==", - "dev": true, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "license": "MIT", - "engines": { - "node": ">=0.4" - } - }, - "node_modules/y18n": { - "version": "5.0.8", - "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", - "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", - "license": "ISC", - "engines": { - "node": ">=10" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yaml": { - "version": "2.0.0-1", - "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.0.0-1.tgz", - "integrity": "sha512-W7h5dEhywMKenDJh2iX/LABkbFnBxasD27oyXWDS/feDsxiw0dD5ncXdYXgkvAsXIY2MpW/ZKkr9IU30DBdMNQ==", - "dev": true, - "license": "ISC", - "engines": { - "node": ">= 6" - } - }, - "node_modules/yargs": { - "version": "17.7.2", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", - "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", - "license": "MIT", - "dependencies": { - "cliui": "^8.0.1", - "escalade": "^3.1.1", - "get-caller-file": "^2.0.5", - "require-directory": "^2.1.1", - "string-width": "^4.2.3", - "y18n": "^5.0.5", - "yargs-parser": "^21.1.1" - }, - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs-parser": { - "version": "21.1.1", - "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", - "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/yargs/node_modules/ansi-regex": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", - "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/emoji-regex": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "license": "MIT" - }, - "node_modules/yargs/node_modules/string-width": { - "version": "4.2.3", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", - "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^8.0.0", - "is-fullwidth-code-point": "^3.0.0", - "strip-ansi": "^6.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yargs/node_modules/strip-ansi": { - "version": "6.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", - "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^5.0.1" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/yn": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", - "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", - "devOptional": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/z-schema": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/z-schema/-/z-schema-5.0.5.tgz", - "integrity": "sha512-D7eujBWkLa3p2sIpJA0d1pr7es+a7m0vFAnZLlCEKq/Ij2k0MLi9Br2UPxoxdYystm5K1yeBGzub0FlYUEWj2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "lodash.get": "^4.4.2", - "lodash.isequal": "^4.5.0", - "validator": "^13.7.0" - }, - "bin": { - "z-schema": "bin/z-schema" - }, - "engines": { - "node": ">=8.0.0" - }, - "optionalDependencies": { - "commander": "^9.4.1" - } - }, - "node_modules/z-schema/node_modules/commander": { - "version": "9.5.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-9.5.0.tgz", - "integrity": "sha512-KRs7WVDKg86PWiuAqhDrAQnTXZKraVcCc6vFdL14qrZ/DcWwuRo7VoiYXalXO7S5GKpqYiVEwCbgFDfxNHKJBQ==", - "dev": true, - "license": "MIT", - "optional": true, - "engines": { - "node": "^12.20.0 || >=14" - } - } - } -} diff --git a/SerpentRace_Backend/package.json b/SerpentRace_Backend/package.json deleted file mode 100644 index c168cd51..00000000 --- a/SerpentRace_Backend/package.json +++ /dev/null @@ -1,88 +0,0 @@ -{ - "name": "serpentrace_backend", - "version": "1.0.0", - "description": "", - "license": "ISC", - "author": "", - "type": "commonjs", - "main": "index.js", - "scripts": { - "test": "jest", - "test:watch": "jest --watch", - "test:coverage": "jest --coverage", - "test:redis": "jest --testNamePattern=\"RedisService\"", - "start": "node ./dist/Api/index.js", - "dev": "nodemon --watch src --ext ts,json --exec ts-node ./src/Api/index.ts", - "build": "npm run build:clean && npm run build:compile && npm run build:copy-assets", - "build:clean": "rimraf dist", - "build:compile": "tsc", - "build:copy-assets": "node scripts/copy-assets.js", - "build:production": "npm run build:clean && npm run lint && npm run test && npm run migration:run && npm run build:compile && npm run build:copy-assets", - "build:docker": "npm run build:clean && npm run build:compile && npm run build:copy-assets", - "build:advanced": "ts-node scripts/build.ts", - "build:advanced:prod": "ts-node scripts/build.ts --production --migrations --test", - "build:advanced:ci": "ts-node scripts/build.ts --production --migrations --test --skip-lint", - "deploy": "node -e \"console.log('Use deploy.bat on Windows or deploy.sh on Linux/Mac')\"", - "deploy:prod": "npm run build:production && echo 'Build completed - ready for deployment'", - "build:help": "node scripts/build-help.js", - "build:status": "node scripts/build-help.js --status", - "build:quick": "node scripts/build-help.js --quick", - "prebuild": "npm run lint", - "postbuild": "echo 'Build completed successfully!'", - "lint": "echo 'Linting...' && echo 'No linter configured - add ESLint if needed'", - "migration:create": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli migration:create", - "migration:generate": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d ./src/Infrastructure/ormconfig.ts migration:generate", - "migration:run": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d ./src/Infrastructure/ormconfig.ts migration:run", - "migration:revert": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d ./src/Infrastructure/ormconfig.ts migration:revert", - "migration:show": "ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d ./src/Infrastructure/ormconfig.ts migration:show", - "migration:full": "ts-node scripts/generate-migration.ts", - "typecheck": "tsc --noEmit", - "watch": "tsc --watch" - }, - "dependencies": { - "@types/multer": "^2.0.0", - "@types/nodemailer": "^7.0.1", - "@types/uuid": "^10.0.0", - "bcrypt": "^6.0.0", - "cookie-parser": "^1.4.7", - "express": "^5.1.0", - "helmet": "^8.1.0", - "jsonwebtoken": "^9.0.2", - "minio": "^8.0.5", - "multer": "^2.0.2", - "nodemailer": "^7.0.5", - "pg": "^8.16.3", - "redis": "^5.8.1", - "socket.io": "^4.8.1", - "tsconfig-paths": "^4.2.0", - "typeorm": "^0.3.26", - "uuid": "^11.1.0", - "winston": "^3.17.0" - }, - "devDependencies": { - "@jest/globals": "^30.0.5", - "@types/bcrypt": "^6.0.0", - "@types/cookie-parser": "^1.4.9", - "@types/express": "^5.0.3", - "@types/jest": "^30.0.0", - "@types/jsonwebtoken": "^9.0.10", - "@types/node": "^24.3.3", - "@types/pg": "^8.15.5", - "@types/redis": "^4.0.10", - "@types/socket.io": "^3.0.1", - "@types/socket.io-client": "^1.4.36", - "@types/supertest": "^6.0.3", - "@types/swagger-jsdoc": "^6.0.4", - "@types/swagger-ui-express": "^4.1.8", - "jest": "^30.0.5", - "nodemon": "^3.1.10", - "rimraf": "^5.0.10", - "socket.io-client": "^4.8.1", - "supertest": "^7.1.4", - "swagger-jsdoc": "^6.2.8", - "swagger-ui-express": "^5.0.1", - "ts-jest": "^29.4.1", - "ts-node": "^10.9.2", - "typescript": "^5.9.2" - } -} diff --git a/SerpentRace_Backend/scripts/build-help.js b/SerpentRace_Backend/scripts/build-help.js deleted file mode 100644 index 183e9dff..00000000 --- a/SerpentRace_Backend/scripts/build-help.js +++ /dev/null @@ -1,115 +0,0 @@ -#!/usr/bin/env node - -const { execSync } = require('child_process'); -const fs = require('fs'); -const path = require('path'); - -/** - * Build System Helper - Shows available build commands and their descriptions - */ - -const commands = { - 'Development Commands': { - 'npm run dev': 'Start development server with hot reload', - 'npm run watch': 'Watch mode TypeScript compilation', - 'npm run typecheck': 'Type checking without code generation' - }, - 'Build Commands': { - 'npm run build': 'Standard build: clean → compile → copy assets', - 'npm run build:clean': 'Clean the dist directory', - 'npm run build:compile': 'Compile TypeScript to JavaScript', - 'npm run build:copy-assets': 'Copy non-TS files to dist directory', - 'npm run build:docker': 'Build for Docker (no tests/migrations)' - }, - 'Production Build Commands': { - 'npm run build:production': 'Full production build with linting, tests, and migrations', - 'npm run build:advanced': 'Advanced build script with custom options', - 'npm run build:advanced:prod': 'Advanced production build with all validations', - 'npm run build:advanced:ci': 'CI/CD friendly build (skips linting)', - 'npm run deploy:prod': 'Build for production deployment' - }, - 'Database Commands': { - 'npm run migration:run': 'Run pending database migrations', - 'npm run migration:show': 'Show migration status', - 'npm run migration:generate ': 'Generate new migration', - 'npm run migration:create ': 'Create empty migration', - 'npm run migration:revert': 'Revert last migration', - 'npm run migration:full ': 'Create, generate, and run migration' - }, - 'Testing Commands': { - 'npm test': 'Run all tests', - 'npm run test:watch': 'Run tests in watch mode', - 'npm run test:coverage': 'Run tests with coverage report', - 'npm run test:redis': 'Run Redis-specific tests' - }, - 'Deployment Scripts': { - 'scripts/deploy.sh': 'Full Linux/Mac deployment script', - 'scripts/deploy.bat': 'Full Windows deployment script' - } -}; - -function showCommands() { - console.log('🔧 SerpentRace Backend Build System\n'); - - Object.entries(commands).forEach(([category, categoryCommands]) => { - console.log(`\x1b[36m${category}\x1b[0m`); - console.log('=' .repeat(category.length)); - - Object.entries(categoryCommands).forEach(([command, description]) => { - console.log(` \x1b[32m${command.padEnd(35)}\x1b[0m ${description}`); - }); - - console.log(''); - }); - - console.log('\x1b[33mQuick Start:\x1b[0m'); - console.log(' npm run build # Basic build'); - console.log(' npm run build:production # Production build'); - console.log(' npm run dev # Development server\n'); - - console.log('\x1b[33mDocumentation:\x1b[0m'); - console.log(' See BUILD.md for detailed documentation'); -} - -function checkBuildStatus() { - const distPath = path.join(__dirname, '..', 'dist'); - - if (fs.existsSync(distPath)) { - const stats = fs.statSync(distPath); - console.log(`\x1b[32m✅ Last build:\x1b[0m ${stats.mtime.toLocaleString()}`); - - const indexPath = path.join(distPath, 'Api', 'index.js'); - if (fs.existsSync(indexPath)) { - console.log('\x1b[32m✅ Main entry point built successfully\x1b[0m'); - } else { - console.log('\x1b[31m❌ Main entry point missing\x1b[0m'); - } - } else { - console.log('\x1b[33m⚠️ No build found - run "npm run build" first\x1b[0m'); - } -} - -// Handle command line arguments -const args = process.argv.slice(2); - -if (args.includes('--help') || args.includes('-h')) { - showCommands(); -} else if (args.includes('--status') || args.includes('-s')) { - checkBuildStatus(); -} else if (args.includes('--quick') || args.includes('-q')) { - console.log('🚀 Quick build starting...'); - try { - execSync('npm run build', { stdio: 'inherit' }); - } catch (error) { - console.error('❌ Quick build failed'); - process.exit(1); - } -} else { - showCommands(); - checkBuildStatus(); - - console.log('\n\x1b[33mOptions:\x1b[0m'); - console.log(' --help, -h Show this help'); - console.log(' --status, -s Show build status only'); - console.log(' --quick, -q Run quick build'); -} diff --git a/SerpentRace_Backend/scripts/build.ts b/SerpentRace_Backend/scripts/build.ts deleted file mode 100644 index 81185407..00000000 --- a/SerpentRace_Backend/scripts/build.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { execSync } from 'child_process'; -import { existsSync, rmSync } from 'fs'; -import { join } from 'path'; - -/** - * Comprehensive Build Script for SerpentRace Backend - * Handles TypeScript compilation, migrations, asset copying, and validation - */ - -interface BuildOptions { - runMigrations?: boolean; - runTests?: boolean; - skipLinting?: boolean; - production?: boolean; -} - -class BuildManager { - private distDir = join(__dirname, '..', 'dist'); - - constructor(private options: BuildOptions = {}) {} - - private log(message: string, level: 'info' | 'error' | 'warn' = 'info') { - const timestamp = new Date().toISOString(); - const prefix = { - info: '🔧', - error: '❌', - warn: '⚠️' - }[level]; - console.log(`${prefix} [${timestamp}] ${message}`); - } - - private execute(command: string, description: string) { - this.log(`${description}...`); - try { - execSync(command, { - stdio: 'inherit', - cwd: join(__dirname, '..') - }); - this.log(`✅ ${description} completed successfully`); - } catch (error) { - this.log(`❌ ${description} failed`, 'error'); - throw error; - } - } - - async clean() { - this.log('Cleaning previous build...'); - if (existsSync(this.distDir)) { - rmSync(this.distDir, { recursive: true, force: true }); - this.log('✅ Previous build cleaned'); - } else { - this.log('No previous build found'); - } - } - - async typecheck() { - this.execute('npx tsc --noEmit', 'Type checking'); - } - - async lint() { - if (this.options.skipLinting) { - this.log('Skipping linting...', 'warn'); - return; - } - - // For now, just check if TypeScript compiles without errors - this.log('Linting (basic type checking)...'); - await this.typecheck(); - } - - async runTests() { - if (!this.options.runTests) { - this.log('Skipping tests...', 'warn'); - return; - } - - this.execute('npm test', 'Running tests'); - } - - async runMigrations() { - if (!this.options.runMigrations) { - this.log('Skipping database migrations...', 'warn'); - return; - } - - try { - this.log('Checking migration status...'); - execSync('npm run migration:show', { - stdio: 'pipe', - cwd: join(__dirname, '..') - }); - - this.execute('npm run migration:run', 'Running database migrations'); - } catch (error) { - this.log('Migration check/run failed - this might be expected in CI/CD environments', 'warn'); - if (this.options.production) { - throw error; // In production builds, migrations should work - } - } - } - - async compile() { - this.execute('npx tsc', 'Compiling TypeScript'); - } - - async copyAssets() { - this.execute('node scripts/copy-assets.js', 'Copying assets'); - } - - async validateBuild() { - this.log('Validating build output...'); - - const expectedFiles = [ - 'dist/Api/index.js', - 'dist/Api/index.d.ts' - ]; - - const missingFiles = expectedFiles.filter(file => - !existsSync(join(__dirname, '..', file)) - ); - - if (missingFiles.length > 0) { - this.log(`Missing expected build files: ${missingFiles.join(', ')}`, 'error'); - throw new Error('Build validation failed'); - } - - this.log('✅ Build validation completed'); - } - - async build() { - const startTime = Date.now(); - - try { - this.log('🚀 Starting SerpentRace Backend build process...'); - - // Step 1: Clean previous build - await this.clean(); - - // Step 2: Lint code (if not skipped) - await this.lint(); - - // Step 3: Run tests (if enabled) - await this.runTests(); - - // Step 4: Run migrations (if enabled) - await this.runMigrations(); - - // Step 5: Compile TypeScript - await this.compile(); - - // Step 6: Copy assets - await this.copyAssets(); - - // Step 7: Validate build - await this.validateBuild(); - - const duration = ((Date.now() - startTime) / 1000).toFixed(2); - this.log(`🎉 Build completed successfully in ${duration}s`); - - } catch (error) { - const duration = ((Date.now() - startTime) / 1000).toFixed(2); - this.log(`💥 Build failed after ${duration}s`, 'error'); - - if (error instanceof Error) { - this.log(`Error: ${error.message}`, 'error'); - } - - process.exit(1); - } - } -} - -// Parse command line arguments -const args = process.argv.slice(2); -const options: BuildOptions = { - runMigrations: args.includes('--migrations'), - runTests: args.includes('--test'), - skipLinting: args.includes('--skip-lint'), - production: args.includes('--production') -}; - -// Create and run build -const buildManager = new BuildManager(options); -buildManager.build().catch(error => { - console.error('Unhandled build error:', error); - process.exit(1); -}); diff --git a/SerpentRace_Backend/scripts/copy-assets.js b/SerpentRace_Backend/scripts/copy-assets.js deleted file mode 100644 index 1f9c26e3..00000000 --- a/SerpentRace_Backend/scripts/copy-assets.js +++ /dev/null @@ -1,62 +0,0 @@ -const fs = require('fs'); -const path = require('path'); - -/** - * Copy Assets Script for SerpentRace Backend - * Copies non-TypeScript files to the dist directory - */ - -const srcDir = path.join(__dirname, '..', 'src'); -const distDir = path.join(__dirname, '..', 'dist'); - -// File extensions to copy -const assetExtensions = ['.json', '.html', '.css', '.png', '.jpg', '.jpeg', '.gif', '.svg', '.ico', '.woff', '.woff2', '.ttf', '.eot']; - -// Directories to exclude from copying -const excludeDirs = ['node_modules', '.git', 'tests', '__tests__']; - -function copyAssets(srcPath, distPath) { - if (!fs.existsSync(srcPath)) { - console.log(`Source directory ${srcPath} does not exist`); - return; - } - - if (!fs.existsSync(distPath)) { - fs.mkdirSync(distPath, { recursive: true }); - } - - const items = fs.readdirSync(srcPath); - - items.forEach(item => { - const srcItemPath = path.join(srcPath, item); - const distItemPath = path.join(distPath, item); - const stat = fs.statSync(srcItemPath); - - if (stat.isDirectory()) { - // Skip excluded directories - if (excludeDirs.includes(item)) { - return; - } - - // Recursively copy subdirectories - copyAssets(srcItemPath, distItemPath); - } else { - const ext = path.extname(item).toLowerCase(); - - // Copy asset files - if (assetExtensions.includes(ext)) { - console.log(`Copying asset: ${srcItemPath} -> ${distItemPath}`); - fs.copyFileSync(srcItemPath, distItemPath); - } - } - }); -} - -try { - console.log('Copying assets from src to dist...'); - copyAssets(srcDir, distDir); - console.log('Asset copying completed successfully!'); -} catch (error) { - console.error('Error copying assets:', error); - process.exit(1); -} diff --git a/SerpentRace_Backend/scripts/deploy.bat b/SerpentRace_Backend/scripts/deploy.bat deleted file mode 100644 index 465ad1dc..00000000 --- a/SerpentRace_Backend/scripts/deploy.bat +++ /dev/null @@ -1,233 +0,0 @@ -@echo off -REM SerpentRace Backend Production Deployment Script for Windows -REM This script handles the complete deployment process - -setlocal EnableDelayedExpansion - -set "SCRIPT_START=%TIME%" - -REM Colors simulation for Windows (using echo with different prefixes) -set "LOG_PREFIX=[INFO]" -set "ERROR_PREFIX=[ERROR]" -set "WARN_PREFIX=[WARN]" - -:log -echo %LOG_PREFIX% [%DATE% %TIME%] %~1 -goto :eof - -:error -echo %ERROR_PREFIX% [%DATE% %TIME%] %~1 -goto :eof - -:warn -echo %WARN_PREFIX% [%DATE% %TIME%] %~1 -goto :eof - -:check_env -call :log "Checking environment variables..." - -set "required_vars=DB_HOST DB_PORT DB_USERNAME DB_PASSWORD DB_NAME JWT_SECRET REDIS_HOST REDIS_PORT" -set "missing_vars=" - -for %%v in (%required_vars%) do ( - call set "var_value=%%!%%v!%%" - if "!var_value!"=="" ( - set "missing_vars=!missing_vars! %%v" - ) -) - -if not "!missing_vars!"==" " ( - call :error "Missing required environment variables:!missing_vars!" - call :error "Please set these variables before running the deployment" - exit /b 1 -) - -call :log "All required environment variables are set" -goto :eof - -:install_dependencies -call :log "Installing production dependencies..." -npm ci --only=production -if !errorlevel! neq 0 ( - call :error "Failed to install dependencies" - exit /b 1 -) -call :log "Dependencies installed successfully" -goto :eof - -:run_build -call :log "Running production build..." -npm run build:production -if !errorlevel! neq 0 ( - call :error "Build failed" - exit /b 1 -) -call :log "Build completed successfully" -goto :eof - -:test_database -call :log "Testing database connectivity..." - -echo import { AppDataSource } from './src/Infrastructure/ormconfig'; > test-db-temp.ts -echo. >> test-db-temp.ts -echo async function testConnection() { >> test-db-temp.ts -echo try { >> test-db-temp.ts -echo await AppDataSource.initialize(); >> test-db-temp.ts -echo console.log('✅ Database connection successful'^); >> test-db-temp.ts -echo await AppDataSource.destroy(); >> test-db-temp.ts -echo process.exit(0^); >> test-db-temp.ts -echo } catch (error^) { >> test-db-temp.ts -echo console.error('❌ Database connection failed:', error^); >> test-db-temp.ts -echo process.exit(1^); >> test-db-temp.ts -echo } >> test-db-temp.ts -echo } >> test-db-temp.ts -echo. >> test-db-temp.ts -echo testConnection(); >> test-db-temp.ts - -npx ts-node test-db-temp.ts -set "db_test_result=!errorlevel!" -del test-db-temp.ts 2>nul - -if !db_test_result! neq 0 ( - call :error "Database connectivity test failed" - exit /b 1 -) - -call :log "Database connectivity test passed" -goto :eof - -:test_redis -call :log "Testing Redis connectivity..." - -echo import { createClient } from 'redis'; > test-redis-temp.ts -echo. >> test-redis-temp.ts -echo async function testRedis() { >> test-redis-temp.ts -echo const client = createClient({ >> test-redis-temp.ts -echo socket: { >> test-redis-temp.ts -echo host: process.env.REDIS_HOST ^|^| 'localhost', >> test-redis-temp.ts -echo port: parseInt(process.env.REDIS_PORT ^|^| '6379'^) >> test-redis-temp.ts -echo } >> test-redis-temp.ts -echo }^); >> test-redis-temp.ts -echo. >> test-redis-temp.ts -echo try { >> test-redis-temp.ts -echo await client.connect(); >> test-redis-temp.ts -echo await client.ping(); >> test-redis-temp.ts -echo console.log('✅ Redis connection successful'^); >> test-redis-temp.ts -echo await client.disconnect(); >> test-redis-temp.ts -echo process.exit(0^); >> test-redis-temp.ts -echo } catch (error^) { >> test-redis-temp.ts -echo console.error('❌ Redis connection failed:', error^); >> test-redis-temp.ts -echo process.exit(1^); >> test-redis-temp.ts -echo } >> test-redis-temp.ts -echo } >> test-redis-temp.ts -echo. >> test-redis-temp.ts -echo testRedis(); >> test-redis-temp.ts - -npx ts-node test-redis-temp.ts -set "redis_test_result=!errorlevel!" -del test-redis-temp.ts 2>nul - -if !redis_test_result! neq 0 ( - call :warn "Redis connectivity test failed - continuing anyway" -) else ( - call :log "Redis connectivity test passed" -) -goto :eof - -:setup_directories -call :log "Setting up required directories..." -if not exist "logs" mkdir logs -if not exist "uploads" mkdir uploads -call :log "Directories created" -goto :eof - -:start_app -call :log "Starting application for validation..." - -REM Start the app in background -start /B "" npm start - -REM Wait for app to start -timeout /t 10 /nobreak >nul - -REM Test if the health endpoint responds (using curl if available) -set "PORT_VAR=!PORT!" -if "!PORT_VAR!"=="" set "PORT_VAR=3000" - -curl -f http://localhost:!PORT_VAR!/health >nul 2>&1 -if !errorlevel! equ 0 ( - call :log "Application health check passed" - REM Try to stop the background process (this is tricky in batch) - taskkill /F /IM node.exe /FI "WINDOWTITLE eq npm start*" >nul 2>&1 -) else ( - call :error "Application health check failed" - taskkill /F /IM node.exe /FI "WINDOWTITLE eq npm start*" >nul 2>&1 - exit /b 1 -) -goto :eof - -:deploy -call :log "🚀 Starting SerpentRace Backend production deployment..." - -call :check_env -if !errorlevel! neq 0 exit /b 1 - -call :install_dependencies -if !errorlevel! neq 0 exit /b 1 - -call :run_build -if !errorlevel! neq 0 exit /b 1 - -call :setup_directories -if !errorlevel! neq 0 exit /b 1 - -call :test_database -if !errorlevel! neq 0 exit /b 1 - -call :test_redis -REM Redis test failure is not fatal - -if not "%SKIP_APP_TEST%"=="true" ( - call :start_app - if !errorlevel! neq 0 exit /b 1 -) else ( - call :warn "Skipping application startup test" -) - -call :log "🎉 Deployment completed successfully!" -call :log "You can now start the application with: npm start" -goto :eof - -:build_only -call :log "Running build-only deployment..." -call :check_env -if !errorlevel! neq 0 exit /b 1 -call :install_dependencies -if !errorlevel! neq 0 exit /b 1 -call :run_build -if !errorlevel! neq 0 exit /b 1 -call :setup_directories -call :log "Build-only deployment completed" -goto :eof - -:test_connections -call :log "Testing connections only..." -call :check_env -if !errorlevel! neq 0 exit /b 1 -call :test_database -if !errorlevel! neq 0 exit /b 1 -call :test_redis -call :log "Connection tests completed" -goto :eof - -REM Main script logic -if "%1"=="" goto deploy -if "%1"=="deploy" goto deploy -if "%1"=="build-only" goto build_only -if "%1"=="test-connections" goto test_connections - -echo Usage: %0 [deploy^|build-only^|test-connections] -echo deploy - Full deployment (default) -echo build-only - Only build, skip tests -echo test-connections - Test database and Redis connections -exit /b 1 diff --git a/SerpentRace_Backend/scripts/deploy.sh b/SerpentRace_Backend/scripts/deploy.sh deleted file mode 100644 index 4af6b641..00000000 --- a/SerpentRace_Backend/scripts/deploy.sh +++ /dev/null @@ -1,237 +0,0 @@ -#!/bin/bash - -# SerpentRace Backend Production Deployment Script -# This script handles the complete deployment process - -set -e # Exit on any error - -# Colors for output -RED='\033[0;31m' -GREEN='\033[0;32m' -YELLOW='\033[1;33m' -BLUE='\033[0;34m' -NC='\033[0m' # No Color - -log() { - echo -e "${GREEN}[$(date +'%Y-%m-%d %H:%M:%S')] $1${NC}" -} - -error() { - echo -e "${RED}[$(date +'%Y-%m-%d %H:%M:%S')] ERROR: $1${NC}" -} - -warn() { - echo -e "${YELLOW}[$(date +'%Y-%m-%d %H:%M:%S')] WARNING: $1${NC}" -} - -info() { - echo -e "${BLUE}[$(date +'%Y-%m-%d %H:%M:%S')] INFO: $1${NC}" -} - -# Check if required environment variables are set -check_env() { - log "Checking environment variables..." - - required_vars=( - "DB_HOST" - "DB_PORT" - "DB_USERNAME" - "DB_PASSWORD" - "DB_NAME" - "JWT_SECRET" - "REDIS_HOST" - "REDIS_PORT" - ) - - missing_vars=() - for var in "${required_vars[@]}"; do - if [ -z "${!var}" ]; then - missing_vars+=("$var") - fi - done - - if [ ${#missing_vars[@]} -ne 0 ]; then - error "Missing required environment variables: ${missing_vars[*]}" - error "Please set these variables before running the deployment" - exit 1 - fi - - log "All required environment variables are set" -} - -# Install dependencies -install_dependencies() { - log "Installing production dependencies..." - npm ci --only=production - log "Dependencies installed successfully" -} - -# Run the comprehensive build process -run_build() { - log "Running production build..." - npm run build:production - log "Build completed successfully" -} - -# Test database connectivity -test_database() { - log "Testing database connectivity..." - - # Use a simple TypeScript script to test connection - cat > /tmp/test-db.ts << 'EOF' -import { AppDataSource } from './src/Infrastructure/ormconfig'; - -async function testConnection() { - try { - await AppDataSource.initialize(); - console.log('✅ Database connection successful'); - await AppDataSource.destroy(); - process.exit(0); - } catch (error) { - console.error('❌ Database connection failed:', error); - process.exit(1); - } -} - -testConnection(); -EOF - - npx ts-node /tmp/test-db.ts || { - error "Database connectivity test failed" - exit 1 - } - - rm -f /tmp/test-db.ts - log "Database connectivity test passed" -} - -# Test Redis connectivity -test_redis() { - log "Testing Redis connectivity..." - - # Use a simple script to test Redis connection - cat > /tmp/test-redis.ts << 'EOF' -import { createClient } from 'redis'; - -async function testRedis() { - const client = createClient({ - socket: { - host: process.env.REDIS_HOST || 'localhost', - port: parseInt(process.env.REDIS_PORT || '6379') - } - }); - - try { - await client.connect(); - await client.ping(); - console.log('✅ Redis connection successful'); - await client.disconnect(); - process.exit(0); - } catch (error) { - console.error('❌ Redis connection failed:', error); - process.exit(1); - } -} - -testRedis(); -EOF - - npx ts-node /tmp/test-redis.ts || { - warn "Redis connectivity test failed - continuing anyway" - } - - rm -f /tmp/test-redis.ts - log "Redis connectivity test completed" -} - -# Create required directories -setup_directories() { - log "Setting up required directories..." - mkdir -p logs - mkdir -p uploads - log "Directories created" -} - -# Start the application (for testing) -start_app() { - log "Starting application for validation..." - - # Start the app in background and test if it responds - npm start & - APP_PID=$! - - # Wait for app to start - sleep 10 - - # Test if the health endpoint responds - if curl -f http://localhost:${PORT:-3000}/health > /dev/null 2>&1; then - log "Application health check passed" - kill $APP_PID - wait $APP_PID 2>/dev/null - else - error "Application health check failed" - kill $APP_PID 2>/dev/null || true - wait $APP_PID 2>/dev/null || true - exit 1 - fi -} - -# Main deployment function -deploy() { - log "🚀 Starting SerpentRace Backend production deployment..." - - # Check environment - check_env - - # Install dependencies - install_dependencies - - # Run build process - run_build - - # Setup directories - setup_directories - - # Test connections - test_database - test_redis - - # Test application startup - if [ "${SKIP_APP_TEST}" != "true" ]; then - start_app - else - warn "Skipping application startup test" - fi - - log "🎉 Deployment completed successfully!" - info "You can now start the application with: npm start" -} - -# Handle script arguments -case "${1:-deploy}" in - "deploy") - deploy - ;; - "build-only") - log "Running build-only deployment..." - check_env - install_dependencies - run_build - setup_directories - log "Build-only deployment completed" - ;; - "test-connections") - log "Testing connections only..." - check_env - test_database - test_redis - log "Connection tests completed" - ;; - *) - echo "Usage: $0 [deploy|build-only|test-connections]" - echo " deploy - Full deployment (default)" - echo " build-only - Only build, skip tests" - echo " test-connections - Test database and Redis connections" - exit 1 - ;; -esac diff --git a/SerpentRace_Backend/scripts/generate-migration.ts b/SerpentRace_Backend/scripts/generate-migration.ts deleted file mode 100644 index 9ad0a8f3..00000000 --- a/SerpentRace_Backend/scripts/generate-migration.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { execSync } from 'child_process'; - -const migrationName = process.argv[2]; - -if (!migrationName) { - console.error('Please provide a migration name: npm run migration:full '); - process.exit(1); -} - -try { - console.log(`Creating migration: ${migrationName}`); - execSync(`npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli migration:create ./src/Infrastructure/Migrationsettings/${migrationName}`, { stdio: 'inherit' }); - - console.log(`Generating migration: ${migrationName}`); - execSync(`npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d ./src/Infrastructure/ormconfig.ts migration:generate ./src/Infrastructure/Migrations/${migrationName}`, { stdio: 'inherit' }); - - console.log('Migration generated successfully!'); - - console.log('Running migration...'); - execSync(`npx ts-node -r tsconfig-paths/register ./node_modules/typeorm/cli -d ./src/Infrastructure/ormconfig.ts migration:run`, { stdio: 'inherit' }); -} catch (error) { - if (error instanceof Error) { - console.error('Migration failed:', error.message); - } else { - console.error('Migration failed:', error); - } - process.exit(1); -} \ No newline at end of file diff --git a/SerpentRace_Backend/scripts/test-redis.ps1 b/SerpentRace_Backend/scripts/test-redis.ps1 deleted file mode 100644 index 18d8ecfa..00000000 --- a/SerpentRace_Backend/scripts/test-redis.ps1 +++ /dev/null @@ -1,21 +0,0 @@ -# PowerShell script to start Redis and run tests -Write-Host "Starting Redis with Docker Compose..." -ForegroundColor Green -docker-compose up -d redis - -# Wait for Redis to be ready -Write-Host "Waiting for Redis to be ready..." -ForegroundColor Yellow -do { - Write-Host "Checking Redis connection..." -ForegroundColor Gray - $result = docker-compose exec redis redis-cli ping 2>$null - if ($result -ne "PONG") { - Start-Sleep -Seconds 2 - } -} while ($result -ne "PONG") - -Write-Host "Redis is ready!" -ForegroundColor Green - -# Run Redis tests -Write-Host "Running Redis tests..." -ForegroundColor Cyan -npm test -- --testNamePattern="RedisService" - -Write-Host "Done!" -ForegroundColor Green diff --git a/SerpentRace_Backend/scripts/test-redis.sh b/SerpentRace_Backend/scripts/test-redis.sh deleted file mode 100644 index 791362ae..00000000 --- a/SerpentRace_Backend/scripts/test-redis.sh +++ /dev/null @@ -1,20 +0,0 @@ -#!/bin/bash - -# Script to start Redis and run tests -echo "Starting Redis with Docker Compose..." -docker-compose up -d redis - -# Wait for Redis to be ready -echo "Waiting for Redis to be ready..." -until docker-compose exec redis redis-cli ping; do - echo "Waiting for Redis..." - sleep 2 -done - -echo "Redis is ready!" - -# Run Redis tests -echo "Running Redis tests..." -npm test -- --testNamePattern="RedisService" - -echo "Done!" diff --git a/SerpentRace_Backend/src/Api/index.ts b/SerpentRace_Backend/src/Api/index.ts deleted file mode 100644 index 9fedf8eb..00000000 --- a/SerpentRace_Backend/src/Api/index.ts +++ /dev/null @@ -1,252 +0,0 @@ -import express from 'express'; -import { createServer } from 'http'; -import cookieParser from 'cookie-parser'; -import helmet from 'helmet'; -import { AppDataSource } from '../Infrastructure/ormconfig'; -import userRouter from './routers/userRouter'; -import organizationRouter from './routers/organizationRouter'; -import deckRouter from './routers/deckRouter'; -import chatRouter from './routers/chatRouter'; -import contactRouter from './routers/contactRouter'; -import adminRouter from './routers/adminRouter'; -import deckImportExportRouter from './routers/deckImportExportRouter'; -import gameRouter from './routers/gameRouter'; -import { LoggingService, logStartup, logConnection, logError, logRequest } from '../Application/Services/Logger'; -import { WebSocketService } from '../Application/Services/WebSocketService'; -import { setupSwagger } from './swagger/swaggerUiSetup'; - -const app = express(); -const httpServer = createServer(app); -const PORT = process.env.PORT || 3000; -const isDevelopment = process.env.NODE_ENV === 'development'; - -const loggingService = LoggingService.getInstance(); - -logStartup('SerpentRace Backend starting up', { - environment: process.env.NODE_ENV || 'development', - port: PORT, - nodeVersion: process.version, - chatInactivityTimeout: process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES || '30' -}); - -app.use(helmet({ - contentSecurityPolicy: isDevelopment ? false : undefined -})); - -app.use(express.json({ limit: '10mb' })); -app.use(express.urlencoded({ extended: true, limit: '10mb' })); -app.use(cookieParser()); - -app.use(loggingService.requestLoggingMiddleware()); - -app.use((req, res, next) => { - const origin = req.headers.origin; - const allowedOrigins = ['http://localhost:3000', 'http://localhost:3001', 'http://localhost:8080']; - - if (!origin || allowedOrigins.includes(origin)) { - res.setHeader('Access-Control-Allow-Origin', origin || '*'); - } - - res.setHeader('Access-Control-Allow-Credentials', 'true'); - res.setHeader('Access-Control-Allow-Methods', 'GET, POST, PUT, DELETE, PATCH, OPTIONS'); - res.setHeader('Access-Control-Allow-Headers', 'Content-Type, Authorization, Cookie'); - - if (req.method === 'OPTIONS') { - res.status(200).end(); - return; - } - - next(); -}); - -if (isDevelopment) { - app.use((req, res, next) => { - logRequest(`${req.method} ${req.path}`, req, res); - next(); - }); -} - -// Setup Swagger documentation -setupSwagger(app); - -app.get('/', (req, res) => { - res.json({ - service: 'SerpentRace Backend API', - status: 'running', - version: '1.0.0', - endpoints: { - swagger: '/api-docs', - users: '/api/users', - organizations: '/api/organizations', - decks: '/api/decks', - chats: '/api/chats', - contacts: '/api/contacts', - admin: '/api/admin', - deckImportExport: '/api/deck-import-export', - health: '/health' - }, - websocket: { - enabled: true, - events: [ - 'chat:join', 'chat:leave', 'message:send', - 'group:create', 'chat:direct', 'game:chat:create', - 'chat:history' - ] - } - }); -}); - -app.get('/health', async (req, res) => { - try { - const isDbConnected = AppDataSource.isInitialized; - - res.json({ - status: 'healthy', - timestamp: new Date().toISOString(), - service: 'SerpentRace Backend API', - version: '1.0.0', - environment: process.env.NODE_ENV || 'development', - database: { - connected: isDbConnected, - type: AppDataSource.options.type - }, - websocket: { - enabled: true - }, - uptime: process.uptime() - }); - } catch (error) { - res.status(503).json({ - status: 'unhealthy', - timestamp: new Date().toISOString(), - error: 'Service health check failed' - }); - } -}); - -// API Routes -app.use('/api/users', userRouter); -app.use('/api/organizations', organizationRouter); -app.use('/api/decks', deckRouter); -app.use('/api/chats', chatRouter); -app.use('/api/contacts', contactRouter); -app.use('/api/admin', adminRouter); -app.use('/api/deck-import-export', deckImportExportRouter); -app.use('/api/games', gameRouter); - -// Global error handler (must be after routes) -app.use(loggingService.errorLoggingMiddleware()); -app.use((error: Error, req: express.Request, res: express.Response, next: express.NextFunction) => { - logError('Global error handler caught unhandled error', error, req, res); - - // Don't expose internal error details in production - const isDevelopment = process.env.NODE_ENV === 'development'; - - res.status(500).json({ - error: 'Internal server error', - timestamp: new Date().toISOString(), - ...(isDevelopment && { details: error.message, stack: error.stack }) - }); -}); - -// Handle 404 routes -app.use((req: express.Request, res: express.Response) => { - res.status(404).json({ - error: 'Route not found', - path: req.originalUrl, - method: req.method, - timestamp: new Date().toISOString() - }); -}); - -// Initialize WebSocket service after database connection -let webSocketService: WebSocketService; - -// Initialize database connection -AppDataSource.initialize() - .then(() => { - const dbOptions = AppDataSource.options as any; - logConnection('Database connection established', 'postgresql', 'success', { - type: dbOptions.type, - host: dbOptions.host, - database: dbOptions.database - }); - - // Initialize WebSocket service after database is connected - webSocketService = new WebSocketService(httpServer); - logStartup('WebSocket service initialized', { - chatInactivityTimeout: process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES || '30' - }); - }) - .catch((error) => { - const dbOptions = AppDataSource.options as any; - logConnection('Database connection failed', 'postgresql', 'failure', { - error: error.message, - type: dbOptions.type, - host: dbOptions.host, - database: dbOptions.database - }); - process.exit(1); - }); - -// Start server with WebSocket support -const server = httpServer.listen(PORT, () => { - logStartup('Server started successfully', { - port: PORT, - environment: process.env.NODE_ENV || 'development', - timestamp: new Date().toISOString(), - endpoints: { - health: `/health`, - swagger: `/api-docs`, - users: `/api/users`, - organizations: `/api/organizations`, - decks: `/api/decks`, - chats: `/api/chats` - }, - websocket: { - enabled: true, - chatInactivityTimeout: `${process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES || '30'} minutes` - } - }); -}); - -// Graceful shutdown -const gracefulShutdown = async (signal: string) => { - logStartup(`Received ${signal}. Shutting down gracefully...`); - - server.close(() => { - logStartup('HTTP server closed'); - - if (AppDataSource.isInitialized) { - AppDataSource.destroy() - .then(() => { - logConnection('Database connection closed', 'postgresql', 'success'); - process.exit(0); - }) - .catch((error) => { - logError('Error during database shutdown', error); - process.exit(1); - }); - } else { - process.exit(0); - } - }); -}; - -process.on('SIGTERM', () => gracefulShutdown('SIGTERM')); -process.on('SIGINT', () => gracefulShutdown('SIGINT')); - -// Handle uncaught exceptions -process.on('uncaughtException', (error) => { - logError('Uncaught Exception - Server will shut down', error); - process.exit(1); -}); - -// Handle unhandled promise rejections -process.on('unhandledRejection', (reason, promise) => { - logError('Unhandled Rejection - Server will shut down', new Error(String(reason)), undefined, undefined); - process.exit(1); -}); - -// Export WebSocket service for game integration -export { webSocketService }; diff --git a/SerpentRace_Backend/src/Api/middleware/optionalAuth.ts b/SerpentRace_Backend/src/Api/middleware/optionalAuth.ts deleted file mode 100644 index 05953518..00000000 --- a/SerpentRace_Backend/src/Api/middleware/optionalAuth.ts +++ /dev/null @@ -1,67 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import { JWTService } from '../../Application/Services/JWTService'; -import { UserState } from '../../Domain/User/UserAggregate'; -import { logAuth, logWarning } from '../../Application/Services/Logger'; - -interface AuthenticatedRequest extends Request { - user?: { - userId: string; - authLevel: 0 | 1; - userStatus: UserState; - orgId: string | null; - }; -} - -/** - * Optional authentication middleware - extracts JWT data if present but doesn't require authentication - * Used for endpoints that work for both authenticated and anonymous users - */ -export const optionalAuth = (req: AuthenticatedRequest, res: Response, next: NextFunction) => { - const jwtService = new JWTService(); - - try { - // Try to extract token from Authorization header or cookies - const authHeader = req.headers.authorization; - const token = authHeader?.startsWith('Bearer ') - ? authHeader.substring(7) - : req.cookies?.auth_token; - - if (token) { - // If token exists, try to verify it - const payload = jwtService.verify(req); - - if (payload) { - req.user = { - userId: payload.userId, - authLevel: payload.authLevel, - userStatus: payload.userStatus, - orgId: payload.orgId || null - }; - - logAuth('Optional auth - user authenticated', payload.userId, { - authLevel: payload.authLevel, - userStatus: payload.userStatus, - orgId: payload.orgId - }); - } else { - logWarning('Optional auth - invalid token provided', { - hasToken: true, - tokenLength: token.length - }); - } - } - - // Continue regardless of authentication status - next(); - - } catch (error) { - // Log the error but continue without authentication - logWarning('Optional auth - error processing token', { - error: error instanceof Error ? error.message : String(error), - hasAuthHeader: !!req.headers.authorization, - hasCookie: !!req.cookies?.auth_token - }); - - next(); - } -}; \ No newline at end of file diff --git a/SerpentRace_Backend/src/Api/routers/adminRouter.ts b/SerpentRace_Backend/src/Api/routers/adminRouter.ts deleted file mode 100644 index d9e62618..00000000 --- a/SerpentRace_Backend/src/Api/routers/adminRouter.ts +++ /dev/null @@ -1,1113 +0,0 @@ -import express, { Request, Response } from 'express'; -import multer from 'multer'; -import { DIContainer } from '../../Application/Services/DIContainer'; -import { adminRequired } from '../../Application/Services/AuthMiddleware'; -import { UserState } from '../../Domain/User/UserAggregate'; -import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware'; -import { ErrorResponseService } from '../../Application/Services/ErrorResponseService'; -import { AdminAuditService } from '../../Application/Services/AdminBypassService'; -import { webSocketService } from '../index'; -import { logRequest, logError, logWarning, logAuth } from '../../Application/Services/Logger'; - -// Extend Express Request interface for file uploads -declare global { - namespace Express { - interface Request { - file?: Express.Multer.File; - } - } -} - -const router = express.Router(); -const container = DIContainer.getInstance(); - -// Configure multer for file uploads -const upload = multer({ - storage: multer.memoryStorage(), - limits: { - fileSize: 10 * 1024 * 1024, // 10MB limit - }, - fileFilter: (req: any, file: any, cb: any) => { - if (file.mimetype === 'application/json' || file.originalname.endsWith('.spr')) { - cb(null, true); - } else { - cb(new Error('Only JSON and .spr files are allowed')); - } - } -}); - -// Helper function to extract language from Accept-Language header -function extractLanguageFromAcceptHeader(acceptLanguage: string): string | null { - if (!acceptLanguage) return null; - - const languages = acceptLanguage.split(','); - if (languages.length > 0) { - const primaryLanguage = languages[0].split(';')[0].trim().substring(0, 2); - return primaryLanguage; - } - - return null; -} - -// ============================================================================= -// USER MANAGEMENT ROUTES -// ============================================================================= - -// Get users with pagination (RECOMMENDED) -router.get('/users/page/:from/:to', adminRequired, async (req: Request, res: Response) => { - try { - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - const includeDeleted = req.query.includeDeleted === 'true'; - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ - error: 'Invalid pagination parameters. From and to must be valid numbers with from <= to.' - }); - } - - const limit = to - from + 1; - if (limit > 100) { - return res.status(400).json({ - error: 'Page size too large. Maximum 100 records per request.' - }); - } - - logRequest('Admin paginated users endpoint accessed', req, res, { from, to, includeDeleted }); - - const result = await container.getUsersByPageQueryHandler.execute({ - from, - to, - includeDeleted - }); - - const response = { - users: result.users, - pagination: { - from, - to, - returned: result.users.length, - totalCount: result.totalCount, - includeDeleted - } - }; - - logRequest('Admin users retrieved successfully', req, res, { - returnedUsers: result.users.length, - totalCount: result.totalCount, - from, - to, - includeDeleted - }); - - return res.status(200).json(response); - } catch (error: any) { - logError('Error in admin get users endpoint', error, req, res); - return res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get user by ID including soft-deleted ones -router.get('/users/:userId', - adminRequired, - ValidationMiddleware.validateUUIDFormat(['userId']), - async (req: Request, res: Response) => { - try { - const targetUserId = req.params.userId; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin get user by id endpoint accessed', req, res, { targetUserId, includeDeleted }); - - const user = includeDeleted - ? await container.userRepository.findByIdIncludingDeleted(targetUserId) - : await container.userRepository.findById(targetUserId); - - if (!user) { - logWarning('User not found', { targetUserId, includeDeleted }, req, res); - return res.status(404).json({ error: 'User not found' }); - } - - logRequest('Admin user retrieved successfully', req, res, { - targetUserId, - username: user.username, - includeDeleted - }); - - res.json(user); - } catch (error) { - logError('Admin get user by id endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Search users including soft-deleted ones -// router.get('/users/search/:searchTerm', -// adminRequired, -// ValidationMiddleware.validateStringLength({ searchTerm: { min: 2, max: 100 } }), -// async (req: Request, res: Response) => { -// try { -// const { searchTerm } = req.params; -// const includeDeleted = req.query.includeDeleted === 'true'; - -// logRequest('Admin search users endpoint accessed', req, res, { searchTerm, includeDeleted }); - -// const users = includeDeleted -// ? await container.userRepository.searchIncludingDeleted(searchTerm) -// : await container.userRepository.search(searchTerm); - -// logRequest('Admin user search completed', req, res, { -// searchTerm, -// resultCount: Array.isArray(users) ? users.length : (users.totalCount || 0), -// includeDeleted -// }); - -// res.json(users); -// } catch (error) { -// logError('Admin search users endpoint error', error as Error, req, res); -// res.status(500).json({ error: 'Internal server error' }); -// } -// }); - -// Update any user (admin only) -router.patch('/users/:userId', - adminRequired, - ValidationMiddleware.validateUUIDFormat(['userId']), - async (req: Request, res: Response) => { - try { - const targetUserId = req.params.userId; - const adminUserId = (req as any).user.userId; - - logRequest('Admin update user endpoint accessed', req, res, { - adminUserId, - targetUserId, - fieldsToUpdate: Object.keys(req.body) - }); - - const result = await container.updateUserCommandHandler.execute({ id: targetUserId, ...req.body }); - - if (!result) { - return res.status(404).json({ error: 'User not found' }); - } - - logRequest('User updated by admin', req, res, { - adminUserId, - targetUserId, - username: result.username - }); - - res.json(result); - - } catch (error) { - logError('Admin update user endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('already exists')) { - return res.status(409).json({ error: error.message }); - } - if (error.message.includes('validation')) { - return res.status(400).json({ error: error.message }); - } - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Deactivate user (admin only) -router.post('/users/:userId/deactivate', - adminRequired, - ValidationMiddleware.validateUUIDFormat(['userId']), - async (req: Request, res: Response) => { - try { - const targetUserId = req.params.userId; - const adminUserId = (req as any).user.userId; - - logRequest('Deactivate user endpoint accessed', req, res, { adminUserId, targetUserId }); - - const result = await container.deactivateUserCommandHandler.execute({ id: targetUserId }); - - if (!result) { - return res.status(404).json({ error: 'User not found' }); - } - - logAuth('User deactivated by admin', targetUserId, { adminUserId }, req, res); - res.json({ message: 'User deactivated successfully', user: result }); - - } catch (error) { - logError('Deactivate user endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Delete user (admin only) -router.delete('/users/:userId', - adminRequired, - ValidationMiddleware.validateUUIDFormat(['userId']), - async (req: Request, res: Response) => { - try { - const targetUserId = req.params.userId; - const adminUserId = (req as any).user.userId; - - logRequest('Delete user endpoint accessed', req, res, { adminUserId, targetUserId }); - - const result = await container.deleteUserCommandHandler.execute({ id: targetUserId }); - - if (!result) { - return res.status(404).json({ error: 'User not found' }); - } - - logAuth('User deleted by admin', targetUserId, { adminUserId }, req, res); - res.json({ message: 'User deleted successfully' }); - - } catch (error) { - logError('Delete user endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// ============================================================================= -// DECK MANAGEMENT ROUTES -// ============================================================================= - -// Get decks by page (admin only) - RECOMMENDED -router.get('/decks/page/:from/:to', adminRequired, async (req: Request, res: Response) => { - try { - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - const includeDeleted = req.query.includeDeleted === 'true'; - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ error: 'Invalid page parameters. "from" and "to" must be valid numbers with to >= from >= 0' }); - } - - logRequest('Admin get decks by page endpoint accessed', req, res, { from, to, includeDeleted }); - - // For admin, we need to pass admin context to get unrestricted decks - const adminUserId = (req as any).user.userId; - const result = await container.getDecksByPageQueryHandler.execute({ - userId: adminUserId, - userOrgId: undefined, - isAdmin: true, - from, - to, - includeDeleted - }); - - logRequest('Admin decks page retrieved successfully', req, res, { - from, - to, - count: result.decks.length, - total: result.totalCount, - includeDeleted - }); - - res.json(result); - } catch (error) { - logError('Admin get decks by page endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get deck by ID including soft-deleted ones -router.get('/decks/:id', adminRequired, async (req: Request, res: Response) => { - try { - const { id } = req.params; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin get deck by id endpoint accessed', req, res, { deckId: id, includeDeleted }); - - const deck = includeDeleted - ? await container.deckRepository.findByIdIncludingDeleted(id) - : await container.deckRepository.findById(id); - - if (!deck) { - logWarning('Deck not found', { deckId: id, includeDeleted }, req, res); - return res.status(404).json({ error: 'Deck not found' }); - } - - logRequest('Admin deck retrieved successfully', req, res, { deckId: id, includeDeleted }); - res.json(deck); - } catch (error) { - logError('Admin get deck by id endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Search decks including soft-deleted ones -router.get('/decks/search/:searchTerm', adminRequired, async (req: Request, res: Response) => { - try { - const { searchTerm } = req.params; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin search decks endpoint accessed', req, res, { searchTerm, includeDeleted }); - - const decks = includeDeleted - ? await container.deckRepository.searchIncludingDeleted(searchTerm) - : await container.deckRepository.search(searchTerm); - - logRequest('Admin deck search completed', req, res, { - searchTerm, - resultCount: Array.isArray(decks) ? decks.length : (decks.totalCount || 0), - includeDeleted - }); - - res.json(decks); - } catch (error) { - logError('Admin search decks endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -//modify deck (admin only) -router.patch('/decks/:id', adminRequired, async (req: Request, res: Response) => { - try { - const deckId = req.params.id; - const adminUserId = (req as any).user.userId; - logRequest('Admin update deck endpoint accessed', req, res, { deckId, adminUserId, updateFields: Object.keys(req.body) }); - const result = await container.updateDeckCommandHandler.execute({ id: deckId, userstate: 1 , ...req.body}); - logRequest('Deck updated successfully by admin', req, res, { deckId, adminUserId }); - res.json(result); - } catch (error) { - logError('Admin update deck endpoint error', error as Error, req, res); - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: `Deck not found` }); - } - if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique constraint'))) { - return res.status(409).json({ error: 'Deck with this name already exists' }); - } - if (error instanceof Error && error.message.includes('validation')) { - return res.status(400).json({ error: 'Invalid input data', details: error.message }); - } - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Hard delete deck (admin only) -router.delete('/decks/:id/hard', adminRequired, async (req: Request, res: Response) => { - try { - const deckId = req.params.id; - logRequest('Admin hard delete deck endpoint accessed', req, res, { deckId }); - - const result = await container.deleteDeckCommandHandler.execute({ id: deckId, soft: false }); - - logRequest('Admin deck hard delete successful', req, res, { deckId, success: result }); - res.json({ success: result }); - } catch (error) { - logError('Admin hard delete deck endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Deck not found' }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// ============================================================================= -// ORGANIZATION MANAGEMENT ROUTES -// ============================================================================= - -// Create organization (admin only) -router.post('/organizations', adminRequired, async (req: Request, res: Response) => { - try { - const adminUserId = (req as any).user.userId; - logRequest('Admin create organization endpoint accessed', req, res, { name: req.body.name, adminUserId }); - - const result = await container.createOrganizationCommandHandler.execute(req.body); - - AdminAuditService.logAdminAction('CREATE_ORGANIZATION', adminUserId, { - targetType: 'organization', - targetId: result.id, - operation: 'create', - changes: req.body - }, req, res); - - logRequest('Admin organization created successfully', req, res, { organizationId: result.id, name: req.body.name, adminUserId }); - res.json(result); - } catch (error) { - logError('Admin create organization endpoint error', error as Error, req, res); - - if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique constraint'))) { - return res.status(409).json({ error: 'Organization with this name already exists' }); - } - - if (error instanceof Error && error.message.includes('validation')) { - return res.status(400).json({ error: 'Invalid input data', details: error.message }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Update organization (admin only) - NEW ENDPOINT -router.patch('/organizations/:id', adminRequired, async (req: Request, res: Response) => { - try { - const organizationId = req.params.id; - const adminUserId = (req as any).user.userId; - - logRequest('Admin update organization endpoint accessed', req, res, { - adminUserId, - organizationId, - fieldsToUpdate: Object.keys(req.body) - }); - - const result = await container.updateOrganizationCommandHandler.execute({ - id: organizationId, - ...req.body - }); - - if (!result) { - return res.status(404).json({ error: 'Organization not found' }); - } - - AdminAuditService.logAdminAction('UPDATE_ORGANIZATION', adminUserId, { - targetType: 'organization', - targetId: organizationId, - operation: 'update', - changes: req.body, - sensitive: req.body.maxOrganizationalDecks !== undefined - }, req, res); - - logRequest('Organization updated by admin', req, res, { - adminUserId, - organizationId, - organizationName: result.name - }); - - res.json(result); - - } catch (error) { - logError('Admin update organization endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('already exists')) { - return res.status(409).json({ error: error.message }); - } - if (error.message.includes('validation')) { - return res.status(400).json({ error: error.message }); - } - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get organizations by page (admin only) - RECOMMENDED -router.get('/organizations/page/:from/:to', adminRequired, async (req: Request, res: Response) => { - try { - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - const includeDeleted = req.query.includeDeleted === 'true'; - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ error: 'Invalid page parameters. "from" and "to" must be valid numbers with to >= from >= 0' }); - } - - logRequest('Admin get organizations by page endpoint accessed', req, res, { from, to, includeDeleted }); - - const result = await container.getOrganizationsByPageQueryHandler.execute({ - from, - to, - includeDeleted - }); - - logRequest('Admin organizations page retrieved successfully', req, res, { - from, - to, - count: result.organizations.length, - total: result.totalCount, - includeDeleted - }); - - res.json(result); - } catch (error) { - logError('Admin get organizations by page endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get organization by ID including soft-deleted ones -router.get('/organizations/:id', adminRequired, async (req: Request, res: Response) => { - try { - const organizationId = req.params.id; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin get organization by id endpoint accessed', req, res, { organizationId, includeDeleted }); - - const organization = includeDeleted - ? await container.organizationRepository.findByIdIncludingDeleted(organizationId) - : await container.organizationRepository.findById(organizationId); - - if (!organization) { - logWarning('Organization not found', { organizationId, includeDeleted }, req, res); - return res.status(404).json({ error: 'Organization not found' }); - } - - logRequest('Admin organization retrieved successfully', req, res, { organizationId, includeDeleted }); - res.json(organization); - } catch (error) { - logError('Admin get organization by id endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Search organizations including soft-deleted ones -router.get('/organizations/search/:searchTerm', adminRequired, async (req: Request, res: Response) => { - try { - const { searchTerm } = req.params; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin search organizations endpoint accessed', req, res, { searchTerm, includeDeleted }); - - const organizations = includeDeleted - ? await container.organizationRepository.searchIncludingDeleted(searchTerm) - : await container.organizationRepository.search(searchTerm); - - logRequest('Admin organization search completed', req, res, { - searchTerm, - resultCount: Array.isArray(organizations) ? organizations.length : (organizations.totalCount || 0), - includeDeleted - }); - - res.json(organizations); - } catch (error) { - logError('Admin search organizations endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Soft delete organization (admin only) -router.delete('/organizations/:id', adminRequired, async (req: Request, res: Response) => { - try { - const organizationId = req.params.id; - logRequest('Admin soft delete organization endpoint accessed', req, res, { organizationId }); - - const result = await container.deleteOrganizationCommandHandler.execute({ id: organizationId, soft: true }); - - logRequest('Admin organization soft delete successful', req, res, { organizationId, success: result }); - res.json({ success: result }); - } catch (error) { - logError('Admin soft delete organization endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Organization not found' }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Hard delete organization (admin only) -router.delete('/organizations/:id/hard', adminRequired, async (req: Request, res: Response) => { - try { - const organizationId = req.params.id; - logRequest('Admin hard delete organization endpoint accessed', req, res, { organizationId }); - - const result = await container.deleteOrganizationCommandHandler.execute({ id: organizationId, soft: false }); - - logRequest('Admin organization hard delete successful', req, res, { organizationId, success: result }); - res.json({ success: result }); - } catch (error) { - logError('Admin hard delete organization endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Organization not found' }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// ============================================================================= -// CHAT MANAGEMENT ROUTES -// ============================================================================= - -// Get chats with pagination (RECOMMENDED) -router.get('/chats/page/:from/:to', adminRequired, async (req: Request, res: Response) => { - try { - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - const includeDeleted = req.query.includeDeleted === 'true'; - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ - error: 'Invalid pagination parameters. From and to must be valid numbers with from <= to.' - }); - } - - const limit = to - from + 1; - if (limit > 100) { - return res.status(400).json({ - error: 'Page size too large. Maximum 100 records per request.' - }); - } - - logRequest('Admin paginated chats endpoint accessed', req, res, { from, to, includeDeleted }); - - const result = await container.getChatsByPageQueryHandler.execute({ - from, - to, - includeDeleted - }); - - const response = { - chats: result.chats, - pagination: { - from, - to, - returned: result.chats.length, - totalCount: result.totalCount, - includeDeleted - } - }; - - logRequest('Admin chats retrieved successfully', req, res, { - returnedChats: result.chats.length, - totalCount: result.totalCount, - from, - to, - includeDeleted - }); - - return res.status(200).json(response); - } catch (error: any) { - logError('Error in admin get chats endpoint', error, req, res); - return res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get chat by ID including soft-deleted ones -router.get('/chats/:id', adminRequired, async (req: Request, res: Response) => { - try { - const { id } = req.params; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin get chat by id endpoint accessed', req, res, { chatId: id, includeDeleted }); - - const chat = includeDeleted - ? await container.chatRepository.findByIdIncludingDeleted(id) - : await container.chatRepository.findById(id); - - if (!chat) { - logWarning('Chat not found', { chatId: id, includeDeleted }, req, res); - return res.status(404).json({ error: 'Chat not found' }); - } - - logRequest('Admin chat retrieved successfully', req, res, { chatId: id, includeDeleted }); - res.json(chat); - } catch (error) { - logError('Admin get chat by id endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// ============================================================================= -// CONTACT MANAGEMENT ROUTES -// ============================================================================= - -// Get contacts by page (admin only) - RECOMMENDED (already exists, enhanced) -router.get('/contacts/page/:from/:to', adminRequired, async (req: Request, res: Response) => { - try { - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - const includeDeleted = req.query.includeDeleted === 'true'; - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ error: 'Invalid page parameters. "from" and "to" must be valid numbers with to >= from >= 0' }); - } - - logRequest('Admin get contacts by page endpoint accessed', req, res, { from, to, includeDeleted }); - - const result = includeDeleted - ? await container.contactRepository.findByPageIncludingDeleted(from, to) - : await container.contactRepository.findByPage(from, to); - - logRequest('Admin contacts page retrieved successfully', req, res, { - from, - to, - count: result.contacts.length, - total: result.totalCount, - includeDeleted - }); - - res.json(result); - } catch (error) { - logError('Admin get contacts by page endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get contact by ID (admin only) -router.get('/contacts/:id', adminRequired, async (req: Request, res: Response) => { - try { - const contactId = req.params.id; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin get contact by ID endpoint accessed', req, res, { contactId, includeDeleted }); - - const result = includeDeleted - ? await container.contactRepository.findByIdIncludingDeleted(contactId) - : await container.getContactByIdQueryHandler.execute({ id: contactId }); - - if (!result) { - logRequest('Contact not found', req, res, { contactId, includeDeleted }); - return res.status(404).json({ error: 'Contact not found' }); - } - - logRequest('Admin contact retrieved successfully', req, res, { contactId, includeDeleted }); - res.json(result); - } catch (error) { - logError('Admin get contact by ID endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Search contacts including soft-deleted ones (admin only) -router.get('/contacts/search/:searchTerm', adminRequired, async (req: Request, res: Response) => { - try { - const { searchTerm } = req.params; - const includeDeleted = req.query.includeDeleted === 'true'; - - logRequest('Admin search contacts endpoint accessed', req, res, { searchTerm, includeDeleted }); - - const contacts = includeDeleted - ? await container.contactRepository.searchIncludingDeleted(searchTerm) - : await container.contactRepository.search(searchTerm); - - logRequest('Admin contact search completed', req, res, { - searchTerm, - resultCount: contacts.length, - includeDeleted - }); - - res.json(contacts); - } catch (error) { - logError('Admin search contacts endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Respond to contact (admin only) -router.put('/contacts/:id/respond', adminRequired, async (req: Request, res: Response) => { - try { - const contactId = req.params.id; - const adminUserId = (req as any).user.userId; - const { adminResponse, sendEmail, language } = req.body; - - if (!adminResponse) { - return res.status(400).json({ error: 'Admin response is required' }); - } - - // Determine language from body, headers, or default to English - let selectedLanguage = language; - if (!selectedLanguage) { - // Try to get language from Accept-Language header - const acceptLanguage = req.headers['accept-language'] as string; - // Try to get language from custom headers (common frontend patterns) - const regionHeader = req.headers['x-region'] as string; - const languageHeader = req.headers['x-language'] as string; - const localeHeader = req.headers['x-locale'] as string; - - selectedLanguage = languageHeader || - localeHeader || - regionHeader || - extractLanguageFromAcceptHeader(acceptLanguage) || - 'en'; - } - - // Validate and normalize language parameter - if (!['en', 'hu', 'de'].includes(selectedLanguage.toLowerCase())) { - selectedLanguage = 'en'; // Fallback to English for unsupported languages - } else { - selectedLanguage = selectedLanguage.toLowerCase(); - } - - logRequest('Admin respond to contact endpoint accessed', req, res, { - contactId, - adminUserId, - sendEmail, - language: selectedLanguage, - headerLanguage: req.headers['accept-language'] || req.headers['x-language'] || 'none' - }); - - // Update contact with response - const result = await container.updateContactCommandHandler.execute({ - id: contactId, - adminResponse, - respondedBy: adminUserId - }); - - if (!result) { - logWarning('Contact not found for response', { contactId }, req, res); - return res.status(404).json({ error: 'Contact not found' }); - } - - // Send email if requested - let emailSent = false; - let emailError = null; - - if (sendEmail === true && adminResponse) { - try { - await container.contactEmailService.sendResponse({ - to: result.email, - message: adminResponse, - contactId: contactId, - adminUserId: adminUserId, - contactName: result.name, - contactType: result.type, - originalMessage: result.txt, - language: selectedLanguage - }); - emailSent = true; - - logRequest('Contact response email sent successfully', req, res, { - contactId, - recipientEmail: result.email, - language: selectedLanguage - }); - } catch (emailErr) { - emailError = emailErr instanceof Error ? emailErr.message : 'Email sending failed'; - logError('Contact response email failed', emailErr as Error, req, res); - } - } - - AdminAuditService.logAdminAction('RESPOND_TO_CONTACT', adminUserId, { - targetType: 'contact', - targetId: contactId, - operation: 'update', - changes: { adminResponse, sendEmail, language: selectedLanguage }, - metadata: { emailSent, emailError } - }, req, res); - - logRequest('Admin contact response saved successfully', req, res, { - contactId, - sendEmail, - emailSent, - language: selectedLanguage - }); - - res.json({ - success: true, - message: 'Response saved successfully', - contact: result, - emailSent, - emailError: emailSent ? null : emailError - }); - } catch (error) { - logError('Admin respond to contact endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Contact not found' }); - } - - if (error instanceof Error && error.message.includes('validation')) { - return res.status(400).json({ error: 'Invalid input data', details: error.message }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Resend contact email (admin only) - NEW ENDPOINT -router.post('/contacts/:id/resend-email', adminRequired, async (req: Request, res: Response) => { - try { - const contactId = req.params.id; - const adminUserId = (req as any).user.userId; - const { language } = req.body; - - logRequest('Admin resend contact email endpoint accessed', req, res, { - contactId, - adminUserId, - language - }); - - // Get contact details - const contact = await container.getContactByIdQueryHandler.execute({ id: contactId }); - - if (!contact) { - return res.status(404).json({ error: 'Contact not found' }); - } - - if (!contact.adminResponse) { - return res.status(400).json({ error: 'No admin response found to resend' }); - } - - const selectedLanguage = language || 'en'; - - try { - await container.contactEmailService.sendResponse({ - to: contact.email, - message: contact.adminResponse, - contactId: contactId, - adminUserId: adminUserId, - contactName: contact.name, - contactType: contact.type, - originalMessage: contact.txt, - language: selectedLanguage - }); - - AdminAuditService.logAdminAction('RESEND_CONTACT_EMAIL', adminUserId, { - targetType: 'contact', - targetId: contactId, - operation: 'create', - metadata: { language: selectedLanguage, action: 'resend' } - }, req, res); - - logRequest('Contact email resent successfully', req, res, { - contactId, - recipientEmail: contact.email, - language: selectedLanguage - }); - - res.json({ - success: true, - message: 'Email resent successfully' - }); - } catch (emailErr) { - logError('Contact email resend failed', emailErr as Error, req, res); - res.status(500).json({ - error: 'Failed to resend email', - details: emailErr instanceof Error ? emailErr.message : 'Unknown error' - }); - } - } catch (error) { - logError('Admin resend contact email endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Soft delete contact (admin only) - NEW ENDPOINT -router.delete('/contacts/:id', adminRequired, async (req: Request, res: Response) => { - try { - const contactId = req.params.id; - const adminUserId = (req as any).user.userId; - - logRequest('Admin soft delete contact endpoint accessed', req, res, { contactId, adminUserId }); - - const result = await container.deleteContactCommandHandler.execute({ - id: contactId, - hard: false - }); - - AdminAuditService.logAdminAction('SOFT_DELETE_CONTACT', adminUserId, { - targetType: 'contact', - targetId: contactId, - operation: 'update' - }, req, res); - - logAuth('Contact soft deleted by admin', contactId, { adminUserId }, req, res); - res.json({ success: result }); - } catch (error) { - logError('Admin soft delete contact endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Contact not found' }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Hard delete contact (admin only) - NEW ENDPOINT -router.delete('/contacts/:id/hard', adminRequired, async (req: Request, res: Response) => { - try { - const contactId = req.params.id; - const adminUserId = (req as any).user.userId; - - logRequest('Admin hard delete contact endpoint accessed', req, res, { contactId, adminUserId }); - - const result = await container.deleteContactCommandHandler.execute({ - id: contactId, - hard: true - }); - - AdminAuditService.logAdminAction('HARD_DELETE_CONTACT', adminUserId, { - targetType: 'contact', - targetId: contactId, - operation: 'delete', - sensitive: true - }, req, res); - - logAuth('Contact hard deleted by admin', contactId, { adminUserId }, req, res); - res.json({ success: result }); - } catch (error) { - logError('Admin hard delete contact endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Contact not found' }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// ============================================================================= -// DECK IMPORT/EXPORT ROUTES (ADMIN) -// ============================================================================= - -// Import deck from JSON file (unencrypted, admin only) -router.post('/decks/import', adminRequired, upload.single('file'), async (req: Request, res: Response) => { - try { - if (!req.file) { - return res.status(400).json({ error: 'No file uploaded' }); - } - - const userId = (req as any).user.userId; - const fileContent = req.file!.buffer.toString('utf-8'); - - logRequest('Admin deck import from JSON endpoint accessed', req, res, { fileName: req.file.originalname }); - - let jsonData; - try { - jsonData = JSON.parse(fileContent); - } catch (parseError) { - return res.status(400).json({ error: 'Invalid JSON format' }); - } - - // For admin import, we need to specify both target user and admin user - // Let's assume the deck will be owned by the admin user doing the import - const result = await container.deckImportExportService.adminImportFromJson(jsonData, userId, userId); - - logRequest('Admin deck import successful', req, res, { deckId: result.id, fileName: req.file.originalname }); - - res.json({ - success: true, - message: 'Deck imported successfully', - deckId: result.id - }); - } catch (error) { - logError('Admin deck import from JSON error', error as Error, req, res); - if (error instanceof Error && error.message.includes('Invalid')) { - res.status(400).json({ error: 'Invalid deck data structure' }); - } else { - res.status(500).json({ error: 'Internal server error' }); - } - } -}); - -// Export deck as JSON (unencrypted, admin only) -router.get('/decks/:deckId/export', adminRequired, async (req: Request, res: Response) => { - try { - const { deckId } = req.params; - - logRequest('Admin deck export as JSON endpoint accessed', req, res, { deckId }); - - const deck = await container.deckRepository.findById(deckId); - if (!deck) { - logWarning('Deck not found for export', { deckId }, req, res); - return res.status(404).json({ error: 'Deck not found' }); - } - - logRequest('Admin deck export successful', req, res, { deckId, deckName: deck.name }); - - // Return deck as JSON for admin export - res.setHeader('Content-Type', 'application/json'); - res.setHeader('Content-Disposition', `attachment; filename="${deck.name || 'deck'}.json"`); - res.json(deck); - } catch (error) { - logError('Admin deck export as JSON error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -export default router; diff --git a/SerpentRace_Backend/src/Api/routers/chatRouter.ts b/SerpentRace_Backend/src/Api/routers/chatRouter.ts deleted file mode 100644 index 140d6791..00000000 --- a/SerpentRace_Backend/src/Api/routers/chatRouter.ts +++ /dev/null @@ -1,287 +0,0 @@ -import express from 'express'; -import { authRequired } from '../../Application/Services/AuthMiddleware'; -import { container } from '../../Application/Services/DIContainer'; -import { ErrorResponseService } from '../../Application/Services/ErrorResponseService'; -import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware'; -import { logAuth, logError, logRequest, logWarning } from '../../Application/Services/Logger'; - -const chatRouter = express.Router(); - -// Get user's chats -chatRouter.get('/user-chats', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const includeArchived = req.query.includeArchived === 'true'; - - logRequest('Get user chats endpoint accessed', req, res, { userId, includeArchived }); - - const chats = await container.getUserChatsQueryHandler.execute({ - userId, - includeArchived - }); - - logRequest('User chats retrieved successfully', req, res, { - userId, - chatCount: chats.length - }); - - res.json(chats); - } catch (error) { - logError('Get user chats endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Get chat history -chatRouter.get('/history/:chatId', - authRequired, - ValidationMiddleware.validateUUIDFormat(['chatId']), - async (req, res) => { - try { - const userId = (req as any).user.userId; - const chatId = req.params.chatId; - - logRequest('Get chat history endpoint accessed', req, res, { userId, chatId }); - - const history = await container.getChatHistoryQueryHandler.execute({ - chatId, - userId - }); - - if (!history) { - logWarning('Chat history not found or unauthorized', { userId, chatId }, req, res); - return ErrorResponseService.sendNotFound(res, 'Chat not found or unauthorized'); - } - - logRequest('Chat history retrieved successfully', req, res, { - userId, - chatId, - messageCount: history.messages.length, - isArchived: history.isArchived - }); - - res.json(history); - } catch (error) { - logError('Get chat history endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Create new chat (direct/group) -chatRouter.post('/create', - authRequired, - ValidationMiddleware.combine([ - ValidationMiddleware.validateRequiredFields(['type', 'userIds']), - ValidationMiddleware.validateAllowedValues({ type: ['direct', 'group'] }), - ValidationMiddleware.validateNonEmptyArrays(['userIds']) - ]), - async (req, res) => { - try { - const userId = (req as any).user.userId; - const { type, name, userIds } = req.body; - - logRequest('Create chat endpoint accessed', req, res, { - userId, - type, - targetUserCount: userIds?.length || 0 - }); - - if (type === 'group' && !name?.trim()) { - return ErrorResponseService.sendBadRequest(res, 'Group name is required'); - } - - const chat = await container.createChatCommandHandler.execute({ - type, - name: name?.trim(), - createdBy: userId, - userIds - }); - - if (!chat) { - return ErrorResponseService.sendBadRequest(res, 'Failed to create chat'); - } - - logRequest('Chat created successfully', req, res, { - userId, - chatId: chat.id, - chatType: chat.type - }); - - res.json({ - id: chat.id, - type: chat.type, - name: chat.name, - users: chat.users, - messages: chat.messages - }); - } catch (error) { - logError('Create chat endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('Premium subscription required')) { - return ErrorResponseService.sendForbidden(res, 'Premium subscription required to create groups'); - } - if (error.message.includes('not found')) { - return ErrorResponseService.sendNotFound(res, 'One or more users not found'); - } - } - - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Send message (REST endpoint - mainly for testing, real messaging is via WebSocket) -chatRouter.post('/message', - authRequired, - ValidationMiddleware.combine([ - ValidationMiddleware.validateRequiredFields(['chatId', 'message']), - ValidationMiddleware.validateUUIDFormat(['chatId']), - ValidationMiddleware.validateStringLength({ message: { min: 1, max: 2000 } }) - ]), - async (req, res) => { - try { - const userId = (req as any).user.userId; - const { chatId, message } = req.body; - - logRequest('Send message endpoint accessed', req, res, { - userId, - chatId, - messageLength: message?.length || 0 - }); - - const sentMessage = await container.sendMessageCommandHandler.execute({ - chatId, - userId, - message - }); - - if (!sentMessage) { - return ErrorResponseService.sendBadRequest(res, 'Failed to send message'); - } - - logRequest('Message sent successfully', req, res, { - userId, - chatId, - messageId: sentMessage.id - }); - - res.json(sentMessage); - } catch (error) { - logError('Send message endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('Chat not found')) { - return ErrorResponseService.sendNotFound(res, 'Chat not found'); - } - if (error.message.includes('not a member')) { - return ErrorResponseService.sendForbidden(res, 'Not authorized to send messages to this chat'); - } - if (error.message.includes('non-empty string')) { - return ErrorResponseService.sendBadRequest(res, 'Message must be a non-empty string'); - } - } - - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Archive chat manually -chatRouter.post('/archive/:chatId', - authRequired, - ValidationMiddleware.validateUUIDFormat(['chatId']), - async (req, res) => { - try { - const userId = (req as any).user.userId; - const chatId = req.params.chatId; - - logRequest('Archive chat endpoint accessed', req, res, { userId, chatId }); - - // Check if user has access to this chat - const chat = await container.chatRepository.findById(chatId); - if (!chat) { - return ErrorResponseService.sendNotFound(res, 'Chat not found'); - } - - if (!chat.users.includes(userId)) { - return ErrorResponseService.sendForbidden(res, 'Not authorized to archive this chat'); - } - - const success = await container.archiveChatCommandHandler.execute({ chatId }); - - if (!success) { - return ErrorResponseService.sendBadRequest(res, 'Failed to archive chat'); - } - - logRequest('Chat archived successfully', req, res, { userId, chatId }); - res.json({ success: true, message: 'Chat archived successfully' }); - - } catch (error) { - logError('Archive chat endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Restore chat from archive -chatRouter.post('/restore/:chatId', - authRequired, - ValidationMiddleware.validateUUIDFormat(['chatId']), - async (req, res) => { - try { - const userId = (req as any).user.userId; - const chatId = req.params.chatId; - - logRequest('Restore chat endpoint accessed', req, res, { userId, chatId }); - - // Check if user has access to this archived chat - const archive = await container.chatArchiveRepository.findByChatId(chatId); - const userArchive = archive.find((a: any) => a.participants.includes(userId)); - - if (!userArchive) { - return ErrorResponseService.sendNotFound(res, 'Archived chat not found or unauthorized'); - } - - const success = await container.restoreChatCommandHandler.execute({ chatId }); - - if (!success) { - return ErrorResponseService.sendBadRequest(res, 'Failed to restore chat (game chats cannot be restored)'); - } - - logRequest('Chat restored successfully', req, res, { userId, chatId }); - res.json({ success: true, message: 'Chat restored successfully' }); - - } catch (error) { - logError('Restore chat endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Get archived chats for a game -chatRouter.get('/archived/game/:gameId', - authRequired, - ValidationMiddleware.validateUUIDFormat(['gameId']), - async (req, res) => { - try { - const userId = (req as any).user.userId; - const gameId = req.params.gameId; - - logRequest('Get archived game chats endpoint accessed', req, res, { userId, gameId }); - - const archivedChats = await container.getArchivedChatsQueryHandler.execute({ - userId, - gameId - }); - - logRequest('Archived game chats retrieved successfully', req, res, { - userId, - gameId, - chatCount: archivedChats.length - }); - - res.json(archivedChats); - } catch (error) { - logError('Get archived game chats endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -export default chatRouter; diff --git a/SerpentRace_Backend/src/Api/routers/contactRouter.ts b/SerpentRace_Backend/src/Api/routers/contactRouter.ts deleted file mode 100644 index d7fcbb53..00000000 --- a/SerpentRace_Backend/src/Api/routers/contactRouter.ts +++ /dev/null @@ -1,53 +0,0 @@ -import { Router } from 'express'; -import { container } from '../../Application/Services/DIContainer'; -import { logRequest, logError } from '../../Application/Services/Logger'; -import { ContactType } from '../../Domain/Contact/ContactAggregate'; - -const contactRouter = Router(); - -// Public endpoint - anyone can create a contact -contactRouter.post('/', async (req, res) => { - try { - // Get user ID if authenticated (optional) - const userId = (req as any).user?.userId || null; - - const { name, email, type, txt } = req.body; - - // Validate required fields - if (!name || !email || type === undefined || !txt) { - return res.status(400).json({ - error: 'Missing required fields: name, email, type, and txt are required' - }); - } - - // Validate type - if (!Object.values(ContactType).includes(Number(type))) { - return res.status(400).json({ - error: 'Invalid contact type. Must be one of: 0 (Bug), 1 (Problem), 2 (Question), 3 (Sales), 4 (Other)' - }); - } - - logRequest('Create contact endpoint accessed', req, res, { name, email, type, userId }); - - const result = await container.createContactCommandHandler.execute({ - name, - email, - userid: userId, - type: Number(type), - txt - }); - - logRequest('Contact created successfully', req, res, { contactId: result.id, name, email, type }); - res.status(201).json(result); - } catch (error) { - logError('Create contact endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('validation')) { - return res.status(400).json({ error: 'Invalid input data', details: error.message }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -export default contactRouter; diff --git a/SerpentRace_Backend/src/Api/routers/deckImportExportRouter.ts b/SerpentRace_Backend/src/Api/routers/deckImportExportRouter.ts deleted file mode 100644 index cf205d6d..00000000 --- a/SerpentRace_Backend/src/Api/routers/deckImportExportRouter.ts +++ /dev/null @@ -1,124 +0,0 @@ -import express, { Request, Response } from 'express'; -import multer from 'multer'; -import { DIContainer } from '../../Application/Services/DIContainer'; -import { authRequired } from '../../Application/Services/AuthMiddleware'; -import { logRequest, logError, logWarning } from '../../Application/Services/Logger'; - -// Extend Express Request interface for file uploads -declare global { - namespace Express { - interface Request { - file?: Express.Multer.File; - } - } -} - -const router = express.Router(); -const container = DIContainer.getInstance(); - -// Configure multer for file uploads -const upload = multer({ - storage: multer.memoryStorage(), - limits: { - fileSize: 10 * 1024 * 1024, // 10MB limit - }, - fileFilter: (req: any, file: any, cb: any) => { - if (file.mimetype === 'application/json' || file.originalname.endsWith('.spr')) { - cb(null, true); - } else { - cb(new Error('Only JSON and .spr files are allowed')); - } - } -}); - -// Export deck to .spr file (encrypted) - users can only export their own decks -router.get('/export/:deckId', authRequired, async (req: Request, res: Response) => { - try { - const { deckId } = req.params; - const userId = (req as any).user.userId; - - logRequest('Export deck endpoint accessed', req, res, { deckId, userId }); - - // Check if user owns the deck - const deck = await container.deckRepository.findById(deckId); - if (!deck) { - logWarning('Deck not found for export', { deckId, userId }, req, res); - return res.status(404).json({ error: 'Deck not found' }); - } - - // Users can only export their own decks - if (deck.userid !== userId) { - logWarning('Access denied - user attempted to export deck they do not own', { - deckId, - userId, - deckOwnerId: deck.userid - }, req, res); - return res.status(403).json({ error: 'Access denied - you can only export your own decks' }); - } - - const sprData = await container.deckImportExportService.exportDeckToSpr(deckId, userId); - - res.setHeader('Content-Type', 'application/octet-stream'); - res.setHeader('Content-Disposition', `attachment; filename="${deck.name || 'deck'}.spr"`); - - logRequest('Deck exported successfully', req, res, { - deckId, - userId, - deckName: deck.name, - fileSize: sprData.length - }); - - res.send(sprData); - } catch (error) { - logError('Export deck endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Import deck from .spr file (encrypted) - imported deck will be owned by the importing user -router.post('/import', authRequired, upload.single('file'), async (req: Request, res: Response) => { - try { - const userId = (req as any).user.userId; - - logRequest('Import deck endpoint accessed', req, res, { - userId, - hasFile: !!req.file, - fileName: req.file?.originalname, - fileSize: req.file?.size - }); - - if (!req.file) { - logWarning('No file uploaded for deck import', { userId }, req, res); - return res.status(400).json({ error: 'No file uploaded' }); - } - - const fileBuffer = req.file!.buffer; - - // Import the deck and assign ownership to the current user - const result = await container.deckImportExportService.importDeckFromSpr(fileBuffer, userId); - - logRequest('Deck imported successfully', req, res, { - userId, - deckId: result.id, - deckName: result.name || 'Unknown', - fileName: req.file.originalname, - fileSize: req.file.size - }); - - res.json({ - success: true, - message: 'Deck imported successfully and added to your collection', - deckId: result.id - }); - } catch (error) { - logError('Import deck endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('Invalid')) { - return res.status(400).json({ error: 'Invalid file format or corrupted data' }); - } else { - res.status(500).json({ error: 'Internal server error' }); - } - } -}); - -export default router; diff --git a/SerpentRace_Backend/src/Api/routers/deckRouter.ts b/SerpentRace_Backend/src/Api/routers/deckRouter.ts deleted file mode 100644 index 05181b90..00000000 --- a/SerpentRace_Backend/src/Api/routers/deckRouter.ts +++ /dev/null @@ -1,197 +0,0 @@ -import { Router } from 'express'; -import { authRequired } from '../../Application/Services/AuthMiddleware'; -import { container } from '../../Application/Services/DIContainer'; -import { ErrorResponseService } from '../../Application/Services/ErrorResponseService'; -import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware'; -import { GeneralSearchService } from '../../Application/Search/Generalsearch'; -import { logRequest, logError, logWarning } from '../../Application/Services/Logger'; - -const deckRouter = Router(); - -// Create search service that isn't in the container yet -const searchService = new GeneralSearchService(container.userRepository, container.organizationRepository, container.deckRepository); - -// Authenticated routes - Get decks with pagination (RECOMMENDED) -deckRouter.get('/page/:from/:to', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const userOrgId = (req as any).user.orgId; - const isAdmin = (req as any).user.authLevel === 1; - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ error: 'Invalid page parameters. "from" and "to" must be valid numbers with to >= from >= 0' }); - } - - logRequest('Get decks by page endpoint accessed', req, res, { - userId, - userOrgId, - isAdmin, - from, - to - }); - - // Use paginated query handler for memory efficiency - const result = await container.getDecksByPageQueryHandler.execute({ - userId, - userOrgId, - isAdmin, - from, - to - }); - - logRequest('Get decks page completed successfully', req, res, { - userId, - from, - to, - returnedCount: result.decks.length, - totalCount: result.totalCount - }); - - res.json(result); - } catch (error) { - logError('Get decks by page endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -deckRouter.post('/', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - logRequest('Create deck endpoint accessed', req, res, { name: req.body.name, userId }); - req.body.userid = userId; // Set userId in request body - const result = await container.createDeckCommandHandler.execute(req.body); - - logRequest('Deck created successfully', req, res, { deckId: result.id, name: req.body.name, userId }); - res.json(result); - } catch (error) { - logError('Create deck endpoint error', error as Error, req, res); - - if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique constraint'))) { - return res.status(409).json({ error: 'Deck with this name already exists' }); - } - - if (error instanceof Error && error.message.includes('validation')) { - return res.status(400).json({ error: 'Invalid input data', details: error.message }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -deckRouter.get('/search', authRequired, async (req, res) => { - try { - const { query, limit, offset } = req.query; - logRequest('Search decks endpoint accessed', req, res, { query, limit, offset }); - - if (!query || typeof query !== 'string') { - logWarning('Deck search attempted without query', { query, hasQuery: !!query }, req, res); - return res.status(400).json({ error: 'Search query is required' }); - } - - const searchQuery = { - query: query.trim(), - limit: limit ? parseInt(limit as string) : 20, - offset: offset ? parseInt(offset as string) : 0 - }; - - // Validate pagination parameters - if (searchQuery.limit < 1 || searchQuery.limit > 100) { - logWarning('Invalid deck search limit parameter', { limit: searchQuery.limit }, req, res); - return res.status(400).json({ error: 'Limit must be between 1 and 100' }); - } - - if (searchQuery.offset < 0) { - logWarning('Invalid deck search offset parameter', { offset: searchQuery.offset }, req, res); - return res.status(400).json({ error: 'Offset must be non-negative' }); - } - - const result = await searchService.searchFromUrl(req.originalUrl, searchQuery); - - logRequest('Deck search completed successfully', req, res, { - query: searchQuery.query, - resultCount: Array.isArray(result) ? result.length : 0 - }); - res.json(result); - } catch (error) { - logError('Search decks endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -deckRouter.get('/:id', authRequired, async (req, res) => { - try { - const deckId = req.params.id; - logRequest('Get deck by id endpoint accessed', req, res, { deckId }); - - const result = await container.getDeckByIdQueryHandler.execute({ id: deckId }); - - if (!result) { - logWarning('Deck not found', { deckId }, req, res); - return res.status(404).json({ error: 'Deck not found' }); - } - - logRequest('Deck retrieved successfully', req, res, { deckId }); - res.json(result); - } catch (error) { - logError('Get deck by id endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -deckRouter.patch('/:id', authRequired, async (req, res) => { - try { - const deckId = req.params.id; - const userId = (req as any).user.userId; - logRequest('Update deck endpoint accessed', req, res, { deckId, userId, updateFields: Object.keys(req.body) }); - - const result = await container.updateDeckCommandHandler.execute({ id: deckId, ...req.body }); - - logRequest('Deck updated successfully', req, res, { deckId, userId }); - res.json(result); - } catch (error) { - logError('Update deck endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Deck not found' }); - } - - if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique constraint'))) { - return res.status(409).json({ error: 'Deck with this name already exists' }); - } - - if (error instanceof Error && error.message.includes('validation')) { - return res.status(400).json({ error: 'Invalid input data', details: error.message }); - } - - if (error instanceof Error && error.message.includes('admin')) { - return res.status(403).json({ error: 'Forbidden: ' + error.message }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -deckRouter.delete('/:id', authRequired, async (req, res) => { - try { - const deckId = req.params.id; - const userId = (req as any).user.userId; - logRequest('Soft delete deck endpoint accessed', req, res, { deckId, userId }); - - const result = await container.deleteDeckCommandHandler.execute({ id: deckId, soft: true }); - - logRequest('Deck soft delete successful', req, res, { deckId, userId, success: result }); - res.json({ success: result }); - } catch (error) { - logError('Soft delete deck endpoint error', error as Error, req, res); - - if (error instanceof Error && error.message.includes('not found')) { - return res.status(404).json({ error: 'Deck not found' }); - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -export default deckRouter; \ No newline at end of file diff --git a/SerpentRace_Backend/src/Api/routers/gameRouter.ts b/SerpentRace_Backend/src/Api/routers/gameRouter.ts deleted file mode 100644 index 97a51ca0..00000000 --- a/SerpentRace_Backend/src/Api/routers/gameRouter.ts +++ /dev/null @@ -1,308 +0,0 @@ -import { Router } from 'express'; -import { authRequired } from '../../Application/Services/AuthMiddleware'; -import { optionalAuth } from '../middleware/optionalAuth'; -import { container } from '../../Application/Services/DIContainer'; -import { ErrorResponseService } from '../../Application/Services/ErrorResponseService'; -import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware'; -import { logRequest, logError, logWarning } from '../../Application/Services/Logger'; -import { LoginType } from '../../Domain/Game/GameAggregate'; - -const gameRouter = Router(); - -gameRouter.post('/start', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const orgId = (req as any).user.orgId; - const { deckids, maxplayers, logintype } = req.body; - - logRequest('Start game endpoint accessed', req, res, { - userId, - orgId, - deckCount: deckids?.length, - maxplayers, - logintype - }); - - // Validate required fields - if (!deckids || !Array.isArray(deckids) || deckids.length === 0) { - return res.status(400).json({ error: 'deckids is required and must be a non-empty array' }); - } - - if (!maxplayers || typeof maxplayers !== 'number') { - return res.status(400).json({ error: 'maxplayers is required and must be a number' }); - } - - if (logintype === undefined || typeof logintype !== 'number') { - return res.status(400).json({ error: 'logintype is required and must be a number (0=PUBLIC, 1=PRIVATE, 2=ORGANIZATION)' }); - } - - // Start the game using the GameService - const game = await container.gameService.startGame( - deckids, - maxplayers, - logintype as LoginType, - userId, - orgId - ); - - logRequest('Game started successfully', req, res, { - userId, - gameId: game.id, - gameCode: game.gamecode, - deckCount: game.gamedecks.length, - totalCards: game.gamedecks.reduce((sum, deck) => sum + deck.cards.length, 0) - }); - - res.json(game); - } catch (error) { - logError('Start game endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('not found')) { - return res.status(404).json({ error: error.message }); - } - if (error.message.includes('validation') || - error.message.includes('must be') || - error.message.includes('required') || - error.message.includes('Invalid')) { - return res.status(400).json({ error: error.message }); - } - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -gameRouter.post('/join', optionalAuth, async (req, res) => { - try { - const user = (req as any).user; - const { gameCode, playerName } = req.body; - - logRequest('Join game endpoint accessed', req, res, { - gameCode, - playerName, - hasAuth: !!user, - userId: user?.userId, - orgId: user?.orgId - }); - - // Validate required fields - if (!gameCode || typeof gameCode !== 'string') { - return res.status(400).json({ error: 'gameCode is required and must be a string' }); - } - - if (gameCode.length !== 6) { - return res.status(400).json({ error: 'gameCode must be exactly 6 characters long' }); - } - - // First, we need to find the game to determine its type - const gameRepository = container.gameRepository; - const gameToJoin = await gameRepository.findByGameCode(gameCode); - - if (!gameToJoin) { - return res.status(404).json({ error: 'Game not found' }); - } - - // Determine join requirements based on game login type - let actualPlayerId: string | undefined; - let actualPlayerName: string | undefined; - let actualOrgId: string | null = null; - - switch (gameToJoin.logintype) { - case LoginType.PUBLIC: - // Public games: playerName required, authentication optional - // If user is logged in and no playerName provided, use their username - if (!playerName || typeof playerName !== 'string' || !playerName.trim()) { - if (user && user.userId) { - // User is logged in, fetch their username to use as playerName - try { - const userDetails = await container.getUserByIdQueryHandler.execute({ id: user.userId }); - if (userDetails && userDetails.username) { - actualPlayerName = userDetails.username; - logRequest('Using logged-in user\'s username as playerName', req, res, { - userId: user.userId, - username: userDetails.username - }); - } else { - return res.status(400).json({ - error: 'playerName is required for public games' - }); - } - } catch (error) { - logError('Failed to fetch user details for playerName', error as Error, req, res); - return res.status(400).json({ - error: 'playerName is required for public games' - }); - } - } else { - // User is not logged in, playerName is required - return res.status(400).json({ - error: 'playerName is required for public games' - }); - } - } else { - // playerName was provided, use it - actualPlayerName = playerName.trim(); - } - actualPlayerId = user?.userId; // Use authenticated user ID if available, otherwise undefined - break; - - case LoginType.PRIVATE: - // Private games: authentication required - if (!user || !user.userId) { - return res.status(401).json({ - error: 'Authentication required to join private games' - }); - } - actualPlayerId = user.userId; - actualPlayerName = playerName; - break; - - case LoginType.ORGANIZATION: - // Organization games: authentication + organization membership required - if (!user || !user.userId) { - return res.status(401).json({ - error: 'Authentication required to join organization games' - }); - } - - if (!user.orgId) { - return res.status(403).json({ - error: 'Organization membership required to join organization games' - }); - } - - if (gameToJoin.orgid && user.orgId !== gameToJoin.orgid) { - return res.status(403).json({ - error: 'You must be a member of the same organization to join this game' - }); - } - - actualPlayerId = user.userId; - actualPlayerName = playerName; - actualOrgId = user.orgId; - break; - - default: - return res.status(400).json({ error: 'Invalid game type' }); - } - - // Join the game using the GameService with determined parameters - const game = await container.gameService.joinGame( - gameCode, - actualPlayerId, - actualPlayerName, - actualOrgId, - gameToJoin.logintype - ); - - logRequest('Player joined game successfully', req, res, { - userId: actualPlayerId || 'anonymous', - gameId: game.id, - gameCode: game.gamecode, - gameType: LoginType[gameToJoin.logintype], - playerCount: game.players.length, - maxPlayers: game.maxplayers, - playerName: actualPlayerName - }); - - res.json(game); - } catch (error) { - logError('Join game endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('not found')) { - return res.status(404).json({ error: error.message }); - } - if (error.message.includes('Authentication required')) { - return res.status(401).json({ error: error.message }); - } - if (error.message.includes('Organization') || error.message.includes('organization')) { - return res.status(403).json({ error: error.message }); - } - if (error.message.includes('full') || - error.message.includes('already in') || - error.message.includes('not accepting')) { - return res.status(409).json({ error: error.message }); - } - if (error.message.includes('validation') || - error.message.includes('must be') || - error.message.includes('required') || - error.message.includes('Invalid')) { - return res.status(400).json({ error: error.message }); - } - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -gameRouter.post('/:gameId/start', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const { gameId } = req.params; - - logRequest('Start gameplay endpoint accessed', req, res, { - userId, - gameId - }); - - // Validate required fields - if (!gameId || typeof gameId !== 'string') { - return res.status(400).json({ error: 'gameId is required and must be a string' }); - } - - // Start the gameplay using the GameService - const result = await container.gameService.startGamePlay(gameId, userId); - - logRequest('Game gameplay started successfully', req, res, { - userId, - gameId, - playerCount: result.game.players.length - }); - - res.json({ - message: 'Game started successfully', - gameId: gameId, - playerCount: result.game.players.length, - game: result.game, - boardData: result.boardData - }); - } catch (error) { - logError('Start gameplay endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('not found')) { - return res.status(404).json({ error: error.message }); - } - if (error.message.includes('Only') || error.message.includes('master')) { - return res.status(403).json({ error: error.message }); - } - if (error.message.includes('already started') || - error.message.includes('not ready') || - error.message.includes('minimum players') || - error.message.includes('not in waiting state') || - error.message.includes('cannot be started')) { - return res.status(409).json({ error: error.message }); - } - if (error.message.includes('validation') || - error.message.includes('must be') || - error.message.includes('required') || - error.message.includes('Invalid')) { - return res.status(400).json({ error: error.message }); - } - // Board generation specific errors - if (error.message.includes('Board generation') || - error.message.includes('board not found') || - error.message.includes('BoardGenerationService') || - error.message.includes('Failed to wait for board generation') || - error.message.includes('board generation timeout')) { - return res.status(500).json({ error: error.message }); - } - } - - res.status(500).json({ error: 'Internal server error' }); - } -}); - -export default gameRouter; \ No newline at end of file diff --git a/SerpentRace_Backend/src/Api/routers/organizationRouter.ts b/SerpentRace_Backend/src/Api/routers/organizationRouter.ts deleted file mode 100644 index eceaad01..00000000 --- a/SerpentRace_Backend/src/Api/routers/organizationRouter.ts +++ /dev/null @@ -1,204 +0,0 @@ -import { Router } from 'express'; -import { authRequired } from '../../Application/Services/AuthMiddleware'; -import { container } from '../../Application/Services/DIContainer'; -import { ErrorResponseService } from '../../Application/Services/ErrorResponseService'; -import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware'; -import { GeneralSearchService } from '../../Application/Search/Generalsearch'; -import { logRequest, logError, logWarning, logAuth } from '../../Application/Services/Logger'; - -const organizationRouter = Router(); - -// Create search service that isn't in the container yet -const searchService = new GeneralSearchService(container.userRepository, container.organizationRepository, container.deckRepository); - -// Auth routes - Get organizations with pagination (RECOMMENDED) -organizationRouter.get('/page/:from/:to', authRequired, async (req, res) => { - try { - const from = parseInt(req.params.from); - const to = parseInt(req.params.to); - - if (isNaN(from) || isNaN(to) || from < 0 || to < from) { - return res.status(400).json({ error: 'Invalid page parameters. "from" and "to" must be valid numbers with to >= from >= 0' }); - } - - logRequest('Get organizations by page endpoint accessed', req, res, { from, to }); - - const result = await container.getOrganizationsByPageQueryHandler.execute({ from, to }); - - logRequest('Organizations page retrieved successfully', req, res, { - from, - to, - count: result.organizations.length, - totalCount: result.totalCount - }); - - res.json(result); - } catch (error) { - logError('Get organizations by page endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -organizationRouter.get('/search', authRequired, async (req, res) => { - try { - const { query, limit, offset } = req.query; - logRequest('Search organizations endpoint accessed', req, res, { query, limit, offset }); - - if (!query || typeof query !== 'string') { - logWarning('Organization search attempted without query', { query, hasQuery: !!query }, req, res); - return res.status(400).json({ error: 'Search query is required' }); - } - - const searchQuery = { - query: query.trim(), - limit: limit ? parseInt(limit as string) : 20, - offset: offset ? parseInt(offset as string) : 0 - }; - - // Validate pagination parameters - if (searchQuery.limit < 1 || searchQuery.limit > 100) { - logWarning('Invalid organization search limit parameter', { limit: searchQuery.limit }, req, res); - return res.status(400).json({ error: 'Limit must be between 1 and 100' }); - } - - if (searchQuery.offset < 0) { - logWarning('Invalid organization search offset parameter', { offset: searchQuery.offset }, req, res); - return res.status(400).json({ error: 'Offset must be non-negative' }); - } - - const result = await searchService.searchFromUrl(req.originalUrl, searchQuery); - - logRequest('Organization search completed successfully', req, res, { - query: searchQuery.query, - resultCount: Array.isArray(result) ? result.length : 0 - }); - res.json(result); - } catch (error) { - logError('Search organizations endpoint error', error as Error, req, res); - res.status(500).json({ error: 'Internal server error' }); - } -}); - -// Get organization login URL -organizationRouter.get('/:orgId/login-url', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const { orgId } = req.params; - - logRequest('Get organization login URL endpoint accessed', req, res, { - userId, - organizationId: orgId - }); - - const result = await container.getOrganizationLoginUrlQueryHandler.execute({ - organizationId: orgId - }); - - if (!result) { - logWarning('Organization login URL not found', { - organizationId: orgId, - userId - }, req, res); - return ErrorResponseService.sendNotFound(res, 'Organization login URL not found'); - } - - logRequest('Organization login URL retrieved successfully', req, res, { - organizationId: orgId, - organizationName: result.organizationName, - hasUrl: !!result.loginUrl, - userId - }); - - res.json(result); - } catch (error) { - logError('Get organization login URL endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Process third-party authentication callback -organizationRouter.post('/auth-callback', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const { organizationId, status, authToken } = req.body; - - logRequest('Organization auth callback endpoint accessed', req, res, { - userId, - organizationId, - status, - hasAuthToken: !!authToken - }); - - // Validate required fields - if (!organizationId || !status) { - logWarning('Missing required fields for organization auth callback', { - organizationId: !!organizationId, - status: !!status, - userId - }, req, res); - return ErrorResponseService.sendBadRequest(res, 'organizationId and status are required'); - } - - if (status !== 'ok' && status !== 'not_ok') { - logWarning('Invalid status value for organization auth callback', { - status, - userId, - organizationId - }, req, res); - return ErrorResponseService.sendBadRequest(res, 'status must be either "ok" or "not_ok"'); - } - - const result = await container.processOrgAuthCallbackCommandHandler.execute({ - organizationId, - userId, - status, - authToken - }); - - if (!result.success) { - if (result.message.includes('not found')) { - logWarning('Organization auth callback failed - entity not found', { - userId, - organizationId, - message: result.message - }, req, res); - return ErrorResponseService.sendNotFound(res, result.message); - } - if (result.message.includes('does not belong')) { - logWarning('Organization auth callback failed - authorization error', { - userId, - organizationId, - message: result.message - }, req, res); - return ErrorResponseService.sendForbidden(res, result.message); - } - if (result.message.includes('authentication failed')) { - logAuth('Organization authentication failed via callback', userId, { - organizationId, - status - }, req, res); - return ErrorResponseService.sendUnauthorized(res, result.message); - } - - logError('Organization auth callback internal error', new Error(result.message), req, res); - return ErrorResponseService.sendInternalServerError(res); - } - - logAuth('Organization auth callback processed successfully', userId, { - organizationId, - status, - updatedFields: result.updatedFields - }, req, res); - - res.json({ - success: result.success, - message: result.message, - updatedFields: result.updatedFields - }); - } catch (error) { - logError('Organization auth callback endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -export default organizationRouter; diff --git a/SerpentRace_Backend/src/Api/routers/userRouter.ts b/SerpentRace_Backend/src/Api/routers/userRouter.ts deleted file mode 100644 index 740e90af..00000000 --- a/SerpentRace_Backend/src/Api/routers/userRouter.ts +++ /dev/null @@ -1,201 +0,0 @@ -import { Router } from 'express'; -import { authRequired } from '../../Application/Services/AuthMiddleware'; -import { container } from '../../Application/Services/DIContainer'; -import { ErrorResponseService } from '../../Application/Services/ErrorResponseService'; -import { ValidationMiddleware } from '../../Application/Services/ValidationMiddleware'; -import { GeneralSearchService } from '../../Application/Search/Generalsearch'; -import { logRequest, logError, logAuth, logWarning } from '../../Application/Services/Logger'; - -const userRouter = Router(); - -// Create search service that isn't in the container yet -const searchService = new GeneralSearchService(container.userRepository, container.organizationRepository, container.deckRepository); - -// Login endpoint -userRouter.post('/login', - ValidationMiddleware.combine([ - ValidationMiddleware.validateRequiredFields(['username', 'password']), - ValidationMiddleware.validateStringLength({ - username: { min: 3, max: 50 }, - password: { min: 6, max: 100 } - }) - ]), - async (req, res) => { - try { - logRequest('Login endpoint accessed', req, res, { username: req.body.username }); - - const { username, password } = req.body; - - const result = await container.loginCommandHandler.execute({ username, password }, res); - - if (result) { - logAuth('User login successful', result.user.id, { username: result.user.username }, req, res); - res.json(result); - } else { - throw new Error(`Login failed: ${result}`); - } - - } catch (error) { - logError('Login endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('Invalid username')) { - return ErrorResponseService.sendUnauthorized(res, 'Invalid username or password'); - } - if (error.message.includes('Invalid password')) { - return ErrorResponseService.sendUnauthorized(res, 'Invalid username or password'); - } - if (error.message.includes('not verified')) { - return ErrorResponseService.sendUnauthorized(res, 'Please verify your email address'); - } - if (error.message.includes('restriction')) { - return ErrorResponseService.sendUnauthorized(res, 'Please verify your email address'); - } - if (error.message.includes('deactivated')) { - return ErrorResponseService.sendUnauthorized(res, 'Account has been deactivated'); - } - } - - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Create user endpoint -userRouter.post('/create', - ValidationMiddleware.combine([ - ValidationMiddleware.validateRequiredFields(['username', 'email', 'password']), - ValidationMiddleware.validateEmailFormat(['email']), - ValidationMiddleware.validateStringLength({ - username: { min: 3, max: 50 }, - password: { min: 6, max: 100 } - }) - ]), - async (req, res) => { - try { - logRequest('Create user endpoint accessed', req, res, { - username: req.body.username, - email: req.body.email - }); - - const result = await container.createUserCommandHandler.execute(req.body); - - logRequest('User created successfully', req, res, { - userId: result.id, - username: result.username - }); - - res.status(201).json(result); - - } catch (error) { - // Don't log here since CreateUserCommandHandler already logs system errors - // Only log validation/user input errors at router level - - if (error instanceof Error) { - if (error.message.includes('already exists')) { - return ErrorResponseService.sendConflict(res, error.message); - } - if (error.message.includes('validation')) { - return ErrorResponseService.sendBadRequest(res, error.message); - } - // Log unexpected errors that weren't handled by the command handler - if (!error.message.includes('Failed to create user')) { - logError('Unexpected create user endpoint error', error as Error, req, res); - } - } - - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Get user profile (current user) -userRouter.get('/profile', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - - logRequest('Get user profile endpoint accessed', req, res, { userId }); - - const result = await container.getUserByIdQueryHandler.execute({ id: userId }); - - if (!result) { - logWarning('User profile not found', { userId }, req, res); - return ErrorResponseService.sendNotFound(res, 'User not found'); - } - - logRequest('User profile retrieved successfully', req, res, { - userId, - username: result.username - }); - - res.json(result); - - } catch (error) { - logError('Get user profile endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -// Update user profile (current user) -userRouter.patch('/profile', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - - logRequest('Update user profile endpoint accessed', req, res, { - userId, - fieldsToUpdate: Object.keys(req.body) - }); - - const result = await container.updateUserCommandHandler.execute({ id: userId, ...req.body }); - - if (!result) { - return ErrorResponseService.sendNotFound(res, 'User not found'); - } - - logRequest('User profile updated successfully', req, res, { - userId, - username: result.username - }); - - res.json(result); - - } catch (error) { - logError('Update user profile endpoint error', error as Error, req, res); - - if (error instanceof Error) { - if (error.message.includes('already exists')) { - return ErrorResponseService.sendConflict(res, error.message); - } - if (error.message.includes('validation')) { - return ErrorResponseService.sendBadRequest(res, error.message); - } - } - - return ErrorResponseService.sendInternalServerError(res); - } -}); - -//Soft delete user (current user) -userRouter.delete('/profile', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - const result = await container.deleteUserCommandHandler.execute({ id: userId, soft: true }); - logRequest('User soft deleted successfully', req, res, { userId }); - res.json({ success: result }); - } catch (error) { - logError('Soft delete user endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); - -//logout user (current user) -userRouter.post('/logout', authRequired, async (req, res) => { - try { - const userId = (req as any).user.userId; - await container.logoutCommandHandler.execute(userId, res, req); - logRequest('User logged out successfully', req, res, { userId }); - res.json({ success: true }); - } catch (error) { - logError('Logout user endpoint error', error as Error, req, res); - return ErrorResponseService.sendInternalServerError(res); - } -}); -export default userRouter; diff --git a/SerpentRace_Backend/src/Api/swagger/swaggerConfig.ts b/SerpentRace_Backend/src/Api/swagger/swaggerConfig.ts deleted file mode 100644 index 1f2e31ef..00000000 --- a/SerpentRace_Backend/src/Api/swagger/swaggerConfig.ts +++ /dev/null @@ -1,101 +0,0 @@ -import swaggerJSDoc from 'swagger-jsdoc'; -import path from 'path'; - -export const swaggerOptions = { - definition: { - openapi: '3.0.0', - info: { - title: 'SerpentRace API', - version: '1.0.0', - description: 'Comprehensive API documentation for SerpentRace Backend', - contact: { - name: 'SerpentRace Development Team', - email: 'dev@serpentrace.com' - }, - license: { - name: 'MIT', - url: 'https://opensource.org/licenses/MIT' - } - }, - servers: [ - { - url: 'http://localhost:3001', - description: 'Local development server' - }, - { - url: 'http://localhost:3000', - description: 'Local development server (alt)' - }, - { - url: 'https://api.serpentrace.com', - description: 'Production server' - } - ], - components: { - securitySchemes: { - bearerAuth: { - type: 'http', - scheme: 'bearer', - bearerFormat: 'JWT', - description: 'Enter JWT token obtained from /api/users/login' - } - } - }, - security: [{ bearerAuth: [] }], - tags: [ - { - name: 'Users', - description: 'User authentication and profile management' - }, - { - name: 'Organizations', - description: 'Organization management and authentication' - }, - { - name: 'Decks', - description: 'Deck creation, management, and gameplay' - }, - { - name: 'Chats', - description: 'Real-time chat and messaging system' - }, - { - name: 'Contacts', - description: 'Contact form and support requests' - }, - { - name: 'Deck Import/Export', - description: 'Import and export deck functionality' - }, - { - name: 'Games', - description: 'Game management and gameplay' - }, - { - name: 'Admin - Users', - description: 'Admin user management operations' - }, - { - name: 'Admin - Decks', - description: 'Admin deck management operations' - }, - { - name: 'Admin - Organizations', - description: 'Admin organization management operations' - }, - { - name: 'Admin - Chats', - description: 'Admin chat management operations' - }, - { - name: 'Admin - Contacts', - description: 'Admin contact management operations' - } - ] - }, - apis: [ - './src/Api/swagger/swaggerDefinitionsFixed.ts' - ], -}; - -export const swaggerSpec = swaggerJSDoc(swaggerOptions); diff --git a/SerpentRace_Backend/src/Api/swagger/swaggerDefinitions.ts b/SerpentRace_Backend/src/Api/swagger/swaggerDefinitions.ts deleted file mode 100644 index 832d6231..00000000 --- a/SerpentRace_Backend/src/Api/swagger/swaggerDefinitions.ts +++ /dev/null @@ -1,1585 +0,0 @@ -/** - * @swagger - * components: - * schemas: - * User: - * type: object - * properties: - * id: - * type: string - * format: uuid - * username: - * type: string - * email: - * type: string - * format: email - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * nullable: true - * type: - * type: string - * state: - * type: integer - * regdate: - * type: string - * format: date-time - * updatedate: - * type: string - * format: date-time - * orgid: - * type: string - * nullable: true - * - * CreateUserRequest: - * type: object - * required: - * - username - * - email - * - password - * - fname - * - lname - * - type - * properties: - * username: - * type: string - * email: - * type: string - * format: email - * password: - * type: string - * format: password - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * type: - * type: string - * - * LoginRequest: - * type: object - * required: - * - username - * - password - * properties: - * username: - * type: string - * password: - * type: string - * format: password - * - * LoginResponse: - * type: object - * properties: - * token: - * type: string - * user: - * $ref: '#/components/schemas/User' - * requiresOrgReauth: - * type: boolean - * orgLoginUrl: - * type: string - * organizationName: - * type: string - * - * UpdateProfileRequest: - * type: object - * properties: - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * email: - * type: string - * format: email - * - * Organization: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * contactfname: - * type: string - * contactlname: - * type: string - * contactphone: - * type: string - * contactemail: - * type: string - * format: email - * state: - * type: integer - * regdate: - * type: string - * format: date-time - * updatedate: - * type: string - * format: date-time - * url: - * type: string - * nullable: true - * userinorg: - * type: integer - * maxOrganizationalDecks: - * type: integer - * - * Deck: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * type: - * type: integer - * enum: [0, 1, 2, 3] - * description: 0=JOKER, 1=LUCK, 2=QUESTION, 3=GENERAL - * userid: - * type: string - * format: uuid - * creationdate: - * type: string - * format: date-time - * cards: - * type: array - * items: - * type: object - * playedNumber: - * type: integer - * ctype: - * type: integer - * enum: [0, 1, 2] - * description: 0=PUBLIC, 1=ORGANIZATIONAL, 2=PRIVATE - * updatedate: - * type: string - * format: date-time - * state: - * type: integer - * enum: [0, 1, 2] - * description: 0=ACTIVE, 1=INACTIVE, 2=SOFT_DELETE - * organization: - * $ref: '#/components/schemas/Organization' - * nullable: true - * - * CreateDeckRequest: - * type: object - * required: - * - name - * - type - * - cards - * properties: - * name: - * type: string - * type: - * type: integer - * cards: - * type: array - * items: - * type: object - * ctype: - * type: integer - * - * Contact: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * email: - * type: string - * format: email - * userid: - * type: string - * format: uuid - * nullable: true - * type: - * type: integer - * enum: [0, 1, 2] - * description: 0=QUESTION, 1=BUG_REPORT, 2=SUGGESTION - * txt: - * type: string - * state: - * type: integer - * createDate: - * type: string - * format: date-time - * updateDate: - * type: string - * format: date-time - * adminResponse: - * type: string - * nullable: true - * responseDate: - * type: string - * format: date-time - * nullable: true - * respondedBy: - * type: string - * nullable: true - * - * CreateContactRequest: - * type: object - * required: - * - name - * - email - * - type - * - txt - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * type: - * type: integer - * txt: - * type: string - * - * Chat: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * type: - * type: integer - * participants: - * type: array - * items: - * type: string - * creatorId: - * type: string - * gameId: - * type: string - * nullable: true - * createDate: - * type: string - * format: date-time - * updateDate: - * type: string - * format: date-time - * state: - * type: integer - * - * ChatMessage: - * type: object - * properties: - * id: - * type: string - * format: uuid - * senderId: - * type: string - * senderName: - * type: string - * message: - * type: string - * timestamp: - * type: string - * format: date-time - * chatId: - * type: string - * - * Game: - * type: object - * properties: - * id: - * type: string - * format: uuid - * gamecode: - * type: string - * maxplayers: - * type: integer - * logintype: - * type: integer - * gamedecks: - * type: array - * players: - * type: array - * items: - * type: string - * started: - * type: boolean - * finished: - * type: boolean - * state: - * type: integer - * createdate: - * type: string - * format: date-time - * - * Error: - * type: object - * properties: - * error: - * type: string - * timestamp: - * type: string - * format: date-time - * details: - * type: string - */ -/** - * @swagger - * - * /api/users/login: - * post: - * tags: [Users] - * summary: User login - * description: Authenticate user and return JWT token - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/LoginRequest' - * responses: - * 200: - * description: Login successful - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/LoginResponse' - * 401: - * description: Invalid credentials - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' - * - * - * /api/users/create: - * post: - * tags: [Users] - * summary: Create new user - * description: Register a new user account - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/CreateUserRequest' - * responses: - * 201: - * description: User created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 400: - * description: Validation error - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Error' - * - * /api/users/profile: - * get: - * tags: [Users] - * summary: Get user profile - * description: Get current user's profile information - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: User profile data - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 401: - * description: Unauthorized - * patch: - * tags: [Users] - * summary: Update user profile - * description: Update current user's profile information - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/UpdateProfileRequest' - * responses: - * 200: - * description: Profile updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 400: - * description: Validation error - * 401: - * description: Unauthorized - * - * /api/organizations/page/{from}/{to}: - * get: - * tags: [Organizations] - * summary: Get organizations by page - * description: Retrieve paginated list of organizations - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated organizations - * content: - * application/json: - * schema: - * type: object - * properties: - * organizations: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - * totalCount: - * type: integer - * - * /api/organizations/search: - * get: - * tags: [Organizations] - * summary: Search organizations - * description: Search organizations by query - * security: - * - bearerAuth: [] - * parameters: - * - name: query - * in: query - * required: true - * schema: - * type: string - * - name: from - * in: query - * required: true - * schema: - * type: integer - * - name: to - * in: query - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - * totalCount: - * type: integer - * - * /api/organizations/{orgId}/login-url: - * get: - * tags: [Organizations] - * summary: Get organization login URL - * description: Get OAuth login URL for organization - * security: - * - bearerAuth: [] - * parameters: - * - name: orgId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Login URL - * content: - * application/json: - * schema: - * type: object - * properties: - * loginUrl: - * type: string - * - * /api/organizations/auth-callback: - * post: - * tags: [Organizations] - * summary: OAuth callback - * description: Handle OAuth callback from organization - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * code: - * type: string - * state: - * type: string - * responses: - * 200: - * description: Authentication successful - * 400: - * description: Invalid callback data - * - * /api/decks/page/{from}/{to}: - * get: - * tags: [Decks] - * summary: Get decks by page - * description: Retrieve paginated list of decks - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated decks - * content: - * application/json: - * schema: - * type: object - * properties: - * decks: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * totalCount: - * type: integer - * - * /api/decks: - * post: - * tags: [Decks] - * summary: Create deck - * description: Create a new deck - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/CreateDeckRequest' - * responses: - * 201: - * description: Deck created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * - * /api/decks/search: - * get: - * tags: [Decks] - * summary: Search decks - * description: Search decks by query - * security: - * - bearerAuth: [] - * parameters: - * - name: query - * in: query - * required: true - * schema: - * type: string - * - name: from - * in: query - * required: true - * schema: - * type: integer - * - name: to - * in: query - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * totalCount: - * type: integer - * - * /api/decks/{id}: - * get: - * tags: [Decks] - * summary: Get deck by ID - * description: Retrieve a specific deck by ID - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Deck details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * 404: - * description: Deck not found - * put: - * tags: [Decks] - * summary: Update deck - * description: Update an existing deck - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/CreateDeckRequest' - * responses: - * 200: - * description: Deck updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * delete: - * tags: [Decks] - * summary: Delete deck - * description: Delete a deck (soft delete) - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 204: - * description: Deck deleted successfully - * 404: - * description: Deck not found - * - * /api/chats/user-chats: - * get: - * tags: [Chats] - * summary: Get user chats - * description: Get all chats for the current user - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: User chats - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Chat' - * - * /api/chats/history/{chatId}: - * get: - * tags: [Chats] - * summary: Get chat history - * description: Get message history for a chat - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * - name: page - * in: query - * schema: - * type: integer - * - name: limit - * in: query - * schema: - * type: integer - * responses: - * 200: - * description: Chat history - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/ChatMessage' - * - * /api/chats/create: - * post: - * tags: [Chats] - * summary: Create chat - * description: Create a new chat room - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - gameId - * properties: - * name: - * type: string - * gameId: - * type: string - * password: - * type: string - * nullable: true - * responses: - * 201: - * description: Chat created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Chat' - * - * /api/chats/message: - * post: - * tags: [Chats] - * summary: Send message - * description: Send a message to a chat - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - chatId - * - message - * properties: - * chatId: - * type: string - * message: - * type: string - * responses: - * 201: - * description: Message sent successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/ChatMessage' - * - * /api/chats/archive/{chatId}: - * post: - * tags: [Chats] - * summary: Archive chat - * description: Archive a chat room - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat archived successfully - * 404: - * description: Chat not found - * - * /api/chats/restore/{chatId}: - * post: - * tags: [Chats] - * summary: Restore chat - * description: Restore an archived chat room - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat restored successfully - * 404: - * description: Chat not found - * - * /api/chats/archived/game/{gameId}: - * get: - * tags: [Chats] - * summary: Get archived chats by game - * description: Get all archived chats for a specific game - * security: - * - bearerAuth: [] - * parameters: - * - name: gameId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Archived chats - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Chat' - * - * /api/deck-import-export/export/{deckId}: - * get: - * tags: [Import/Export] - * summary: Export deck - * description: Export a deck as JSON or .spr file - * security: - * - bearerAuth: [] - * parameters: - * - name: deckId - * in: path - * required: true - * schema: - * type: string - * - name: format - * in: query - * schema: - * type: string - * enum: [json, spr] - * default: json - * responses: - * 200: - * description: Deck exported successfully - * content: - * application/json: - * schema: - * type: object - * application/octet-stream: - * schema: - * type: string - * format: binary - * - * /api/deck-import-export/import: - * post: - * tags: [Import/Export] - * summary: Import deck - * description: Import a deck from JSON or .spr file - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * multipart/form-data: - * schema: - * type: object - * properties: - * file: - * type: string - * format: binary - * responses: - * 201: - * description: Deck imported successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * - * /api/admin/users/page/{from}/{to}: - * get: - * tags: [Admin - Users] - * summary: Get users by page (Admin) - * description: Admin endpoint to retrieve paginated list of users - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated users - * content: - * application/json: - * schema: - * type: object - * properties: - * users: - * type: array - * items: - * $ref: '#/components/schemas/User' - * totalCount: - * type: integer - * - * /api/admin/users/{userId}: - * get: - * tags: [Admin - Users] - * summary: Get user by ID (Admin) - * description: Admin endpoint to get specific user details - * security: - * - bearerAuth: [] - * parameters: - * - name: userId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: User details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * delete: - * tags: [Admin - Users] - * summary: Delete user (Admin) - * description: Admin endpoint to delete a user - * security: - * - bearerAuth: [] - * parameters: - * - name: userId - * in: path - * required: true - * schema: - * type: string - * responses: - * 204: - * description: User deleted successfully - * - * /api/admin/users/search/{searchTerm}: - * get: - * tags: [Admin - Users] - * summary: Search users (Admin) - * description: Admin endpoint to search users - * security: - * - bearerAuth: [] - * parameters: - * - name: searchTerm - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/User' - * - * /api/admin/users/{userId}/deactivate: - * post: - * tags: [Admin - Users] - * summary: Deactivate user (Admin) - * description: Admin endpoint to deactivate a user - * security: - * - bearerAuth: [] - * parameters: - * - name: userId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: User deactivated successfully - * - * /api/admin/decks/page/{from}/{to}: - * get: - * tags: [Admin - Decks] - * summary: Get decks by page (Admin) - * description: Admin endpoint to retrieve paginated list of decks - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated decks - * content: - * application/json: - * schema: - * type: object - * properties: - * decks: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * totalCount: - * type: integer - * - * /api/admin/decks/{id}: - * get: - * tags: [Admin - Decks] - * summary: Get deck by ID (Admin) - * description: Admin endpoint to get specific deck details - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Deck details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * - * /api/admin/decks/search/{searchTerm}: - * get: - * tags: [Admin - Decks] - * summary: Search decks (Admin) - * description: Admin endpoint to search decks - * security: - * - bearerAuth: [] - * parameters: - * - name: searchTerm - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * - * /api/admin/decks/{id}/hard: - * delete: - * tags: [Admin - Decks] - * summary: Hard delete deck (Admin) - * description: Admin endpoint to permanently delete a deck - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 204: - * description: Deck permanently deleted - * - * /api/admin/organizations: - * post: - * tags: [Admin - Organizations] - * summary: Create organization (Admin) - * description: Admin endpoint to create a new organization - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * properties: - * name: - * type: string - * description: - * type: string - * responses: - * 201: - * description: Organization created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Organization' - * - * /api/admin/organizations/page/{from}/{to}: - * get: - * tags: [Admin - Organizations] - * summary: Get organizations by page (Admin) - * description: Admin endpoint to retrieve paginated list of organizations - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated organizations - * content: - * application/json: - * schema: - * type: object - * properties: - * organizations: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - * totalCount: - * type: integer - * - * /api/admin/organizations/{id}: - * get: - * tags: [Admin - Organizations] - * summary: Get organization by ID (Admin) - * description: Admin endpoint to get specific organization details - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Organization details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Organization' - * delete: - * tags: [Admin - Organizations] - * summary: Delete organization (Admin) - * description: Admin endpoint to soft delete an organization - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 204: - * description: Organization deleted successfully - * - * /api/admin/organizations/search/{searchTerm}: - * get: - * tags: [Admin - Organizations] - * summary: Search organizations (Admin) - * description: Admin endpoint to search organizations - * security: - * - bearerAuth: [] - * parameters: - * - name: searchTerm - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - * - * /api/admin/organizations/{id}/hard: - * delete: - * tags: [Admin - Organizations] - * summary: Hard delete organization (Admin) - * description: Admin endpoint to permanently delete an organization - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 204: - * description: Organization permanently deleted - * - * /api/admin/chats/page/{from}/{to}: - * get: - * tags: [Admin - Chats] - * summary: Get chats by page (Admin) - * description: Admin endpoint to retrieve paginated list of chats - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated chats - * content: - * application/json: - * schema: - * type: object - * properties: - * chats: - * type: array - * items: - * $ref: '#/components/schemas/Chat' - * totalCount: - * type: integer - * - * /api/admin/chats/{id}: - * get: - * tags: [Admin - Chats] - * summary: Get chat by ID (Admin) - * description: Admin endpoint to get specific chat details - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Chat' - * - * /api/admin/contacts/page/{from}/{to}: - * get: - * tags: [Admin - Contacts] - * summary: Get contacts by page (Admin) - * description: Admin endpoint to retrieve paginated list of contacts - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated contacts - * content: - * application/json: - * schema: - * type: object - * properties: - * contacts: - * type: array - * items: - * $ref: '#/components/schemas/Contact' - * totalCount: - * type: integer - * - * /api/admin/contacts/{id}: - * get: - * tags: [Admin - Contacts] - * summary: Get contact by ID (Admin) - * description: Admin endpoint to get specific contact details - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Contact details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - * - * /api/admin/contacts/search/{searchTerm}: - * get: - * tags: [Admin - Contacts] - * summary: Search contacts (Admin) - * description: Admin endpoint to search contacts - * security: - * - bearerAuth: [] - * parameters: - * - name: searchTerm - * in: path - * required: true - * schema: - * type: string - * - name: includeDeleted - * in: query - * required: true - * schema: - * type: boolean - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Contact' - * - * /api/contacts: - * post: - * tags: [Contacts] - * summary: Create contact - * description: Create a new contact message - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/CreateContactRequest' - * responses: - * 201: - * description: Contact created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - * - * /api/games/start: - * post: - * summary: Start a new game - * tags: [Games] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - deckids - * - maxplayers - * - logintype - * properties: - * deckids: - * type: array - * items: - * type: string - * description: Array of deck IDs (must include all 3 types LUCK, JOKER, QUESTION) - * maxplayers: - * type: integer - * minimum: 2 - * maximum: 8 - * description: Maximum number of players allowed in the game - * logintype: - * type: integer - * enum: [0, 1, 2] - * description: How players can join (PUBLIC=0, PRIVATE=1, ORGANIZATION=2) - * responses: - * 200: - * description: Game started successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * id: - * type: string - * description: Game UUID - * gamecode: - * type: string - * description: 6-character game code for joining - * maxplayers: - * type: integer - * logintype: - * type: integer - * gamedecks: - * type: array - * description: Shuffled game decks - * players: - * type: array - * items: - * type: string - * started: - * type: boolean - * finished: - * type: boolean - * state: - * type: integer - * description: Game state (WAITING=0, ACTIVE=1, FINISHED=2, CANCELLED=3) - * createdate: - * type: string - * format: date-time - * 400: - * description: Invalid input parameters - * 401: - * description: Authentication required - * 500: - * description: Internal server error - * - * /api/games/join: - * post: - * summary: Join a game (automatically detects game type) - * description: Join any game by providing the game code. The system automatically determines if authentication is required based on the game type. - * tags: [Games] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - gameCode - * properties: - * gameCode: - * type: string - * description: 6-character game code - * example: "ABC123" - * playerName: - * type: string - * description: Display name for the player (required for public games, optional for authenticated games) - * example: "John Doe" - * responses: - * 200: - * description: Successfully joined the game - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Game' - * 400: - * description: Invalid input or missing required fields - * 401: - * description: Authentication required for this game type - * 403: - * description: Organization membership required - * 404: - * description: Game not found - * 409: - * description: Game is full or not accepting players - * 500: - * description: Internal server error - * - * /api/games/{gameId}/start: - * post: - * summary: Start gameplay for an existing game - * description: Initialize gameplay by setting all player positions to 0 and assigning random turn order. This is separate from game creation. - * tags: [Games] - * parameters: - * - in: path - * name: gameId - * required: true - * schema: - * type: string - * description: The ID of the game to start - * responses: - * 200: - * description: Game started successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Game started successfully" - * gameId: - * type: string - * example: "game123" - * playerCount: - * type: number - * example: 4 - * 400: - * description: Invalid input or game cannot be started - * 401: - * description: Authentication required - * 403: - * description: Only game master can start the game - * 404: - * description: Game not found - * 409: - * description: Game already started or not ready to start - * 500: - * description: Internal server error - */ - -export {}; diff --git a/SerpentRace_Backend/src/Api/swagger/swaggerDefinitionsFixed.ts b/SerpentRace_Backend/src/Api/swagger/swaggerDefinitionsFixed.ts deleted file mode 100644 index edf95188..00000000 --- a/SerpentRace_Backend/src/Api/swagger/swaggerDefinitionsFixed.ts +++ /dev/null @@ -1,2678 +0,0 @@ -/** - * @swagger - * components: - * schemas: - * User: - * type: object - * properties: - * id: - * type: string - * format: uuid - * username: - * type: string - * email: - * type: string - * format: email - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * nullable: true - * type: - * type: string - * state: - * type: integer - * regdate: - * type: string - * format: date-time - * updatedate: - * type: string - * format: date-time - * orgid: - * type: string - * nullable: true - * - * CreateUserRequest: - * type: object - * required: - * - username - * - email - * - password - * - fname - * - lname - * - type - * properties: - * username: - * type: string - * email: - * type: string - * format: email - * password: - * type: string - * format: password - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * type: - * type: string - * - * LoginRequest: - * type: object - * required: - * - username - * - password - * properties: - * username: - * type: string - * password: - * type: string - * format: password - * - * LoginResponse: - * type: object - * properties: - * token: - * type: string - * user: - * $ref: '#/components/schemas/User' - * requiresOrgReauth: - * type: boolean - * orgLoginUrl: - * type: string - * organizationName: - * type: string - * - * UpdateProfileRequest: - * type: object - * properties: - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * email: - * type: string - * format: email - * - * Organization: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * contactfname: - * type: string - * contactlname: - * type: string - * contactphone: - * type: string - * contactemail: - * type: string - * format: email - * state: - * type: integer - * regdate: - * type: string - * format: date-time - * updatedate: - * type: string - * format: date-time - * url: - * type: string - * nullable: true - * userinorg: - * type: integer - * maxOrganizationalDecks: - * type: integer - * - * Deck: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * type: - * type: integer - * enum: [0, 1, 2, 3] - * description: 0=JOKER, 1=LUCK, 2=QUESTION, 3=GENERAL - * userid: - * type: string - * format: uuid - * creationdate: - * type: string - * format: date-time - * cards: - * type: array - * items: - * type: object - * playedNumber: - * type: integer - * ctype: - * type: integer - * enum: [0, 1, 2] - * description: 0=PUBLIC, 1=ORGANIZATIONAL, 2=PRIVATE - * updatedate: - * type: string - * format: date-time - * state: - * type: integer - * enum: [0, 1, 2] - * description: 0=ACTIVE, 1=INACTIVE, 2=SOFT_DELETE - * organization: - * $ref: '#/components/schemas/Organization' - * nullable: true - * - * CreateDeckRequest: - * type: object - * required: - * - name - * - type - * - cards - * properties: - * name: - * type: string - * type: - * type: integer - * cards: - * type: array - * items: - * type: object - * ctype: - * type: integer - * - * Chat: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * type: - * type: integer - * participants: - * type: array - * items: - * type: string - * creatorId: - * type: string - * gameId: - * type: string - * nullable: true - * createDate: - * type: string - * format: date-time - * updateDate: - * type: string - * format: date-time - * state: - * type: integer - * - * ChatMessage: - * type: object - * properties: - * id: - * type: string - * format: uuid - * senderId: - * type: string - * senderName: - * type: string - * message: - * type: string - * timestamp: - * type: string - * format: date-time - * chatId: - * type: string - * - * Contact: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * email: - * type: string - * format: email - * userid: - * type: string - * format: uuid - * nullable: true - * type: - * type: integer - * enum: [0, 1, 2] - * description: 0=QUESTION, 1=BUG_REPORT, 2=SUGGESTION - * txt: - * type: string - * state: - * type: integer - * createDate: - * type: string - * format: date-time - * updateDate: - * type: string - * format: date-time - * adminResponse: - * type: string - * nullable: true - * responseDate: - * type: string - * format: date-time - * nullable: true - * respondedBy: - * type: string - * nullable: true - * - * CreateContactRequest: - * type: object - * required: - * - name - * - email - * - type - * - txt - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * type: - * type: integer - * txt: - * type: string - * - * Game: - * type: object - * properties: - * id: - * type: string - * format: uuid - * gamecode: - * type: string - * maxplayers: - * type: integer - * logintype: - * type: integer - * gamedecks: - * type: array - * players: - * type: array - * items: - * type: string - * started: - * type: boolean - * finished: - * type: boolean - * state: - * type: integer - * createdate: - * type: string - * format: date-time - * - * Error: - * type: object - * properties: - * error: - * type: string - * timestamp: - * type: string - * format: date-time - * details: - * type: string - */ - -/** - * @swagger - * /api/users/login: - * post: - * tags: [Users] - * summary: User login - * description: Authenticate user and return JWT token - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/LoginRequest' - * responses: - * 200: - * description: Login successful - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/LoginResponse' - * 401: - * description: Invalid credentials - */ - -/** - * @swagger - * /api/users/create: - * post: - * tags: [Users] - * summary: Create new user - * description: Register a new user account - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/CreateUserRequest' - * responses: - * 201: - * description: User created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 400: - * description: Validation error - * 409: - * description: User already exists - */ - -/** - * @swagger - * /api/users/profile: - * get: - * tags: [Users] - * summary: Get user profile - * description: Get current user's profile information - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: User profile data - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 401: - * description: Unauthorized - * patch: - * tags: [Users] - * summary: Update user profile - * description: Update current user's profile information - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/UpdateProfileRequest' - * responses: - * 200: - * description: Profile updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 400: - * description: Validation error - * 401: - * description: Unauthorized - */ - -/** - * @swagger - * /api/organizations/search: - * get: - * tags: [Organizations] - * summary: Search organizations - * description: Search organizations by query - * security: - * - bearerAuth: [] - * parameters: - * - name: query - * in: query - * required: true - * schema: - * type: string - * - name: from - * in: query - * required: true - * schema: - * type: integer - * - name: to - * in: query - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - * totalCount: - * type: integer - */ - -/** - * @swagger - * /api/organizations/{orgId}/login-url: - * get: - * tags: [Organizations] - * summary: Get organization login URL - * description: Get OAuth login URL for organization - * security: - * - bearerAuth: [] - * parameters: - * - name: orgId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Login URL - * content: - * application/json: - * schema: - * type: object - * properties: - * loginUrl: - * type: string - */ - -/** - * @swagger - * /api/organizations/auth-callback: - * post: - * tags: [Organizations] - * summary: OAuth callback - * description: Handle OAuth callback from organization - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * code: - * type: string - * state: - * type: string - * responses: - * 200: - * description: Authentication successful - * 400: - * description: Invalid callback data - */ - -/** - * @swagger - * /api/decks/page/{from}/{to}: - * get: - * tags: [Decks] - * summary: Get decks by page - * description: Retrieve paginated list of decks - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated decks - * content: - * application/json: - * schema: - * type: object - * properties: - * decks: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * totalCount: - * type: integer - */ - -/** - * @swagger - * /api/decks/search: - * get: - * tags: [Decks] - * summary: Search decks - * description: Search decks by query - * security: - * - bearerAuth: [] - * parameters: - * - name: query - * in: query - * required: true - * schema: - * type: string - * - name: from - * in: query - * required: true - * schema: - * type: integer - * - name: to - * in: query - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: object - * properties: - * results: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * totalCount: - * type: integer - */ - -/** - * @swagger - * /api/decks/{id}: - * get: - * tags: [Decks] - * summary: Get deck by ID - * description: Retrieve a specific deck by ID - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Deck details - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * 404: - * description: Deck not found - * put: - * tags: [Decks] - * summary: Update deck - * description: Update an existing deck - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/CreateDeckRequest' - * responses: - * 200: - * description: Deck updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * delete: - * tags: [Decks] - * summary: Delete deck - * description: Delete a deck (soft delete) - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 204: - * description: Deck deleted successfully - * 404: - * description: Deck not found - */ - -/** - * @swagger - * /api/chats/user-chats: - * get: - * tags: [Chats] - * summary: Get user chats - * description: Get all chats for the current user - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: User chats - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Chat' - */ - -/** - * @swagger - * /api/chats/history/{chatId}: - * get: - * tags: [Chats] - * summary: Get chat history - * description: Get message history for a chat - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * - name: page - * in: query - * schema: - * type: integer - * - name: limit - * in: query - * schema: - * type: integer - * responses: - * 200: - * description: Chat history - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/ChatMessage' - */ - -/** - * @swagger - * /api/chats/message: - * post: - * tags: [Chats] - * summary: Send message - * description: Send a message to a chat - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - chatId - * - message - * properties: - * chatId: - * type: string - * message: - * type: string - * responses: - * 201: - * description: Message sent successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/ChatMessage' - */ - -/** - * @swagger - * /api/chats/archive/{chatId}: - * post: - * tags: [Chats] - * summary: Archive chat - * description: Archive a chat room - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat archived successfully - * 404: - * description: Chat not found - */ - -/** - * @swagger - * /api/chats/restore/{chatId}: - * post: - * tags: [Chats] - * summary: Restore chat - * description: Restore an archived chat room - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat restored successfully - * 404: - * description: Chat not found - */ - -/** - * @swagger - * /api/contact/create: - * post: - * tags: [Contact] - * summary: Create contact message - * description: Send a contact message to the system - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - message - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * subject: - * type: string - * nullable: true - * message: - * type: string - * responses: - * 201: - * description: Contact message sent successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - */ - -/** - * @swagger - * /api/admin/users: - * get: - * tags: [Admin - Users] - * summary: Get all users (Admin) - * description: Retrieve all users in the system with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: page - * in: query - * schema: - * type: integer - * default: 1 - * - name: limit - * in: query - * schema: - * type: integer - * default: 10 - * - name: search - * in: query - * schema: - * type: string - * responses: - * 200: - * description: Users retrieved successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * users: - * type: array - * items: - * $ref: '#/components/schemas/User' - * total: - * type: integer - * page: - * type: integer - * limit: - * type: integer - */ - -/** - * @swagger - * /api/admin/users/{id}: - * get: - * tags: [Admin - Users] - * summary: Get user by ID (Admin) - * description: Get detailed information about a specific user - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: User found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * 404: - * description: User not found - * put: - * tags: [Admin - Users] - * summary: Update user (Admin) - * description: Update user information by admin - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * username: - * type: string - * email: - * type: string - * format: email - * firstName: - * type: string - * lastName: - * type: string - * isActive: - * type: boolean - * role: - * type: string - * enum: [user, admin, moderator] - * responses: - * 200: - * description: User updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - * delete: - * tags: [Admin - Users] - * summary: Delete user (Admin) - * description: Delete a user from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: User deleted successfully - * 404: - * description: User not found - */ - -/** - * @swagger - * /api/admin/users/{id}/ban: - * post: - * tags: [Admin - Users] - * summary: Ban user (Admin) - * description: Ban a user from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * content: - * application/json: - * schema: - * type: object - * properties: - * reason: - * type: string - * duration: - * type: string - * description: Ban duration in ISO format or 'permanent' - * responses: - * 200: - * description: User banned successfully - */ - -/** - * @swagger - * /api/admin/users/{id}/unban: - * post: - * tags: [Admin - Users] - * summary: Unban user (Admin) - * description: Remove ban from a user - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: User unbanned successfully - */ - -/** - * @swagger - * /api/admin/decks: - * get: - * tags: [Admin - Decks] - * summary: Get all decks (Admin) - * description: Retrieve all decks in the system with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: page - * in: query - * schema: - * type: integer - * default: 1 - * - name: limit - * in: query - * schema: - * type: integer - * default: 10 - * - name: search - * in: query - * schema: - * type: string - * - name: status - * in: query - * schema: - * type: string - * enum: [public, private, reported] - * responses: - * 200: - * description: Decks retrieved successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * decks: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - * total: - * type: integer - * page: - * type: integer - * limit: - * type: integer - */ - -/** - * @swagger - * /api/admin/decks/{id}: - * get: - * tags: [Admin - Decks] - * summary: Get deck by ID (Admin) - * description: Get detailed information about a specific deck - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Deck found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * 404: - * description: Deck not found - * put: - * tags: [Admin - Decks] - * summary: Update deck (Admin) - * description: Update deck information by admin - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * description: - * type: string - * isPublic: - * type: boolean - * isActive: - * type: boolean - * responses: - * 200: - * description: Deck updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * delete: - * tags: [Admin - Decks] - * summary: Delete deck (Admin) - * description: Delete a deck from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Deck deleted successfully - * 404: - * description: Deck not found - */ - -/** - * @swagger - * /api/admin/decks/{id}/moderate: - * post: - * tags: [Admin - Decks] - * summary: Moderate deck (Admin) - * description: Approve or reject a deck for public visibility - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - action - * properties: - * action: - * type: string - * enum: [approve, reject, flag] - * reason: - * type: string - * responses: - * 200: - * description: Deck moderated successfully - */ - -/** - * @swagger - * /api/admin/organizations: - * get: - * tags: [Admin - Organizations] - * summary: Get all organizations (Admin) - * description: Retrieve all organizations in the system with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: page - * in: query - * schema: - * type: integer - * default: 1 - * - name: limit - * in: query - * schema: - * type: integer - * default: 10 - * - name: search - * in: query - * schema: - * type: string - * responses: - * 200: - * description: Organizations retrieved successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * organizations: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - * total: - * type: integer - * page: - * type: integer - * limit: - * type: integer - */ - -/** - * @swagger - * /api/admin/organizations/{id}: - * get: - * tags: [Admin - Organizations] - * summary: Get organization by ID (Admin) - * description: Get detailed information about a specific organization - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Organization found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Organization' - * 404: - * description: Organization not found - * put: - * tags: [Admin - Organizations] - * summary: Update organization (Admin) - * description: Update organization information by admin - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * name: - * type: string - * description: - * type: string - * isActive: - * type: boolean - * responses: - * 200: - * description: Organization updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Organization' - * delete: - * tags: [Admin - Organizations] - * summary: Delete organization (Admin) - * description: Delete an organization from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Organization deleted successfully - * 404: - * description: Organization not found - */ - -/** - * @swagger - * /api/admin/organizations/{id}/members: - * get: - * tags: [Admin - Organizations] - * summary: Get organization members (Admin) - * description: Get all members of an organization - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Organization members - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/User' - */ - -/** - * @swagger - * /api/admin/chats: - * get: - * tags: [Admin - Chats] - * summary: Get all chats (Admin) - * description: Retrieve all chats in the system with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: page - * in: query - * schema: - * type: integer - * default: 1 - * - name: limit - * in: query - * schema: - * type: integer - * default: 10 - * - name: search - * in: query - * schema: - * type: string - * - name: status - * in: query - * schema: - * type: string - * enum: [active, archived, reported] - * responses: - * 200: - * description: Chats retrieved successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * chats: - * type: array - * items: - * $ref: '#/components/schemas/Chat' - * total: - * type: integer - * page: - * type: integer - * limit: - * type: integer - */ - -/** - * @swagger - * /api/admin/chats/{id}: - * get: - * tags: [Admin - Chats] - * summary: Get chat by ID (Admin) - * description: Get detailed information about a specific chat - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Chat' - * 404: - * description: Chat not found - * delete: - * tags: [Admin - Chats] - * summary: Delete chat (Admin) - * description: Delete a chat from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat deleted successfully - * 404: - * description: Chat not found - */ - -/** - * @swagger - * /api/admin/chats/{id}/messages: - * get: - * tags: [Admin - Chats] - * summary: Get chat messages (Admin) - * description: Get all messages in a chat - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * - name: page - * in: query - * schema: - * type: integer - * - name: limit - * in: query - * schema: - * type: integer - * responses: - * 200: - * description: Chat messages - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/ChatMessage' - */ - -/** - * @swagger - * /api/admin/chats/{id}/moderate: - * post: - * tags: [Admin - Chats] - * summary: Moderate chat (Admin) - * description: Moderate a chat room (archive, restore, flag) - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - action - * properties: - * action: - * type: string - * enum: [archive, restore, flag, unflag] - * reason: - * type: string - * responses: - * 200: - * description: Chat moderated successfully - */ - -/** - * @swagger - * /api/admin/contacts: - * get: - * tags: [Admin - Contacts] - * summary: Get all contact messages (Admin) - * description: Retrieve all contact messages with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: page - * in: query - * schema: - * type: integer - * default: 1 - * - name: limit - * in: query - * schema: - * type: integer - * default: 10 - * - name: status - * in: query - * schema: - * type: string - * enum: [unread, read, resolved] - * - name: search - * in: query - * schema: - * type: string - * responses: - * 200: - * description: Contact messages retrieved successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * contacts: - * type: array - * items: - * $ref: '#/components/schemas/Contact' - * total: - * type: integer - * page: - * type: integer - * limit: - * type: integer - */ - -/** - * @swagger - * /api/admin/contacts/{id}: - * get: - * tags: [Admin - Contacts] - * summary: Get contact message by ID (Admin) - * description: Get detailed information about a specific contact message - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Contact message found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - * 404: - * description: Contact message not found - * put: - * tags: [Admin - Contacts] - * summary: Update contact message status (Admin) - * description: Update the status of a contact message - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * properties: - * status: - * type: string - * enum: [unread, read, resolved] - * adminNotes: - * type: string - * responses: - * 200: - * description: Contact message updated successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - * delete: - * tags: [Admin - Contacts] - * summary: Delete contact message (Admin) - * description: Delete a contact message from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Contact message deleted successfully - * 404: - * description: Contact message not found - */ - -/** - * @swagger - * /api/admin/contacts/{id}/reply: - * post: - * tags: [Admin - Contacts] - * summary: Reply to contact message (Admin) - * description: Send a reply to a contact message - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - reply - * properties: - * reply: - * type: string - * responses: - * 200: - * description: Reply sent successfully - */ - -/** - * @swagger - * /api/admin/games: - * get: - * tags: [Admin - Games] - * summary: Get all games (Admin) - * description: Retrieve all games in the system with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: page - * in: query - * schema: - * type: integer - * default: 1 - * - name: limit - * in: query - * schema: - * type: integer - * default: 10 - * - name: status - * in: query - * schema: - * type: string - * enum: [active, completed, abandoned] - * responses: - * 200: - * description: Games retrieved successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * games: - * type: array - * items: - * $ref: '#/components/schemas/Game' - * total: - * type: integer - * page: - * type: integer - * limit: - * type: integer - */ - -/** - * @swagger - * /api/admin/games/{id}: - * get: - * tags: [Admin - Games] - * summary: Get game by ID (Admin) - * description: Get detailed information about a specific game - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Game found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Game' - * 404: - * description: Game not found - * delete: - * tags: [Admin - Games] - * summary: Delete game (Admin) - * description: Delete a game from the system - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Game deleted successfully - * 404: - * description: Game not found - */ - -/** - * @swagger - * /api/admin/system/stats: - * get: - * tags: [Admin - System] - * summary: Get system statistics (Admin) - * description: Get comprehensive system statistics - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: System statistics - * content: - * application/json: - * schema: - * type: object - * properties: - * uptime: - * type: string - * version: - * type: string - * memoryUsage: - * type: object - * activeConnections: - * type: integer - * databaseHealth: - * type: string - * redisHealth: - * type: string - */ - -/** - * @swagger - * /api/admin/system/logs: - * get: - * tags: [Admin - System] - * summary: Get system logs (Admin) - * description: Retrieve system logs with filtering - * security: - * - bearerAuth: [] - * parameters: - * - name: level - * in: query - * schema: - * type: string - * enum: [error, warn, info, debug] - * - name: limit - * in: query - * schema: - * type: integer - * default: 100 - * - name: since - * in: query - * schema: - * type: string - * format: date-time - * responses: - * 200: - * description: System logs - * content: - * application/json: - * schema: - * type: array - * items: - * type: object - * properties: - * timestamp: - * type: string - * level: - * type: string - * message: - * type: string - * metadata: - * type: object - */ - -/** - * @swagger - * /api/health: - * get: - * tags: [System] - * summary: Health check - * description: Check the health status of the API - * responses: - * 200: - * description: Service is healthy - * content: - * application/json: - * schema: - * type: object - * properties: - * status: - * type: string - * example: "OK" - * timestamp: - * type: string - * format: date-time - * version: - * type: string - */ - -/** - * @swagger - * components: - * securitySchemes: - * bearerAuth: - * type: http - * scheme: bearer - * schemas: - * User: - * type: object - * properties: - * id: - * type: string - * format: uuid - * username: - * type: string - * email: - * type: string - * format: email - * fname: - * type: string - * lname: - * type: string - * phone: - * type: string - * nullable: true - * type: - * type: string - * state: - * type: integer - * regdate: - * type: string - * format: date-time - * updatedate: - * type: string - * format: date-time - * orgid: - * type: string - * nullable: true - * Deck: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * type: - * type: integer - * userid: - * type: string - * format: uuid - * creationdate: - * type: string - * format: date-time - * cards: - * type: array - * items: - * type: object - * Organization: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * description: - * type: string - * members: - * type: array - * items: - * $ref: '#/components/schemas/User' - * Contact: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * email: - * type: string - * format: email - * type: - * type: integer - * txt: - * type: string - * userid: - * type: string - * nullable: true - * createdate: - * type: string - * format: date-time - * Chat: - * type: object - * properties: - * id: - * type: string - * format: uuid - * name: - * type: string - * gameId: - * type: string - * format: uuid - * messages: - * type: array - * items: - * $ref: '#/components/schemas/ChatMessage' - * ChatMessage: - * type: object - * properties: - * id: - * type: string - * format: uuid - * chatId: - * type: string - * format: uuid - * senderId: - * type: string - * format: uuid - * message: - * type: string - * timestamp: - * type: string - * format: date-time - * Game: - * type: object - * properties: - * id: - * type: string - * format: uuid - * deckids: - * type: array - * items: - * type: string - * maxplayers: - * type: integer - * logintype: - * type: string - * state: - * type: string - * createdate: - * type: string - * format: date-time - */ - -/** - * @swagger - * tags: - * - name: Users - * - name: Decks - * - name: Organizations - * - name: Contact - * - name: Chats - * - name: Games - * - name: Admin - Users - * - name: Admin - Decks - * - name: Admin - Organizations - * - name: Admin - Contacts - * - name: Admin - Chats - * - name: Admin - Games - * - name: System - */ - -// User endpoints -/** - * @swagger - * /api/users/login: - * post: - * tags: [Users] - * summary: User login - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: [username, password] - * properties: - * username: - * type: string - * password: - * type: string - * responses: - * 200: - * description: Login successful - * content: - * application/json: - * schema: - * type: object - * properties: - * token: - * type: string - */ - -/** - * @swagger - * /api/users/create: - * post: - * tags: [Users] - * summary: Create user - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: [username, email, password] - * properties: - * username: - * type: string - * email: - * type: string - * password: - * type: string - * responses: - * 201: - * description: User created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/User' - */ - -// ...existing code... -/** - * @swagger - * /api/decks/page/{from}/{to}: - * get: - * tags: [Decks] - * summary: Get decks with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated decks - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - */ - -/** - * @swagger - * /api/decks/search: - * get: - * tags: [Decks] - * summary: Search decks - * security: - * - bearerAuth: [] - * parameters: - * - name: q - * in: query - * schema: - * type: string - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - */ - -/** - * @swagger - * /api/decks/{id}: - * get: - * tags: [Decks] - * summary: Get deck by ID - * security: - * - bearerAuth: [] - * parameters: - * - name: id - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Deck found - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - * 404: - * description: Deck not found - */ - -/** - * @swagger - * /api/organizations/page/{from}/{to}: - * get: - * tags: [Organizations] - * summary: Get organizations with pagination - * security: - * - bearerAuth: [] - * parameters: - * - name: from - * in: path - * required: true - * schema: - * type: integer - * - name: to - * in: path - * required: true - * schema: - * type: integer - * responses: - * 200: - * description: Paginated organizations - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - */ - -/** - * @swagger - * /api/organizations/search: - * get: - * tags: [Organizations] - * summary: Search organizations - * security: - * - bearerAuth: [] - * parameters: - * - name: q - * in: query - * schema: - * type: string - * responses: - * 200: - * description: Search results - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - */ - -/** - * @swagger - * /api/contact/create: - * post: - * tags: [Contact] - * summary: Create contact message - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: [name, email, txt] - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * txt: - * type: string - * responses: - * 201: - * description: Contact created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - */ - -/** - * @swagger - * /api/chats/create: - * post: - * tags: [Chats] - * summary: Create chat - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: [name, gameId] - * properties: - * name: - * type: string - * gameId: - * type: string - * responses: - * 201: - * description: Chat created - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Chat' - */ - -/** - * @swagger - * /api/chats/history/{chatId}: - * get: - * tags: [Chats] - * summary: Get chat history - * security: - * - bearerAuth: [] - * parameters: - * - name: chatId - * in: path - * required: true - * schema: - * type: string - * responses: - * 200: - * description: Chat history - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/ChatMessage' - */ - -/** - * @swagger - * /api/games/start: - * post: - * tags: [Games] - * summary: Start a new game - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: [deckids, maxplayers, logintype] - * properties: - * deckids: - * type: array - * items: - * type: string - * maxplayers: - * type: integer - * logintype: - * type: string - * responses: - * 201: - * description: Game started - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Game' - */ - -/** - * @swagger - * /api/games/join: - * post: - * tags: [Games] - * summary: Join a game - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: [gameId] - * properties: - * gameId: - * type: string - * responses: - * 200: - * description: Joined game - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Game' - */ - -// Admin endpoints (examples) -/** - * @swagger - * /api/admin/users: - * get: - * tags: [Admin - Users] - * summary: Get all users (Admin) - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: Users retrieved - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/User' - */ - -/** - * @swagger - * /api/admin/decks: - * get: - * tags: [Admin - Decks] - * summary: Get all decks (Admin) - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: Decks retrieved - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Deck' - */ - -/** - * @swagger - * /api/admin/organizations: - * get: - * tags: [Admin - Organizations] - * summary: Get all organizations (Admin) - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: Organizations retrieved - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Organization' - */ - -/** - * @swagger - * /api/admin/contacts: - * get: - * tags: [Admin - Contacts] - * summary: Get all contact messages (Admin) - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: Contacts retrieved - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Contact' - */ - -/** - * @swagger - * /api/admin/chats: - * get: - * tags: [Admin - Chats] - * summary: Get all chats (Admin) - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: Chats retrieved - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Chat' - */ - -/** - * @swagger - * /api/admin/games: - * get: - * tags: [Admin - Games] - * summary: Get all games (Admin) - * security: - * - bearerAuth: [] - * responses: - * 200: - * description: Games retrieved - * content: - * application/json: - * schema: - * type: array - * items: - * $ref: '#/components/schemas/Game' - */ - -/** - * @swagger - * /api/contacts: - * post: - * tags: [Contacts] - * summary: Create contact - * description: Create a new contact message - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - name - * - email - * - type - * - txt - * properties: - * name: - * type: string - * email: - * type: string - * format: email - * type: - * type: integer - * enum: [0, 1, 2] - * description: 0=QUESTION, 1=BUG_REPORT, 2=SUGGESTION - * txt: - * type: string - * responses: - * 201: - * description: Contact created successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Contact' - */ - -/** - * @swagger - * /api/deck-import-export/export/{deckId}: - * get: - * tags: [Deck Import/Export] - * summary: Export deck - * description: Export a deck as JSON or .spr file - * security: - * - bearerAuth: [] - * parameters: - * - name: deckId - * in: path - * required: true - * schema: - * type: string - * - name: format - * in: query - * schema: - * type: string - * enum: [json, spr] - * default: json - * responses: - * 200: - * description: Deck exported successfully - * content: - * application/json: - * schema: - * type: object - * application/octet-stream: - * schema: - * type: string - * format: binary - */ - -/** - * @swagger - * /api/deck-import-export/import: - * post: - * tags: [Deck Import/Export] - * summary: Import deck - * description: Import a deck from JSON or .spr file - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * multipart/form-data: - * schema: - * type: object - * properties: - * file: - * type: string - * format: binary - * responses: - * 201: - * description: Deck imported successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Deck' - */ - -/** - * @swagger - * /api/games/start: - * post: - * summary: Start a new game - * tags: [Games] - * security: - * - bearerAuth: [] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - deckids - * - maxplayers - * - logintype - * properties: - * deckids: - * type: array - * items: - * type: string - * description: Array of deck IDs (must include all 3 types LUCK, JOKER, QUESTION) - * maxplayers: - * type: integer - * minimum: 2 - * maximum: 8 - * description: Maximum number of players allowed in the game - * logintype: - * type: integer - * enum: [0, 1, 2] - * description: How players can join (PUBLIC=0, PRIVATE=1, ORGANIZATION=2) - * responses: - * 200: - * description: Game started successfully - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Game' - * 400: - * description: Invalid input parameters - * 401: - * description: Authentication required - * 500: - * description: Internal server error - */ - -/** - * @swagger - * /api/games/join: - * post: - * summary: Join a game (automatically detects game type) - * description: Join any game by providing the game code. The system automatically determines if authentication is required based on the game type. - * tags: [Games] - * requestBody: - * required: true - * content: - * application/json: - * schema: - * type: object - * required: - * - gameCode - * properties: - * gameCode: - * type: string - * description: 6-character game code - * example: "ABC123" - * playerName: - * type: string - * description: Display name for the player (required for public games, optional for authenticated games) - * example: "John Doe" - * responses: - * 200: - * description: Successfully joined the game - * content: - * application/json: - * schema: - * $ref: '#/components/schemas/Game' - * 400: - * description: Invalid input or missing required fields - * 401: - * description: Authentication required for this game type - * 403: - * description: Organization membership required - * 404: - * description: Game not found - * 409: - * description: Game is full or not accepting players - * 500: - * description: Internal server error - */ - -/** - * @swagger - * /api/games/{gameId}/start: - * post: - * summary: Start gameplay for an existing game - * description: Initialize gameplay by setting all player positions to 0 and assigning random turn order. This is separate from game creation. - * tags: [Games] - * parameters: - * - in: path - * name: gameId - * required: true - * schema: - * type: string - * description: The ID of the game to start - * responses: - * 200: - * description: Game started successfully - * content: - * application/json: - * schema: - * type: object - * properties: - * message: - * type: string - * example: "Game started successfully" - * gameId: - * type: string - * example: "game123" - * playerCount: - * type: number - * example: 4 - * 400: - * description: Invalid input or game cannot be started - * 401: - * description: Authentication required - * 403: - * description: Only game master can start the game - * 404: - * description: Game not found - * 409: - * description: Game already started or not ready to start - * 500: - * description: Internal server error - */ - -export {}; \ No newline at end of file diff --git a/SerpentRace_Backend/src/Api/swagger/swaggerUiSetup.ts b/SerpentRace_Backend/src/Api/swagger/swaggerUiSetup.ts deleted file mode 100644 index f474fe87..00000000 --- a/SerpentRace_Backend/src/Api/swagger/swaggerUiSetup.ts +++ /dev/null @@ -1,7 +0,0 @@ -import express from 'express'; -import swaggerUi from 'swagger-ui-express'; -import { swaggerSpec } from './swaggerConfig'; - -export function setupSwagger(app: express.Application) { - app.use('/api-docs', swaggerUi.serve, swaggerUi.setup(swaggerSpec)); -} diff --git a/SerpentRace_Backend/src/Application/Chat/commands/ChatArchiveCommandHandlers.ts b/SerpentRace_Backend/src/Application/Chat/commands/ChatArchiveCommandHandlers.ts deleted file mode 100644 index c9456564..00000000 --- a/SerpentRace_Backend/src/Application/Chat/commands/ChatArchiveCommandHandlers.ts +++ /dev/null @@ -1,69 +0,0 @@ -import { ArchiveChatCommand, RestoreChatCommand } from './ChatCommands'; -import { IChatRepository } from '../../../Domain/IRepository/IChatRepository'; -import { ChatType } from '../../../Domain/Chat/ChatAggregate'; -import { logAuth, logError, logWarning } from '../../Services/Logger'; - -export class ArchiveChatCommandHandler { - constructor(private chatRepository: IChatRepository) {} - - async execute(command: ArchiveChatCommand): Promise { - try { - const chat = await this.chatRepository.findById(command.chatId); - if (!chat) { - throw new Error('Chat not found'); - } - - await this.chatRepository.archiveChat(chat); - - logAuth('Chat archived manually', undefined, { - chatId: command.chatId, - chatType: chat.type, - messageCount: chat.messages.length - }); - - return true; - - } catch (error) { - logError('ArchiveChatCommandHandler error', error as Error); - return false; - } - } -} - -export class RestoreChatCommandHandler { - constructor(private chatRepository: IChatRepository) {} - - async execute(command: RestoreChatCommand): Promise { - try { - const archive = await this.chatRepository.getArchivedChat(command.chatId); - if (!archive) { - throw new Error('Archived chat not found'); - } - - // Game chats cannot be restored, only viewed - if (archive.chatType === ChatType.GAME) { - logWarning('Attempt to restore game chat blocked', { - chatId: command.chatId, - chatType: archive.chatType - }); - return false; - } - - const restoredChat = await this.chatRepository.restoreFromArchive(command.chatId); - if (!restoredChat) { - throw new Error('Failed to restore chat from archive'); - } - - logAuth('Chat restored from archive', undefined, { - chatId: command.chatId, - messageCount: archive.archivedMessages.length - }); - - return true; - - } catch (error) { - logError('RestoreChatCommandHandler error', error as Error); - return false; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Chat/commands/ChatCommands.ts b/SerpentRace_Backend/src/Application/Chat/commands/ChatCommands.ts deleted file mode 100644 index 41d2bb47..00000000 --- a/SerpentRace_Backend/src/Application/Chat/commands/ChatCommands.ts +++ /dev/null @@ -1,21 +0,0 @@ -export interface CreateChatCommand { - type: 'direct' | 'group' | 'game'; - name?: string; - gameId?: string; - createdBy: string; - userIds: string[]; -} - -export interface SendMessageCommand { - chatId: string; - userId: string; - message: string; -} - -export interface ArchiveChatCommand { - chatId: string; -} - -export interface RestoreChatCommand { - chatId: string; -} diff --git a/SerpentRace_Backend/src/Application/Chat/commands/CreateChatCommandHandler.ts b/SerpentRace_Backend/src/Application/Chat/commands/CreateChatCommandHandler.ts deleted file mode 100644 index d007c28b..00000000 --- a/SerpentRace_Backend/src/Application/Chat/commands/CreateChatCommandHandler.ts +++ /dev/null @@ -1,85 +0,0 @@ -import { CreateChatCommand } from './ChatCommands'; -import { IChatRepository } from '../../../Domain/IRepository/IChatRepository'; -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { ChatType, ChatAggregate } from '../../../Domain/Chat/ChatAggregate'; -import { UserState } from '../../../Domain/User/UserAggregate'; -import { logAuth, logError } from '../../Services/Logger'; - -export class CreateChatCommandHandler { - constructor( - private chatRepository: IChatRepository, - private userRepository: IUserRepository - ) {} - - async execute(command: CreateChatCommand): Promise { - try { - // Validate creator exists - const creator = await this.userRepository.findById(command.createdBy); - if (!creator) { - throw new Error('Creator not found'); - } - - // For group chats, check if creator is premium - if (command.type === 'group' && creator.state !== UserState.VERIFIED_PREMIUM) { - throw new Error('Premium subscription required to create groups'); - } - - // Validate all target users exist - const targetUsers = await Promise.all( - command.userIds.map(id => this.userRepository.findById(id)) - ); - - if (targetUsers.some(user => !user)) { - throw new Error('One or more target users not found'); - } - - // For direct chats, check if already exists - if (command.type === 'direct' && command.userIds.length === 1) { - const existingChats = await this.chatRepository.findByUserId(command.createdBy); - const existingDirectChat = existingChats.find(chat => - chat.type === ChatType.DIRECT && - chat.users.length === 2 && - chat.users.includes(command.userIds[0]) - ); - - if (existingDirectChat) { - return existingDirectChat; - } - } - - // For game chats, check if already exists - if (command.type === 'game' && command.gameId) { - const existingGameChat = await this.chatRepository.findByGameId(command.gameId); - if (existingGameChat) { - return existingGameChat; - } - } - - // Create chat - const chatData: Partial = { - type: command.type as any, - name: command.name, - gameId: command.gameId, - createdBy: command.createdBy, - users: [command.createdBy, ...command.userIds], - messages: [], - lastActivity: new Date() - }; - - const chat = await this.chatRepository.create(chatData); - - logAuth('Chat created successfully', command.createdBy, { - chatId: chat.id, - chatType: command.type, - participantCount: chat.users.length, - gameId: command.gameId - }); - - return chat; - - } catch (error) { - logError('CreateChatCommandHandler error', error as Error); - return null; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Chat/commands/SendMessageCommandHandler.ts b/SerpentRace_Backend/src/Application/Chat/commands/SendMessageCommandHandler.ts deleted file mode 100644 index 8bd6903a..00000000 --- a/SerpentRace_Backend/src/Application/Chat/commands/SendMessageCommandHandler.ts +++ /dev/null @@ -1,84 +0,0 @@ -import { SendMessageCommand } from './ChatCommands'; -import { IChatRepository } from '../../../Domain/IRepository/IChatRepository'; -import { Message } from '../../../Domain/Chat/ChatAggregate'; -import { logAuth, logError } from '../../Services/Logger'; -import { v4 as uuidv4 } from 'uuid'; - -export class SendMessageCommandHandler { - constructor(private chatRepository: IChatRepository) {} - - async execute(command: SendMessageCommand): Promise { - try { - // Validate message is non-empty string - if (typeof command.message !== 'string' || !command.message.trim()) { - throw new Error('Message must be a non-empty string'); - } - - const chat = await this.chatRepository.findById(command.chatId); - if (!chat) { - throw new Error('Chat not found'); - } - - // Check if user is member of this chat - if (!chat.users.includes(command.userId)) { - throw new Error('User is not a member of this chat'); - } - - // Create message - const message: Message = { - id: uuidv4(), - date: new Date(), - userid: command.userId, - text: command.message.trim() - }; - - // Manage message history (keep last 10 per user, up to 2 weeks) - let updatedMessages = [...chat.messages, message]; - updatedMessages = this.pruneMessages(updatedMessages); - - // Update chat - await this.chatRepository.update(command.chatId, { - messages: updatedMessages, - lastActivity: new Date() - }); - - logAuth('Message sent successfully', command.userId, { - chatId: command.chatId, - messageLength: command.message.length, - totalMessages: updatedMessages.length - }); - - return message; - - } catch (error) { - logError('SendMessageCommandHandler error', error as Error); - return null; - } - } - - private pruneMessages(messages: Message[]): Message[] { - const twoWeeksAgo = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000); - - // Remove messages older than 2 weeks - let prunedMessages = messages.filter(msg => new Date(msg.date) > twoWeeksAgo); - - // Group by user and keep last 10 messages per user - const messagesByUser = new Map(); - prunedMessages.forEach(msg => { - if (!messagesByUser.has(msg.userid)) { - messagesByUser.set(msg.userid, []); - } - messagesByUser.get(msg.userid)!.push(msg); - }); - - // Keep only last 10 messages per user - const finalMessages: Message[] = []; - messagesByUser.forEach((userMessages, userId) => { - const last10 = userMessages.slice(-10); - finalMessages.push(...last10); - }); - - // Sort by date - return finalMessages.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); - } -} diff --git a/SerpentRace_Backend/src/Application/Chat/commands/SoftDeleteCommandHandlers.ts b/SerpentRace_Backend/src/Application/Chat/commands/SoftDeleteCommandHandlers.ts deleted file mode 100644 index e69de29b..00000000 diff --git a/SerpentRace_Backend/src/Application/Chat/queries/ChatHistoryQueryHandlers.ts b/SerpentRace_Backend/src/Application/Chat/queries/ChatHistoryQueryHandlers.ts deleted file mode 100644 index 5f215037..00000000 --- a/SerpentRace_Backend/src/Application/Chat/queries/ChatHistoryQueryHandlers.ts +++ /dev/null @@ -1,141 +0,0 @@ -import { GetChatHistoryQuery, GetArchivedChatsQuery } from './ChatQueries'; -import { IChatRepository } from '../../../Domain/IRepository/IChatRepository'; -import { IChatArchiveRepository } from '../../../Domain/IRepository/IChatArchiveRepository'; -import { Message } from '../../../Domain/Chat/ChatAggregate'; -import { logAuth, logError, logWarning } from '../../Services/Logger'; - -interface ChatHistoryResult { - chatId: string; - messages: Message[]; - isArchived: boolean; - chatInfo: { - type: string; - name: string | null; - gameId: string | null; - users: string[]; - }; -} - -export class GetChatHistoryQueryHandler { - constructor( - private chatRepository: IChatRepository, - private chatArchiveRepository: IChatArchiveRepository - ) {} - - async execute(query: GetChatHistoryQuery): Promise { - try { - // First try to find active chat - const chat = await this.chatRepository.findById(query.chatId); - - if (chat) { - // Check authorization - if (!chat.users.includes(query.userId)) { - logWarning('Unauthorized chat history access attempt', { - chatId: query.chatId, - userId: query.userId - }); - return null; - } - - logAuth('Chat history retrieved', query.userId, { - chatId: query.chatId, - messageCount: chat.messages.length, - isArchived: false - }); - - return { - chatId: query.chatId, - messages: chat.messages, - isArchived: false, - chatInfo: { - type: chat.type, - name: chat.name, - gameId: chat.gameId, - users: chat.users - } - }; - } - - // Try to find in archives - const archives = await this.chatArchiveRepository.findByChatId(query.chatId); - const userArchive = archives.find(archive => - archive.participants.includes(query.userId) - ); - - if (userArchive) { - logAuth('Archived chat history retrieved', query.userId, { - chatId: query.chatId, - messageCount: userArchive.archivedMessages.length, - isArchived: true - }); - - return { - chatId: query.chatId, - messages: userArchive.archivedMessages, - isArchived: true, - chatInfo: { - type: userArchive.chatType, - name: userArchive.chatName, - gameId: userArchive.gameId, - users: userArchive.participants - } - }; - } - - logWarning('Chat history not found', { - chatId: query.chatId, - userId: query.userId - }); - - return null; - - } catch (error) { - logError('GetChatHistoryQueryHandler error', error as Error); - return null; - } - } -} - -export class GetArchivedChatsQueryHandler { - constructor(private chatArchiveRepository: IChatArchiveRepository) {} - - async execute(query: GetArchivedChatsQuery): Promise { - try { - let archives: any[] = []; - - if (query.gameId) { - // Get archived game chats - archives = await this.chatArchiveRepository.findByGameId(query.gameId); - } else { - // Get all archived chats for user (would need different query) - // For now, return empty - this would need a new repository method - archives = []; - } - - const result = archives - .filter(archive => archive.participants.includes(query.userId)) - .map(archive => ({ - chatId: archive.chatId, - messages: archive.archivedMessages, - isArchived: true, - chatInfo: { - type: archive.chatType, - name: archive.chatName, - gameId: archive.gameId, - users: archive.participants - } - })); - - logAuth('Archived chats retrieved', query.userId, { - count: result.length, - gameId: query.gameId - }); - - return result; - - } catch (error) { - logError('GetArchivedChatsQueryHandler error', error as Error); - return []; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Chat/queries/ChatQueries.ts b/SerpentRace_Backend/src/Application/Chat/queries/ChatQueries.ts deleted file mode 100644 index 69e0b36c..00000000 --- a/SerpentRace_Backend/src/Application/Chat/queries/ChatQueries.ts +++ /dev/null @@ -1,14 +0,0 @@ -export interface GetUserChatsQuery { - userId: string; - includeArchived?: boolean; -} - -export interface GetChatHistoryQuery { - chatId: string; - userId: string; // For authorization -} - -export interface GetArchivedChatsQuery { - userId: string; - gameId?: string; -} diff --git a/SerpentRace_Backend/src/Application/Chat/queries/GetChatsByPageQuery.ts b/SerpentRace_Backend/src/Application/Chat/queries/GetChatsByPageQuery.ts deleted file mode 100644 index 18fc595d..00000000 --- a/SerpentRace_Backend/src/Application/Chat/queries/GetChatsByPageQuery.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface GetChatsByPageQuery { - from: number; - to: number; - includeDeleted?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/Chat/queries/GetChatsByPageQueryHandler.ts b/SerpentRace_Backend/src/Application/Chat/queries/GetChatsByPageQueryHandler.ts deleted file mode 100644 index fbafa33c..00000000 --- a/SerpentRace_Backend/src/Application/Chat/queries/GetChatsByPageQueryHandler.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { IChatRepository } from '../../../Domain/IRepository/IChatRepository'; -import { GetChatsByPageQuery } from './GetChatsByPageQuery'; -import { ShortChatDto } from '../../DTOs/ChatDto'; -import { ChatMapper } from '../../DTOs/Mappers/ChatMapper'; -import { logRequest, logError } from '../../Services/Logger'; - -export class GetChatsByPageQueryHandler { - constructor(private readonly chatRepo: IChatRepository) {} - - async execute(query: GetChatsByPageQuery): Promise<{ chats: ShortChatDto[], totalCount: number }> { - try { - // Validate pagination parameters - if (query.from < 0 || query.to < query.from) { - throw new Error('Invalid pagination parameters'); - } - - const limit = query.to - query.from + 1; - if (limit > 100) { - throw new Error('Page size too large. Maximum 100 records per request'); - } - - logRequest('Get chats by page query started', undefined, undefined, { - from: query.from, - to: query.to, - includeDeleted: query.includeDeleted || false - }); - - const result = query.includeDeleted - ? await this.chatRepo.findByPageIncludingDeleted(query.from, query.to) - : await this.chatRepo.findByPage(query.from, query.to); - - logRequest('Get chats by page query completed', undefined, undefined, { - from: query.from, - to: query.to, - returned: result.chats.length, - totalCount: result.totalCount, - includeDeleted: query.includeDeleted || false - }); - - return { - chats: ChatMapper.toShortDtoList(result.chats), - totalCount: result.totalCount - }; - } catch (error) { - logError('GetChatsByPageQueryHandler error', error instanceof Error ? error : new Error(String(error))); - - // Re-throw validation errors as-is - if (error instanceof Error && (error.message.includes('Invalid pagination') || error.message.includes('Page size'))) { - throw error; - } - - throw new Error('Failed to retrieve chats page'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Chat/queries/GetUserChatsQueryHandler.ts b/SerpentRace_Backend/src/Application/Chat/queries/GetUserChatsQueryHandler.ts deleted file mode 100644 index abb6fad0..00000000 --- a/SerpentRace_Backend/src/Application/Chat/queries/GetUserChatsQueryHandler.ts +++ /dev/null @@ -1,97 +0,0 @@ -import { GetUserChatsQuery } from './ChatQueries'; -import { IChatRepository } from '../../../Domain/IRepository/IChatRepository'; -import { IChatArchiveRepository } from '../../../Domain/IRepository/IChatArchiveRepository'; -import { ChatAggregate } from '../../../Domain/Chat/ChatAggregate'; -import { ChatArchiveAggregate } from '../../../Domain/Chat/ChatArchiveAggregate'; -import { logAuth, logError } from '../../Services/Logger'; - -interface ChatWithMetadata { - id: string; - type: string; - name: string | null; - gameId: string | null; - users: string[]; - lastActivity: Date | null; - isArchived: boolean; - messageCount: number; - unreadCount?: number; -} - -export class GetUserChatsQueryHandler { - constructor( - private chatRepository: IChatRepository, - private chatArchiveRepository: IChatArchiveRepository - ) {} - - async execute(query: GetUserChatsQuery): Promise { - try { - const result: ChatWithMetadata[] = []; - - // Get active chats - const activeChats = await this.chatRepository.findActiveChatsForUser(query.userId); - result.push(...activeChats.map(chat => ({ - id: chat.id, - type: chat.type, - name: chat.name, - gameId: chat.gameId, - users: chat.users, - lastActivity: chat.lastActivity, - isArchived: false, - messageCount: chat.messages.length, - unreadCount: this.calculateUnreadMessages(chat, query.userId) - }))); - - // Get archived chats if requested - if (query.includeArchived) { - const userActiveChats = await this.chatRepository.findByUserId(query.userId); - const archivedChatIds = userActiveChats - .filter(chat => chat.archiveDate !== null) - .map(chat => chat.id); - - const archives = await Promise.all( - archivedChatIds.map(id => this.chatArchiveRepository.findByChatId(id)) - ); - - archives.forEach(archiveArray => { - archiveArray.forEach(archive => { - if (archive.participants.includes(query.userId)) { - result.push({ - id: archive.chatId, - type: archive.chatType, - name: archive.chatName, - gameId: archive.gameId, - users: archive.participants, - lastActivity: archive.archivedAt, - isArchived: true, - messageCount: archive.archivedMessages.length, - unreadCount: 0 // Archived chats have no unread messages - }); - } - }); - }); - } - - logAuth('User chats retrieved', query.userId, { - activeCount: activeChats.length, - totalCount: result.length, - includeArchived: query.includeArchived - }); - - return result.sort((a, b) => { - if (!a.lastActivity) return 1; - if (!b.lastActivity) return -1; - return new Date(b.lastActivity).getTime() - new Date(a.lastActivity).getTime(); - }); - - } catch (error) { - logError('GetUserChatsQueryHandler error', error as Error); - return []; - } - } - - private calculateUnreadMessages(chat: ChatAggregate, userId: string): number { - // Simple implementation - count messages from other users - // In production, you'd store lastSeen timestamp per user per chat - return chat.messages.filter(msg => msg.userid !== userId).length; - } -} diff --git a/SerpentRace_Backend/src/Application/Contact/commands/CreateContactCommand.ts b/SerpentRace_Backend/src/Application/Contact/commands/CreateContactCommand.ts deleted file mode 100644 index 54ceeee5..00000000 --- a/SerpentRace_Backend/src/Application/Contact/commands/CreateContactCommand.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { ContactType } from '../../../Domain/Contact/ContactAggregate'; - -export interface CreateContactCommand { - name: string; - email: string; - userid?: string; - type: ContactType; - txt: string; -} diff --git a/SerpentRace_Backend/src/Application/Contact/commands/CreateContactCommandHandler.ts b/SerpentRace_Backend/src/Application/Contact/commands/CreateContactCommandHandler.ts deleted file mode 100644 index ddc2a40b..00000000 --- a/SerpentRace_Backend/src/Application/Contact/commands/CreateContactCommandHandler.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { IContactRepository } from '../../../Domain/IRepository/IContactRepository'; -import { CreateContactCommand } from './CreateContactCommand'; -import { ShortContactDto } from '../../DTOs/ContactDto'; -import { ContactAggregate, ContactState } from '../../../Domain/Contact/ContactAggregate'; -import { ContactMapper } from '../../DTOs/Mappers/ContactMapper'; - -export class CreateContactCommandHandler { - constructor(private readonly contactRepo: IContactRepository) {} - - async execute(cmd: CreateContactCommand): Promise { - try { - const contact = new ContactAggregate(); - contact.name = cmd.name; - contact.email = cmd.email; - contact.userid = cmd.userid || null; - contact.type = cmd.type; - contact.txt = cmd.txt; - contact.state = ContactState.ACTIVE; - - const created = await this.contactRepo.create(contact); - return ContactMapper.toShortDto(created); - } catch (error) { - throw new Error('Failed to create contact'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Contact/commands/DeleteContactCommand.ts b/SerpentRace_Backend/src/Application/Contact/commands/DeleteContactCommand.ts deleted file mode 100644 index 99b1e0b7..00000000 --- a/SerpentRace_Backend/src/Application/Contact/commands/DeleteContactCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DeleteContactCommand { - id: string; - hard?: boolean; // true for permanent delete, false/undefined for soft delete -} diff --git a/SerpentRace_Backend/src/Application/Contact/commands/DeleteContactCommandHandler.ts b/SerpentRace_Backend/src/Application/Contact/commands/DeleteContactCommandHandler.ts deleted file mode 100644 index c2a3f9f9..00000000 --- a/SerpentRace_Backend/src/Application/Contact/commands/DeleteContactCommandHandler.ts +++ /dev/null @@ -1,42 +0,0 @@ -import { IContactRepository } from '../../../Domain/IRepository/IContactRepository'; -import { DeleteContactCommand } from './DeleteContactCommand'; -import { AdminAuditService } from '../../Services/AdminBypassService'; -import { logRequest } from '../../Services/Logger'; - -export class DeleteContactCommandHandler { - constructor(private readonly contactRepo: IContactRepository) {} - - async execute(cmd: DeleteContactCommand): Promise { - try { - const existingContact = await this.contactRepo.findById(cmd.id); - if (!existingContact) { - throw new Error('Contact not found'); - } - - if (cmd.hard) { - // Permanent delete - await this.contactRepo.delete(cmd.id); - logRequest('Contact hard deleted', undefined, undefined, { - contactId: cmd.id, - contactEmail: existingContact.email, - deleteType: 'hard' - }); - } else { - // Soft delete (default) - await this.contactRepo.softDelete(cmd.id); - logRequest('Contact soft deleted', undefined, undefined, { - contactId: cmd.id, - contactEmail: existingContact.email, - deleteType: 'soft' - }); - } - - return true; - } catch (error) { - if (error instanceof Error && error.message === 'Contact not found') { - throw error; - } - throw new Error('Failed to delete contact'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Contact/commands/UpdateContactCommand.ts b/SerpentRace_Backend/src/Application/Contact/commands/UpdateContactCommand.ts deleted file mode 100644 index 6d66e809..00000000 --- a/SerpentRace_Backend/src/Application/Contact/commands/UpdateContactCommand.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface UpdateContactCommand { - id: string; - adminResponse?: string; - state?: number; - respondedBy?: string; -} diff --git a/SerpentRace_Backend/src/Application/Contact/commands/UpdateContactCommandHandler.ts b/SerpentRace_Backend/src/Application/Contact/commands/UpdateContactCommandHandler.ts deleted file mode 100644 index e25ec319..00000000 --- a/SerpentRace_Backend/src/Application/Contact/commands/UpdateContactCommandHandler.ts +++ /dev/null @@ -1,45 +0,0 @@ -import { IContactRepository } from '../../../Domain/IRepository/IContactRepository'; -import { UpdateContactCommand } from './UpdateContactCommand'; -import { DetailContactDto } from '../../DTOs/ContactDto'; -import { ContactMapper } from '../../DTOs/Mappers/ContactMapper'; -import { ContactState } from '../../../Domain/Contact/ContactAggregate'; - -export class UpdateContactCommandHandler { - constructor(private readonly contactRepo: IContactRepository) {} - - async execute(cmd: UpdateContactCommand): Promise { - try { - const existingContact = await this.contactRepo.findById(cmd.id); - if (!existingContact) { - throw new Error('Contact not found'); - } - - const updateData: any = {}; - - if (cmd.adminResponse !== undefined) { - updateData.adminResponse = cmd.adminResponse; - updateData.responseDate = new Date(); - } - - if (cmd.state !== undefined) { - updateData.state = cmd.state; - } - - if (cmd.respondedBy !== undefined) { - updateData.respondedBy = cmd.respondedBy; - } - - const updated = await this.contactRepo.update(cmd.id, updateData); - if (!updated) { - throw new Error('Failed to update contact'); - } - - return ContactMapper.toDetailDto(updated); - } catch (error) { - if (error instanceof Error && error.message === 'Contact not found') { - throw error; - } - throw new Error('Failed to update contact'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Contact/queries/GetContactByIdQuery.ts b/SerpentRace_Backend/src/Application/Contact/queries/GetContactByIdQuery.ts deleted file mode 100644 index f8686379..00000000 --- a/SerpentRace_Backend/src/Application/Contact/queries/GetContactByIdQuery.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface GetContactByIdQuery { - id: string; -} diff --git a/SerpentRace_Backend/src/Application/Contact/queries/GetContactByIdQueryHandler.ts b/SerpentRace_Backend/src/Application/Contact/queries/GetContactByIdQueryHandler.ts deleted file mode 100644 index d20f3c7a..00000000 --- a/SerpentRace_Backend/src/Application/Contact/queries/GetContactByIdQueryHandler.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IContactRepository } from '../../../Domain/IRepository/IContactRepository'; -import { GetContactByIdQuery } from './GetContactByIdQuery'; -import { DetailContactDto } from '../../DTOs/ContactDto'; -import { ContactMapper } from '../../DTOs/Mappers/ContactMapper'; - -export class GetContactByIdQueryHandler { - constructor(private readonly contactRepo: IContactRepository) {} - - async execute(query: GetContactByIdQuery): Promise { - const contact = await this.contactRepo.findById(query.id); - if (!contact) { - return null; - } - return ContactMapper.toDetailDto(contact); - } -} diff --git a/SerpentRace_Backend/src/Application/Contact/queries/GetContactsByPageQuery.ts b/SerpentRace_Backend/src/Application/Contact/queries/GetContactsByPageQuery.ts deleted file mode 100644 index cc5850ab..00000000 --- a/SerpentRace_Backend/src/Application/Contact/queries/GetContactsByPageQuery.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface GetContactsByPageQuery { - from: number; - to: number; -} diff --git a/SerpentRace_Backend/src/Application/Contact/queries/GetContactsByPageQueryHandler.ts b/SerpentRace_Backend/src/Application/Contact/queries/GetContactsByPageQueryHandler.ts deleted file mode 100644 index e39234df..00000000 --- a/SerpentRace_Backend/src/Application/Contact/queries/GetContactsByPageQueryHandler.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { IContactRepository } from '../../../Domain/IRepository/IContactRepository'; -import { GetContactsByPageQuery } from './GetContactsByPageQuery'; -import { ContactPageDto } from '../../DTOs/ContactDto'; -import { ContactMapper } from '../../DTOs/Mappers/ContactMapper'; - -export class GetContactsByPageQueryHandler { - constructor(private readonly contactRepo: IContactRepository) {} - - async execute(query: GetContactsByPageQuery): Promise { - const result = await this.contactRepo.findByPage(query.from, query.to); - return { - contacts: ContactMapper.toShortDtoList(result.contacts), - totalCount: result.totalCount, - from: query.from, - to: query.to, - }; - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/ChatDto.ts b/SerpentRace_Backend/src/Application/DTOs/ChatDto.ts deleted file mode 100644 index f3f59bf3..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/ChatDto.ts +++ /dev/null @@ -1,26 +0,0 @@ -export interface CreateChatDto { - users: string[]; - messages: import('../../Domain/Chat/ChatAggregate').Message[]; - state?: number; -} - -export interface UpdateChatDto { - id: string; - users?: string[]; - messages?: import('../../Domain/Chat/ChatAggregate').Message[]; - state?: number; -} - -export interface ShortChatDto { - id: string; - userCount: number; - state: number; -} - -export interface DetailChatDto { - id: string; - users: string[]; - messages: import('../../Domain/Chat/ChatAggregate').Message[]; - updateDate: Date; - state: number; -} diff --git a/SerpentRace_Backend/src/Application/DTOs/ContactDto.ts b/SerpentRace_Backend/src/Application/DTOs/ContactDto.ts deleted file mode 100644 index 44100357..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/ContactDto.ts +++ /dev/null @@ -1,47 +0,0 @@ -import { ContactType } from '../../Domain/Contact/ContactAggregate'; - -export interface CreateContactDto { - name: string; - email: string; - userid?: string; - type: ContactType; - txt: string; -} - -export interface UpdateContactDto { - id: string; - adminResponse?: string; - state?: number; - respondedBy?: string; -} - -export interface ShortContactDto { - id: string; - name: string; - email: string; - type: ContactType; - createDate: Date; - state: number; -} - -export interface DetailContactDto { - id: string; - name: string; - email: string; - userid: string | null; - type: ContactType; - txt: string; - state: number; - createDate: Date; - updateDate: Date; - adminResponse: string | null; - responseDate: Date | null; - respondedBy: string | null; -} - -export interface ContactPageDto { - contacts: ShortContactDto[]; - totalCount: number; - from: number; - to: number; -} diff --git a/SerpentRace_Backend/src/Application/DTOs/DeckDto.ts b/SerpentRace_Backend/src/Application/DTOs/DeckDto.ts deleted file mode 100644 index 393ea2ed..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/DeckDto.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface CreateDeckDto { - name: string; - description?: string; -} - -export interface UpdateDeckDto { - id: string; - name?: string; - description?: string; -} - -export interface ShortDeckDto { - id: string; - name: string; - type: number; - playedNumber: number; - ctype: number; -} - -export interface DetailDeckDto { - id: string; - name: string; - type: number; - userid: string; - creationdate: Date; - cards: any[]; - playedNumber: number; - ctype: number; -} diff --git a/SerpentRace_Backend/src/Application/DTOs/GameDto.ts b/SerpentRace_Backend/src/Application/DTOs/GameDto.ts deleted file mode 100644 index 02bc0f61..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/GameDto.ts +++ /dev/null @@ -1,46 +0,0 @@ -import * as DeckAggregate from "../../Domain/Deck/DeckAggregate"; - -export interface GameStartDto { - gameid: string; - maxplayers: number; - logintype: number; - gamecode: string; - deck: gamedeck[]; -} - -enum decktype { - JOCKER = 0, - LUCK = 1, - QUEST = 2 -} - -export interface cards { - cardid: string; - question?: string; - answer?: string; - consequence?: DeckAggregate.Consequence | null; - played?: boolean; - playerid?: string; -} - -export interface gamedeck { - deckid: string; - decktype: decktype; - cards: cards[]; -} - -export interface GameDataDto { - id: string; - gamecode: string; - maxplayers: number; - logintype: number; - gamedecks: gamedeck[]; - players: string[]; - started: boolean; - finished: boolean; - winner?: string; - currentplayer?: string; - createdate: Date; - startdate?: Date; - enddate?: Date; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/DTOs/Mappers/BaseMapper.ts b/SerpentRace_Backend/src/Application/DTOs/Mappers/BaseMapper.ts deleted file mode 100644 index d11c5ea4..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/Mappers/BaseMapper.ts +++ /dev/null @@ -1,19 +0,0 @@ -export abstract class BaseMapper { - abstract toShortDto(entity: TEntity): TShortDto; - abstract toDetailDto(entity: TEntity): TDetailDto; - - toShortDtoList(entities: TEntity[]): TShortDto[] { - return entities.map(entity => this.toShortDto(entity)); - } - - toDetailDtoList(entities: TEntity[]): TDetailDto[] { - return entities.map(entity => this.toDetailDto(entity)); - } - - static toShortDtoListStatic( - entities: T[], - mapperFn: (entity: T) => TDto - ): TDto[] { - return entities.map(mapperFn); - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/Mappers/ChatMapper.ts b/SerpentRace_Backend/src/Application/DTOs/Mappers/ChatMapper.ts deleted file mode 100644 index 60507b2f..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/Mappers/ChatMapper.ts +++ /dev/null @@ -1,26 +0,0 @@ -import { ChatAggregate } from '../../../Domain/Chat/ChatAggregate'; -import { ShortChatDto, DetailChatDto } from '../ChatDto'; - -export class ChatMapper { - static toShortDto(chat: ChatAggregate): ShortChatDto { - return { - id: chat.id, - userCount: chat.users?.length ?? 0, - state: chat.state, - }; - } - - static toDetailDto(chat: ChatAggregate): DetailChatDto { - return { - id: chat.id, - users: chat.users ?? [], - messages: chat.messages, - updateDate: chat.updateDate, - state: chat.state, - }; - } - - static toShortDtoList(chats: ChatAggregate[]): ShortChatDto[] { - return chats.map(this.toShortDto); - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/Mappers/ContactMapper.ts b/SerpentRace_Backend/src/Application/DTOs/Mappers/ContactMapper.ts deleted file mode 100644 index b9a23ed1..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/Mappers/ContactMapper.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { ContactAggregate } from '../../../Domain/Contact/ContactAggregate'; -import { CreateContactDto, UpdateContactDto, ShortContactDto, DetailContactDto } from '../ContactDto'; - -export class ContactMapper { - static toShortDto(contact: ContactAggregate): ShortContactDto { - return { - id: contact.id, - name: contact.name, - email: contact.email, - type: contact.type, - createDate: contact.createDate, - state: contact.state, - }; - } - - static toDetailDto(contact: ContactAggregate): DetailContactDto { - return { - id: contact.id, - name: contact.name, - email: contact.email, - userid: contact.userid, - type: contact.type, - txt: contact.txt, - state: contact.state, - createDate: contact.createDate, - updateDate: contact.updateDate, - adminResponse: contact.adminResponse, - responseDate: contact.responseDate, - respondedBy: contact.respondedBy, - }; - } - - static toShortDtoList(contacts: ContactAggregate[]): ShortContactDto[] { - return contacts.map(this.toShortDto); - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/Mappers/DeckMapper.ts b/SerpentRace_Backend/src/Application/DTOs/Mappers/DeckMapper.ts deleted file mode 100644 index 2d7f486b..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/Mappers/DeckMapper.ts +++ /dev/null @@ -1,31 +0,0 @@ -import { DeckAggregate } from '../../../Domain/Deck/DeckAggregate'; -import { CreateDeckDto, UpdateDeckDto, ShortDeckDto, DetailDeckDto } from '../DeckDto'; - -export class DeckMapper { - static toShortDto(deck: DeckAggregate): ShortDeckDto { - return { - id: deck.id, - name: deck.name, - type: deck.type, - playedNumber: deck.playedNumber, - ctype: deck.ctype, - }; - } - - static toDetailDto(deck: DeckAggregate): DetailDeckDto { - return { - id: deck.id, - name: deck.name, - type: deck.type, - userid: deck.userid, - creationdate: deck.creationdate, - cards: deck.cards, - playedNumber: deck.playedNumber, - ctype: deck.ctype, - }; - } - - static toShortDtoList(decks: DeckAggregate[]): ShortDeckDto[] { - return decks.map(this.toShortDto); - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/Mappers/OrganizationMapper.ts b/SerpentRace_Backend/src/Application/DTOs/Mappers/OrganizationMapper.ts deleted file mode 100644 index 695b17ee..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/Mappers/OrganizationMapper.ts +++ /dev/null @@ -1,36 +0,0 @@ -import { OrganizationAggregate } from '../../../Domain/Organization/OrganizationAggregate'; -import { CreateOrganizationDto, UpdateOrganizationDto, ShortOrganizationDto, DetailOrganizationDto } from '../OrganizationDto'; - -export class OrganizationMapper { - static toShortDto(org: OrganizationAggregate): ShortOrganizationDto { - return { - id: org.id, - name: org.name, - state: org.state, - userinorg: org.userinorg, - maxOrganizationalDecks: org.maxOrganizationalDecks, - }; - } - - static toDetailDto(org: OrganizationAggregate): DetailOrganizationDto { - return { - id: org.id, - name: org.name, - contactfname: org.contactfname, - contactlname: org.contactlname, - contactphone: org.contactphone, - contactemail: org.contactemail, - state: org.state, - regdate: org.regdate, - updatedate: org.updatedate, - url: org.url, - userinorg: org.userinorg, - maxOrganizationalDecks: org.maxOrganizationalDecks, - users: org.users?.map(u => u.id) ?? [], - }; - } - - static toShortDtoList(orgs: OrganizationAggregate[]): ShortOrganizationDto[] { - return orgs.map(this.toShortDto); - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/Mappers/UserMapper.ts b/SerpentRace_Backend/src/Application/DTOs/Mappers/UserMapper.ts deleted file mode 100644 index 294022af..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/Mappers/UserMapper.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { UserAggregate, UserState } from '../../../Domain/User/UserAggregate'; -import { CreateUserDto, UpdateUserDto, ShortUserDto, DetailUserDto } from '../UserDto'; -import { BaseMapper } from './BaseMapper'; - -export class UserMapper { - static toShortDto(user: UserAggregate): ShortUserDto { - return { - id: user.id, - username: user.username, - state: user.state, - authLevel: (user.state === UserState.ADMIN ? 1 : 0) as 0 | 1, - }; - } - - static toDetailDto(user: UserAggregate): DetailUserDto { - return { - id: user.id, - orgid: user.orgid, - username: user.username, - email: user.email, - fname: user.fname, - lname: user.lname, - code: user.token, - phone: user.phone, - state: user.state, - }; - } - - static toShortDtoList(users: UserAggregate[]): ShortUserDto[] { - return BaseMapper.toShortDtoListStatic(users, UserMapper.toShortDto); - } -} diff --git a/SerpentRace_Backend/src/Application/DTOs/OrganizationDto.ts b/SerpentRace_Backend/src/Application/DTOs/OrganizationDto.ts deleted file mode 100644 index e82c27f6..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/OrganizationDto.ts +++ /dev/null @@ -1,48 +0,0 @@ -export interface CreateOrganizationDto { - name: string; - description?: string; - maxOrganizationalDecks?: number | null; -} - -export interface UpdateOrganizationDto { - id: string; - name?: string; - description?: string; -} - -export interface ShortOrganizationDto { - id: string; - name: string; - state: number; - userinorg: number; - maxOrganizationalDecks?: number | null; -} - -export interface DetailOrganizationDto { - id: string; - name: string; - contactfname: string; - contactlname: string; - contactphone: string; - contactemail: string; - state: number; - regdate: Date; - updatedate: Date; - url: string | null; - userinorg: number; - maxOrganizationalDecks: number | null; - users: string[]; -} - -export interface OrganizationLoginUrlDto { - organizationId: string; - organizationName: string; - loginUrl: string; -} - -export interface OrganizationAuthCallbackDto { - organizationId: string; - userId: string; - status: 'ok' | 'not_ok'; - authToken?: string; -} diff --git a/SerpentRace_Backend/src/Application/DTOs/SearchDto.ts b/SerpentRace_Backend/src/Application/DTOs/SearchDto.ts deleted file mode 100644 index acb616d8..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/SearchDto.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface SearchQuery { - query: string; - limit?: number; - offset?: number; -} - -export interface SearchResult { - results: T[]; - totalCount: number; - hasMore: boolean; - searchQuery: string; - searchType: 'users' | 'organizations' | 'decks'; -} diff --git a/SerpentRace_Backend/src/Application/DTOs/UserDto.ts b/SerpentRace_Backend/src/Application/DTOs/UserDto.ts deleted file mode 100644 index 0bcd58a0..00000000 --- a/SerpentRace_Backend/src/Application/DTOs/UserDto.ts +++ /dev/null @@ -1,29 +0,0 @@ -export interface CreateUserDto { - username: string; - email: string; -} - -export interface UpdateUserDto { - id: string; - username?: string; - email?: string; -} - -export interface ShortUserDto { - id: string; - username: string; - state: number; - authLevel: 0 | 1; -} - -export interface DetailUserDto { - id: string; - orgid: string | null; - username: string; - email: string; - fname: string; - lname: string; - code: string | null; - phone: string | null; - state: number; -} diff --git a/SerpentRace_Backend/src/Application/Deck/commands/CreateDeckCommand.ts b/SerpentRace_Backend/src/Application/Deck/commands/CreateDeckCommand.ts deleted file mode 100644 index 9e4ec5ad..00000000 --- a/SerpentRace_Backend/src/Application/Deck/commands/CreateDeckCommand.ts +++ /dev/null @@ -1,7 +0,0 @@ -export interface CreateDeckCommand { - name: string; - type: number; - userid: string; - cards: any[]; - ctype?: number; -} diff --git a/SerpentRace_Backend/src/Application/Deck/commands/CreateDeckCommandHandler.ts b/SerpentRace_Backend/src/Application/Deck/commands/CreateDeckCommandHandler.ts deleted file mode 100644 index c6c75d2f..00000000 --- a/SerpentRace_Backend/src/Application/Deck/commands/CreateDeckCommandHandler.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository'; -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { CreateDeckCommand } from './CreateDeckCommand'; -import { ShortDeckDto } from '../../DTOs/DeckDto'; -import { DeckAggregate, State, CType } from '../../../Domain/Deck/DeckAggregate'; -import { UserState } from '../../../Domain/User/UserAggregate'; -import { DeckMapper } from '../../DTOs/Mappers/DeckMapper'; -import { AdminBypassService } from '../../Services/AdminBypassService'; -import { logRequest } from '../../Services/Logger'; - -export class CreateDeckCommandHandler { - constructor( - private readonly deckRepo: IDeckRepository, - private readonly userRepo: IUserRepository, - private readonly orgRepo: IOrganizationRepository - ) {} - - async execute(cmd: CreateDeckCommand): Promise { - try { - // 1. Get user details - const user = await this.userRepo.findById(cmd.userid); - if (!user) { - throw new Error('User not found'); - } - - // 2. ADMIN BYPASS - Skip all restrictions - if (AdminBypassService.shouldBypassRestrictions(user.state)) { - AdminBypassService.logAdminBypass( - 'CREATE_DECK_BYPASS', - user.id, - 'new-deck', - { - deckName: cmd.name, - deckType: cmd.type, - cardCount: cmd.cards.length, - ctype: cmd.ctype - } - ); - return this.createDeck(cmd); - } - - // 3. Check deck count limits for regular users - const userDeckCount = await this.deckRepo.countActiveByUserId(cmd.userid); - const maxDecks = user.state === UserState.VERIFIED_PREMIUM ? 12 : 8; - - if (userDeckCount >= maxDecks) { - throw new Error(`Deck limit exceeded. Maximum ${maxDecks} decks allowed for your account type.`); - } - - // 4. Organizational deck restrictions - if (cmd.ctype === CType.ORGANIZATION) { - // Only premium users can create organizational decks - if (user.state !== UserState.VERIFIED_PREMIUM) { - throw new Error('Only premium users can create organizational decks.'); - } - - // User must belong to an organization - if (!user.orgid) { - throw new Error('You must be a member of an organization to create organizational decks.'); - } - - // Check organization limits - const org = await this.orgRepo.findById(user.orgid); - if (!org) { - throw new Error('Organization not found.'); - } - - if (org.maxOrganizationalDecks === null) { - throw new Error('Organization deck limit not configured. Contact administrator.'); - } - - const userOrgDeckCount = await this.deckRepo.countOrganizationalByUserId(cmd.userid); - if (userOrgDeckCount >= org.maxOrganizationalDecks) { - throw new Error(`Organization deck limit exceeded. Maximum ${org.maxOrganizationalDecks} organizational decks allowed.`); - } - } - - // 5. Create deck with restrictions passed - return this.createDeck(cmd); - } catch (error) { - if (error instanceof Error) { - throw error; // Re-throw known errors with original message - } - throw new Error('Failed to create deck'); - } - } - - /** - * Private method to create deck after all validations - */ - private async createDeck(cmd: CreateDeckCommand): Promise { - const deck = new DeckAggregate(); - deck.name = cmd.name; - deck.type = cmd.type; - deck.userid = cmd.userid; - deck.cards = cmd.cards; - deck.ctype = cmd.ctype ?? CType.PUBLIC; - deck.state = State.ACTIVE; - - // Set organization reference for organizational decks - if (cmd.ctype === CType.ORGANIZATION) { - const user = await this.userRepo.findById(cmd.userid); - if (user?.orgid) { - const org = await this.orgRepo.findById(user.orgid); - if (org) { - deck.organization = org; - } - } - } - - const created = await this.deckRepo.create(deck); - - logRequest('Deck created successfully', undefined, undefined, { - deckId: created.id, - userId: cmd.userid, - deckName: cmd.name, - deckType: cmd.type, - ctype: cmd.ctype, - cardCount: cmd.cards.length - }); - - return DeckMapper.toShortDto(created); - } -} diff --git a/SerpentRace_Backend/src/Application/Deck/commands/DeleteDeckCommand.ts b/SerpentRace_Backend/src/Application/Deck/commands/DeleteDeckCommand.ts deleted file mode 100644 index bf8ac418..00000000 --- a/SerpentRace_Backend/src/Application/Deck/commands/DeleteDeckCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DeleteDeckCommand { - id: string; - soft?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/Deck/commands/DeleteDeckCommandHandler.ts b/SerpentRace_Backend/src/Application/Deck/commands/DeleteDeckCommandHandler.ts deleted file mode 100644 index e484c4ef..00000000 --- a/SerpentRace_Backend/src/Application/Deck/commands/DeleteDeckCommandHandler.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository'; -import { DeleteDeckCommand } from './DeleteDeckCommand'; - -export class DeleteDeckCommandHandler { - constructor(private readonly deckRepo: IDeckRepository) {} - - async execute(cmd: DeleteDeckCommand): Promise { - if (cmd.soft) { - await this.deckRepo.softDelete(cmd.id); - } else { - await this.deckRepo.delete(cmd.id); - } - return true; - } -} diff --git a/SerpentRace_Backend/src/Application/Deck/commands/UpdateDeckCommand.ts b/SerpentRace_Backend/src/Application/Deck/commands/UpdateDeckCommand.ts deleted file mode 100644 index b1ce0066..00000000 --- a/SerpentRace_Backend/src/Application/Deck/commands/UpdateDeckCommand.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { n } from "framer-motion/dist/types.d-D0HXPxHm"; - -export interface UpdateDeckCommand { - id: string; - userstate?: number; - name?: string; - type?: number; - userid?: string; - cards?: any[]; - ctype?: number; - state?: number; -} diff --git a/SerpentRace_Backend/src/Application/Deck/commands/UpdateDeckCommandHandler.ts b/SerpentRace_Backend/src/Application/Deck/commands/UpdateDeckCommandHandler.ts deleted file mode 100644 index ced487ce..00000000 --- a/SerpentRace_Backend/src/Application/Deck/commands/UpdateDeckCommandHandler.ts +++ /dev/null @@ -1,50 +0,0 @@ -import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository'; -import { UpdateDeckCommand } from './UpdateDeckCommand'; -import { ShortDeckDto } from '../../DTOs/DeckDto'; -import { DeckMapper } from '../../DTOs/Mappers/DeckMapper'; -import { DeckAggregate } from '../../../Domain/Deck/DeckAggregate'; -import { logError } from '../../Services/Logger'; - -export class UpdateDeckCommandHandler { - constructor(private readonly deckRepo: IDeckRepository) {} - - async execute(cmd: UpdateDeckCommand): Promise { - if(cmd.state !== undefined && cmd.userstate!==1) { - throw new Error('Only admin users can change deck state'); - } - try { - let existingDeck: DeckAggregate | null = null; - if (cmd.userstate === 1) { - existingDeck = await this.deckRepo.findByIdIncludingDeleted(cmd.id); - } else { - existingDeck = await this.deckRepo.findById(cmd.id); - } - if (!existingDeck) { - logError(`Deck not found with ID: ${cmd.id}`); - throw new Error('Deck not found'); - } - - const for_update: Partial = {}; - if(cmd.name !== undefined) for_update.name = cmd.name; - if(cmd.type !== undefined) for_update.type = cmd.type; - if(cmd.cards !== undefined) for_update.cards = cmd.cards; - if(cmd.ctype !== undefined) for_update.ctype = cmd.ctype; - if(cmd.state !== undefined) for_update.state = cmd.state; - - // Ensure we have something to update - if (Object.keys(for_update).length === 0) { - throw new Error('No fields provided for update'); - } - - const deck = await this.deckRepo.update(cmd.id, { ...for_update }); - if(!deck) { - logError(`Deck update failed for ID: ${cmd.id}. Update returned null.`); - throw new Error('Failed to update deck'); - } - return DeckMapper.toShortDto(deck); - } catch (error: any) { - logError(`Error updating deck: ${cmd.id}`, error); - throw error; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Deck/queries/GetDeckByIdQuery.ts b/SerpentRace_Backend/src/Application/Deck/queries/GetDeckByIdQuery.ts deleted file mode 100644 index 49c192e0..00000000 --- a/SerpentRace_Backend/src/Application/Deck/queries/GetDeckByIdQuery.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface GetDeckByIdQuery { - id: string; -} diff --git a/SerpentRace_Backend/src/Application/Deck/queries/GetDeckByIdQueryHandler.ts b/SerpentRace_Backend/src/Application/Deck/queries/GetDeckByIdQueryHandler.ts deleted file mode 100644 index 9ea429b4..00000000 --- a/SerpentRace_Backend/src/Application/Deck/queries/GetDeckByIdQueryHandler.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository'; -import { GetDeckByIdQuery } from './GetDeckByIdQuery'; -import { DetailDeckDto } from '../../DTOs/DeckDto'; -import { DeckMapper } from '../../DTOs/Mappers/DeckMapper'; - -export class GetDeckByIdQueryHandler { - constructor(private readonly deckRepo: IDeckRepository) {} - - async execute(query: GetDeckByIdQuery): Promise { - const deck = await this.deckRepo.findById(query.id); - if (!deck) return null; - return DeckMapper.toDetailDto(deck); - } -} diff --git a/SerpentRace_Backend/src/Application/Deck/queries/GetDecksByPageQuery.ts b/SerpentRace_Backend/src/Application/Deck/queries/GetDecksByPageQuery.ts deleted file mode 100644 index 370fe350..00000000 --- a/SerpentRace_Backend/src/Application/Deck/queries/GetDecksByPageQuery.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface GetDecksByPageQuery { - from: number; - to: number; - userId: string; - userOrgId?: string; - isAdmin: boolean; - includeDeleted?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/Deck/queries/GetDecksByPageQueryHandler.ts b/SerpentRace_Backend/src/Application/Deck/queries/GetDecksByPageQueryHandler.ts deleted file mode 100644 index 4c1ab68d..00000000 --- a/SerpentRace_Backend/src/Application/Deck/queries/GetDecksByPageQueryHandler.ts +++ /dev/null @@ -1,82 +0,0 @@ -import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository'; -import { GetDecksByPageQuery } from './GetDecksByPageQuery'; -import { ShortDeckDto } from '../../DTOs/DeckDto'; -import { DeckMapper } from '../../DTOs/Mappers/DeckMapper'; -import { AdminBypassService } from '../../Services/AdminBypassService'; -import { logRequest, logError } from '../../Services/Logger'; - -export class GetDecksByPageQueryHandler { - constructor(private readonly deckRepo: IDeckRepository) {} - - async execute(query: GetDecksByPageQuery): Promise<{ decks: ShortDeckDto[], totalCount: number }> { - try { - // Validate pagination parameters - if (query.from < 0 || query.to < query.from) { - throw new Error('Invalid pagination parameters'); - } - - const limit = query.to - query.from + 1; - if (limit > 100) { - throw new Error('Page size too large. Maximum 100 records per request'); - } - - // Log admin bypass if applicable - if (query.isAdmin) { - AdminBypassService.logAdminBypass( - 'GET_DECKS_PAGE_BYPASS', - query.userId, - 'paginated-decks', - { - from: query.from, - to: query.to, - includesDeleted: query.includeDeleted || false, - operation: 'read' - } - ); - } - - logRequest('Get decks by page query started', undefined, undefined, { - userId: query.userId, - userOrgId: query.userOrgId, - isAdmin: query.isAdmin, - from: query.from, - to: query.to, - includeDeleted: query.includeDeleted || false - }); - - // Use paginated filtered deck finding method - const result = await this.deckRepo.findFilteredDecks( - query.userId, - query.userOrgId, - query.isAdmin, - query.from, - query.to - ); - - logRequest('Get decks by page query completed', undefined, undefined, { - userId: query.userId, - userOrgId: query.userOrgId, - isAdmin: query.isAdmin, - from: query.from, - to: query.to, - returned: result.decks.length, - totalCount: result.totalCount, - includeDeleted: query.includeDeleted || false - }); - - return { - decks: DeckMapper.toShortDtoList(result.decks), - totalCount: result.totalCount - }; - } catch (error) { - logError('GetDecksByPageQueryHandler error', error instanceof Error ? error : new Error(String(error))); - - // Re-throw validation errors as-is - if (error instanceof Error && (error.message.includes('Invalid pagination') || error.message.includes('Page size'))) { - throw error; - } - - throw new Error('Failed to retrieve decks page'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Game/BoardGenerationService.ts b/SerpentRace_Backend/src/Application/Game/BoardGenerationService.ts deleted file mode 100644 index 8749dcb2..00000000 --- a/SerpentRace_Backend/src/Application/Game/BoardGenerationService.ts +++ /dev/null @@ -1,494 +0,0 @@ -import { GameField, BoardData } from '../../Domain/Game/GameAggregate'; -import { logOther, logError } from '../Services/Logger'; - -interface TargetField { - fieldNumber: number; - distance: number; -} - -interface SpecialFieldInfo { - position: number; - type: 'positive' | 'negative' | 'luck'; -} - -export class BoardGenerationService { - private readonly MAX_GENERATION_TIME = parseInt(process.env.MAX_GENERATION_TIME_SECONDS || '20') * 1000; - private readonly ERROR_TOLERANCE = parseInt(process.env.GENERATION_ERROR_TOLERANCE || '15'); - - async generateBoard( - positiveFieldCount: number, - negativeFieldCount: number, - luckFieldCount: number - ): Promise { - const startTime = Date.now(); - let bestAttempt: BoardData | null = null; - let attemptCount = 0; - - while (Date.now() - startTime < this.MAX_GENERATION_TIME) { - attemptCount++; - - try { - const attempt = this.generateSingleAttempt(positiveFieldCount, negativeFieldCount, luckFieldCount); - - if (attempt.totalErrorRate <= this.ERROR_TOLERANCE) { - logOther(`Board generation successful on attempt ${attemptCount}. Error rate: ${attempt.totalErrorRate}%`); - return attempt; - } - - if (!bestAttempt || attempt.totalErrorRate < bestAttempt.totalErrorRate) { - bestAttempt = attempt; - } - - logOther(`Attempt ${attemptCount}: Error rate ${attempt.totalErrorRate}% (target: ${this.ERROR_TOLERANCE}%)`); - - } catch (error) { - logError(`Board generation attempt ${attemptCount} failed:`, error as Error); - } - } - - logOther(`Using best attempt with error rate: ${bestAttempt?.totalErrorRate || 100}%`); - return bestAttempt || this.generateFallbackBoard(positiveFieldCount, negativeFieldCount, luckFieldCount); - } - - private generateSingleAttempt( - positiveFieldCount: number, - negativeFieldCount: number, - luckFieldCount: number - ): BoardData { - // Step 1: Choose special field positions - const specialFieldPositions = this.chooseSpecialFieldPositions( - positiveFieldCount, - negativeFieldCount, - luckFieldCount - ); - - // Step 2: Select target fields for each special field (6 targets per field for dice 1-6) - const targetFieldsMap = this.selectTargetFields(specialFieldPositions); - - // Step 3: Create border with strategic placement - const border = this.createStrategicBorder(targetFieldsMap); - - // Step 4: Calculate step values based on border positions - const fields = this.calculateStepValues(specialFieldPositions, targetFieldsMap, border); - - // Step 5: Validate against 20-30 rule and calculate error rate - const validationResults = this.validateBoardGeneration(fields, border); - - // Log generation statistics - logOther('Board generation attempt completed', { - totalFields: fields.length, - specialFields: fields.filter(f => f.type !== 'regular').length, - positiveFields: fields.filter(f => f.type === 'positive').length, - negativeFields: fields.filter(f => f.type === 'negative').length, - luckFields: fields.filter(f => f.type === 'luck').length, - errorRate: validationResults.errorRate, - targetCount: Array.from(targetFieldsMap.values()).reduce((sum, targets) => sum + targets.length, 0) - }); - - return { - fields, - border, - validationResults: validationResults.validationResults, - totalErrorRate: validationResults.errorRate - }; - } - - private chooseSpecialFieldPositions( - positiveFieldCount: number, - negativeFieldCount: number, - luckFieldCount: number - ): SpecialFieldInfo[] { - const totalSpecial = positiveFieldCount + negativeFieldCount + luckFieldCount; - const positions: number[] = []; - const specialFields: SpecialFieldInfo[] = []; - - // Random placement with retry for good distribution - let attempts = 0; - while (positions.length < totalSpecial && attempts < 100) { - const position = Math.floor(Math.random() * 100) + 1; // 1-100 - - if (!positions.includes(position)) { - // Check minimum distance from existing positions - const tooClose = positions.some(existingPos => Math.abs(existingPos - position) < 3); - - if (!tooClose || attempts > 50) { // Relax distance requirement after many attempts - positions.push(position); - } - } - attempts++; - } - - // Sort positions and assign types - positions.sort((a, b) => a - b); - - // Distribute types randomly - const types: ('positive' | 'negative' | 'luck')[] = [ - ...Array(positiveFieldCount).fill('positive'), - ...Array(negativeFieldCount).fill('negative'), - ...Array(luckFieldCount).fill('luck') - ]; - - // Shuffle types - for (let i = types.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [types[i], types[j]] = [types[j], types[i]]; - } - - positions.forEach((position, index) => { - specialFields.push({ - position, - type: types[index] || 'positive' - }); - }); - - return specialFields; - } - - private selectTargetFields(specialFields: SpecialFieldInfo[]): Map { - const targetFieldsMap = new Map(); - - specialFields.forEach(field => { - if (field.type === 'luck') { - // Luck fields don't need target calculations - targetFieldsMap.set(field.position, []); - return; - } - - const targets: TargetField[] = []; - const usedTargets = new Set(); - - // Generate 6 different target fields (for dice 1-6) with 20-30 rule compliance - for (let i = 0; i < 6; i++) { - let targetField: number; - let distance: number; - let attempts = 0; - - do { - // Determine max distance based on field position (20-30 rule) - let maxDistance: number; - let maxBackward: number; - - if (field.position <= 85) { - maxDistance = 20; - maxBackward = 20; - } else { - maxDistance = 20; // forward - maxBackward = 30; // backward - } - - // Create variety in distances within the allowed range - const distanceType = Math.random(); - if (distanceType < 0.5) { - // Close distance (50% chance) - 1 to 1/3 of max - distance = Math.floor(Math.random() * Math.floor(maxDistance / 3)) + 1; - } else { - // Far distance (50% chance) - 1/3 to max - distance = Math.floor(Math.random() * (maxDistance - Math.floor(maxDistance / 3))) + Math.floor(maxDistance / 3); - } - - // Randomly choose forward or backward - if (Math.random() < 0.5) { - distance = -Math.min(distance, maxBackward); - } else { - distance = Math.min(distance, maxDistance); - } - - targetField = field.position + distance; - - // Ensure target is within valid range - if (targetField < 1) targetField = 1; - if (targetField > 100) targetField = 100; - - // Recalculate actual distance after clamping - distance = Math.abs(targetField - field.position); - - attempts++; - } while (usedTargets.has(targetField) && attempts < 30); - - if (!usedTargets.has(targetField)) { - usedTargets.add(targetField); - targets.push({ - fieldNumber: targetField, - distance: Math.abs(targetField - field.position) - }); - } else { - // Fallback: use a nearby valid target - let fallbackTarget = field.position + (i - 3); // Create some variety around current position - if (fallbackTarget < 1) fallbackTarget = 1; - if (fallbackTarget > 100) fallbackTarget = 100; - - targets.push({ - fieldNumber: fallbackTarget, - distance: Math.abs(fallbackTarget - field.position) - }); - } - } - - targetFieldsMap.set(field.position, targets); - }); - - return targetFieldsMap; - } - - private createStrategicBorder(targetFieldsMap: Map): number[] { - // Collect all target field numbers - const targetNumbers = new Set(); - targetFieldsMap.forEach(targets => { - targets.forEach(target => targetNumbers.add(target.fieldNumber)); - }); - - // Create array of all numbers 1-100 - const allNumbers = Array.from({ length: 100 }, (_, i) => i + 1); - - // Separate target numbers from remaining numbers - const remainingNumbers = allNumbers.filter(num => !targetNumbers.has(num)); - - // Shuffle remaining numbers - for (let i = remainingNumbers.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [remainingNumbers[i], remainingNumbers[j]] = [remainingNumbers[j], remainingNumbers[i]]; - } - - // Create border with strategic placement - const border: number[] = []; - const targetArray = Array.from(targetNumbers); - - // Encourage overlap by placing target numbers first, then fill with random - let targetIndex = 0; - let remainingIndex = 0; - - for (let i = 0; i < 100; i++) { - // Alternate between target numbers and remaining numbers, but favor targets when available - if (targetIndex < targetArray.length && (remainingIndex >= remainingNumbers.length || Math.random() < 0.6)) { - border.push(targetArray[targetIndex]); - targetIndex++; - } else if (remainingIndex < remainingNumbers.length) { - border.push(remainingNumbers[remainingIndex]); - remainingIndex++; - } else { - // Fallback - should not happen if logic is correct - border.push((i % 100) + 1); - } - } - - return border; - } - - private calculateStepValues( - specialFields: SpecialFieldInfo[], - targetFieldsMap: Map, - border: number[] - ): GameField[] { - // Initialize all fields as regular - const fields: GameField[] = Array.from({ length: 100 }, (_, i) => ({ - position: i + 1, - type: 'regular' as const - })); - - // Update special fields with calculated step values - specialFields.forEach(specialField => { - const fieldIndex = specialField.position - 1; // Convert to 0-based index - fields[fieldIndex].type = specialField.type; - - if (specialField.type === 'luck') { - // Luck fields don't need step values - return; - } - - const targets = targetFieldsMap.get(specialField.position) || []; - if (targets.length === 0) return; - - // NEW APPROACH: Calculate step value that will land on first target with dice=1 - // This ensures we have a baseline that works, then dice 2-6 will hit other targets - const firstTarget = targets[0]; - const targetIndexInBorder = border.indexOf(firstTarget.fieldNumber); - - if (targetIndexInBorder !== -1) { - // Start from field position in border (field position = border index + 1, but we want 0-based) - const startBorderIndex = (specialField.position - 1) % border.length; - - // Calculate step value needed to reach target with dice=1 - let stepValue: number; - - if (specialField.type === 'positive') { - // For positive: move right to target, then +1 more for dice=1 - stepValue = targetIndexInBorder - startBorderIndex - 1; // -1 for dice offset - - // Handle wrap-around - if (stepValue < 0) { - stepValue += border.length; - } - } else { - // For negative: move left to target, then -1 more for dice=1 - stepValue = startBorderIndex - targetIndexInBorder + 1; // +1 for dice offset - - // Handle wrap-around - if (stepValue > border.length) { - stepValue -= border.length; - } - - // Make negative for negative fields - stepValue = -stepValue; - } - - fields[fieldIndex].stepValue = stepValue; - - // Debug logging for step value calculation - logOther(`Calculated step value for ${specialField.type} field at position ${specialField.position}`, { - targetField: firstTarget.fieldNumber, - targetIndexInBorder, - startBorderIndex, - calculatedStepValue: stepValue, - fieldType: specialField.type - }); - } else { - // Fallback if target not found in border (shouldn't happen) - fields[fieldIndex].stepValue = specialField.type === 'positive' ? 1 : -1; - } - }); - - return fields; - } - - private validateBoardGeneration(fields: GameField[], border: number[]): { - validationResults: { [fieldIndex: number]: number[] }; - errorRate: number; - } { - const validationResults: { [fieldIndex: number]: number[] } = {}; - let totalCombinations = 0; - let invalidCombinations = 0; - - fields.forEach((field, fieldIndex) => { - if (field.type !== 'positive' && field.type !== 'negative') { - return; // Skip non-special fields - } - - const diceOutcomes: number[] = []; - - for (let diceValue = 1; diceValue <= 6; diceValue++) { - totalCombinations++; - - try { - const result = this.calculateBorderMovement( - field.position, - field.stepValue || 0, - diceValue, - border, - field.type === 'positive' - ); - - // Validate 20-30 rule - const distance = Math.abs(result - field.position); - const isValid = this.validate20_30Rule(field.position, result, distance); - - if (isValid) { - diceOutcomes.push(result); - } else { - diceOutcomes.push(-1); // Mark as invalid - invalidCombinations++; - } - } catch (error) { - diceOutcomes.push(-1); // Mark as invalid - invalidCombinations++; - } - } - - validationResults[fieldIndex] = diceOutcomes; - }); - - const errorRate = totalCombinations > 0 ? (invalidCombinations / totalCombinations) * 100 : 0; - - return { - validationResults, - errorRate: Math.round(errorRate * 100) / 100 // Round to 2 decimal places - }; - } - - private calculateBorderMovement( - currentPosition: number, - stepValue: number, - diceValue: number, - border: number[], - isPositive: boolean - ): number { - // Step 1: Find border index for current field (field position corresponds to border index) - let borderIndex = (currentPosition - 1) % border.length; // Convert to 0-based, handle wraparound - - // Step 2: Apply field step value (handle negative step values for negative fields) - if (isPositive) { - borderIndex = (borderIndex + Math.abs(stepValue)) % border.length; - } else { - // For negative fields, stepValue is already negative, so we subtract it (which adds its absolute value) - borderIndex = (borderIndex - stepValue + border.length) % border.length; - } - - // Step 3: Apply dice value - if (isPositive) { - borderIndex = (borderIndex + diceValue) % border.length; - } else { - borderIndex = (borderIndex - diceValue + border.length) % border.length; - } - - // Step 4: Return the field number at final border position - return border[borderIndex]; - } - - private validate20_30Rule(currentPosition: number, targetPosition: number, distance: number): boolean { - // Fields 1-85: max 20 fields in any direction - if (currentPosition <= 85) { - return distance <= 20; - } - - // Fields 86-100: max 30 fields backward, max 20 fields forward - if (currentPosition > 85) { - if (targetPosition > currentPosition) { - // Moving forward: max 20 fields - return distance <= 20; - } else { - // Moving backward: max 30 fields - return distance <= 30; - } - } - - return false; - } - - private generateFallbackBoard( - positiveFieldCount: number, - negativeFieldCount: number, - luckFieldCount: number - ): BoardData { - // Simple fallback: create basic board with minimal special fields - const fields: GameField[] = Array.from({ length: 100 }, (_, i) => ({ - position: i + 1, - type: 'regular' as const - })); - - // Add a few special fields with safe step values - let specialCount = 0; - for (let i = 10; i < 90 && specialCount < positiveFieldCount + negativeFieldCount; i += 10) { - if (specialCount < positiveFieldCount) { - fields[i].type = 'positive'; - fields[i].stepValue = 1; - } else { - fields[i].type = 'negative'; - fields[i].stepValue = -1; - } - specialCount++; - } - - // Simple border: shuffled 1-100 - const border = Array.from({ length: 100 }, (_, i) => i + 1); - for (let i = border.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [border[i], border[j]] = [border[j], border[i]]; - } - - return { - fields, - border, - validationResults: {}, - totalErrorRate: 100 // Mark as fallback - }; - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/GameService.ts b/SerpentRace_Backend/src/Application/Game/GameService.ts deleted file mode 100644 index dd941e6a..00000000 --- a/SerpentRace_Backend/src/Application/Game/GameService.ts +++ /dev/null @@ -1,303 +0,0 @@ -import { StartGameCommand } from './commands/StartGameCommand'; -import { StartGameCommandHandler } from './commands/StartGameCommandHandler'; -import { JoinGameCommand } from './commands/JoinGameCommand'; -import { JoinGameCommandHandler } from './commands/JoinGameCommandHandler'; -import { StartGamePlayCommand } from './commands/StartGamePlayCommand'; -import { StartGamePlayCommandHandler, GameStartResult } from './commands/StartGamePlayCommandHandler'; -import { GameAggregate, LoginType } from '../../Domain/Game/GameAggregate'; -import { logOther, logError } from '../Services/Logger'; - -export class GameService { - private startGameHandler: StartGameCommandHandler; - private joinGameHandler: JoinGameCommandHandler; - private startGamePlayHandler: StartGamePlayCommandHandler; - - constructor() { - this.startGameHandler = new StartGameCommandHandler(); - this.joinGameHandler = new JoinGameCommandHandler(); - this.startGamePlayHandler = new StartGamePlayCommandHandler(); - } - - /** - * Starts a new game with the provided deck IDs - * @param deckids Array of deck IDs (should contain 3 types: LUCK, JOKER, QUESTION) - * @param maxplayers Maximum number of players allowed in the game - * @param logintype How players can join the game (PUBLIC, PRIVATE, ORGANIZATION) - * @param userid Optional ID of the user creating the game - * @returns Promise The created game - */ - async startGame( - deckids: string[], - maxplayers: number, - logintype: LoginType, - userid?: string, - orgid?: string | null - ): Promise { - const startTime = performance.now(); - - try { - logOther('GameService.startGame called', { - deckCount: deckids.length, - maxplayers, - logintype, - userid, - orgid - }); - - // Validate input parameters - this.validateStartGameInput(deckids, maxplayers, logintype); - - // Create and execute the command - const command: StartGameCommand = { - deckids, - maxplayers, - logintype, - userid, - orgid - }; - - const game = await this.startGameHandler.handle(command); - - const endTime = performance.now(); - logOther('Game started successfully', { - gameId: game.id, - gameCode: game.gamecode, - deckCount: game.gamedecks.length, - totalCards: game.gamedecks.reduce((sum, deck) => sum + deck.cards.length, 0), - executionTime: Math.round(endTime - startTime) - }); - - return game; - - } catch (error) { - const endTime = performance.now(); - logError('GameService.startGame failed', error instanceof Error ? error : new Error(String(error))); - logOther('Game start failed', { - executionTime: Math.round(endTime - startTime), - error: error instanceof Error ? error.message : String(error) - }); - throw error; - } - } - - /** - * Join an existing game using game code - * @param gameCode 6-character game code - * @param playerId ID of the player joining (optional for public games) - * @param playerName Display name for the player - * @param orgId Organization ID (for organization games) - * @param loginType Type of join being attempted - * @returns Promise The updated game with new player - */ - async joinGame( - gameCode: string, - playerId?: string, - playerName?: string, - orgId?: string | null, - loginType?: LoginType - ): Promise { - const startTime = performance.now(); - - try { - logOther('GameService.joinGame called', { - gameCode, - playerId: playerId || 'anonymous', - playerName, - orgId, - loginType - }); - - // Validate input parameters - this.validateJoinGameInput(gameCode, playerId, loginType); - - // Create and execute the command - const command: JoinGameCommand = { - gameCode, - playerId, - playerName, - orgId, - loginType: loginType || LoginType.PUBLIC - }; - - const game = await this.joinGameHandler.handle(command); - - const endTime = performance.now(); - logOther('Player joined game successfully', { - gameId: game.id, - gameCode: game.gamecode, - playerId, - playerCount: game.players.length, - maxPlayers: game.maxplayers, - executionTime: Math.round(endTime - startTime) - }); - - return game; - - } catch (error) { - const endTime = performance.now(); - logError('GameService.joinGame failed', error instanceof Error ? error : new Error(String(error))); - logOther('Game join failed', { - gameCode, - playerId, - executionTime: Math.round(endTime - startTime), - error: error instanceof Error ? error.message : String(error) - }); - throw error; - } - } - - /** - * Start an existing game (move from WAITING to ACTIVE) - * Initializes all player positions to 0 and assigns random turn order - * @param gameId Game ID to start - * @param userId User ID of the game master (optional for public games) - * @returns Promise The updated game - */ - async startGamePlay( - gameId: string, - userId?: string - ): Promise { - const startTime = performance.now(); - - try { - logOther('GameService.startGamePlay called', { - gameId, - userId: userId || 'system' - }); - - // Validate input parameters - this.validateStartGamePlayInput(gameId); - - // Create and execute the command - const command: StartGamePlayCommand = { - gameId, - userId - }; - - const result = await this.startGamePlayHandler.handle(command); - - const endTime = performance.now(); - logOther('Game play started successfully', { - gameId: result.game.id, - gameCode: result.game.gamecode, - playerCount: result.game.players.length, - gameState: result.game.state, - executionTime: Math.round(endTime - startTime) - }); - - return result; - - } catch (error) { - const endTime = performance.now(); - logError('GameService.startGamePlay failed', error instanceof Error ? error : new Error(String(error))); - logOther('Game play start failed', { - gameId, - userId, - executionTime: Math.round(endTime - startTime), - error: error instanceof Error ? error.message : String(error) - }); - throw error; - } - } - - private validateStartGamePlayInput(gameId: string): void { - // Validate game ID - if (!gameId || typeof gameId !== 'string') { - throw new Error('Game ID is required and must be a string'); - } - - logOther('Start game play input validation passed', { - gameId - }); - } - - private validateJoinGameInput(gameCode: string, playerId?: string, loginType?: LoginType): void { - // Validate game code - if (!gameCode || typeof gameCode !== 'string') { - throw new Error('Game code is required and must be a string'); - } - - if (gameCode.length !== 6) { - throw new Error('Game code must be exactly 6 characters long'); - } - - // Validate login type specific requirements - if (loginType === LoginType.PRIVATE || loginType === LoginType.ORGANIZATION) { - if (!playerId || typeof playerId !== 'string') { - throw new Error(`Player ID is required for ${LoginType[loginType]} games`); - } - } - - logOther('Join game input validation passed', { - gameCode, - playerId: playerId || 'anonymous', - loginType - }); - } - - private validateStartGameInput(deckids: string[], maxplayers: number, logintype: LoginType): void { - // Validate deck IDs - if (!deckids || deckids.length === 0) { - throw new Error('At least one deck ID must be provided'); - } - - if (deckids.length < 3) { - throw new Error('At least 3 decks are required to start a game (one for each type: LUCK, JOKER, QUESTION)'); - } - - // Validate max players - if (!maxplayers || maxplayers < 2) { - throw new Error('Maximum players must be at least 2'); - } - - if (maxplayers > 8) { - throw new Error('Maximum players cannot exceed 8'); - } - - // Validate login type - if (logintype < 0 || logintype > 2) { - throw new Error('Invalid login type. Must be PUBLIC (0), PRIVATE (1), or ORGANIZATION (2)'); - } - - // Check for duplicate deck IDs - const uniqueIds = new Set(deckids); - if (uniqueIds.size !== deckids.length) { - throw new Error('Duplicate deck IDs are not allowed'); - } - - logOther('Start game input validation passed', { - deckCount: deckids.length, - maxplayers, - logintype - }); - } - - /** - * Game flow explanation (to be implemented later): - * - * 1. START GAME (implemented above): - * - Input: deckids, maxplayers, logintype, gamecode - * - Process: Fetch decks, validate types, shuffle cards, create game - * - Output: Game with shuffled deck objects - * - * 2. JOIN GAME (to be implemented): - * - Input: gamecode, playerid - * - Process: Find game, validate capacity, add player - * - Output: Updated game with new player - * - * 3. GAME ROUNDS (to be implemented): - * - Input: gameid, current player - * - Process: Manage turn order, track game state - * - Output: Current player information - * - * 4. PICK CARD (to be implemented): - * - Input: gameid, playerid, deck type - * - Process: Draw card from specific deck, apply consequence - * - Output: Card details and consequence effects - * - * 5. END GAME (to be implemented): - * - Input: gameid, winner - * - Process: Set game as finished, record winner - * - Output: Final game state - */ -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/GenerateBoardCommand.ts b/SerpentRace_Backend/src/Application/Game/commands/GenerateBoardCommand.ts deleted file mode 100644 index b3c909b4..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/GenerateBoardCommand.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface GenerateBoardCommand { - gameId: string; - positiveFieldCount: number; - negativeFieldCount: number; - luckFieldCount: number; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/GenerateBoardCommandHandler.ts b/SerpentRace_Backend/src/Application/Game/commands/GenerateBoardCommandHandler.ts deleted file mode 100644 index 25e74c60..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/GenerateBoardCommandHandler.ts +++ /dev/null @@ -1,66 +0,0 @@ -import { GenerateBoardCommand } from './GenerateBoardCommand'; -import { BoardGenerationService } from '../BoardGenerationService'; -import { RedisService } from '../../Services/RedisService'; -import { logOther, logError } from '../../Services/Logger'; -import { BoardData } from '../../../Domain/Game/GameAggregate'; - -export class GenerateBoardCommandHandler { - constructor( - private readonly boardGenerationService: BoardGenerationService, - private readonly redisService: RedisService - ) {} - - async execute(cmd: GenerateBoardCommand): Promise { - try { - logOther(`Starting board generation for game ${cmd.gameId}`); - const startTime = Date.now(); - - // Generate board with 20-30 rule validation - const boardData = await this.boardGenerationService.generateBoard( - cmd.positiveFieldCount, - cmd.negativeFieldCount, - cmd.luckFieldCount - ); - - // Store in Redis - const boardDataWithMetadata: BoardData = { - ...boardData, - gameId: cmd.gameId, - generatedAt: new Date(), - generationComplete: true - }; - - await this.redisService.setWithExpiry( - `game_board_${cmd.gameId}`, - JSON.stringify(boardDataWithMetadata), - 24 * 60 * 60 // 24 hours - ); - - const executionTime = Date.now() - startTime; - logOther(`Board generation completed for game ${cmd.gameId} in ${executionTime}ms. Error rate: ${boardData.totalErrorRate}%`); - - } catch (error) { - logError(`Board generation failed for game ${cmd.gameId}:`, error as Error); - - // Store error state in Redis - const errorData: BoardData = { - gameId: cmd.gameId, - fields: [], - border: [], - validationResults: {}, - totalErrorRate: 100, - generationComplete: false, - error: error instanceof Error ? error.message : 'Unknown error', - generatedAt: new Date() - }; - - await this.redisService.setWithExpiry( - `game_board_${cmd.gameId}`, - JSON.stringify(errorData), - 24 * 60 * 60 - ); - - throw error; - } - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/JoinGameCommand.ts b/SerpentRace_Backend/src/Application/Game/commands/JoinGameCommand.ts deleted file mode 100644 index b59e633c..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/JoinGameCommand.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { LoginType } from '../../../Domain/Game/GameAggregate'; - -export interface JoinGameCommand { - gameCode: string; // 6-character game code - playerId?: string; // User ID of the player joining (optional for public games) - playerName?: string; // Display name for the player (required for public games) - orgId?: string | null; // Organization ID (for organization games) - loginType: LoginType; // Type of join being attempted -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/JoinGameCommandHandler.ts b/SerpentRace_Backend/src/Application/Game/commands/JoinGameCommandHandler.ts deleted file mode 100644 index f56633ff..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/JoinGameCommandHandler.ts +++ /dev/null @@ -1,213 +0,0 @@ -import { JoinGameCommand } from './JoinGameCommand'; -import { GameAggregate, GameState, LoginType } from '../../../Domain/Game/GameAggregate'; -import { IGameRepository } from '../../../Domain/IRepository/IGameRepository'; -import { DIContainer } from '../../Services/DIContainer'; -import { RedisService } from '../../Services/RedisService'; -import { logOther, logError } from '../../Services/Logger'; -import { v4 as uuidv4 } from 'uuid'; - -export interface GamePlayerData { - playerId: string; - playerName?: string; - joinedAt: Date; - isOnline: boolean; - position?: number; // For game board position (to be used later) -} - -export interface ActiveGameData { - gameId: string; - gameCode: string; - hostId?: string; - maxPlayers: number; - currentPlayers: GamePlayerData[]; - state: GameState; - createdAt: Date; - startedAt?: Date; - currentTurn?: string; // Player ID whose turn it is - websocketRoom: string; // WebSocket room name for real-time updates -} - -export class JoinGameCommandHandler { - private gameRepository: IGameRepository; - private redisService: RedisService; - - constructor() { - this.gameRepository = DIContainer.getInstance().gameRepository; - this.redisService = RedisService.getInstance(); - } - - async handle(command: JoinGameCommand): Promise { - const startTime = performance.now(); - - try { - logOther('Joining game', `gameCode: ${command.gameCode}, playerId: ${command.playerId || 'anonymous'}, loginType: ${command.loginType}`); - - // Find the game by game code - const game = await this.gameRepository.findByGameCode(command.gameCode); - if (!game) { - throw new Error(`Game with code ${command.gameCode} not found`); - } - - // Generate player ID for public games or use provided one - const actualPlayerId = command.playerId || uuidv4(); - - // Validate game joinability (authentication/org checks done in router) - this.validateGameJoinability(game, actualPlayerId, command); - - // Add player to database - const updatedGame = await this.gameRepository.addPlayerToGame(game.id, actualPlayerId); - if (!updatedGame) { - throw new Error('Failed to add player to game'); - } - - // Update Redis with the new player - await this.updateGameInRedis(updatedGame, { ...command, playerId: actualPlayerId }); - - const endTime = performance.now(); - logOther('Player joined game successfully', { - gameId: game.id, - gameCode: game.gamecode, - playerId: actualPlayerId, - playerCount: updatedGame.players.length, - maxPlayers: updatedGame.maxplayers, - loginType: game.logintype, - executionTime: Math.round(endTime - startTime) - }); - - return updatedGame; - - } catch (error) { - const endTime = performance.now(); - logError('Failed to join game', error instanceof Error ? error : new Error(String(error))); - logOther('Game join failed', { - gameCode: command.gameCode, - playerId: command.playerId || 'anonymous', - loginType: command.loginType, - executionTime: Math.round(endTime - startTime) - }); - throw error; - } - } - - private validateGameJoinability(game: GameAggregate, playerId: string, command: JoinGameCommand): void { - // Check if game is in waiting state - if (game.state !== GameState.WAITING) { - throw new Error('Game is not accepting new players'); - } - - // Check if player is already in the game - if (game.players.includes(playerId)) { - throw new Error('Player is already in this game'); - } - - // Check if game is full - if (game.players.length >= game.maxplayers) { - throw new Error('Game is full'); - } - - // Note: Login type validation is now handled in the router before reaching this handler - // This ensures proper authentication and organization membership checks are done first - - logOther('Game join validation passed', { - gameId: game.id, - gameCode: game.gamecode, - currentPlayers: game.players.length, - maxPlayers: game.maxplayers, - gameState: game.state, - loginType: game.logintype, - playerId: playerId, - isAuthenticated: !!command.playerId - }); - } - - private async updateGameInRedis(game: GameAggregate, command: JoinGameCommand & { playerId: string }): Promise { - try { - const redisKey = `game:${game.id}`; - - // Get existing game data from Redis or create new - let gameData: ActiveGameData; - const existingData = await this.redisService.get(redisKey); - - if (existingData) { - gameData = JSON.parse(existingData) as ActiveGameData; - } else { - // Create new game data structure - gameData = { - gameId: game.id, - gameCode: game.gamecode, - maxPlayers: game.maxplayers, - currentPlayers: [], - state: game.state, - createdAt: game.createdate, - websocketRoom: `game_${game.gamecode}` - }; - } - - // Add the new player - const newPlayer: GamePlayerData = { - playerId: command.playerId, - playerName: command.playerName, - joinedAt: new Date(), - isOnline: true - }; - - // Update players list (remove if exists, then add) - gameData.currentPlayers = gameData.currentPlayers.filter(p => p.playerId !== command.playerId); - gameData.currentPlayers.push(newPlayer); - - // Update game state and player count - gameData.state = game.state; - - // Store updated data in Redis with TTL (24 hours) - await this.redisService.setWithExpiry(redisKey, JSON.stringify(gameData), 24 * 60 * 60); - - // Add player to active players set - await this.redisService.setAdd(`active_players:${game.id}`, command.playerId); - - logOther('Game data updated in Redis', { - gameId: game.id, - gameCode: game.gamecode, - redisKey, - playerCount: gameData.currentPlayers.length, - websocketRoom: gameData.websocketRoom, - playerId: command.playerId - }); - - } catch (error) { - logError('Failed to update game in Redis', error instanceof Error ? error : new Error(String(error))); - // Don't throw error here - Redis failure shouldn't prevent game join - logOther('Game join completed despite Redis error', { - gameId: game.id, - playerId: command.playerId - }); - } - } - - async getGameFromRedis(gameId: string): Promise { - try { - const redisKey = `game:${gameId}`; - const data = await this.redisService.get(redisKey); - return data ? JSON.parse(data) as ActiveGameData : null; - } catch (error) { - logError('Failed to get game from Redis', error instanceof Error ? error : new Error(String(error))); - return null; - } - } - - async removePlayerFromRedis(gameId: string, playerId: string): Promise { - try { - const redisKey = `game:${gameId}`; - const existingData = await this.redisService.get(redisKey); - - if (existingData) { - const gameData = JSON.parse(existingData) as ActiveGameData; - gameData.currentPlayers = gameData.currentPlayers.filter(p => p.playerId !== playerId); - - await this.redisService.setWithExpiry(redisKey, JSON.stringify(gameData), 24 * 60 * 60); - await this.redisService.setRemove(`active_players:${gameId}`, playerId); - } - } catch (error) { - logError('Failed to remove player from Redis', error instanceof Error ? error : new Error(String(error))); - } - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/StartGameCommand.ts b/SerpentRace_Backend/src/Application/Game/commands/StartGameCommand.ts deleted file mode 100644 index e10fad32..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/StartGameCommand.ts +++ /dev/null @@ -1,9 +0,0 @@ -import { LoginType } from '../../../Domain/Game/GameAggregate'; - -export interface StartGameCommand { - deckids: string[]; // Array of deck IDs (3 types, multiple decks per type) - maxplayers: number; // Maximum number of players - logintype: LoginType; // How players can join the game - userid?: string; // Optional user who created the game (becomes game master) - orgid?: string | null; // Organization ID (for organization games) -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/StartGameCommandHandler.ts b/SerpentRace_Backend/src/Application/Game/commands/StartGameCommandHandler.ts deleted file mode 100644 index 12e59454..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/StartGameCommandHandler.ts +++ /dev/null @@ -1,290 +0,0 @@ -import { StartGameCommand } from './StartGameCommand'; -import { GameAggregate, GameDeck, GameCard, DeckType, GameState } from '../../../Domain/Game/GameAggregate'; -import { DeckAggregate } from '../../../Domain/Deck/DeckAggregate'; -import { IGameRepository } from '../../../Domain/IRepository/IGameRepository'; -import { IDeckRepository } from '../../../Domain/IRepository/IDeckRepository'; -import { DIContainer } from '../../Services/DIContainer'; -import { RedisService } from '../../Services/RedisService'; -import { logOther, logError } from '../../Services/Logger'; -import { randomBytes } from 'crypto'; -import { GenerateBoardCommand } from './GenerateBoardCommand'; - -export interface ActiveGameData { - gameId: string; - gameCode: string; - hostId?: string; - maxPlayers: number; - currentPlayers: GamePlayerData[]; - state: GameState; - createdAt: Date; - startedAt?: Date; - currentTurn?: string; - websocketRoom: string; -} - -export interface GamePlayerData { - playerId: string; - playerName?: string; - joinedAt: Date; - isOnline: boolean; - position?: number; -} - -export class StartGameCommandHandler { - private gameRepository: IGameRepository; - private deckRepository: IDeckRepository; - private redisService: RedisService; - - constructor() { - this.gameRepository = DIContainer.getInstance().gameRepository; - this.deckRepository = DIContainer.getInstance().deckRepository; - this.redisService = RedisService.getInstance(); - } - - async handle(command: StartGameCommand): Promise { - const startTime = performance.now(); - - try { - logOther('Starting game creation', `deckCount: ${command.deckids.length}, maxPlayers: ${command.maxplayers}, loginType: ${command.logintype}`); - - // Generate unique game code - const gamecode = this.generateGameCode(); - - // Fetch all decks by IDs - const decks = await this.fetchDecks(command.deckids); - - // Validate we have 3 deck types - this.validateDeckTypes(decks); - - // Group decks by type and shuffle cards within each type - const gamedecks = await this.createShuffledGameDecks(decks); - - // Create the game aggregate - const gameData: Partial = { - gamecode, - maxplayers: command.maxplayers, - logintype: command.logintype, - createdby: command.userid || null, - orgid: command.orgid || null, - gamedecks, - players: [], - started: false, - finished: false, - winner: null, - state: GameState.WAITING, - startdate: null, - enddate: null - }; - - // Save the game to database - const savedGame = await this.gameRepository.create(gameData); - - // Create Redis object for real-time game management - await this.createGameInRedis(savedGame, command.userid); - - // Trigger async board generation (don't block game creation) - this.triggerAsyncBoardGeneration(savedGame.id).catch((error: Error) => { - logError('Async board generation failed', error); - }); - - const endTime = performance.now(); - logOther('Game created successfully', `gameId: ${savedGame.id}, gameCode: ${savedGame.gamecode}, executionTime: ${Math.round(endTime - startTime)}ms`); - - return savedGame; - - } catch (error) { - const endTime = performance.now(); - logError('Failed to create game', error instanceof Error ? error : new Error(String(error))); - logOther('Game creation failed', `executionTime: ${Math.round(endTime - startTime)}ms`); - throw new Error('Failed to start game: ' + (error instanceof Error ? error.message : String(error))); - } - } - - private generateGameCode(): string { - // Generate a 6-character alphanumeric game code - const chars = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789'; - let result = ''; - const randomBytesArray = randomBytes(6); - - for (let i = 0; i < 6; i++) { - result += chars[randomBytesArray[i] % chars.length]; - } - - return result; - } - - private async fetchDecks(deckIds: string[]): Promise { - const decks: DeckAggregate[] = []; - - for (const deckId of deckIds) { - const deck = await this.deckRepository.findById(deckId); - if (!deck) { - throw new Error(`Deck with ID ${deckId} not found`); - } - decks.push(deck); - } - - return decks; - } - - private validateDeckTypes(decks: DeckAggregate[]): void { - const deckTypes = new Set(decks.map(deck => deck.type)); - - // Check if we have all 3 required deck types (LUCK=0, JOKER=1, QUESTION=2) - const requiredTypes = [0, 1, 2]; // Based on Type enum in DeckAggregate - const missingTypes = requiredTypes.filter(type => !deckTypes.has(type)); - - if (missingTypes.length > 0) { - throw new Error(`Missing required deck types: ${missingTypes.join(', ')}. Game requires LUCK, JOKER, and QUESTION deck types.`); - } - - logOther('Deck types validation passed', `foundTypes: [${Array.from(deckTypes).join(', ')}]`); - } - - private async createShuffledGameDecks(decks: DeckAggregate[]): Promise { - // Group decks by type - const decksByType = new Map(); - - decks.forEach(deck => { - if (!decksByType.has(deck.type)) { - decksByType.set(deck.type, []); - } - decksByType.get(deck.type)!.push(deck); - }); - - const gamedecks: GameDeck[] = []; - - // Process each deck type - for (const [deckType, typeDecks] of decksByType) { - // Collect all cards from decks of this type - const allCards: GameCard[] = []; - - typeDecks.forEach(deck => { - deck.cards.forEach(card => { - const gameCard: GameCard = { - cardid: this.generateCardId(), - question: card.text, - answer: card.answer || undefined, - consequence: card.consequence || null, - played: false, - playerid: undefined - }; - allCards.push(gameCard); - }); - }); - - // Shuffle all cards of this type - const shuffledCards = this.shuffleArray(allCards); - - // Create game deck for this type - const gameDeck: GameDeck = { - deckid: typeDecks[0].id, // Use first deck ID as representative - decktype: this.mapDeckTypeToGameDeckType(deckType), - cards: shuffledCards - }; - - gamedecks.push(gameDeck); - - logOther('Created shuffled game deck', `type: ${deckType}, cardCount: ${shuffledCards.length}, sourceDecks: ${typeDecks.length}`); - } - - return gamedecks; - } - - private mapDeckTypeToGameDeckType(deckType: number): DeckType { - // Map DeckAggregate.Type to GameAggregate.DeckType - switch (deckType) { - case 0: return DeckType.LUCK; // LUCK = 0 - case 1: return DeckType.JOCKER; // JOKER = 1 - case 2: return DeckType.QUEST; // QUESTION = 2 - default: throw new Error(`Unknown deck type: ${deckType}`); - } - } - - private shuffleArray(array: T[]): T[] { - const shuffled = [...array]; - for (let i = shuffled.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [shuffled[i], shuffled[j]] = [shuffled[j], shuffled[i]]; - } - return shuffled; - } - - private generateCardId(): string { - return randomBytes(8).toString('hex'); - } - - private async createGameInRedis(game: GameAggregate, hostId?: string): Promise { - try { - const redisKey = `game:${game.id}`; - - const gameData: ActiveGameData = { - gameId: game.id, - gameCode: game.gamecode, - hostId: hostId, - maxPlayers: game.maxplayers, - currentPlayers: [], - state: game.state, - createdAt: game.createdate, - websocketRoom: `game_${game.gamecode}` - }; - - // Store game data in Redis with TTL (24 hours) - await this.redisService.setWithExpiry(redisKey, JSON.stringify(gameData), 24 * 60 * 60); - - // Create game room for WebSocket connections - await this.redisService.set(`game_room:${game.gamecode}`, game.id); - - logOther('Game created in Redis', { - gameId: game.id, - gameCode: game.gamecode, - hostId: hostId, - websocketRoom: gameData.websocketRoom, - redisKey - }); - - } catch (error) { - logError('Failed to create game in Redis', error instanceof Error ? error : new Error(String(error))); - // Don't throw error here - Redis failure shouldn't prevent game creation - logOther('Game created successfully despite Redis error', { - gameId: game.id, - gameCode: game.gamecode - }); - } - } - - private async triggerAsyncBoardGeneration(gameId: string): Promise { - try { - // Calculate default field counts based on game configuration - // For now, use reasonable defaults - this should be configurable by host in the future - const maxSpecialFieldsPercentage = parseInt(process.env.MAX_SPECIAL_FIELDS_PERCENTAGE || '67'); - const maxSpecialFields = Math.floor((100 * maxSpecialFieldsPercentage) / 100); - - // Default distribution: 60% positive, 25% negative, 15% luck - const positiveFieldCount = Math.floor(maxSpecialFields * 0.6); - const negativeFieldCount = Math.floor(maxSpecialFields * 0.25); - const luckFieldCount = Math.floor(maxSpecialFields * 0.15); - - const command: GenerateBoardCommand = { - gameId, - positiveFieldCount, - negativeFieldCount, - luckFieldCount - }; - - logOther(`Triggering async board generation for game ${gameId}`, { - positiveFieldCount, - negativeFieldCount, - luckFieldCount, - totalSpecialFields: positiveFieldCount + negativeFieldCount + luckFieldCount - }); - - // Execute board generation in background - await DIContainer.getInstance().generateBoardCommandHandler.execute(command); - - } catch (error) { - logError(`Async board generation failed for game ${gameId}`, error as Error); - // Don't propagate error - board generation failure shouldn't affect game creation - } - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/StartGamePlayCommand.ts b/SerpentRace_Backend/src/Application/Game/commands/StartGamePlayCommand.ts deleted file mode 100644 index af62a030..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/StartGamePlayCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface StartGamePlayCommand { - gameId: string; // Game ID to start - userId?: string; // User who is starting the game (should be game master) -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Game/commands/StartGamePlayCommandHandler.ts b/SerpentRace_Backend/src/Application/Game/commands/StartGamePlayCommandHandler.ts deleted file mode 100644 index 1500617a..00000000 --- a/SerpentRace_Backend/src/Application/Game/commands/StartGamePlayCommandHandler.ts +++ /dev/null @@ -1,440 +0,0 @@ -import { StartGamePlayCommand } from './StartGamePlayCommand'; -import { GameAggregate, GameState, BoardData, GameField } from '../../../Domain/Game/GameAggregate'; -import { IGameRepository } from '../../../Domain/IRepository/IGameRepository'; -import { DIContainer } from '../../Services/DIContainer'; -import { RedisService } from '../../Services/RedisService'; -import { WebSocketService } from '../../Services/WebSocketService'; -import { logOther, logError } from '../../Services/Logger'; - -export interface GamePlayerPosition { - playerId: string; - playerName?: string; - position: number; // Board position (starts at 0) - turnOrder: number; // Random number to determine turn sequence - isOnline: boolean; - joinedAt: Date; -} - -export interface ActiveGamePlayData { - gameId: string; - gameCode: string; - hostId?: string; - maxPlayers: number; - players: GamePlayerPosition[]; - state: GameState; - createdAt: Date; - startedAt: Date; - currentTurn: number; // Index of current player in turn order - turnSequence: string[]; // Ordered array of player IDs based on turnOrder - websocketRoom: string; - gamePhase: 'starting' | 'playing' | 'paused' | 'finished'; - boardData: BoardData; // Generated board with fields and border -} - -export interface GameStartResult { - game: GameAggregate; - boardData: BoardData; -} - -export class StartGamePlayCommandHandler { - private gameRepository: IGameRepository; - private redisService: RedisService; - - constructor() { - this.gameRepository = DIContainer.getInstance().gameRepository; - this.redisService = RedisService.getInstance(); - } - - async handle(command: StartGamePlayCommand): Promise { - const startTime = performance.now(); - - try { - logOther('Starting game play', `gameId: ${command.gameId}, userId: ${command.userId || 'system'}`); - - // Find the game - const game = await this.gameRepository.findById(command.gameId); - if (!game) { - throw new Error(`Game with ID ${command.gameId} not found`); - } - - // Validate game can be started - this.validateGameCanStart(game, command.userId); - - // Wait for board generation to complete (max 20 seconds) - const boardData = await this.waitForBoardGeneration(game.id); - - // Update game state in database - const updatedGame = await this.gameRepository.update(game.id, { - started: true, - state: GameState.ACTIVE, - startdate: new Date() - }); - - if (!updatedGame) { - throw new Error('Failed to update game state'); - } - - // Initialize game play in Redis with board data - await this.initializeGamePlayInRedis(updatedGame, boardData); - - // Notify all players via WebSocket - await this.notifyGameStart(updatedGame); - - const endTime = performance.now(); - logOther('Game play started successfully', { - gameId: updatedGame.id, - gameCode: updatedGame.gamecode, - playerCount: updatedGame.players.length, - executionTime: Math.round(endTime - startTime) - }); - - return { - game: updatedGame, - boardData: boardData - }; - - } catch (error) { - const endTime = performance.now(); - logError('Failed to start game play', error instanceof Error ? error : new Error(String(error))); - logOther('Game start failed', { - gameId: command.gameId, - userId: command.userId, - executionTime: Math.round(endTime - startTime) - }); - throw error; - } - } - - private validateGameCanStart(game: GameAggregate, userId?: string): void { - // Check if game is in waiting state - if (game.state !== GameState.WAITING) { - throw new Error('Game is not in waiting state and cannot be started'); - } - - // Check if game is already started - if (game.started) { - throw new Error('Game has already been started'); - } - - // Check if there are enough players (at least 2) - if (game.players.length < 2) { - throw new Error('Game needs at least 2 players to start'); - } - - // For private and organization games, check if user is game master - if (game.createdby && userId && game.createdby !== userId) { - throw new Error('Only the game master can start this game'); - } - - logOther('Game start validation passed', { - gameId: game.id, - gameCode: game.gamecode, - playerCount: game.players.length, - gameState: game.state, - isGameMaster: !game.createdby || (userId && game.createdby === userId) - }); - } - - private async initializeGamePlayInRedis(game: GameAggregate, boardData: BoardData): Promise { - try { - const redisKey = `gameplay:${game.id}`; - - // Generate random turn orders for all players - const playersWithPositions = this.initializePlayerPositions(game.players); - - // Sort by turn order to create turn sequence - const turnSequence = [...playersWithPositions] - .sort((a, b) => a.turnOrder - b.turnOrder) - .map(p => p.playerId); - - const gamePlayData: ActiveGamePlayData = { - gameId: game.id, - gameCode: game.gamecode, - hostId: game.createdby || undefined, - maxPlayers: game.maxplayers, - players: playersWithPositions, - state: GameState.ACTIVE, - createdAt: game.createdate, - startedAt: new Date(), - currentTurn: 0, // Start with first player in sequence - turnSequence, - websocketRoom: `game_${game.gamecode}`, - gamePhase: 'starting', - boardData - }; - - // Store game play data in Redis with TTL (24 hours) - await this.redisService.setWithExpiry(redisKey, JSON.stringify(gamePlayData), 24 * 60 * 60); - - // Create turn sequence mapping for quick lookups - await this.redisService.setWithExpiry( - `game_turns:${game.id}`, - JSON.stringify(turnSequence), - 24 * 60 * 60 - ); - - logOther('Game play initialized in Redis', { - gameId: game.id, - gameCode: game.gamecode, - playerCount: playersWithPositions.length, - turnSequence, - currentPlayer: turnSequence[0], - redisKey - }); - - } catch (error) { - logError('Failed to initialize game play in Redis', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to initialize game session'); - } - } - - private initializePlayerPositions(playerIds: string[]): GamePlayerPosition[] { - const players: GamePlayerPosition[] = []; - - // Generate random turn orders (1 to playerCount) - const turnOrders = this.generateRandomTurnOrders(playerIds.length); - - playerIds.forEach((playerId, index) => { - players.push({ - playerId, - position: 0, // All players start at position 0 - turnOrder: turnOrders[index], - isOnline: true, // Assume online when game starts - joinedAt: new Date() - }); - }); - - logOther('Player positions initialized', { - playerCount: players.length, - turnOrders: turnOrders, - playersData: players.map(p => ({ - playerId: p.playerId, - position: p.position, - turnOrder: p.turnOrder - })) - }); - - return players; - } - - private generateRandomTurnOrders(playerCount: number): number[] { - // Create array [1, 2, 3, ..., playerCount] - const orders = Array.from({ length: playerCount }, (_, i) => i + 1); - - // Fisher-Yates shuffle - for (let i = orders.length - 1; i > 0; i--) { - const j = Math.floor(Math.random() * (i + 1)); - [orders[i], orders[j]] = [orders[j], orders[i]]; - } - - return orders; - } - - private async notifyGameStart(game: GameAggregate): Promise { - try { - // Note: WebSocket notifications will be handled when WebSocket service is available - // For now, just log the game start - logOther('Game start notifications prepared', { - gameId: game.id, - gameCode: game.gamecode, - playerCount: game.players.length, - websocketRoom: `game_${game.gamecode}` - }); - - // TODO: Implement WebSocket notifications when service is properly integrated - // wsService.notifyGameStart(game.gamecode, game.players); - // wsService.broadcastGameStateUpdate(game.gamecode, gameStateData); - - } catch (error) { - logError('Failed to prepare game start notifications', error instanceof Error ? error : new Error(String(error))); - // Don't throw error here - notification failure shouldn't prevent game start - } - } - - async getGamePlayFromRedis(gameId: string): Promise { - try { - const redisKey = `gameplay:${gameId}`; - const data = await this.redisService.get(redisKey); - return data ? JSON.parse(data) as ActiveGamePlayData : null; - } catch (error) { - logError('Failed to get game play from Redis', error instanceof Error ? error : new Error(String(error))); - return null; - } - } - - async updatePlayerPosition(gameId: string, playerId: string, newPosition: number): Promise { - try { - const gameData = await this.getGamePlayFromRedis(gameId); - if (!gameData) { - throw new Error('Game session not found'); - } - - // Update player position - const player = gameData.players.find(p => p.playerId === playerId); - if (player) { - player.position = newPosition; - - // Save back to Redis - const redisKey = `gameplay:${gameId}`; - await this.redisService.setWithExpiry(redisKey, JSON.stringify(gameData), 24 * 60 * 60); - - logOther('Player position updated', { - gameId, - playerId, - newPosition - }); - } - } catch (error) { - logError('Failed to update player position', error instanceof Error ? error : new Error(String(error))); - throw error; - } - } - - async getNextPlayer(gameId: string): Promise { - try { - const gameData = await this.getGamePlayFromRedis(gameId); - if (!gameData) { - return null; - } - - const nextTurnIndex = (gameData.currentTurn + 1) % gameData.turnSequence.length; - return gameData.turnSequence[nextTurnIndex]; - } catch (error) { - logError('Failed to get next player', error instanceof Error ? error : new Error(String(error))); - return null; - } - } - - async advanceTurn(gameId: string): Promise { - try { - const gameData = await this.getGamePlayFromRedis(gameId); - if (!gameData) { - return null; - } - - // Advance to next player - gameData.currentTurn = (gameData.currentTurn + 1) % gameData.turnSequence.length; - const currentPlayer = gameData.turnSequence[gameData.currentTurn]; - - // Save back to Redis - const redisKey = `gameplay:${gameId}`; - await this.redisService.setWithExpiry(redisKey, JSON.stringify(gameData), 24 * 60 * 60); - - logOther('Turn advanced', { - gameId, - currentTurn: gameData.currentTurn, - currentPlayer - }); - - return currentPlayer; - } catch (error) { - logError('Failed to advance turn', error instanceof Error ? error : new Error(String(error))); - return null; - } - } - - private async waitForBoardGeneration(gameId: string): Promise { - const maxWaitTime = parseInt(process.env.MAX_GENERATION_TIME_SECONDS || '20') * 1000; - const pollInterval = 500; // Check every 500ms - const startTime = Date.now(); - - logOther(`Waiting for board generation for game ${gameId}`, { - maxWaitTime: maxWaitTime / 1000, - pollInterval, - redisKey: `game_board_${gameId}` - }); - - while (Date.now() - startTime < maxWaitTime) { - try { - const redisKey = `game_board_${gameId}`; - const boardDataStr = await this.redisService.get(redisKey); - - logOther(`Board generation check for game ${gameId}`, { - attempt: Math.floor((Date.now() - startTime) / pollInterval) + 1, - hasData: !!boardDataStr, - dataLength: boardDataStr ? boardDataStr.length : 0, - waitTime: Date.now() - startTime - }); - - if (boardDataStr) { - const boardData: BoardData = JSON.parse(boardDataStr); - - logOther(`Board data found for game ${gameId}`, { - generationComplete: boardData.generationComplete, - hasError: !!boardData.error, - fieldsCount: boardData.fields ? boardData.fields.length : 0, - borderLength: boardData.border ? boardData.border.length : 0, - totalErrorRate: boardData.totalErrorRate - }); - - if (boardData.generationComplete) { - if (boardData.error) { - logError(`Board generation failed for game ${gameId}`, new Error(boardData.error)); - throw new Error(`Board generation failed: ${boardData.error}`); - } - - logOther(`Board generation completed for game ${gameId}`, { - errorRate: boardData.totalErrorRate, - fieldCount: boardData.fields.length, - borderLength: boardData.border.length, - waitTime: Date.now() - startTime - }); - - return boardData; - } - } else { - // No board data found yet - check if we need to trigger generation - logOther(`No board data found yet for game ${gameId}, checking if generation was triggered...`, { - waitTime: Date.now() - startTime, - redisKey - }); - - // If we've waited for 2 seconds and still no data, try to trigger generation manually - if (Date.now() - startTime > 2000) { - await this.ensureBoardGenerationTriggered(gameId); - } - } - - // Wait before next poll - await new Promise(resolve => setTimeout(resolve, pollInterval)); - - } catch (error) { - logError(`Error checking board generation status for game ${gameId}`, error as Error); - throw new Error(`Failed to retrieve board data: ${error instanceof Error ? error.message : String(error)}`); - } - } - - // Timeout reached - logError(`Board generation timeout for game ${gameId}`, new Error(`Generation took longer than ${maxWaitTime / 1000} seconds`)); - throw new Error(`Board generation timeout. Game ${gameId} is not ready to start. Please try again later.`); - } - - private async ensureBoardGenerationTriggered(gameId: string): Promise { - try { - logOther(`Ensuring board generation is triggered for game ${gameId}`); - - // Check if generation was already triggered by looking for any board data - const redisKey = `game_board_${gameId}`; - const existingData = await this.redisService.get(redisKey); - - if (!existingData) { - // No data at all - trigger generation manually - logOther(`No board generation found for game ${gameId}, triggering manually`); - - // Use DIContainer to trigger board generation - const generateBoardCommand = { - gameId, - positiveFieldCount: Math.floor(67 * 0.6), // Default: 60% positive - negativeFieldCount: Math.floor(67 * 0.25), // Default: 25% negative - luckFieldCount: Math.floor(67 * 0.15) // Default: 15% luck - }; - - await DIContainer.getInstance().generateBoardCommandHandler.execute(generateBoardCommand); - logOther(`Board generation manually triggered for game ${gameId}`); - } - } catch (error) { - logError(`Failed to ensure board generation for game ${gameId}`, error as Error); - // Don't throw here - let the main wait loop handle the timeout - } - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Organization/commands/CreateOrganizationCommand.ts b/SerpentRace_Backend/src/Application/Organization/commands/CreateOrganizationCommand.ts deleted file mode 100644 index 8e0f95fc..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/CreateOrganizationCommand.ts +++ /dev/null @@ -1,8 +0,0 @@ -export interface CreateOrganizationCommand { - name: string; - contactfname: string; - contactlname: string; - contactphone: string; - contactemail: string; - url?: string; -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/CreateOrganizationCommandHandler.ts b/SerpentRace_Backend/src/Application/Organization/commands/CreateOrganizationCommandHandler.ts deleted file mode 100644 index d77ed9de..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/CreateOrganizationCommandHandler.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { CreateOrganizationCommand } from './CreateOrganizationCommand'; -import { ShortOrganizationDto } from '../../DTOs/OrganizationDto'; -import { OrganizationAggregate, OrganizationState } from '../../../Domain/Organization/OrganizationAggregate'; -import { OrganizationMapper } from '../../DTOs/Mappers/OrganizationMapper'; - -export class CreateOrganizationCommandHandler { - constructor(private readonly orgRepo: IOrganizationRepository) {} - - async execute(cmd: CreateOrganizationCommand): Promise { - try { - const org = new OrganizationAggregate(); - org.name = cmd.name; - org.contactfname = cmd.contactfname; - org.contactlname = cmd.contactlname; - org.contactphone = cmd.contactphone; - org.contactemail = cmd.contactemail; - org.url = cmd.url || null; - org.state = OrganizationState.REGISTERED; - - const created = await this.orgRepo.create(org); - return OrganizationMapper.toShortDto(created); - } catch (error) { - if (error instanceof Error) { - if (error.message.includes('duplicate key value violates unique constraint')) { - throw new Error('Organization with this name or contact email already exists'); - } - } - throw new Error('Failed to create organization'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/DeleteOrganizationCommand.ts b/SerpentRace_Backend/src/Application/Organization/commands/DeleteOrganizationCommand.ts deleted file mode 100644 index 60a31806..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/DeleteOrganizationCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DeleteOrganizationCommand { - id: string; - soft?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/DeleteOrganizationCommandHandler.ts b/SerpentRace_Backend/src/Application/Organization/commands/DeleteOrganizationCommandHandler.ts deleted file mode 100644 index a9e1b965..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/DeleteOrganizationCommandHandler.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { DeleteOrganizationCommand } from './DeleteOrganizationCommand'; - - -export class DeleteOrganizationCommandHandler { - constructor(private readonly orgRepo: IOrganizationRepository) {} - - async execute(cmd: DeleteOrganizationCommand): Promise { - if (cmd.soft) { - await this.orgRepo.softDelete(cmd.id); - } else { - await this.orgRepo.delete(cmd.id); - } - return true; - } -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/ProcessOrgAuthCallbackCommand.ts b/SerpentRace_Backend/src/Application/Organization/commands/ProcessOrgAuthCallbackCommand.ts deleted file mode 100644 index 6fa97b73..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/ProcessOrgAuthCallbackCommand.ts +++ /dev/null @@ -1,6 +0,0 @@ -export interface ProcessOrgAuthCallbackCommand { - organizationId: string; - userId: string; - status: 'ok' | 'not_ok'; - authToken?: string; -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/ProcessOrgAuthCallbackCommandHandler.ts b/SerpentRace_Backend/src/Application/Organization/commands/ProcessOrgAuthCallbackCommandHandler.ts deleted file mode 100644 index 39a41abe..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/ProcessOrgAuthCallbackCommandHandler.ts +++ /dev/null @@ -1,123 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { ProcessOrgAuthCallbackCommand } from './ProcessOrgAuthCallbackCommand'; -import { logAuth, logDatabase, logError, logWarning } from '../../Services/Logger'; - -export interface ProcessOrgAuthCallbackResponse { - success: boolean; - message: string; - updatedFields?: string[]; -} - -export class ProcessOrgAuthCallbackCommandHandler { - constructor( - private readonly userRepo: IUserRepository, - private readonly orgRepo: IOrganizationRepository - ) {} - - async execute(cmd: ProcessOrgAuthCallbackCommand): Promise { - const startTime = Date.now(); - - try { - logAuth('Processing organization authentication callback', cmd.userId, { - organizationId: cmd.organizationId, - status: cmd.status, - hasAuthToken: !!cmd.authToken - }); - - // Verify organization exists - const organization = await this.orgRepo.findById(cmd.organizationId); - if (!organization) { - logWarning('Organization not found for auth callback', { - organizationId: cmd.organizationId, - userId: cmd.userId - }); - return { - success: false, - message: 'Organization not found' - }; - } - - // Verify user exists - const user = await this.userRepo.findById(cmd.userId); - if (!user) { - logWarning('User not found for auth callback', { - organizationId: cmd.organizationId, - userId: cmd.userId - }); - return { - success: false, - message: 'User not found' - }; - } - - // Verify user belongs to the organization - if (user.orgid !== cmd.organizationId) { - logWarning('User does not belong to organization for auth callback', { - organizationId: cmd.organizationId, - userId: cmd.userId, - userOrgId: user.orgid - }); - return { - success: false, - message: 'User does not belong to this organization' - }; - } - - if (cmd.status === 'not_ok') { - logAuth('Organization authentication failed', cmd.userId, { - organizationId: cmd.organizationId, - organizationName: organization.name - }); - return { - success: false, - message: 'Organization authentication failed' - }; - } - - // Update user's organization login date - const now = new Date(); - const updatedUser = await this.userRepo.update(cmd.userId, { - Orglogindate: now - }); - - if (!updatedUser) { - logError('Failed to update user organization login date', new Error('User update returned null')); - return { - success: false, - message: 'Failed to update user login information' - }; - } - - logAuth('Organization authentication successful', cmd.userId, { - organizationId: cmd.organizationId, - organizationName: organization.name, - orgLoginDate: now.toISOString(), - executionTime: Date.now() - startTime - }); - - logDatabase('User organization login date updated', - `userId: ${cmd.userId}, orgId: ${cmd.organizationId}`, - Date.now() - startTime, - { - userId: cmd.userId, - organizationId: cmd.organizationId, - newOrgLoginDate: now.toISOString() - } - ); - - return { - success: true, - message: 'Organization authentication successful', - updatedFields: ['Orglogindate'] - }; - - } catch (error) { - logError('ProcessOrgAuthCallbackCommandHandler error', error as Error); - return { - success: false, - message: 'Internal error processing authentication callback' - }; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/UpdateOrganizationCommand.ts b/SerpentRace_Backend/src/Application/Organization/commands/UpdateOrganizationCommand.ts deleted file mode 100644 index 040f893d..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/UpdateOrganizationCommand.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { OrganizationStateType } from '../../../Domain/Organization/OrganizationAggregate'; - -export interface UpdateOrganizationCommand { - id: string; - name?: string; - contactfname?: string; - contactlname?: string; - contactphone?: string; - contactemail?: string; - url?: string; - state?: OrganizationStateType; - userinorg?: number; - maxOrganizationalDecks?: number | null; -} diff --git a/SerpentRace_Backend/src/Application/Organization/commands/UpdateOrganizationCommandHandler.ts b/SerpentRace_Backend/src/Application/Organization/commands/UpdateOrganizationCommandHandler.ts deleted file mode 100644 index 32a145a8..00000000 --- a/SerpentRace_Backend/src/Application/Organization/commands/UpdateOrganizationCommandHandler.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { UpdateOrganizationCommand } from './UpdateOrganizationCommand'; - -import { ShortOrganizationDto } from '../../DTOs/OrganizationDto'; -import { OrganizationMapper } from '../../DTOs/Mappers/OrganizationMapper'; - -export class UpdateOrganizationCommandHandler { - constructor(private readonly orgRepo: IOrganizationRepository) {} - - async execute(cmd: UpdateOrganizationCommand): Promise { - const updated = await this.orgRepo.update(cmd.id, { ...cmd }); - if (!updated) return null; - return OrganizationMapper.toShortDto(updated); - } -} diff --git a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationByIdQuery.ts b/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationByIdQuery.ts deleted file mode 100644 index e8473c15..00000000 --- a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationByIdQuery.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface GetOrganizationByIdQuery { - id: string; -} diff --git a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationByIdQueryHandler.ts b/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationByIdQueryHandler.ts deleted file mode 100644 index 60c82768..00000000 --- a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationByIdQueryHandler.ts +++ /dev/null @@ -1,15 +0,0 @@ -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { GetOrganizationByIdQuery } from './GetOrganizationByIdQuery'; - -import { ShortOrganizationDto } from '../../DTOs/OrganizationDto'; -import { OrganizationMapper } from '../../DTOs/Mappers/OrganizationMapper'; - -export class GetOrganizationByIdQueryHandler { - constructor(private readonly orgRepo: IOrganizationRepository) {} - - async execute(query: GetOrganizationByIdQuery): Promise { - const org = await this.orgRepo.findById(query.id); - if (!org) return null; - return OrganizationMapper.toShortDto(org); - } -} diff --git a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationLoginUrlQuery.ts b/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationLoginUrlQuery.ts deleted file mode 100644 index 26370b47..00000000 --- a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationLoginUrlQuery.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface GetOrganizationLoginUrlQuery { - organizationId: string; -} diff --git a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationLoginUrlQueryHandler.ts b/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationLoginUrlQueryHandler.ts deleted file mode 100644 index f7de9707..00000000 --- a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationLoginUrlQueryHandler.ts +++ /dev/null @@ -1,56 +0,0 @@ -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { GetOrganizationLoginUrlQuery } from './GetOrganizationLoginUrlQuery'; -import { OrganizationLoginUrlDto } from '../../DTOs/OrganizationDto'; -import { logDatabase, logError, logWarning } from '../../Services/Logger'; - -export class GetOrganizationLoginUrlQueryHandler { - constructor(private readonly orgRepo: IOrganizationRepository) {} - - async execute(query: GetOrganizationLoginUrlQuery): Promise { - const startTime = Date.now(); - - try { - logDatabase('Getting organization login URL', `organizationId: ${query.organizationId}`, 0, { - organizationId: query.organizationId - }); - - const organization = await this.orgRepo.findById(query.organizationId); - - if (!organization) { - logWarning('Organization not found for login URL request', { - organizationId: query.organizationId - }); - return null; - } - - if (!organization.url) { - logWarning('Organization has no configured login URL', { - organizationId: query.organizationId, - organizationName: organization.name - }); - return null; - } - - const result: OrganizationLoginUrlDto = { - organizationId: organization.id, - organizationName: organization.name, - loginUrl: organization.url - }; - - logDatabase('Organization login URL retrieved successfully', - `organizationId: ${query.organizationId}`, - Date.now() - startTime, - { - organizationId: organization.id, - organizationName: organization.name, - hasUrl: !!organization.url - } - ); - - return result; - } catch (error) { - logError('GetOrganizationLoginUrlQueryHandler error', error as Error); - throw new Error('Failed to retrieve organization login URL'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationsByPageQuery.ts b/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationsByPageQuery.ts deleted file mode 100644 index ec22eb96..00000000 --- a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationsByPageQuery.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface GetOrganizationsByPageQuery { - from: number; - to: number; - includeDeleted?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationsByPageQueryHandler.ts b/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationsByPageQueryHandler.ts deleted file mode 100644 index b838d81f..00000000 --- a/SerpentRace_Backend/src/Application/Organization/queries/GetOrganizationsByPageQueryHandler.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { GetOrganizationsByPageQuery } from './GetOrganizationsByPageQuery'; -import { ShortOrganizationDto } from '../../DTOs/OrganizationDto'; -import { OrganizationMapper } from '../../DTOs/Mappers/OrganizationMapper'; -import { logError, logRequest } from '../../Services/Logger'; - -export class GetOrganizationsByPageQueryHandler { - constructor(private readonly orgRepo: IOrganizationRepository) {} - - async execute(query: GetOrganizationsByPageQuery): Promise<{ organizations: ShortOrganizationDto[], totalCount: number }> { - try { - // Validate pagination parameters - if (query.from < 0 || query.to < query.from) { - throw new Error('Invalid pagination parameters'); - } - - const limit = query.to - query.from + 1; - if (limit > 100) { - throw new Error('Page size too large. Maximum 100 records per request'); - } - - logRequest('Get organizations by page query started', undefined, undefined, { - from: query.from, - to: query.to, - includeDeleted: query.includeDeleted || false - }); - - const result = query.includeDeleted - ? await this.orgRepo.findByPageIncludingDeleted(query.from, query.to) - : await this.orgRepo.findByPage(query.from, query.to); - - logRequest('Get organizations by page query completed', undefined, undefined, { - from: query.from, - to: query.to, - returned: result.organizations.length, - totalCount: result.totalCount, - includeDeleted: query.includeDeleted || false - }); - - return { - organizations: OrganizationMapper.toShortDtoList(result.organizations), - totalCount: result.totalCount - }; - } catch (error) { - logError('GetOrganizationsByPageQueryHandler error', error instanceof Error ? error : new Error(String(error))); - - // Handle database errors - if (error instanceof Error && error.message.includes('database')) { - throw new Error('Database connection error'); - } - - // Re-throw validation errors as-is - if (error instanceof Error && (error.message.includes('Invalid pagination') || error.message.includes('Page size'))) { - throw error; - } - - throw new Error('Failed to retrieve organizations'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/Search/Generalsearch.ts b/SerpentRace_Backend/src/Application/Search/Generalsearch.ts deleted file mode 100644 index 0d940191..00000000 --- a/SerpentRace_Backend/src/Application/Search/Generalsearch.ts +++ /dev/null @@ -1,156 +0,0 @@ -import { IUserRepository } from '../../Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../../Domain/IRepository/IOrganizationRepository'; -import { IDeckRepository } from '../../Domain/IRepository/IDeckRepository'; -import { SearchQuery, SearchResult } from '../DTOs/SearchDto'; -import { ShortUserDto, DetailUserDto } from '../DTOs/UserDto'; -import { ShortOrganizationDto, DetailOrganizationDto } from '../DTOs/OrganizationDto'; -import { ShortDeckDto, DetailDeckDto } from '../DTOs/DeckDto'; -import { UserMapper } from '../DTOs/Mappers/UserMapper'; -import { OrganizationMapper } from '../DTOs/Mappers/OrganizationMapper'; -import { DeckMapper } from '../DTOs/Mappers/DeckMapper'; - -export type SearchType = 'users' | 'organizations' | 'decks'; - -export interface IGeneralSearchService { - searchUsers(searchQuery: SearchQuery): Promise>; - searchOrganizations(searchQuery: SearchQuery): Promise>; - searchDecks(searchQuery: SearchQuery): Promise>; - searchByType(searchType: SearchType, searchQuery: SearchQuery): Promise>; -} - -export class GeneralSearchService implements IGeneralSearchService { - constructor( - private userRepo: IUserRepository, - private organizationRepo: IOrganizationRepository, - private deckRepo: IDeckRepository - ) {} - - static getSearchTypeFromUrl(url: string): SearchType { - if (url.includes('/users/') || url.includes('/api/users/')) { - return 'users'; - } else if (url.includes('/organizations/') || url.includes('/api/organizations/')) { - return 'organizations'; - } else if (url.includes('/decks/') || url.includes('/api/decks/')) { - return 'decks'; - } - return 'users'; - } - - async searchUsers(searchQuery: SearchQuery): Promise> { - const { query, limit = 20, offset = 0 } = searchQuery; - - if (!query || query.trim().length === 0) { - return { - results: [], - totalCount: 0, - hasMore: false, - searchQuery: query, - searchType: 'users' - }; - } - - // Ensure limit is at least 1 to prevent database issues - const effectiveLimit = Math.max(limit || 20, 1); - const effectiveOffset = Math.max(offset || 0, 0); - - try { - const { users, totalCount } = await this.userRepo.search(query.trim(), effectiveLimit, effectiveOffset); - const results = users.map(user => UserMapper.toShortDto(user)); - const hasMore = (effectiveOffset + effectiveLimit) < totalCount; - - return { - results, - totalCount, - hasMore, - searchQuery: query, - searchType: 'users' - }; - } catch (error) { - throw new Error('Failed to search users'); - } - } - - async searchOrganizations(searchQuery: SearchQuery): Promise> { - const { query, limit = 20, offset = 0 } = searchQuery; - - if (!query || query.trim().length === 0) { - return { - results: [], - totalCount: 0, - hasMore: false, - searchQuery: query, - searchType: 'organizations' - }; - } - - const { organizations, totalCount } = await this.organizationRepo.search(query.trim(), limit, offset); - const results = organizations.map(org => OrganizationMapper.toShortDto(org)); - const hasMore = (offset + limit) < totalCount; - - return { - results, - totalCount, - hasMore, - searchQuery: query, - searchType: 'organizations' - }; - } - - async searchDecks(searchQuery: SearchQuery): Promise> { - const { query, limit = 20, offset = 0 } = searchQuery; - - if (!query || query.trim().length === 0) { - return { - results: [], - totalCount: 0, - hasMore: false, - searchQuery: query, - searchType: 'decks' - }; - } - - // Ensure limit is at least 1 to prevent database issues - const effectiveLimit = Math.max(limit || 20, 1); - const effectiveOffset = Math.max(offset || 0, 0); - - try { - const { decks, totalCount } = await this.deckRepo.search(query.trim(), effectiveLimit, effectiveOffset); - const results = decks.map(deck => DeckMapper.toShortDto(deck)); - const hasMore = (effectiveOffset + effectiveLimit) < totalCount; - - return { - results, - totalCount, - hasMore, - searchQuery: query, - searchType: 'decks' - }; - } catch (error) { - throw new Error('Failed to search decks'); - } - } - - async searchByType( - searchType: SearchType, - searchQuery: SearchQuery - ): Promise> { - switch (searchType) { - case 'users': - return await this.searchUsers(searchQuery) as SearchResult; - case 'organizations': - return await this.searchOrganizations(searchQuery) as SearchResult; - case 'decks': - return await this.searchDecks(searchQuery) as SearchResult; - default: - throw new Error(`Unsupported search type: ${searchType}`); - } - } - - async searchFromUrl( - url: string, - searchQuery: SearchQuery - ): Promise> { - const searchType = GeneralSearchService.getSearchTypeFromUrl(url); - return await this.searchByType(searchType, searchQuery); - } -} diff --git a/SerpentRace_Backend/src/Application/Services/AdminBypassService.ts b/SerpentRace_Backend/src/Application/Services/AdminBypassService.ts deleted file mode 100644 index 6732c15f..00000000 --- a/SerpentRace_Backend/src/Application/Services/AdminBypassService.ts +++ /dev/null @@ -1,131 +0,0 @@ -import { UserState } from '../../Domain/User/UserAggregate'; -import { logAuth } from './Logger'; -import { Request, Response } from 'express'; - -/** - * Admin Bypass Service - Centralized admin privilege checking and logging - */ -export class AdminBypassService { - /** - * Check if user has admin privileges - * @param userState - User's current state - * @returns true if user is admin - */ - static isAdmin(userState: UserState): boolean { - return userState === UserState.ADMIN; - } - - /** - * Check if user should bypass all restrictions - * @param userState - User's current state - * @returns true if restrictions should be bypassed - */ - static shouldBypassRestrictions(userState: UserState): boolean { - return this.isAdmin(userState); - } - - /** - * Log admin bypass action for audit trail - * @param action - Description of the action being bypassed - * @param adminUserId - ID of the admin user - * @param targetId - ID of the target resource - * @param details - Additional details about the bypass - * @param req - Optional request object for context - * @param res - Optional response object for context - */ - static logAdminBypass( - action: string, - adminUserId: string, - targetId: string, - details?: any, - req?: Request, - res?: Response - ): void { - logAuth(`ADMIN_BYPASS: ${action}`, adminUserId, { - targetId, - action, - bypassReason: 'Admin privileges', - timestamp: new Date().toISOString(), - ...details - }, req, res); - } -} - -/** - * Admin Audit Service - Enhanced logging for all admin actions - */ -export class AdminAuditService { - /** - * Log comprehensive admin action for audit trail - * @param action - Action being performed - * @param adminUserId - ID of the admin user - * @param details - Detailed information about the action - * @param req - Request object for context - * @param res - Response object for context - */ - static logAdminAction( - action: string, - adminUserId: string, - details: { - targetType: 'user' | 'organization' | 'deck' | 'contact' | 'chat'; - targetId: string; - operation: 'create' | 'read' | 'update' | 'delete' | 'bypass' | 'export' | 'import'; - changes?: any; - sensitive?: boolean; - metadata?: any; - }, - req?: Request, - res?: Response - ): void { - - const auditData = { - timestamp: new Date().toISOString(), - adminUserId, - action, - ...details, - ip: req?.ip, - userAgent: req?.get('User-Agent'), - endpoint: req?.path, - method: req?.method, - requestId: req?.headers['x-request-id'] || 'unknown' - }; - - // Enhanced logging for admin actions - logAuth(`ADMIN_AUDIT: ${action}`, adminUserId, auditData, req, res); - - // Additional security logging for sensitive operations - if (details.sensitive) { - logAuth(`ADMIN_SENSITIVE: ${action}`, adminUserId, { - ...auditData, - alertLevel: 'HIGH', - requiresReview: true - }, req, res); - } - } - - /** - * Log bulk admin operations - * @param action - Bulk action being performed - * @param adminUserId - ID of the admin user - * @param affectedCount - Number of resources affected - * @param targetType - Type of resources affected - * @param req - Request object for context - * @param res - Response object for context - */ - static logBulkAdminAction( - action: string, - adminUserId: string, - affectedCount: number, - targetType: string, - req?: Request, - res?: Response - ): void { - this.logAdminAction(`BULK_${action}`, adminUserId, { - targetType: targetType as any, - targetId: `bulk-${affectedCount}-items`, - operation: 'update' as any, - metadata: { affectedCount }, - sensitive: affectedCount > 10 // Mark large bulk operations as sensitive - }, req, res); - } -} diff --git a/SerpentRace_Backend/src/Application/Services/AuthMiddleware.ts b/SerpentRace_Backend/src/Application/Services/AuthMiddleware.ts deleted file mode 100644 index 0bc84dcc..00000000 --- a/SerpentRace_Backend/src/Application/Services/AuthMiddleware.ts +++ /dev/null @@ -1,146 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import { JWTService } from './JWTService'; -import { RedisService } from './RedisService'; -import { logAuth, logWarning } from './Logger'; - -export const jwtService = new JWTService(); -const redisService = RedisService.getInstance(); - -/** - * Check if a token is blacklisted - */ -async function isTokenBlacklisted(token: string): Promise { - try { - const result = await redisService.get(`blacklist:${token}`); - return result === 'true'; - } catch (error) { - // If Redis is down, allow the request to proceed (fail open) - logWarning('Failed to check token blacklist - allowing request', { error: (error as Error).message }); - return false; - } -} - -/** - * Extract token from request (cookie or Authorization header) - */ -function extractToken(req: Request): string | null { - // First try to get token from cookie - const cookieToken = req.cookies['auth_token']; - if (cookieToken) { - return cookieToken; - } - - // Fallback to Authorization header - const authHeader = req.headers.authorization; - if (authHeader && authHeader.startsWith('Bearer ')) { - return authHeader.substring(7); - } - - return null; -} - -export async function authRequired(req: Request, res: Response, next: NextFunction) { - try { - // Extract token from request - const token = extractToken(req); - if (!token) { - logAuth('Authentication failed - No token provided', undefined, { - ip: req.ip, - userAgent: req.get ? req.get('User-Agent') : 'unknown', - path: req.path - }, req); - return res.status(401).json({ error: 'Unauthorized' }); - } - - // Check if token is blacklisted - const isBlacklisted = await isTokenBlacklisted(token); - if (isBlacklisted) { - logAuth('Authentication failed - Token blacklisted', undefined, { - ip: req.ip, - userAgent: req.get ? req.get('User-Agent') : 'unknown', - path: req.path - }, req); - return res.status(401).json({ error: 'Token has been invalidated' }); - } - - // Verify token - const payload = jwtService.verify(req); - if (!payload) { - logAuth('Authentication failed - Invalid token', undefined, { - ip: req.ip, - userAgent: req.get ? req.get('User-Agent') : 'unknown', - path: req.path - }, req); - return res.status(401).json({ error: 'Unauthorized' }); - } - - logAuth('Authentication successful', payload.userId, { - authLevel: payload.authLevel, - orgId: payload.orgId - }, req); - - const refreshed = jwtService.refreshIfNeeded(payload, res); - if (refreshed) { - logAuth('Token refreshed', payload.userId, undefined, req); - } - - (req as any).user = payload; - next(); - } catch (error) { - logWarning('Authentication middleware error', { error: (error as Error).message }, req); - return res.status(500).json({ error: 'Internal server error' }); - } -} - -export async function adminRequired(req: Request, res: Response, next: NextFunction) { - try { - // Extract token from request - const token = extractToken(req); - if (!token) { - logWarning('Admin access denied - No token provided', { - ip: req.ip, - path: req.path - }, req); - return res.status(401).json({ error: 'Unauthorized' }); - } - - // Check if token is blacklisted - const isBlacklisted = await isTokenBlacklisted(token); - if (isBlacklisted) { - logWarning('Admin access denied - Token blacklisted', { - ip: req.ip, - path: req.path - }, req); - return res.status(401).json({ error: 'Token has been invalidated' }); - } - - // Verify token and check admin privileges - const payload = jwtService.verify(req); - if (!payload || payload.authLevel !== 1) { - logWarning('Admin access denied', { - hasPayload: !!payload, - authLevel: payload?.authLevel, - userId: payload?.userId, - ip: req.ip, - path: req.path - }, req); - return res.status(403).json({ error: 'Forbidden' }); - } - - logAuth('Admin authentication successful', payload.userId, { - authLevel: payload.authLevel, - orgId: payload.orgId - }, req); - - const refreshed = jwtService.refreshIfNeeded(payload, res); - if (refreshed) { - logAuth('Admin token refreshed', payload.userId, undefined, req); - } - - (req as any).user = payload; - next(); - } catch (error) { - logWarning('Admin authentication middleware error', { error: (error as Error).message }, req); - return res.status(500).json({ error: 'Internal server error' }); - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Services/ContactEmailService.ts b/SerpentRace_Backend/src/Application/Services/ContactEmailService.ts deleted file mode 100644 index 7258dbd1..00000000 --- a/SerpentRace_Backend/src/Application/Services/ContactEmailService.ts +++ /dev/null @@ -1,134 +0,0 @@ -import { IContactRepository } from '../../Domain/IRepository/IContactRepository'; -import { EmailService } from './EmailService'; -import { ContactType } from '../../Domain/Contact/ContactAggregate'; -import { logOther, logError } from './Logger'; -import { EmailTemplateHelper, LocalizedSubjects } from './EmailTemplateHelper'; - -export interface EmailResponseData { - to: string; - message: string; - contactId: string; - adminUserId: string; - contactName: string; - contactType: ContactType; - originalMessage: string; - language?: 'en' | 'hu' | 'de'; // Default to 'en' if not specified -} - -export class ContactEmailService { - private emailService: EmailService; - - constructor(private readonly contactRepo: IContactRepository) { - this.emailService = new EmailService(); - } - - async sendResponse(responseData: EmailResponseData): Promise { - try { - // First update the contact with the response - await this.contactRepo.update(responseData.contactId, { - adminResponse: responseData.message, - responseDate: new Date(), - respondedBy: responseData.adminUserId, - }); - - // Determine language and template - const language = responseData.language || 'en'; - const templateName = language === 'en' ? 'contact-response' : `contact-response-${language}`; - - // Prepare template data - const templateData = { - contactName: responseData.contactName, - contactTypeString: this.getContactTypeString(responseData.contactType, language), - contactTypeBadge: this.getContactTypeBadge(responseData.contactType), - originalMessage: responseData.originalMessage, - adminResponse: responseData.message, - companyName: 'SerpentRace', - supportEmail: 'support@serpentrace.com' - }; - - // Send email using EmailService with template - const emailSent = await this.emailService.sendEmail({ - to: responseData.to, - subject: this.getLocalizedContactResponseSubject(language), - template: templateName, - templateData - }); - - if (emailSent) { - logOther('Contact response email sent successfully', { - to: responseData.to, - subject: this.getLocalizedContactResponseSubject(language), - contactId: responseData.contactId, - respondedBy: responseData.adminUserId, - language - }); - } else { - throw new Error('Email service failed to send email'); - } - - } catch (error) { - logError('Failed to send contact response email', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to send email response'); - } - } - - private getLocalizedContactResponseSubject(language: 'en' | 'hu' | 'de'): string { - const subjects: LocalizedSubjects = { - contactResponse: { - en: 'SerpentRace - Response to Your Message', - hu: 'SerpentRace - Válasz az üzenetére', - de: 'SerpentRace - Antwort auf Ihre Nachricht' - } - }; - return EmailTemplateHelper.getLocalizedSubject('contactResponse', subjects, language); - } - - private getContactTypeString(type: ContactType, language: 'en' | 'hu' | 'de' = 'en'): string { - const translations = { - [ContactType.BUG]: { - en: 'Bug Report', - hu: 'Hiba bejelentés', - de: 'Fehlerbericht' - }, - [ContactType.PROBLEM]: { - en: 'Problem', - hu: 'Probléma', - de: 'Problem' - }, - [ContactType.QUESTION]: { - en: 'Question', - hu: 'Kérdés', - de: 'Frage' - }, - [ContactType.SALES]: { - en: 'Sales Inquiry', - hu: 'Értékesítési kérdés', - de: 'Verkaufsanfrage' - }, - [ContactType.OTHER]: { - en: 'General Inquiry', - hu: 'Általános kérdés', - de: 'Allgemeine Anfrage' - } - }; - - return translations[type]?.[language] || translations[type]?.['en'] || 'Contact'; - } - - private getContactTypeBadge(type: ContactType): string { - switch (type) { - case ContactType.BUG: - return 'bug'; - case ContactType.PROBLEM: - return 'problem'; - case ContactType.QUESTION: - return 'question'; - case ContactType.SALES: - return 'sales'; - case ContactType.OTHER: - return 'other'; - default: - return 'other'; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Services/DIContainer.ts b/SerpentRace_Backend/src/Application/Services/DIContainer.ts deleted file mode 100644 index d2d09527..00000000 --- a/SerpentRace_Backend/src/Application/Services/DIContainer.ts +++ /dev/null @@ -1,493 +0,0 @@ -// Repository Interfaces -import { IUserRepository } from '../../Domain/IRepository/IUserRepository'; -import { IChatRepository } from '../../Domain/IRepository/IChatRepository'; -import { IChatArchiveRepository } from '../../Domain/IRepository/IChatArchiveRepository'; -import { IDeckRepository } from '../../Domain/IRepository/IDeckRepository'; -import { IOrganizationRepository } from '../../Domain/IRepository/IOrganizationRepository'; -import { IContactRepository } from '../../Domain/IRepository/IContactRepository'; -import { IGameRepository } from '../../Domain/IRepository/IGameRepository'; - -// Repository Implementations -import { UserRepository } from '../../Infrastructure/Repository/UserRepository'; -import { ChatRepository } from '../../Infrastructure/Repository/ChatRepository'; -import { ChatArchiveRepository } from '../../Infrastructure/Repository/ChatArchiveRepository'; -import { DeckRepository } from '../../Infrastructure/Repository/DeckRepository'; -import { OrganizationRepository } from '../../Infrastructure/Repository/OrganizationRepository'; -import { ContactRepository } from '../../Infrastructure/Repository/ContactRepository'; -import { GameRepository } from '../../Infrastructure/Repository/GameRepository'; - -// Command Handlers -import { CreateUserCommandHandler } from '../User/commands/CreateUserCommandHandler'; -import { LoginCommandHandler } from '../User/commands/LoginCommandHandler'; -import { LogoutCommandHandler } from '../User/commands/LogoutCommandHandler'; -import { UpdateUserCommandHandler } from '../User/commands/UpdateUserCommandHandler'; -import { DeactivateUserCommandHandler } from '../User/commands/DeactivateUserCommandHandler'; -import { DeleteUserCommandHandler } from '../User/commands/DeleteUserCommandHandler'; -import { VerifyEmailCommandHandler } from '../User/commands/VerifyEmailCommandHandler'; -import { RequestPasswordResetCommandHandler } from '../User/commands/RequestPasswordResetCommandHandler'; -import { ResetPasswordCommandHandler } from '../User/commands/ResetPasswordCommandHandler'; -import { CreateChatCommandHandler } from '../Chat/commands/CreateChatCommandHandler'; -import { SendMessageCommandHandler } from '../Chat/commands/SendMessageCommandHandler'; -import { ArchiveChatCommandHandler, RestoreChatCommandHandler } from '../Chat/commands/ChatArchiveCommandHandlers'; -import { CreateDeckCommandHandler } from '../Deck/commands/CreateDeckCommandHandler'; -import { UpdateDeckCommandHandler } from '../Deck/commands/UpdateDeckCommandHandler'; -import { DeleteDeckCommandHandler } from '../Deck/commands/DeleteDeckCommandHandler'; -import { CreateOrganizationCommandHandler } from '../Organization/commands/CreateOrganizationCommandHandler'; -import { UpdateOrganizationCommandHandler } from '../Organization/commands/UpdateOrganizationCommandHandler'; -import { DeleteOrganizationCommandHandler } from '../Organization/commands/DeleteOrganizationCommandHandler'; -import { ProcessOrgAuthCallbackCommandHandler } from '../Organization/commands/ProcessOrgAuthCallbackCommandHandler'; -import { CreateContactCommandHandler } from '../Contact/commands/CreateContactCommandHandler'; -import { UpdateContactCommandHandler } from '../Contact/commands/UpdateContactCommandHandler'; -import { DeleteContactCommandHandler } from '../Contact/commands/DeleteContactCommandHandler'; - -// Query Handlers -import { GetUserByIdQueryHandler } from '../User/queries/GetUserByIdQueryHandler'; -import { GetUsersByPageQueryHandler } from '../User/queries/GetUsersByPageQueryHandler'; -import { GetUserChatsQueryHandler } from '../Chat/queries/GetUserChatsQueryHandler'; -import { GetChatHistoryQueryHandler, GetArchivedChatsQueryHandler } from '../Chat/queries/ChatHistoryQueryHandlers'; -import { GetChatsByPageQueryHandler } from '../Chat/queries/GetChatsByPageQueryHandler'; -import { GetDeckByIdQueryHandler } from '../Deck/queries/GetDeckByIdQueryHandler'; -import { GetDecksByPageQueryHandler } from '../Deck/queries/GetDecksByPageQueryHandler'; -import { GetOrganizationByIdQueryHandler } from '../Organization/queries/GetOrganizationByIdQueryHandler'; -import { GetOrganizationsByPageQueryHandler } from '../Organization/queries/GetOrganizationsByPageQueryHandler'; -import { GetOrganizationLoginUrlQueryHandler } from '../Organization/queries/GetOrganizationLoginUrlQueryHandler'; -import { GetContactByIdQueryHandler } from '../Contact/queries/GetContactByIdQueryHandler'; -import { GetContactsByPageQueryHandler } from '../Contact/queries/GetContactsByPageQueryHandler'; - -// Services -import { JWTService } from './JWTService'; -import { ContactEmailService } from './ContactEmailService'; -import { DeckImportExportService } from './DeckImportExportService'; -import { RedisService } from './RedisService'; -import { GameService } from '../Game/GameService'; -import { BoardGenerationService } from '../Game/BoardGenerationService'; -import { GenerateBoardCommandHandler } from '../Game/commands/GenerateBoardCommandHandler'; - -/** - * Central Dependency Injection Container - * Manages all repositories, command handlers, and query handlers as singletons - */ -export class DIContainer { - private static instance: DIContainer; - - // Repositories - Using interfaces for better abstraction - private _userRepository: IUserRepository | null = null; - private _chatRepository: IChatRepository | null = null; - private _chatArchiveRepository: IChatArchiveRepository | null = null; - private _deckRepository: IDeckRepository | null = null; - private _organizationRepository: IOrganizationRepository | null = null; - private _contactRepository: IContactRepository | null = null; - private _gameRepository: IGameRepository | null = null; - - // Services - private _jwtService: JWTService | null = null; - private _contactEmailService: ContactEmailService | null = null; - private _deckImportExportService: DeckImportExportService | null = null; - private _gameService: GameService | null = null; - private _boardGenerationService: BoardGenerationService | null = null; - - // Command Handlers - private _createUserCommandHandler: CreateUserCommandHandler | null = null; - private _loginCommandHandler: LoginCommandHandler | null = null; - private _logoutCommandHandler: LogoutCommandHandler | null = null; - private _updateUserCommandHandler: UpdateUserCommandHandler | null = null; - private _deactivateUserCommandHandler: DeactivateUserCommandHandler | null = null; - private _deleteUserCommandHandler: DeleteUserCommandHandler | null = null; - private _verifyEmailCommandHandler: VerifyEmailCommandHandler | null = null; - private _requestPasswordResetCommandHandler: RequestPasswordResetCommandHandler | null = null; - private _resetPasswordCommandHandler: ResetPasswordCommandHandler | null = null; - private _createChatCommandHandler: CreateChatCommandHandler | null = null; - private _sendMessageCommandHandler: SendMessageCommandHandler | null = null; - private _archiveChatCommandHandler: ArchiveChatCommandHandler | null = null; - private _restoreChatCommandHandler: RestoreChatCommandHandler | null = null; - private _createDeckCommandHandler: CreateDeckCommandHandler | null = null; - private _updateDeckCommandHandler: UpdateDeckCommandHandler | null = null; - private _deleteDeckCommandHandler: DeleteDeckCommandHandler | null = null; - private _createOrganizationCommandHandler: CreateOrganizationCommandHandler | null = null; - private _updateOrganizationCommandHandler: UpdateOrganizationCommandHandler | null = null; - private _deleteOrganizationCommandHandler: DeleteOrganizationCommandHandler | null = null; - private _processOrgAuthCallbackCommandHandler: ProcessOrgAuthCallbackCommandHandler | null = null; - private _createContactCommandHandler: CreateContactCommandHandler | null = null; - private _updateContactCommandHandler: UpdateContactCommandHandler | null = null; - private _deleteContactCommandHandler: DeleteContactCommandHandler | null = null; - private _generateBoardCommandHandler: GenerateBoardCommandHandler | null = null; - - // Query Handlers - private _getUserByIdQueryHandler: GetUserByIdQueryHandler | null = null; - private _getUsersByPageQueryHandler: GetUsersByPageQueryHandler | null = null; - private _getUserChatsQueryHandler: GetUserChatsQueryHandler | null = null; - private _getChatHistoryQueryHandler: GetChatHistoryQueryHandler | null = null; - private _getArchivedChatsQueryHandler: GetArchivedChatsQueryHandler | null = null; - private _getChatsByPageQueryHandler: GetChatsByPageQueryHandler | null = null; - private _getDeckByIdQueryHandler: GetDeckByIdQueryHandler | null = null; - private _getDecksByPageQueryHandler: GetDecksByPageQueryHandler | null = null; - private _getOrganizationByIdQueryHandler: GetOrganizationByIdQueryHandler | null = null; - private _getOrganizationsByPageQueryHandler: GetOrganizationsByPageQueryHandler | null = null; - private _getOrganizationLoginUrlQueryHandler: GetOrganizationLoginUrlQueryHandler | null = null; - private _getContactByIdQueryHandler: GetContactByIdQueryHandler | null = null; - private _getContactsByPageQueryHandler: GetContactsByPageQueryHandler | null = null; - - private constructor() {} - - public static getInstance(): DIContainer { - if (!DIContainer.instance) { - DIContainer.instance = new DIContainer(); - } - return DIContainer.instance; - } - - // Repository getters - Return interfaces for better abstraction - public get userRepository(): IUserRepository { - if (!this._userRepository) { - this._userRepository = new UserRepository(); - } - return this._userRepository; - } - - public get chatRepository(): IChatRepository { - if (!this._chatRepository) { - this._chatRepository = new ChatRepository(); - } - return this._chatRepository; - } - - public get chatArchiveRepository(): IChatArchiveRepository { - if (!this._chatArchiveRepository) { - this._chatArchiveRepository = new ChatArchiveRepository(); - } - return this._chatArchiveRepository; - } - - public get deckRepository(): IDeckRepository { - if (!this._deckRepository) { - this._deckRepository = new DeckRepository(); - } - return this._deckRepository; - } - - public get organizationRepository(): IOrganizationRepository { - if (!this._organizationRepository) { - this._organizationRepository = new OrganizationRepository(); - } - return this._organizationRepository; - } - - public get contactRepository(): IContactRepository { - if (!this._contactRepository) { - this._contactRepository = new ContactRepository(); - } - return this._contactRepository; - } - - public get gameRepository(): IGameRepository { - if (!this._gameRepository) { - this._gameRepository = new GameRepository(); - } - return this._gameRepository; - } - - // Services getters - public get jwtService(): JWTService { - if (!this._jwtService) { - this._jwtService = new JWTService(); - } - return this._jwtService; - } - - public get contactEmailService(): ContactEmailService { - if (!this._contactEmailService) { - this._contactEmailService = new ContactEmailService(this.contactRepository); - } - return this._contactEmailService; - } - - public get deckImportExportService(): DeckImportExportService { - if (!this._deckImportExportService) { - this._deckImportExportService = new DeckImportExportService(this.deckRepository); - } - return this._deckImportExportService; - } - - public get gameService(): GameService { - if (!this._gameService) { - this._gameService = new GameService(); - } - return this._gameService; - } - - public get boardGenerationService(): BoardGenerationService { - if (!this._boardGenerationService) { - this._boardGenerationService = new BoardGenerationService(); - } - return this._boardGenerationService; - } - - // Command Handler getters - public get createUserCommandHandler(): CreateUserCommandHandler { - if (!this._createUserCommandHandler) { - this._createUserCommandHandler = new CreateUserCommandHandler(this.userRepository); - } - return this._createUserCommandHandler; - } - - public get loginCommandHandler(): LoginCommandHandler { - if (!this._loginCommandHandler) { - this._loginCommandHandler = new LoginCommandHandler(this.userRepository, this.jwtService, this.organizationRepository); - } - return this._loginCommandHandler; - } - - public get logoutCommandHandler(): LogoutCommandHandler { - if (!this._logoutCommandHandler) { - this._logoutCommandHandler = new LogoutCommandHandler(this.userRepository); - } - return this._logoutCommandHandler; - } - - public get updateUserCommandHandler(): UpdateUserCommandHandler { - if (!this._updateUserCommandHandler) { - this._updateUserCommandHandler = new UpdateUserCommandHandler(this.userRepository); - } - return this._updateUserCommandHandler; - } - - public get deactivateUserCommandHandler(): DeactivateUserCommandHandler { - if (!this._deactivateUserCommandHandler) { - this._deactivateUserCommandHandler = new DeactivateUserCommandHandler(this.userRepository); - } - return this._deactivateUserCommandHandler; - } - - public get deleteUserCommandHandler(): DeleteUserCommandHandler { - if (!this._deleteUserCommandHandler) { - this._deleteUserCommandHandler = new DeleteUserCommandHandler(this.userRepository); - } - return this._deleteUserCommandHandler; - } - - public get verifyEmailCommandHandler(): VerifyEmailCommandHandler { - if (!this._verifyEmailCommandHandler) { - this._verifyEmailCommandHandler = new VerifyEmailCommandHandler(this.userRepository); - } - return this._verifyEmailCommandHandler; - } - - public get requestPasswordResetCommandHandler(): RequestPasswordResetCommandHandler { - if (!this._requestPasswordResetCommandHandler) { - this._requestPasswordResetCommandHandler = new RequestPasswordResetCommandHandler(this.userRepository); - } - return this._requestPasswordResetCommandHandler; - } - - public get resetPasswordCommandHandler(): ResetPasswordCommandHandler { - if (!this._resetPasswordCommandHandler) { - this._resetPasswordCommandHandler = new ResetPasswordCommandHandler(this.userRepository); - } - return this._resetPasswordCommandHandler; - } - - public get createChatCommandHandler(): CreateChatCommandHandler { - if (!this._createChatCommandHandler) { - this._createChatCommandHandler = new CreateChatCommandHandler(this.chatRepository, this.userRepository); - } - return this._createChatCommandHandler; - } - - public get sendMessageCommandHandler(): SendMessageCommandHandler { - if (!this._sendMessageCommandHandler) { - this._sendMessageCommandHandler = new SendMessageCommandHandler(this.chatRepository); - } - return this._sendMessageCommandHandler; - } - - public get archiveChatCommandHandler(): ArchiveChatCommandHandler { - if (!this._archiveChatCommandHandler) { - this._archiveChatCommandHandler = new ArchiveChatCommandHandler(this.chatRepository); - } - return this._archiveChatCommandHandler; - } - - public get restoreChatCommandHandler(): RestoreChatCommandHandler { - if (!this._restoreChatCommandHandler) { - this._restoreChatCommandHandler = new RestoreChatCommandHandler(this.chatRepository); - } - return this._restoreChatCommandHandler; - } - - public get createDeckCommandHandler(): CreateDeckCommandHandler { - if (!this._createDeckCommandHandler) { - this._createDeckCommandHandler = new CreateDeckCommandHandler( - this.deckRepository, - this.userRepository, - this.organizationRepository - ); - } - return this._createDeckCommandHandler; - } - - public get updateDeckCommandHandler(): UpdateDeckCommandHandler { - if (!this._updateDeckCommandHandler) { - this._updateDeckCommandHandler = new UpdateDeckCommandHandler(this.deckRepository); - } - return this._updateDeckCommandHandler; - } - - public get deleteDeckCommandHandler(): DeleteDeckCommandHandler { - if (!this._deleteDeckCommandHandler) { - this._deleteDeckCommandHandler = new DeleteDeckCommandHandler(this.deckRepository); - } - return this._deleteDeckCommandHandler; - } - - public get createOrganizationCommandHandler(): CreateOrganizationCommandHandler { - if (!this._createOrganizationCommandHandler) { - this._createOrganizationCommandHandler = new CreateOrganizationCommandHandler(this.organizationRepository); - } - return this._createOrganizationCommandHandler; - } - - public get updateOrganizationCommandHandler(): UpdateOrganizationCommandHandler { - if (!this._updateOrganizationCommandHandler) { - this._updateOrganizationCommandHandler = new UpdateOrganizationCommandHandler(this.organizationRepository); - } - return this._updateOrganizationCommandHandler; - } - - public get deleteOrganizationCommandHandler(): DeleteOrganizationCommandHandler { - if (!this._deleteOrganizationCommandHandler) { - this._deleteOrganizationCommandHandler = new DeleteOrganizationCommandHandler(this.organizationRepository); - } - return this._deleteOrganizationCommandHandler; - } - - public get processOrgAuthCallbackCommandHandler(): ProcessOrgAuthCallbackCommandHandler { - if (!this._processOrgAuthCallbackCommandHandler) { - this._processOrgAuthCallbackCommandHandler = new ProcessOrgAuthCallbackCommandHandler(this.userRepository, this.organizationRepository); - } - return this._processOrgAuthCallbackCommandHandler; - } - - public get createContactCommandHandler(): CreateContactCommandHandler { - if (!this._createContactCommandHandler) { - this._createContactCommandHandler = new CreateContactCommandHandler(this.contactRepository); - } - return this._createContactCommandHandler; - } - - public get updateContactCommandHandler(): UpdateContactCommandHandler { - if (!this._updateContactCommandHandler) { - this._updateContactCommandHandler = new UpdateContactCommandHandler(this.contactRepository); - } - return this._updateContactCommandHandler; - } - - public get deleteContactCommandHandler(): DeleteContactCommandHandler { - if (!this._deleteContactCommandHandler) { - this._deleteContactCommandHandler = new DeleteContactCommandHandler(this.contactRepository); - } - return this._deleteContactCommandHandler; - } - - public get generateBoardCommandHandler(): GenerateBoardCommandHandler { - if (!this._generateBoardCommandHandler) { - this._generateBoardCommandHandler = new GenerateBoardCommandHandler(this.boardGenerationService, RedisService.getInstance()); - } - return this._generateBoardCommandHandler; - } - - // Query Handler getters - public get getUserByIdQueryHandler(): GetUserByIdQueryHandler { - if (!this._getUserByIdQueryHandler) { - this._getUserByIdQueryHandler = new GetUserByIdQueryHandler(this.userRepository); - } - return this._getUserByIdQueryHandler; - } - - public get getUserChatsQueryHandler(): GetUserChatsQueryHandler { - if (!this._getUserChatsQueryHandler) { - this._getUserChatsQueryHandler = new GetUserChatsQueryHandler(this.chatRepository, this.chatArchiveRepository); - } - return this._getUserChatsQueryHandler; - } - - public get getChatHistoryQueryHandler(): GetChatHistoryQueryHandler { - if (!this._getChatHistoryQueryHandler) { - this._getChatHistoryQueryHandler = new GetChatHistoryQueryHandler(this.chatRepository, this.chatArchiveRepository); - } - return this._getChatHistoryQueryHandler; - } - - public get getArchivedChatsQueryHandler(): GetArchivedChatsQueryHandler { - if (!this._getArchivedChatsQueryHandler) { - this._getArchivedChatsQueryHandler = new GetArchivedChatsQueryHandler(this.chatArchiveRepository); - } - return this._getArchivedChatsQueryHandler; - } - - public get getDeckByIdQueryHandler(): GetDeckByIdQueryHandler { - if (!this._getDeckByIdQueryHandler) { - this._getDeckByIdQueryHandler = new GetDeckByIdQueryHandler(this.deckRepository); - } - return this._getDeckByIdQueryHandler; - } - - public get getOrganizationByIdQueryHandler(): GetOrganizationByIdQueryHandler { - if (!this._getOrganizationByIdQueryHandler) { - this._getOrganizationByIdQueryHandler = new GetOrganizationByIdQueryHandler(this.organizationRepository); - } - return this._getOrganizationByIdQueryHandler; - } - - public get getOrganizationLoginUrlQueryHandler(): GetOrganizationLoginUrlQueryHandler { - if (!this._getOrganizationLoginUrlQueryHandler) { - this._getOrganizationLoginUrlQueryHandler = new GetOrganizationLoginUrlQueryHandler(this.organizationRepository); - } - return this._getOrganizationLoginUrlQueryHandler; - } - - public get getContactByIdQueryHandler(): GetContactByIdQueryHandler { - if (!this._getContactByIdQueryHandler) { - this._getContactByIdQueryHandler = new GetContactByIdQueryHandler(this.contactRepository); - } - return this._getContactByIdQueryHandler; - } - - public get getContactsByPageQueryHandler(): GetContactsByPageQueryHandler { - if (!this._getContactsByPageQueryHandler) { - this._getContactsByPageQueryHandler = new GetContactsByPageQueryHandler(this.contactRepository); - } - return this._getContactsByPageQueryHandler; - } - - // New paginated query handlers - public get getUsersByPageQueryHandler(): GetUsersByPageQueryHandler { - if (!this._getUsersByPageQueryHandler) { - this._getUsersByPageQueryHandler = new GetUsersByPageQueryHandler(this.userRepository); - } - return this._getUsersByPageQueryHandler; - } - - public get getDecksByPageQueryHandler(): GetDecksByPageQueryHandler { - if (!this._getDecksByPageQueryHandler) { - this._getDecksByPageQueryHandler = new GetDecksByPageQueryHandler(this.deckRepository); - } - return this._getDecksByPageQueryHandler; - } - - public get getOrganizationsByPageQueryHandler(): GetOrganizationsByPageQueryHandler { - if (!this._getOrganizationsByPageQueryHandler) { - this._getOrganizationsByPageQueryHandler = new GetOrganizationsByPageQueryHandler(this.organizationRepository); - } - return this._getOrganizationsByPageQueryHandler; - } - - public get getChatsByPageQueryHandler(): GetChatsByPageQueryHandler { - if (!this._getChatsByPageQueryHandler) { - this._getChatsByPageQueryHandler = new GetChatsByPageQueryHandler(this.chatRepository); - } - return this._getChatsByPageQueryHandler; - } -} - -// Export singleton instance -export const container = DIContainer.getInstance(); diff --git a/SerpentRace_Backend/src/Application/Services/DeckImportExportService.ts b/SerpentRace_Backend/src/Application/Services/DeckImportExportService.ts deleted file mode 100644 index 3d3f1978..00000000 --- a/SerpentRace_Backend/src/Application/Services/DeckImportExportService.ts +++ /dev/null @@ -1,208 +0,0 @@ -import * as crypto from 'crypto'; -import * as fs from 'fs'; -import { DeckAggregate, State, CType } from '../../Domain/Deck/DeckAggregate'; -import { IDeckRepository } from '../../Domain/IRepository/IDeckRepository'; -import { logError, logAuth } from './Logger'; - -export interface SprDeckData { - name: string; - type: number; - cards: any[]; - ctype: number; - exportDate: string; - version: string; -} - -export interface ImportDeckCommand { - name: string; - type: number; - cards: any[]; - ctype?: number; - userid: string; -} - -export class DeckImportExportService { - private readonly encryptionKey: string; - private readonly algorithm = 'aes-256-gcm'; - - constructor(private readonly deckRepo: IDeckRepository) { - this.encryptionKey = process.env.DECK_ENCRYPTION_KEY || 'your-32-byte-encryption-key-here!!'; - - if (this.encryptionKey.length !== 32) { - throw new Error('DECK_ENCRYPTION_KEY must be exactly 32 characters long'); - } - } - - async exportDeckToSpr(deckId: string, userId: string): Promise { - try { - const deck = await this.deckRepo.findByIdIncludingDeleted(deckId); - - if (!deck) { - throw new Error('Deck not found'); - } - - if (deck.userid !== userId) { - throw new Error('Unauthorized: You can only export your own decks'); - } - - const deckData: SprDeckData = { - name: deck.name, - type: deck.type, - cards: deck.cards, - ctype: deck.ctype, - exportDate: new Date().toISOString(), - version: '1.0' - }; - - const jsonString = JSON.stringify(deckData); - const encrypted = this.encrypt(jsonString); - - logAuth('Deck exported to SPR format', userId, { - deckId: deck.id, - deckName: deck.name, - cardCount: deck.cards.length - }); - - return encrypted; - } catch (error) { - logError('Failed to export deck to SPR', error as Error); - throw error; - } - } - - async importDeckFromSpr(sprData: Buffer, userId: string): Promise { - try { - const decrypted = this.decrypt(sprData); - const deckData: SprDeckData = JSON.parse(decrypted); - - // Validate required fields - if (!deckData.name || !deckData.cards || deckData.type === undefined) { - throw new Error('Invalid SPR file format: missing required fields'); - } - - // Create new deck - const newDeck = new DeckAggregate(); - newDeck.name = deckData.name; - newDeck.type = deckData.type; - newDeck.userid = userId; - newDeck.cards = deckData.cards; - newDeck.ctype = deckData.ctype || CType.PUBLIC; - newDeck.state = State.ACTIVE; - - const createdDeck = await this.deckRepo.create(newDeck); - - logAuth('Deck imported from SPR format', userId, { - deckId: createdDeck.id, - deckName: createdDeck.name, - cardCount: createdDeck.cards.length, - originalExportDate: deckData.exportDate - }); - - return createdDeck; - } catch (error) { - logError('Failed to import deck from SPR', error as Error); - throw error; - } - } - - async importDeckFromJson(jsonData: any, userId: string): Promise { - try { - // Validate required fields - if (!jsonData.name || !jsonData.cards || jsonData.type === undefined) { - throw new Error('Invalid JSON format: missing required fields (name, cards, type)'); - } - - // Create new deck - const newDeck = new DeckAggregate(); - newDeck.name = jsonData.name; - newDeck.type = jsonData.type; - newDeck.userid = userId; - newDeck.cards = jsonData.cards; - newDeck.ctype = jsonData.ctype || CType.PUBLIC; - newDeck.state = State.ACTIVE; - - const createdDeck = await this.deckRepo.create(newDeck); - - logAuth('Deck imported from JSON format', userId, { - deckId: createdDeck.id, - deckName: createdDeck.name, - cardCount: createdDeck.cards.length - }); - - return createdDeck; - } catch (error) { - logError('Failed to import deck from JSON', error as Error); - throw error; - } - } - - // Admin-only function to import JSON without encryption - async adminImportFromJson(jsonData: any, targetUserId: string, adminUserId: string): Promise { - try { - if (!jsonData.name || !jsonData.cards || jsonData.type === undefined) { - throw new Error('Invalid JSON format: missing required fields (name, cards, type)'); - } - - const newDeck = new DeckAggregate(); - newDeck.name = jsonData.name; - newDeck.type = jsonData.type; - newDeck.userid = targetUserId; - newDeck.cards = jsonData.cards; - newDeck.ctype = jsonData.ctype || CType.PUBLIC; - newDeck.state = jsonData.state || State.ACTIVE; - - const createdDeck = await this.deckRepo.create(newDeck); - - logAuth('Deck imported by admin from JSON', adminUserId, { - deckId: createdDeck.id, - deckName: createdDeck.name, - cardCount: createdDeck.cards.length, - targetUserId: targetUserId - }); - - return createdDeck; - } catch (error) { - logError('Failed to admin import deck from JSON', error as Error); - throw error; - } - } - - private encrypt(text: string): Buffer { - const iv = crypto.randomBytes(16); - const cipher = crypto.createCipheriv(this.algorithm, this.encryptionKey, iv); - cipher.setAAD(Buffer.from('SerpentRace-Deck', 'utf8')); - - let encrypted = cipher.update(text, 'utf8'); - encrypted = Buffer.concat([encrypted, cipher.final()]); - - const authTag = cipher.getAuthTag(); - - return Buffer.concat([iv, authTag, encrypted]); - } - - private decrypt(encryptedData: Buffer): string { - if (encryptedData.length < 32) { - throw new Error('Invalid SPR file: file too short'); - } - - const iv = encryptedData.slice(0, 16); - const authTag = encryptedData.slice(16, 32); - const encrypted = encryptedData.slice(32); - - const decipher = crypto.createDecipheriv(this.algorithm, this.encryptionKey, iv); - decipher.setAAD(Buffer.from('SerpentRace-Deck', 'utf8')); - decipher.setAuthTag(authTag); - - let decrypted = decipher.update(encrypted, undefined, 'utf8'); - decrypted += decipher.final('utf8'); - - return decrypted; - } - - generateFilename(deckName: string): string { - // Sanitize deck name for filename - const sanitized = deckName.replace(/[^a-zA-Z0-9\-_]/g, '_'); - const timestamp = new Date().toISOString().split('T')[0]; // YYYY-MM-DD - return `${sanitized}_${timestamp}.spr`; - } -} diff --git a/SerpentRace_Backend/src/Application/Services/EmailService.ts b/SerpentRace_Backend/src/Application/Services/EmailService.ts deleted file mode 100644 index e2e7fd5c..00000000 --- a/SerpentRace_Backend/src/Application/Services/EmailService.ts +++ /dev/null @@ -1,264 +0,0 @@ -import * as nodemailer from 'nodemailer'; -import * as fs from 'fs'; -import * as path from 'path'; -import { logError, logAuth, logStartup } from './Logger'; -import { EmailTemplateHelper, LocalizedSubjects } from './EmailTemplateHelper'; - -export interface EmailOptions { - to: string; - subject: string; - html?: string; - text?: string; - template?: string; - templateData?: any; -} - -export interface EmailConfig { - host: string; - port: number; - secure: boolean; - auth: { - user: string; - pass: string; - }; - from: string; -} - -export class EmailService { - private transporter!: nodemailer.Transporter; - private config: EmailConfig; - private templatesPath: string; - - constructor() { - this.templatesPath = path.join(__dirname, '../../Templates'); - - this.config = { - host: process.env.EMAIL_HOST || 'smtp.gmail.com', - port: parseInt(process.env.EMAIL_PORT || '587'), - secure: process.env.EMAIL_SECURE === 'true', - auth: { - user: process.env.EMAIL_USER || '', - pass: process.env.EMAIL_PASS || '' - }, - from: process.env.EMAIL_FROM || 'noreply@serpentrace.com' - }; - - this.initializeTransporter(); - } - - private initializeTransporter(): void { - try { - this.transporter = nodemailer.createTransport({ - host: this.config.host, - port: this.config.port, - secure: this.config.secure, - auth: { - user: this.config.auth.user, - pass: this.config.auth.pass - } - }); - } catch (error) { - logError('EmailService initialization failed', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to initialize email service'); - } - } - - /** - * Send email with template - * @param options - Email options including template and data - */ - async sendEmail(options: EmailOptions): Promise { - try { - let htmlContent = options.html; - let textContent = options.text; - - if (options.template) { - const templateResult = await this.loadTemplate(options.template, options.templateData || {}); - htmlContent = templateResult.html; - textContent = templateResult.text; - } - - const mailOptions = { - from: this.config.from, - to: options.to, - subject: options.subject, - html: htmlContent, - text: textContent - }; - - const result = await this.transporter.sendMail(mailOptions); - logAuth('Email sent successfully', undefined, { - messageId: result.messageId, - to: options.to, - subject: options.subject - }); - return true; - } catch (error) { - logError('Email sending failed', error instanceof Error ? error : new Error(String(error))); - return false; - } - } - - /** - * Send verification email to user - * @param userEmail - User's email address - * @param userName - User's name - * @param verificationToken - Verification token - * @param verificationUrl - Complete verification URL - * @param language - Language code ('en', 'hu', 'de') - */ - async sendVerificationEmail( - userEmail: string, - userName: string, - verificationToken: string, - verificationUrl: string, - language: 'en' | 'hu' | 'de' = 'en' - ): Promise { - try { - const templateName = language === 'en' ? 'verification' : `verification-${language}`; - const subject = this.getLocalizedVerificationSubject(language); - - return await this.sendEmail({ - to: userEmail, - subject, - template: templateName, - templateData: { - userName, - verificationToken, - verificationUrl, - companyName: 'SerpentRace', - supportEmail: 'support@serpentrace.com' - } - }); - } catch (error) { - logError('Verification email sending failed', error instanceof Error ? error : new Error(String(error))); - return false; - } - } - - /** - * Send password reset email - * @param userEmail - User's email address - * @param userName - User's name - * @param resetToken - Password reset token - * @param resetUrl - Complete password reset URL - * @param language - Language code ('en', 'hu', 'de') - */ - async sendPasswordResetEmail( - userEmail: string, - userName: string, - resetToken: string, - resetUrl: string, - language: 'en' | 'hu' | 'de' = 'en' - ): Promise { - try { - const templateName = language === 'en' ? 'password-reset' : `password-reset-${language}`; - const subject = this.getLocalizedPasswordResetSubject(language); - - return await this.sendEmail({ - to: userEmail, - subject, - template: templateName, - templateData: { - userName, - resetToken, - resetUrl, - companyName: 'SerpentRace', - supportEmail: 'support@serpentrace.com' - } - }); - } catch (error) { - logError('Password reset email sending failed', error instanceof Error ? error : new Error(String(error))); - return false; - } - } - - /** - * Load and compile email template with language support - * @param templateName - Name of the template file (with or without language suffix) - * @param data - Data to replace placeholders in the template - */ - private async loadTemplate(templateName: string, data: any): Promise<{ html: string; text: string }> { - try { - // Try the specified template first - let htmlTemplatePath = path.join(this.templatesPath, `${templateName}.html`); - let textTemplatePath = path.join(this.templatesPath, `${templateName}.txt`); - - let htmlTemplate = ''; - let textTemplate = ''; - - // Load HTML template if it exists - if (fs.existsSync(htmlTemplatePath)) { - htmlTemplate = fs.readFileSync(htmlTemplatePath, 'utf8'); - } else { - // If language-specific template doesn't exist, try fallback to English - const baseName = templateName.replace(/-[a-z]{2}$/, ''); // Remove language suffix - const fallbackHtmlPath = path.join(this.templatesPath, `${baseName}.html`); - if (fs.existsSync(fallbackHtmlPath)) { - htmlTemplate = fs.readFileSync(fallbackHtmlPath, 'utf8'); - } - } - - // Load text template if it exists - if (fs.existsSync(textTemplatePath)) { - textTemplate = fs.readFileSync(textTemplatePath, 'utf8'); - } else { - // If language-specific template doesn't exist, try fallback to English - const baseName = templateName.replace(/-[a-z]{2}$/, ''); // Remove language suffix - const fallbackTextPath = path.join(this.templatesPath, `${baseName}.txt`); - if (fs.existsSync(fallbackTextPath)) { - textTemplate = fs.readFileSync(fallbackTextPath, 'utf8'); - } - } - - // If no templates found, throw error - if (!htmlTemplate && !textTemplate) { - throw new Error(`Template '${templateName}' not found`); - } - - // Replace placeholders in templates - const processedTemplate = EmailTemplateHelper.processTemplate( - { html: htmlTemplate, text: textTemplate }, - data - ); - - return { - html: processedTemplate.html, - text: processedTemplate.text - }; - } catch (error) { - logError('Email template loading failed', error instanceof Error ? error : new Error(String(error))); - throw new Error(`Failed to load email template: ${templateName}`); - } - } - - /** - * Get localized verification email subject - * @param language - Language code ('en', 'hu', 'de') - */ - private getLocalizedVerificationSubject(language: 'en' | 'hu' | 'de'): string { - const subjects: LocalizedSubjects = { - verification: { - en: 'SerpentRace - Verify Your Account', - hu: 'SerpentRace - Fiók megerősítése', - de: 'SerpentRace - Konto verifizieren' - } - }; - return EmailTemplateHelper.getLocalizedSubject('verification', subjects, language); - } - - /** - * Get localized password reset email subject - * @param language - Language code ('en', 'hu', 'de') - */ - private getLocalizedPasswordResetSubject(language: 'en' | 'hu' | 'de'): string { - const subjects: LocalizedSubjects = { - passwordReset: { - en: 'SerpentRace - Password Reset Request', - hu: 'SerpentRace - Jelszó visszaállítás kérése', - de: 'SerpentRace - Passwort zurücksetzen' - } - }; - return EmailTemplateHelper.getLocalizedSubject('passwordReset', subjects, language); - } -} diff --git a/SerpentRace_Backend/src/Application/Services/EmailTemplateHelper.ts b/SerpentRace_Backend/src/Application/Services/EmailTemplateHelper.ts deleted file mode 100644 index d392e36d..00000000 --- a/SerpentRace_Backend/src/Application/Services/EmailTemplateHelper.ts +++ /dev/null @@ -1,39 +0,0 @@ -export interface LocalizedSubjects { - [key: string]: { - en: string; - hu: string; - de: string; - }; -} - -export interface TemplateData { - [key: string]: any; -} - -export interface EmailTemplate { - html: string; - text: string; -} - -export class EmailTemplateHelper { - public static getLocalizedSubject( - subjectKey: string, - subjects: LocalizedSubjects, - language: 'en' | 'hu' | 'de' - ): string { - return subjects[subjectKey]?.[language] || subjects[subjectKey]?.['en'] || 'SerpentRace'; - } - - public static replaceTemplatePlaceholders(template: string, data: TemplateData): string { - return template.replace(/\{\{(\w+)\}\}/g, (match, key) => { - return data[key] !== undefined ? String(data[key]) : match; - }); - } - - public static processTemplate(templateContent: EmailTemplate, data: TemplateData): EmailTemplate { - return { - html: this.replaceTemplatePlaceholders(templateContent.html, data), - text: this.replaceTemplatePlaceholders(templateContent.text, data) - }; - } -} diff --git a/SerpentRace_Backend/src/Application/Services/ErrorResponseService.ts b/SerpentRace_Backend/src/Application/Services/ErrorResponseService.ts deleted file mode 100644 index e4614f42..00000000 --- a/SerpentRace_Backend/src/Application/Services/ErrorResponseService.ts +++ /dev/null @@ -1,35 +0,0 @@ -import { Response } from 'express'; - -export class ErrorResponseService { - static sendError(res: Response, statusCode: number, message: string, details?: any): Response { - const errorResponse: any = { error: message }; - if (details) { - errorResponse.details = details; - } - return res.status(statusCode).json(errorResponse); - } - - static sendInternalServerError(res: Response): Response { - return this.sendError(res, 500, 'Internal server error'); - } - - static sendBadRequest(res: Response, message: string = 'Bad request', details?: any): Response { - return this.sendError(res, 400, message, details); - } - - static sendUnauthorized(res: Response, message: string = 'Unauthorized'): Response { - return this.sendError(res, 401, message); - } - - static sendForbidden(res: Response, message: string = 'Forbidden'): Response { - return this.sendError(res, 403, message); - } - - static sendNotFound(res: Response, message: string = 'Not found'): Response { - return this.sendError(res, 404, message); - } - - static sendConflict(res: Response, message: string = 'Conflict'): Response { - return this.sendError(res, 409, message); - } -} diff --git a/SerpentRace_Backend/src/Application/Services/JWTService.ts b/SerpentRace_Backend/src/Application/Services/JWTService.ts deleted file mode 100644 index 216a643c..00000000 --- a/SerpentRace_Backend/src/Application/Services/JWTService.ts +++ /dev/null @@ -1,124 +0,0 @@ -import jwt, { SignOptions } from 'jsonwebtoken'; -import { Request, Response } from 'express'; -import { UserState } from '../../Domain/User/UserAggregate'; - -export interface TokenPayload { - userId: string; - authLevel: 0 | 1; - userStatus: UserState; - orgId: string; - iat?: number; - exp?: number; -} - -export class JWTService { - private readonly secretKey: string; - private readonly tokenExpiry: number; - private readonly cookieName: string; - - constructor() { - this.secretKey = process.env.JWT_SECRET || 'your-secret-key'; - - let expiry = 86400; - - if (process.env.JWT_EXPIRY) { - expiry = parseInt(process.env.JWT_EXPIRY); - } else if (process.env.JWT_EXPIRATION) { - expiry = this.parseDuration(process.env.JWT_EXPIRATION); - } - - this.tokenExpiry = expiry; - this.cookieName = 'auth_token'; - - if (process.env.NODE_ENV === 'production' && (!process.env.JWT_SECRET || process.env.JWT_SECRET === 'your-secret-key')) { - throw new Error('JWT_SECRET environment variable must be set in production'); - } - } - - create(payload: TokenPayload, res: Response): string { - const now = Math.floor(Date.now() / 1000); - - const payloadWithTimestamps: TokenPayload = { - ...payload, - iat: now, - exp: now + this.tokenExpiry - }; - - // Don't use expiresIn option since we're manually setting exp in payload - const options: SignOptions = {}; - const token = jwt.sign(payloadWithTimestamps, this.secretKey, options); - - res.cookie(this.cookieName, token, { - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - sameSite: 'strict', - maxAge: this.tokenExpiry * 1000, // Convert to milliseconds - }); - - return token; - } - - verify(req: Request): TokenPayload | null { - try { - const token = req.cookies[this.cookieName]; - if (!token) return null; - - const decoded = jwt.verify(token, this.secretKey) as TokenPayload; - return decoded; - } catch (error) { - return null; - } - } - - // Check if token needs refresh (within 25% of expiry time) - shouldRefreshToken(payload: TokenPayload): boolean { - if (!payload.exp || !payload.iat) return false; - - const now = Math.floor(Date.now() / 1000); - const tokenAge = now - payload.iat; - const tokenLifetime = payload.exp - payload.iat; - const refreshThreshold = tokenLifetime * 0.75; // Refresh when 75% of lifetime has passed - - return tokenAge >= refreshThreshold; - } - - // Conditionally refresh token only if needed - refreshIfNeeded(payload: TokenPayload, res: Response): boolean { - if (this.shouldRefreshToken(payload)) { - // Create new token with fresh timestamps, but same user data - const freshPayload: Omit = { - userId: payload.userId, - authLevel: payload.authLevel, - userStatus: payload.userStatus, - orgId: payload.orgId - }; - this.create(freshPayload, res); - return true; - } - return false; - } - - /** - * Parse duration string to seconds (e.g., "24h", "7d", "30m") - * @param duration Duration string - * @returns Duration in seconds - */ - private parseDuration(duration: string): number { - const match = duration.match(/^(\d+)([smhd])$/); - if (!match) { - throw new Error(`Invalid duration format: ${duration}. Use format like '24h', '7d', '30m'`); - } - - const [, value, unit] = match; - const num = parseInt(value); - - switch (unit) { - case 's': return num; // seconds - case 'm': return num * 60; // minutes - case 'h': return num * 60 * 60; // hours - case 'd': return num * 60 * 60 * 24; // days - default: - throw new Error(`Unsupported duration unit: ${unit}`); - } - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Application/Services/Logger.ts b/SerpentRace_Backend/src/Application/Services/Logger.ts deleted file mode 100644 index 74521339..00000000 --- a/SerpentRace_Backend/src/Application/Services/Logger.ts +++ /dev/null @@ -1,61 +0,0 @@ -import { LoggingService, LogLevel } from './LoggingService'; -import { Request, Response } from 'express'; - -// Singleton instance -const logger = LoggingService.getInstance(); - -// Convenience functions for each log level -export const logRequest = (message: string, req?: Request, res?: Response, metadata?: any) => { - logger.log(LogLevel.REQUEST, message, metadata, req, res); -}; - -export const logError = (message: string, error?: Error, req?: Request, res?: Response) => { - const metadata = error ? { - name: error.name, - message: error.message, - stack: error.stack - } : undefined; - logger.log(LogLevel.ERROR, message, metadata, req, res); -}; - -export const logWarning = (message: string, metadata?: any, req?: Request, res?: Response) => { - logger.log(LogLevel.WARNING, message, metadata, req, res); -}; - -export const logAuth = (message: string, userId?: string, metadata?: any, req?: Request, res?: Response) => { - const authMetadata = { - userId, - ...metadata - }; - logger.log(LogLevel.AUTH, message, authMetadata, req, res); -}; - -export const logDatabase = (message: string, query?: string, executionTime?: number, metadata?: any) => { - const dbMetadata = { - query: query ? query.substring(0, 200) : undefined, - executionTime, - ...metadata - }; - logger.log(LogLevel.DATABASE, message, dbMetadata); -}; - -export const logStartup = (message: string, metadata?: any) => { - logger.log(LogLevel.STARTUP, message, metadata); -}; - -export const logConnection = (message: string, type: string, status: 'success' | 'failure' | 'attempt', metadata?: any) => { - const connectionMetadata = { - connectionType: type, - status, - ...metadata - }; - logger.log(LogLevel.CONNECTION, message, connectionMetadata); -}; - -export const logOther = (message: string, metadata?: any, req?: Request, res?: Response) => { - logger.log(LogLevel.OTHER, message, metadata, req, res); -}; - -// Export the main service -export { LoggingService, LogLevel }; -export default logger; diff --git a/SerpentRace_Backend/src/Application/Services/LoggingService.ts b/SerpentRace_Backend/src/Application/Services/LoggingService.ts deleted file mode 100644 index 5b0aab21..00000000 --- a/SerpentRace_Backend/src/Application/Services/LoggingService.ts +++ /dev/null @@ -1,401 +0,0 @@ -import fs from 'fs'; -import path from 'path'; -import { Request, Response, NextFunction } from 'express'; -import * as Minio from 'minio'; - -export enum LogLevel { - REQUEST = 'REQUEST', - ERROR = 'ERROR', - WARNING = 'WARNING', - AUTH = 'AUTH', - DATABASE = 'DATABASE', - STARTUP = 'STARTUP', - CONNECTION = 'CONNECTION', - OTHER = 'OTHER' -} - -export interface LogEntry { - timestamp: string; - level: LogLevel; - message: string; - metadata?: any; - requestId?: string; - userId?: string; - ip?: string; - userAgent?: string; - method?: string; - url?: string; - statusCode?: number; - responseTime?: number; -} - -export class LoggingService { - private static instance: LoggingService; - private minioClient: Minio.Client | null = null; - private logBuffer: LogEntry[] = []; - private currentLogFile: string | null = null; - private logCount = 0; - private readonly maxLogsPerFile = parseInt(process.env.MAX_LOGS_PER_FILE || '10000'); - private readonly logsDir = path.join(process.cwd(), 'logs'); - private readonly bucketName = process.env.MINIO_BUCKET_NAME || 'serpentrace-logs'; - private uploadInterval: NodeJS.Timeout | null = null; - - private constructor() { - this.initializeLogsDirectory(); - this.initializeMinioClient(); - this.createNewLogFile(); - - if (process.env.NODE_ENV !== 'test') { - this.startPeriodicUpload(); - } - - process.on('SIGTERM', () => this.shutdown()); - process.on('SIGINT', () => this.shutdown()); - process.on('beforeExit', () => this.shutdown()); - } - - static getInstance(): LoggingService { - if (!LoggingService.instance) { - LoggingService.instance = new LoggingService(); - } - return LoggingService.instance; - } - - private initializeLogsDirectory(): void { - try { - if (!fs.existsSync(this.logsDir)) { - fs.mkdirSync(this.logsDir, { recursive: true }); - } - - // Create monthly subdirectory - const monthlyDir = this.getMonthlyDirectory(); - if (!fs.existsSync(monthlyDir)) { - fs.mkdirSync(monthlyDir, { recursive: true }); - } - } catch (error) { - console.error('Failed to initialize logs directory:', error); - } - } - - private initializeMinioClient(): void { - try { - // Check if in production or development - if (process.env.NODE_ENV === 'production') { - if (process.env.MINIO_ENDPOINT && process.env.MINIO_ACCESS_KEY && process.env.MINIO_SECRET_KEY) { - this.minioClient = new Minio.Client({ - endPoint: process.env.MINIO_ENDPOINT, - port: parseInt(process.env.MINIO_PORT || '9000'), - useSSL: process.env.MINIO_USE_SSL === 'true', - accessKey: process.env.MINIO_ACCESS_KEY, - secretKey: process.env.MINIO_SECRET_KEY - }); - - this.ensureBucketExists(); - } else { - console.warn('Minio configuration not found. Logs will only be stored locally and in console.'); - } - } else { - // Development mode - only use MinIO if explicitly configured - if (process.env.MINIO_ENDPOINT || process.env.ENABLE_MINIO === 'true') { - this.minioClient = new Minio.Client({ - endPoint: process.env.MINIO_ENDPOINT || 'localhost', - port: parseInt(process.env.MINIO_PORT || '9000'), - useSSL: false, - accessKey: process.env.MINIO_ACCESS_KEY || 'serpentrace', - secretKey: process.env.MINIO_SECRET_KEY || 'serpentrace123!' - }); - - this.ensureBucketExists(); - } else { - console.log('Development mode: MinIO disabled. Set ENABLE_MINIO=true to enable MinIO logging.'); - this.minioClient = null; - } - } - - - } catch (error) { - console.error('Failed to initialize Minio client:', error); - this.minioClient = null; - } - } - - private async ensureBucketExists(): Promise { - if (!this.minioClient) return; - - try { - const exists = await this.minioClient.bucketExists(this.bucketName); - if (!exists) { - await this.minioClient.makeBucket(this.bucketName); - this.log(LogLevel.STARTUP, `Created Minio bucket: ${this.bucketName}`); - } - } catch (error) { - console.warn('MinIO connection failed - disabling MinIO logging:', (error as Error).message); - // Disable MinIO client if connection fails - this.minioClient = null; - } - } - - private startPeriodicUpload(): void { - // Upload current log file to Minio every 2 minutes - this.uploadInterval = setInterval(async () => { - if (this.currentLogFile && this.minioClient) { - await this.uploadToMinio(this.currentLogFile); - } - }, 2 * 60 * 1000); // 2 minutes - } - - private getMonthlyDirectory(): string { - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - return path.join(this.logsDir, `${year}-${month}`); - } - - private getMonthlyMinioPrefix(): string { - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - return `${year}-${month}/`; - } - - private createNewLogFile(): void { - const now = new Date(); - const timestamp = now.toISOString().replace(/[:.]/g, '-'); - const fileName = `serpentrace-${timestamp}.log`; - - this.currentLogFile = path.join(this.getMonthlyDirectory(), fileName); - this.logCount = 0; - - // Write log file header - const header = `# SerpentRace Backend Logs\n# Started: ${now.toISOString()}\n# Max entries per file: ${this.maxLogsPerFile}\n\n`; - try { - fs.writeFileSync(this.currentLogFile, header); - } catch (error) { - console.error('Failed to create log file:', error); - } - } - - private formatLogEntry(entry: LogEntry): string { - const parts = [ - entry.timestamp, - `[${entry.level}]`, - entry.message - ]; - - if (entry.requestId) parts.push(`ReqId:${entry.requestId}`); - if (entry.userId) parts.push(`UserId:${entry.userId}`); - if (entry.ip) parts.push(`IP:${entry.ip}`); - if (entry.method && entry.url) parts.push(`${entry.method} ${entry.url}`); - if (entry.statusCode) parts.push(`Status:${entry.statusCode}`); - if (entry.responseTime) parts.push(`Time:${entry.responseTime}ms`); - if (entry.userAgent) parts.push(`UA:${entry.userAgent.substring(0, 50)}`); - if (entry.metadata) parts.push(`Meta:${JSON.stringify(entry.metadata)}`); - - return parts.join(' | '); - } - - private async writeToLocalFile(entry: LogEntry): Promise { - if (!this.currentLogFile) return; - - try { - const logLine = this.formatLogEntry(entry) + '\n'; - fs.appendFileSync(this.currentLogFile, logLine); - - this.logCount++; - - // Check if we need to rotate the log file - if (this.logCount >= this.maxLogsPerFile) { - await this.rotateLogFile(); - } - } catch (error) { - console.error('Failed to write to log file:', error); - } - } - - private async rotateLogFile(): Promise { - if (!this.currentLogFile) return; - - try { - // Upload current file to Minio before rotating - await this.uploadToMinio(this.currentLogFile); - - // Create new log file - this.createNewLogFile(); - - this.log(LogLevel.OTHER, 'Log file rotated due to size limit'); - } catch (error) { - console.error('Failed to rotate log file:', error); - } - } - - private async uploadToMinio(filePath: string): Promise { - if (!this.minioClient) { - console.warn('Minio client not initialized, skipping upload'); - return; - } - - if (!fs.existsSync(filePath)) { - console.warn(`Log file does not exist: ${filePath}`); - return; - } - - try { - const fileName = path.basename(filePath); - const objectName = this.getMonthlyMinioPrefix() + fileName; - - console.log(`Attempting to upload log file to Minio: ${objectName}`); - await this.minioClient.fPutObject(this.bucketName, objectName, filePath); - console.log(`Successfully uploaded log file to Minio: ${objectName}`); - } catch (error) { - console.error('Failed to upload to Minio:', error); - console.error('Minio config:', { - endpoint: this.minioClient ? 'configured' : 'not configured', - bucket: this.bucketName - }); - } - } - - private logToConsole(entry: LogEntry): void { - const formattedEntry = this.formatLogEntry(entry); - - switch (entry.level) { - case LogLevel.ERROR: - console.error(formattedEntry); - break; - case LogLevel.WARNING: - console.warn(formattedEntry); - break; - case LogLevel.REQUEST: - case LogLevel.AUTH: - case LogLevel.DATABASE: - case LogLevel.CONNECTION: - console.info(formattedEntry); - break; - case LogLevel.STARTUP: - console.log(formattedEntry); - break; - default: - console.log(formattedEntry); - } - } - - public log( - level: LogLevel, - message: string, - metadata?: any, - req?: Request, - res?: Response, - responseTime?: number - ): void { - const entry: LogEntry = { - timestamp: new Date().toISOString(), - level, - message, - metadata - }; - - // Add request context if available - if (req) { - entry.requestId = (req as any).requestId || this.generateRequestId(); - entry.userId = (req as any).user?.userId; - entry.ip = req.ip || req.socket?.remoteAddress || 'unknown'; - entry.userAgent = req.get ? req.get('User-Agent') : 'unknown'; - entry.method = req.method; - entry.url = req.originalUrl || req.url; - } - - if (res) { - entry.statusCode = res.statusCode; - } - - if (responseTime !== undefined) { - entry.responseTime = responseTime; - } - - // Log to all three destinations - this.logToConsole(entry); - this.writeToLocalFile(entry); - - // Add to buffer for potential batch processing - this.logBuffer.push(entry); - - // Limit buffer size - if (this.logBuffer.length > 1000) { - this.logBuffer = this.logBuffer.slice(-500); - } - } - - private generateRequestId(): string { - return Math.random().toString(36).substr(2, 9); - } - - public async shutdown(): Promise { - try { - // Clear the upload interval - if (this.uploadInterval) { - clearInterval(this.uploadInterval); - this.uploadInterval = null; - } - - // Upload current log file to Minio - if (this.currentLogFile) { - await this.uploadToMinio(this.currentLogFile); - } - - this.log(LogLevel.STARTUP, 'Logging service shutting down gracefully'); - - // Give time for final logs to be written - await new Promise(resolve => setTimeout(resolve, 1000)); - } catch (error) { - console.error('Error during logging service shutdown:', error); - } - } - - // Middleware factory methods - public requestLoggingMiddleware() { - return (req: Request, res: Response, next: NextFunction) => { - const startTime = Date.now(); - - // Generate request ID - (req as any).requestId = this.generateRequestId(); - - // Log request start - this.log(LogLevel.REQUEST, `Incoming request`, undefined, req); - - // Override res.end to log response - const originalEnd = res.end.bind(res); - res.end = (...args: any[]): Response => { - const responseTime = Date.now() - startTime; - LoggingService.getInstance().log( - LogLevel.REQUEST, - `Request completed`, - undefined, - req, - res, - responseTime - ); - return originalEnd(...args); - }; - - next(); - }; - } - - public errorLoggingMiddleware() { - return (error: Error, req: Request, res: Response, next: NextFunction) => { - this.log( - LogLevel.ERROR, - `Unhandled error: ${error.message}`, - { - stack: error.stack, - name: error.name - }, - req, - res - ); - next(error); - }; - } -} - -export default LoggingService; diff --git a/SerpentRace_Backend/src/Application/Services/PasswordService.ts b/SerpentRace_Backend/src/Application/Services/PasswordService.ts deleted file mode 100644 index 56f3ec08..00000000 --- a/SerpentRace_Backend/src/Application/Services/PasswordService.ts +++ /dev/null @@ -1,99 +0,0 @@ -import * as bcrypt from 'bcrypt'; -import { logError } from './Logger'; - -export class PasswordService { - private static readonly SALT_ROUNDS = 12; - - /** - * Hashes a plain text password using bcrypt - * @param password - The plain text password to hash - * @returns Promise - The hashed password - */ - static async hashPassword(password: string): Promise { - try { - if (!password || typeof password !== 'string') { - throw new Error('Password must be a non-empty string'); - } - - return await bcrypt.hash(password, this.SALT_ROUNDS); - } catch (error) { - logError('PasswordService.hashPassword error', error instanceof Error ? error : new Error(String(error))); - - if (error instanceof Error && error.message === 'Password must be a non-empty string') { - throw error; // Re-throw validation errors as-is - } - - throw new Error('Failed to hash password'); - } - } - - /** - * Verifies a plain text password against a hashed password - * @param password - The plain text password to verify - * @param hashedPassword - The hashed password to compare against - * @returns Promise - True if password matches, false otherwise - */ - static async verifyPassword(password: string, hashedPassword: string): Promise { - try { - if (!password || typeof password !== 'string') { - return false; // Invalid input should return false, not throw - } - - if (!hashedPassword || typeof hashedPassword !== 'string') { - return false; // Invalid input should return false, not throw - } - - return await bcrypt.compare(password, hashedPassword); - } catch (error) { - logError('PasswordService.verifyPassword error', error instanceof Error ? error : new Error(String(error))); - return false; // Return false on error instead of throwing - } - } - - /** - * Validates password strength requirements - * @param password - The password to validate - * @returns object - Object containing isValid boolean and error messages - */ - static validatePasswordStrength(password: string): { isValid: boolean; errors: string[] } { - try { - const errors: string[] = []; - - if (!password || typeof password !== 'string') { - errors.push('Password must be provided as a string'); - return { isValid: false, errors }; - } - - if (password.length < 8) { - errors.push('Password must be at least 8 characters long'); - } - - if (!/[A-Z]/.test(password)) { - errors.push('Password must contain at least one uppercase letter'); - } - - if (!/[a-z]/.test(password)) { - errors.push('Password must contain at least one lowercase letter'); - } - - if (!/\d/.test(password)) { - errors.push('Password must contain at least one number'); - } - - if (!/[!@#$%^&*(),.?":{}|<>]/.test(password)) { - errors.push('Password must contain at least one special character'); - } - - return { - isValid: errors.length === 0, - errors - }; - } catch (error) { - logError('PasswordService.validatePasswordStrength error', error instanceof Error ? error : new Error(String(error))); - return { - isValid: false, - errors: ['Password validation failed due to internal error'] - }; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Services/RedisService.ts b/SerpentRace_Backend/src/Application/Services/RedisService.ts deleted file mode 100644 index a9cd2ac9..00000000 --- a/SerpentRace_Backend/src/Application/Services/RedisService.ts +++ /dev/null @@ -1,375 +0,0 @@ -import { createClient, RedisClientType } from 'redis'; -import { logError, logStartup, logWarning } from './Logger'; - -export interface ActiveChatData { - chatId: string; - participants: string[]; - lastActivity: Date; - messageCount: number; - chatType: 'direct' | 'group' | 'game'; - gameId?: string; - name?: string; -} - -export interface ActiveUserData { - userId: string; - activeChatIds: string[]; - lastActivity: Date; - isOnline: boolean; -} - -export class RedisService { - private static instance: RedisService; - private client: RedisClientType; - private isConnected: boolean = false; - - private constructor() { - const redisUrl = process.env.REDIS_URL || 'redis://localhost:6379'; - this.client = createClient({ - url: redisUrl, - socket: { - reconnectStrategy: (retries) => Math.min(retries * 50, 500) - } - }); - - this.client.on('error', (err) => { - logError('Redis connection error', err); - this.isConnected = false; - }); - - this.client.on('connect', () => { - logStartup('Redis client connected successfully'); - this.isConnected = true; - }); - - this.client.on('disconnect', () => { - logWarning('Redis client disconnected'); - this.isConnected = false; - }); - } - - public static getInstance(): RedisService { - if (!RedisService.instance) { - RedisService.instance = new RedisService(); - } - return RedisService.instance; - } - - public async connect(): Promise { - try { - if (!this.isConnected) { - await this.client.connect(); - } - } catch (error) { - logError('Failed to connect to Redis', error as Error); - throw error; - } - } - - public async disconnect(): Promise { - try { - if (this.isConnected) { - await this.client.disconnect(); - } - } catch (error) { - logError('Failed to disconnect from Redis', error as Error); - } - } - - public async setActiveChat(chatId: string, chatData: ActiveChatData): Promise { - try { - const key = `active_chat:${chatId}`; - await this.client.hSet(key, { - chatId: chatData.chatId, - participants: JSON.stringify(chatData.participants), - lastActivity: chatData.lastActivity.toISOString(), - messageCount: chatData.messageCount.toString(), - chatType: chatData.chatType, - gameId: chatData.gameId || '', - name: chatData.name || '' - }); - - // Set expiration for 1 hour of inactivity - await this.client.expire(key, 3600); - } catch (error) { - logError(`Failed to set active chat ${chatId}`, error as Error); - } - } - - public async getActiveChat(chatId: string): Promise { - try { - const key = `active_chat:${chatId}`; - const data = await this.client.hGetAll(key); - - if (!data.chatId) { - return null; - } - - return { - chatId: data.chatId, - participants: JSON.parse(data.participants), - lastActivity: new Date(data.lastActivity), - messageCount: parseInt(data.messageCount, 10), - chatType: data.chatType as 'direct' | 'group' | 'game', - gameId: data.gameId || undefined, - name: data.name || undefined - }; - } catch (error) { - logError(`Failed to get active chat ${chatId}`, error as Error); - return null; - } - } - - public async removeActiveChat(chatId: string): Promise { - try { - const key = `active_chat:${chatId}`; - await this.client.del(key); - } catch (error) { - logError(`Failed to remove active chat ${chatId}`, error as Error); - } - } - - public async getAllActiveChats(): Promise { - try { - const pattern = 'active_chat:*'; - const keys = await this.client.keys(pattern); - const chats: ActiveChatData[] = []; - - for (const key of keys) { - const data = await this.client.hGetAll(key); - if (data.chatId) { - chats.push({ - chatId: data.chatId, - participants: JSON.parse(data.participants), - lastActivity: new Date(data.lastActivity), - messageCount: parseInt(data.messageCount, 10), - chatType: data.chatType as 'direct' | 'group' | 'game', - gameId: data.gameId || undefined, - name: data.name || undefined - }); - } - } - - return chats; - } catch (error) { - logError('Failed to get all active chats', error as Error); - return []; - } - } - - public async setActiveUser(userId: string, userData: ActiveUserData): Promise { - try { - const key = `active_user:${userId}`; - await this.client.hSet(key, { - userId: userData.userId, - activeChatIds: JSON.stringify(userData.activeChatIds), - lastActivity: userData.lastActivity.toISOString(), - isOnline: userData.isOnline.toString() - }); - - // Set expiration for 2 hours - await this.client.expire(key, 7200); - } catch (error) { - logError(`Failed to set active user ${userId}`, error as Error); - } - } - - public async getActiveUser(userId: string): Promise { - try { - const key = `active_user:${userId}`; - const data = await this.client.hGetAll(key); - - if (!data.userId) { - return null; - } - - return { - userId: data.userId, - activeChatIds: JSON.parse(data.activeChatIds), - lastActivity: new Date(data.lastActivity), - isOnline: data.isOnline === 'true' - }; - } catch (error) { - logError(`Failed to get active user ${userId}`, error as Error); - return null; - } - } - - public async removeActiveUser(userId: string): Promise { - try { - const key = `active_user:${userId}`; - await this.client.del(key); - } catch (error) { - logError(`Failed to remove active user ${userId}`, error as Error); - } - } - - public async addUserToChat(userId: string, chatId: string): Promise { - try { - const userData = await this.getActiveUser(userId) || { - userId, - activeChatIds: [], - lastActivity: new Date(), - isOnline: true - }; - - if (!userData.activeChatIds.includes(chatId)) { - userData.activeChatIds.push(chatId); - userData.lastActivity = new Date(); - await this.setActiveUser(userId, userData); - } - } catch (error) { - logError(`Failed to add user ${userId} to chat ${chatId}`, error as Error); - } - } - - public async removeUserFromChat(userId: string, chatId: string): Promise { - try { - const userData = await this.getActiveUser(userId); - if (userData) { - userData.activeChatIds = userData.activeChatIds.filter(id => id !== chatId); - userData.lastActivity = new Date(); - await this.setActiveUser(userId, userData); - } - } catch (error) { - logError(`Failed to remove user ${userId} from chat ${chatId}`, error as Error); - } - } - - public async getUserActiveChats(userId: string): Promise { - try { - const userData = await this.getActiveUser(userId); - return userData?.activeChatIds || []; - } catch (error) { - logError(`Failed to get active chats for user ${userId}`, error as Error); - return []; - } - } - - public async updateChatActivity(chatId: string, messageCount?: number): Promise { - try { - const chatData = await this.getActiveChat(chatId); - if (chatData) { - chatData.lastActivity = new Date(); - if (messageCount !== undefined) { - chatData.messageCount = messageCount; - } - await this.setActiveChat(chatId, chatData); - } - } catch (error) { - logError(`Failed to update chat activity ${chatId}`, error as Error); - } - } - - public async getInactiveChats(inactivityMinutes: number): Promise { - try { - const cutoffTime = new Date(Date.now() - inactivityMinutes * 60 * 1000); - const allChats = await this.getAllActiveChats(); - - return allChats - .filter(chat => chat.lastActivity < cutoffTime) - .map(chat => chat.chatId); - } catch (error) { - logError('Failed to get inactive chats', error as Error); - return []; - } - } - - public async cleanupInactiveChats(inactivityMinutes: number): Promise { - try { - const inactiveChats = await this.getInactiveChats(inactivityMinutes); - - for (const chatId of inactiveChats) { - await this.removeActiveChat(chatId); - } - - return inactiveChats; - } catch (error) { - logError('Failed to cleanup inactive chats', error as Error); - return []; - } - } - - public async ping(): Promise { - try { - const result = await this.client.ping(); - return result === 'PONG'; - } catch (error) { - logError('Redis ping failed', error as Error); - return false; - } - } - - public isRedisConnected(): boolean { - return this.isConnected; - } - - // Generic Redis methods for game data - public async get(key: string): Promise { - try { - return await this.client.get(key); - } catch (error) { - logError(`Failed to get key ${key}`, error as Error); - return null; - } - } - - public async set(key: string, value: string): Promise { - try { - await this.client.set(key, value); - } catch (error) { - logError(`Failed to set key ${key}`, error as Error); - } - } - - public async setWithExpiry(key: string, value: string, expirySeconds: number): Promise { - try { - await this.client.setEx(key, expirySeconds, value); - } catch (error) { - logError(`Failed to set key ${key} with expiry`, error as Error); - } - } - - public async del(key: string): Promise { - try { - await this.client.del(key); - } catch (error) { - logError(`Failed to delete key ${key}`, error as Error); - } - } - - public async setAdd(key: string, member: string): Promise { - try { - await this.client.sAdd(key, member); - } catch (error) { - logError(`Failed to add member to set ${key}`, error as Error); - } - } - - public async setRemove(key: string, member: string): Promise { - try { - await this.client.sRem(key, member); - } catch (error) { - logError(`Failed to remove member from set ${key}`, error as Error); - } - } - - public async setMembers(key: string): Promise { - try { - return await this.client.sMembers(key); - } catch (error) { - logError(`Failed to get members of set ${key}`, error as Error); - return []; - } - } - - public async exists(key: string): Promise { - try { - const result = await this.client.exists(key); - return result === 1; - } catch (error) { - logError(`Failed to check existence of key ${key}`, error as Error); - return false; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Services/TokenService.ts b/SerpentRace_Backend/src/Application/Services/TokenService.ts deleted file mode 100644 index 1745c2b2..00000000 --- a/SerpentRace_Backend/src/Application/Services/TokenService.ts +++ /dev/null @@ -1,229 +0,0 @@ -import * as crypto from 'crypto'; -import { logError } from './Logger'; - -export interface VerificationToken { - token: string; - expiresAt: Date; - createdAt: Date; -} - -export interface PasswordResetToken { - token: string; - expiresAt: Date; - createdAt: Date; -} - -export class TokenService { - private static readonly VERIFICATION_TOKEN_EXPIRES_HOURS = 24; - private static readonly PASSWORD_RESET_TOKEN_EXPIRES_HOURS = 1; - private static readonly TOKEN_LENGTH = 32; - - /** - * Generate a secure random token - * @param length - Length of the token in bytes (default: 32) - * @returns Hexadecimal string token - */ - static generateSecureToken(length: number = TokenService.TOKEN_LENGTH): string { - try { - return crypto.randomBytes(length).toString('hex'); - } catch (error) { - logError('TokenService.generateSecureToken error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to generate secure token'); - } - } - - /** - * Generate email verification token with expiration - * @returns VerificationToken object with token and expiration info - */ - static generateVerificationToken(): VerificationToken { - try { - const token = this.generateSecureToken(); - const createdAt = new Date(); - const expiresAt = new Date(createdAt.getTime() + (this.VERIFICATION_TOKEN_EXPIRES_HOURS * 60 * 60 * 1000)); - - return { - token, - createdAt, - expiresAt - }; - } catch (error) { - logError('TokenService.generateVerificationToken error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to generate verification token'); - } - } - - /** - * Generate password reset token with expiration - * @returns PasswordResetToken object with token and expiration info - */ - static generatePasswordResetToken(): PasswordResetToken { - try { - const token = this.generateSecureToken(); - const createdAt = new Date(); - const expiresAt = new Date(createdAt.getTime() + (this.PASSWORD_RESET_TOKEN_EXPIRES_HOURS * 60 * 60 * 1000)); - - return { - token, - createdAt, - expiresAt - }; - } catch (error) { - logError('TokenService.generatePasswordResetToken error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to generate password reset token'); - } - } - - /** - * Check if a token has expired - * @param expiresAt - Expiration date of the token - * @returns True if token has expired, false otherwise - */ - static isTokenExpired(expiresAt: Date): boolean { - try { - return new Date() > expiresAt; - } catch (error) { - logError('TokenService.isTokenExpired error', error instanceof Error ? error : new Error(String(error))); - return true; // Assume expired on error for security - } - } - - /** - * Validate token format (basic validation) - * @param token - Token to validate - * @returns True if token format is valid, false otherwise - */ - static isValidTokenFormat(token: string): boolean { - try { - if (!token || typeof token !== 'string') { - return false; - } - - // Check if token is hexadecimal and has expected length - const hexRegex = /^[a-f0-9]+$/i; - const expectedLength = this.TOKEN_LENGTH * 2; // Each byte becomes 2 hex characters - - return hexRegex.test(token) && token.length === expectedLength; - } catch (error) { - logError('TokenService.isValidTokenFormat error', error instanceof Error ? error : new Error(String(error))); - return false; - } - } - - /** - * Generate a verification URL with token - * @param baseUrl - Base URL of the application - * @param token - Verification token - * @returns Complete verification URL - */ - static generateVerificationUrl(baseUrl: string, token: string): string { - try { - // Remove trailing slash from baseUrl if present - const cleanBaseUrl = baseUrl.replace(/\/$/, ''); - return `${cleanBaseUrl}/api/auth/verify-email?token=${encodeURIComponent(token)}`; - } catch (error) { - logError('TokenService.generateVerificationUrl error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to generate verification URL'); - } - } - - /** - * Generate a password reset URL with token - * @param baseUrl - Base URL of the application - * @param token - Password reset token - * @returns Complete password reset URL - */ - static generatePasswordResetUrl(baseUrl: string, token: string): string { - try { - // Remove trailing slash from baseUrl if present - const cleanBaseUrl = baseUrl.replace(/\/$/, ''); - return `${cleanBaseUrl}/api/auth/reset-password?token=${encodeURIComponent(token)}`; - } catch (error) { - logError('TokenService.generatePasswordResetUrl error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to generate password reset URL'); - } - } - - /** - * Hash a token for secure storage in database - * @param token - Plain text token to hash - * @returns Hashed token - */ - static async hashToken(token: string): Promise { - try { - if (!token || typeof token !== 'string') { - throw new Error('Token must be a non-empty string'); - } - - return crypto.createHash('sha256').update(token).digest('hex'); - } catch (error) { - logError('TokenService.hashToken error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to hash token'); - } - } - - /** - * Verify a plain text token against a hashed token - * @param plainToken - Plain text token to verify - * @param hashedToken - Hashed token to compare against - * @returns True if tokens match, false otherwise - */ - static async verifyToken(plainToken: string, hashedToken: string): Promise { - try { - if (!plainToken || !hashedToken) { - return false; - } - - const hashedPlainToken = await this.hashToken(plainToken); - return hashedPlainToken === hashedToken; - } catch (error) { - logError('TokenService.verifyToken error', error instanceof Error ? error : new Error(String(error))); - return false; - } - } - - /** - * Get token expiration info in human-readable format - * @param expiresAt - Expiration date - * @returns Human-readable expiration info - */ - static getExpirationInfo(expiresAt: Date): { expired: boolean; timeLeft: string } { - try { - const now = new Date(); - const expired = now > expiresAt; - - if (expired) { - const timeAgo = Math.floor((now.getTime() - expiresAt.getTime()) / (1000 * 60)); - return { - expired: true, - timeLeft: `Expired ${timeAgo} minute(s) ago` - }; - } - - const timeLeft = Math.floor((expiresAt.getTime() - now.getTime()) / (1000 * 60)); - const hours = Math.floor(timeLeft / 60); - const minutes = timeLeft % 60; - - let timeString = ''; - if (hours > 0) { - timeString = `${hours} hour(s)`; - if (minutes > 0) { - timeString += ` and ${minutes} minute(s)`; - } - } else { - timeString = `${minutes} minute(s)`; - } - - return { - expired: false, - timeLeft: `Expires in ${timeString}` - }; - } catch (error) { - logError('TokenService.getExpirationInfo error', error instanceof Error ? error : new Error(String(error))); - return { - expired: true, - timeLeft: 'Unable to determine expiration' - }; - } - } -} diff --git a/SerpentRace_Backend/src/Application/Services/ValidationMiddleware.ts b/SerpentRace_Backend/src/Application/Services/ValidationMiddleware.ts deleted file mode 100644 index cabe01b9..00000000 --- a/SerpentRace_Backend/src/Application/Services/ValidationMiddleware.ts +++ /dev/null @@ -1,341 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; -import { ErrorResponseService } from './ErrorResponseService'; -import { logError, logWarning } from './Logger'; - -/** - * Common validation middleware functions for request validation - */ -export class ValidationMiddleware { - - /** - * Validates required fields in request body - * @param requiredFields Array of required field names - */ - static validateRequiredFields(requiredFields: string[]) { - return (req: Request, res: Response, next: NextFunction) => { - const missingFields: string[] = []; - - for (const field of requiredFields) { - if (!req.body || req.body[field] === undefined || req.body[field] === null || req.body[field] === '') { - missingFields.push(field); - } - } - - if (missingFields.length > 0) { - logWarning('Validation failed - missing required fields', { - missingFields, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'Missing required fields', - { missingFields } - ); - } - - next(); - }; - } - - /** - * Validates field types in request body - * @param fieldTypes Object mapping field names to expected types - */ - static validateFieldTypes(fieldTypes: Record) { - return (req: Request, res: Response, next: NextFunction) => { - const typeErrors: string[] = []; - - for (const [field, expectedType] of Object.entries(fieldTypes)) { - if (req.body && req.body[field] !== undefined) { - const actualType = Array.isArray(req.body[field]) ? 'array' : typeof req.body[field]; - - if (actualType !== expectedType) { - typeErrors.push(`Field '${field}' should be ${expectedType}, got ${actualType}`); - } - } - } - - if (typeErrors.length > 0) { - logWarning('Validation failed - invalid field types', { - typeErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'Invalid field types', - { errors: typeErrors } - ); - } - - next(); - }; - } - - /** - * Validates string field length constraints - * @param constraints Object mapping field names to min/max length - */ - static validateStringLength(constraints: Record) { - return (req: Request, res: Response, next: NextFunction) => { - const lengthErrors: string[] = []; - - for (const [field, constraint] of Object.entries(constraints)) { - if (req.body && typeof req.body[field] === 'string') { - const value = req.body[field]; - - if (constraint.min !== undefined && value.length < constraint.min) { - lengthErrors.push(`Field '${field}' must be at least ${constraint.min} characters`); - } - - if (constraint.max !== undefined && value.length > constraint.max) { - lengthErrors.push(`Field '${field}' must not exceed ${constraint.max} characters`); - } - } - } - - if (lengthErrors.length > 0) { - logWarning('Validation failed - string length constraints', { - lengthErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'String length validation failed', - { errors: lengthErrors } - ); - } - - next(); - }; - } - - /** - * Validates email format - * @param emailFields Array of field names that should contain valid emails - */ - static validateEmailFormat(emailFields: string[]) { - return (req: Request, res: Response, next: NextFunction) => { - const emailErrors: string[] = []; - const emailRegex = /^[^\s@]+@[^\s@]+\.[^\s@]+$/; - - for (const field of emailFields) { - if (req.body && req.body[field] && typeof req.body[field] === 'string') { - if (!emailRegex.test(req.body[field])) { - emailErrors.push(`Field '${field}' must contain a valid email address`); - } - } - } - - if (emailErrors.length > 0) { - logWarning('Validation failed - invalid email format', { - emailErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'Email format validation failed', - { errors: emailErrors } - ); - } - - next(); - }; - } - - /** - * Validates UUIDs format - * @param uuidFields Array of field names that should contain valid UUIDs - */ - static validateUUIDFormat(uuidFields: string[]) { - return (req: Request, res: Response, next: NextFunction) => { - const uuidErrors: string[] = []; - const uuidRegex = /^[0-9a-f]{8}-[0-9a-f]{4}-[1-5][0-9a-f]{3}-[89ab][0-9a-f]{3}-[0-9a-f]{12}$/i; - - for (const field of uuidFields) { - const value = field.includes('.') - ? this.getNestedValue(req, field) - : req.body?.[field] || req.params?.[field] || req.query?.[field]; - - if (value && typeof value === 'string') { - if (!uuidRegex.test(value)) { - uuidErrors.push(`Field '${field}' must contain a valid UUID`); - } - } - } - - if (uuidErrors.length > 0) { - logWarning('Validation failed - invalid UUID format', { - uuidErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'UUID format validation failed', - { errors: uuidErrors } - ); - } - - next(); - }; - } - - /** - * Validates numeric constraints - * @param constraints Object mapping field names to min/max values - */ - static validateNumericConstraints(constraints: Record) { - return (req: Request, res: Response, next: NextFunction) => { - const numericErrors: string[] = []; - - for (const [field, constraint] of Object.entries(constraints)) { - if (req.body && typeof req.body[field] === 'number') { - const value = req.body[field]; - - if (constraint.min !== undefined && value < constraint.min) { - numericErrors.push(`Field '${field}' must be at least ${constraint.min}`); - } - - if (constraint.max !== undefined && value > constraint.max) { - numericErrors.push(`Field '${field}' must not exceed ${constraint.max}`); - } - } - } - - if (numericErrors.length > 0) { - logWarning('Validation failed - numeric constraints', { - numericErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'Numeric validation failed', - { errors: numericErrors } - ); - } - - next(); - }; - } - - /** - * Validates that arrays are not empty - * @param arrayFields Array of field names that should contain non-empty arrays - */ - static validateNonEmptyArrays(arrayFields: string[]) { - return (req: Request, res: Response, next: NextFunction) => { - const arrayErrors: string[] = []; - - for (const field of arrayFields) { - if (req.body && Array.isArray(req.body[field])) { - if (req.body[field].length === 0) { - arrayErrors.push(`Field '${field}' must not be empty`); - } - } else if (req.body && req.body[field] !== undefined) { - arrayErrors.push(`Field '${field}' must be an array`); - } - } - - if (arrayErrors.length > 0) { - logWarning('Validation failed - empty arrays', { - arrayErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'Array validation failed', - { errors: arrayErrors } - ); - } - - next(); - }; - } - - /** - * Validates allowed values for enum-like fields - * @param allowedValues Object mapping field names to arrays of allowed values - */ - static validateAllowedValues(allowedValues: Record) { - return (req: Request, res: Response, next: NextFunction) => { - const valueErrors: string[] = []; - - for (const [field, allowed] of Object.entries(allowedValues)) { - if (req.body && req.body[field] !== undefined) { - if (!allowed.includes(req.body[field])) { - valueErrors.push(`Field '${field}' must be one of: ${allowed.join(', ')}`); - } - } - } - - if (valueErrors.length > 0) { - logWarning('Validation failed - disallowed values', { - valueErrors, - endpoint: req.path - }, req, res); - return ErrorResponseService.sendBadRequest( - res, - 'Value validation failed', - { errors: valueErrors } - ); - } - - next(); - }; - } - - /** - * Combines multiple validation middlewares - * @param validations Array of validation middleware functions - */ - static combine(validations: Array<(req: Request, res: Response, next: NextFunction) => void>) { - return async (req: Request, res: Response, next: NextFunction) => { - let currentIndex = 0; - - const runNext = (error?: any) => { - if (error) { - return next(error); - } - - if (currentIndex >= validations.length) { - return next(); - } - - const currentValidation = validations[currentIndex++]; - - try { - currentValidation(req, res, (err?: any) => { - if (res.headersSent) { - return; // Response already sent, don't continue - } - runNext(err); - }); - } catch (error) { - logError('Validation middleware error', error as Error, req, res); - ErrorResponseService.sendInternalServerError(res); - } - }; - - runNext(); - }; - } - - /** - * Helper method to get nested values from request - * @param req Request object - * @param path Dot-notation path like 'body.user.id' - */ - private static getNestedValue(req: Request, path: string): any { - const parts = path.split('.'); - let current: any = req; - - for (const part of parts) { - if (current && typeof current === 'object') { - current = current[part]; - } else { - return undefined; - } - } - - return current; - } -} diff --git a/SerpentRace_Backend/src/Application/Services/WebSocketService.ts b/SerpentRace_Backend/src/Application/Services/WebSocketService.ts deleted file mode 100644 index b04d4367..00000000 --- a/SerpentRace_Backend/src/Application/Services/WebSocketService.ts +++ /dev/null @@ -1,1413 +0,0 @@ -import { Server as HttpServer } from 'http'; -import { Server as SocketIOServer, Socket } from 'socket.io'; -import { JWTService, TokenPayload } from './JWTService'; -import { ChatRepository } from '../../Infrastructure/Repository/ChatRepository'; -import { ChatArchiveRepository } from '../../Infrastructure/Repository/ChatArchiveRepository'; -import { UserRepository } from '../../Infrastructure/Repository/UserRepository'; -import { ChatAggregate, ChatType, ChatTypeType, Message } from '../../Domain/Chat/ChatAggregate'; -import { UserState } from '../../Domain/User/UserAggregate'; -import { logAuth, logError, logRequest, logWarning } from './Logger'; -import { RedisService, ActiveChatData } from './RedisService'; -import { v4 as uuidv4 } from 'uuid'; - -interface AuthenticatedSocket extends Socket { - userId?: string; - authLevel?: 0 | 1; - userStatus?: UserState; - orgId?: string | null; -} - -interface JoinChatData { - chatId: string; -} - -interface SendMessageData { - chatId: string; - message: string; -} - -interface CreateGroupData { - name: string; - userIds: string[]; -} - -interface CreateDirectChatData { - targetUserId: string; -} - -interface CreateGameChatData { - gameId: string; - gameName: string; - playerIds: string[]; -} - -interface DeleteChatData { - chatId: string; -} - -interface DeleteChatArchiveData { - archiveId: string; -} - -interface DeleteMessageData { - chatId: string; - messageId: string; -} - -// Game-related WebSocket interfaces (prepared for future implementation) -interface JoinGameRoomData { - gameCode: string; -} - -interface LeaveGameRoomData { - gameCode: string; -} - -interface GameStateUpdateData { - gameId: string; - gameCode: string; - players: string[]; - state: string; - currentTurn?: string; -} - -interface GameActionData { - gameId: string; - gameCode: string; - playerId: string; - action: 'pick_card' | 'play_card' | 'end_turn' | 'leave_game'; - data?: any; -} - -export class WebSocketService { - private io: SocketIOServer; - private jwtService: JWTService; - private chatRepository: ChatRepository; - private chatArchiveRepository: ChatArchiveRepository; - private userRepository: UserRepository; - private redisService: RedisService; - private connectedUsers: Map = new Map(); - private chatTimeout: number; - private maxMessagesPerUser: number; - private messageCleanupWeeks: number; - private userMessageCounts: Map = new Map(); - - constructor(httpServer: HttpServer) { - this.io = new SocketIOServer(httpServer, { - cors: { - origin: ['http://localhost:3000', 'http://localhost:3001', 'http://localhost:8080'], - methods: ['GET', 'POST'], - credentials: true - } - }); - - this.jwtService = new JWTService(); - this.chatRepository = new ChatRepository(); - this.chatArchiveRepository = new ChatArchiveRepository(); - this.userRepository = new UserRepository(); - this.redisService = RedisService.getInstance(); - this.chatTimeout = parseInt(process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES || '30'); - this.maxMessagesPerUser = parseInt(process.env.CHAT_MAX_MESSAGES_PER_USER || '100'); - this.messageCleanupWeeks = parseInt(process.env.CHAT_MESSAGE_CLEANUP_WEEKS || '4'); - - // Initialize Redis connection - this.initializeRedis(); - - this.setupSocketHandlers(); - this.setupArchivingScheduler(); - - logRequest('WebSocket service initialized', undefined, undefined, { - chatTimeoutMinutes: this.chatTimeout - }); - } - - private async initializeRedis(): Promise { - try { - await this.redisService.connect(); - } catch (error) { - logError('Failed to initialize Redis connection', error as Error); - } - } - - private setupSocketHandlers() { - this.io.use(async (socket: AuthenticatedSocket, next) => { - try { - const token = socket.handshake.auth.token || socket.handshake.headers.cookie - ?.split(';') - .find(c => c.trim().startsWith('auth_token=')) - ?.split('=')[1]; - - if (!token) { - logWarning('WebSocket connection rejected - No token provided', { - socketId: socket.id, - ip: socket.handshake.address - }); - return next(new Error('Authentication required')); - } - - // Create a mock request object for JWT verification - const mockRequest = { - headers: { - authorization: `Bearer ${token}`, - cookie: `auth_token=${token}` - }, - cookies: { - auth_token: token - } - } as any; - - const payload = this.jwtService.verify(mockRequest); - if (!payload) { - logWarning('WebSocket connection rejected - Invalid token', { - socketId: socket.id, - ip: socket.handshake.address - }); - return next(new Error('Invalid token')); - } - - socket.userId = payload.userId; - socket.authLevel = payload.authLevel; - socket.userStatus = payload.userStatus; - socket.orgId = payload.orgId; - - logAuth('WebSocket connection authenticated', payload.userId, { - socketId: socket.id, - authLevel: payload.authLevel, - userStatus: payload.userStatus, - orgId: payload.orgId - }); - - next(); - } catch (error) { - logError('WebSocket authentication error', error as Error); - next(new Error('Authentication failed')); - } - }); - - this.io.on('connection', (socket: AuthenticatedSocket) => { - this.handleConnection(socket); - }); - } - - private async handleConnection(socket: AuthenticatedSocket) { - const userId = socket.userId!; - - // Store connected user - this.connectedUsers.set(userId, socket); - - // Load user's active chats and join rooms - try { - const userChats = await this.chatRepository.findActiveChatsForUser(userId); - const chatIds = userChats.map(chat => chat.id); - - // Join all chat rooms - chatIds.forEach(chatId => { - socket.join(chatId); - }); - - // Store user's chat memberships in Redis - await this.redisService.setActiveUser(userId, { - userId, - activeChatIds: chatIds, - lastActivity: new Date(), - isOnline: true - }); - - // Also store each active chat in Redis - for (const chat of userChats) { - await this.redisService.setActiveChat(chat.id, { - chatId: chat.id, - participants: chat.users, - lastActivity: chat.lastActivity || new Date(), - messageCount: chat.messages.length, - chatType: chat.type as 'direct' | 'group' | 'game', - gameId: chat.gameId || undefined, - name: chat.name || undefined - }); - } - - logAuth('User connected to WebSocket', userId, { - socketId: socket.id, - activeChats: chatIds.length - }); - - // Send user their active chats with unread counts - const chatsWithUnread = await Promise.all(userChats.map(async (chat) => ({ - id: chat.id, - type: chat.type, - name: chat.name, - gameId: chat.gameId, - users: chat.users, - lastActivity: chat.lastActivity, - unreadCount: this.calculateUnreadMessages(chat, userId), - isArchived: false - }))); - - socket.emit('chats:list', chatsWithUnread); - - } catch (error) { - logError('Error loading user chats on connection', error as Error, undefined, undefined); - socket.emit('error', { message: 'Failed to load chats' }); - } - - // Setup event handlers - socket.on('chat:join', (data: JoinChatData) => this.handleJoinChat(socket, data)); - socket.on('chat:leave', (data: JoinChatData) => this.handleLeaveChat(socket, data)); - socket.on('message:send', (data: SendMessageData) => this.handleSendMessage(socket, data)); - socket.on('group:create', (data: CreateGroupData) => this.handleCreateGroup(socket, data)); - socket.on('chat:direct', (data: CreateDirectChatData) => this.handleCreateDirectChat(socket, data)); - socket.on('game:chat:create', (data: CreateGameChatData) => this.handleCreateGameChat(socket, data)); - socket.on('chat:history', (data: JoinChatData) => this.handleGetChatHistory(socket, data)); - socket.on('chat:delete', (data: DeleteChatData) => this.handleDeleteChat(socket, data)); - socket.on('chat:archive:delete', (data: DeleteChatArchiveData) => this.handleDeleteChatArchive(socket, data)); - socket.on('message:delete', (data: DeleteMessageData) => this.handleDeleteMessage(socket, data)); - - // Game event handlers (prepared for future implementation) - socket.on('game:join', (data: JoinGameRoomData) => this.handleJoinGameRoom(socket, data)); - socket.on('game:leave', (data: LeaveGameRoomData) => this.handleLeaveGameRoom(socket, data)); - socket.on('game:action', (data: GameActionData) => this.handleGameAction(socket, data)); - - socket.on('disconnect', () => this.handleDisconnection(socket)); - } - - private async handleJoinChat(socket: AuthenticatedSocket, data: JoinChatData) { - try { - const userId = socket.userId!; - const chat = await this.chatRepository.findById(data.chatId); - - if (!chat) { - socket.emit('error', { message: 'Chat not found' }); - return; - } - - // Check if user is member of this chat - if (!chat.users.includes(userId)) { - socket.emit('error', { message: 'Unauthorized to join this chat' }); - return; - } - - // Join the chat room - socket.join(data.chatId); - - // Add to user's active chats in Redis - await this.redisService.addUserToChat(userId, data.chatId); - - // Update chat activity in Redis - await this.redisService.updateChatActivity(data.chatId); - - // Update last activity in database - await this.chatRepository.update(data.chatId, { lastActivity: new Date() }); - - logAuth('User joined chat', userId, { - chatId: data.chatId, - chatType: chat.type - }); - - socket.emit('chat:joined', { - chatId: data.chatId, - messages: chat.messages.slice(-10) // Last 10 messages - }); - - } catch (error) { - logError('Error joining chat', error as Error); - socket.emit('error', { message: 'Failed to join chat' }); - } - } - - private async handleLeaveChat(socket: AuthenticatedSocket, data: JoinChatData) { - try { - const userId = socket.userId!; - - // Leave the chat room - socket.leave(data.chatId); - - // Remove from user's active chats in Redis - await this.redisService.removeUserFromChat(userId, data.chatId); - - logAuth('User left chat', userId, { - chatId: data.chatId - }); - - socket.emit('chat:left', { chatId: data.chatId }); - - } catch (error) { - logError('Error leaving chat', error as Error); - socket.emit('error', { message: 'Failed to leave chat' }); - } - } - - private async handleSendMessage(socket: AuthenticatedSocket, data: SendMessageData) { - try { - const userId = socket.userId!; - - // Rate limiting check - if (!this.checkMessageRateLimit(userId)) { - socket.emit('error', { message: `Rate limit exceeded. Maximum ${this.maxMessagesPerUser} messages per minute allowed.` }); - return; - } - - // Validate message is string and not empty - if (typeof data.message !== 'string' || !data.message.trim()) { - socket.emit('error', { message: 'Message must be a non-empty string' }); - return; - } - - const chat = await this.chatRepository.findById(data.chatId); - if (!chat) { - socket.emit('error', { message: 'Chat not found' }); - return; - } - - // Check if user is member of this chat - if (!chat.users.includes(userId)) { - socket.emit('error', { message: 'Unauthorized to send message to this chat' }); - return; - } - - // Create message - const message: Message = { - id: uuidv4(), - date: new Date(), - userid: userId, - text: data.message.trim() - }; - - // Manage message history based on chat type - let updatedMessages = [...chat.messages, message]; - updatedMessages = this.pruneMessages(updatedMessages, chat.type); - - // Update chat - await this.chatRepository.update(data.chatId, { - messages: updatedMessages, - lastActivity: new Date() - }); - - // Update chat activity in Redis with new message count - await this.redisService.updateChatActivity(data.chatId, updatedMessages.length); - - // Broadcast to all users in the chat room - this.io.to(data.chatId).emit('message:received', { - chatId: data.chatId, - message: message - }); - - // Send notifications to offline users - await this.notifyOfflineUsers(chat, message); - - logAuth('Message sent', userId, { - chatId: data.chatId, - messageLength: data.message.length, - chatType: chat.type - }); - - } catch (error) { - logError('Error sending message', error as Error); - socket.emit('error', { message: 'Failed to send message' }); - } - } - - private async handleCreateGroup(socket: AuthenticatedSocket, data: CreateGroupData) { - try { - const userId = socket.userId!; - - // Check if user is premium (required to create groups) - const user = await this.userRepository.findById(userId); - if (!user || user.state !== UserState.VERIFIED_PREMIUM) { - socket.emit('error', { message: 'Premium subscription required to create groups' }); - return; - } - - // Validate group data - if (!data.name?.trim()) { - socket.emit('error', { message: 'Group name is required' }); - return; - } - - if (!data.userIds || data.userIds.length === 0) { - socket.emit('error', { message: 'At least one member is required' }); - return; - } - - // Verify all users exist - const members = await Promise.all( - data.userIds.map(id => this.userRepository.findById(id)) - ); - - if (members.some(member => !member)) { - socket.emit('error', { message: 'One or more users not found' }); - return; - } - - // Create group chat - const groupChat = await this.chatRepository.create({ - type: ChatType.GROUP, - name: data.name.trim(), - createdBy: userId, - users: [userId, ...data.userIds], // Include creator - messages: [], - lastActivity: new Date() - }); - - // Add all members to the group room and store in Redis - const allMemberIds = data.userIds.concat(userId); - for (const memberId of allMemberIds) { - const memberSocket = this.connectedUsers.get(memberId); - if (memberSocket) { - memberSocket.join(groupChat.id); - } - - // Update user's chat list in Redis - await this.redisService.addUserToChat(memberId, groupChat.id); - } - - // Store the group chat in Redis - await this.redisService.setActiveChat(groupChat.id, { - chatId: groupChat.id, - participants: allMemberIds, - lastActivity: new Date(), - messageCount: 0, - chatType: 'group', - name: groupChat.name || undefined - }); - - // Notify all members - this.io.to(groupChat.id).emit('group:created', { - chat: { - id: groupChat.id, - type: groupChat.type, - name: groupChat.name, - createdBy: groupChat.createdBy, - users: groupChat.users, - messages: [] - } - }); - - logAuth('Group created', userId, { - groupId: groupChat.id, - groupName: data.name, - memberCount: groupChat.users.length - }); - - } catch (error) { - logError('Error creating group', error as Error); - socket.emit('error', { message: 'Failed to create group' }); - } - } - - private async handleCreateDirectChat(socket: AuthenticatedSocket, data: CreateDirectChatData) { - try { - const userId = socket.userId!; - - // Validate target user exists - const targetUser = await this.userRepository.findById(data.targetUserId); - if (!targetUser) { - socket.emit('error', { message: 'Target user not found' }); - return; - } - - // Check if direct chat already exists - const existingChats = await this.chatRepository.findByUserId(userId); - const existingDirectChat = existingChats.find(chat => - chat.type === ChatType.DIRECT && - chat.users.length === 2 && - chat.users.includes(data.targetUserId) - ); - - if (existingDirectChat) { - socket.emit('chat:direct:exists', { - chatId: existingDirectChat.id - }); - return; - } - - // Create direct chat - const directChat = await this.chatRepository.create({ - type: ChatType.DIRECT, - users: [userId, data.targetUserId], - messages: [], - lastActivity: new Date() - }); - - // Add both users to the chat room if they're online and store in Redis - const memberIds = [userId, data.targetUserId]; - for (const memberId of memberIds) { - const memberSocket = this.connectedUsers.get(memberId); - if (memberSocket) { - memberSocket.join(directChat.id); - } - - // Update user's chat list in Redis - await this.redisService.addUserToChat(memberId, directChat.id); - } - - // Store the direct chat in Redis - await this.redisService.setActiveChat(directChat.id, { - chatId: directChat.id, - participants: memberIds, - lastActivity: new Date(), - messageCount: 0, - chatType: 'direct' - }); - - // Notify both users - this.io.to(directChat.id).emit('chat:direct:created', { - chat: { - id: directChat.id, - type: directChat.type, - users: directChat.users, - messages: [] - } - }); - - logAuth('Direct chat created', userId, { - chatId: directChat.id, - targetUserId: data.targetUserId - }); - - } catch (error) { - logError('Error creating direct chat', error as Error); - socket.emit('error', { message: 'Failed to create direct chat' }); - } - } - - private async handleCreateGameChat(socket: AuthenticatedSocket, data: CreateGameChatData) { - try { - const userId = socket.userId!; - - // Check if game chat already exists - const existingGameChat = await this.chatRepository.findByGameId(data.gameId); - if (existingGameChat) { - socket.emit('game:chat:exists', { - chatId: existingGameChat.id - }); - return; - } - - // Create game chat - const gameChat = await this.chatRepository.create({ - type: ChatType.GAME, - name: data.gameName, - gameId: data.gameId, - users: data.playerIds, - messages: [], - lastActivity: new Date() - }); - - // Add all players to the game chat room if they're online and store in Redis - for (const playerId of data.playerIds) { - const playerSocket = this.connectedUsers.get(playerId); - if (playerSocket) { - playerSocket.join(gameChat.id); - } - - // Update user's chat list in Redis - await this.redisService.addUserToChat(playerId, gameChat.id); - } - - // Store the game chat in Redis - await this.redisService.setActiveChat(gameChat.id, { - chatId: gameChat.id, - participants: data.playerIds, - lastActivity: new Date(), - messageCount: 0, - chatType: 'game', - gameId: gameChat.gameId || undefined, - name: gameChat.name || undefined - }); - - // Notify all players - this.io.to(gameChat.id).emit('game:chat:created', { - chat: { - id: gameChat.id, - type: gameChat.type, - name: gameChat.name, - gameId: gameChat.gameId, - users: gameChat.users, - messages: [] - } - }); - - logAuth('Game chat created', userId, { - chatId: gameChat.id, - gameId: data.gameId, - gameName: data.gameName, - playerCount: data.playerIds.length - }); - - } catch (error) { - logError('Error creating game chat', error as Error); - socket.emit('error', { message: 'Failed to create game chat' }); - } - } - - private async handleGetChatHistory(socket: AuthenticatedSocket, data: JoinChatData) { - try { - const userId = socket.userId!; - const chat = await this.chatRepository.findById(data.chatId); - - if (!chat) { - // Check if it's archived - const archived = await this.chatRepository.getArchivedChat(data.chatId); - if (archived) { - socket.emit('chat:history:archived', { - chatId: data.chatId, - messages: archived.archivedMessages, - chatType: archived.chatType, - isGameChat: archived.chatType === ChatType.GAME - }); - } else { - socket.emit('error', { message: 'Chat not found' }); - } - return; - } - - // Check if user has access - if (!chat.users.includes(userId)) { - socket.emit('error', { message: 'Unauthorized to view this chat' }); - return; - } - - socket.emit('chat:history', { - chatId: data.chatId, - messages: chat.messages, - chatInfo: { - type: chat.type, - name: chat.name, - gameId: chat.gameId, - users: chat.users - } - }); - - } catch (error) { - logError('Error getting chat history', error as Error); - socket.emit('error', { message: 'Failed to get chat history' }); - } - } - - private async handleDeleteChat(socket: AuthenticatedSocket, data: DeleteChatData) { - try { - const userId = socket.userId!; - const chat = await this.chatRepository.findById(data.chatId); - - if (!chat) { - socket.emit('error', { message: 'Chat not found' }); - return; - } - - // Check if user is member of this chat - if (!chat.users.includes(userId)) { - socket.emit('error', { message: 'Unauthorized to delete this chat' }); - return; - } - - // Perform soft delete - const deletedChat = await this.chatRepository.softDelete(data.chatId); - if (!deletedChat) { - socket.emit('error', { message: 'Failed to delete chat' }); - return; - } - - // Remove from Redis active chats - await this.redisService.removeActiveChat(data.chatId); - - // Notify all participants that the chat has been deleted - this.io.to(data.chatId).emit('chat:deleted', { - chatId: data.chatId, - deletedBy: userId - }); - - // Remove all users from the chat room - for (const participantId of chat.users) { - const participantSocket = this.connectedUsers.get(participantId); - if (participantSocket) { - participantSocket.leave(data.chatId); - } - // Remove from user's active chats in Redis - await this.redisService.removeUserFromChat(participantId, data.chatId); - } - - logAuth('Chat deleted', userId, { - chatId: data.chatId, - chatType: chat.type, - participantCount: chat.users.length - }); - - socket.emit('chat:delete:success', { - chatId: data.chatId, - message: 'Chat deleted successfully' - }); - - } catch (error) { - logError('Error deleting chat', error as Error); - socket.emit('error', { message: 'Failed to delete chat' }); - } - } - - private async handleDeleteChatArchive(socket: AuthenticatedSocket, data: DeleteChatArchiveData) { - try { - const userId = socket.userId!; - const archive = await this.chatArchiveRepository.findById(data.archiveId); - - if (!archive) { - socket.emit('error', { message: 'Chat archive not found' }); - return; - } - - // Check if user was a participant in the archived chat - if (!archive.participants.includes(userId)) { - socket.emit('error', { message: 'Unauthorized to delete this chat archive' }); - return; - } - - // Hard delete the archive (since it's already archived) - await this.chatArchiveRepository.delete(data.archiveId); - - logAuth('Chat archive deleted', userId, { - archiveId: data.archiveId, - originalChatId: archive.chatId, - chatType: archive.chatType, - participantCount: archive.participants.length - }); - - socket.emit('chat:archive:delete:success', { - archiveId: data.archiveId, - message: 'Chat archive deleted successfully' - }); - - } catch (error) { - logError('Error deleting chat archive', error as Error); - socket.emit('error', { message: 'Failed to delete chat archive' }); - } - } - - private async handleDeleteMessage(socket: AuthenticatedSocket, data: DeleteMessageData) { - try { - const userId = socket.userId!; - - // Check if user has admin/moderator privileges - const user = await this.userRepository.findById(userId); - if (!user || user.state !== UserState.ADMIN) { // Check if user is admin - socket.emit('error', { message: 'Insufficient permissions to delete messages' }); - return; - } - - const success = await this.deleteMessage(data.chatId, data.messageId, userId); - if (success) { - socket.emit('message:delete:success', { - chatId: data.chatId, - messageId: data.messageId, - message: 'Message deleted successfully' - }); - } else { - socket.emit('error', { message: 'Failed to delete message or message not found' }); - } - - } catch (error) { - logError('Error handling delete message request', error as Error); - socket.emit('error', { message: 'Failed to delete message' }); - } - } - - private async handleDisconnection(socket: AuthenticatedSocket) { - const userId = socket.userId; - if (userId) { - this.connectedUsers.delete(userId); - - // Update user status in Redis - const userData = await this.redisService.getActiveUser(userId); - if (userData) { - userData.isOnline = false; - userData.lastActivity = new Date(); - await this.redisService.setActiveUser(userId, userData); - } - - logAuth('User disconnected from WebSocket', userId, { - socketId: socket.id - }); - } - } - - // Utility methods - private calculateUnreadMessages(chat: ChatAggregate, userId: string): number { - // Simple implementation - count messages after user's last seen - // In production, you'd store lastSeen timestamp per user per chat - return chat.messages.filter(msg => msg.userid !== userId).length; - } - - private pruneMessages(messages: Message[], chatType: ChatTypeType): Message[] { - const twoWeeksAgo = new Date(Date.now() - 14 * 24 * 60 * 60 * 1000); - - // Remove messages older than 2 weeks - let prunedMessages = messages.filter(msg => new Date(msg.date) > twoWeeksAgo); - - // For group chats, only apply the 2-week time limit (unlimited messages per user) - if (chatType === ChatType.GROUP) { - return prunedMessages.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); - } - - // For direct and game chats, apply both time limit and per-user message limit - // Group by user and keep last 10 messages per user - const messagesByUser = new Map(); - prunedMessages.forEach(msg => { - if (!messagesByUser.has(msg.userid)) { - messagesByUser.set(msg.userid, []); - } - messagesByUser.get(msg.userid)!.push(msg); - }); - - // Keep only last 10 messages per user - const finalMessages: Message[] = []; - messagesByUser.forEach((userMessages, userId) => { - const last10 = userMessages.slice(-10); - finalMessages.push(...last10); - }); - - // Sort by date - return finalMessages.sort((a, b) => new Date(a.date).getTime() - new Date(b.date).getTime()); - } - - private async notifyOfflineUsers(chat: ChatAggregate, message: Message) { - // Find users who are not currently connected - const offlineUsers = chat.users.filter(userId => - userId !== message.userid && !this.connectedUsers.has(userId) - ); - - // In a real implementation, you would send push notifications or emails here - if (offlineUsers.length > 0) { - logRequest('Offline users to notify', undefined, undefined, { - chatId: chat.id, - offlineUserCount: offlineUsers.length, - messageFrom: message.userid - }); - } - } - - private setupArchivingScheduler() { - // Run every hour to check for inactive chats - setInterval(async () => { - try { - // First, cleanup inactive chats from Redis and get their IDs - const inactiveChatIds = await this.redisService.cleanupInactiveChats(this.chatTimeout); - - // Archive the inactive chats in the database - for (const chatId of inactiveChatIds) { - const chat = await this.chatRepository.findById(chatId); - if (chat) { - await this.chatRepository.archiveChat(chat); - logRequest('Chat archived due to inactivity', undefined, undefined, { - chatId: chat.id, - chatType: chat.type, - lastActivity: chat.lastActivity, - messageCount: chat.messages.length - }); - } - } - - // Also find inactive chats from database that might not be in Redis - const dbInactiveChats = await this.chatRepository.findInactiveChats(this.chatTimeout); - const additionalInactiveChats = dbInactiveChats.filter(chat => - !inactiveChatIds.includes(chat.id) - ); - - for (const chat of additionalInactiveChats) { - await this.chatRepository.archiveChat(chat); - logRequest('Chat archived due to inactivity (from DB)', undefined, undefined, { - chatId: chat.id, - chatType: chat.type, - lastActivity: chat.lastActivity, - messageCount: chat.messages.length - }); - } - - const totalArchived = inactiveChatIds.length + additionalInactiveChats.length; - if (totalArchived > 0) { - logRequest('Chat archiving completed', undefined, undefined, { - archivedCount: totalArchived, - redisCleanedUp: inactiveChatIds.length, - databaseCleanedUp: additionalInactiveChats.length, - timeoutMinutes: this.chatTimeout - }); - } - - // Cleanup old messages from archived chats based on messageCleanupWeeks - await this.cleanupOldMessages(); - - } catch (error) { - logError('Error in chat archiving scheduler', error as Error); - } - }, 60 * 60 * 1000); // 1 hour - - // Also run message count cleanup every 5 minutes - setInterval(() => { - this.cleanupMessageCounts(); - }, 5 * 60 * 1000); // 5 minutes - } - - // Public methods for game integration - public async createGameChat(gameId: string, gameName: string, playerIds: string[]): Promise { - try { - const existingGameChat = await this.chatRepository.findByGameId(gameId); - if (existingGameChat) { - return existingGameChat; - } - - const gameChat = await this.chatRepository.create({ - type: ChatType.GAME, - name: gameName, - gameId: gameId, - users: playerIds, - messages: [], - lastActivity: new Date() - }); - - // Notify connected players - playerIds.forEach(playerId => { - const playerSocket = this.connectedUsers.get(playerId); - if (playerSocket) { - playerSocket.join(gameChat.id); - playerSocket.emit('game:chat:created', { - chat: { - id: gameChat.id, - type: gameChat.type, - name: gameChat.name, - gameId: gameChat.gameId, - users: gameChat.users, - messages: [] - } - }); - } - }); - - return gameChat; - } catch (error) { - logError('Error creating game chat programmatically', error as Error); - return null; - } - } - - public getConnectedUserCount(): number { - return this.connectedUsers.size; - } - - public isUserConnected(userId: string): boolean { - return this.connectedUsers.has(userId); - } - - public async cleanup(): Promise { - try { - await this.redisService.disconnect(); - } catch (error) { - logError('Error during WebSocket service cleanup', error as Error); - } - } - - /** - * Manually trigger cleanup of old messages and chats - * This can be called by admin endpoints for maintenance - */ - public async triggerManualCleanup(): Promise<{ deletedArchives: number; deletedChats: number }> { - try { - const cutoffDate = new Date(); - cutoffDate.setDate(cutoffDate.getDate() - (this.messageCleanupWeeks * 7)); - - // Clean up old archived messages - const deletedArchivesCount = await this.chatArchiveRepository.cleanup(this.messageCleanupWeeks * 7); - - // Clean up soft-deleted chats - const softDeletedChats = await this.chatRepository.findByPageIncludingDeleted(0, 1000); - let deletedChatsCount = 0; - - for (const chat of softDeletedChats.chats) { - if (chat.state === 2 && chat.updateDate < cutoffDate) { // SOFT_DELETE state = 2 - await this.chatRepository.delete(chat.id); // Hard delete - deletedChatsCount++; - } - } - - logRequest('Manual cleanup triggered', undefined, undefined, { - cutoffDate: cutoffDate.toISOString(), - cleanupWeeks: this.messageCleanupWeeks, - deletedArchives: deletedArchivesCount, - deletedChats: deletedChatsCount, - triggeredBy: 'manual' - }); - - return { deletedArchives: deletedArchivesCount, deletedChats: deletedChatsCount }; - - } catch (error) { - logError('Error during manual cleanup', error as Error); - throw error; - } - } - - /** - * Clean up old messages from archived chats based on messageCleanupWeeks setting - */ - private async cleanupOldMessages(): Promise { - try { - const cutoffDate = new Date(); - cutoffDate.setDate(cutoffDate.getDate() - (this.messageCleanupWeeks * 7)); - - // Clean up old archived messages using ChatArchiveRepository - const deletedArchivesCount = await this.chatArchiveRepository.cleanup(this.messageCleanupWeeks * 7); - - // Also clean up soft-deleted chats from the main repository - // Get all soft-deleted chats that are older than the cleanup period - const softDeletedChats = await this.chatRepository.findByPageIncludingDeleted(0, 1000); - let deletedChatsCount = 0; - - for (const chat of softDeletedChats.chats) { - if (chat.state === 2 && chat.updateDate < cutoffDate) { // SOFT_DELETE state = 2 - await this.chatRepository.delete(chat.id); // Hard delete - deletedChatsCount++; - } - } - - logRequest('Old message cleanup completed', undefined, undefined, { - cutoffDate: cutoffDate.toISOString(), - cleanupWeeks: this.messageCleanupWeeks, - deletedArchives: deletedArchivesCount, - deletedChats: deletedChatsCount, - note: 'Cleanup completed using both ChatRepository and ChatArchiveRepository' - }); - - } catch (error) { - logError('Error cleaning up old messages', error as Error); - } - } - - /** - * Check if user has exceeded message rate limit - * @param userId User ID to check - * @returns true if within limit, false if exceeded - */ - private checkMessageRateLimit(userId: string): boolean { - const now = Date.now(); - const minute = 60 * 1000; // 1 minute in milliseconds - - const userStats = this.userMessageCounts.get(userId) || { count: 0, lastReset: now }; - - // Reset counter if more than a minute has passed - if (now - userStats.lastReset >= minute) { - userStats.count = 0; - userStats.lastReset = now; - } - - // Check if user is within limits - if (userStats.count >= this.maxMessagesPerUser) { - return false; - } - - // Increment counter - userStats.count++; - this.userMessageCounts.set(userId, userStats); - - return true; - } - - /** - * Delete a specific message from chat history - * This can be used for moderation purposes - */ - public async deleteMessage(chatId: string, messageId: string, moderatorUserId: string): Promise { - try { - // Get the chat - const chat = await this.chatRepository.findById(chatId); - if (!chat) { - // Check archived chats - const archivedChat = await this.chatRepository.getArchivedChat(chatId); - if (!archivedChat) { - logWarning('Chat not found for message deletion', { - chatId, - messageId, - moderatorUserId - }); - return false; - } - - // Remove message from archived chat - const updatedMessages = archivedChat.archivedMessages.filter(msg => msg.id !== messageId); - if (updatedMessages.length === archivedChat.archivedMessages.length) { - logWarning('Message not found in archived chat', { - chatId, - messageId, - moderatorUserId - }); - return false; - } - - // Update archived chat - await this.chatArchiveRepository.create({ - ...archivedChat, - archivedMessages: updatedMessages - }); - - logAuth('Message deleted from archived chat', moderatorUserId, { - chatId, - messageId, - originalMessageCount: archivedChat.archivedMessages.length, - newMessageCount: updatedMessages.length - }); - - return true; - } - - // Remove message from active chat - const updatedMessages = chat.messages.filter(msg => msg.id !== messageId); - if (updatedMessages.length === chat.messages.length) { - logWarning('Message not found in active chat', { - chatId, - messageId, - moderatorUserId - }); - return false; - } - - // Update active chat - await this.chatRepository.update(chatId, { - messages: updatedMessages - }); - - // Notify all users in the chat about message deletion - this.io.to(chatId).emit('message:deleted', { - chatId, - messageId, - deletedBy: moderatorUserId - }); - - logAuth('Message deleted from active chat', moderatorUserId, { - chatId, - messageId, - originalMessageCount: chat.messages.length, - newMessageCount: updatedMessages.length - }); - - return true; - - } catch (error) { - logError('Error deleting message', error as Error); - return false; - } - } - - /** - * Clean up old user message count entries (called periodically) - */ - private cleanupMessageCounts(): void { - const now = Date.now(); - const minute = 60 * 1000; - - for (const [userId, stats] of this.userMessageCounts.entries()) { - if (now - stats.lastReset >= minute * 5) { // Keep for 5 minutes - this.userMessageCounts.delete(userId); - } - } - } - - // Game-related WebSocket handlers (prepared for future implementation) - - /** - * Handle player joining a game room for real-time updates - * @param socket The authenticated socket - * @param data Game room data containing game code - */ - private async handleJoinGameRoom(socket: AuthenticatedSocket, data: JoinGameRoomData) { - try { - const userId = socket.userId!; - const gameRoom = `game_${data.gameCode}`; - - logAuth('Player joining game room', userId, { - gameCode: data.gameCode, - gameRoom, - socketId: socket.id - }); - - // Join the WebSocket room for this game - await socket.join(gameRoom); - - // Emit confirmation to the player - socket.emit('game:joined', { - gameCode: data.gameCode, - room: gameRoom, - message: 'Successfully joined game room' - }); - - // Notify other players in the game room - socket.to(gameRoom).emit('game:player_joined', { - playerId: userId, - gameCode: data.gameCode, - timestamp: new Date().toISOString() - }); - - logAuth('Player joined game room successfully', userId, { - gameCode: data.gameCode, - gameRoom - }); - - } catch (error) { - logError('Error joining game room', error as Error); - socket.emit('game:error', { - message: 'Failed to join game room', - gameCode: data.gameCode - }); - } - } - - /** - * Handle player leaving a game room - * @param socket The authenticated socket - * @param data Game room data containing game code - */ - private async handleLeaveGameRoom(socket: AuthenticatedSocket, data: LeaveGameRoomData) { - try { - const userId = socket.userId!; - const gameRoom = `game_${data.gameCode}`; - - logAuth('Player leaving game room', userId, { - gameCode: data.gameCode, - gameRoom, - socketId: socket.id - }); - - // Leave the WebSocket room - await socket.leave(gameRoom); - - // Notify other players in the game room - socket.to(gameRoom).emit('game:player_left', { - playerId: userId, - gameCode: data.gameCode, - timestamp: new Date().toISOString() - }); - - // Confirm to the leaving player - socket.emit('game:left', { - gameCode: data.gameCode, - message: 'Successfully left game room' - }); - - logAuth('Player left game room successfully', userId, { - gameCode: data.gameCode, - gameRoom - }); - - } catch (error) { - logError('Error leaving game room', error as Error); - socket.emit('game:error', { - message: 'Failed to leave game room', - gameCode: data.gameCode - }); - } - } - - /** - * Handle game actions (cards, turns, etc.) - prepared for future implementation - * @param socket The authenticated socket - * @param data Game action data - */ - private async handleGameAction(socket: AuthenticatedSocket, data: GameActionData) { - try { - const userId = socket.userId!; - const gameRoom = `game_${data.gameCode}`; - - logAuth('Game action received', userId, { - gameId: data.gameId, - gameCode: data.gameCode, - action: data.action, - socketId: socket.id - }); - - // Validate that the player is authorized to perform this action - if (data.playerId !== userId) { - socket.emit('game:error', { - message: 'Unauthorized action', - gameCode: data.gameCode - }); - return; - } - - // TODO: Implement specific game logic here - // This will be implemented when the game flow is discussed - - // For now, just broadcast the action to other players - socket.to(gameRoom).emit('game:action_performed', { - playerId: userId, - gameCode: data.gameCode, - action: data.action, - data: data.data, - timestamp: new Date().toISOString() - }); - - // Confirm action to the acting player - socket.emit('game:action_confirmed', { - gameCode: data.gameCode, - action: data.action, - message: 'Action processed successfully' - }); - - logAuth('Game action processed', userId, { - gameId: data.gameId, - gameCode: data.gameCode, - action: data.action - }); - - } catch (error) { - logError('Error processing game action', error as Error); - socket.emit('game:error', { - message: 'Failed to process game action', - gameCode: data.gameCode, - action: data.action - }); - } - } - - /** - * Broadcast game state updates to all players in a game - * @param gameCode The game code - * @param gameState The updated game state - */ - public broadcastGameStateUpdate(gameCode: string, gameState: GameStateUpdateData): void { - try { - const gameRoom = `game_${gameCode}`; - - this.io.to(gameRoom).emit('game:state_updated', { - ...gameState, - timestamp: new Date().toISOString() - }); - - logRequest('Game state broadcasted', undefined, undefined, { - gameCode, - gameRoom, - playerCount: gameState.players.length - }); - - } catch (error) { - logError('Error broadcasting game state', error as Error); - } - } - - /** - * Notify players when a game starts - * @param gameCode The game code - * @param players Array of player IDs - */ - public notifyGameStart(gameCode: string, players: string[]): void { - try { - const gameRoom = `game_${gameCode}`; - - this.io.to(gameRoom).emit('game:started', { - gameCode, - players, - message: 'Game has started!', - timestamp: new Date().toISOString() - }); - - logRequest('Game start notification sent', undefined, undefined, { - gameCode, - playerCount: players.length - }); - - } catch (error) { - logError('Error notifying game start', error as Error); - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/CreateUserCommand.ts b/SerpentRace_Backend/src/Application/User/commands/CreateUserCommand.ts deleted file mode 100644 index 9f971aa3..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/CreateUserCommand.ts +++ /dev/null @@ -1,11 +0,0 @@ -export interface CreateUserCommand { - username: string; - password: string; - email: string; - fname: string; - lname: string; - code?: string; - orgid?: string; - type: string; - phone?: string; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/CreateUserCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/CreateUserCommandHandler.ts deleted file mode 100644 index ef0e4fbf..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/CreateUserCommandHandler.ts +++ /dev/null @@ -1,92 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { CreateUserCommand } from './CreateUserCommand'; -import { ShortUserDto } from '../../DTOs/UserDto'; -import { UserAggregate, UserState } from '../../../Domain/User/UserAggregate'; -import { UserMapper } from '../../DTOs/Mappers/UserMapper'; -import { PasswordService } from '../../Services/PasswordService'; -import { EmailService } from '../../Services/EmailService'; -import { TokenService } from '../../Services/TokenService'; -import { logDatabase, logError, logAuth, logWarning } from '../../Services/Logger'; - -export class CreateUserCommandHandler { - private emailService: EmailService; - - constructor(private readonly userRepo: IUserRepository) { - this.emailService = new EmailService(); - } - - async execute(cmd: CreateUserCommand): Promise { - try { - // Validate password strength - const passwordValidation = PasswordService.validatePasswordStrength(cmd.password); - if (!passwordValidation.isValid) { - throw new Error(`Password validation failed: ${passwordValidation.errors.join(', ')}`); - } - - const user = new UserAggregate(); - user.username = cmd.username; - - // Hash the password before storing - user.password = await PasswordService.hashPassword(cmd.password); - - // Generate verification token - const verificationTokenData = TokenService.generateVerificationToken(); - user.token = await TokenService.hashToken(verificationTokenData.token); - user.TokenExpires = verificationTokenData.expiresAt; - - user.email = cmd.email; - user.fname = cmd.fname; - user.lname = cmd.lname; - user.orgid = cmd.orgid || null; - user.phone = cmd.phone || null; - user.state = UserState.REGISTERED_NOT_VERIFIED; - - const created = await this.userRepo.create(user); - - // Send verification email (non-blocking) - this.sendVerificationEmailAsync(created, verificationTokenData.token); - - return UserMapper.toShortDto(created); - } catch (error) { - // Only log the error once here, don't log again in router - const errorMessage = (error as Error).message; - - // Re-throw validation errors as-is (don't log as these are user input errors) - if (errorMessage.includes('Password validation failed')) { - throw error; - } - - // Handle database constraint errors - if (errorMessage.includes('duplicate') || errorMessage.includes('unique') || - errorMessage.includes('UNIQUE constraint') || errorMessage.includes('already exists')) { - throw new Error('User with this username or email already exists'); - } - - // Log database/system errors but throw user-friendly message - logError('CreateUserCommandHandler error', error as Error); - throw new Error('Failed to create user'); - } - } - - private async sendVerificationEmailAsync(user: UserAggregate, token: string): Promise { - try { - const baseUrl = process.env.APP_BASE_URL || 'http://localhost:3000'; - const verificationUrl = TokenService.generateVerificationUrl(baseUrl, token); - - const emailSent = await this.emailService.sendVerificationEmail( - user.email, - `${user.fname} ${user.lname}`, - token, - verificationUrl - ); - - if (!emailSent) { - logWarning('Failed to send verification email', { email: user.email, userId: user.id }); - } else { - logAuth('Verification email sent successfully', user.id, { email: user.email }); - } - } catch (emailError) { - logError('Error sending verification email', emailError as Error); - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/DeactivateUserCommand.ts b/SerpentRace_Backend/src/Application/User/commands/DeactivateUserCommand.ts deleted file mode 100644 index 3d24d35c..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/DeactivateUserCommand.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface DeactivateUserCommand { - id: string; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/DeactivateUserCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/DeactivateUserCommandHandler.ts deleted file mode 100644 index 08880f0c..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/DeactivateUserCommandHandler.ts +++ /dev/null @@ -1,12 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { DeactivateUserCommand } from './DeactivateUserCommand'; - - -export class DeactivateUserCommandHandler { - constructor(private readonly userRepo: IUserRepository) {} - - async execute(cmd: DeactivateUserCommand): Promise { - await this.userRepo.deactivate(cmd.id); - return true; - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/DeleteUserCommand.ts b/SerpentRace_Backend/src/Application/User/commands/DeleteUserCommand.ts deleted file mode 100644 index 22de9f40..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/DeleteUserCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface DeleteUserCommand { - id: string; - soft?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/DeleteUserCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/DeleteUserCommandHandler.ts deleted file mode 100644 index eb1af0ae..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/DeleteUserCommandHandler.ts +++ /dev/null @@ -1,16 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { DeleteUserCommand } from './DeleteUserCommand'; - - -export class DeleteUserCommandHandler { - constructor(private readonly userRepo: IUserRepository) {} - - async execute(cmd: DeleteUserCommand): Promise { - if (cmd.soft) { - await this.userRepo.softDelete(cmd.id); - } else { - await this.userRepo.delete(cmd.id); - } - return true; - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/LoginCommand.ts b/SerpentRace_Backend/src/Application/User/commands/LoginCommand.ts deleted file mode 100644 index b4861329..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/LoginCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface LoginCommand { - username: string; - password: string; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/LoginCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/LoginCommandHandler.ts deleted file mode 100644 index 2dc49592..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/LoginCommandHandler.ts +++ /dev/null @@ -1,196 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../../../Domain/IRepository/IOrganizationRepository'; -import { LoginCommand } from './LoginCommand'; -import { ShortUserDto } from '../../DTOs/UserDto'; -import { UserMapper } from '../../DTOs/Mappers/UserMapper'; -import { PasswordService } from '../../Services/PasswordService'; -import { JWTService } from '../../Services/JWTService'; -import { UserState } from '../../../Domain/User/UserAggregate'; -import { logAuth, logDatabase, logError, logWarning } from '../../Services/Logger'; -import { Response } from 'express'; - -export interface LoginResponse { - user: ShortUserDto; - token: string; - requiresOrgReauth?: boolean; - orgLoginUrl?: string; - organizationName?: string; -} - -export class LoginCommandHandler { - constructor( - private readonly userRepo: IUserRepository, - private readonly jwtService: JWTService, - private readonly orgRepo: IOrganizationRepository - ) {} - - async execute(cmd: LoginCommand, res?: Response): Promise { - const startTime = Date.now(); - - try { - logAuth('Login attempt', undefined, { username: cmd.username }); - - const user = await this.userRepo.findByUsername(cmd.username) || - await this.userRepo.findByEmail(cmd.username); - - logDatabase('User lookup completed', undefined, Date.now() - startTime, { - found: !!user, - searchBy: cmd.username.includes('@') ? 'email' : 'username' - }); - - if (!user) { - logAuth('Login failed - User not found', undefined, { username: cmd.username }); - throw new Error('Invalid username'); - } - - // Check if user account state allows login - const restrictedStates = [ - UserState.REGISTERED_NOT_VERIFIED, - UserState.SOFT_DELETE, - UserState.DEACTIVATED - ]; - - if (restrictedStates.includes(user.state)) { - let stateDescription = ''; - let errorMessage = ''; - switch (user.state) { - case UserState.REGISTERED_NOT_VERIFIED: - stateDescription = 'Email not verified'; - errorMessage = 'User account not verified'; - break; - case UserState.SOFT_DELETE: - stateDescription = 'Account deleted'; - errorMessage = 'User account deactivated'; - break; - case UserState.DEACTIVATED: - stateDescription = 'Account deactivated'; - errorMessage = 'User account deactivated'; - break; - } - - logAuth('Login failed - Account state restriction', user.id, { - username: cmd.username, - userState: user.state, - stateDescription - }); - throw new Error(errorMessage); - } - - try { - const passwordStartTime = Date.now(); - const isPasswordValid = await PasswordService.verifyPassword(cmd.password, user.password); - - logAuth('Password verification completed', user.id, { - valid: isPasswordValid, - verificationTime: Date.now() - passwordStartTime - }); - - if (!isPasswordValid) { - logWarning('Login failed - Invalid password', { - userId: user.id, - username: cmd.username - }); - throw new Error('Invalid password'); - } - } catch (error) { - logError('Password verification error', error as Error); - throw new Error('Invalid password'); - } - - const mockRes = { - cookie: () => {} - } as any; - - const tokenPayload = { - userId: user.id, - authLevel: (user.state === UserState.ADMIN ? 1 : 0) as 0 | 1, - userStatus: user.state, - orgId: user.orgid || '' - }; - - try { - // Use the real response object if provided, otherwise use mock - const responseObj = res || mockRes; - const token = this.jwtService.create(tokenPayload, responseObj); - - // Check if user belongs to an organization and needs reauthentication - let requiresOrgReauth = false; - let orgLoginUrl: string | undefined; - let organizationName: string | undefined; - - if (user.orgid) { - const organization = await this.orgRepo.findById(user.orgid); - if (organization) { - organizationName = organization.name; - - // Check if user has logged in to organization within the last month - const oneMonthAgo = new Date(); - oneMonthAgo.setMonth(oneMonthAgo.getMonth() - 1); - - const needsReauth = !user.Orglogindate || user.Orglogindate < oneMonthAgo; - - if (needsReauth && organization.url) { - requiresOrgReauth = true; - orgLoginUrl = organization.url; - - logAuth('User requires organization reauthentication', user.id, { - organizationId: user.orgid, - organizationName: organization.name, - lastOrgLogin: user.Orglogindate?.toISOString() || 'never', - orgLoginUrl: organization.url - }); - } - } - } - - logAuth('Login successful', user.id, { - authLevel: tokenPayload.authLevel, - userStatus: tokenPayload.userStatus, - orgId: tokenPayload.orgId, - requiresOrgReauth, - organizationName, - totalLoginTime: Date.now() - startTime - }); - - const response: LoginResponse = { - user: UserMapper.toShortDto(user), - token - }; - - if (requiresOrgReauth) { - response.requiresOrgReauth = true; - response.orgLoginUrl = orgLoginUrl; - response.organizationName = organizationName; - } - - return response; - } catch (error) { - logError('Token creation failed during login', error as Error); - throw new Error('Login failed due to internal error'); - } - } catch (error) { - if (error instanceof Error) { - logError('Login handler error', error); - - // Handle database connection errors - if (error.message.includes('database connection')) { - logDatabase('Database connection error during login', undefined, Date.now() - startTime); - throw new Error('Database connection error'); - } - - // Re-throw authentication/validation errors as-is - if (error.message.includes('Invalid username') || - error.message.includes('Invalid password') || - error.message.includes('not verified') || - error.message.includes('deactivated') || - error.message === 'Login failed due to internal error' || - error.message === 'Database connection error') { - throw error; - } - } - // Default database error handling - logDatabase('Unexpected database error during login', undefined, Date.now() - startTime); - throw new Error('Database connection error'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/LogoutCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/LogoutCommandHandler.ts deleted file mode 100644 index 8ca0cf0c..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/LogoutCommandHandler.ts +++ /dev/null @@ -1,145 +0,0 @@ -import { Request, Response } from 'express'; -import { logAuth, logError, logWarning } from '../../Services/Logger'; -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { JWTService } from '../../Services/JWTService'; -import { RedisService } from '../../Services/RedisService'; - -export class LogoutCommandHandler { - private jwtService: JWTService; - private redisService: RedisService; - - constructor(private readonly userRepo: IUserRepository) { - this.jwtService = new JWTService(); - this.redisService = RedisService.getInstance(); - } - - async execute(userId: string, res: Response, req?: Request): Promise { - try { - logAuth('Logout process started', userId); - - // 1. Get token from request to blacklist it - let tokenToBlacklist: string | null = null; - if (req) { - // Extract token from cookie - tokenToBlacklist = req.cookies['auth_token']; - - // Also check Authorization header as fallback - if (!tokenToBlacklist && req.headers.authorization) { - const authHeader = req.headers.authorization; - if (authHeader.startsWith('Bearer ')) { - tokenToBlacklist = authHeader.substring(7); - } - } - } - - // 2. Blacklist the current JWT token in Redis (if available) - if (tokenToBlacklist && req) { - try { - // Store token in blacklist with expiration matching token expiry - const decoded = this.jwtService.verify(req); - if (decoded && decoded.exp) { - const ttl = decoded.exp - Math.floor(Date.now() / 1000); - if (ttl > 0) { - await this.redisService.setWithExpiry(`blacklist:${tokenToBlacklist}`, 'true', ttl); - logAuth('JWT token blacklisted', userId, { tokenExpiry: ttl }); - } - } - } catch (error) { - logWarning('Failed to blacklist token', { userId, error: (error as Error).message }); - } - } - - // 3. Clear authentication cookie - res.clearCookie('auth_token', { - httpOnly: true, - secure: process.env.NODE_ENV === 'production', - sameSite: 'strict', - path: '/' - }); - - // 4. Remove user from active sessions in Redis - try { - await this.redisService.removeActiveUser(userId); - logAuth('User removed from active sessions', userId); - } catch (error) { - logWarning('Failed to remove user from active sessions', { userId, error: (error as Error).message }); - // Continue even if this fails - } - - // 5. Update user's last logout timestamp in database - try { - const updateResult = await this.userRepo.update(userId, { updatedate: new Date() }); - if (updateResult) { - logAuth('User last logout timestamp updated', userId); - } - } catch (error) { - logWarning('Failed to update user logout timestamp', { userId, error: (error as Error).message }); - // Continue even if this fails - } - - // 6. Clear any user-specific cache entries - try { - // Clear user session data - await this.redisService.del(`user:${userId}:session`); - await this.redisService.del(`user:${userId}:active_chats`); - logAuth('User cache cleared', userId); - } catch (error) { - logWarning('Failed to clear user cache', { userId, error: (error as Error).message }); - // Continue even if this fails - } - - logAuth('User logout completed successfully', userId); - return true; - - } catch (error) { - logError('LogoutCommandHandler error', error as Error); - return false; - } - } - - /** - * Check if a token is blacklisted - */ - async isTokenBlacklisted(token: string): Promise { - try { - const result = await this.redisService.get(`blacklist:${token}`); - return result === 'true'; - } catch (error) { - logError('Error checking token blacklist', error as Error); - return false; - } - } - - /** - * Logout user from all devices by blacklisting all their active tokens - * This is a simplified version - in a real implementation you'd track active tokens per user - */ - async logoutFromAllDevices(userId: string): Promise { - try { - // Clear all user-related Redis keys - const userKeys = [ - `user:${userId}:session`, - `user:${userId}:active_chats`, - `user:${userId}:active_tokens`, - `user:${userId}:websocket_connections` - ]; - - for (const key of userKeys) { - try { - await this.redisService.del(key); - } catch (error) { - logWarning(`Failed to delete Redis key: ${key}`, { userId, error: (error as Error).message }); - } - } - - // Update user logout timestamp - await this.userRepo.update(userId, { updatedate: new Date() }); - - logAuth('User logged out from all devices', userId); - return true; - } catch (error) { - logError('Error logging out user from all devices', error as Error); - return false; - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/RequestPasswordResetCommand.ts b/SerpentRace_Backend/src/Application/User/commands/RequestPasswordResetCommand.ts deleted file mode 100644 index ed314d11..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/RequestPasswordResetCommand.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface RequestPasswordResetCommand { - email: string; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/RequestPasswordResetCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/RequestPasswordResetCommandHandler.ts deleted file mode 100644 index bac1af06..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/RequestPasswordResetCommandHandler.ts +++ /dev/null @@ -1,69 +0,0 @@ - -import { RequestPasswordResetCommand } from './RequestPasswordResetCommand'; -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { EmailService } from '../../Services/EmailService'; -import { TokenService } from '../../Services/TokenService'; -import { logAuth, logWarning, logError } from '../../Services/Logger'; - -export class RequestPasswordResetCommandHandler { - private emailService: EmailService; - - constructor(private userRepo: IUserRepository) { - this.emailService = new EmailService(); - } - - async execute(cmd: RequestPasswordResetCommand): Promise { - try { - if (!cmd.email) { - throw new Error('Email is required'); - } - - // Find user by email - const user = await this.userRepo.findByEmail(cmd.email); - - if (!user) { - // Don't reveal if user exists or not for security reasons - // Still return true but don't send email - logAuth(`Password reset requested for non-existent email: ${cmd.email}`); - return true; - } - - // Generate password reset token - const resetTokenData = TokenService.generatePasswordResetToken(); - - // Update user with reset token - user.token = await TokenService.hashToken(resetTokenData.token); - user.TokenExpires = resetTokenData.expiresAt; - - await this.userRepo.update(user.id, user); - - // Send password reset email - try { - const baseUrl = process.env.APP_BASE_URL || 'http://localhost:3000'; - const resetUrl = TokenService.generatePasswordResetUrl(baseUrl, resetTokenData.token); - - const emailSent = await this.emailService.sendPasswordResetEmail( - user.email, - `${user.fname} ${user.lname}`, - resetTokenData.token, - resetUrl - ); - - if (!emailSent) { - logWarning(`Failed to send password reset email to ${user.email}`); - // Don't throw error - request should still succeed even if email fails - } else { - logAuth(`Password reset email sent successfully to ${user.email}`); - } - } catch (emailError) { - logError('Error sending password reset email', emailError instanceof Error ? emailError : new Error(String(emailError))); - // Don't throw error - request should still succeed even if email fails - } - - return true; - } catch (error) { - logError('Password reset request error', error instanceof Error ? error : new Error(String(error))); - throw error; - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/ResetPasswordCommand.ts b/SerpentRace_Backend/src/Application/User/commands/ResetPasswordCommand.ts deleted file mode 100644 index 31736ee1..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/ResetPasswordCommand.ts +++ /dev/null @@ -1,4 +0,0 @@ -export interface ResetPasswordCommand { - token: string; - newPassword: string; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/ResetPasswordCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/ResetPasswordCommandHandler.ts deleted file mode 100644 index d239c061..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/ResetPasswordCommandHandler.ts +++ /dev/null @@ -1,58 +0,0 @@ - -import { ResetPasswordCommand } from './ResetPasswordCommand'; -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { TokenService } from '../../Services/TokenService'; -import { PasswordService } from '../../Services/PasswordService'; -import { logError } from '../../Services/Logger'; - -export class ResetPasswordCommandHandler { - constructor(private userRepo: IUserRepository) {} - - async execute(cmd: ResetPasswordCommand): Promise { - try { - if (!cmd.token) { - throw new Error('Reset token is required'); - } - - if (!cmd.newPassword) { - throw new Error('New password is required'); - } - - // Validate password strength - const validation = PasswordService.validatePasswordStrength(cmd.newPassword); - if (!validation.isValid) { - throw new Error(`Password validation failed: ${validation.errors.join(', ')}`); - } - - // Hash the token to compare with stored value - const hashedToken = await TokenService.hashToken(cmd.token); - - // Find user with this password reset token - const user = await this.userRepo.findByToken(hashedToken); - - if (!user) { - throw new Error('Invalid or expired reset token'); - } - - // Check if token is expired - if (user.TokenExpires && user.TokenExpires < new Date()) { - throw new Error('Reset token has expired'); - } - - // Hash the new password - const hashedPassword = await PasswordService.hashPassword(cmd.newPassword); - - // Update user password and clear reset token - user.password = hashedPassword; - user.token = null; - user.TokenExpires = null; - - await this.userRepo.update(user.id, user); - - return true; - } catch (error) { - logError('Password reset error', error instanceof Error ? error : new Error(String(error))); - throw error; - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/UpdateUserCommand.ts b/SerpentRace_Backend/src/Application/User/commands/UpdateUserCommand.ts deleted file mode 100644 index 0d57a051..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/UpdateUserCommand.ts +++ /dev/null @@ -1,13 +0,0 @@ -export interface UpdateUserCommand { - id: string; - orgid?: string; - username?: string; - password?: string; - email?: string; - fname?: string; - lname?: string; - code?: string; - type?: string; - phone?: string; - state?: number; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/UpdateUserCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/UpdateUserCommandHandler.ts deleted file mode 100644 index 9f348592..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/UpdateUserCommandHandler.ts +++ /dev/null @@ -1,29 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { UpdateUserCommand } from './UpdateUserCommand'; - -import { ShortUserDto } from '../../DTOs/UserDto'; -import { UserMapper } from '../../DTOs/Mappers/UserMapper'; -import { PasswordService } from '../../Services/PasswordService'; - -export class UpdateUserCommandHandler { - constructor(private readonly userRepo: IUserRepository) {} - - async execute(cmd: UpdateUserCommand): Promise { - const updateData = { ...cmd }; - - // Hash the password if it's being updated - if (cmd.password) { - // Validate password strength - const passwordValidation = PasswordService.validatePasswordStrength(cmd.password); - if (!passwordValidation.isValid) { - throw new Error(`Password validation failed: ${passwordValidation.errors.join(', ')}`); - } - - updateData.password = await PasswordService.hashPassword(cmd.password); - } - - const updated = await this.userRepo.update(cmd.id, updateData); - if (!updated) return null; - return UserMapper.toShortDto(updated); - } -} diff --git a/SerpentRace_Backend/src/Application/User/commands/VerifyEmailCommand.ts b/SerpentRace_Backend/src/Application/User/commands/VerifyEmailCommand.ts deleted file mode 100644 index dd3e7e1f..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/VerifyEmailCommand.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface VerifyEmailCommand { - token: string; -} diff --git a/SerpentRace_Backend/src/Application/User/commands/VerifyEmailCommandHandler.ts b/SerpentRace_Backend/src/Application/User/commands/VerifyEmailCommandHandler.ts deleted file mode 100644 index 44c3f95a..00000000 --- a/SerpentRace_Backend/src/Application/User/commands/VerifyEmailCommandHandler.ts +++ /dev/null @@ -1,45 +0,0 @@ - -import { VerifyEmailCommand } from './VerifyEmailCommand'; -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { TokenService } from '../../Services/TokenService'; -import { UserState } from '../../../Domain/User/UserAggregate'; -import { logError } from '../../Services/Logger'; - -export class VerifyEmailCommandHandler { - constructor(private userRepo: IUserRepository) {} - - async execute(cmd: VerifyEmailCommand): Promise { - try { - if (!cmd.token) { - throw new Error('Verification token is required'); - } - - // Hash the token to compare with stored value - const hashedToken = await TokenService.hashToken(cmd.token); - - // Find user with this verification token - const user = await this.userRepo.findByToken(hashedToken); - - if (!user) { - throw new Error('Invalid or expired verification token'); - } - - // Check if token is expired - if (user.TokenExpires && user.TokenExpires < new Date()) { - throw new Error('Verification token has expired'); - } - - // Update user verification status - user.token = null; - user.TokenExpires = null; - user.state = UserState.VERIFIED_REGULAR; - - await this.userRepo.update(user.id, user); - - return true; - } catch (error) { - logError('Email verification error', error instanceof Error ? error : new Error(String(error))); - throw error; - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/queries/GetUserByIdQuery.ts b/SerpentRace_Backend/src/Application/User/queries/GetUserByIdQuery.ts deleted file mode 100644 index 21b92e4c..00000000 --- a/SerpentRace_Backend/src/Application/User/queries/GetUserByIdQuery.ts +++ /dev/null @@ -1,3 +0,0 @@ -export interface GetUserByIdQuery { - id: string; -} diff --git a/SerpentRace_Backend/src/Application/User/queries/GetUserByIdQueryHandler.ts b/SerpentRace_Backend/src/Application/User/queries/GetUserByIdQueryHandler.ts deleted file mode 100644 index ae8ff109..00000000 --- a/SerpentRace_Backend/src/Application/User/queries/GetUserByIdQueryHandler.ts +++ /dev/null @@ -1,32 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { GetUserByIdQuery } from './GetUserByIdQuery'; -import { DetailUserDto } from '../../DTOs/UserDto'; -import { UserMapper } from '../../DTOs/Mappers/UserMapper'; -import { logError } from '../../Services/Logger'; - -export class GetUserByIdQueryHandler { - constructor(private readonly userRepo: IUserRepository) {} - - async execute(query: GetUserByIdQuery): Promise { - try { - const user = await this.userRepo.findById(query.id); - if (!user) return null; - return UserMapper.toDetailDto(user); - } catch (error) { - logError('GetUserByIdQueryHandler error', error instanceof Error ? error : new Error(String(error))); - - // Handle invalid ID format - if (error instanceof Error && error.message.includes('invalid') && error.message.includes('uuid')) { - return null; // Treat invalid UUID as not found - } - - // Handle database errors - if (error instanceof Error && error.message.includes('database')) { - throw new Error('Database connection error'); - } - - // Generic error for other cases - throw new Error('Failed to retrieve user'); - } - } -} diff --git a/SerpentRace_Backend/src/Application/User/queries/GetUsersByPageQuery.ts b/SerpentRace_Backend/src/Application/User/queries/GetUsersByPageQuery.ts deleted file mode 100644 index b1fc4346..00000000 --- a/SerpentRace_Backend/src/Application/User/queries/GetUsersByPageQuery.ts +++ /dev/null @@ -1,5 +0,0 @@ -export interface GetUsersByPageQuery { - from: number; - to: number; - includeDeleted?: boolean; -} diff --git a/SerpentRace_Backend/src/Application/User/queries/GetUsersByPageQueryHandler.ts b/SerpentRace_Backend/src/Application/User/queries/GetUsersByPageQueryHandler.ts deleted file mode 100644 index 0c8c33ae..00000000 --- a/SerpentRace_Backend/src/Application/User/queries/GetUsersByPageQueryHandler.ts +++ /dev/null @@ -1,60 +0,0 @@ -import { IUserRepository } from '../../../Domain/IRepository/IUserRepository'; -import { GetUsersByPageQuery } from './GetUsersByPageQuery'; -import { ShortUserDto } from '../../DTOs/UserDto'; -import { UserMapper } from '../../DTOs/Mappers/UserMapper'; -import { logError, logRequest } from '../../Services/Logger'; - -export class GetUsersByPageQueryHandler { - constructor(private readonly userRepo: IUserRepository) {} - - async execute(query: GetUsersByPageQuery): Promise<{ users: ShortUserDto[], totalCount: number }> { - try { - // Validate pagination parameters - if (query.from < 0 || query.to < query.from) { - throw new Error('Invalid pagination parameters'); - } - - const limit = query.to - query.from + 1; - if (limit > 100) { - throw new Error('Page size too large. Maximum 100 records per request'); - } - - logRequest('Get users by page query started', undefined, undefined, { - from: query.from, - to: query.to, - includeDeleted: query.includeDeleted || false - }); - - const result = query.includeDeleted - ? await this.userRepo.findByPageIncludingDeleted(query.from, query.to) - : await this.userRepo.findByPage(query.from, query.to); - - logRequest('Get users by page query completed', undefined, undefined, { - from: query.from, - to: query.to, - returned: result.users.length, - totalCount: result.totalCount, - includeDeleted: query.includeDeleted || false - }); - - return { - users: UserMapper.toShortDtoList(result.users), - totalCount: result.totalCount - }; - } catch (error) { - logError('GetUsersByPageQueryHandler error', error instanceof Error ? error : new Error(String(error))); - - // Handle database errors - if (error instanceof Error && error.message.includes('database')) { - throw new Error('Database connection error'); - } - - // Re-throw validation errors as-is - if (error instanceof Error && (error.message.includes('Invalid pagination') || error.message.includes('Page size'))) { - throw error; - } - - throw new Error('Failed to retrieve users'); - } - } -} diff --git a/SerpentRace_Backend/src/Domain/Chat/ChatAggregate.ts b/SerpentRace_Backend/src/Domain/Chat/ChatAggregate.ts deleted file mode 100644 index 664a743a..00000000 --- a/SerpentRace_Backend/src/Domain/Chat/ChatAggregate.ts +++ /dev/null @@ -1,64 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, UpdateDateColumn, CreateDateColumn } from 'typeorm'; - -export interface Message { - id: string; // UUID for each message - date: Date; - userid: string; // UUID reference to UserAggregate - text: string; -} - -export const ChatState = { - ACTIVE: 0, - ARCHIVE: 1, - SOFT_DELETE: 2 -} as const; - -export type ChatStateType = typeof ChatState[keyof typeof ChatState]; - -export const ChatType = { - DIRECT: 'direct', - GROUP: 'group', - GAME: 'game' -} as const; - -export type ChatTypeType = typeof ChatType[keyof typeof ChatType]; - -@Entity('Chats') -export class ChatAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'varchar', length: 50, default: ChatType.DIRECT }) - type!: ChatTypeType; - - @Column({ type: 'varchar', length: 255, nullable: true }) - name!: string | null; // Group name or Game name - - @Column({ type: 'uuid', nullable: true }) - gameId!: string | null; // Game UUID reference for game chats - - @Column({ type: 'uuid', nullable: true }) - createdBy!: string | null; // User who created the group/chat - - @Column('uuid', { array: true }) - users!: string[]; // Active participants - - @Column('json', { default: [] }) - messages!: Message[]; // Active messages (last 10 per user, max 2 weeks) - - @Column({ type: 'timestamp', nullable: true }) - lastActivity!: Date | null; - - @CreateDateColumn() - createDate!: Date; - - @UpdateDateColumn() - updateDate!: Date; - - @Column({ type: 'int', default: ChatState.ACTIVE }) - state!: ChatStateType; - - // Archive when inactive for specified period - @Column({ type: 'timestamp', nullable: true }) - archiveDate!: Date | null; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Domain/Chat/ChatArchiveAggregate.ts b/SerpentRace_Backend/src/Domain/Chat/ChatArchiveAggregate.ts deleted file mode 100644 index 518042a1..00000000 --- a/SerpentRace_Backend/src/Domain/Chat/ChatArchiveAggregate.ts +++ /dev/null @@ -1,33 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn } from 'typeorm'; -import { Message } from './ChatAggregate'; - -@Entity('ChatArchives') -export class ChatArchiveAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'uuid' }) - chatId!: string; // Reference to original chat - - @Column('json') - archivedMessages!: Message[]; // All archived messages - - @Column({ type: 'timestamp' }) - archivedAt!: Date; - - @CreateDateColumn() - createDate!: Date; - - // Metadata for context - @Column({ type: 'varchar', length: 50 }) - chatType!: string; // direct, group, game - - @Column({ type: 'varchar', length: 255, nullable: true }) - chatName!: string | null; - - @Column({ type: 'uuid', nullable: true }) - gameId!: string | null; - - @Column('uuid', { array: true }) - participants!: string[]; // Users who participated -} diff --git a/SerpentRace_Backend/src/Domain/Contact/ContactAggregate.ts b/SerpentRace_Backend/src/Domain/Contact/ContactAggregate.ts deleted file mode 100644 index a7e79581..00000000 --- a/SerpentRace_Backend/src/Domain/Contact/ContactAggregate.ts +++ /dev/null @@ -1,55 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; - -export enum ContactType { - BUG = 0, - PROBLEM = 1, - QUESTION = 2, - SALES = 3, - OTHER = 4 -} - -export enum ContactState { - ACTIVE = 0, - RESOLVED = 1, - SOFT_DELETE = 2 -} - -@Entity('Contacts') -export class ContactAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'varchar', length: 255 }) - name!: string; - - @Column({ type: 'varchar', length: 255 }) - email!: string; - - @Column({ type: 'uuid', nullable: true }) - userid!: string | null; // If logged in user - - @Column({ type: 'int' }) - type!: ContactType; - - @Column({ type: 'text' }) - txt!: string; - - @Column({ type: 'int', default: ContactState.ACTIVE }) - state!: ContactState; - - @CreateDateColumn() - createDate!: Date; - - @UpdateDateColumn() - updateDate!: Date; - - // Admin response field for email response feature - @Column({ type: 'text', nullable: true }) - adminResponse!: string | null; - - @Column({ type: 'timestamp', nullable: true }) - responseDate!: Date | null; - - @Column({ type: 'uuid', nullable: true }) - respondedBy!: string | null; // Admin user id who responded -} diff --git a/SerpentRace_Backend/src/Domain/Deck/DeckAggregate.ts b/SerpentRace_Backend/src/Domain/Deck/DeckAggregate.ts deleted file mode 100644 index 24644f1d..00000000 --- a/SerpentRace_Backend/src/Domain/Deck/DeckAggregate.ts +++ /dev/null @@ -1,86 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, ManyToOne, JoinColumn, CreateDateColumn, UpdateDateColumn } from 'typeorm'; -import { OrganizationAggregate } from '../Organization/OrganizationAggregate'; - -export enum Type { - LUCK = 0, - JOKER = 1, - QUESTION = 2 -} - -export enum CType { - PUBLIC = 0, - PRIVATE = 1, - ORGANIZATION = 2 -} - -export enum State { - ACTIVE = 0, - SOFT_DELETE = 1 -} - -export enum CardType { - QUIZ = 0, - SENTENCE_PAIRING = 1, - OWN_ANSWER = 2, - TRUE_FALSE = 3, - CLOSER = 4 -} - -export enum ConsequenceType { - MOVE_FORWARD = 0, - MOVE_BACKWARD = 1, - LOSE_TURN = 2, - EXTRA_TURN = 3, - SWAP_POSITION = 4, - GO_TO_START = 5, - TURN_AGAIN = 6 -} - -export interface Consequence { - type: ConsequenceType; - value?: number; -} - -export interface Card { - text: string; - type?: CardType; - answer?: string | null; - consequence?: Consequence | null; -} - -@Entity('Decks') -export class DeckAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'varchar', length: 255 }) - name!: string; - - @Column({ type: 'int'}) - type!: Type; - - @Column({ type: 'uuid', name: 'user_id' }) - userid!: string; - - @CreateDateColumn({ name: 'creation_date' }) - creationdate!: Date; - - @Column({ type: 'json' }) - cards!: Card[]; - - @Column({ type: 'int', default: 0, name: 'played_number' }) - playedNumber!: number; - - @Column({ type: 'int', default: CType.PUBLIC }) - ctype!: CType; - - @UpdateDateColumn({ name: 'update_date' }) - updatedate!: Date; - - @Column({ type: 'int', default: State.ACTIVE }) - state!: State; - - @ManyToOne(() => OrganizationAggregate, { nullable: true }) - @JoinColumn({ name: 'organization_id' }) - organization!: OrganizationAggregate | null; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Domain/Game/GameAggregate.ts b/SerpentRace_Backend/src/Domain/Game/GameAggregate.ts deleted file mode 100644 index 49640b89..00000000 --- a/SerpentRace_Backend/src/Domain/Game/GameAggregate.ts +++ /dev/null @@ -1,105 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; -import { Consequence } from '../Deck/DeckAggregate'; - -export enum GameState { - WAITING = 0, - ACTIVE = 1, - FINISHED = 2, - CANCELLED = 3 -} - -export enum LoginType { - PUBLIC = 0, - PRIVATE = 1, - ORGANIZATION = 2 -} - -export enum DeckType { - JOCKER = 0, - LUCK = 1, - QUEST = 2 -} - -export interface GameCard { - cardid: string; - question?: string; - answer?: string; - consequence?: Consequence | null; - played?: boolean; - playerid?: string; -} - -export interface GameDeck { - deckid: string; - decktype: DeckType; - cards: GameCard[]; -} - -@Entity('Games') -export class GameAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'varchar', length: 10, unique: true }) - gamecode!: string; - - @Column({ type: 'int' }) - maxplayers!: number; - - @Column({ type: 'int', default: LoginType.PUBLIC }) - logintype!: LoginType; - - @Column({ type: 'varchar', length: 255, nullable: true }) - createdby!: string | null; - - @Column({ type: 'varchar', length: 255, nullable: true }) - orgid!: string | null; - - @Column({ type: 'json' }) - gamedecks!: GameDeck[]; - - @Column({ type: 'json', default: () => "'[]'" }) - players!: string[]; - - @Column({ type: 'boolean', default: false }) - started!: boolean; - - @Column({ type: 'boolean', default: false }) - finished!: boolean; - - @Column({ type: 'varchar', length: 255, nullable: true }) - winner!: string | null; - - @Column({ type: 'int', default: GameState.WAITING }) - state!: GameState; - - @CreateDateColumn({ name: 'create_date' }) - createdate!: Date; - - @Column({ type: 'timestamp', nullable: true, name: 'start_date' }) - startdate!: Date | null; - - @Column({ type: 'timestamp', nullable: true, name: 'end_date' }) - enddate!: Date | null; - - @UpdateDateColumn({ name: 'update_date' }) - updatedate!: Date; -} - -// Board Generation Types -export interface GameField { - position: number; - type: 'regular' | 'positive' | 'negative' | 'luck'; - stepValue?: number; -} - -export interface BoardData { - gameId?: string; - fields: GameField[]; - border: number[]; - validationResults: { [fieldIndex: number]: number[] }; - totalErrorRate: number; - generationComplete?: boolean; - generatedAt?: Date; - error?: string; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Domain/IRepository/IChatArchiveRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IChatArchiveRepository.ts deleted file mode 100644 index 494197d4..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IChatArchiveRepository.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { ChatArchiveAggregate } from '../Chat/ChatArchiveAggregate'; - -export interface IChatArchiveRepository { - create(archive: Partial): Promise; - findAll(): Promise; - findById(id: string): Promise; - findByChatId(chatId: string): Promise; - findByGameId(gameId: string): Promise; - delete(id: string): Promise; - cleanup(olderThanDays: number): Promise; // Clean up old archives -} diff --git a/SerpentRace_Backend/src/Domain/IRepository/IChatRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IChatRepository.ts deleted file mode 100644 index 32374c35..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IChatRepository.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { ChatAggregate } from '../Chat/ChatAggregate'; -import { ChatArchiveAggregate } from '../Chat/ChatArchiveAggregate'; - -export interface IChatRepository { - create(chat: Partial): Promise; - findByPage(from: number, to: number): Promise<{ chats: ChatAggregate[], totalCount: number }>; - findByPageIncludingDeleted(from: number, to: number): Promise<{ chats: ChatAggregate[], totalCount: number }>; - findById(id: string): Promise; - findByIdIncludingDeleted(id: string): Promise; - findByUserId(userId: string): Promise; - findByUserIdIncludingDeleted(userId: string): Promise; - findByGameId(gameId: string): Promise; - findActiveChatsForUser(userId: string): Promise; - findInactiveChats(inactivityMinutes: number): Promise; - update(id: string, update: Partial): Promise; - delete(id: string): Promise; - softDelete(id: string): Promise; - archiveChat(chat: ChatAggregate): Promise; - getArchivedChat(chatId: string): Promise; - restoreFromArchive(chatId: string): Promise; -} diff --git a/SerpentRace_Backend/src/Domain/IRepository/IContactRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IContactRepository.ts deleted file mode 100644 index 774029c6..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IContactRepository.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { ContactAggregate } from '../Contact/ContactAggregate'; - -export interface IContactRepository { - create(contact: Partial): Promise; - findById(id: string): Promise; - findByPage(from: number, to: number): Promise<{ contacts: ContactAggregate[], totalCount: number }>; - findByPageIncludingDeleted(from: number, to: number): Promise<{ contacts: ContactAggregate[], totalCount: number }>; - update(id: string, update: Partial): Promise; - delete(id: string): Promise; - softDelete(id: string): Promise; - findByIdIncludingDeleted(id: string): Promise; - search(searchTerm: string): Promise; - searchIncludingDeleted(searchTerm: string): Promise; -} diff --git a/SerpentRace_Backend/src/Domain/IRepository/IDeckRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IDeckRepository.ts deleted file mode 100644 index d951cf45..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IDeckRepository.ts +++ /dev/null @@ -1,19 +0,0 @@ -import { DeckAggregate } from '../Deck/DeckAggregate'; - -export interface IDeckRepository { - create(deck: Partial): Promise; - findByPage(from: number, to: number): Promise<{ decks: DeckAggregate[], totalCount: number }>; - findByPageIncludingDeleted(from: number, to: number): Promise<{ decks: DeckAggregate[], totalCount: number }>; - findById(id: string): Promise; - findByIdIncludingDeleted(id: string): Promise; - search(query: string, limit?: number, offset?: number): Promise<{ decks: DeckAggregate[], totalCount: number }>; - searchIncludingDeleted(query: string, limit?: number, offset?: number): Promise<{ decks: DeckAggregate[], totalCount: number }>; - update(id: string, update: Partial): Promise; - delete(id: string): Promise; - softDelete(id: string): Promise; - - // New methods for deck restrictions and filtering - countActiveByUserId(userId: string): Promise; - countOrganizationalByUserId(userId: string): Promise; - findFilteredDecks(userId: string, userOrgId?: string | null, isAdmin?: boolean, from?: number, to?: number): Promise<{ decks: DeckAggregate[], totalCount: number }>; -} diff --git a/SerpentRace_Backend/src/Domain/IRepository/IGameRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IGameRepository.ts deleted file mode 100644 index 4be1f0bd..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IGameRepository.ts +++ /dev/null @@ -1,24 +0,0 @@ -import { GameAggregate } from '../Game/GameAggregate'; - -export interface IGameRepository { - create(game: Partial): Promise; - findByPage(from: number, to: number): Promise<{ games: GameAggregate[], totalCount: number }>; - findByPageIncludingDeleted(from: number, to: number): Promise<{ games: GameAggregate[], totalCount: number }>; - findById(id: string): Promise; - findByIdIncludingDeleted(id: string): Promise; - findByGameCode(gamecode: string): Promise; - search(query: string, limit?: number, offset?: number): Promise<{ games: GameAggregate[], totalCount: number }>; - searchIncludingDeleted(query: string, limit?: number, offset?: number): Promise<{ games: GameAggregate[], totalCount: number }>; - update(id: string, update: Partial): Promise; - delete(id: string): Promise; - softDelete(id: string): Promise; - - // Game-specific methods - findActiveGames(): Promise; - findGamesByPlayer(playerId: string): Promise; - findWaitingGames(): Promise; - findFinishedGames(from?: number, to?: number): Promise<{ games: GameAggregate[], totalCount: number }>; - addPlayerToGame(gameId: string, playerId: string): Promise; - removePlayerFromGame(gameId: string, playerId: string): Promise; - updateGameState(gameId: string, started: boolean, finished?: boolean, winner?: string): Promise; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Domain/IRepository/IOrganizationRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IOrganizationRepository.ts deleted file mode 100644 index 83252a93..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IOrganizationRepository.ts +++ /dev/null @@ -1,14 +0,0 @@ -import { OrganizationAggregate } from '../Organization/OrganizationAggregate'; - -export interface IOrganizationRepository { - create(org: Partial): Promise; - findByPage(from: number, to: number): Promise<{ organizations: OrganizationAggregate[], totalCount: number }>; - findByPageIncludingDeleted(from: number, to: number): Promise<{ organizations: OrganizationAggregate[], totalCount: number }>; - findById(id: string): Promise; - findByIdIncludingDeleted(id: string): Promise; - search(query: string, limit?: number, offset?: number): Promise<{ organizations: OrganizationAggregate[], totalCount: number }>; - searchIncludingDeleted(query: string, limit?: number, offset?: number): Promise<{ organizations: OrganizationAggregate[], totalCount: number }>; - update(id: string, update: Partial): Promise; - delete(id: string): Promise; - softDelete(id: string): Promise; -} diff --git a/SerpentRace_Backend/src/Domain/IRepository/IUserRepository.ts b/SerpentRace_Backend/src/Domain/IRepository/IUserRepository.ts deleted file mode 100644 index 2c76bb6f..00000000 --- a/SerpentRace_Backend/src/Domain/IRepository/IUserRepository.ts +++ /dev/null @@ -1,18 +0,0 @@ -import { UserAggregate } from '../User/UserAggregate'; - -export interface IUserRepository { - create(user: Partial): Promise; - findByPage(from: number, to: number): Promise<{ users: UserAggregate[], totalCount: number }>; - findByPageIncludingDeleted(from: number, to: number): Promise<{ users: UserAggregate[], totalCount: number }>; - findById(id: string): Promise; - findByIdIncludingDeleted(id: string): Promise; - findByUsername(username: string): Promise; - findByEmail(email: string): Promise; - findByToken(token: string): Promise; - search(query: string, limit?: number, offset?: number): Promise<{ users: UserAggregate[], totalCount: number }>; - searchIncludingDeleted(query: string, limit?: number, offset?: number): Promise<{ users: UserAggregate[], totalCount: number }>; - update(id: string, update: Partial): Promise; - delete(id: string): Promise; - softDelete(id: string): Promise; - deactivate(id: string): Promise; -} diff --git a/SerpentRace_Backend/src/Domain/Organization/OrganizationAggregate.ts b/SerpentRace_Backend/src/Domain/Organization/OrganizationAggregate.ts deleted file mode 100644 index b6d63de8..00000000 --- a/SerpentRace_Backend/src/Domain/Organization/OrganizationAggregate.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn, OneToMany } from 'typeorm'; -import { UserAggregate } from '../User/UserAggregate'; - -export const OrganizationState = { - REGISTERED: 0, - ACTIVE: 1, - SOFT_DELETE: 2 -} as const; - -export type OrganizationStateType = typeof OrganizationState[keyof typeof OrganizationState]; - -@Entity('Organizations') -export class OrganizationAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'varchar', length: 255 }) - name!: string; - - @Column({ type: 'varchar', length: 100 }) - contactfname!: string; - - @Column({ type: 'varchar', length: 100 }) - contactlname!: string; - - @Column({ type: 'varchar', length: 20 }) - contactphone!: string; - - @Column({ type: 'varchar', length: 255 }) - contactemail!: string; - - @Column({ type: 'int', default: OrganizationState.REGISTERED }) - state!: OrganizationStateType; - - @CreateDateColumn() - regdate!: Date; - - @UpdateDateColumn() - updatedate!: Date; - - @Column({ type: 'varchar', length: 500, nullable: true }) - url!: string | null; - - @Column({ type: 'int', default: 0 }) - userinorg!: number; - - @Column({ type: 'int', nullable: true }) - maxOrganizationalDecks!: number | null; - - @OneToMany(() => UserAggregate, user => user.orgid) - users!: UserAggregate[]; - } \ No newline at end of file diff --git a/SerpentRace_Backend/src/Domain/User/UserAggregate.ts b/SerpentRace_Backend/src/Domain/User/UserAggregate.ts deleted file mode 100644 index 60bab19c..00000000 --- a/SerpentRace_Backend/src/Domain/User/UserAggregate.ts +++ /dev/null @@ -1,58 +0,0 @@ -import { Entity, PrimaryGeneratedColumn, Column, CreateDateColumn, UpdateDateColumn } from 'typeorm'; - -export enum UserState { - REGISTERED_NOT_VERIFIED = 0, - VERIFIED_REGULAR = 1, - VERIFIED_PREMIUM = 2, - SOFT_DELETE = 3, - DEACTIVATED = 4, - ADMIN = 5 -} - -@Entity('Users') -export class UserAggregate { - @PrimaryGeneratedColumn('uuid') - id!: string; - - @Column({ type: 'uuid', nullable: true }) - orgid!: string | null; - - @Column({ type: 'varchar', length: 100, unique: true }) - username!: string; - - @Column({ type: 'varchar', length: 255 }) - password!: string; - - @Column({ type: 'varchar', length: 255, unique: true }) - email!: string; - - @Column({ type: 'varchar', length: 100 }) - fname!: string; - - @Column({ type: 'varchar', length: 100 }) - lname!: string; - - @Column({ type: 'varchar', length: 255, nullable: true }) - token!: string | null; - - @Column({ type: 'timestamp', nullable: true }) - TokenExpires!: Date | null; - - @Column({ type: 'varchar', length: 20, nullable: true }) - phone!: string | null; - - @Column({ - type: 'int', - default: UserState.REGISTERED_NOT_VERIFIED - }) - state!: UserState; - - @CreateDateColumn() - regdate!: Date; - - @UpdateDateColumn() - updatedate!: Date; - - @Column({ type: 'timestamp', nullable: true }) - Orglogindate!: Date | null; -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Infrastructure/Migrations/1757939815984-full.ts b/SerpentRace_Backend/src/Infrastructure/Migrations/1757939815984-full.ts deleted file mode 100644 index 91eabf61..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Migrations/1757939815984-full.ts +++ /dev/null @@ -1,28 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class Full1757939815984 implements MigrationInterface { - name = 'Full1757939815984' - - public async up(queryRunner: QueryRunner): Promise { - await queryRunner.query(`CREATE TABLE "Chats" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "type" character varying(50) NOT NULL DEFAULT 'direct', "name" character varying(255), "gameId" uuid, "createdBy" uuid, "users" uuid array NOT NULL, "messages" json NOT NULL DEFAULT '[]', "lastActivity" TIMESTAMP, "createDate" TIMESTAMP NOT NULL DEFAULT now(), "updateDate" TIMESTAMP NOT NULL DEFAULT now(), "state" integer NOT NULL DEFAULT '0', "archiveDate" TIMESTAMP, CONSTRAINT "PK_64c36c2b8d86a0d5de4cf64de8d" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE TABLE "Users" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "orgid" uuid, "username" character varying(100) NOT NULL, "password" character varying(255) NOT NULL, "email" character varying(255) NOT NULL, "fname" character varying(100) NOT NULL, "lname" character varying(100) NOT NULL, "token" character varying(255), "TokenExpires" TIMESTAMP, "phone" character varying(20), "state" integer NOT NULL DEFAULT '0', "regdate" TIMESTAMP NOT NULL DEFAULT now(), "updatedate" TIMESTAMP NOT NULL DEFAULT now(), "Orglogindate" TIMESTAMP, CONSTRAINT "UQ_ffc81a3b97dcbf8e320d5106c0d" UNIQUE ("username"), CONSTRAINT "UQ_3c3ab3f49a87e6ddb607f3c4945" UNIQUE ("email"), CONSTRAINT "PK_16d4f7d636df336db11d87413e3" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE TABLE "Contacts" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "name" character varying(255) NOT NULL, "email" character varying(255) NOT NULL, "userid" uuid, "type" integer NOT NULL, "txt" text NOT NULL, "state" integer NOT NULL DEFAULT '0', "createDate" TIMESTAMP NOT NULL DEFAULT now(), "updateDate" TIMESTAMP NOT NULL DEFAULT now(), "adminResponse" text, "responseDate" TIMESTAMP, "respondedBy" uuid, CONSTRAINT "PK_68782cec65c8eef577c62958273" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE TABLE "ChatArchives" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "chatId" uuid NOT NULL, "archivedMessages" json NOT NULL, "archivedAt" TIMESTAMP NOT NULL, "createDate" TIMESTAMP NOT NULL DEFAULT now(), "chatType" character varying(50) NOT NULL, "chatName" character varying(255), "gameId" uuid, "participants" uuid array NOT NULL, CONSTRAINT "PK_fe62979fc2061d7afe278d3f14e" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE TABLE "Games" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "gamecode" character varying(10) NOT NULL, "maxplayers" integer NOT NULL, "logintype" integer NOT NULL DEFAULT '0', "createdby" character varying(255), "orgid" character varying(255), "gamedecks" json NOT NULL, "players" json NOT NULL DEFAULT '[]', "started" boolean NOT NULL DEFAULT false, "finished" boolean NOT NULL DEFAULT false, "winner" character varying(255), "state" integer NOT NULL DEFAULT '0', "create_date" TIMESTAMP NOT NULL DEFAULT now(), "start_date" TIMESTAMP, "end_date" TIMESTAMP, "update_date" TIMESTAMP NOT NULL DEFAULT now(), CONSTRAINT "UQ_9d52c646079cbe6f242a85c5c41" UNIQUE ("gamecode"), CONSTRAINT "PK_1950492f583d31609c5e9fbbe12" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE TABLE "Organizations" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "name" character varying(255) NOT NULL, "contactfname" character varying(100) NOT NULL, "contactlname" character varying(100) NOT NULL, "contactphone" character varying(20) NOT NULL, "contactemail" character varying(255) NOT NULL, "state" integer NOT NULL DEFAULT '0', "regdate" TIMESTAMP NOT NULL DEFAULT now(), "updatedate" TIMESTAMP NOT NULL DEFAULT now(), "url" character varying(500), "userinorg" integer NOT NULL DEFAULT '0', "maxOrganizationalDecks" integer, CONSTRAINT "PK_e0690a31419f6666194423526f2" PRIMARY KEY ("id"))`); - await queryRunner.query(`CREATE TABLE "Decks" ("id" uuid NOT NULL DEFAULT uuid_generate_v4(), "name" character varying(255) NOT NULL, "type" integer NOT NULL, "user_id" uuid NOT NULL, "creation_date" TIMESTAMP NOT NULL DEFAULT now(), "cards" json NOT NULL, "played_number" integer NOT NULL DEFAULT '0', "ctype" integer NOT NULL DEFAULT '0', "update_date" TIMESTAMP NOT NULL DEFAULT now(), "state" integer NOT NULL DEFAULT '0', "organization_id" uuid, CONSTRAINT "PK_001f26cb3ec39c1f25269943473" PRIMARY KEY ("id"))`); - await queryRunner.query(`ALTER TABLE "Decks" ADD CONSTRAINT "FK_06ee28f90d68543a03b14aebe13" FOREIGN KEY ("organization_id") REFERENCES "Organizations"("id") ON DELETE NO ACTION ON UPDATE NO ACTION`); - } - - public async down(queryRunner: QueryRunner): Promise { - await queryRunner.query(`ALTER TABLE "Decks" DROP CONSTRAINT "FK_06ee28f90d68543a03b14aebe13"`); - await queryRunner.query(`DROP TABLE "Decks"`); - await queryRunner.query(`DROP TABLE "Organizations"`); - await queryRunner.query(`DROP TABLE "Games"`); - await queryRunner.query(`DROP TABLE "ChatArchives"`); - await queryRunner.query(`DROP TABLE "Contacts"`); - await queryRunner.query(`DROP TABLE "Users"`); - await queryRunner.query(`DROP TABLE "Chats"`); - } - -} diff --git a/SerpentRace_Backend/src/Infrastructure/Migrationsettings/1757939815062-full.ts b/SerpentRace_Backend/src/Infrastructure/Migrationsettings/1757939815062-full.ts deleted file mode 100644 index b3735dbc..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Migrationsettings/1757939815062-full.ts +++ /dev/null @@ -1,11 +0,0 @@ -import { MigrationInterface, QueryRunner } from "typeorm"; - -export class Full1757939815062 implements MigrationInterface { - - public async up(queryRunner: QueryRunner): Promise { - } - - public async down(queryRunner: QueryRunner): Promise { - } - -} diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/ChatArchiveRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/ChatArchiveRepository.ts deleted file mode 100644 index 3ec25839..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/ChatArchiveRepository.ts +++ /dev/null @@ -1,138 +0,0 @@ -import { Repository } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { ChatArchiveAggregate } from '../../Domain/Chat/ChatArchiveAggregate'; -import { IChatArchiveRepository } from '../../Domain/IRepository/IChatArchiveRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; -import { ChatState } from '../../Domain/Chat/ChatAggregate'; - -export class ChatArchiveRepository implements IChatArchiveRepository { - private repo: Repository; - - constructor() { - this.repo = AppDataSource.getRepository(ChatArchiveAggregate); - } - - async create(archive: Partial) { - const startTime = Date.now(); - try { - const result = await this.repo.save(archive); - logDatabase('Chat archive created successfully', undefined, Date.now() - startTime, { - archiveId: result.id, - chatId: result.chatId, - messageCount: result.archivedMessages?.length || 0 - }); - return result; - } catch (error) { - logError('ChatArchiveRepository.create error', error as Error); - throw new Error('Failed to create chat archive in database'); - } - } - - async findAll() { - const startTime = Date.now(); - try { - const result = await this.repo.find(); - logDatabase('All chat archives retrieved', undefined, Date.now() - startTime, { - count: result.length - }); - return result; - } catch (error) { - logError('ChatArchiveRepository.findAll error', error as Error); - throw new Error('Failed to retrieve chat archives from database'); - } - } - - async findById(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ id }); - logDatabase('Chat archive retrieved by id', `findById(${id})`, Date.now() - startTime, { - archiveId: id, - found: !!result - }); - return result; - } catch (error) { - logError('ChatArchiveRepository.findById error', error as Error); - throw new Error('Failed to find chat archive by id'); - } - } - - async findByChatId(chatId: string) { - const startTime = Date.now(); - try { - const result = await this.repo - .find({ - where: { chatId }, - order: { archivedAt: 'DESC' } - }); - - logDatabase('Chat archives retrieved by chat id', `findByChatId(${chatId})`, Date.now() - startTime, { - chatId, - count: result.length - }); - return result; - } catch (error) { - logError('ChatArchiveRepository.findByChatId error', error as Error); - throw new Error('Failed to find chat archives by chat id'); - } - } - - async findByGameId(gameId: string) { - const startTime = Date.now(); - try { - const result = await this.repo - .find({ - where: { gameId }, - order: { archivedAt: 'DESC' } - }); - - logDatabase('Chat archives retrieved by game id', `findByGameId(${gameId})`, Date.now() - startTime, { - gameId, - count: result.length - }); - return result; - } catch (error) { - logError('ChatArchiveRepository.findByGameId error', error as Error); - throw new Error('Failed to find chat archives by game id'); - } - } - - async delete(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.delete(id); - logDatabase('Chat archive deleted', `delete(${id})`, Date.now() - startTime, { - archiveId: id, - affected: result.affected - }); - return result; - } catch (error) { - logError('ChatArchiveRepository.delete error', error as Error); - throw new Error('Failed to delete chat archive'); - } - } - - async cleanup(olderThanDays: number) { - const startTime = Date.now(); - try { - const cutoffDate = new Date(Date.now() - olderThanDays * 24 * 60 * 60 * 1000); - - const result = await this.repo - .createQueryBuilder() - .delete() - .where('archivedAt < :cutoffDate', { cutoffDate }) - .execute(); - - logDatabase('Chat archive cleanup completed', `cleanup(${olderThanDays} days)`, Date.now() - startTime, { - olderThanDays, - deleted: result.affected, - cutoffDate - }); - - return result.affected || 0; - } catch (error) { - logError('ChatArchiveRepository.cleanup error', error as Error); - throw new Error('Failed to cleanup old chat archives'); - } - } -} diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/ChatRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/ChatRepository.ts deleted file mode 100644 index 1b266e7f..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/ChatRepository.ts +++ /dev/null @@ -1,358 +0,0 @@ -import { Repository, MoreThan, Not } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { ChatAggregate, ChatState, ChatType } from '../../Domain/Chat/ChatAggregate'; -import { ChatArchiveAggregate } from '../../Domain/Chat/ChatArchiveAggregate'; -import { IChatRepository } from '../../Domain/IRepository/IChatRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; - -export class ChatRepository implements IChatRepository { - private repo: Repository; - private archiveRepo: Repository; - - constructor() { - this.repo = AppDataSource.getRepository(ChatAggregate); - this.archiveRepo = AppDataSource.getRepository(ChatArchiveAggregate); - } - - async create(chat: Partial) { - const startTime = Date.now(); - try { - const result = await this.repo.save(chat); - logDatabase('Chat created successfully', undefined, Date.now() - startTime, { - chatId: result.id, - type: result.type, - participants: result.users?.length || 0 - }); - return result; - } catch (error) { - logError('ChatRepository.create error', error as Error); - throw new Error('Failed to create chat in database'); - } - } - - async findByPage(from: number, to: number): Promise<{ chats: ChatAggregate[], totalCount: number }> { - const startTime = Date.now(); - try { - const skip = from; - const take = to - from + 1; - - const [chats, totalCount] = await this.repo.findAndCount({ - where: { state: Not(ChatState.SOFT_DELETE) }, - order: { createDate: 'DESC' }, - skip, - take - }); - - logDatabase('Chats page retrieved successfully', undefined, Date.now() - startTime, { - from, - to, - returned: chats.length, - totalCount - }); - - return { chats, totalCount }; - } catch (error) { - logError('ChatRepository.findByPage error', error as Error); - throw new Error('Failed to retrieve chats page from database'); - } - } - - async findByPageIncludingDeleted(from: number, to: number): Promise<{ chats: ChatAggregate[], totalCount: number }> { - const startTime = Date.now(); - try { - const skip = from; - const take = to - from + 1; - - const [chats, totalCount] = await this.repo.findAndCount({ - order: { createDate: 'DESC' }, - skip, - take - }); - - logDatabase('Chats page retrieved successfully (including deleted)', undefined, Date.now() - startTime, { - from, - to, - returned: chats.length, - totalCount - }); - - return { chats, totalCount }; - } catch (error) { - logError('ChatRepository.findByPageIncludingDeleted error', error as Error); - throw new Error('Failed to retrieve chats page from database'); - } - } - - async findById(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOne({ - where: { - id, - state: Not(ChatState.SOFT_DELETE) - } - }); - logDatabase('Chat findById query completed', undefined, Date.now() - startTime, { - found: !!result, - chatId: id - }); - return result; - } catch (error) { - logError('ChatRepository.findById error', error as Error); - throw new Error('Failed to retrieve chat from database'); - } - } - - async findByIdIncludingDeleted(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ id }); - logDatabase('Chat findByIdIncludingDeleted query completed', undefined, Date.now() - startTime, { - found: !!result, - chatId: id - }); - return result; - } catch (error) { - logError('ChatRepository.findByIdIncludingDeleted error', error as Error); - throw new Error('Failed to retrieve chat from database'); - } - } - - async findByUserId(userId: string) { - const startTime = Date.now(); - try { - const result = await this.repo - .createQueryBuilder('chat') - .where(':userId = ANY(chat.users)', { userId }) - .andWhere('chat.state != :softDelete', { softDelete: ChatState.SOFT_DELETE }) - .getMany(); - - logDatabase('Chats retrieved by user id', `findByUserId(${userId})`, Date.now() - startTime, { - userId, - count: result.length - }); - return result; - } catch (error) { - logError('ChatRepository.findByUserId error', error as Error); - throw new Error('Failed to find chats by user id'); - } - } - - async findByUserIdIncludingDeleted(userId: string) { - const startTime = Date.now(); - try { - const result = await this.repo - .createQueryBuilder('chat') - .where(':userId = ANY(chat.users)', { userId }) - .getMany(); - - logDatabase('Chats retrieved by user id (including deleted)', `findByUserIdIncludingDeleted(${userId})`, Date.now() - startTime, { - userId, - count: result.length - }); - return result; - } catch (error) { - logError('ChatRepository.findByUserIdIncludingDeleted error', error as Error); - throw new Error('Failed to find all chats by user id'); - } - } - - async findByGameId(gameId: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ - gameId, - type: ChatType.GAME, - state: ChatState.ACTIVE - }); - logDatabase('Chat retrieved by game id', `findByGameId(${gameId})`, Date.now() - startTime, { - gameId, - found: !!result - }); - return result; - } catch (error) { - logError('ChatRepository.findByGameId error', error as Error); - throw new Error('Failed to find chat by game id'); - } - } - - async findActiveChatsForUser(userId: string) { - const startTime = Date.now(); - try { - const result = await this.repo - .createQueryBuilder('chat') - .where(':userId = ANY(chat.users)', { userId }) - .andWhere('chat.state = :state', { state: ChatState.ACTIVE }) - .orderBy('chat.lastActivity', 'DESC') - .getMany(); - - logDatabase('Active chats retrieved for user', `findActiveChatsForUser(${userId})`, Date.now() - startTime, { - userId, - count: result.length - }); - return result; - } catch (error) { - logError('ChatRepository.findActiveChatsForUser error', error as Error); - throw new Error('Failed to find active chats for user'); - } - } - - async findInactiveChats(inactivityMinutes: number) { - const startTime = Date.now(); - try { - const cutoffDate = new Date(Date.now() - inactivityMinutes * 60 * 1000); - - const result = await this.repo - .createQueryBuilder('chat') - .where('chat.state = :state', { state: ChatState.ACTIVE }) - .andWhere('(chat.lastActivity < :cutoffDate OR chat.lastActivity IS NULL)', { cutoffDate }) - .getMany(); - - logDatabase('Inactive chats retrieved', `findInactiveChats(${inactivityMinutes}min)`, Date.now() - startTime, { - inactivityMinutes, - count: result.length, - cutoffDate - }); - return result; - } catch (error) { - logError('ChatRepository.findInactiveChats error', error as Error); - throw new Error('Failed to find inactive chats'); - } - } - - async update(id: string, update: Partial) { - const startTime = Date.now(); - try { - await this.repo.update(id, update); - const result = await this.findById(id); - logDatabase('Chat updated successfully', `update(${id})`, Date.now() - startTime, { - chatId: id, - updatedFields: Object.keys(update), - success: !!result - }); - return result; - } catch (error) { - logError('ChatRepository.update error', error as Error); - throw new Error('Failed to update chat in database'); - } - } - - async delete(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.delete(id); - logDatabase('Chat deleted', `delete(${id})`, Date.now() - startTime, { - chatId: id, - affected: result.affected - }); - return result; - } catch (error) { - logError('ChatRepository.delete error', error as Error); - throw new Error('Failed to delete chat'); - } - } - - async softDelete(id: string) { - const startTime = Date.now(); - try { - await this.repo.update(id, { state: ChatState.SOFT_DELETE }); - const result = await this.findById(id); - logDatabase('Chat soft deleted', `softDelete(${id})`, Date.now() - startTime, { - chatId: id, - success: !!result - }); - return result; - } catch (error) { - logError('ChatRepository.softDelete error', error as Error); - throw new Error('Failed to soft delete chat'); - } - } - - async archiveChat(chat: ChatAggregate) { - const startTime = Date.now(); - try { - const archive = new ChatArchiveAggregate(); - archive.chatId = chat.id; - archive.archivedMessages = chat.messages; - archive.archivedAt = new Date(); - archive.chatType = chat.type; - archive.chatName = chat.name; - archive.gameId = chat.gameId; - archive.participants = chat.users; - - const archivedResult = await this.archiveRepo.save(archive); - - await this.repo.update(chat.id, { - state: ChatState.ARCHIVE, - messages: [], - archiveDate: new Date() - }); - - logDatabase('Chat archived successfully', `archiveChat(${chat.id})`, Date.now() - startTime, { - chatId: chat.id, - messageCount: chat.messages.length, - archiveId: archivedResult.id - }); - - return archivedResult; - } catch (error) { - logError('ChatRepository.archiveChat error', error as Error); - throw new Error('Failed to archive chat'); - } - } - - async getArchivedChat(chatId: string) { - const startTime = Date.now(); - try { - const result = await this.archiveRepo.findOneBy({ chatId }); - logDatabase('Archived chat retrieved', `getArchivedChat(${chatId})`, Date.now() - startTime, { - chatId, - found: !!result - }); - return result; - } catch (error) { - logError('ChatRepository.getArchivedChat error', error as Error); - throw new Error('Failed to retrieve archived chat'); - } - } - - async restoreFromArchive(chatId: string) { - const startTime = Date.now(); - try { - const archive = await this.archiveRepo.findOneBy({ chatId }); - if (!archive) { - return null; - } - - // Game chats cannot be restored, only viewed - if (archive.chatType === ChatType.GAME) { - logDatabase('Game chat restore attempt blocked', `restoreFromArchive(${chatId})`, Date.now() - startTime, { - chatId, - chatType: archive.chatType, - blocked: true - }); - return null; - } - - // Restore messages to the chat - await this.repo.update(chatId, { - state: ChatState.ACTIVE, - messages: archive.archivedMessages, - lastActivity: new Date(), - archiveDate: null - }); - - const result = await this.findById(chatId); - logDatabase('Chat restored from archive', `restoreFromArchive(${chatId})`, Date.now() - startTime, { - chatId, - messageCount: archive.archivedMessages.length, - success: !!result - }); - - return result; - } catch (error) { - logError('ChatRepository.restoreFromArchive error', error as Error); - throw new Error('Failed to restore chat from archive'); - } - } -} diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/ContactRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/ContactRepository.ts deleted file mode 100644 index dab30922..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/ContactRepository.ts +++ /dev/null @@ -1,125 +0,0 @@ -import { Repository, Not } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { ContactAggregate, ContactState } from '../../Domain/Contact/ContactAggregate'; -import { IContactRepository } from '../../Domain/IRepository/IContactRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; - -export class ContactRepository implements IContactRepository { - private repo: Repository; - - constructor() { - this.repo = AppDataSource.getRepository(ContactAggregate); - } - - async create(contact: Partial) { - return this.repo.save(contact); - } - - async findById(id: string) { - return this.repo - .createQueryBuilder('contact') - .where('contact.id = :id', { id }) - .andWhere('contact.state != :softDelete', { softDelete: ContactState.SOFT_DELETE }) - .getOne(); - } - - async findByPage(from: number, to: number): Promise<{ contacts: ContactAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count({ - where: { - state: Not(ContactState.SOFT_DELETE) - } - }); - - // Get paginated results - const contacts = await this.repo - .createQueryBuilder('contact') - .where('contact.state != :softDelete', { softDelete: ContactState.SOFT_DELETE }) - .orderBy('contact.createDate', 'DESC') - .limit(limit) - .offset(offset) - .getMany(); - - const endTime = performance.now(); - logDatabase('Contact page query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${contacts.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { contacts, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Contact page query failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('ContactRepository.findByPage error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get contacts page from database'); - } - } - - async findByPageIncludingDeleted(from: number, to: number): Promise<{ contacts: ContactAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count(); - - // Get paginated results - const contacts = await this.repo - .createQueryBuilder('contact') - .orderBy('contact.createDate', 'DESC') - .limit(limit) - .offset(offset) - .getMany(); - - const endTime = performance.now(); - logDatabase('Contact page query completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${contacts.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { contacts, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Contact page query failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('ContactRepository.findByPageIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get contacts page from database'); - } - } - - async update(id: string, update: Partial) { - await this.repo.update(id, update); - return this.findById(id); - } - - async delete(id: string) { - return this.repo.delete(id); - } - - async softDelete(id: string) { - await this.repo.update(id, { state: ContactState.SOFT_DELETE }); - return this.findById(id); - } - - async findByIdIncludingDeleted(id: string) { - return this.repo.findOneBy({ id }); // Returns contact regardless of state - } - - async searchIncludingDeleted(searchTerm: string) { - return this.repo - .createQueryBuilder('contact') - .where('contact.name ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` }) - .orWhere('contact.email ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` }) - .orWhere('contact.txt ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` }) - .getMany(); - } - - async search(searchTerm: string) { - return this.repo - .createQueryBuilder('contact') - .where('contact.name ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` }) - .orWhere('contact.email ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` }) - .orWhere('contact.txt ILIKE :searchTerm', { searchTerm: `%${searchTerm}%` }) - .andWhere('contact.state != :softDelete', { softDelete: ContactState.SOFT_DELETE }) - .getMany(); - } -} diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/DeckRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/DeckRepository.ts deleted file mode 100644 index fb17dc4c..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/DeckRepository.ts +++ /dev/null @@ -1,307 +0,0 @@ -import { Repository, Not } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { DeckAggregate, State, CType } from '../../Domain/Deck/DeckAggregate'; -import { IDeckRepository } from '../../Domain/IRepository/IDeckRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; -import { AdminBypassService } from '../../Application/Services/AdminBypassService'; - -export class DeckRepository implements IDeckRepository { - private repo: Repository; - constructor() { - this.repo = AppDataSource.getRepository(DeckAggregate); - } - - async create(deck: Partial) { - return this.repo.save(deck); - } - - async findByPage(from: number, to: number): Promise<{ decks: DeckAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count({ - where: { state: Not(State.SOFT_DELETE) } - }); - - // Get paginated results - const decks = await this.repo.find({ - where: { state: Not(State.SOFT_DELETE) }, - order: { updatedate: 'DESC' }, - take: limit, - skip: offset - }); - - const endTime = performance.now(); - logDatabase('Deck page query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${decks.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { decks, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Deck page query failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('DeckRepository.findByPage error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get decks page from database'); - } - } - - async findByPageIncludingDeleted(from: number, to: number): Promise<{ decks: DeckAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count(); - - // Get paginated results - const decks = await this.repo.find({ - order: { updatedate: 'DESC' }, - take: limit, - skip: offset - }); - - const endTime = performance.now(); - logDatabase('Deck page query completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${decks.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { decks, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Deck page query failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('DeckRepository.findByPageIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get decks page from database'); - } - } - - async findById(id: string) { - return this.repo.findOne({ - where: { - id, - state: Not(State.SOFT_DELETE) - } - }); - } - - async findByIdIncludingDeleted(id: string) { - return this.repo.findOneBy({ id }); - } - - async update(id: string, update: Partial) { - await this.repo.update(id, update); - return this.findByIdIncludingDeleted(id); - } - - async delete(id: string) { - return this.repo.delete(id); - } - - async softDelete(id: string) { - await this.repo.update(id, { state: State.SOFT_DELETE }); - return this.findById(id); - } - - async search(query: string, limit: number = 20, offset: number = 0): Promise<{ decks: DeckAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const searchPattern = `%${query.toLowerCase()}%`; - - const queryBuilder = this.repo.createQueryBuilder('deck') - .where('deck.state != :softDelete', { softDelete: State.SOFT_DELETE }) - .andWhere('LOWER(deck.name) LIKE :pattern', { pattern: searchPattern }); - - const totalCount = await queryBuilder.getCount(); - - const decks = await queryBuilder - .orderBy('deck.name', 'ASC') - .limit(limit) - .offset(offset) - .getMany(); - - const endTime = performance.now(); - logDatabase('Deck search completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${decks.length}, total: ${totalCount}, searchTerm: "${query}", limit: ${limit}, offset: ${offset}`); - - return { decks, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Deck search failed', `executionTime: ${Math.round(endTime - startTime)}ms, searchTerm: "${query}"`); - logError('DeckRepository.search error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to search decks in database'); - } - } - - async searchIncludingDeleted(query: string, limit: number = 20, offset: number = 0): Promise<{ decks: DeckAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const searchPattern = `%${query.toLowerCase()}%`; - - const queryBuilder = this.repo.createQueryBuilder('deck') - .where('LOWER(deck.name) LIKE :pattern', { pattern: searchPattern }); - - const totalCount = await queryBuilder.getCount(); - - const decks = await queryBuilder - .orderBy('deck.name', 'ASC') - .limit(limit) - .offset(offset) - .getMany(); - - const endTime = performance.now(); - logDatabase('Deck search completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${decks.length}, total: ${totalCount}, searchTerm: "${query}", limit: ${limit}, offset: ${offset}`); - - return { decks, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Deck search failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, searchTerm: "${query}"`); - logError('DeckRepository.searchIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to search all decks in database'); - } - } - - /** - * Count active (non-soft-deleted) decks for a specific user - * @param userId - User ID to count decks for - * @returns Number of active decks - */ - async countActiveByUserId(userId: string): Promise { - const startTime = performance.now(); - try { - const count = await this.repo.count({ - where: { - userid: userId, - state: Not(State.SOFT_DELETE) - } - }); - - const endTime = performance.now(); - logDatabase('User active deck count completed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}, count: ${count}`); - - return count; - } catch (error) { - const endTime = performance.now(); - logDatabase('User active deck count failed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}`); - logError('DeckRepository.countActiveByUserId error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to count active decks for user'); - } - } - - /** - * Count organizational decks for a specific user - * @param userId - User ID to count organizational decks for - * @returns Number of organizational decks - */ - async countOrganizationalByUserId(userId: string): Promise { - const startTime = performance.now(); - try { - const count = await this.repo.count({ - where: { - userid: userId, - ctype: CType.ORGANIZATION, - state: Not(State.SOFT_DELETE) - } - }); - - const endTime = performance.now(); - logDatabase('User organizational deck count completed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}, count: ${count}`); - - return count; - } catch (error) { - const endTime = performance.now(); - logDatabase('User organizational deck count failed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}`); - logError('DeckRepository.countOrganizationalByUserId error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to count organizational decks for user'); - } - } - - /** - * Find decks with filtering based on user permissions and mandatory pagination - * @param userId - User ID for filtering - * @param userOrgId - User's organization ID (if any) - * @param isAdmin - Whether user is admin (bypasses filtering) - * @param from - Start index for pagination (default: 0) - * @param to - End index for pagination (default: 49) - * @returns Paginated filtered list of decks with total count - */ - async findFilteredDecks(userId: string, userOrgId?: string | null, isAdmin?: boolean, from: number = 0, to: number = 49): Promise<{ decks: DeckAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - // Validate pagination parameters - if (from < 0 || to < from) { - throw new Error('Invalid pagination parameters'); - } - - const limit = to - from + 1; - if (limit > 100) { - throw new Error('Page size too large. Maximum 100 records per request'); - } - - const skip = from; - const take = limit; - - // Admin gets ALL decks with pagination - if (isAdmin) { - AdminBypassService.logAdminBypass( - 'FIND_FILTERED_DECKS_BYPASS', - userId, - 'all-decks-filtered', - { - bypassType: 'admin-all-decks-filtered', - userOrgId, - from, - to, - operation: 'read' - } - ); - - const [decks, totalCount] = await this.repo.findAndCount({ - where: { state: Not(State.SOFT_DELETE) }, - relations: ['organization'], - order: { creationdate: 'DESC' }, - skip, - take - }); - - const endTime = performance.now(); - logDatabase('Admin filtered deck query completed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}, found: ${decks.length}, totalCount: ${totalCount}, isAdmin: true`); - - return { decks, totalCount }; - } - - // Regular user complex filtering - const queryBuilder = this.repo.createQueryBuilder('deck') - .leftJoinAndSelect('deck.organization', 'org') - .where('deck.state != :deletedState', { deletedState: State.SOFT_DELETE }); - - queryBuilder.andWhere('(' + - // User's private decks - '(deck.userid = :userId AND deck.ctype = :privateType) OR ' + - // All public decks - '(deck.ctype = :publicType)' + - // Organization decks from same org (if user has org) - (userOrgId ? ' OR (deck.ctype = :orgType AND org.id = :orgId)' : '') + - ')', { - userId, - privateType: CType.PRIVATE, - publicType: CType.PUBLIC, - ...(userOrgId && { orgType: CType.ORGANIZATION, orgId: userOrgId }) - }); - - queryBuilder - .orderBy('deck.creationdate', 'DESC') - .skip(skip) - .take(take); - - const [decks, totalCount] = await queryBuilder.getManyAndCount(); - - const endTime = performance.now(); - logDatabase('User filtered deck query completed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}, userOrgId: ${userOrgId}, found: ${decks.length}, totalCount: ${totalCount}, isAdmin: false`); - - return { decks, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Filtered deck query failed', `executionTime: ${Math.round(endTime - startTime)}ms, userId: ${userId}, isAdmin: ${isAdmin}`); - logError('DeckRepository.findFilteredDecks error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find filtered decks'); - } - } -} diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/GameRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/GameRepository.ts deleted file mode 100644 index 673b1901..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/GameRepository.ts +++ /dev/null @@ -1,419 +0,0 @@ -import { Repository, Not, In } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { GameAggregate, GameState } from '../../Domain/Game/GameAggregate'; -import { IGameRepository } from '../../Domain/IRepository/IGameRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; - -export class GameRepository implements IGameRepository { - private repo: Repository; - constructor() { - this.repo = AppDataSource.getRepository(GameAggregate); - } - - async create(game: Partial): Promise { - const startTime = performance.now(); - try { - const result = await this.repo.save(game); - const endTime = performance.now(); - logDatabase('Game created', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${result.id}, gameCode: ${result.gamecode}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game creation failed', `executionTime: ${Math.round(endTime - startTime)}ms`); - logError('GameRepository.create error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to create game in database'); - } - } - - async findByPage(from: number, to: number): Promise<{ games: GameAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count({ - where: { state: Not(GameState.CANCELLED) } - }); - - // Get paginated results - const games = await this.repo.find({ - where: { state: Not(GameState.CANCELLED) }, - order: { updatedate: 'DESC' }, - take: limit, - skip: offset - }); - - const endTime = performance.now(); - logDatabase('Game page query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${games.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { games, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game page query failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('GameRepository.findByPage error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get games page from database'); - } - } - - async findByPageIncludingDeleted(from: number, to: number): Promise<{ games: GameAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination (including deleted) - const totalCount = await this.repo.count(); - - // Get paginated results (including deleted) - const games = await this.repo.find({ - order: { updatedate: 'DESC' }, - take: limit, - skip: offset - }); - - const endTime = performance.now(); - logDatabase('Game page query (including deleted) completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${games.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { games, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game page query (including deleted) failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('GameRepository.findByPageIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get games page (including deleted) from database'); - } - } - - async findById(id: string): Promise { - const startTime = performance.now(); - try { - const result = await this.repo.findOne({ - where: { id, state: Not(GameState.CANCELLED) } - }); - const endTime = performance.now(); - logDatabase('Game findById completed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}, found: ${!!result}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game findById failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}`); - logError('GameRepository.findById error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find game by id in database'); - } - } - - async findByIdIncludingDeleted(id: string): Promise { - const startTime = performance.now(); - try { - const result = await this.repo.findOne({ - where: { id } - }); - const endTime = performance.now(); - logDatabase('Game findByIdIncludingDeleted completed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}, found: ${!!result}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game findByIdIncludingDeleted failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}`); - logError('GameRepository.findByIdIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find game by id (including deleted) in database'); - } - } - - async findByGameCode(gamecode: string): Promise { - const startTime = performance.now(); - try { - const result = await this.repo.findOne({ - where: { gamecode, state: Not(GameState.CANCELLED) } - }); - const endTime = performance.now(); - logDatabase('Game findByGameCode completed', `executionTime: ${Math.round(endTime - startTime)}ms, gameCode: ${gamecode}, found: ${!!result}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game findByGameCode failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameCode: ${gamecode}`); - logError('GameRepository.findByGameCode error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find game by game code in database'); - } - } - - async search(query: string, limit?: number, offset?: number): Promise<{ games: GameAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const queryBuilder = this.repo.createQueryBuilder('game') - .where('game.state != :cancelledState', { cancelledState: GameState.CANCELLED }) - .andWhere('(game.gamecode ILIKE :query)', { query: `%${query}%` }); - - // Get total count - const totalCount = await queryBuilder.getCount(); - - // Apply pagination if provided - if (limit !== undefined) { - queryBuilder.take(limit); - } - if (offset !== undefined) { - queryBuilder.skip(offset); - } - - const games = await queryBuilder.orderBy('game.updatedate', 'DESC').getMany(); - - const endTime = performance.now(); - logDatabase('Game search completed', `executionTime: ${Math.round(endTime - startTime)}ms, query: ${query}, found: ${games.length}, total: ${totalCount}`); - - return { games, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game search failed', `executionTime: ${Math.round(endTime - startTime)}ms, query: ${query}`); - logError('GameRepository.search error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to search games in database'); - } - } - - async searchIncludingDeleted(query: string, limit?: number, offset?: number): Promise<{ games: GameAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const queryBuilder = this.repo.createQueryBuilder('game') - .where('(game.gamecode ILIKE :query)', { query: `%${query}%` }); - - // Get total count - const totalCount = await queryBuilder.getCount(); - - // Apply pagination if provided - if (limit !== undefined) { - queryBuilder.take(limit); - } - if (offset !== undefined) { - queryBuilder.skip(offset); - } - - const games = await queryBuilder.orderBy('game.updatedate', 'DESC').getMany(); - - const endTime = performance.now(); - logDatabase('Game search (including deleted) completed', `executionTime: ${Math.round(endTime - startTime)}ms, query: ${query}, found: ${games.length}, total: ${totalCount}`); - - return { games, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game search (including deleted) failed', `executionTime: ${Math.round(endTime - startTime)}ms, query: ${query}`); - logError('GameRepository.searchIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to search games (including deleted) in database'); - } - } - - async update(id: string, update: Partial): Promise { - const startTime = performance.now(); - try { - await this.repo.update(id, update); - const result = await this.findById(id); - const endTime = performance.now(); - logDatabase('Game update completed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}, updated: ${!!result}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game update failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}`); - logError('GameRepository.update error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to update game in database'); - } - } - - async delete(id: string): Promise { - const startTime = performance.now(); - try { - const result = await this.repo.delete(id); - const endTime = performance.now(); - logDatabase('Game delete completed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}, affected: ${result.affected}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game delete failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}`); - logError('GameRepository.delete error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to delete game from database'); - } - } - - async softDelete(id: string): Promise { - const startTime = performance.now(); - try { - await this.repo.update(id, { state: GameState.CANCELLED }); - const result = await this.findByIdIncludingDeleted(id); - const endTime = performance.now(); - logDatabase('Game soft delete completed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}, updated: ${!!result}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game soft delete failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${id}`); - logError('GameRepository.softDelete error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to soft delete game in database'); - } - } - - // Game-specific methods - async findActiveGames(): Promise { - const startTime = performance.now(); - try { - const games = await this.repo.find({ - where: { state: GameState.ACTIVE }, - order: { updatedate: 'DESC' } - }); - const endTime = performance.now(); - logDatabase('Active games query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${games.length}`); - return games; - } catch (error) { - const endTime = performance.now(); - logDatabase('Active games query failed', `executionTime: ${Math.round(endTime - startTime)}ms`); - logError('GameRepository.findActiveGames error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find active games in database'); - } - } - - async findGamesByPlayer(playerId: string): Promise { - const startTime = performance.now(); - try { - const queryBuilder = this.repo.createQueryBuilder('game') - .where('game.state != :cancelledState', { cancelledState: GameState.CANCELLED }) - .andWhere('JSON_CONTAINS(game.players, :playerId)', { playerId: `"${playerId}"` }) - .orderBy('game.updatedate', 'DESC'); - - const games = await queryBuilder.getMany(); - const endTime = performance.now(); - logDatabase('Games by player query completed', `executionTime: ${Math.round(endTime - startTime)}ms, playerId: ${playerId}, found: ${games.length}`); - return games; - } catch (error) { - const endTime = performance.now(); - logDatabase('Games by player query failed', `executionTime: ${Math.round(endTime - startTime)}ms, playerId: ${playerId}`); - logError('GameRepository.findGamesByPlayer error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find games by player in database'); - } - } - - async findWaitingGames(): Promise { - const startTime = performance.now(); - try { - const games = await this.repo.find({ - where: { state: GameState.WAITING }, - order: { createdate: 'ASC' } - }); - const endTime = performance.now(); - logDatabase('Waiting games query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${games.length}`); - return games; - } catch (error) { - const endTime = performance.now(); - logDatabase('Waiting games query failed', `executionTime: ${Math.round(endTime - startTime)}ms`); - logError('GameRepository.findWaitingGames error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find waiting games in database'); - } - } - - async findFinishedGames(from?: number, to?: number): Promise<{ games: GameAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const queryBuilder = this.repo.createQueryBuilder('game') - .where('game.state = :finishedState', { finishedState: GameState.FINISHED }) - .orderBy('game.enddate', 'DESC'); - - // Get total count - const totalCount = await queryBuilder.getCount(); - - // Apply pagination if provided - if (from !== undefined && to !== undefined) { - const limit = to - from + 1; - const offset = from; - queryBuilder.take(limit).skip(offset); - } - - const games = await queryBuilder.getMany(); - const endTime = performance.now(); - logDatabase('Finished games query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${games.length}, total: ${totalCount}`); - return { games, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Finished games query failed', `executionTime: ${Math.round(endTime - startTime)}ms`); - logError('GameRepository.findFinishedGames error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to find finished games in database'); - } - } - - async addPlayerToGame(gameId: string, playerId: string): Promise { - const startTime = performance.now(); - try { - const game = await this.findById(gameId); - if (!game) { - return null; - } - - // Check if player is already in the game - if (game.players.includes(playerId)) { - return game; - } - - // Check if game is full - if (game.players.length >= game.maxplayers) { - throw new Error('Game is full'); - } - - const updatedPlayers = [...game.players, playerId]; - const result = await this.update(gameId, { players: updatedPlayers }); - - const endTime = performance.now(); - logDatabase('Player added to game', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${gameId}, playerId: ${playerId}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Add player to game failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${gameId}, playerId: ${playerId}`); - logError('GameRepository.addPlayerToGame error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to add player to game in database'); - } - } - - async removePlayerFromGame(gameId: string, playerId: string): Promise { - const startTime = performance.now(); - try { - const game = await this.findById(gameId); - if (!game) { - return null; - } - - const updatedPlayers = game.players.filter(id => id !== playerId); - const result = await this.update(gameId, { players: updatedPlayers }); - - const endTime = performance.now(); - logDatabase('Player removed from game', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${gameId}, playerId: ${playerId}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Remove player from game failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${gameId}, playerId: ${playerId}`); - logError('GameRepository.removePlayerFromGame error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to remove player from game in database'); - } - } - - async updateGameState(gameId: string, started: boolean, finished?: boolean, winner?: string): Promise { - const startTime = performance.now(); - try { - const updateData: Partial = { started }; - - if (started && !finished) { - updateData.state = GameState.ACTIVE; - updateData.startdate = new Date(); - } - - if (finished) { - updateData.finished = true; - updateData.state = GameState.FINISHED; - updateData.enddate = new Date(); - if (winner) { - updateData.winner = winner; - } - } - - const result = await this.update(gameId, updateData); - - const endTime = performance.now(); - logDatabase('Game state updated', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${gameId}, started: ${started}, finished: ${finished}, winner: ${winner}`); - return result; - } catch (error) { - const endTime = performance.now(); - logDatabase('Game state update failed', `executionTime: ${Math.round(endTime - startTime)}ms, gameId: ${gameId}`); - logError('GameRepository.updateGameState error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to update game state in database'); - } - } -} \ No newline at end of file diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/OrganizationRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/OrganizationRepository.ts deleted file mode 100644 index f8647e60..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/OrganizationRepository.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { Repository, Not } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { OrganizationAggregate, OrganizationState } from '../../Domain/Organization/OrganizationAggregate'; -import { IOrganizationRepository } from '../../Domain/IRepository/IOrganizationRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; - -export class OrganizationRepository implements IOrganizationRepository { - private repo: Repository; - constructor() { - this.repo = AppDataSource.getRepository(OrganizationAggregate); - } - - async create(org: Partial) { - return this.repo.save(org); - } - - async findByPage(from: number, to: number): Promise<{ organizations: OrganizationAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count({ - where: { state: Not(OrganizationState.SOFT_DELETE) } - }); - - // Get paginated results - const organizations = await this.repo.find({ - where: { state: Not(OrganizationState.SOFT_DELETE) }, - order: { name: 'ASC' }, - take: limit, - skip: offset - }); - - const endTime = performance.now(); - logDatabase('Organization page query completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { organizations, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Organization page query failed', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('OrganizationRepository.findByPage error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get organizations page from database'); - } - } - - async findByPageIncludingDeleted(from: number, to: number): Promise<{ organizations: OrganizationAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count(); - - // Get paginated results - const organizations = await this.repo.find({ - order: { name: 'ASC' }, - take: limit, - skip: offset - }); - - const endTime = performance.now(); - logDatabase('Organization page query completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, from: ${from}, to: ${to}`); - - return { organizations, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Organization page query failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, from: ${from}, to: ${to}`); - logError('OrganizationRepository.findByPageIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to get organizations page from database'); - } - } - - async findById(id: string) { - return this.repo.findOne({ - where: { - id, - state: Not(OrganizationState.SOFT_DELETE) - } - }); - } - - async findByIdIncludingDeleted(id: string) { - return this.repo.findOneBy({ id }); - } - - async update(id: string, update: Partial) { - await this.repo.update(id, update); - return this.findById(id); - } - - async delete(id: string) { - return this.repo.delete(id); - } - - async softDelete(id: string) { - await this.repo.update(id, { state: OrganizationState.SOFT_DELETE }); - return this.findById(id); - } - - async search(query: string, limit: number = 20, offset: number = 0): Promise<{ organizations: OrganizationAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const searchPattern = `%${query.toLowerCase()}%`; - - const queryBuilder = this.repo.createQueryBuilder('org') - .where('org.state != :softDelete', { softDelete: OrganizationState.SOFT_DELETE }) - .andWhere('(LOWER(org.name) LIKE :pattern OR LOWER(org.contactfname) LIKE :pattern OR LOWER(org.contactlname) LIKE :pattern OR LOWER(org.contactemail) LIKE :pattern OR LOWER(CONCAT(org.contactfname, \' \', org.contactlname)) LIKE :pattern)', { pattern: searchPattern }); - - const totalCount = await queryBuilder.getCount(); - - const organizations = await queryBuilder - .orderBy('org.name', 'ASC') - .limit(limit) - .offset(offset) - .getMany(); - - const endTime = performance.now(); - logDatabase('Organization search completed', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, searchTerm: "${query}", limit: ${limit}, offset: ${offset}`); - - return { organizations, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Organization search failed', `executionTime: ${Math.round(endTime - startTime)}ms, searchTerm: "${query}"`); - logError('OrganizationRepository.search error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to search organizations in database'); - } - } - - async searchIncludingDeleted(query: string, limit: number = 20, offset: number = 0): Promise<{ organizations: OrganizationAggregate[], totalCount: number }> { - const startTime = performance.now(); - try { - const searchPattern = `%${query.toLowerCase()}%`; - - const queryBuilder = this.repo.createQueryBuilder('org') - .where('LOWER(org.name) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(org.contactfname) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(org.contactlname) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(org.contactemail) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(CONCAT(org.contactfname, \' \', org.contactlname)) LIKE :pattern', { pattern: searchPattern }); - - const totalCount = await queryBuilder.getCount(); - - const organizations = await queryBuilder - .orderBy('org.name', 'ASC') - .limit(limit) - .offset(offset) - .getMany(); - - const endTime = performance.now(); - logDatabase('Organization search completed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, found: ${organizations.length}, total: ${totalCount}, searchTerm: "${query}", limit: ${limit}, offset: ${offset}`); - - return { organizations, totalCount }; - } catch (error) { - const endTime = performance.now(); - logDatabase('Organization search failed (including deleted)', `executionTime: ${Math.round(endTime - startTime)}ms, searchTerm: "${query}"`); - logError('OrganizationRepository.searchIncludingDeleted error', error instanceof Error ? error : new Error(String(error))); - throw new Error('Failed to search all organizations in database'); - } - } - -} diff --git a/SerpentRace_Backend/src/Infrastructure/Repository/UserRepository.ts b/SerpentRace_Backend/src/Infrastructure/Repository/UserRepository.ts deleted file mode 100644 index 3563e993..00000000 --- a/SerpentRace_Backend/src/Infrastructure/Repository/UserRepository.ts +++ /dev/null @@ -1,349 +0,0 @@ -import { Repository, Not } from 'typeorm'; -import { AppDataSource } from '../ormconfig'; -import { UserAggregate, UserState } from '../../Domain/User/UserAggregate'; -import { IUserRepository } from '../../Domain/IRepository/IUserRepository'; -import { logDatabase, logError } from '../../Application/Services/Logger'; - -export class UserRepository implements IUserRepository { - private repo: Repository; - constructor() { - this.repo = AppDataSource.getRepository(UserAggregate); - } - - async create(user: Partial) { - const startTime = Date.now(); - try { - const result = await this.repo.save(user); - logDatabase('User created successfully', undefined, Date.now() - startTime, { - userId: result.id, - username: user.username, - email: user.email - }); - return result; - } catch (error) { - logError('UserRepository.create error', error as Error); - - // Handle unique constraint violations - if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique'))) { - throw new Error('User with this username or email already exists'); - } - - throw new Error('Failed to create user in database'); - } - } - - async findByPage(from: number, to: number): Promise<{ users: UserAggregate[], totalCount: number }> { - const startTime = Date.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count({ - where: { state: Not(UserState.SOFT_DELETE) } - }); - - // Get paginated results - const users = await this.repo.find({ - where: { state: Not(UserState.SOFT_DELETE) }, - order: { regdate: 'DESC' }, - take: limit, - skip: offset - }); - - logDatabase('User page query completed', `from: ${from}, to: ${to}`, Date.now() - startTime, { - found: users.length, - total: totalCount - }); - - return { users, totalCount }; - } catch (error) { - logError('UserRepository.findByPage error', error as Error); - throw new Error('Failed to get users page from database'); - } - } - - async findByPageIncludingDeleted(from: number, to: number): Promise<{ users: UserAggregate[], totalCount: number }> { - const startTime = Date.now(); - try { - const limit = to - from + 1; - const offset = from; - - // Get total count for pagination - const totalCount = await this.repo.count(); - - // Get paginated results - const users = await this.repo.find({ - order: { regdate: 'DESC' }, - take: limit, - skip: offset - }); - - logDatabase('User page query completed (including deleted)', `from: ${from}, to: ${to}`, Date.now() - startTime, { - found: users.length, - total: totalCount - }); - - return { users, totalCount }; - } catch (error) { - logError('UserRepository.findByPageIncludingDeleted error', error as Error); - throw new Error('Failed to get users page from database'); - } - } - - async findById(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOne({ - where: { - id, - state: Not(UserState.SOFT_DELETE) - } - }); - logDatabase('User findById query completed', `findOneBy({ id: ${id} })`, Date.now() - startTime, { - found: !!result, - userId: id - }); - return result; - } catch (error) { - logError('UserRepository.findById error', error as Error); - - if (error instanceof Error && error.message.includes('invalid input syntax for type uuid')) { - return null; - } - - throw new Error('Failed to retrieve user from database'); - } - } - - async findByIdIncludingDeleted(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ id }); - logDatabase('User findByIdIncludingDeleted query completed', `findOneBy({ id: ${id} })`, Date.now() - startTime, { - found: !!result, - userId: id - }); - return result; - } catch (error) { - logError('UserRepository.findByIdIncludingDeleted error', error as Error); - - if (error instanceof Error && error.message.includes('invalid input syntax for type uuid')) { - return null; - } - - throw new Error('Failed to retrieve user from database'); - } - } - - async findByUsername(username: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ username }); - logDatabase('User findByUsername query completed', `findOneBy({ username: ${username} })`, Date.now() - startTime, { - found: !!result, - username - }); - return result; - } catch (error) { - logError('UserRepository.findByUsername error', error as Error); - throw new Error('Failed to retrieve user by username from database'); - } - } - - async findByEmail(email: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ email }); - logDatabase('User findByEmail query completed', `findOneBy({ email: ${email} })`, Date.now() - startTime, { - found: !!result, - email - }); - return result; - } catch (error) { - logError('UserRepository.findByEmail error', error as Error); - throw new Error('Failed to retrieve user by email from database'); - } - } - - async findByToken(token: string) { - const startTime = Date.now(); - try { - const result = await this.repo.findOneBy({ token: token }); - logDatabase('User findByToken query completed', `findOneBy({ token })`, Date.now() - startTime, { - found: !!result, - tokenPrefix: token.substring(0, 8) + '...' - }); - return result; - } catch (error) { - logError('UserRepository.findByToken error', error as Error); - throw new Error('Failed to retrieve user by token from database'); - } - } - - async update(id: string, update: Partial) { - const startTime = Date.now(); - try { - await this.repo.update(id, update); - const result = await this.findById(id); - logDatabase('User updated successfully', `update(${id})`, Date.now() - startTime, { - userId: id, - updatedFields: Object.keys(update), - success: !!result - }); - return result; - } catch (error) { - logError('UserRepository.update error', error as Error); - - // Handle unique constraint violations - if (error instanceof Error && (error.message.includes('duplicate') || error.message.includes('unique'))) { - throw new Error('Username or email already exists'); - } - - // Handle invalid UUID format - if (error instanceof Error && error.message.includes('invalid input syntax for type uuid')) { - throw new Error('Invalid user ID format'); - } - - throw new Error('Failed to update user in database'); - } - } - - async delete(id: string) { - const startTime = Date.now(); - try { - const result = await this.repo.delete(id); - logDatabase('User deleted successfully', `delete(${id})`, Date.now() - startTime, { - userId: id, - affected: result.affected - }); - return result; - } catch (error) { - logError('UserRepository.delete error', error as Error); - - // Handle invalid UUID format - if (error instanceof Error && error.message.includes('invalid input syntax for type uuid')) { - throw new Error('Invalid user ID format'); - } - - throw new Error('Failed to delete user from database'); - } - } - - async softDelete(id: string) { - const startTime = Date.now(); - try { - await this.repo.update(id, { state: UserState.SOFT_DELETE }); - const result = await this.findById(id); - logDatabase('User soft deleted successfully', `update(${id}, { state: SOFT_DELETE })`, Date.now() - startTime, { - userId: id, - success: !!result - }); - return result; - } catch (error) { - logError('UserRepository.softDelete error', error as Error); - - // Handle invalid UUID format - if (error instanceof Error && error.message.includes('invalid input syntax for type uuid')) { - throw new Error('Invalid user ID format'); - } - - throw new Error('Failed to soft delete user in database'); - } - } - - async deactivate(id: string) { - const startTime = Date.now(); - try { - await this.repo.update(id, { state: UserState.DEACTIVATED }); - const result = await this.findById(id); - logDatabase('User deactivated successfully', `update(${id}, { state: DEACTIVATED })`, Date.now() - startTime, { - userId: id, - success: !!result - }); - return result; - } catch (error) { - logError('UserRepository.deactivate error', error as Error); - - // Handle invalid UUID format - if (error instanceof Error && error.message.includes('invalid input syntax for type uuid')) { - throw new Error('Invalid user ID format'); - } - - throw new Error('Failed to deactivate user in database'); - } - } - - async search(query: string, limit: number = 20, offset: number = 0): Promise<{ users: UserAggregate[], totalCount: number }> { - const startTime = Date.now(); - try { - const searchPattern = `%${query.toLowerCase()}%`; - - const queryBuilder = this.repo.createQueryBuilder('user') - .where('user.state != :softDelete', { softDelete: UserState.SOFT_DELETE }) - .andWhere('(LOWER(user.username) LIKE :pattern OR LOWER(user.email) LIKE :pattern OR LOWER(user.fname) LIKE :pattern OR LOWER(user.lname) LIKE :pattern OR LOWER(CONCAT(user.fname, \' \', user.lname)) LIKE :pattern)', { pattern: searchPattern }); - - const totalCount = await queryBuilder.getCount(); - - const users = await queryBuilder - .orderBy('user.username', 'ASC') - .limit(limit) - .offset(offset) - .getMany(); - - logDatabase('User search completed', - `search query: ${query.substring(0, 50)}...`, - Date.now() - startTime, { - query, - limit, - offset, - totalCount, - returnedCount: users.length - }); - - return { users, totalCount }; - } catch (error) { - logError('UserRepository.search error', error as Error); - throw new Error('Failed to search users in database'); - } - } - - async searchIncludingDeleted(query: string, limit: number = 20, offset: number = 0): Promise<{ users: UserAggregate[], totalCount: number }> { - const startTime = Date.now(); - try { - const searchPattern = `%${query.toLowerCase()}%`; - - const queryBuilder = this.repo.createQueryBuilder('user') - .where('LOWER(user.username) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(user.email) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(user.fname) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(user.lname) LIKE :pattern', { pattern: searchPattern }) - .orWhere('LOWER(CONCAT(user.fname, \' \', user.lname)) LIKE :pattern', { pattern: searchPattern }); - - const totalCount = await queryBuilder.getCount(); - - const users = await queryBuilder - .orderBy('user.username', 'ASC') - .limit(limit) - .offset(offset) - .getMany(); - - logDatabase('User search completed (including deleted)', - `search query: ${query.substring(0, 50)}...`, - Date.now() - startTime, { - query, - limit, - offset, - totalCount, - returnedCount: users.length - }); - - return { users, totalCount }; - } catch (error) { - logError('UserRepository.searchIncludingDeleted error', error as Error); - throw new Error('Failed to search all users in database'); - } - } - - -} diff --git a/SerpentRace_Backend/src/Infrastructure/ormconfig.ts b/SerpentRace_Backend/src/Infrastructure/ormconfig.ts deleted file mode 100644 index 939b2117..00000000 --- a/SerpentRace_Backend/src/Infrastructure/ormconfig.ts +++ /dev/null @@ -1,17 +0,0 @@ -import { DataSource } from 'typeorm'; -import { join } from 'path'; - -export const AppDataSource = new DataSource({ - type: 'postgres', - host: process.env.DB_HOST || 'localhost', - port: parseInt(process.env.DB_PORT || '5432'), - username: process.env.DB_USERNAME || 'postgres', - password: process.env.DB_PASSWORD || 'postgres', - database: process.env.DB_NAME || 'serpentrace', - synchronize: false, // Set to false when using migrations - logging: process.env.NODE_ENV === 'development', - entities: [join(__dirname, '../Domain/**/*Aggregate.ts')], - migrations: [join(__dirname, './Migrations/*.ts')], - migrationsTableName: 'migrations', - migrationsRun: false // Let migrations run manually -}); \ No newline at end of file diff --git a/SerpentRace_Backend/src/Templates/contact-response-de.html b/SerpentRace_Backend/src/Templates/contact-response-de.html deleted file mode 100644 index bb5c8d03..00000000 --- a/SerpentRace_Backend/src/Templates/contact-response-de.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - {{companyName}} - Antwort auf Ihre {{contactTypeString}} - - - - - - diff --git a/SerpentRace_Backend/src/Templates/contact-response-de.txt b/SerpentRace_Backend/src/Templates/contact-response-de.txt deleted file mode 100644 index b02f1fcb..00000000 --- a/SerpentRace_Backend/src/Templates/contact-response-de.txt +++ /dev/null @@ -1,21 +0,0 @@ -{{companyName}} - Antwort auf Ihre {{contactTypeString}} - -Hallo {{contactName}}, - -Vielen Dank, dass Sie uns kontaktiert haben! Wir haben Ihre Nachricht geprüft und unser Team hat die folgende Antwort vorbereitet. - -=== IHRE URSPRÜNGLICHE NACHRICHT ({{contactTypeString}}) === -{{originalMessage}} - -=== UNSERE ANTWORT === -{{adminResponse}} - -Wenn Sie weitere Fragen haben oder zusätzliche Hilfe benötigen, zögern Sie bitte nicht, uns erneut zu kontaktieren. - -Vielen Dank, dass Sie sich für {{companyName}} entschieden haben! - -Für weitere Unterstützung kontaktieren Sie uns unter {{supportEmail}} -Dies ist eine automatische Antwort. Bitte antworten Sie nicht direkt auf diese E-Mail. - ---- -{{companyName}} Support-Team diff --git a/SerpentRace_Backend/src/Templates/contact-response-hu.html b/SerpentRace_Backend/src/Templates/contact-response-hu.html deleted file mode 100644 index aeac09c3..00000000 --- a/SerpentRace_Backend/src/Templates/contact-response-hu.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - {{companyName}} - Válasz az Ön {{contactTypeString}} üzenetére - - - - - - diff --git a/SerpentRace_Backend/src/Templates/contact-response-hu.txt b/SerpentRace_Backend/src/Templates/contact-response-hu.txt deleted file mode 100644 index 5433961b..00000000 --- a/SerpentRace_Backend/src/Templates/contact-response-hu.txt +++ /dev/null @@ -1,21 +0,0 @@ -{{companyName}} - Válasz az Ön {{contactTypeString}} üzenetére - -Kedves {{contactName}}! - -Köszönjük, hogy kapcsolatba lépett velünk! Átnéztük az Ön üzenetét és csapatunk az alábbi választ készítette. - -=== AZ ÖN EREDETI ÜZENETE ({{contactTypeString}}) === -{{originalMessage}} - -=== VÁLASZUNK === -{{adminResponse}} - -Ha további kérdése van vagy további segítségre van szüksége, kérjük, ne habozzon kapcsolatba lépni velünk újra. - -Köszönjük, hogy a {{companyName}} szolgáltatásait választotta! - -További támogatásért lépjen kapcsolatba velünk a {{supportEmail}} címen -Ez egy automatikus válasz. Kérjük, ne válaszoljon közvetlenül erre az e-mailre. - ---- -{{companyName}} Támogatási Csapat diff --git a/SerpentRace_Backend/src/Templates/contact-response.html b/SerpentRace_Backend/src/Templates/contact-response.html deleted file mode 100644 index 4c928510..00000000 --- a/SerpentRace_Backend/src/Templates/contact-response.html +++ /dev/null @@ -1,137 +0,0 @@ - - - - - - {{companyName}} - Response to Your {{contactTypeString}} - - - - - - diff --git a/SerpentRace_Backend/src/Templates/contact-response.txt b/SerpentRace_Backend/src/Templates/contact-response.txt deleted file mode 100644 index cdf4a016..00000000 --- a/SerpentRace_Backend/src/Templates/contact-response.txt +++ /dev/null @@ -1,21 +0,0 @@ -{{companyName}} - Response to Your {{contactTypeString}} - -Hello {{contactName}}, - -Thank you for contacting us! We've reviewed your message and our team has provided a response below. - -=== YOUR ORIGINAL MESSAGE ({{contactTypeString}}) === -{{originalMessage}} - -=== OUR RESPONSE === -{{adminResponse}} - -If you have any additional questions or need further assistance, please don't hesitate to contact us again. - -Thank you for choosing {{companyName}}! - -For additional support, contact us at {{supportEmail}} -This is an automated response. Please do not reply directly to this email. - ---- -{{companyName}} Support Team diff --git a/SerpentRace_Backend/src/Templates/password-reset-de.html b/SerpentRace_Backend/src/Templates/password-reset-de.html deleted file mode 100644 index cba82184..00000000 --- a/SerpentRace_Backend/src/Templates/password-reset-de.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - SerpentRace - Passwort zurücksetzen - - - - - - diff --git a/SerpentRace_Backend/src/Templates/password-reset-de.txt b/SerpentRace_Backend/src/Templates/password-reset-de.txt deleted file mode 100644 index 86210ee6..00000000 --- a/SerpentRace_Backend/src/Templates/password-reset-de.txt +++ /dev/null @@ -1,44 +0,0 @@ -🐍 {{ companyName }} - Passwort zurücksetzen -=============================================== - -Hallo {{ userName }}! - -Wir haben eine Anfrage zum Zurücksetzen Ihres Passworts für Ihr {{ companyName }} Konto erhalten. - -Wenn Sie diese Anfrage gestellt haben, verwenden Sie den folgenden Link, um Ihr Passwort zurückzusetzen: - -PASSWORT-RESET-LINK: -{{ resetUrl }} - -RESET-TOKEN: -{{ resetToken }} - -Sie können entweder den obigen Link oder das Reset-Token verwenden, um Ihr Passwort zurückzusetzen. - -WICHTIGE SICHERHEITSINFORMATIONEN: -🚨 Dieser Passwort-Reset-Link läuft aus Sicherheitsgründen in 1 Stunde ab -🚨 Falls Sie keine Passwort-Zurücksetzung angefordert haben, ignorieren Sie diese E-Mail bitte und Ihr Passwort bleibt unverändert -🚨 Teilen Sie Ihr Reset-Token niemals mit anderen -🚨 {{ companyName }} wird Sie niemals per E-Mail nach Ihrem Passwort fragen - -SICHERHEITSTIPPS FÜR IHR NEUES PASSWORT: -💡 Verwenden Sie mindestens 8 Zeichen -💡 Verwenden Sie Groß- und Kleinbuchstaben -💡 Fügen Sie Zahlen und Sonderzeichen hinzu -💡 Verwenden Sie keine Passwörter von anderen Konten wieder -💡 Erwägen Sie die Verwendung eines Passwort-Managers - -DIESE ZURÜCKSETZUNG NICHT ANGEFORDERT? -Falls Sie keine Passwort-Zurücksetzung angefordert haben, ist Ihr Konto weiterhin sicher. Sie können diese E-Mail getrost ignorieren. -Falls Sie jedoch Bedenken bezüglich unbefugten Zugriffs haben, kontaktieren Sie bitte umgehend unser Support-Team. - -BENÖTIGEN SIE HILFE? -Falls Sie Sicherheitsbedenken haben oder Unterstützung benötigen, kontaktieren Sie unser Support-Team unter {{ supportEmail }} - -Zu Ihrer Sicherheit können wir Sie bitten, Ihre Identität zu verifizieren, wenn Sie den Support kontaktieren. - ---- -Diese E-Mail wurde vom {{ companyName }} Sicherheitsteam gesendet -Dies ist eine automatische Nachricht, bitte antworten Sie nicht auf diese E-Mail. - -© 2025 {{ companyName }}. Alle Rechte vorbehalten. diff --git a/SerpentRace_Backend/src/Templates/password-reset-hu.html b/SerpentRace_Backend/src/Templates/password-reset-hu.html deleted file mode 100644 index 5ac57bbd..00000000 --- a/SerpentRace_Backend/src/Templates/password-reset-hu.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - SerpentRace - Jelszó visszaállítás kérése - - - - - - diff --git a/SerpentRace_Backend/src/Templates/password-reset-hu.txt b/SerpentRace_Backend/src/Templates/password-reset-hu.txt deleted file mode 100644 index f4e8002c..00000000 --- a/SerpentRace_Backend/src/Templates/password-reset-hu.txt +++ /dev/null @@ -1,44 +0,0 @@ -🐍 {{ companyName }} - Jelszó visszaállítás kérése -=============================================== - -Üdvözöljük {{ userName }}! - -Kérést kaptunk a {{ companyName }} fiókjához tartozó jelszó visszaállítására. - -Ha Ön küldte ezt a kérést, használja az alábbi linket a jelszó visszaállításához: - -JELSZÓ VISSZAÁLLÍTÁSI LINK: -{{ resetUrl }} - -VISSZAÁLLÍTÁSI TOKEN: -{{ resetToken }} - -Használhatja a fenti linket vagy a visszaállítási tokent a jelszava visszaállításához. - -FONTOS BIZTONSÁGI INFORMÁCIÓK: -🚨 Ez a jelszó-visszaállítási link biztonsági okokból 1 óra múlva lejár -🚨 Ha Ön nem kért jelszó visszaállítást, kérjük, hagyja figyelmen kívül ezt az e-mailt, és jelszava változatlan marad -🚨 Soha ne ossza meg a visszaállítási tokenjét senkivel -🚨 A {{ companyName }} soha nem fogja e-mailben kérni az Ön jelszavát - -BIZTONSÁGI TIPPEK AZ ÚJ JELSZAVÁHOZ: -💡 Használjon legalább 8 karaktert -💡 Használjon kis- és nagybetűket -💡 Adjon hozzá számokat és speciális karaktereket -💡 Ne használja újra más fiókok jelszavait -💡 Fontolja meg egy jelszókezelő használatát - -NEM ÖN KÉRTE EZT A VISSZAÁLLÍTÁST? -Ha Ön nem kért jelszó visszaállítást, fiókja továbbra is biztonságos. Nyugodtan figyelmen kívül hagyhatja ezt az e-mailt. -Azonban, ha aggodalmai vannak a jogosulatlan hozzáféréssel kapcsolatban, kérjük, azonnal lépjen kapcsolatba ügyfélszolgálatunkkal. - -SEGÍTSÉGRE VAN SZÜKSÉGE? -Ha biztonsági aggályai vannak vagy segítségre van szüksége, lépjen kapcsolatba ügyfélszolgálatunkkal: {{ supportEmail }} - -Biztonsága érdekében megkérhetjük, hogy igazolja személyazonosságát, amikor kapcsolatba lép ügyfélszolgálatunkkal. - ---- -Ezt az e-mailt a {{ companyName }} Biztonsági Csapata küldte -Ez egy automatikus üzenet, kérjük, ne válaszoljon erre az e-mailre. - -© 2025 {{ companyName }}. Minden jog fenntartva. diff --git a/SerpentRace_Backend/src/Templates/password-reset.html b/SerpentRace_Backend/src/Templates/password-reset.html deleted file mode 100644 index 9fbf46e4..00000000 --- a/SerpentRace_Backend/src/Templates/password-reset.html +++ /dev/null @@ -1,203 +0,0 @@ - - - - - - SerpentRace - Password Reset Request - - - - - - diff --git a/SerpentRace_Backend/src/Templates/password-reset.txt b/SerpentRace_Backend/src/Templates/password-reset.txt deleted file mode 100644 index 1f28794a..00000000 --- a/SerpentRace_Backend/src/Templates/password-reset.txt +++ /dev/null @@ -1,44 +0,0 @@ -🐍 {{ companyName }} - Password Reset Request -=============================================== - -Hello {{ userName }}! - -We received a request to reset your password for your {{ companyName }} account. - -If you made this request, use the link below to reset your password: - -PASSWORD RESET LINK: -{{ resetUrl }} - -RESET TOKEN: -{{ resetToken }} - -You can use either the link above or the reset token to reset your password. - -IMPORTANT SECURITY INFORMATION: -🚨 This password reset link will expire in 1 hour for your security -🚨 If you didn't request a password reset, please ignore this email and your password will remain unchanged -🚨 Never share your reset token with anyone -🚨 {{ companyName }} will never ask for your password via email - -SECURITY TIPS FOR YOUR NEW PASSWORD: -💡 Use at least 8 characters -💡 Include uppercase and lowercase letters -💡 Add numbers and special characters -💡 Don't reuse passwords from other accounts -💡 Consider using a password manager - -DIDN'T REQUEST THIS RESET? -If you didn't request a password reset, your account is still secure. You can safely ignore this email. -However, if you're concerned about unauthorized access, please contact our support team immediately. - -NEED HELP? -If you have security concerns or need assistance, contact our support team at {{ supportEmail }} - -For your security, we may ask you to verify your identity when contacting support. - ---- -This email was sent by {{ companyName }} Security Team -This is an automated message, please do not reply to this email. - -© 2025 {{ companyName }}. All rights reserved. diff --git a/SerpentRace_Backend/src/Templates/verification-de.html b/SerpentRace_Backend/src/Templates/verification-de.html deleted file mode 100644 index 068c35b0..00000000 --- a/SerpentRace_Backend/src/Templates/verification-de.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - SerpentRace - Konto verifizieren - - - - - - diff --git a/SerpentRace_Backend/src/Templates/verification-de.txt b/SerpentRace_Backend/src/Templates/verification-de.txt deleted file mode 100644 index ea50afb8..00000000 --- a/SerpentRace_Backend/src/Templates/verification-de.txt +++ /dev/null @@ -1,36 +0,0 @@ -🐍 {{ companyName }} - Konto verifizieren -=============================================== - -Hallo {{ userName }}! - -Willkommen bei {{ companyName }}! Wir freuen uns, dass Sie unserer Gaming-Community beigetreten sind. - -Um Ihre Registrierung abzuschließen und Ihr Konto zu nutzen, verifizieren Sie bitte Ihre E-Mail-Adresse. - -VERIFIZIERUNGSLINK: -{{ verificationUrl }} - -VERIFIZIERUNGSTOKEN: -{{ verificationToken }} - -Sie können entweder den obigen Link oder das Verifizierungstoken verwenden, um Ihr Konto zu verifizieren. - -SICHERHEITSHINWEIS: -⚠️ Dieser Verifizierungslink läuft in 24 Stunden ab -⚠️ Falls Sie kein Konto bei {{ companyName }} erstellt haben, ignorieren Sie diese E-Mail bitte -⚠️ Teilen Sie Ihren Verifizierungstoken niemals mit anderen - -Nach der Verifizierung können Sie: -✨ Ihre Spieldecks erstellen und verwalten -🎮 An Gaming-Turnieren und Wettbewerben teilnehmen -👥 Sich mit anderen Spielern in Ihrer Organisation verbinden -📊 Ihre Gaming-Statistiken und Fortschritte verfolgen - -BENÖTIGEN SIE HILFE? -Falls Sie Fragen haben oder auf Probleme stoßen, kontaktieren Sie bitte unser Support-Team unter {{ supportEmail }} - ---- -Diese E-Mail wurde von {{ companyName }} gesendet -Dies ist eine automatische Nachricht, bitte antworten Sie nicht auf diese E-Mail. - -© 2025 {{ companyName }}. Alle Rechte vorbehalten. diff --git a/SerpentRace_Backend/src/Templates/verification-hu.html b/SerpentRace_Backend/src/Templates/verification-hu.html deleted file mode 100644 index ec8e6dc4..00000000 --- a/SerpentRace_Backend/src/Templates/verification-hu.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - SerpentRace - Fiók megerősítése - - - - - - diff --git a/SerpentRace_Backend/src/Templates/verification-hu.txt b/SerpentRace_Backend/src/Templates/verification-hu.txt deleted file mode 100644 index 4519a90a..00000000 --- a/SerpentRace_Backend/src/Templates/verification-hu.txt +++ /dev/null @@ -1,36 +0,0 @@ -🐍 {{ companyName }} - Fiók megerősítése -=============================================== - -Üdvözöljük {{ userName }}! - -Üdvözöljük a {{ companyName }} közösségében! Örülünk, hogy csatlakozott hozzánk játékosközösségünkhöz. - -A regisztráció befejezéséhez és fiókja használatbavételéhez kérjük, erősítse meg e-mail címét. - -MEGERŐSÍTÉSI LINK: -{{ verificationUrl }} - -MEGERŐSÍTÉSI TOKEN: -{{ verificationToken }} - -Használhatja a fenti linket vagy a megerősítési tokent fiókja megerősítéséhez. - -BIZTONSÁGI FIGYELMEZTETÉS: -⚠️ Ez a megerősítési link 24 óra múlva lejár -⚠️ Ha Ön nem hozott létre fiókot a {{ companyName }}-nál, kérjük, hagyja figyelmen kívül ezt az e-mailt -⚠️ Soha ne ossza meg a megerősítési tokenjét senkivel - -A megerősítés után lehetősége lesz: -✨ Játékcsomagok létrehozására és kezelésére -🎮 Játékversenyeken és bajnokságokon való részvételre -👥 Kapcsolatfelvételre szervezetében lévő más játékosokkal -📊 Játékstatisztikák és fejlődés nyomon követésére - -SEGÍTSÉGRE VAN SZÜKSÉGE? -Ha kérdései vannak vagy problémákba ütközik, kérjük, lépjen kapcsolatba ügyfélszolgálatunkkal: {{ supportEmail }} - ---- -Ezt az e-mailt a {{ companyName }} küldte -Ez egy automatikus üzenet, kérjük, ne válaszoljon erre az e-mailre. - -© 2025 {{ companyName }}. Minden jog fenntartva. diff --git a/SerpentRace_Backend/src/Templates/verification.html b/SerpentRace_Backend/src/Templates/verification.html deleted file mode 100644 index 24dd5bc8..00000000 --- a/SerpentRace_Backend/src/Templates/verification.html +++ /dev/null @@ -1,186 +0,0 @@ - - - - - - SerpentRace - Verify Your Account - - - - - - diff --git a/SerpentRace_Backend/src/Templates/verification.txt b/SerpentRace_Backend/src/Templates/verification.txt deleted file mode 100644 index 3986b3a6..00000000 --- a/SerpentRace_Backend/src/Templates/verification.txt +++ /dev/null @@ -1,36 +0,0 @@ -🐍 {{ companyName }} - Account Verification -=============================================== - -Hello {{ userName }}! - -Welcome to {{ companyName }}! We're excited to have you join our gaming community. - -To complete your registration and start using your account, please verify your email address. - -VERIFICATION LINK: -{{ verificationUrl }} - -VERIFICATION TOKEN: -{{ verificationToken }} - -You can use either the link above or the verification token to verify your account. - -SECURITY NOTICE: -⚠️ This verification link will expire in 24 hours -⚠️ If you didn't create an account with {{ companyName }}, please ignore this email -⚠️ Never share your verification token with anyone - -Once verified, you'll be able to: -✨ Create and manage your game decks -🎮 Join gaming tournaments and competitions -👥 Connect with other players in your organization -📊 Track your gaming statistics and progress - -NEED HELP? -If you have any questions or encounter issues, please contact our support team at {{ supportEmail }} - ---- -This email was sent by {{ companyName }} -This is an automated message, please do not reply to this email. - -© 2025 {{ companyName }}. All rights reserved. diff --git a/SerpentRace_Backend/test-org-auth.js b/SerpentRace_Backend/test-org-auth.js deleted file mode 100644 index 4e627ad2..00000000 --- a/SerpentRace_Backend/test-org-auth.js +++ /dev/null @@ -1,46 +0,0 @@ -#!/usr/bin/env node - -/** - * Test script for Organization Authentication functionality - * This script tests the new organization authentication features: - * 1. Get organization login URL - * 2. Process third-party authentication callback - * 3. Login with organization reauthentication check - */ - -const { container } = require('./dist/Application/Services/DIContainer.js'); - -async function testOrganizationAuth() { - console.log('🧪 Testing Organization Authentication Functionality\n'); - - try { - // Test 1: Get Organization Login URL - console.log('1️⃣ Testing Get Organization Login URL Query Handler'); - const getUrlHandler = container.getOrganizationLoginUrlQueryHandler; - console.log('✅ Handler instantiated successfully'); - - // Test 2: Process Organization Auth Callback - console.log('2️⃣ Testing Process Organization Auth Callback Command Handler'); - const callbackHandler = container.processOrgAuthCallbackCommandHandler; - console.log('✅ Handler instantiated successfully'); - - // Test 3: Enhanced Login Handler with Organization Repository - console.log('3️⃣ Testing Enhanced Login Handler'); - const loginHandler = container.loginCommandHandler; - console.log('✅ Enhanced login handler instantiated successfully'); - - console.log('\n🎉 All Organization Authentication components initialized successfully!'); - console.log('\n📋 Summary of new functionality:'); - console.log(' • GET /api/organizations/:orgId/login-url - Get organization third-party login URL'); - console.log(' • POST /api/organizations/auth-callback - Process third-party authentication result'); - console.log(' • Enhanced login response includes organization reauthentication requirements'); - console.log(' • Users must reauthenticate with organization if last login > 1 month ago'); - - } catch (error) { - console.error('❌ Error testing organization authentication:', error.message); - process.exit(1); - } -} - -// Run the test -testOrganizationAuth(); diff --git a/SerpentRace_Backend/tests/Application/Chat/ChatMessagingSystem.test.ts b/SerpentRace_Backend/tests/Application/Chat/ChatMessagingSystem.test.ts deleted file mode 100644 index 1f7ee565..00000000 --- a/SerpentRace_Backend/tests/Application/Chat/ChatMessagingSystem.test.ts +++ /dev/null @@ -1,278 +0,0 @@ -import { describe, it, expect, beforeAll, afterAll, beforeEach } from '@jest/globals'; -import { AppDataSource } from '../../../src/Infrastructure/ormconfig'; -import { ChatRepository } from '../../../src/Infrastructure/Repository/ChatRepository'; -import { ChatArchiveRepository } from '../../../src/Infrastructure/Repository/ChatArchiveRepository'; -import { UserRepository } from '../../../src/Infrastructure/Repository/UserRepository'; -import { ChatType } from '../../../src/Domain/Chat/ChatAggregate'; -import { UserState } from '../../../src/Domain/User/UserAggregate'; -import { v4 as uuidv4 } from 'uuid'; - -describe('Chat Messaging System', () => { - let chatRepository: ChatRepository; - let chatArchiveRepository: ChatArchiveRepository; - let userRepository: UserRepository; - - let testUser1: any; - let testUser2: any; - let testPremiumUser: any; - - beforeAll(async () => { - if (!AppDataSource.isInitialized) { - await AppDataSource.initialize(); - } - - chatRepository = new ChatRepository(); - chatArchiveRepository = new ChatArchiveRepository(); - userRepository = new UserRepository(); - }); - - beforeEach(async () => { - // Create test users - testUser1 = await userRepository.create({ - username: `testuser1_${Date.now()}`, - email: `test1_${Date.now()}@example.com`, - password: 'hashedpassword', - fname: 'Test', - lname: 'User1', - type: 'regular', - state: UserState.VERIFIED_REGULAR - }); - - testUser2 = await userRepository.create({ - username: `testuser2_${Date.now()}`, - email: `test2_${Date.now()}@example.com`, - password: 'hashedpassword', - fname: 'Test', - lname: 'User2', - type: 'regular', - state: UserState.VERIFIED_REGULAR - }); - - testPremiumUser = await userRepository.create({ - username: `premiumuser_${Date.now()}`, - email: `premium_${Date.now()}@example.com`, - password: 'hashedpassword', - fname: 'Premium', - lname: 'User', - type: 'premium', - state: UserState.VERIFIED_PREMIUM - }); - }); - - afterAll(async () => { - if (AppDataSource.isInitialized) { - await AppDataSource.destroy(); - } - }); - - describe('Direct Chat Creation', () => { - it('should create a direct chat between two users', async () => { - const chat = await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - expect(chat).toBeDefined(); - expect(chat.type).toBe(ChatType.DIRECT); - expect(chat.users).toEqual([testUser1.id, testUser2.id]); - expect(chat.messages).toEqual([]); - }); - }); - - describe('Group Chat Creation', () => { - it('should create a group chat', async () => { - const chat = await chatRepository.create({ - type: ChatType.GROUP, - name: 'Test Group', - createdBy: testPremiumUser.id, - users: [testPremiumUser.id, testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - expect(chat).toBeDefined(); - expect(chat.type).toBe(ChatType.GROUP); - expect(chat.name).toBe('Test Group'); - expect(chat.createdBy).toBe(testPremiumUser.id); - expect(chat.users.length).toBe(3); - }); - }); - - describe('Game Chat Creation', () => { - it('should create a game chat', async () => { - const gameId = uuidv4(); - - const chat = await chatRepository.create({ - type: ChatType.GAME, - name: 'Test Game Chat', - gameId: gameId, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - expect(chat).toBeDefined(); - expect(chat.type).toBe(ChatType.GAME); - expect(chat.gameId).toBe(gameId); - expect(chat.name).toBe('Test Game Chat'); - }); - - it('should find game chat by game id', async () => { - const gameId = uuidv4(); - - await chatRepository.create({ - type: ChatType.GAME, - name: 'Test Game Chat', - gameId: gameId, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - const foundChat = await chatRepository.findByGameId(gameId); - expect(foundChat).toBeDefined(); - expect(foundChat!.gameId).toBe(gameId); - }); - }); - - describe('Message Management', () => { - it('should add and retrieve messages', async () => { - const chat = await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - const message = { - id: uuidv4(), - date: new Date(), - userid: testUser1.id, - text: 'Hello, this is a test message!' - }; - - await chatRepository.update(chat.id, { - messages: [message], - lastActivity: new Date() - }); - - const updatedChat = await chatRepository.findById(chat.id); - expect(updatedChat!.messages).toHaveLength(1); - expect(updatedChat!.messages[0].text).toBe('Hello, this is a test message!'); - expect(updatedChat!.messages[0].userid).toBe(testUser1.id); - }); - }); - - describe('Chat Archiving', () => { - it('should archive a chat with messages', async () => { - const message = { - id: uuidv4(), - date: new Date(), - userid: testUser1.id, - text: 'Message to be archived' - }; - - const chat = await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [message], - lastActivity: new Date() - }); - - const archive = await chatRepository.archiveChat(chat); - - expect(archive).toBeDefined(); - expect(archive.chatId).toBe(chat.id); - expect(archive.archivedMessages).toHaveLength(1); - expect(archive.archivedMessages[0].text).toBe('Message to be archived'); - - // Check that chat messages were cleared - const archivedChat = await chatRepository.findById(chat.id); - expect(archivedChat!.messages).toEqual([]); - expect(archivedChat!.archiveDate).toBeDefined(); - }); - - it('should retrieve archived chat', async () => { - const message = { - id: uuidv4(), - date: new Date(), - userid: testUser1.id, - text: 'Archived message' - }; - - const chat = await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [message], - lastActivity: new Date() - }); - - await chatRepository.archiveChat(chat); - - const archive = await chatRepository.getArchivedChat(chat.id); - expect(archive).toBeDefined(); - expect(archive!.archivedMessages).toHaveLength(1); - expect(archive!.archivedMessages[0].text).toBe('Archived message'); - }); - }); - - describe('Chat Queries', () => { - it('should find chats by user id', async () => { - const chat1 = await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - const chat2 = await chatRepository.create({ - type: ChatType.GROUP, - name: 'Test Group', - createdBy: testPremiumUser.id, - users: [testPremiumUser.id, testUser1.id], - messages: [], - lastActivity: new Date() - }); - - const userChats = await chatRepository.findByUserId(testUser1.id); - expect(userChats.length).toBeGreaterThanOrEqual(2); - - const chatIds = userChats.map(c => c.id); - expect(chatIds).toContain(chat1.id); - expect(chatIds).toContain(chat2.id); - }); - - it('should find active chats for user', async () => { - await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: new Date() - }); - - const activeChats = await chatRepository.findActiveChatsForUser(testUser1.id); - expect(activeChats.length).toBeGreaterThanOrEqual(1); - - // All returned chats should be active - activeChats.forEach(chat => { - expect(chat.users).toContain(testUser1.id); - }); - }); - - it('should find inactive chats', async () => { - const oldDate = new Date(Date.now() - 2 * 60 * 60 * 1000); // 2 hours ago - - await chatRepository.create({ - type: ChatType.DIRECT, - users: [testUser1.id, testUser2.id], - messages: [], - lastActivity: oldDate - }); - - const inactiveChats = await chatRepository.findInactiveChats(60); // 60 minutes - expect(inactiveChats.length).toBeGreaterThanOrEqual(1); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Contact/commands/ContactCommandHandlers.comprehensive.test.ts b/SerpentRace_Backend/tests/Application/Contact/commands/ContactCommandHandlers.comprehensive.test.ts deleted file mode 100644 index 734298e8..00000000 --- a/SerpentRace_Backend/tests/Application/Contact/commands/ContactCommandHandlers.comprehensive.test.ts +++ /dev/null @@ -1,402 +0,0 @@ -import { CreateContactCommandHandler } from '../../../../src/Application/Contact/commands/CreateContactCommandHandler'; -import { UpdateContactCommandHandler } from '../../../../src/Application/Contact/commands/UpdateContactCommandHandler'; -import { DeleteContactCommandHandler } from '../../../../src/Application/Contact/commands/DeleteContactCommandHandler'; -import { CreateContactCommand } from '../../../../src/Application/Contact/commands/CreateContactCommand'; -import { UpdateContactCommand } from '../../../../src/Application/Contact/commands/UpdateContactCommand'; -import { DeleteContactCommand } from '../../../../src/Application/Contact/commands/DeleteContactCommand'; -import { ContactType, ContactState } from '../../../../src/Domain/Contact/ContactAggregate'; -import { createMockContactRepository, createMockContact } from '../../../testUtils'; - -describe('Contact Command Handlers - Comprehensive', () => { - let mockContactRepository: ReturnType; - - beforeEach(() => { - mockContactRepository = createMockContactRepository(); - }); - - describe('CreateContactCommandHandler', () => { - let handler: CreateContactCommandHandler; - - beforeEach(() => { - handler = new CreateContactCommandHandler(mockContactRepository); - }); - - it('should create contact successfully with all fields', async () => { - // Arrange - const mockContactData = createMockContact({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'John Doe', - email: 'john@example.com', - userid: '123e4567-e89b-12d3-a456-426614174000', - type: ContactType.QUESTION, - txt: 'Test question', - state: ContactState.ACTIVE - }); - - mockContactRepository.create.mockResolvedValue(mockContactData); - - const command: CreateContactCommand = { - name: 'John Doe', - email: 'john@example.com', - userid: '123e4567-e89b-12d3-a456-426614174000', - type: ContactType.QUESTION, - txt: 'Test question' - }; - - // Act - const result = await handler.execute(command); - - // Assert - Returns ShortContactDto - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'John Doe', - email: 'john@example.com', - type: ContactType.QUESTION, - state: ContactState.ACTIVE, - createDate: expect.any(Date) - }); - expect(mockContactRepository.create).toHaveBeenCalledWith( - expect.objectContaining({ - name: 'John Doe', - email: 'john@example.com', - userid: '123e4567-e89b-12d3-a456-426614174000', - type: ContactType.QUESTION, - txt: 'Test question', - state: ContactState.ACTIVE - }) - ); - }); - - it('should create contact without userid (anonymous)', async () => { - // Arrange - const mockContactData = createMockContact({ - id: '550e8400-e29b-41d4-a716-446655440001', - name: 'Anonymous User', - email: 'anon@example.com', - userid: null, - type: ContactType.BUG, - txt: 'Bug report', - state: ContactState.ACTIVE - }); - - mockContactRepository.create.mockResolvedValue(mockContactData); - - const command: CreateContactCommand = { - name: 'Anonymous User', - email: 'anon@example.com', - type: ContactType.BUG, - txt: 'Bug report' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440001', - name: 'Anonymous User', - email: 'anon@example.com', - type: ContactType.BUG, - state: ContactState.ACTIVE, - createDate: expect.any(Date) - }); - expect(mockContactRepository.create).toHaveBeenCalledWith( - expect.objectContaining({ - userid: null - }) - ); - }); - - it('should create contact with different contact types', async () => { - const testCases = [ - { type: ContactType.BUG, description: 'Bug report' }, - { type: ContactType.PROBLEM, description: 'Problem report' }, - { type: ContactType.QUESTION, description: 'Question' }, - { type: ContactType.SALES, description: 'Sales inquiry' }, - { type: ContactType.OTHER, description: 'Other inquiry' } - ]; - - for (const testCase of testCases) { - // Arrange - const mockContactData = createMockContact({ - type: testCase.type, - txt: testCase.description - }); - - mockContactRepository.create.mockResolvedValue(mockContactData); - - const command: CreateContactCommand = { - name: 'Test User', - email: 'test@example.com', - type: testCase.type, - txt: testCase.description - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result.type).toBe(testCase.type); - expect(mockContactRepository.create).toHaveBeenCalledWith( - expect.objectContaining({ - txt: testCase.description - }) - ); - } - }); - - it('should handle database errors', async () => { - // Arrange - const command: CreateContactCommand = { - name: 'Error User', - email: 'error@example.com', - type: ContactType.QUESTION, - txt: 'This will cause an error' - }; - - mockContactRepository.create.mockRejectedValue(new Error('Database error')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to create contact'); - }); - - it('should handle non-Error exceptions', async () => { - // Arrange - const command: CreateContactCommand = { - name: 'Exception User', - email: 'exception@example.com', - type: ContactType.QUESTION, - txt: 'This will cause an exception' - }; - - mockContactRepository.create.mockRejectedValue('String error'); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to create contact'); - }); - }); - - describe('UpdateContactCommandHandler', () => { - let handler: UpdateContactCommandHandler; - - beforeEach(() => { - handler = new UpdateContactCommandHandler(mockContactRepository); - }); - - it('should update contact with admin response', async () => { - // Arrange - const existingContact = createMockContact({ - id: '550e8400-e29b-41d4-a716-446655440000', - adminResponse: null, - state: ContactState.ACTIVE - }); - - const updatedContact = createMockContact({ - ...existingContact, - adminResponse: 'Thank you for your inquiry', - state: ContactState.RESOLVED, - responseDate: new Date(), - respondedBy: 'admin123' - }); - - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.update.mockResolvedValue(updatedContact); - - const command: UpdateContactCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - adminResponse: 'Thank you for your inquiry' - }; - - // Act - const result = await handler.execute(command); - - // Assert - Returns DetailContactDto - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: expect.any(String), - email: expect.any(String), - userid: expect.any(String), - type: expect.any(Number), - txt: expect.any(String), - state: ContactState.RESOLVED, - createDate: expect.any(Date), - updateDate: expect.any(Date), - adminResponse: 'Thank you for your inquiry', - responseDate: expect.any(Date), - respondedBy: 'admin123' - }); - }); - - it('should update contact state', async () => { - // Arrange - const existingContact = createMockContact({ - id: '550e8400-e29b-41d4-a716-446655440000', - state: ContactState.ACTIVE - }); - - const updatedContact = createMockContact({ - ...existingContact, - state: ContactState.RESOLVED - }); - - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.update.mockResolvedValue(updatedContact); - - const command: UpdateContactCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - state: ContactState.RESOLVED - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result.state).toBe(ContactState.RESOLVED); - }); - - it('should throw error when contact not found', async () => { - // Arrange - mockContactRepository.findById.mockResolvedValue(null); - - const command: UpdateContactCommand = { - id: 'non-existent-id', - adminResponse: 'Response' - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Contact not found'); - }); - - it('should handle repository errors during update', async () => { - // Arrange - const existingContact = createMockContact(); - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.update.mockRejectedValue(new Error('Database error')); - - const command: UpdateContactCommand = { - id: 'existing-id', - adminResponse: 'Response' - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to update contact'); - }); - }); - - describe('DeleteContactCommandHandler', () => { - let handler: DeleteContactCommandHandler; - - beforeEach(() => { - handler = new DeleteContactCommandHandler(mockContactRepository); - }); - - it('should perform soft delete successfully', async () => { - // Arrange - const existingContact = createMockContact({ - id: '550e8400-e29b-41d4-a716-446655440000' - }); - - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.softDelete.mockResolvedValue(null); - - const command: DeleteContactCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - hard: false - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockContactRepository.findById).toHaveBeenCalledWith('550e8400-e29b-41d4-a716-446655440000'); - expect(mockContactRepository.softDelete).toHaveBeenCalledWith('550e8400-e29b-41d4-a716-446655440000'); - expect(mockContactRepository.delete).not.toHaveBeenCalled(); - }); - - it('should perform hard delete successfully', async () => { - // Arrange - const existingContact = createMockContact({ - id: '550e8400-e29b-41d4-a716-446655440000' - }); - - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.delete.mockResolvedValue(true); - - const command: DeleteContactCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - hard: true - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockContactRepository.delete).toHaveBeenCalledWith('550e8400-e29b-41d4-a716-446655440000'); - expect(mockContactRepository.softDelete).not.toHaveBeenCalled(); - }); - - it('should default to soft delete when hard flag not specified', async () => { - // Arrange - const existingContact = createMockContact(); - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.softDelete.mockResolvedValue(null); - - const command: DeleteContactCommand = { - id: '550e8400-e29b-41d4-a716-446655440000' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockContactRepository.softDelete).toHaveBeenCalled(); - expect(mockContactRepository.delete).not.toHaveBeenCalled(); - }); - - it('should throw error when contact not found', async () => { - // Arrange - mockContactRepository.findById.mockResolvedValue(null); - - const command: DeleteContactCommand = { - id: 'non-existent-id', - hard: false - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Contact not found'); - }); - - it('should handle repository errors during deletion', async () => { - // Arrange - const existingContact = createMockContact(); - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.softDelete.mockRejectedValue(new Error('Database error')); - - const command: DeleteContactCommand = { - id: 'existing-id', - hard: false - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to delete contact'); - }); - - it('should handle hard delete repository errors', async () => { - // Arrange - const existingContact = createMockContact(); - mockContactRepository.findById.mockResolvedValue(existingContact); - mockContactRepository.delete.mockRejectedValue(new Error('Database error')); - - const command: DeleteContactCommand = { - id: 'existing-id', - hard: true - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to delete contact'); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/DTOs/Mappers/ContactMapper.test.ts b/SerpentRace_Backend/tests/Application/DTOs/Mappers/ContactMapper.test.ts deleted file mode 100644 index 0c8110c9..00000000 --- a/SerpentRace_Backend/tests/Application/DTOs/Mappers/ContactMapper.test.ts +++ /dev/null @@ -1,137 +0,0 @@ -import { ContactMapper } from '../../../../src/Application/DTOs/Mappers/ContactMapper'; -import { ContactType, ContactState } from '../../../../src/Domain/Contact/ContactAggregate'; - -describe('ContactMapper', () => { - const createMockContact = (overrides: any = {}) => ({ - id: 'contact-123', - name: 'John Doe', - email: 'john.doe@example.com', - userid: 'user-456', - type: ContactType.QUESTION, - txt: 'This is a test contact message.', - state: ContactState.ACTIVE, - createDate: new Date('2024-01-01'), - updateDate: new Date('2024-01-02'), - adminResponse: null, - responseDate: null, - respondedBy: null, - ...overrides - }); - - describe('toShortDto', () => { - it('should map ContactAggregate to ShortContactDto correctly', () => { - // Arrange - const contact = createMockContact(); - - // Act - const result = ContactMapper.toShortDto(contact); - - // Assert - expect(result).toEqual({ - id: 'contact-123', - name: 'John Doe', - email: 'john.doe@example.com', - type: ContactType.QUESTION, - createDate: new Date('2024-01-01'), - state: ContactState.ACTIVE, - }); - }); - - it('should handle different contact types', () => { - // Arrange - const bugContact = createMockContact({ - id: 'bug-contact', - type: ContactType.BUG, - name: 'Bug Reporter' - }); - - // Act - const result = ContactMapper.toShortDto(bugContact); - - // Assert - expect(result.type).toBe(ContactType.BUG); - expect(result.name).toBe('Bug Reporter'); - }); - }); - - describe('toDetailDto', () => { - it('should map ContactAggregate to DetailContactDto correctly', () => { - // Arrange - const contact = createMockContact(); - - // Act - const result = ContactMapper.toDetailDto(contact); - - // Assert - expect(result).toEqual({ - id: 'contact-123', - name: 'John Doe', - email: 'john.doe@example.com', - userid: 'user-456', - type: ContactType.QUESTION, - txt: 'This is a test contact message.', - state: ContactState.ACTIVE, - createDate: new Date('2024-01-01'), - updateDate: new Date('2024-01-02'), - adminResponse: null, - responseDate: null, - respondedBy: null, - }); - }); - - it('should handle contact with admin response', () => { - // Arrange - const respondedContact = createMockContact({ - adminResponse: 'Thank you for your question. Here is the answer...', - responseDate: new Date('2024-01-03'), - respondedBy: 'admin-789' - }); - - // Act - const result = ContactMapper.toDetailDto(respondedContact); - - // Assert - expect(result.adminResponse).toBe('Thank you for your question. Here is the answer...'); - expect(result.responseDate).toEqual(new Date('2024-01-03')); - expect(result.respondedBy).toBe('admin-789'); - }); - }); - - describe('toShortDtoList', () => { - it('should map array of ContactAggregate to array of ShortContactDto', () => { - // Arrange - const contacts = [ - createMockContact({ id: 'contact-1', name: 'First Contact' }), - createMockContact({ id: 'contact-2', name: 'Second Contact', type: ContactType.BUG }), - createMockContact({ id: 'contact-3', name: 'Third Contact', type: ContactType.SALES }) - ]; - - // Act - const result = ContactMapper.toShortDtoList(contacts); - - // Assert - expect(result).toHaveLength(3); - expect(result[0]).toEqual({ - id: 'contact-1', - name: 'First Contact', - email: 'john.doe@example.com', - type: ContactType.QUESTION, - createDate: new Date('2024-01-01'), - state: ContactState.ACTIVE, - }); - expect(result[1].type).toBe(ContactType.BUG); - expect(result[2].type).toBe(ContactType.SALES); - }); - - it('should handle empty array', () => { - // Arrange - const contacts: any[] = []; - - // Act - const result = ContactMapper.toShortDtoList(contacts); - - // Assert - expect(result).toEqual([]); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/DTOs/Mappers/DeckMapper.test.ts b/SerpentRace_Backend/tests/Application/DTOs/Mappers/DeckMapper.test.ts deleted file mode 100644 index 0c05593c..00000000 --- a/SerpentRace_Backend/tests/Application/DTOs/Mappers/DeckMapper.test.ts +++ /dev/null @@ -1,187 +0,0 @@ -import { DeckMapper } from '../../../../src/Application/DTOs/Mappers/DeckMapper'; -import { Type, CType, State } from '../../../../src/Domain/Deck/DeckAggregate'; - -describe('DeckMapper', () => { - const createMockDeck = (overrides: any = {}) => ({ - id: 'deck-123', - name: 'Test Deck', - type: Type.LUCK, - userid: 'user-123', - creationdate: new Date('2024-01-01'), - cards: [ - { text: 'Test card 1', answer: 'Answer 1' }, - { text: 'Test card 2' } - ], - playedNumber: 5, - ctype: CType.PUBLIC, - updatedate: new Date('2024-01-02'), - state: State.ACTIVE, - organization: null, - ...overrides - }); - - describe('toShortDto', () => { - it('should map DeckAggregate to ShortDeckDto correctly', () => { - // Arrange - const deck = createMockDeck(); - - // Act - const result = DeckMapper.toShortDto(deck); - - // Assert - expect(result).toEqual({ - id: 'deck-123', - name: 'Test Deck', - type: Type.LUCK, - playedNumber: 5, - ctype: CType.PUBLIC - }); - }); - - it('should handle different deck types', () => { - // Arrange - const jokeDeck = createMockDeck({ - id: 'joker-deck', - name: 'Joker Deck', - type: Type.JOKER, - playedNumber: 10 - }); - - // Act - const result = DeckMapper.toShortDto(jokeDeck); - - // Assert - expect(result.type).toBe(Type.JOKER); - expect(result.playedNumber).toBe(10); - }); - - it('should handle private decks', () => { - // Arrange - const privateDeck = createMockDeck({ - ctype: CType.PRIVATE, - playedNumber: 0 - }); - - // Act - const result = DeckMapper.toShortDto(privateDeck); - - // Assert - expect(result.ctype).toBe(CType.PRIVATE); - expect(result.playedNumber).toBe(0); - }); - }); - - describe('toDetailDto', () => { - it('should map DeckAggregate to DetailDeckDto correctly', () => { - // Arrange - const deck = createMockDeck(); - - // Act - const result = DeckMapper.toDetailDto(deck); - - // Assert - expect(result).toEqual({ - id: 'deck-123', - name: 'Test Deck', - type: Type.LUCK, - userid: 'user-123', - creationdate: new Date('2024-01-01'), - cards: [ - { text: 'Test card 1', answer: 'Answer 1' }, - { text: 'Test card 2' } - ], - playedNumber: 5, - ctype: CType.PUBLIC - }); - }); - - it('should handle empty cards array', () => { - // Arrange - const deckWithNoCards = createMockDeck({ - cards: [] - }); - - // Act - const result = DeckMapper.toDetailDto(deckWithNoCards); - - // Assert - expect(result.cards).toEqual([]); - }); - - it('should handle question type deck', () => { - // Arrange - const questionDeck = createMockDeck({ - type: Type.QUESTION, - cards: [ - { text: 'Question 1?', answer: 'Answer 1' }, - { text: 'Question 2?', answer: null } - ] - }); - - // Act - const result = DeckMapper.toDetailDto(questionDeck); - - // Assert - expect(result.type).toBe(Type.QUESTION); - expect(result.cards).toHaveLength(2); - expect(result.cards[1].answer).toBeNull(); - }); - }); - - describe('toShortDtoList', () => { - it('should map array of DeckAggregate to array of ShortDeckDto', () => { - // Arrange - const decks = [ - createMockDeck({ id: 'deck-1', name: 'First Deck' }), - createMockDeck({ id: 'deck-2', name: 'Second Deck', type: Type.JOKER }), - createMockDeck({ id: 'deck-3', name: 'Third Deck', ctype: CType.PRIVATE }) - ]; - - // Act - const result = DeckMapper.toShortDtoList(decks); - - // Assert - expect(result).toHaveLength(3); - expect(result[0]).toEqual({ - id: 'deck-1', - name: 'First Deck', - type: Type.LUCK, - playedNumber: 5, - ctype: CType.PUBLIC - }); - expect(result[1].type).toBe(Type.JOKER); - expect(result[2].ctype).toBe(CType.PRIVATE); - }); - - it('should handle empty array', () => { - // Arrange - const decks: any[] = []; - - // Act - const result = DeckMapper.toShortDtoList(decks); - - // Assert - expect(result).toEqual([]); - expect(result).toHaveLength(0); - }); - - it('should handle large arrays', () => { - // Arrange - const decks = Array.from({ length: 50 }, (_, i) => - createMockDeck({ - id: `deck-${i + 1}`, - name: `Deck ${i + 1}`, - playedNumber: i - }) - ); - - // Act - const result = DeckMapper.toShortDtoList(decks); - - // Assert - expect(result).toHaveLength(50); - expect(result[0].playedNumber).toBe(0); - expect(result[49].playedNumber).toBe(49); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/DTOs/Mappers/OrganizationMapper.test.ts b/SerpentRace_Backend/tests/Application/DTOs/Mappers/OrganizationMapper.test.ts deleted file mode 100644 index bb6879ac..00000000 --- a/SerpentRace_Backend/tests/Application/DTOs/Mappers/OrganizationMapper.test.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { OrganizationMapper } from '../../../../src/Application/DTOs/Mappers/OrganizationMapper'; -import { OrganizationState, OrganizationStateType } from '../../../../src/Domain/Organization/OrganizationAggregate'; - -describe('OrganizationMapper', () => { - const createMockOrganization = (overrides: any = {}) => ({ - id: 'org-123', - name: 'Test Organization', - contactfname: 'John', - contactlname: 'Doe', - contactphone: '+1234567890', - contactemail: 'john@test.org', - state: OrganizationState.ACTIVE as OrganizationStateType, - regdate: new Date('2024-01-01'), - updatedate: new Date('2024-01-02'), - url: 'https://test.org', - userinorg: 5, - users: [ - { id: 'user-1', name: 'User One' }, - { id: 'user-2', name: 'User Two' } - ], - ...overrides - }); - - describe('toShortDto', () => { - it('should map OrganizationAggregate to ShortOrganizationDto correctly', () => { - // Arrange - const org = createMockOrganization(); - - // Act - const result = OrganizationMapper.toShortDto(org); - - // Assert - expect(result).toEqual({ - id: 'org-123', - name: 'Test Organization', - state: OrganizationState.ACTIVE, - userinorg: 5 - }); - }); - - it('should handle different organization states', () => { - // Arrange - const registeredOrg = createMockOrganization({ - state: OrganizationState.REGISTERED, - userinorg: 0 - }); - - // Act - const result = OrganizationMapper.toShortDto(registeredOrg); - - // Assert - expect(result.state).toBe(OrganizationState.REGISTERED); - expect(result.userinorg).toBe(0); - }); - - it('should handle organization with many users', () => { - // Arrange - const orgWithManyUsers = createMockOrganization({ - userinorg: 100 - }); - - // Act - const result = OrganizationMapper.toShortDto(orgWithManyUsers); - - // Assert - expect(result.userinorg).toBe(100); - }); - }); - - describe('toDetailDto', () => { - it('should map OrganizationAggregate to DetailOrganizationDto correctly', () => { - // Arrange - const org = createMockOrganization(); - - // Act - const result = OrganizationMapper.toDetailDto(org); - - // Assert - expect(result).toEqual({ - id: 'org-123', - name: 'Test Organization', - contactfname: 'John', - contactlname: 'Doe', - contactphone: '+1234567890', - contactemail: 'john@test.org', - state: OrganizationState.ACTIVE, - regdate: new Date('2024-01-01'), - updatedate: new Date('2024-01-02'), - url: 'https://test.org', - userinorg: 5, - users: ['user-1', 'user-2'] - }); - }); - - it('should handle organization without URL', () => { - // Arrange - const orgWithoutUrl = createMockOrganization({ - url: null - }); - - // Act - const result = OrganizationMapper.toDetailDto(orgWithoutUrl); - - // Assert - expect(result.url).toBeNull(); - }); - - it('should handle organization without users', () => { - // Arrange - const orgWithoutUsers = createMockOrganization({ - users: null, - userinorg: 0 - }); - - // Act - const result = OrganizationMapper.toDetailDto(orgWithoutUsers); - - // Assert - expect(result.users).toEqual([]); - expect(result.userinorg).toBe(0); - }); - - it('should handle empty users array', () => { - // Arrange - const orgWithEmptyUsers = createMockOrganization({ - users: [], - userinorg: 0 - }); - - // Act - const result = OrganizationMapper.toDetailDto(orgWithEmptyUsers); - - // Assert - expect(result.users).toEqual([]); - }); - - it('should handle soft deleted organization', () => { - // Arrange - const softDeletedOrg = createMockOrganization({ - state: OrganizationState.SOFT_DELETE - }); - - // Act - const result = OrganizationMapper.toDetailDto(softDeletedOrg); - - // Assert - expect(result.state).toBe(OrganizationState.SOFT_DELETE); - }); - }); - - describe('toShortDtoList', () => { - it('should map array of OrganizationAggregate to array of ShortOrganizationDto', () => { - // Arrange - const orgs = [ - createMockOrganization({ id: 'org-1', name: 'First Org', userinorg: 10 }), - createMockOrganization({ id: 'org-2', name: 'Second Org', state: OrganizationState.REGISTERED }), - createMockOrganization({ id: 'org-3', name: 'Third Org', userinorg: 0 }) - ]; - - // Act - const result = OrganizationMapper.toShortDtoList(orgs); - - // Assert - expect(result).toHaveLength(3); - expect(result[0]).toEqual({ - id: 'org-1', - name: 'First Org', - state: OrganizationState.ACTIVE, - userinorg: 10 - }); - expect(result[1].state).toBe(OrganizationState.REGISTERED); - expect(result[2].userinorg).toBe(0); - }); - - it('should handle empty array', () => { - // Arrange - const orgs: any[] = []; - - // Act - const result = OrganizationMapper.toShortDtoList(orgs); - - // Assert - expect(result).toEqual([]); - expect(result).toHaveLength(0); - }); - - it('should handle large arrays', () => { - // Arrange - const orgs = Array.from({ length: 25 }, (_, i) => - createMockOrganization({ - id: `org-${i + 1}`, - name: `Organization ${i + 1}`, - userinorg: i * 2 - }) - ); - - // Act - const result = OrganizationMapper.toShortDtoList(orgs); - - // Assert - expect(result).toHaveLength(25); - expect(result[0].userinorg).toBe(0); - expect(result[24].userinorg).toBe(48); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/DTOs/Mappers/UserMapper.test.ts b/SerpentRace_Backend/tests/Application/DTOs/Mappers/UserMapper.test.ts deleted file mode 100644 index f9b4789b..00000000 --- a/SerpentRace_Backend/tests/Application/DTOs/Mappers/UserMapper.test.ts +++ /dev/null @@ -1,164 +0,0 @@ -import { UserMapper } from '../../../../src/Application/DTOs/Mappers/UserMapper'; -import { UserAggregate, UserState } from '../../../../src/Domain/User/UserAggregate'; -import { createMockUser } from '../../../testUtils'; - -describe('UserMapper', () => { - describe('toShortDto', () => { - it('should map UserAggregate to ShortUserDto correctly', () => { - // Arrange - const user = createMockUser({ - id: 'user-123', - username: 'testuser', - email: 'test@example.com', - fname: 'John', - lname: 'Doe', - state: UserState.VERIFIED_REGULAR - }); - - // Act - const result = UserMapper.toShortDto(user); - - // Assert - expect(result).toEqual({ - id: 'user-123', - username: 'testuser', - state: UserState.VERIFIED_REGULAR, - authLevel: 0 - }); - // Should not contain sensitive information - expect(result).not.toHaveProperty('email'); - expect(result).not.toHaveProperty('password'); - expect(result).not.toHaveProperty('token'); - }); - - it('should map admin user with authLevel 1', () => { - // Arrange - const adminUser = createMockUser({ - id: 'admin-123', - username: 'admin', - email: 'admin@example.com', - fname: 'Admin', - lname: 'User', - state: UserState.ADMIN - }); - - // Act - const result = UserMapper.toShortDto(adminUser); - - // Assert - expect(result).toEqual({ - id: 'admin-123', - username: 'admin', - state: UserState.ADMIN, - authLevel: 1 - }); - }); - }); - - describe('toDetailDto', () => { - it('should map UserAggregate to DetailUserDto correctly', () => { - // Arrange - const user = createMockUser({ - id: 'user-123', - orgid: 'org-456', - username: 'testuser', - email: 'test@example.com', - fname: 'John', - lname: 'Doe', - token: 'verification-token', - type: 'admin', - phone: '+1234567890', - state: UserState.ADMIN - }); - - // Act - const result = UserMapper.toDetailDto(user); - - // Assert - expect(result).toEqual({ - id: 'user-123', - orgid: 'org-456', - username: 'testuser', - email: 'test@example.com', - fname: 'John', - lname: 'Doe', - code: 'verification-token', - type: 'admin', - phone: '+1234567890', - state: UserState.ADMIN - }); - // Should not contain password - expect(result).not.toHaveProperty('password'); - }); - - it('should handle null values correctly', () => { - // Arrange - const user = createMockUser({ - id: 'user-123', - orgid: null, - username: 'testuser', - email: 'test@example.com', - fname: 'John', - lname: 'Doe', - token: null, - type: 'regular', - phone: null, - state: UserState.VERIFIED_REGULAR - }); - - // Act - const result = UserMapper.toDetailDto(user); - - // Assert - expect(result.orgid).toBeNull(); - expect(result.code).toBeNull(); - expect(result.phone).toBeNull(); - }); - }); - - describe('toShortDtoList', () => { - it('should map array of UserAggregate to ShortUserDto array', () => { - // Arrange - const users = [ - createMockUser({ id: 'user-1', username: 'user1', state: UserState.VERIFIED_REGULAR }), - createMockUser({ id: 'user-2', username: 'user2', state: UserState.REGISTERED_NOT_VERIFIED }), - createMockUser({ id: 'user-3', username: 'user3', state: UserState.DEACTIVATED }) - ]; - - // Act - const result = UserMapper.toShortDtoList(users); - - // Assert - expect(result).toHaveLength(3); - expect(result[0]).toEqual({ - id: 'user-1', - username: 'user1', - state: UserState.VERIFIED_REGULAR, - authLevel: 0 - }); - expect(result[1]).toEqual({ - id: 'user-2', - username: 'user2', - state: UserState.REGISTERED_NOT_VERIFIED, - authLevel: 0 - }); - expect(result[2]).toEqual({ - id: 'user-3', - username: 'user3', - state: UserState.DEACTIVATED, - authLevel: 0 - }); - }); - - it('should handle empty array', () => { - // Arrange - const users: UserAggregate[] = []; - - // Act - const result = UserMapper.toShortDtoList(users); - - // Assert - expect(result).toEqual([]); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Deck/commands/CreateDeckCommandHandler.comprehensive.test.ts b/SerpentRace_Backend/tests/Application/Deck/commands/CreateDeckCommandHandler.comprehensive.test.ts deleted file mode 100644 index de0111b7..00000000 --- a/SerpentRace_Backend/tests/Application/Deck/commands/CreateDeckCommandHandler.comprehensive.test.ts +++ /dev/null @@ -1,207 +0,0 @@ -import { CreateDeckCommandHandler } from '../../../../src/Application/Deck/commands/CreateDeckCommandHandler'; -import { CreateDeckCommand } from '../../../../src/Application/Deck/commands/CreateDeckCommand'; -import { IDeckRepository } from '../../../../src/Domain/IRepository/IDeckRepository'; -import { IUserRepository } from '../../../../src/Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../../../../src/Domain/IRepository/IOrganizationRepository'; -import { UserState } from '../../../../src/Domain/User/UserAggregate'; -import { Type as DeckType } from '../../../../src/Domain/Deck/DeckAggregate'; -import { createMockDeck, createMockDeckRepository, createMockUserRepository, createMockOrganizationRepository, createMockUser } from '../../../testUtils'; - -describe('CreateDeckCommandHandler', () => { - let handler: CreateDeckCommandHandler; - let mockDeckRepository: jest.Mocked; - let mockUserRepository: jest.Mocked; - let mockOrganizationRepository: jest.Mocked; - - beforeEach(() => { - jest.clearAllMocks(); - - mockDeckRepository = createMockDeckRepository(); - mockUserRepository = createMockUserRepository(); - mockOrganizationRepository = createMockOrganizationRepository(); - - handler = new CreateDeckCommandHandler(mockDeckRepository, mockUserRepository, mockOrganizationRepository); - }); - - describe('execute', () => { - it('should successfully create a new deck with valid user', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [{ id: 'card-1', name: 'Test Card' }], - }; - - const mockUser = createMockUser({ - id: command.userid, - state: UserState.VERIFIED_REGULAR, - type: 'user' - }); - - const mockDeck = createMockDeck({ - name: command.name, - type: command.type, - userid: command.userid - }); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockResolvedValue(mockDeck); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - expect(mockUserRepository.findById).toHaveBeenCalledWith(command.userid); - expect(mockDeckRepository.create).toHaveBeenCalled(); - }); - - it('should throw error when user not found', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'nonexistent-user', - cards: [], - }; - - mockUserRepository.findById.mockResolvedValue(null); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('User not found'); - expect(mockUserRepository.findById).toHaveBeenCalledWith(command.userid); - expect(mockDeckRepository.create).not.toHaveBeenCalled(); - }); - - it('should handle admin user creating unlimited decks', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Admin Deck', - type: DeckType.JOKER, - userid: 'admin-123', - cards: [], - }; - - const mockAdminUser = createMockUser({ - id: command.userid, - state: UserState.VERIFIED_REGULAR, - type: 'admin' - }); - - const mockDeck = createMockDeck({ - name: command.name, - type: command.type, - userid: command.userid - }); - - mockUserRepository.findById.mockResolvedValue(mockAdminUser); - mockDeckRepository.create.mockResolvedValue(mockDeck); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - expect(mockDeckRepository.countActiveByUserId).toHaveBeenCalled(); // Admin still checks but bypasses limits - }); - - it('should handle repository creation errors', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [], - }; - - const mockUser = createMockUser({ id: command.userid }); - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockRejectedValue(new Error('Database error')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Database error'); - }); - - it('should create deck with different types', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Question Deck', - type: DeckType.QUESTION, - userid: 'user-123', - cards: [], - }; - - const mockUser = createMockUser({ id: command.userid }); - const mockDeck = createMockDeck({ - name: command.name, - type: command.type, - userid: command.userid - }); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockResolvedValue(mockDeck); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - expect(mockDeckRepository.create).toHaveBeenCalledWith(expect.objectContaining({ - type: DeckType.QUESTION - })); - }); - - it('should handle empty cards array', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Empty Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [], - }; - - const mockUser = createMockUser({ id: command.userid }); - const mockDeck = createMockDeck(command); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockResolvedValue(mockDeck); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - }); - - it('should check deck limits for regular users', async () => { - // Arrange - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [], - }; - - const mockUser = createMockUser({ - id: command.userid, - type: 'user' - }); - const mockDeck = createMockDeck({ userid: command.userid }); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockResolvedValue(mockDeck); - - // Act - await handler.execute(command); - - // Assert - expect(mockDeckRepository.countActiveByUserId).toHaveBeenCalledWith(command.userid); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Deck/commands/DeckCommandHandlers.comprehensive.test.ts b/SerpentRace_Backend/tests/Application/Deck/commands/DeckCommandHandlers.comprehensive.test.ts deleted file mode 100644 index 31dd1249..00000000 --- a/SerpentRace_Backend/tests/Application/Deck/commands/DeckCommandHandlers.comprehensive.test.ts +++ /dev/null @@ -1,486 +0,0 @@ -import { CreateDeckCommandHandler } from '../../../../src/Application/Deck/commands/CreateDeckCommandHandler'; -import { UpdateDeckCommandHandler } from '../../../../src/Application/Deck/commands/UpdateDeckCommandHandler'; -import { DeleteDeckCommandHandler } from '../../../../src/Application/Deck/commands/DeleteDeckCommandHandler'; -import { CreateDeckCommand } from '../../../../src/Application/Deck/commands/CreateDeckCommand'; -import { UpdateDeckCommand } from '../../../../src/Application/Deck/commands/UpdateDeckCommand'; -import { DeleteDeckCommand } from '../../../../src/Application/Deck/commands/DeleteDeckCommand'; -import { DeckAggregate, State as DeckState, Type as DeckType, CType } from '../../../../src/Domain/Deck/DeckAggregate'; -import { UserAggregate, UserState } from '../../../../src/Domain/User/UserAggregate'; -import { IUserRepository } from '../../../../src/Domain/IRepository/IUserRepository'; -import { IDeckRepository } from '../../../../src/Domain/IRepository/IDeckRepository'; -import { IOrganizationRepository } from '../../../../src/Domain/IRepository/IOrganizationRepository'; -import { - createMockUser, - createMockDeck, - createMockUserRepository, - createMockDeckRepository, - createMockOrganizationRepository, - createMockDate -} from '../../../testUtils'; - -describe('Deck Command Handlers - Comprehensive Coverage', () => { - let mockUserRepository: jest.Mocked; - let mockDeckRepository: jest.Mocked; - let mockOrganizationRepository: jest.Mocked; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - mockDeckRepository = createMockDeckRepository(); - mockOrganizationRepository = createMockOrganizationRepository(); - jest.clearAllMocks(); - }); - - describe('CreateDeckCommandHandler', () => { - let handler: CreateDeckCommandHandler; - - beforeEach(() => { - handler = new CreateDeckCommandHandler(mockDeckRepository, mockUserRepository, mockOrganizationRepository); - }); - - it('should create a new deck successfully', async () => { - // Arrange - const mockUser = createMockUser({ - id: 'user-123', - state: UserState.VERIFIED_REGULAR - }); - const expectedDeck = createMockDeck({ - id: 'deck-123', - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - ctype: CType.PUBLIC, - state: DeckState.ACTIVE, - cards: [] - }); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.create.mockResolvedValue(expectedDeck); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [] - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeTruthy(); - expect(mockUserRepository.findById).toHaveBeenCalledWith('user-123'); - expect(mockDeckRepository.create).toHaveBeenCalledWith( - expect.objectContaining({ - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123' - }) - ); - }); - - it('should throw error when user not found', async () => { - // Arrange - mockUserRepository.findById.mockResolvedValue(null); - - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'nonexistent-user', - cards: [] - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('User not found'); - expect(mockUserRepository.findById).toHaveBeenCalledWith('nonexistent-user'); - expect(mockDeckRepository.create).not.toHaveBeenCalled(); - }); - - it('should handle admin users bypassing restrictions', async () => { - // Arrange - const adminUser = createMockUser({ - id: 'admin-123', - type: 'admin', - state: UserState.ADMIN - }); - const expectedDeck = createMockDeck({ - name: 'Admin Deck', - userid: 'admin-123' - }); - - mockUserRepository.findById.mockResolvedValue(adminUser); - mockDeckRepository.create.mockResolvedValue(expectedDeck); - // Don't mock countActiveByUserId - admin should bypass this check - - const command: CreateDeckCommand = { - name: 'Admin Deck', - type: DeckType.JOKER, - userid: 'admin-123', - cards: [] - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeTruthy(); - expect(mockDeckRepository.countActiveByUserId).not.toHaveBeenCalled(); - }); - - it('should handle different deck types', async () => { - // Arrange - const mockUser = createMockUser({ id: 'user-123', state: UserState.VERIFIED_REGULAR }); - const expectedDeck = createMockDeck({ - name: 'Question Deck', - type: DeckType.QUESTION, - userid: 'user-123' - }); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.create.mockResolvedValue(expectedDeck); - mockDeckRepository.countActiveByUserId.mockResolvedValue(2); - - const command: CreateDeckCommand = { - name: 'Question Deck', - type: DeckType.QUESTION, - userid: 'user-123', - cards: [] - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeTruthy(); - expect(mockDeckRepository.create).toHaveBeenCalledWith( - expect.objectContaining({ - type: DeckType.QUESTION - }) - ); - }); - - it('should handle repository creation errors', async () => { - // Arrange - const mockUser = createMockUser({ id: 'user-123', state: UserState.VERIFIED_REGULAR }); - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockRejectedValue(new Error('Database connection failed')); - - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [] - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Database connection failed'); - expect(mockDeckRepository.create).toHaveBeenCalled(); - }); - - it('should handle deck limit restrictions for regular users', async () => { - // Arrange - const mockUser = createMockUser({ - id: 'user-123', - state: UserState.VERIFIED_REGULAR, - type: 'regular' - }); - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(10); // Assuming limit is 10 - - const command: CreateDeckCommand = { - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [] - }; - - // Act & Assert - This should succeed if the limit allows, or fail if over limit - // The exact behavior depends on the business rules in CreateDeckCommandHandler - try { - await handler.execute(command); - // If it succeeds, verify the deck was created - expect(mockDeckRepository.create).toHaveBeenCalled(); - } catch (error) { - // If it fails, verify it's a limit error - expect((error as Error).message).toContain('limit'); - } - }); - }); - - describe('UpdateDeckCommandHandler', () => { - let handler: UpdateDeckCommandHandler; - - beforeEach(() => { - handler = new UpdateDeckCommandHandler(mockDeckRepository); - }); - - it('should update deck successfully', async () => { - // Arrange - const updatedDeck = createMockDeck({ - id: 'deck-123', - name: 'New Name', - ctype: CType.PUBLIC - }); - - mockDeckRepository.update.mockResolvedValue(updatedDeck); - - const command: UpdateDeckCommand = { - id: 'deck-123', - name: 'New Name' - }; - - // Act - const result = await handler.execute(command); - - // Assert - Should return ShortDeckDto format - expect(result).toEqual({ - id: 'deck-123', - name: 'New Name', - type: updatedDeck.type, - playedNumber: updatedDeck.playedNumber, - ctype: updatedDeck.ctype, - }); - expect(mockDeckRepository.update).toHaveBeenCalledWith('deck-123', expect.objectContaining({ - id: 'deck-123', - name: 'New Name' - })); - }); - - it('should return null when deck not found (repository returns null)', async () => { - // Arrange - mockDeckRepository.update.mockResolvedValue(null); - - const command: UpdateDeckCommand = { - id: 'nonexistent-deck', - name: 'New Name' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeNull(); - expect(mockDeckRepository.update).toHaveBeenCalledWith('nonexistent-deck', expect.objectContaining({ - id: 'nonexistent-deck', - name: 'New Name' - })); - }); - - it('should handle partial updates', async () => { - // Arrange - const updatedDeck = createMockDeck({ - id: 'deck-123', - name: 'Original Name', // Name stays the same - ctype: CType.PRIVATE // Only ctype changes - }); - - mockDeckRepository.update.mockResolvedValue(updatedDeck); - - const command: UpdateDeckCommand = { - id: 'deck-123', - ctype: CType.PRIVATE - // Note: name is not provided, should remain unchanged - }; - - // Act - const result = await handler.execute(command); - - // Assert - Should return ShortDeckDto format - expect(result).toEqual({ - id: 'deck-123', - name: 'Original Name', - type: updatedDeck.type, - playedNumber: updatedDeck.playedNumber, - ctype: CType.PRIVATE, - }); - expect(mockDeckRepository.update).toHaveBeenCalledWith('deck-123', expect.objectContaining({ - id: 'deck-123', - ctype: CType.PRIVATE - })); - }); - - it('should handle repository update errors', async () => { - // Arrange - const existingDeck = createMockDeck({ id: 'deck-123' }); - mockDeckRepository.findById.mockResolvedValue(existingDeck); - mockDeckRepository.update.mockRejectedValue(new Error('Update failed')); - - const command: UpdateDeckCommand = { - id: 'deck-123', - name: 'New Name' - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Update failed'); - expect(mockDeckRepository.update).toHaveBeenCalled(); - }); - }); - - describe('DeleteDeckCommandHandler', () => { - let handler: DeleteDeckCommandHandler; - - beforeEach(() => { - handler = new DeleteDeckCommandHandler(mockDeckRepository); - }); - - it('should delete deck successfully (soft delete)', async () => { - // Arrange - mockDeckRepository.softDelete.mockResolvedValue(null); // Soft delete returns void - - const command: DeleteDeckCommand = { - id: 'deck-123', - soft: true // Specify soft delete - }; - - // Act - const result = await handler.execute(command); - - // Assert - DeleteDeckCommandHandler always returns true - expect(result).toBe(true); - expect(mockDeckRepository.softDelete).toHaveBeenCalledWith('deck-123'); - }); - - it('should delete deck successfully (hard delete)', async () => { - // Arrange - mockDeckRepository.delete.mockResolvedValue(null); // Delete returns void - - const command: DeleteDeckCommand = { - id: 'deck-123', - soft: false // Specify hard delete - }; - - // Act - const result = await handler.execute(command); - - // Assert - DeleteDeckCommandHandler always returns true - expect(result).toBe(true); - expect(mockDeckRepository.delete).toHaveBeenCalledWith('deck-123'); - }); - - it('should default to hard delete when soft flag not specified', async () => { - // Arrange - mockDeckRepository.delete.mockResolvedValue(null); - - const command: DeleteDeckCommand = { - id: 'deck-123' - // Note: soft flag not specified, defaults to undefined which is falsy - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockDeckRepository.delete).toHaveBeenCalledWith('deck-123'); - expect(mockDeckRepository.softDelete).not.toHaveBeenCalled(); - }); - - it('should handle repository deletion errors', async () => { - // Arrange - mockDeckRepository.softDelete.mockRejectedValue(new Error('Deletion failed')); - - const command: DeleteDeckCommand = { - id: 'deck-123', - soft: true - }; - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Deletion failed'); - expect(mockDeckRepository.softDelete).toHaveBeenCalledWith('deck-123'); - }); - }); - - describe('Cross-Command Integration Tests', () => { - let createHandler: CreateDeckCommandHandler; - let updateHandler: UpdateDeckCommandHandler; - let deleteHandler: DeleteDeckCommandHandler; - - beforeEach(() => { - createHandler = new CreateDeckCommandHandler(mockDeckRepository, mockUserRepository, mockOrganizationRepository); - updateHandler = new UpdateDeckCommandHandler(mockDeckRepository); - deleteHandler = new DeleteDeckCommandHandler(mockDeckRepository); - }); - - it('should create deck and then update it', async () => { - // Arrange - Create - const mockUser = createMockUser({ id: 'user-123', state: UserState.VERIFIED_REGULAR }); - const createdDeck = createMockDeck({ - id: 'deck-123', - name: 'Initial Name', - userid: 'user-123' - }); - - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockResolvedValue(createdDeck); - - // Arrange - Update - const updatedDeck = createMockDeck({ - id: 'deck-123', - name: 'Updated Name', - userid: 'user-123' - }); - mockDeckRepository.findById.mockResolvedValue(createdDeck); - mockDeckRepository.update.mockResolvedValue(updatedDeck); - - // Act - Create - const createCommand: CreateDeckCommand = { - name: 'Initial Name', - type: DeckType.JOKER, - userid: 'user-123', - cards: [] - }; - const createResult = await createHandler.execute(createCommand); - - // Act - Update - const updateCommand: UpdateDeckCommand = { - id: 'deck-123', - name: 'Updated Name' - }; - const updateResult = await updateHandler.execute(updateCommand); - - // Assert - expect(createResult).toBeTruthy(); - expect(updateResult?.name).toBe('Updated Name'); - expect(mockDeckRepository.create).toHaveBeenCalled(); - expect(mockDeckRepository.update).toHaveBeenCalled(); - }); - - it('should handle full lifecycle: create, update, delete', async () => { - // This tests the complete lifecycle of a deck - const mockUser = createMockUser({ id: 'user-123', state: UserState.VERIFIED_REGULAR }); - const deck = createMockDeck({ id: 'deck-123', userid: 'user-123' }); - - // Setup all mocks - mockUserRepository.findById.mockResolvedValue(mockUser); - mockDeckRepository.countActiveByUserId.mockResolvedValue(0); - mockDeckRepository.create.mockResolvedValue(deck); - mockDeckRepository.update.mockResolvedValue(deck); - mockDeckRepository.softDelete.mockResolvedValue(null); - - // Execute lifecycle - const createResult = await createHandler.execute({ - name: 'Test Deck', - type: DeckType.JOKER, - userid: 'user-123', - cards: [] - }); - - const updateResult = await updateHandler.execute({ - id: 'deck-123', - name: 'Updated Deck' - }); - - const deleteResult = await deleteHandler.execute({ - id: 'deck-123', - soft: true - }); - - // Assert all operations succeeded - expect(createResult).toBeTruthy(); - expect(updateResult).toBeTruthy(); - expect(deleteResult).toBe(true); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Organization/commands/OrganizationCommandHandlers.comprehensive.test.ts b/SerpentRace_Backend/tests/Application/Organization/commands/OrganizationCommandHandlers.comprehensive.test.ts deleted file mode 100644 index 80deda87..00000000 --- a/SerpentRace_Backend/tests/Application/Organization/commands/OrganizationCommandHandlers.comprehensive.test.ts +++ /dev/null @@ -1,333 +0,0 @@ -import { CreateOrganizationCommandHandler } from '../../../../src/Application/Organization/commands/CreateOrganizationCommandHandler'; -import { UpdateOrganizationCommandHandler } from '../../../../src/Application/Organization/commands/UpdateOrganizationCommandHandler'; -import { DeleteOrganizationCommandHandler } from '../../../../src/Application/Organization/commands/DeleteOrganizationCommandHandler'; -import { CreateOrganizationCommand } from '../../../../src/Application/Organization/commands/CreateOrganizationCommand'; -import { UpdateOrganizationCommand } from '../../../../src/Application/Organization/commands/UpdateOrganizationCommand'; -import { DeleteOrganizationCommand } from '../../../../src/Application/Organization/commands/DeleteOrganizationCommand'; -import { OrganizationState } from '../../../../src/Domain/Organization/OrganizationAggregate'; -import { createMockOrganizationRepository, createMockOrganization } from '../../../testUtils'; - -describe('Organization Command Handlers - Comprehensive', () => { - let mockOrganizationRepository: ReturnType; - - beforeEach(() => { - mockOrganizationRepository = createMockOrganizationRepository(); - }); - - describe('CreateOrganizationCommandHandler', () => { - let handler: CreateOrganizationCommandHandler; - - beforeEach(() => { - handler = new CreateOrganizationCommandHandler(mockOrganizationRepository); - }); - - it('should create organization successfully', async () => { - // Arrange - const mockOrgData = createMockOrganization({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Test Organization', - contactfname: 'John', - contactlname: 'Doe', - contactphone: '+1234567890', - contactemail: 'john@testorg.com', - url: null, - state: OrganizationState.REGISTERED - }); - - mockOrganizationRepository.create.mockResolvedValue(mockOrgData); - - const command: CreateOrganizationCommand = { - name: 'Test Organization', - contactfname: 'John', - contactlname: 'Doe', - contactemail: 'john@testorg.com', - contactphone: '+1234567890' - }; - - // Act - const result = await handler.execute(command); - - // Assert - Returns ShortOrganizationDto - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Test Organization', - state: 0, - userinorg: 0, - maxOrganizationalDecks: 10 - }); - expect(mockOrganizationRepository.create).toHaveBeenCalledWith( - expect.objectContaining({ - name: 'Test Organization', - contactfname: 'John', - contactlname: 'Doe', - contactemail: 'john@testorg.com', - contactphone: '+1234567890', - state: OrganizationState.REGISTERED - }) - ); - }); - - it('should create organization with optional URL', async () => { - // Arrange - const mockOrgData = createMockOrganization({ - id: '550e8400-e29b-41d4-a716-446655440001', - name: 'Org with URL', - contactfname: 'Jane', - contactlname: 'Smith', - contactphone: '+1987654321', - contactemail: 'jane@orgwithurl.com', - url: 'https://orgwithurl.com', - state: OrganizationState.REGISTERED - }); - - mockOrganizationRepository.create.mockResolvedValue(mockOrgData); - - const command: CreateOrganizationCommand = { - name: 'Org with URL', - contactfname: 'Jane', - contactlname: 'Smith', - contactemail: 'jane@orgwithurl.com', - contactphone: '+1987654321', - url: 'https://orgwithurl.com' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440001', - name: 'Org with URL', - state: 0, - userinorg: 0, - maxOrganizationalDecks: 10 - }); - }); - - it('should handle duplicate organization name error', async () => { - // Arrange - const command: CreateOrganizationCommand = { - name: 'Duplicate Org', - contactfname: 'John', - contactlname: 'Doe', - contactemail: 'john@duplicate.com', - contactphone: '+1234567890' - }; - - const duplicateError = new Error('duplicate key value violates unique constraint "organization_name_unique"'); - mockOrganizationRepository.create.mockRejectedValue(duplicateError); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Organization with this name or contact email already exists'); - }); - - it('should handle generic database errors', async () => { - // Arrange - const command: CreateOrganizationCommand = { - name: 'Error Org', - contactfname: 'John', - contactlname: 'Doe', - contactemail: 'john@error.com', - contactphone: '+1234567890' - }; - - mockOrganizationRepository.create.mockRejectedValue(new Error('Database connection failed')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to create organization'); - }); - - it('should handle non-Error exceptions', async () => { - // Arrange - const command: CreateOrganizationCommand = { - name: 'Non-Error Exception Org', - contactfname: 'John', - contactlname: 'Doe', - contactemail: 'john@exception.com', - contactphone: '+1234567890' - }; - - mockOrganizationRepository.create.mockRejectedValue('String error'); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to create organization'); - }); - }); - - describe('UpdateOrganizationCommandHandler', () => { - let handler: UpdateOrganizationCommandHandler; - - beforeEach(() => { - handler = new UpdateOrganizationCommandHandler(mockOrganizationRepository); - }); - - it('should update organization successfully', async () => { - // Arrange - const updatedOrgData = createMockOrganization({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Updated Organization', - contactemail: 'john@updated.com', - url: 'https://updated.com', - state: OrganizationState.ACTIVE - }); - - mockOrganizationRepository.update.mockResolvedValue(updatedOrgData); - - const command: UpdateOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Updated Organization', - contactemail: 'john@updated.com', - url: 'https://updated.com' - }; - - // Act - const result = await handler.execute(command); - - // Assert - Returns ShortOrganizationDto - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Updated Organization', - state: 1, - userinorg: 0, - maxOrganizationalDecks: 10 - }); - expect(mockOrganizationRepository.update).toHaveBeenCalledWith( - '550e8400-e29b-41d4-a716-446655440000', - command - ); - }); - - it('should return null when organization not found', async () => { - // Arrange - mockOrganizationRepository.update.mockResolvedValue(null); - - const command: UpdateOrganizationCommand = { - id: 'non-existent-id', - name: 'Non-existent Organization' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeNull(); - expect(mockOrganizationRepository.update).toHaveBeenCalledWith('non-existent-id', command); - }); - - it('should update organization with partial data', async () => { - // Arrange - const partialUpdatedOrgData = createMockOrganization({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Original Name', - contactemail: 'john@newmail.com', - state: OrganizationState.ACTIVE - }); - - mockOrganizationRepository.update.mockResolvedValue(partialUpdatedOrgData); - - const command: UpdateOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - contactemail: 'john@newmail.com' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toEqual({ - id: '550e8400-e29b-41d4-a716-446655440000', - name: 'Original Name', - state: 1, - userinorg: 0, - maxOrganizationalDecks: 10 - }); - }); - }); - - describe('DeleteOrganizationCommandHandler', () => { - let handler: DeleteOrganizationCommandHandler; - - beforeEach(() => { - handler = new DeleteOrganizationCommandHandler(mockOrganizationRepository); - }); - - it('should perform soft delete successfully', async () => { - // Arrange - mockOrganizationRepository.softDelete.mockResolvedValue(null); - - const command: DeleteOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - soft: true - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockOrganizationRepository.softDelete).toHaveBeenCalledWith('550e8400-e29b-41d4-a716-446655440000'); - expect(mockOrganizationRepository.delete).not.toHaveBeenCalled(); - }); - - it('should perform hard delete successfully', async () => { - // Arrange - mockOrganizationRepository.delete.mockResolvedValue(true); - - const command: DeleteOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - soft: false - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockOrganizationRepository.delete).toHaveBeenCalledWith('550e8400-e29b-41d4-a716-446655440000'); - expect(mockOrganizationRepository.softDelete).not.toHaveBeenCalled(); - }); - - it('should default to hard delete when soft flag not specified', async () => { - // Arrange - mockOrganizationRepository.delete.mockResolvedValue(true); - - const command: DeleteOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000' - }; - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockOrganizationRepository.delete).toHaveBeenCalledWith('550e8400-e29b-41d4-a716-446655440000'); - expect(mockOrganizationRepository.softDelete).not.toHaveBeenCalled(); - }); - - it('should handle soft delete with repository error gracefully', async () => { - // Arrange - mockOrganizationRepository.softDelete.mockRejectedValue(new Error('Database error')); - - const command: DeleteOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - soft: true - }; - - // Act & Assert - Handler doesn't catch errors, they bubble up - await expect(handler.execute(command)).rejects.toThrow('Database error'); - }); - - it('should handle hard delete with repository error gracefully', async () => { - // Arrange - mockOrganizationRepository.delete.mockRejectedValue(new Error('Database error')); - - const command: DeleteOrganizationCommand = { - id: '550e8400-e29b-41d4-a716-446655440000', - soft: false - }; - - // Act & Assert - Handler doesn't catch errors, they bubble up - await expect(handler.execute(command)).rejects.toThrow('Database error'); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/AuthMiddleware.test.ts b/SerpentRace_Backend/tests/Application/Services/AuthMiddleware.test.ts deleted file mode 100644 index ddac0cac..00000000 --- a/SerpentRace_Backend/tests/Application/Services/AuthMiddleware.test.ts +++ /dev/null @@ -1,188 +0,0 @@ -import { Request, Response, NextFunction } from 'express'; - -// Mock JWTService before importing anything else -const mockJWTService = { - verify: jest.fn(), - refreshIfNeeded: jest.fn(), - create: jest.fn(), - shouldRefreshToken: jest.fn(), - test: jest.fn(), -}; - -jest.mock('../../../src/Application/Services/JWTService', () => { - return { - JWTService: jest.fn().mockImplementation(() => mockJWTService) - }; -}); - -// Now import the middleware which will use the mocked JWTService -import { authRequired, adminRequired } from '../../../src/Application/Services/AuthMiddleware'; - -describe('AuthMiddleware', () => { - let mockRequest: Partial; - let mockResponse: Partial; - let mockNext: NextFunction; - - beforeEach(() => { - jest.clearAllMocks(); - - mockRequest = { - cookies: {} - }; - - mockResponse = { - status: jest.fn().mockReturnThis(), - json: jest.fn().mockReturnThis(), - cookie: jest.fn() - }; - - mockNext = jest.fn(); - }); - - describe('authRequired', () => { - it('should call next() when token is valid', () => { - // Arrange - const validPayload = { - userId: 'user-123', - authLevel: 0 as 0 | 1, - orgId: 'org-123' - }; - - mockJWTService.verify.mockReturnValue(validPayload); - mockJWTService.refreshIfNeeded.mockReturnValue(false); // Token doesn't need refresh - - // Act - authRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).toHaveBeenCalledWith(validPayload, mockResponse); - expect((mockRequest as any).user).toBe(validPayload); - expect(mockNext).toHaveBeenCalled(); - expect(mockResponse.status).not.toHaveBeenCalled(); - expect(mockResponse.json).not.toHaveBeenCalled(); - }); - - it('should return 401 when token is invalid', () => { - // Arrange - mockJWTService.verify.mockReturnValue(null); - - // Act - authRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).not.toHaveBeenCalled(); - expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(401); - expect(mockResponse.json).toHaveBeenCalledWith({ error: 'Unauthorized' }); - }); - - it('should refresh token when needed', () => { - // Arrange - const validPayload = { - userId: 'user-123', - authLevel: 0 as 0 | 1, - orgId: 'org-123' - }; - - mockJWTService.verify.mockReturnValue(validPayload); - mockJWTService.refreshIfNeeded.mockReturnValue(true); // Token needs refresh - - // Act - authRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).toHaveBeenCalledWith(validPayload, mockResponse); - expect((mockRequest as any).user).toBe(validPayload); - expect(mockNext).toHaveBeenCalled(); - expect(mockResponse.status).not.toHaveBeenCalled(); - expect(mockResponse.json).not.toHaveBeenCalled(); - }); - }); - - describe('adminRequired', () => { - it('should call next() when token is valid and user is admin', () => { - // Arrange - const adminPayload = { - userId: 'admin-123', - authLevel: 1 as 0 | 1, - orgId: 'org-123' - }; - - mockJWTService.verify.mockReturnValue(adminPayload); - mockJWTService.refreshIfNeeded.mockReturnValue(false); - - // Act - adminRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).toHaveBeenCalledWith(adminPayload, mockResponse); - expect((mockRequest as any).user).toBe(adminPayload); - expect(mockNext).toHaveBeenCalled(); - expect(mockResponse.status).not.toHaveBeenCalled(); - expect(mockResponse.json).not.toHaveBeenCalled(); - }); - - it('should return 403 when token is invalid', () => { - // Arrange - mockJWTService.verify.mockReturnValue(null); - - // Act - adminRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).not.toHaveBeenCalled(); - expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(403); - expect(mockResponse.json).toHaveBeenCalledWith({ error: 'Forbidden' }); - }); - - it('should return 403 when user is not admin', () => { - // Arrange - const regularUserPayload = { - userId: 'user-123', - authLevel: 0 as 0 | 1, - orgId: 'org-123' - }; - - mockJWTService.verify.mockReturnValue(regularUserPayload); - - // Act - adminRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).not.toHaveBeenCalled(); - expect(mockNext).not.toHaveBeenCalled(); - expect(mockResponse.status).toHaveBeenCalledWith(403); - expect(mockResponse.json).toHaveBeenCalledWith({ error: 'Forbidden' }); - }); - - it('should refresh token for valid admin user', () => { - // Arrange - const adminPayload = { - userId: 'admin-123', - authLevel: 1 as 0 | 1, - orgId: 'org-123' - }; - - mockJWTService.verify.mockReturnValue(adminPayload); - mockJWTService.refreshIfNeeded.mockReturnValue(true); - - // Act - adminRequired(mockRequest as Request, mockResponse as Response, mockNext); - - // Assert - expect(mockJWTService.verify).toHaveBeenCalledWith(mockRequest); - expect(mockJWTService.refreshIfNeeded).toHaveBeenCalledWith(adminPayload, mockResponse); - expect((mockRequest as any).user).toBe(adminPayload); - expect(mockNext).toHaveBeenCalled(); - expect(mockResponse.status).not.toHaveBeenCalled(); - expect(mockResponse.json).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/ChatConfiguration.test.ts b/SerpentRace_Backend/tests/Application/Services/ChatConfiguration.test.ts deleted file mode 100644 index acde9202..00000000 --- a/SerpentRace_Backend/tests/Application/Services/ChatConfiguration.test.ts +++ /dev/null @@ -1,159 +0,0 @@ -import { WebSocketService } from '../../../src/Application/Services/WebSocketService'; -import { Server as HttpServer } from 'http'; -import { EventEmitter } from 'events'; - -describe('Chat Configuration', () => { - let mockHttpServer: HttpServer; - - beforeAll(() => { - // Create a more complete HTTP server mock that extends EventEmitter - const httpServerMock = new EventEmitter(); - - // Add necessary methods that Socket.IO expects - Object.assign(httpServerMock, { - on: jest.fn(), - listen: jest.fn(), - close: jest.fn(), - listeners: jest.fn().mockReturnValue([]), - removeListener: jest.fn(), - removeAllListeners: jest.fn(), - setMaxListeners: jest.fn(), - getMaxListeners: jest.fn().mockReturnValue(0), - listenerCount: jest.fn().mockReturnValue(0), - prependListener: jest.fn(), - prependOnceListener: jest.fn(), - off: jest.fn(), - once: jest.fn(), - emit: jest.fn(), - // HTTP server specific - timeout: 0, - keepAliveTimeout: 5000, - maxHeadersCount: null, - headersTimeout: 60000, - requestTimeout: 0 - }); - - mockHttpServer = httpServerMock as unknown as HttpServer; - }); - - afterEach(() => { - // Clean up environment variables - delete process.env.CHAT_MAX_MESSAGES_PER_USER; - delete process.env.CHAT_MESSAGE_CLEANUP_WEEKS; - delete process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES; - }); - - describe('Environment Variable Configuration', () => { - it('should use default chat configuration values', () => { - const service = new WebSocketService(mockHttpServer); - - expect(service['maxMessagesPerUser']).toBe(100); - expect(service['messageCleanupWeeks']).toBe(4); - expect(service['chatTimeout']).toBe(30); - }); - - it('should use environment variable for CHAT_MAX_MESSAGES_PER_USER', () => { - process.env.CHAT_MAX_MESSAGES_PER_USER = '50'; - - const service = new WebSocketService(mockHttpServer); - - expect(service['maxMessagesPerUser']).toBe(50); - }); - - it('should use environment variable for CHAT_MESSAGE_CLEANUP_WEEKS', () => { - // Arrange - process.env.CHAT_MESSAGE_CLEANUP_WEEKS = '8'; - - // Act - const service = new WebSocketService(mockHttpServer); - - // Assert - expect(service['messageCleanupWeeks']).toBe(8); - }); - - it('should use environment variable for CHAT_INACTIVITY_TIMEOUT_MINUTES', () => { - // Arrange - process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES = '60'; - - // Act - const service = new WebSocketService(mockHttpServer); - - // Assert - expect(service['chatTimeout']).toBe(60); - }); - - it('should handle invalid numeric environment variables gracefully', () => { - // Arrange - process.env.CHAT_MAX_MESSAGES_PER_USER = 'invalid'; - process.env.CHAT_MESSAGE_CLEANUP_WEEKS = 'also-invalid'; - process.env.CHAT_INACTIVITY_TIMEOUT_MINUTES = 'not-a-number'; - - // Act - const service = new WebSocketService(mockHttpServer); - - // Assert - parseInt of invalid strings returns NaN - expect(service['maxMessagesPerUser']).toBe(NaN); - expect(service['messageCleanupWeeks']).toBe(NaN); - expect(service['chatTimeout']).toBe(NaN); - }); - }); - - describe('Rate Limiting Logic', () => { - it('should initialize with empty user message counts', () => { - // Act - const service = new WebSocketService(mockHttpServer); - - // Assert - expect(service['userMessageCounts']).toBeDefined(); - expect(service['userMessageCounts'].size).toBe(0); - }); - - it('should allow messages within rate limit', () => { - // Arrange - process.env.CHAT_MAX_MESSAGES_PER_USER = '5'; - const service = new WebSocketService(mockHttpServer); - const userId = 'test-user'; - - // Act & Assert - should allow first 5 messages - for (let i = 0; i < 5; i++) { - expect(service['checkMessageRateLimit'](userId)).toBe(true); - } - }); - - it('should block messages when rate limit exceeded', () => { - // Arrange - process.env.CHAT_MAX_MESSAGES_PER_USER = '3'; - const service = new WebSocketService(mockHttpServer); - const userId = 'test-user'; - - // Act - send 3 messages (should be allowed) - for (let i = 0; i < 3; i++) { - expect(service['checkMessageRateLimit'](userId)).toBe(true); - } - - // Assert - 4th message should be blocked - expect(service['checkMessageRateLimit'](userId)).toBe(false); - }); - - it('should reset rate limit after time window', (done) => { - // Arrange - process.env.CHAT_MAX_MESSAGES_PER_USER = '2'; - const service = new WebSocketService(mockHttpServer); - const userId = 'test-user'; - - // Act - exhaust rate limit - expect(service['checkMessageRateLimit'](userId)).toBe(true); - expect(service['checkMessageRateLimit'](userId)).toBe(true); - expect(service['checkMessageRateLimit'](userId)).toBe(false); // Should be blocked - - // Mock time passage by manipulating the internal state - const userStats = service['userMessageCounts'].get(userId)!; - userStats.lastReset = Date.now() - (60 * 1000 + 1); // More than 1 minute ago - service['userMessageCounts'].set(userId, userStats); - - // Assert - should be allowed again after reset - expect(service['checkMessageRateLimit'](userId)).toBe(true); - done(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/DIContainer.test.ts b/SerpentRace_Backend/tests/Application/Services/DIContainer.test.ts deleted file mode 100644 index 0b174b32..00000000 --- a/SerpentRace_Backend/tests/Application/Services/DIContainer.test.ts +++ /dev/null @@ -1,109 +0,0 @@ -import { container } from '../../../src/Application/Services/DIContainer'; -import { IUserRepository } from '../../../src/Domain/IRepository/IUserRepository'; -import { IChatRepository } from '../../../src/Domain/IRepository/IChatRepository'; -import { LoggingService } from '../../../src/Application/Services/LoggingService'; - -describe('DIContainer', () => { - // Cleanup after all tests to prevent Jest hanging - afterAll(async () => { - await LoggingService.getInstance().shutdown(); - }); - - describe('Repositories', () => { - it('should return singleton IUserRepository instance', () => { - const repo1 = container.userRepository; - const repo2 = container.userRepository; - - expect(repo1).toBeTruthy(); - expect(repo1).toBe(repo2); // Same instance (singleton) - expect(typeof repo1.findById).toBe('function'); // Has interface methods - }); - - it('should return singleton IChatRepository instance', () => { - const repo1 = container.chatRepository; - const repo2 = container.chatRepository; - - expect(repo1).toBeTruthy(); - expect(repo1).toBe(repo2); // Same instance (singleton) - expect(typeof repo1.findById).toBe('function'); // Has interface methods - }); - }); - - describe('Command Handlers', () => { - it('should return singleton CreateUserCommandHandler instance', () => { - const handler1 = container.createUserCommandHandler; - const handler2 = container.createUserCommandHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - - it('should return singleton LoginCommandHandler instance', () => { - const handler1 = container.loginCommandHandler; - const handler2 = container.loginCommandHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - - it('should return singleton DeactivateUserCommandHandler instance', () => { - const handler1 = container.deactivateUserCommandHandler; - const handler2 = container.deactivateUserCommandHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - - it('should return singleton DeleteUserCommandHandler instance', () => { - const handler1 = container.deleteUserCommandHandler; - const handler2 = container.deleteUserCommandHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - - it('should return singleton DeleteDeckCommandHandler instance', () => { - const handler1 = container.deleteDeckCommandHandler; - const handler2 = container.deleteDeckCommandHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - - it('should return singleton DeleteOrganizationCommandHandler instance', () => { - const handler1 = container.deleteOrganizationCommandHandler; - const handler2 = container.deleteOrganizationCommandHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - }); - - describe('Query Handlers', () => { - it('should return singleton GetUserByIdQueryHandler instance', () => { - const handler1 = container.getUserByIdQueryHandler; - const handler2 = container.getUserByIdQueryHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - - it('should return singleton GetUsersByPageQueryHandler instance', () => { - const handler1 = container.getUsersByPageQueryHandler; - const handler2 = container.getUsersByPageQueryHandler; - - expect(handler1).toBeTruthy(); - expect(handler1).toBe(handler2); // Same instance (singleton) - }); - }); - - describe('Services', () => { - it('should return singleton JWTService instance', () => { - const service1 = container.jwtService; - const service2 = container.jwtService; - - expect(service1).toBeTruthy(); - expect(service1).toBe(service2); // Same instance (singleton) - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/EmailService.test.ts b/SerpentRace_Backend/tests/Application/Services/EmailService.test.ts deleted file mode 100644 index 28b0090e..00000000 --- a/SerpentRace_Backend/tests/Application/Services/EmailService.test.ts +++ /dev/null @@ -1,224 +0,0 @@ -import { EmailService, EmailOptions } from '../../../src/Application/Services/EmailService'; -import * as nodemailer from 'nodemailer'; -import * as fs from 'fs'; - -// Mock nodemailer -jest.mock('nodemailer'); -jest.mock('fs'); - -// Mock logger -jest.mock('../../../src/Application/Services/Logger', () => ({ - logError: jest.fn(), - logAuth: jest.fn(), - logStartup: jest.fn(), -})); - -describe('EmailService', () => { - let emailService: EmailService; - let mockTransporter: jest.Mocked; - let mockCreateTransporter: jest.MockedFunction; - - beforeEach(() => { - jest.clearAllMocks(); - - // Mock nodemailer.createTransporter - mockTransporter = { - sendMail: jest.fn(), - } as any; - - mockCreateTransporter = nodemailer.createTransport as jest.MockedFunction; - mockCreateTransporter.mockReturnValue(mockTransporter); - - // Mock fs - (fs.readFileSync as jest.Mock).mockImplementation((filePath: string) => { - if (filePath.includes('html')) { - return 'HTML template: {{name}}'; - } - return 'Text template: {{name}}'; - }); - - (fs.existsSync as jest.Mock).mockReturnValue(true); - - emailService = new EmailService(); - }); - - describe('sendEmail', () => { - it('should send email successfully', async () => { - // Arrange - const emailOptions: EmailOptions = { - to: 'test@example.com', - subject: 'Test Subject', - html: '

Test HTML

', - text: 'Test Text', - }; - - mockTransporter.sendMail.mockResolvedValue({ messageId: 'test-id' }); - - // Act - const result = await emailService.sendEmail(emailOptions); - - // Assert - expect(result).toBe(true); - expect(mockTransporter.sendMail).toHaveBeenCalledWith({ - from: process.env.EMAIL_FROM || 'noreply@serpentrace.com', - to: emailOptions.to, - subject: emailOptions.subject, - html: emailOptions.html, - text: emailOptions.text, - }); - }); - - it('should send email with template', async () => { - // Arrange - const emailOptions: EmailOptions = { - to: 'test@example.com', - subject: 'Test Subject', - template: 'verification', - templateData: { name: 'John', token: 'abc123' }, - }; - - mockTransporter.sendMail.mockResolvedValue({ messageId: 'test-id' }); - - // Act - const result = await emailService.sendEmail(emailOptions); - - // Assert - expect(result).toBe(true); - expect(mockTransporter.sendMail).toHaveBeenCalledWith({ - from: process.env.EMAIL_FROM || 'noreply@serpentrace.com', - to: emailOptions.to, - subject: emailOptions.subject, - html: expect.stringContaining('John'), - text: expect.stringContaining('John'), - }); - }); - - it('should handle email send failure', async () => { - // Arrange - const emailOptions: EmailOptions = { - to: 'test@example.com', - subject: 'Test Subject', - text: 'Test Text', - }; - - mockTransporter.sendMail.mockRejectedValue(new Error('SMTP Error')); - - // Act - const result = await emailService.sendEmail(emailOptions); - - // Assert - expect(result).toBe(false); - }); - - it('should handle missing template files', async () => { - // Arrange - const emailOptions: EmailOptions = { - to: 'test@example.com', - subject: 'Test Subject', - template: 'nonexistent', - templateData: { name: 'John' }, - }; - - (fs.existsSync as jest.Mock).mockReturnValue(false); - - // Act - const result = await emailService.sendEmail(emailOptions); - - // Assert - expect(result).toBe(false); - }); - - it('should handle template processing errors', async () => { - // Arrange - const emailOptions: EmailOptions = { - to: 'test@example.com', - subject: 'Test Subject', - template: 'verification', - templateData: { name: 'John' }, - }; - - (fs.readFileSync as jest.Mock).mockImplementation(() => { - throw new Error('File read error'); - }); - - // Act - const result = await emailService.sendEmail(emailOptions); - - // Assert - expect(result).toBe(false); - }); - - it('should use fallback content when template data is missing', async () => { - // Arrange - const emailOptions: EmailOptions = { - to: 'test@example.com', - subject: 'Test Subject', - template: 'verification', - }; - - mockTransporter.sendMail.mockResolvedValue({ messageId: 'test-id' }); - - // Act - const result = await emailService.sendEmail(emailOptions); - - // Assert - expect(result).toBe(true); - }); - }); - - describe('constructor', () => { - it('should initialize with environment variables', () => { - // Arrange - const originalEnv = process.env; - process.env = { - ...originalEnv, - EMAIL_HOST: 'test-smtp.com', - EMAIL_PORT: '465', - EMAIL_SECURE: 'true', - EMAIL_USER: 'test@example.com', - EMAIL_PASS: 'testpass', - EMAIL_FROM: 'sender@example.com', - }; - - // Act - const service = new EmailService(); - - // Assert - expect(mockCreateTransporter).toHaveBeenCalledWith({ - host: 'test-smtp.com', - port: 465, - secure: true, - auth: { - user: 'test@example.com', - pass: 'testpass', - }, - }); - - // Restore environment - process.env = originalEnv; - }); - - it('should use default values when environment variables are missing', () => { - // Arrange - const originalEnv = process.env; - process.env = {}; - - // Act - const service = new EmailService(); - - // Assert - expect(mockCreateTransporter).toHaveBeenCalledWith({ - host: 'smtp.gmail.com', - port: 587, - secure: false, - auth: { - user: '', - pass: '', - }, - }); - - // Restore environment - process.env = originalEnv; - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/JWTService.refresh.test.ts b/SerpentRace_Backend/tests/Application/Services/JWTService.refresh.test.ts deleted file mode 100644 index b679f25c..00000000 --- a/SerpentRace_Backend/tests/Application/Services/JWTService.refresh.test.ts +++ /dev/null @@ -1,139 +0,0 @@ -import { JWTService, TokenPayload } from '../../../src/Application/Services/JWTService'; -import { Request, Response } from 'express'; -import { UserState } from '../../../src/Domain/User/UserAggregate'; - -describe('JWTService - Token Refresh Logic', () => { - let jwtService: JWTService; - let mockRequest: Partial; - let mockResponse: Partial; - let dateNowSpy: jest.SpyInstance; - - beforeEach(() => { - jwtService = new JWTService(); - - mockRequest = { - cookies: {} - }; - - mockResponse = { - cookie: jest.fn() - }; - - // Create a fresh spy for Date.now in each test - dateNowSpy = jest.spyOn(Date, 'now'); - }); - - afterEach(() => { - // Always restore Date.now after each test - dateNowSpy.mockRestore(); - }); - - describe('shouldRefreshToken', () => { - it('should return true when token is 75% through its lifetime', () => { - // Token issued at time 100, expires at 900 (lifetime: 800) - // 75% of 800 = 600, so at time 700 (100 + 600), it should refresh - const payload: TokenPayload = { - userId: 'test-user', - authLevel: 0 as 0 | 1, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'test-org', - iat: 100, - exp: 900 - }; - - // Mock current time as 700 (which is 75% through the token lifetime) - dateNowSpy.mockReturnValue(700 * 1000); - - const result = jwtService.shouldRefreshToken(payload); - expect(result).toBe(true); - }); - - it('should return true when token is more than 75% through its lifetime', () => { - const payload: TokenPayload = { - userId: 'test-user', - authLevel: 0 as 0 | 1, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'test-org', - iat: 100, - exp: 900 - }; - - // Mock current time as 750 (which is 81.25% through the token lifetime) - dateNowSpy.mockReturnValue(750 * 1000); - - const result = jwtService.shouldRefreshToken(payload); - expect(result).toBe(true); - }); - - it('should return false when token is less than 75% through its lifetime', () => { - const payload: TokenPayload = { - userId: 'test-user', - authLevel: 0 as 0 | 1, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'test-org', - iat: 100, - exp: 900 - }; - - // Mock current time as 600 (which is 62.5% through the token lifetime) - dateNowSpy.mockReturnValue(600 * 1000); - - const result = jwtService.shouldRefreshToken(payload); - expect(result).toBe(false); - }); - - it('should return false when payload does not have required timestamp fields', () => { - const payload: TokenPayload = { - userId: 'test-user', - authLevel: 0 as 0 | 1, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'test-org' - }; - - const result = jwtService.shouldRefreshToken(payload); - expect(result).toBe(false); - }); - }); - - describe('refreshIfNeeded', () => { - it('should return new token when refresh is needed', () => { - // Setup a payload that needs refresh (75% through lifetime) - const payload: TokenPayload = { - userId: 'test-user', - authLevel: 0 as 0 | 1, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'test-org', - iat: 100, - exp: 900 - }; - - // Mock current time as 700 (75% through the token lifetime) - dateNowSpy.mockReturnValue(700 * 1000); - - const result = jwtService.refreshIfNeeded(payload, mockResponse as Response); - - expect(result).toBe(true); - expect(mockResponse.cookie).toHaveBeenCalled(); - }); - - it('should return false when refresh is not needed', () => { - // Setup a payload that doesn't need refresh (less than 75% through lifetime) - const payload: TokenPayload = { - userId: 'test-user', - authLevel: 0 as 0 | 1, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'test-org', - iat: 100, - exp: 900 - }; - - // Mock current time as 600 (62.5% through the token lifetime) - dateNowSpy.mockReturnValue(600 * 1000); - - const result = jwtService.refreshIfNeeded(payload, mockResponse as Response); - - expect(result).toBe(false); - expect(mockResponse.cookie).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/JWTService.test.ts b/SerpentRace_Backend/tests/Application/Services/JWTService.test.ts deleted file mode 100644 index 0a003163..00000000 --- a/SerpentRace_Backend/tests/Application/Services/JWTService.test.ts +++ /dev/null @@ -1,403 +0,0 @@ -import { JWTService, TokenPayload } from '../../../src/Application/Services/JWTService'; -import { Request, Response } from 'express'; -import { UserState } from '../../../src/Domain/User/UserAggregate'; - - -describe('JWTService', () => { - let jwtService: JWTService; - let mockRequest: Partial; - let mockResponse: Partial; - - beforeEach(() => { - jest.clearAllMocks(); - jwtService = new JWTService(); - - // Set a test secret for consistent testing - process.env.JWT_SECRET = 'test-secret-key-for-testing'; - process.env.JWT_EXPIRY = '3600'; // 1 hour - - // Mock express Request and Response - mockRequest = { - cookies: {} - }; - - mockResponse = { - cookie: jest.fn() - }; - }); - - afterEach(() => { - // Clean up environment - delete process.env.JWT_SECRET; - delete process.env.JWT_EXPIRY; - }); - - describe('create', () => { - it('should create a valid JWT token and set cookie', () => { - // Arrange - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - // Act - const token = jwtService.create(payload, mockResponse as Response); - - // Assert - expect(token).toBeDefined(); - expect(typeof token).toBe('string'); - expect(token.split('.')).toHaveLength(3); // JWT has 3 parts - expect(mockResponse.cookie).toHaveBeenCalledWith( - 'auth_token', - token, - expect.objectContaining({ - httpOnly: true, - sameSite: 'strict', - maxAge: 86400000 // 24 hours in milliseconds - }) - ); - }); - - it('should create different tokens for different payloads', () => { - // Arrange - const payload1: TokenPayload = { - userId: 'user-1', - authLevel: 0 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-1' - }; - - const payload2: TokenPayload = { - userId: 'user-2', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_PREMIUM, - orgId: 'org-2' - }; - - // Act - const token1 = jwtService.create(payload1, mockResponse as Response); - const token2 = jwtService.create(payload2, mockResponse as Response); - - // Assert - expect(token1).toBeDefined(); - expect(token2).toBeDefined(); - expect(token1).not.toBe(token2); - }); - - it('should set secure cookie in production environment', () => { - // Arrange - process.env.NODE_ENV = 'production'; - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - // Act - const token = jwtService.create(payload, mockResponse as Response); - - // Assert - expect(mockResponse.cookie).toHaveBeenCalledWith( - 'auth_token', - token, - expect.objectContaining({ - secure: true - }) - ); - - // Clean up - delete process.env.NODE_ENV; - }); - }); - - describe('verify', () => { - it('should verify a valid token from cookies', () => { - // Arrange - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - const token = jwtService.create(payload, mockResponse as Response); - mockRequest.cookies = { auth_token: token }; - - // Act - const result = jwtService.verify(mockRequest as Request); - - // Assert - expect(result).toBeDefined(); - expect(result!.userId).toBe('user-123'); - expect(result!.authLevel).toBe(1); - expect(result!.orgId).toBe('org-456'); - }); - - it('should return null when no token is present in cookies', () => { - // Arrange - mockRequest.cookies = {}; - - // Act - const result = jwtService.verify(mockRequest as Request); - - // Assert - expect(result).toBeNull(); - }); - - it('should return null for invalid token', () => { - // Arrange - mockRequest.cookies = { auth_token: 'invalid.jwt.token' }; - - // Act - const result = jwtService.verify(mockRequest as Request); - - // Assert - expect(result).toBeNull(); - }); - - it('should return null for malformed token', () => { - // Arrange - mockRequest.cookies = { auth_token: 'not-a-jwt-token' }; - - // Act - const result = jwtService.verify(mockRequest as Request); - - // Assert - expect(result).toBeNull(); - }); - }); - - describe('token creation with different payloads', () => { - it('should create tokens with dynamic user data', () => { - // Arrange - const timestamp = Date.now(); - const testPayload: TokenPayload = { - userId: `test-user-${timestamp}`, - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: `test-org-${timestamp}` - }; - - // Act - const token = jwtService.create(testPayload, mockResponse as Response); - - // Assert - expect(token).toBeDefined(); - expect(typeof token).toBe('string'); - expect(mockResponse.cookie).toHaveBeenCalled(); - - // Verify we can decode it back - mockRequest.cookies = { auth_token: token }; - const verifiedPayload = jwtService.verify(mockRequest as Request); - - expect(verifiedPayload).toBeDefined(); - expect(verifiedPayload!.userId).toBe(testPayload.userId); - expect(verifiedPayload!.orgId).toBe(testPayload.orgId); - expect(verifiedPayload!.authLevel).toBe(testPayload.authLevel); - }); - - it('should create different tokens for different timestamps', async () => { - // Arrange - const timestamp1 = Date.now(); - const payload1: TokenPayload = { - userId: `test-user-${timestamp1}`, - authLevel: 0 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: `test-org-${timestamp1}` - }; - - // Add a small delay to ensure different timestamps - await new Promise(resolve => setTimeout(resolve, 1)); - - const timestamp2 = Date.now(); - const payload2: TokenPayload = { - userId: `test-user-${timestamp2}`, - authLevel: 1 as const, - userStatus: UserState.VERIFIED_PREMIUM, - orgId: `test-org-${timestamp2}` - }; - - // Act - const token1 = jwtService.create(payload1, mockResponse as Response); - const token2 = jwtService.create(payload2, mockResponse as Response); - - // Assert - expect(token1).not.toBe(token2); - expect(payload1.userId).not.toBe(payload2.userId); - expect(payload1.orgId).not.toBe(payload2.orgId); - }); - }); - - describe('integration scenarios', () => { - it('should create and verify token in complete flow', () => { - // Arrange - const originalPayload: TokenPayload = { - userId: 'integration-user', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'integration-org' - }; - - // Act - Complete flow - const token = jwtService.create(originalPayload, mockResponse as Response); - mockRequest.cookies = { auth_token: token }; - const verifiedPayload = jwtService.verify(mockRequest as Request); - - // Assert - expect(token).toBeDefined(); - expect(verifiedPayload).toBeDefined(); - expect(verifiedPayload!.userId).toBe('integration-user'); - expect(verifiedPayload!.authLevel).toBe(1); - expect(verifiedPayload!.orgId).toBe('integration-org'); - }); - }); - - describe('JWT_EXPIRATION duration parsing', () => { - it('should parse JWT_EXPIRATION in hours format', () => { - // Arrange - delete process.env.JWT_EXPIRY; - process.env.JWT_EXPIRATION = '2h'; - - // Act - const newJwtService = new JWTService(); - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - const token = newJwtService.create(payload, mockResponse as Response); - - // Update mock request with the created token - mockRequest.cookies = { auth_token: token }; - const verifiedPayload = newJwtService.verify(mockRequest as Request); - - // Assert - expect(token).toBeDefined(); - expect(verifiedPayload).toBeDefined(); - expect(verifiedPayload!.exp).toBeDefined(); - - // Token should expire in approximately 2 hours (7200 seconds) - const expectedExp = Math.floor(Date.now() / 1000) + 7200; - expect(verifiedPayload!.exp).toBeCloseTo(expectedExp, -1); // Within 10 seconds - - // Cleanup - delete process.env.JWT_EXPIRATION; - }); - - it('should parse JWT_EXPIRATION in days format', () => { - // Arrange - delete process.env.JWT_EXPIRY; - process.env.JWT_EXPIRATION = '7d'; - - // Act - const newJwtService = new JWTService(); - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - const token = newJwtService.create(payload, mockResponse as Response); - - // Update mock request with the created token - mockRequest.cookies = { auth_token: token }; - const verifiedPayload = newJwtService.verify(mockRequest as Request); - - // Assert - expect(token).toBeDefined(); - expect(verifiedPayload).toBeDefined(); - - // Token should expire in approximately 7 days (604800 seconds) - const expectedExp = Math.floor(Date.now() / 1000) + 604800; - expect(verifiedPayload!.exp).toBeCloseTo(expectedExp, -1); // Within 10 seconds - - // Cleanup - delete process.env.JWT_EXPIRATION; - }); - - it('should parse JWT_EXPIRATION in minutes format', () => { - // Arrange - delete process.env.JWT_EXPIRY; - process.env.JWT_EXPIRATION = '30m'; - - // Act - const newJwtService = new JWTService(); - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - const token = newJwtService.create(payload, mockResponse as Response); - - // Update mock request with the created token - mockRequest.cookies = { auth_token: token }; - const verifiedPayload = newJwtService.verify(mockRequest as Request); - - // Assert - expect(token).toBeDefined(); - expect(verifiedPayload).toBeDefined(); - - // Token should expire in approximately 30 minutes (1800 seconds) - const expectedExp = Math.floor(Date.now() / 1000) + 1800; - expect(verifiedPayload!.exp).toBeCloseTo(expectedExp, -1); // Within 10 seconds - - // Cleanup - delete process.env.JWT_EXPIRATION; - }); - - it('should prioritize JWT_EXPIRY over JWT_EXPIRATION when both are set', () => { - // Arrange - process.env.JWT_EXPIRY = '1800'; // 30 minutes in seconds - process.env.JWT_EXPIRATION = '1h'; // 1 hour - - // Act - const newJwtService = new JWTService(); - const payload: TokenPayload = { - userId: 'user-123', - authLevel: 1 as const, - userStatus: UserState.VERIFIED_REGULAR, - orgId: 'org-456' - }; - - const token = newJwtService.create(payload, mockResponse as Response); - - // Update mock request with the created token - mockRequest.cookies = { auth_token: token }; - const verifiedPayload = newJwtService.verify(mockRequest as Request); - - // Assert - expect(token).toBeDefined(); - expect(verifiedPayload).toBeDefined(); - - // Should use JWT_EXPIRY (1800 seconds), not JWT_EXPIRATION (3600 seconds) - const expectedExp = Math.floor(Date.now() / 1000) + 1800; - expect(verifiedPayload!.exp).toBeCloseTo(expectedExp, -1); // Within 10 seconds - - // Cleanup - delete process.env.JWT_EXPIRY; - delete process.env.JWT_EXPIRATION; - }); - - it('should throw error for invalid JWT_EXPIRATION format', () => { - // Arrange - delete process.env.JWT_EXPIRY; - process.env.JWT_EXPIRATION = 'invalid-format'; - - // Act & Assert - expect(() => { - new JWTService(); - }).toThrow('Invalid duration format: invalid-format. Use format like \'24h\', \'7d\', \'30m\''); - - // Cleanup - delete process.env.JWT_EXPIRATION; - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/LoggingService.test.ts b/SerpentRace_Backend/tests/Application/Services/LoggingService.test.ts deleted file mode 100644 index 9978141d..00000000 --- a/SerpentRace_Backend/tests/Application/Services/LoggingService.test.ts +++ /dev/null @@ -1,217 +0,0 @@ -import { LoggingService, LogLevel } from '../../../src/Application/Services/LoggingService'; -import { logAuth, logError, logDatabase, logStartup } from '../../../src/Application/Services/Logger'; -import fs from 'fs'; -import path from 'path'; - -describe('LoggingService', () => { - let loggingService: LoggingService; - const testLogsDir = path.join(process.cwd(), 'test-logs'); - - beforeEach(() => { - // Clean up any existing test logs - if (fs.existsSync(testLogsDir)) { - fs.rmSync(testLogsDir, { recursive: true, force: true }); - } - - // Mock environment variables for testing - process.env.MAX_LOGS_PER_FILE = '10'; - process.env.MINIO_ENDPOINT = ''; - - loggingService = LoggingService.getInstance(); - }); - - afterEach(() => { - // Clean up test logs - if (fs.existsSync(testLogsDir)) { - fs.rmSync(testLogsDir, { recursive: true, force: true }); - } - - // Clean up environment variables - delete process.env.MAX_LOGS_PER_FILE; - delete process.env.MINIO_ENDPOINT; - }); - - describe('Log Level Functions', () => { - it('should log authentication events', () => { - const consoleSpy = jest.spyOn(console, 'info').mockImplementation(); - - logAuth('Test auth message', 'user123', { action: 'login' }); - - expect(consoleSpy).toHaveBeenCalled(); - const logCall = consoleSpy.mock.calls[0][0]; - expect(logCall).toContain('[AUTH]'); - expect(logCall).toContain('Test auth message'); - - consoleSpy.mockRestore(); - }); - - it('should log error events with stack trace', () => { - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(); - const testError = new Error('Test error message'); - - logError('Test error occurred', testError); - - expect(consoleSpy).toHaveBeenCalled(); - const logCall = consoleSpy.mock.calls[0][0]; - expect(logCall).toContain('[ERROR]'); - expect(logCall).toContain('Test error occurred'); - - consoleSpy.mockRestore(); - }); - - it('should log database operations with timing', () => { - const consoleSpy = jest.spyOn(console, 'info').mockImplementation(); - - logDatabase('Query executed', 'SELECT * FROM users', 45); - - expect(consoleSpy).toHaveBeenCalled(); - const logCall = consoleSpy.mock.calls[0][0]; - expect(logCall).toContain('[DATABASE]'); - expect(logCall).toContain('Query executed'); - - consoleSpy.mockRestore(); - }); - - it('should log startup events', () => { - const consoleSpy = jest.spyOn(console, 'log').mockImplementation(); - - logStartup('Application started', { version: '1.0.0' }); - - expect(consoleSpy).toHaveBeenCalled(); - const logCall = consoleSpy.mock.calls[0][0]; - expect(logCall).toContain('[STARTUP]'); - expect(logCall).toContain('Application started'); - - consoleSpy.mockRestore(); - }); - }); - - describe('Log Formatting', () => { - it('should include timestamp in log entries', () => { - const consoleSpy = jest.spyOn(console, 'log').mockImplementation(); - - logStartup('Test message'); - - expect(consoleSpy).toHaveBeenCalled(); - const logCall = consoleSpy.mock.calls[0][0]; - - // Check if timestamp is in ISO format - const timestampRegex = /\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.\d{3}Z/; - expect(logCall).toMatch(timestampRegex); - - consoleSpy.mockRestore(); - }); - - it('should include metadata in log entries', () => { - const consoleSpy = jest.spyOn(console, 'info').mockImplementation(); - const metadata = { userId: '123', action: 'test' }; - - logAuth('Test with metadata', 'user123', metadata); - - expect(consoleSpy).toHaveBeenCalled(); - const logCall = consoleSpy.mock.calls[0][0]; - expect(logCall).toContain('Meta:'); - expect(logCall).toContain('"userId":"123"'); - expect(logCall).toContain('"action":"test"'); - - consoleSpy.mockRestore(); - }); - }); - - describe('Request Logging Middleware', () => { - it('should create request logging middleware', () => { - const middleware = loggingService.requestLoggingMiddleware(); - - expect(typeof middleware).toBe('function'); - expect(middleware.length).toBe(3); // req, res, next - }); - - it('should create error logging middleware', () => { - const middleware = loggingService.errorLoggingMiddleware(); - - expect(typeof middleware).toBe('function'); - expect(middleware.length).toBe(4); // error, req, res, next - }); - }); - - describe('Log Levels', () => { - it('should have all required log levels defined', () => { - expect(LogLevel.REQUEST).toBe('REQUEST'); - expect(LogLevel.ERROR).toBe('ERROR'); - expect(LogLevel.WARNING).toBe('WARNING'); - expect(LogLevel.AUTH).toBe('AUTH'); - expect(LogLevel.DATABASE).toBe('DATABASE'); - expect(LogLevel.STARTUP).toBe('STARTUP'); - expect(LogLevel.CONNECTION).toBe('CONNECTION'); - expect(LogLevel.OTHER).toBe('OTHER'); - }); - }); - - describe('Singleton Pattern', () => { - it('should return the same instance', () => { - const instance1 = LoggingService.getInstance(); - const instance2 = LoggingService.getInstance(); - - expect(instance1).toBe(instance2); - }); - }); - - describe('File Operations', () => { - it('should handle missing Minio configuration gracefully', () => { - // Test that the service starts without Minio config - expect(() => LoggingService.getInstance()).not.toThrow(); - }); - - it('should generate monthly directory structure', () => { - const now = new Date(); - const year = now.getFullYear(); - const month = String(now.getMonth() + 1).padStart(2, '0'); - const expectedPath = path.join('logs', `${year}-${month}`); - - // This tests the internal logic through the public interface - logStartup('Test for directory creation'); - - // Since we can't directly test the private method, we verify the service doesn't crash - expect(loggingService).toBeDefined(); - }); - }); - - describe('Error Handling', () => { - it('should handle logging errors gracefully', () => { - // Mock fs.appendFileSync to throw an error - const originalAppendFileSync = fs.appendFileSync; - const consoleSpy = jest.spyOn(console, 'error').mockImplementation(); - - fs.appendFileSync = jest.fn(() => { - throw new Error('Disk full'); - }); - - expect(() => { - logStartup('This should not crash'); - }).not.toThrow(); - - // Restore original function - fs.appendFileSync = originalAppendFileSync; - consoleSpy.mockRestore(); - }); - - it('should continue logging to console even if file logging fails', () => { - const consoleSpy = jest.spyOn(console, 'log').mockImplementation(); - - // Mock file system to fail - const originalAppendFileSync = fs.appendFileSync; - fs.appendFileSync = jest.fn(() => { - throw new Error('File system error'); - }); - - logStartup('Test message'); - - // Should still log to console - expect(consoleSpy).toHaveBeenCalled(); - - // Restore - fs.appendFileSync = originalAppendFileSync; - consoleSpy.mockRestore(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/PasswordService.test.ts b/SerpentRace_Backend/tests/Application/Services/PasswordService.test.ts deleted file mode 100644 index a517c6f2..00000000 --- a/SerpentRace_Backend/tests/Application/Services/PasswordService.test.ts +++ /dev/null @@ -1,270 +0,0 @@ -import { PasswordService } from '../../../src/Application/Services/PasswordService'; - -// Mock bcrypt completely -jest.mock('bcrypt'); - -describe('PasswordService', () => { - // Mock functions for bcrypt - const mockBcryptHash = jest.fn(); - const mockBcryptCompare = jest.fn(); - - beforeEach(() => { - jest.clearAllMocks(); - // Reset console.error mock to avoid noise in tests - jest.spyOn(console, 'error').mockImplementation(() => {}); - - // Setup bcrypt mocks - const bcrypt = require('bcrypt'); - bcrypt.hash = mockBcryptHash; - bcrypt.compare = mockBcryptCompare; - }); - - afterEach(() => { - jest.restoreAllMocks(); - }); - - describe('hashPassword', () => { - it('should hash a valid password successfully', async () => { - // Arrange - const password = 'validPassword123!'; - const hashedPassword = '$2b$12$hashed.password.here'; - - mockBcryptHash.mockResolvedValue(hashedPassword); - - // Act - const result = await PasswordService.hashPassword(password); - - // Assert - expect(result).toBe(hashedPassword); - expect(mockBcryptHash).toHaveBeenCalledWith(password, 12); - }); - - it('should throw error for empty password', async () => { - // Arrange - const password = ''; - - // Act & Assert - await expect(PasswordService.hashPassword(password)).rejects.toThrow('Password must be a non-empty string'); - expect(mockBcryptHash).not.toHaveBeenCalled(); - }); - - it('should throw error for non-string password', async () => { - // Arrange - const password = null as any; - - // Act & Assert - await expect(PasswordService.hashPassword(password)).rejects.toThrow('Password must be a non-empty string'); - expect(mockBcryptHash).not.toHaveBeenCalled(); - }); - - it('should handle bcrypt errors and throw generic error', async () => { - // Arrange - const password = 'validPassword123!'; - mockBcryptHash.mockRejectedValue(new Error('Bcrypt error')); - - // Act & Assert - await expect(PasswordService.hashPassword(password)).rejects.toThrow('Failed to hash password'); - expect(mockBcryptHash).toHaveBeenCalledWith(password, 12); - }); - }); - - describe('verifyPassword', () => { - it('should return true for matching password and hash', async () => { - // Arrange - const password = 'validPassword123!'; - const hashedPassword = '$2b$12$hashed.password.here'; - - mockBcryptCompare.mockResolvedValue(true); - - // Act - const result = await PasswordService.verifyPassword(password, hashedPassword); - - // Assert - expect(result).toBe(true); - expect(mockBcryptCompare).toHaveBeenCalledWith(password, hashedPassword); - }); - - it('should return false for non-matching password and hash', async () => { - // Arrange - const password = 'wrongPassword'; - const hashedPassword = '$2b$12$hashed.password.here'; - - mockBcryptCompare.mockResolvedValue(false); - - // Act - const result = await PasswordService.verifyPassword(password, hashedPassword); - - // Assert - expect(result).toBe(false); - expect(mockBcryptCompare).toHaveBeenCalledWith(password, hashedPassword); - }); - - it('should return false for empty password', async () => { - // Arrange - const password = ''; - const hashedPassword = '$2b$12$hashed.password.here'; - - // Act - const result = await PasswordService.verifyPassword(password, hashedPassword); - - // Assert - expect(result).toBe(false); - expect(mockBcryptCompare).not.toHaveBeenCalled(); - }); - - it('should return false for empty hashed password', async () => { - // Arrange - const password = 'validPassword123!'; - const hashedPassword = ''; - - // Act - const result = await PasswordService.verifyPassword(password, hashedPassword); - - // Assert - expect(result).toBe(false); - expect(mockBcryptCompare).not.toHaveBeenCalled(); - }); - - it('should return false for non-string inputs', async () => { - // Arrange - const password = null as any; - const hashedPassword = undefined as any; - - // Act - const result = await PasswordService.verifyPassword(password, hashedPassword); - - // Assert - expect(result).toBe(false); - expect(mockBcryptCompare).not.toHaveBeenCalled(); - }); - - it('should return false when bcrypt throws error', async () => { - // Arrange - const password = 'validPassword123!'; - const hashedPassword = '$2b$12$hashed.password.here'; - - mockBcryptCompare.mockRejectedValue(new Error('Bcrypt compare error')); - - // Act - const result = await PasswordService.verifyPassword(password, hashedPassword); - - // Assert - expect(result).toBe(false); - expect(mockBcryptCompare).toHaveBeenCalledWith(password, hashedPassword); - }); - }); - - describe('validatePasswordStrength', () => { - it('should return valid for strong password', () => { - // Arrange - const password = 'StrongPass123!'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(true); - expect(result.errors).toEqual([]); - }); - - it('should return invalid for short password', () => { - // Arrange - const password = 'Short1!'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must be at least 8 characters long'); - }); - - it('should return invalid for password without uppercase', () => { - // Arrange - const password = 'lowercase123!'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must contain at least one uppercase letter'); - }); - - it('should return invalid for password without lowercase', () => { - // Arrange - const password = 'UPPERCASE123!'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must contain at least one lowercase letter'); - }); - - it('should return invalid for password without numbers', () => { - // Arrange - const password = 'NoNumbers!'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must contain at least one number'); - }); - - it('should return invalid for password without special characters', () => { - // Arrange - const password = 'NoSpecial123'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must contain at least one special character'); - }); - - it('should return multiple errors for weak password', () => { - // Arrange - const password = 'weak'; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toHaveLength(4); - expect(result.errors).toContain('Password must be at least 8 characters long'); - expect(result.errors).toContain('Password must contain at least one uppercase letter'); - expect(result.errors).toContain('Password must contain at least one number'); - expect(result.errors).toContain('Password must contain at least one special character'); - }); - - it('should handle empty password', () => { - // Arrange - const password = ''; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must be provided as a string'); - }); - - it('should handle null password', () => { - // Arrange - const password = null as any; - - // Act - const result = PasswordService.validatePasswordStrength(password); - - // Assert - expect(result.isValid).toBe(false); - expect(result.errors).toContain('Password must be provided as a string'); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/RedisService.test.ts b/SerpentRace_Backend/tests/Application/Services/RedisService.test.ts deleted file mode 100644 index 4b558575..00000000 --- a/SerpentRace_Backend/tests/Application/Services/RedisService.test.ts +++ /dev/null @@ -1,245 +0,0 @@ -import { RedisService } from '../../../src/Application/Services/RedisService'; -import { logStartup, logError } from '../../../src/Application/Services/Logger'; - -describe('RedisService', () => { - let redisService: RedisService; - - beforeAll(async () => { - redisService = RedisService.getInstance(); - - try { - await redisService.connect(); - } catch (error) { - console.log('Redis not available for testing, skipping Redis tests'); - return; - } - }); - - afterAll(async () => { - if (redisService.isRedisConnected()) { - await redisService.disconnect(); - } - }); - - beforeEach(async () => { - // Skip tests if Redis is not connected - if (!redisService.isRedisConnected()) { - return; - } - - // Clean up test data - const activeChats = await redisService.getAllActiveChats(); - for (const chat of activeChats) { - if (chat.chatId.startsWith('test-')) { - await redisService.removeActiveChat(chat.chatId); - } - } - - await redisService.removeActiveUser('test-user-1'); - await redisService.removeActiveUser('test-user-2'); - }); - - describe('Active Chat Management', () => { - it('should store and retrieve active chats', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const testChatData = { - chatId: 'test-chat-1', - participants: ['user-1', 'user-2'], - lastActivity: new Date(), - messageCount: 5, - chatType: 'direct' as const, - name: 'Test Chat' - }; - - await redisService.setActiveChat('test-chat-1', testChatData); - const retrieved = await redisService.getActiveChat('test-chat-1'); - - expect(retrieved).toBeDefined(); - expect(retrieved!.chatId).toBe('test-chat-1'); - expect(retrieved!.participants).toEqual(['user-1', 'user-2']); - expect(retrieved!.messageCount).toBe(5); - expect(retrieved!.chatType).toBe('direct'); - expect(retrieved!.name).toBe('Test Chat'); - }); - - it('should return null for non-existent chat', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const retrieved = await redisService.getActiveChat('non-existent-chat'); - expect(retrieved).toBeNull(); - }); - - it('should remove active chats', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const testChatData = { - chatId: 'test-chat-2', - participants: ['user-1', 'user-2'], - lastActivity: new Date(), - messageCount: 0, - chatType: 'group' as const - }; - - await redisService.setActiveChat('test-chat-2', testChatData); - let retrieved = await redisService.getActiveChat('test-chat-2'); - expect(retrieved).toBeDefined(); - - await redisService.removeActiveChat('test-chat-2'); - retrieved = await redisService.getActiveChat('test-chat-2'); - expect(retrieved).toBeNull(); - }); - - it('should update chat activity', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const originalTime = new Date(Date.now() - 60000); // 1 minute ago - const testChatData = { - chatId: 'test-chat-3', - participants: ['user-1', 'user-2'], - lastActivity: originalTime, - messageCount: 5, - chatType: 'direct' as const - }; - - await redisService.setActiveChat('test-chat-3', testChatData); - - // Wait a bit to ensure timestamp difference - await new Promise(resolve => setTimeout(resolve, 10)); - - await redisService.updateChatActivity('test-chat-3', 6); - - const retrieved = await redisService.getActiveChat('test-chat-3'); - expect(retrieved).toBeDefined(); - expect(retrieved!.messageCount).toBe(6); - expect(retrieved!.lastActivity.getTime()).toBeGreaterThan(originalTime.getTime()); - }); - }); - - describe('Active User Management', () => { - it('should store and retrieve active users', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const testUserData = { - userId: 'test-user-1', - activeChatIds: ['chat-1', 'chat-2'], - lastActivity: new Date(), - isOnline: true - }; - - await redisService.setActiveUser('test-user-1', testUserData); - const retrieved = await redisService.getActiveUser('test-user-1'); - - expect(retrieved).toBeDefined(); - expect(retrieved!.userId).toBe('test-user-1'); - expect(retrieved!.activeChatIds).toEqual(['chat-1', 'chat-2']); - expect(retrieved!.isOnline).toBe(true); - }); - - it('should manage user-chat associations', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - // Add user to chats - await redisService.addUserToChat('test-user-2', 'chat-1'); - await redisService.addUserToChat('test-user-2', 'chat-2'); - - let activeChatIds = await redisService.getUserActiveChats('test-user-2'); - expect(activeChatIds).toContain('chat-1'); - expect(activeChatIds).toContain('chat-2'); - - // Remove user from one chat - await redisService.removeUserFromChat('test-user-2', 'chat-1'); - activeChatIds = await redisService.getUserActiveChats('test-user-2'); - expect(activeChatIds).not.toContain('chat-1'); - expect(activeChatIds).toContain('chat-2'); - }); - }); - - describe('Inactive Chat Cleanup', () => { - it('should identify inactive chats', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const oldTime = new Date(Date.now() - 2 * 60 * 60 * 1000); // 2 hours ago - const recentTime = new Date(); - - // Create an inactive chat - await redisService.setActiveChat('test-inactive-chat', { - chatId: 'test-inactive-chat', - participants: ['user-1', 'user-2'], - lastActivity: oldTime, - messageCount: 3, - chatType: 'direct' - }); - - // Create an active chat - await redisService.setActiveChat('test-active-chat', { - chatId: 'test-active-chat', - participants: ['user-1', 'user-3'], - lastActivity: recentTime, - messageCount: 1, - chatType: 'direct' - }); - - const inactiveChats = await redisService.getInactiveChats(60); // 60 minutes - expect(inactiveChats).toContain('test-inactive-chat'); - expect(inactiveChats).not.toContain('test-active-chat'); - - // Cleanup - await redisService.removeActiveChat('test-inactive-chat'); - await redisService.removeActiveChat('test-active-chat'); - }); - - it('should cleanup inactive chats', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const oldTime = new Date(Date.now() - 2 * 60 * 60 * 1000); // 2 hours ago - - await redisService.setActiveChat('test-cleanup-chat', { - chatId: 'test-cleanup-chat', - participants: ['user-1', 'user-2'], - lastActivity: oldTime, - messageCount: 0, - chatType: 'direct' - }); - - const cleanedUp = await redisService.cleanupInactiveChats(60); - expect(cleanedUp).toContain('test-cleanup-chat'); - - // Verify chat was removed - const retrieved = await redisService.getActiveChat('test-cleanup-chat'); - expect(retrieved).toBeNull(); - }); - }); - - describe('Health Check', () => { - it('should ping Redis successfully', async () => { - if (!redisService.isRedisConnected()) { - return; - } - - const pingResult = await redisService.ping(); - expect(pingResult).toBe(true); - }); - - it('should report connection status', () => { - const isConnected = redisService.isRedisConnected(); - expect(typeof isConnected).toBe('boolean'); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/TokenService.test.ts b/SerpentRace_Backend/tests/Application/Services/TokenService.test.ts deleted file mode 100644 index 7efccd1d..00000000 --- a/SerpentRace_Backend/tests/Application/Services/TokenService.test.ts +++ /dev/null @@ -1,405 +0,0 @@ -import { TokenService } from '../../../src/Application/Services/TokenService'; -import * as crypto from 'crypto'; - -// Mock crypto module -jest.mock('crypto'); - -describe('TokenService', () => { - let mockRandomBytes: jest.Mock; - let mockCreateHash: jest.Mock; - let mockHashUpdate: jest.Mock; - let mockHashDigest: jest.Mock; - let dateSpy: jest.SpyInstance; - - beforeEach(() => { - jest.clearAllMocks(); - - // Restore Date mock if it exists - if (dateSpy) { - dateSpy.mockRestore(); - } - - mockRandomBytes = jest.mocked(crypto.randomBytes); - mockHashUpdate = jest.fn().mockReturnThis(); - mockHashDigest = jest.fn(); - mockCreateHash = jest.fn().mockReturnValue({ - update: mockHashUpdate, - digest: mockHashDigest - }); - - // Mock crypto.createHash properly - jest.mocked(crypto.createHash).mockImplementation(mockCreateHash); - }); - - afterEach(() => { - // Clean up Date mock - if (dateSpy) { - dateSpy.mockRestore(); - dateSpy = undefined as any; - } - }); - - describe('generateSecureToken', () => { - it('should generate a secure token with default length', () => { - // Arrange - const mockBuffer = { - toString: jest.fn().mockReturnValue('abcdef1234567890') - }; - mockRandomBytes.mockReturnValue(mockBuffer as any); - - // Act - const token = TokenService.generateSecureToken(); - - // Assert - expect(token).toBe('abcdef1234567890'); - expect(mockRandomBytes).toHaveBeenCalledWith(32); - expect(mockBuffer.toString).toHaveBeenCalledWith('hex'); - }); - - it('should generate a secure token with custom length', () => { - // Arrange - const mockBuffer = { - toString: jest.fn().mockReturnValue('abcdef') - }; - mockRandomBytes.mockReturnValue(mockBuffer as any); - - // Act - const token = TokenService.generateSecureToken(16); - - // Assert - expect(token).toBe('abcdef'); - expect(mockRandomBytes).toHaveBeenCalledWith(16); - expect(mockBuffer.toString).toHaveBeenCalledWith('hex'); - }); - - it('should handle crypto errors', () => { - // Arrange - mockRandomBytes.mockImplementation(() => { - throw new Error('Crypto error'); - }); - - // Act & Assert - expect(() => TokenService.generateSecureToken()).toThrow('Failed to generate secure token'); - expect(mockRandomBytes).toHaveBeenCalledWith(32); - }); - }); - - describe('generateVerificationToken', () => { - it('should generate verification token with correct expiration', () => { - // Arrange - const mockBuffer = { - toString: jest.fn().mockReturnValue('verification123') - }; - mockRandomBytes.mockReturnValue(mockBuffer as any); - const mockDate = new Date('2023-01-01T12:00:00Z'); - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => mockDate as any); - - // Act - const result = TokenService.generateVerificationToken(); - - // Assert - expect(result.token).toBe('verification123'); - expect(result.createdAt).toEqual(mockDate); - expect(result.expiresAt).toEqual(new Date('2023-01-02T12:00:00Z')); // 24 hours later - expect(mockRandomBytes).toHaveBeenCalledWith(32); - expect(mockBuffer.toString).toHaveBeenCalledWith('hex'); - }); - - it('should handle token generation errors', () => { - // Arrange - mockRandomBytes.mockImplementation(() => { - throw new Error('Random bytes failed'); - }); - - // Act & Assert - expect(() => TokenService.generateVerificationToken()).toThrow('Failed to generate verification token'); - }); - }); - - describe('generatePasswordResetToken', () => { - it('should generate password reset token with correct expiration', () => { - // Arrange - const mockBuffer = { - toString: jest.fn().mockReturnValue('reset456') - }; - mockRandomBytes.mockReturnValue(mockBuffer as any); - const mockDate = new Date('2023-01-01T12:00:00Z'); - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => mockDate as any); - - // Act - const result = TokenService.generatePasswordResetToken(); - - // Assert - expect(result.token).toBe('reset456'); - expect(result.createdAt).toEqual(mockDate); - expect(result.expiresAt).toEqual(new Date('2023-01-01T13:00:00Z')); // 1 hour later - expect(mockRandomBytes).toHaveBeenCalledWith(32); - expect(mockBuffer.toString).toHaveBeenCalledWith('hex'); - }); - - it('should handle token generation errors', () => { - // Arrange - mockRandomBytes.mockImplementation(() => { - throw new Error('Random bytes failed'); - }); - - // Act & Assert - expect(() => TokenService.generatePasswordResetToken()).toThrow('Failed to generate password reset token'); - }); - }); - - describe('hashToken', () => { - it('should hash token correctly', async () => { - // Arrange - const token = 'test-token-123'; - const hashedToken = 'hashed-token-result'; - mockHashDigest.mockReturnValue(hashedToken); - - // Act - const result = await TokenService.hashToken(token); - - // Assert - expect(result).toBe(hashedToken); - expect(mockCreateHash).toHaveBeenCalledWith('sha256'); - expect(mockHashUpdate).toHaveBeenCalledWith(token); - expect(mockHashDigest).toHaveBeenCalledWith('hex'); - }); - - it('should handle hashing errors', async () => { - // Arrange - const token = 'test-token-123'; - mockCreateHash.mockImplementation(() => { - throw new Error('Hashing failed'); - }); - - // Act & Assert - await expect(TokenService.hashToken(token)).rejects.toThrow('Failed to hash token'); - }); - }); - - describe('verifyToken', () => { - it('should return true when tokens match', async () => { - // Arrange - const plainToken = 'plain-token'; - const hashedToken = 'expected-hash'; - mockHashDigest.mockReturnValue(hashedToken); - - // Act - const result = await TokenService.verifyToken(plainToken, hashedToken); - - // Assert - expect(result).toBe(true); - expect(mockCreateHash).toHaveBeenCalledWith('sha256'); - expect(mockHashUpdate).toHaveBeenCalledWith(plainToken); - expect(mockHashDigest).toHaveBeenCalledWith('hex'); - }); - - it('should return false when tokens do not match', async () => { - // Arrange - const plainToken = 'plain-token'; - const hashedToken = 'expected-hash'; - const actualHash = 'different-hash'; - mockHashDigest.mockReturnValue(actualHash); - - // Act - const result = await TokenService.verifyToken(plainToken, hashedToken); - - // Assert - expect(result).toBe(false); - expect(mockCreateHash).toHaveBeenCalledWith('sha256'); - expect(mockHashUpdate).toHaveBeenCalledWith(plainToken); - expect(mockHashDigest).toHaveBeenCalledWith('hex'); - }); - - it('should handle verification errors', async () => { - // Arrange - const plainToken = 'plain-token'; - const hashedToken = 'expected-hash'; - mockCreateHash.mockImplementation(() => { - throw new Error('Hash creation failed'); - }); - - // Act & Assert - TokenService.verifyToken catches errors and returns false, doesn't throw - const result = await TokenService.verifyToken(plainToken, hashedToken); - expect(result).toBe(false); - }); - }); - - describe('isTokenExpired', () => { - it('should return false for non-expired token', () => { - // Arrange - const currentTime = new Date('2023-01-01T12:00:00Z'); - const futureDate = new Date('2023-01-01T13:00:00Z'); // 1 hour from now - - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => currentTime as any); - - // Act - const result = TokenService.isTokenExpired(futureDate); - - // Assert - expect(result).toBe(false); - - // Cleanup - dateSpy.mockRestore(); - }); - - it('should return true for expired token', () => { - // Arrange - const currentTime = new Date('2023-01-01T12:00:00Z'); - const pastDate = new Date('2023-01-01T11:00:00Z'); // 1 hour ago - - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => currentTime as any); - - // Act - const result = TokenService.isTokenExpired(pastDate); - - // Assert - expect(result).toBe(true); - - // Cleanup - dateSpy.mockRestore(); - }); - - it('should return true for exactly expired token', () => { - // Arrange - const currentTime = new Date('2023-01-01T12:00:00Z'); - const exactlyNow = new Date('2023-01-01T12:00:00Z'); - - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => currentTime as any); - - // Act - const result = TokenService.isTokenExpired(exactlyNow); - - // Assert - expect(result).toBe(false); // new Date() > expiresAt is false when they're equal - - // Cleanup - dateSpy.mockRestore(); - }); - }); - - describe('generateTokenWithExpiry', () => { - it('should validate token format correctly', () => { - // Arrange - valid hex token with expected length (64 chars for 32 bytes) - const validToken = 'a'.repeat(64); // 64 hex characters - - // Act - const result = TokenService.isValidTokenFormat(validToken); - - // Assert - expect(result).toBe(true); - }); - - it('should reject invalid token format', () => { - // Arrange - const invalidTokens = [ - '', // empty - 'invalid-token-with-dashes', // non-hex characters - 'abc123', // too short - null as any, // null - undefined as any, // undefined - 123 as any // not string - ]; - - invalidTokens.forEach(invalidToken => { - // Act - const result = TokenService.isValidTokenFormat(invalidToken); - - // Assert - expect(result).toBe(false); - }); - }); - }); - - describe('generateVerificationUrl', () => { - it('should generate correct verification URL', () => { - // Arrange - const baseUrl = 'https://example.com'; - const token = 'verification-token-123'; - - // Act - const url = TokenService.generateVerificationUrl(baseUrl, token); - - // Assert - expect(url).toBe('https://example.com/api/auth/verify-email?token=verification-token-123'); - }); - - it('should handle base URL with trailing slash', () => { - // Arrange - const baseUrl = 'https://example.com/'; - const token = 'verification-token-123'; - - // Act - const url = TokenService.generateVerificationUrl(baseUrl, token); - - // Assert - expect(url).toBe('https://example.com/api/auth/verify-email?token=verification-token-123'); - }); - - it('should encode special characters in token', () => { - // Arrange - const baseUrl = 'https://example.com'; - const token = 'token+with/special=chars'; - - // Act - const url = TokenService.generateVerificationUrl(baseUrl, token); - - // Assert - expect(url).toContain(encodeURIComponent(token)); - }); - }); - - describe('generatePasswordResetUrl', () => { - it('should generate correct password reset URL', () => { - // Arrange - const baseUrl = 'https://example.com'; - const token = 'reset-token-456'; - - // Act - const url = TokenService.generatePasswordResetUrl(baseUrl, token); - - // Assert - expect(url).toBe('https://example.com/api/auth/reset-password?token=reset-token-456'); - }); - }); - - describe('getExpirationInfo', () => { - it('should return correct info for non-expired token', () => { - // Arrange - const currentTime = new Date('2023-01-01T12:00:00Z'); - const futureDate = new Date('2023-01-01T14:00:00Z'); // 2 hours from now - - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => currentTime as any); - - // Act - const result = TokenService.getExpirationInfo(futureDate); - - // Assert - expect(result.expired).toBe(false); - expect(result.timeLeft).toContain('Expires in'); - expect(result.timeLeft).toContain('hour(s)'); - - // Cleanup - dateSpy.mockRestore(); - }); - - it('should return correct info for expired token', () => { - // Arrange - const currentTime = new Date('2023-01-01T12:00:00Z'); - const pastDate = new Date('2023-01-01T11:30:00Z'); // 30 minutes ago - - dateSpy = jest.spyOn(global, 'Date').mockImplementation(() => currentTime as any); - - // Act - const result = TokenService.getExpirationInfo(pastDate); - - // Assert - expect(result.expired).toBe(true); - expect(result.timeLeft).toContain('Expired'); - expect(result.timeLeft).toContain('minute(s) ago'); - - // Cleanup - dateSpy.mockRestore(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/Services/ValidationMiddleware.test.ts b/SerpentRace_Backend/tests/Application/Services/ValidationMiddleware.test.ts deleted file mode 100644 index 443688cc..00000000 --- a/SerpentRace_Backend/tests/Application/Services/ValidationMiddleware.test.ts +++ /dev/null @@ -1,206 +0,0 @@ -import { ValidationMiddleware } from '../../../src/Application/Services/ValidationMiddleware'; -import { Request, Response, NextFunction } from 'express'; -import { ErrorResponseService } from '../../../src/Application/Services/ErrorResponseService'; - -jest.mock('../../../src/Application/Services/ErrorResponseService'); -jest.mock('../../../src/Application/Services/Logger'); - -describe('ValidationMiddleware', () => { - let req: Partial; - let res: Partial; - let next: NextFunction; - - beforeEach(() => { - req = { - body: {}, - params: {}, - query: {}, - path: '/test' - }; - res = { - status: jest.fn().mockReturnThis(), - json: jest.fn().mockReturnThis() - }; - next = jest.fn(); - jest.clearAllMocks(); - }); - - describe('validateRequiredFields', () => { - it('should pass validation when all required fields are present', () => { - req.body = { username: 'testuser', email: 'test@example.com' }; - - const middleware = ValidationMiddleware.validateRequiredFields(['username', 'email']); - middleware(req as Request, res as Response, next); - - expect(next).toHaveBeenCalledWith(); - expect(ErrorResponseService.sendBadRequest).not.toHaveBeenCalled(); - }); - - it('should fail validation when required fields are missing', () => { - req.body = { username: 'testuser' }; // missing email - - const middleware = ValidationMiddleware.validateRequiredFields(['username', 'email']); - middleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'Missing required fields', - { missingFields: ['email'] } - ); - expect(next).not.toHaveBeenCalled(); - }); - - it('should fail validation when fields are empty strings', () => { - req.body = { username: '', email: 'test@example.com' }; - - const middleware = ValidationMiddleware.validateRequiredFields(['username', 'email']); - middleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'Missing required fields', - { missingFields: ['username'] } - ); - }); - }); - - describe('validateEmailFormat', () => { - it('should pass validation for valid email', () => { - req.body = { email: 'test@example.com' }; - - const middleware = ValidationMiddleware.validateEmailFormat(['email']); - middleware(req as Request, res as Response, next); - - expect(next).toHaveBeenCalledWith(); - expect(ErrorResponseService.sendBadRequest).not.toHaveBeenCalled(); - }); - - it('should fail validation for invalid email', () => { - req.body = { email: 'invalid-email' }; - - const middleware = ValidationMiddleware.validateEmailFormat(['email']); - middleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'Email format validation failed', - { errors: ["Field 'email' must contain a valid email address"] } - ); - expect(next).not.toHaveBeenCalled(); - }); - }); - - describe('validateUUIDFormat', () => { - it('should pass validation for valid UUID', () => { - req.params = { userId: '123e4567-e89b-12d3-a456-426614174000' }; - - const middleware = ValidationMiddleware.validateUUIDFormat(['userId']); - middleware(req as Request, res as Response, next); - - expect(next).toHaveBeenCalledWith(); - expect(ErrorResponseService.sendBadRequest).not.toHaveBeenCalled(); - }); - - it('should fail validation for invalid UUID', () => { - req.params = { userId: 'invalid-uuid' }; - - const middleware = ValidationMiddleware.validateUUIDFormat(['userId']); - middleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'UUID format validation failed', - { errors: ["Field 'userId' must contain a valid UUID"] } - ); - expect(next).not.toHaveBeenCalled(); - }); - }); - - describe('validateStringLength', () => { - it('should pass validation for strings within length constraints', () => { - req.body = { username: 'testuser', password: 'password123' }; - - const middleware = ValidationMiddleware.validateStringLength({ - username: { min: 3, max: 20 }, - password: { min: 8, max: 50 } - }); - middleware(req as Request, res as Response, next); - - expect(next).toHaveBeenCalledWith(); - expect(ErrorResponseService.sendBadRequest).not.toHaveBeenCalled(); - }); - - it('should fail validation for strings that are too short', () => { - req.body = { username: 'ab' }; // too short (min 3) - - const middleware = ValidationMiddleware.validateStringLength({ - username: { min: 3, max: 20 } - }); - middleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'String length validation failed', - { errors: ["Field 'username' must be at least 3 characters"] } - ); - }); - - it('should fail validation for strings that are too long', () => { - req.body = { username: 'a'.repeat(25) }; // too long (max 20) - - const middleware = ValidationMiddleware.validateStringLength({ - username: { min: 3, max: 20 } - }); - middleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'String length validation failed', - { errors: ["Field 'username' must not exceed 20 characters"] } - ); - }); - }); - - describe('combine', () => { - it('should run all validations in sequence and pass if all succeed', (done) => { - req.body = { username: 'testuser', email: 'test@example.com' }; - - const nextSpy = jest.fn(() => { - try { - expect(nextSpy).toHaveBeenCalledWith(); - expect(ErrorResponseService.sendBadRequest).not.toHaveBeenCalled(); - done(); - } catch (error) { - done(error); - } - }); - - const combinedMiddleware = ValidationMiddleware.combine([ - ValidationMiddleware.validateRequiredFields(['username', 'email']), - ValidationMiddleware.validateEmailFormat(['email']), - ValidationMiddleware.validateStringLength({ username: { min: 3, max: 20 } }) - ]); - - combinedMiddleware(req as Request, res as Response, nextSpy); - }); - - it('should stop at first validation failure', () => { - req.body = { username: 'testuser' }; // missing email - - const combinedMiddleware = ValidationMiddleware.combine([ - ValidationMiddleware.validateRequiredFields(['username', 'email']), - ValidationMiddleware.validateEmailFormat(['email']), // this won't run - ValidationMiddleware.validateStringLength({ username: { min: 3, max: 20 } }) // this won't run - ]); - - combinedMiddleware(req as Request, res as Response, next); - - expect(ErrorResponseService.sendBadRequest).toHaveBeenCalledWith( - res, - 'Missing required fields', - { missingFields: ['email'] } - ); - expect(next).not.toHaveBeenCalled(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/Application/User/commands/UserCommandHandlers.comprehensive.test.ts b/SerpentRace_Backend/tests/Application/User/commands/UserCommandHandlers.comprehensive.test.ts deleted file mode 100644 index 42c92a51..00000000 --- a/SerpentRace_Backend/tests/Application/User/commands/UserCommandHandlers.comprehensive.test.ts +++ /dev/null @@ -1,430 +0,0 @@ -// Comprehensive test coverage for User Command Handlers -import { CreateUserCommand } from '../../../../src/Application/User/commands/CreateUserCommand'; -import { CreateUserCommandHandler } from '../../../../src/Application/User/commands/CreateUserCommandHandler'; -import { LoginCommand } from '../../../../src/Application/User/commands/LoginCommand'; -import { LoginCommandHandler } from '../../../../src/Application/User/commands/LoginCommandHandler'; -import { UpdateUserCommand } from '../../../../src/Application/User/commands/UpdateUserCommand'; -import { UpdateUserCommandHandler } from '../../../../src/Application/User/commands/UpdateUserCommandHandler'; -import { DeactivateUserCommand } from '../../../../src/Application/User/commands/DeactivateUserCommand'; -import { DeactivateUserCommandHandler } from '../../../../src/Application/User/commands/DeactivateUserCommandHandler'; -import { IUserRepository } from '../../../../src/Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../../../../src/Domain/IRepository/IOrganizationRepository'; -import { JWTService } from '../../../../src/Application/Services/JWTService'; -import { PasswordService } from '../../../../src/Application/Services/PasswordService'; -import { UserState } from '../../../../src/Domain/User/UserAggregate'; -import { - createMockUser, - createMockUserRepository, - createMockOrganizationRepository, - createMockJWTService -} from '../../../testUtils'; - -// Mock PasswordService static methods -jest.mock('../../../../src/Application/Services/PasswordService', () => ({ - PasswordService: { - validatePasswordStrength: jest.fn().mockReturnValue({ isValid: true, errors: [] }), - hashPassword: jest.fn().mockResolvedValue('hashed-password'), - verifyPassword: jest.fn().mockResolvedValue(true) - } -})); - -describe('User Command Handlers - Comprehensive Coverage', () => { - describe('CreateUserCommandHandler', () => { - let mockUserRepository: jest.Mocked; - let handler: CreateUserCommandHandler; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - handler = new CreateUserCommandHandler(mockUserRepository); - }); - - it('should create a new user successfully', async () => { - // Arrange - const command: CreateUserCommand = { - username: 'testuser', - email: 'test@example.com', - password: 'Password123!', // Strong password - fname: 'Test', - lname: 'User', - type: 'regular' - }; - - const mockUser = createMockUser({ - username: command.username, - email: command.email, - state: UserState.REGISTERED_NOT_VERIFIED - }); - - // CreateUserCommandHandler doesn't check existing users - goes directly to create - mockUserRepository.create.mockResolvedValue(mockUser); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - // CreateUserCommandHandler doesn't call findByUsername/findByEmail - expect(mockUserRepository.create).toHaveBeenCalled(); - }); - - it('should throw error when username already exists', async () => { - // Arrange - const command: CreateUserCommand = { - username: 'existinguser', - email: 'test@example.com', - password: 'Password123!', // Strong password - fname: 'Test', - lname: 'User', - type: 'regular' - }; - - // Simulate database constraint error for duplicate username - mockUserRepository.create.mockRejectedValue(new Error('duplicate key value violates unique constraint')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('User with this username or email already exists'); - }); - - it('should throw error when email already exists', async () => { - // Arrange - const command: CreateUserCommand = { - username: 'testuser', - email: 'existing@example.com', - password: 'Password123!', // Strong password - fname: 'Test', - lname: 'User', - type: 'regular' - }; - - // Simulate database constraint error for duplicate email - mockUserRepository.create.mockRejectedValue(new Error('unique constraint violation')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('User with this username or email already exists'); - }); - - it('should handle repository errors', async () => { - // Arrange - const command: CreateUserCommand = { - username: 'testuser', - email: 'test@example.com', - password: 'Password123!', // Strong password - fname: 'Test', - lname: 'User', - type: 'regular' - }; - - mockUserRepository.findByUsername.mockResolvedValue(null); - mockUserRepository.findByEmail.mockResolvedValue(null); - mockUserRepository.create.mockRejectedValue(new Error('Database error')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Failed to create user'); - }); - }); - - describe('LoginCommandHandler', () => { - let mockUserRepository: jest.Mocked; - let mockOrgRepository: jest.Mocked; - let mockJwtService: jest.Mocked; - let handler: LoginCommandHandler; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - mockOrgRepository = createMockOrganizationRepository(); - mockJwtService = createMockJWTService(); - handler = new LoginCommandHandler(mockUserRepository, mockJwtService, mockOrgRepository); - - // Reset all mocks - jest.clearAllMocks(); - - // Set default PasswordService behavior - const mockPasswordService = PasswordService as jest.Mocked; - mockPasswordService.verifyPassword.mockResolvedValue(true); // Default to valid password - }); - - it('should login user with valid credentials', async () => { - // Arrange - const command: LoginCommand = { - username: 'testuser', - password: 'Password123!' - }; - - const mockUser = createMockUser({ - username: command.username, - state: UserState.VERIFIED_REGULAR - }); - - mockUserRepository.findByUsername.mockResolvedValue(mockUser); - mockJwtService.create.mockReturnValue('jwt-token'); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - expect(result!.token).toBe('jwt-token'); - expect(mockJwtService.create).toHaveBeenCalled(); - }); - - it('should handle user not found', async () => { - // Arrange - const command: LoginCommand = { - username: 'nonexistent', - password: 'password123' - }; - - mockUserRepository.findByUsername.mockResolvedValue(null); - - // Act & Assert - const result = await handler.execute(command); - expect(result).toBeNull(); - }); - - it('should handle invalid password', async () => { - // Arrange - const command: LoginCommand = { - username: 'testuser', - password: 'wrongpassword' - }; - - const mockUser = createMockUser({ - username: command.username, - password: 'hashedpassword' - }); - - mockUserRepository.findByUsername.mockResolvedValue(mockUser); - - // Mock password verification to return false for wrong password - const mockPasswordService = PasswordService as jest.Mocked; - mockPasswordService.verifyPassword.mockResolvedValue(false); - - // Act & Assert - const result = await handler.execute(command); - expect(result).toBeNull(); - }); - - it('should handle unverified user', async () => { - // Arrange - LoginCommandHandler doesn't reject unverified users, it processes them normally - const command: LoginCommand = { - username: 'testuser', - password: 'Password123!' - }; - - const mockUser = createMockUser({ - username: command.username, - password: 'hashedpassword', - state: UserState.REGISTERED_NOT_VERIFIED - }); - - mockUserRepository.findByUsername.mockResolvedValue(mockUser); - mockJwtService.create.mockReturnValue('jwt-token'); - - // Act - const result = await handler.execute(command); - - // Assert - LoginCommandHandler processes unverified users normally - expect(result).toBeDefined(); - expect(result!.user).toBeDefined(); - expect(result!.token).toBe('jwt-token'); - }); - }); - - describe('UpdateUserCommandHandler', () => { - let mockUserRepository: jest.Mocked; - let handler: UpdateUserCommandHandler; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - handler = new UpdateUserCommandHandler(mockUserRepository); - }); - - it('should update user successfully', async () => { - // Arrange - const command: UpdateUserCommand = { - id: 'user-123', - email: 'newemail@example.com' - }; - - const existingUser = createMockUser({ id: command.id }); - const updatedUser = createMockUser({ - id: command.id, - email: command.email - }); - - mockUserRepository.findById.mockResolvedValue(existingUser); - mockUserRepository.update.mockResolvedValue(updatedUser); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - expect(mockUserRepository.update).toHaveBeenCalledWith(command.id, expect.any(Object)); - }); - - it('should return null when user not found', async () => { - // Arrange - const command: UpdateUserCommand = { - id: 'nonexistent-user', - email: 'newemail@example.com' - }; - - mockUserRepository.update.mockResolvedValue(null); // UpdateUserCommandHandler calls update directly, not findById first - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeNull(); - expect(mockUserRepository.update).toHaveBeenCalledWith(command.id, expect.any(Object)); - }); - - it('should handle partial updates', async () => { - // Arrange - const command: UpdateUserCommand = { - id: 'user-123', - username: 'newusername' - }; - - const existingUser = createMockUser({ id: command.id }); - const updatedUser = createMockUser({ - id: command.id, - username: command.username - }); - - mockUserRepository.findById.mockResolvedValue(existingUser); - mockUserRepository.update.mockResolvedValue(updatedUser); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBeDefined(); - }); - }); - - describe('DeactivateUserCommandHandler', () => { - let mockUserRepository: jest.Mocked; - let handler: DeactivateUserCommandHandler; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - handler = new DeactivateUserCommandHandler(mockUserRepository); - }); - - it('should deactivate user successfully', async () => { - // Arrange - const command: DeactivateUserCommand = { - id: 'user-123' - }; - - const deactivatedUser = createMockUser({ - id: command.id, - state: UserState.DEACTIVATED - }); - - mockUserRepository.deactivate.mockResolvedValue(deactivatedUser); - - // Act - const result = await handler.execute(command); - - // Assert - expect(result).toBe(true); - expect(mockUserRepository.deactivate).toHaveBeenCalledWith(command.id); - }); - - it('should handle repository errors', async () => { - // Arrange - const command: DeactivateUserCommand = { - id: 'user-123' - }; - - mockUserRepository.deactivate.mockRejectedValue(new Error('Deactivation failed')); - - // Act & Assert - await expect(handler.execute(command)).rejects.toThrow('Deactivation failed'); - }); - }); - - describe('Cross-Command Integration Tests', () => { - let mockUserRepository: jest.Mocked; - let mockOrgRepository: jest.Mocked; - let mockJwtService: jest.Mocked; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - mockOrgRepository = createMockOrganizationRepository(); - mockJwtService = createMockJWTService(); - }); - - it('should create user and then login', async () => { - // Arrange - const createHandler = new CreateUserCommandHandler(mockUserRepository); - const loginHandler = new LoginCommandHandler(mockUserRepository, mockJwtService, mockOrgRepository); - - const createCommand: CreateUserCommand = { - username: 'testuser', - email: 'test@example.com', - password: 'Password123!', // Strong password - fname: 'Test', - lname: 'User', - type: 'regular' - }; - - const loginCommand: LoginCommand = { - username: 'testuser', - password: 'Password123!' // Strong password - }; - - const mockUser = createMockUser({ - username: createCommand.username, - email: createCommand.email, - state: UserState.VERIFIED_REGULAR - }); - - // Mock create user flow - mockUserRepository.findByUsername.mockResolvedValueOnce(null); - mockUserRepository.findByEmail.mockResolvedValue(null); - mockUserRepository.create.mockResolvedValue(mockUser); - - // Mock login flow - mockUserRepository.findByUsername.mockResolvedValueOnce(mockUser); - mockJwtService.create.mockReturnValue('jwt-token'); - - // Act - const createResult = await createHandler.execute(createCommand); - const loginResult = await loginHandler.execute(loginCommand); - - // Assert - expect(createResult).toBeDefined(); - expect(loginResult).toBeDefined(); - }); - - it('should update user after creation', async () => { - // Arrange - const updateHandler = new UpdateUserCommandHandler(mockUserRepository); - - const updateCommand: UpdateUserCommand = { - id: 'user-123', - email: 'updated@example.com' - }; - - const existingUser = createMockUser({ id: updateCommand.id }); - const updatedUser = createMockUser({ - id: updateCommand.id, - email: updateCommand.email - }); - - mockUserRepository.findById.mockResolvedValue(existingUser); - mockUserRepository.update.mockResolvedValue(updatedUser); - - // Act - const result = await updateHandler.execute(updateCommand); - - // Assert - expect(result).toBeDefined(); - expect(result).not.toBeNull(); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/comprehensive-repository-coverage.test.ts b/SerpentRace_Backend/tests/comprehensive-repository-coverage.test.ts deleted file mode 100644 index 2bbdaa39..00000000 --- a/SerpentRace_Backend/tests/comprehensive-repository-coverage.test.ts +++ /dev/null @@ -1,286 +0,0 @@ -// Comprehensive test coverage for Repository layer -import { IUserRepository } from '../src/Domain/IRepository/IUserRepository'; -import { IDeckRepository } from '../src/Domain/IRepository/IDeckRepository'; -import { IOrganizationRepository } from '../src/Domain/IRepository/IOrganizationRepository'; -import { IContactRepository } from '../src/Domain/IRepository/IContactRepository'; -import { UserAggregate, UserState } from '../src/Domain/User/UserAggregate'; -import { DeckAggregate, Type as DeckType } from '../src/Domain/Deck/DeckAggregate'; -import { OrganizationAggregate } from '../src/Domain/Organization/OrganizationAggregate'; -import { ContactAggregate } from '../src/Domain/Contact/ContactAggregate'; -import { - createMockUser, - createMockDeck, - createMockOrganization, - createMockContact, - createMockUserRepository, - createMockDeckRepository, - createMockOrganizationRepository, - createMockContactRepository -} from './testUtils'; - -describe('Repository Layer - Comprehensive Coverage', () => { - describe('IUserRepository Interface Coverage', () => { - let mockUserRepository: jest.Mocked; - - beforeEach(() => { - mockUserRepository = createMockUserRepository(); - }); - - it('should implement all required methods', () => { - expect(mockUserRepository.create).toBeDefined(); - expect(mockUserRepository.findByPage).toBeDefined(); - expect(mockUserRepository.findByPageIncludingDeleted).toBeDefined(); - expect(mockUserRepository.findById).toBeDefined(); - expect(mockUserRepository.findByIdIncludingDeleted).toBeDefined(); - expect(mockUserRepository.findByUsername).toBeDefined(); - expect(mockUserRepository.findByEmail).toBeDefined(); - expect(mockUserRepository.findByToken).toBeDefined(); - expect(mockUserRepository.search).toBeDefined(); - expect(mockUserRepository.searchIncludingDeleted).toBeDefined(); - expect(mockUserRepository.update).toBeDefined(); - expect(mockUserRepository.delete).toBeDefined(); - expect(mockUserRepository.softDelete).toBeDefined(); - expect(mockUserRepository.deactivate).toBeDefined(); - }); - - it('should handle user creation', async () => { - const userData = { username: 'testuser', email: 'test@example.com' }; - const mockUser = createMockUser(userData); - mockUserRepository.create.mockResolvedValue(mockUser); - - const result = await mockUserRepository.create(userData); - expect(result).toEqual(mockUser); - expect(mockUserRepository.create).toHaveBeenCalledWith(userData); - }); - - it('should handle paginated user retrieval', async () => { - const mockUsers = [createMockUser(), createMockUser({ id: 'user2' })]; - mockUserRepository.findByPage.mockResolvedValue({ users: mockUsers, totalCount: 2 }); - - const result = await mockUserRepository.findByPage(0, 10); - expect(result.users).toHaveLength(2); - expect(result.totalCount).toBe(2); - }); - - it('should handle user search operations', async () => { - const mockUsers = [createMockUser({ username: 'searchtest' })]; - mockUserRepository.search.mockResolvedValue({ users: mockUsers, totalCount: 1 }); - - const result = await mockUserRepository.search('searchtest'); - expect(result.users).toHaveLength(1); - expect(result.users[0].username).toBe('searchtest'); - }); - - it('should handle user state transitions', async () => { - const mockUser = createMockUser({ state: UserState.VERIFIED_REGULAR }); - mockUserRepository.deactivate.mockResolvedValue(mockUser); - - const result = await mockUserRepository.deactivate('user-id'); - expect(result).toEqual(mockUser); - }); - }); - - describe('IDeckRepository Interface Coverage', () => { - let mockDeckRepository: jest.Mocked; - - beforeEach(() => { - mockDeckRepository = createMockDeckRepository(); - }); - - it('should implement all required methods including new ones', () => { - expect(mockDeckRepository.create).toBeDefined(); - expect(mockDeckRepository.findByPage).toBeDefined(); - expect(mockDeckRepository.findByPageIncludingDeleted).toBeDefined(); - expect(mockDeckRepository.findById).toBeDefined(); - expect(mockDeckRepository.findByIdIncludingDeleted).toBeDefined(); - expect(mockDeckRepository.search).toBeDefined(); - expect(mockDeckRepository.searchIncludingDeleted).toBeDefined(); - expect(mockDeckRepository.update).toBeDefined(); - expect(mockDeckRepository.delete).toBeDefined(); - expect(mockDeckRepository.softDelete).toBeDefined(); - expect(mockDeckRepository.countActiveByUserId).toBeDefined(); - expect(mockDeckRepository.countOrganizationalByUserId).toBeDefined(); - expect(mockDeckRepository.findFilteredDecks).toBeDefined(); - }); - - it('should handle deck counting operations', async () => { - mockDeckRepository.countActiveByUserId.mockResolvedValue(5); - mockDeckRepository.countOrganizationalByUserId.mockResolvedValue(3); - - const activeCount = await mockDeckRepository.countActiveByUserId('user-id'); - const orgCount = await mockDeckRepository.countOrganizationalByUserId('user-id'); - - expect(activeCount).toBe(5); - expect(orgCount).toBe(3); - }); - - it('should handle filtered deck retrieval', async () => { - const mockDecks = [createMockDeck(), createMockDeck({ id: 'deck2' })]; - mockDeckRepository.findFilteredDecks.mockResolvedValue({ decks: mockDecks, totalCount: 2 }); - - const result = await mockDeckRepository.findFilteredDecks('user-id', 'org-id', false, 0, 10); - expect(result.decks).toHaveLength(2); - expect(result.totalCount).toBe(2); - }); - - it('should handle different deck types', async () => { - const jokerDeck = createMockDeck({ type: DeckType.JOKER }); - const luckDeck = createMockDeck({ type: DeckType.LUCK }); - const questionDeck = createMockDeck({ type: DeckType.QUESTION }); - - mockDeckRepository.create.mockResolvedValueOnce(jokerDeck); - mockDeckRepository.create.mockResolvedValueOnce(luckDeck); - mockDeckRepository.create.mockResolvedValueOnce(questionDeck); - - const result1 = await mockDeckRepository.create({ type: DeckType.JOKER }); - const result2 = await mockDeckRepository.create({ type: DeckType.LUCK }); - const result3 = await mockDeckRepository.create({ type: DeckType.QUESTION }); - - expect(result1.type).toBe(DeckType.JOKER); - expect(result2.type).toBe(DeckType.LUCK); - expect(result3.type).toBe(DeckType.QUESTION); - }); - }); - - describe('IOrganizationRepository Interface Coverage', () => { - let mockOrgRepository: jest.Mocked; - - beforeEach(() => { - mockOrgRepository = createMockOrganizationRepository(); - }); - - it('should implement all required methods', () => { - expect(mockOrgRepository.create).toBeDefined(); - expect(mockOrgRepository.findByPage).toBeDefined(); - expect(mockOrgRepository.findByPageIncludingDeleted).toBeDefined(); - expect(mockOrgRepository.findById).toBeDefined(); - expect(mockOrgRepository.findByIdIncludingDeleted).toBeDefined(); - expect(mockOrgRepository.search).toBeDefined(); - expect(mockOrgRepository.searchIncludingDeleted).toBeDefined(); - expect(mockOrgRepository.update).toBeDefined(); - expect(mockOrgRepository.delete).toBeDefined(); - expect(mockOrgRepository.softDelete).toBeDefined(); - }); - - it('should handle organization CRUD operations', async () => { - const orgData = { name: 'Test Org', contactemail: 'test@org.com' }; - const mockOrg = createMockOrganization(orgData); - - mockOrgRepository.create.mockResolvedValue(mockOrg); - mockOrgRepository.findById.mockResolvedValue(mockOrg); - mockOrgRepository.update.mockResolvedValue(mockOrg); - mockOrgRepository.softDelete.mockResolvedValue(mockOrg); - - const created = await mockOrgRepository.create(orgData); - const found = await mockOrgRepository.findById('org-id'); - const updated = await mockOrgRepository.update('org-id', { name: 'Updated Org' }); - const deleted = await mockOrgRepository.softDelete('org-id'); - - expect(created.name).toBe('Test Org'); - expect(found).toEqual(mockOrg); - expect(updated).toEqual(mockOrg); - expect(deleted).toEqual(mockOrg); - }); - }); - - describe('IContactRepository Interface Coverage', () => { - let mockContactRepository: jest.Mocked; - - beforeEach(() => { - mockContactRepository = createMockContactRepository(); - }); - - it('should implement all required methods', () => { - expect(mockContactRepository.create).toBeDefined(); - expect(mockContactRepository.findById).toBeDefined(); - expect(mockContactRepository.findByPage).toBeDefined(); - expect(mockContactRepository.findByPageIncludingDeleted).toBeDefined(); - expect(mockContactRepository.findByIdIncludingDeleted).toBeDefined(); - expect(mockContactRepository.search).toBeDefined(); - expect(mockContactRepository.searchIncludingDeleted).toBeDefined(); - expect(mockContactRepository.update).toBeDefined(); - expect(mockContactRepository.delete).toBeDefined(); - expect(mockContactRepository.softDelete).toBeDefined(); - }); - - it('should handle contact search operations', async () => { - const mockContacts = [createMockContact({ email: 'test@example.com' })]; - mockContactRepository.search.mockResolvedValue(mockContacts); - mockContactRepository.searchIncludingDeleted.mockResolvedValue(mockContacts); - - const activeResults = await mockContactRepository.search('test'); - const allResults = await mockContactRepository.searchIncludingDeleted('test'); - - expect(activeResults).toHaveLength(1); - expect(allResults).toHaveLength(1); - }); - - it('should handle contact lifecycle', async () => { - const contactData = { email: 'user@example.com', message: 'Help Request' }; - const mockContact = createMockContact(contactData); - - mockContactRepository.create.mockResolvedValue(mockContact); - mockContactRepository.findById.mockResolvedValue(mockContact); - mockContactRepository.findByIdIncludingDeleted.mockResolvedValue(mockContact); - - const created = await mockContactRepository.create(contactData); - const found = await mockContactRepository.findById('contact-id'); - const foundWithDeleted = await mockContactRepository.findByIdIncludingDeleted('contact-id'); - - expect(created.email).toBe('user@example.com'); - expect(found).toEqual(mockContact); - expect(foundWithDeleted).toEqual(mockContact); - }); - }); - - describe('Cross-Repository Integration Tests', () => { - let userRepo: jest.Mocked; - let deckRepo: jest.Mocked; - let orgRepo: jest.Mocked; - - beforeEach(() => { - userRepo = createMockUserRepository(); - deckRepo = createMockDeckRepository(); - orgRepo = createMockOrganizationRepository(); - }); - - it('should simulate user-deck relationship operations', async () => { - const mockUser = createMockUser({ id: 'user-123' }); - const mockDecks = [ - createMockDeck({ userid: 'user-123', name: 'Deck 1' }), - createMockDeck({ userid: 'user-123', name: 'Deck 2' }) - ]; - - userRepo.findById.mockResolvedValue(mockUser); - deckRepo.findFilteredDecks.mockResolvedValue({ decks: mockDecks, totalCount: 2 }); - deckRepo.countActiveByUserId.mockResolvedValue(2); - - const user = await userRepo.findById('user-123'); - const userDecks = await deckRepo.findFilteredDecks('user-123'); - const deckCount = await deckRepo.countActiveByUserId('user-123'); - - expect(user).toBeDefined(); - expect(userDecks.decks).toHaveLength(2); - expect(deckCount).toBe(2); - expect(userDecks.decks.every(deck => deck.userid === 'user-123')).toBe(true); - }); - - it('should simulate organization-user relationship operations', async () => { - const mockOrg = createMockOrganization({ id: 'org-123', name: 'Test Organization' }); - const mockUsers = [ - createMockUser({ orgid: 'org-123' }), - createMockUser({ orgid: 'org-123', id: 'user-2' }) - ]; - - orgRepo.findById.mockResolvedValue(mockOrg); - userRepo.findByPage.mockResolvedValue({ users: mockUsers, totalCount: 2 }); - - const org = await orgRepo.findById('org-123'); - const orgUsers = await userRepo.findByPage(0, 10); - - expect(org).toBeDefined(); - expect(orgUsers.users).toHaveLength(2); - expect(orgUsers.users.every(user => user.orgid === 'org-123')).toBe(true); - }); - }); -}); diff --git a/SerpentRace_Backend/tests/jest.setup.ts b/SerpentRace_Backend/tests/jest.setup.ts deleted file mode 100644 index 9484f3b9..00000000 --- a/SerpentRace_Backend/tests/jest.setup.ts +++ /dev/null @@ -1,2 +0,0 @@ -// Set the NODE_ENV to test for all Jest tests -process.env.NODE_ENV = 'test'; diff --git a/SerpentRace_Backend/tests/setup.ts b/SerpentRace_Backend/tests/setup.ts deleted file mode 100644 index 7cf900aa..00000000 --- a/SerpentRace_Backend/tests/setup.ts +++ /dev/null @@ -1,26 +0,0 @@ -// Jest test setup file -import { jest } from '@jest/globals'; -import { LoggingService } from '../src/Application/Services/LoggingService'; - -// Mock environment variables -process.env.NODE_ENV = 'test'; -process.env.JWT_SECRET = 'test-jwt-secret'; -process.env.EMAIL_HOST = 'test.smtp.com'; -process.env.EMAIL_PORT = '587'; -process.env.EMAIL_USER = 'test@example.com'; -process.env.EMAIL_PASS = 'testpass'; -process.env.EMAIL_FROM = 'test@example.com'; -process.env.APP_BASE_URL = 'http://localhost:3000'; - -// Global test timeout -jest.setTimeout(10000); - -// Global cleanup to prevent Jest from hanging -afterAll(async () => { - try { - await LoggingService.getInstance().shutdown(); - } catch (error) { - // Ignore cleanup errors in tests - console.log('Test cleanup completed'); - } -}); diff --git a/SerpentRace_Backend/tests/testUtils.ts b/SerpentRace_Backend/tests/testUtils.ts deleted file mode 100644 index dee23ee0..00000000 --- a/SerpentRace_Backend/tests/testUtils.ts +++ /dev/null @@ -1,167 +0,0 @@ -import { UserAggregate, UserState } from '../src/Domain/User/UserAggregate'; -import { OrganizationAggregate, OrganizationState } from '../src/Domain/Organization/OrganizationAggregate'; -import { DeckAggregate, State as DeckState, Type as DeckType, CType } from '../src/Domain/Deck/DeckAggregate'; -import { ContactAggregate, ContactState, ContactType } from '../src/Domain/Contact/ContactAggregate'; -import { IUserRepository } from '../src/Domain/IRepository/IUserRepository'; -import { IOrganizationRepository } from '../src/Domain/IRepository/IOrganizationRepository'; -import { IDeckRepository } from '../src/Domain/IRepository/IDeckRepository'; -import { IContactRepository } from '../src/Domain/IRepository/IContactRepository'; - -export const createMockUser = (overrides: Partial = {}): UserAggregate => ({ - id: '123e4567-e89b-12d3-a456-426614174000', - username: 'testuser', - email: 'test@example.com', - password: 'hashedPassword', - fname: 'Test', - lname: 'User', - orgid: null, - token: null, - TokenExpires: null, - type: 'regular', - phone: null, - state: UserState.REGISTERED_NOT_VERIFIED, - regdate: new Date('2025-01-01'), - updatedate: new Date('2025-01-01'), - Orglogindate: null, - ...overrides -}); - -export const createMockOrganization = (overrides: Partial = {}): OrganizationAggregate => ({ - id: '123e4567-e89b-12d3-a456-426614174001', - name: 'Test Organization', - contactfname: 'John', - contactlname: 'Doe', - contactphone: '+1234567890', - contactemail: 'contact@testorg.com', - state: OrganizationState.ACTIVE, - regdate: new Date('2025-01-01'), - updatedate: new Date('2025-01-01'), - url: null, - userinorg: 0, - maxOrganizationalDecks: 10, - users: [], - ...overrides -}); - -export const createMockDeck = (overrides: Partial = {}): DeckAggregate => ({ - id: '123e4567-e89b-12d3-a456-426614174002', - name: 'Test Deck', - type: DeckType.JOKER, - userid: '123e4567-e89b-12d3-a456-426614174000', - creationdate: new Date('2025-01-01'), - cards: [], - playedNumber: 0, - ctype: CType.PUBLIC, - updatedate: new Date('2025-01-01'), - state: DeckState.ACTIVE, - organization: null, - ...overrides -}); - -export const createMockContact = (overrides: Partial = {}): ContactAggregate => ({ - id: '123e4567-e89b-12d3-a456-426614174003', - name: 'John Doe', - email: 'john.doe@example.com', - userid: '123e4567-e89b-12d3-a456-426614174000', - type: ContactType.QUESTION, - txt: 'This is a test contact message.', - state: ContactState.ACTIVE, - createDate: new Date('2025-01-01'), - updateDate: new Date('2025-01-01'), - adminResponse: null, - responseDate: null, - respondedBy: null, - ...overrides -}); - -export const createMockDate = () => new Date('2025-01-01T00:00:00Z'); - -// Mock Repository Factory Functions -export const createMockUserRepository = (): jest.Mocked => ({ - create: jest.fn(), - findByPage: jest.fn(), - findByPageIncludingDeleted: jest.fn(), - findById: jest.fn(), - findByIdIncludingDeleted: jest.fn(), - findByUsername: jest.fn(), - findByEmail: jest.fn(), - findByToken: jest.fn(), - search: jest.fn(), - searchIncludingDeleted: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - softDelete: jest.fn(), - deactivate: jest.fn(), -} as jest.Mocked); - -export const createMockOrganizationRepository = (): jest.Mocked => ({ - create: jest.fn(), - findByPage: jest.fn(), - findByPageIncludingDeleted: jest.fn(), - findById: jest.fn(), - findByIdIncludingDeleted: jest.fn(), - search: jest.fn(), - searchIncludingDeleted: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - softDelete: jest.fn(), -} as jest.Mocked); - -export const createMockDeckRepository = (): jest.Mocked => ({ - create: jest.fn(), - findByPage: jest.fn(), - findByPageIncludingDeleted: jest.fn(), - findById: jest.fn(), - findByIdIncludingDeleted: jest.fn(), - search: jest.fn(), - searchIncludingDeleted: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - softDelete: jest.fn(), - countActiveByUserId: jest.fn(), - countOrganizationalByUserId: jest.fn(), - findFilteredDecks: jest.fn(), -} as jest.Mocked); - -export const createMockContactRepository = (): jest.Mocked => ({ - create: jest.fn(), - findById: jest.fn(), - findByPage: jest.fn(), - findByPageIncludingDeleted: jest.fn(), - findByIdIncludingDeleted: jest.fn(), - search: jest.fn(), - searchIncludingDeleted: jest.fn(), - update: jest.fn(), - delete: jest.fn(), - softDelete: jest.fn(), -} as jest.Mocked); - -export const createMockJWTService = () => ({ - create: jest.fn(), - verify: jest.fn(), - shouldRefreshToken: jest.fn(), - parseDuration: jest.fn(), -} as any); - -export const createMockTokenService = () => ({ - generateSecureToken: jest.fn(), - generateVerificationToken: jest.fn(), - generatePasswordResetToken: jest.fn(), - isTokenExpired: jest.fn(), - validateToken: jest.fn(), -} as any); - -export const createMockEmailService = () => ({ - sendEmail: jest.fn(), - sendVerificationEmail: jest.fn(), - sendPasswordResetEmail: jest.fn(), - sendContactResponseEmail: jest.fn(), - loadTemplate: jest.fn(), -} as any); - -export const createMockPasswordService = () => ({ - hashPassword: jest.fn(), - verifyPassword: jest.fn(), - validatePasswordStrength: jest.fn(), - generateRandomPassword: jest.fn(), -} as any); diff --git a/SerpentRace_Backend/tsconfig.json b/SerpentRace_Backend/tsconfig.json deleted file mode 100644 index 3b8f8bca..00000000 --- a/SerpentRace_Backend/tsconfig.json +++ /dev/null @@ -1,120 +0,0 @@ -{ - "compilerOptions": { - /* Visit https://aka.ms/tsconfig to read more about this file */ - - /* Projects */ - // "incremental": true, /* Save .tsbuildinfo files to allow for incremental compilation of projects. */ - // "composite": true, /* Enable constraints that allow a TypeScript project to be used with project references. */ - // "tsBuildInfoFile": "./.tsbuildinfo", /* Specify the path to .tsbuildinfo incremental compilation file. */ - // "disableSourceOfProjectReferenceRedirect": true, /* Disable preferring source files instead of declaration files when referencing composite projects. */ - // "disableSolutionSearching": true, /* Opt a project out of multi-project reference checking when editing. */ - // "disableReferencedProjectLoad": true, /* Reduce the number of projects loaded automatically by TypeScript. */ - - /* Language and Environment */ - "target": "ES2020", /* Set the JavaScript language version for emitted JavaScript and include compatible library declarations. */ - "lib": ["ES2020"], /* Specify a set of bundled library declaration files that describe the target runtime environment. */ - // "jsx": "preserve", /* Specify what JSX code is generated. */ - // "libReplacement": true, /* Enable lib replacement. */ - "experimentalDecorators": true, /* Enable experimental support for legacy experimental decorators. */ - "emitDecoratorMetadata": true, /* Emit design-type metadata for decorated declarations in source files. */ - // "jsxFactory": "", /* Specify the JSX factory function used when targeting React JSX emit, e.g. 'React.createElement' or 'h'. */ - // "jsxFragmentFactory": "", /* Specify the JSX Fragment reference used for fragments when targeting React JSX emit e.g. 'React.Fragment' or 'Fragment'. */ - // "jsxImportSource": "", /* Specify module specifier used to import the JSX factory functions when using 'jsx: react-jsx*'. */ - // "reactNamespace": "", /* Specify the object invoked for 'createElement'. This only applies when targeting 'react' JSX emit. */ - // "noLib": true, /* Disable including any library files, including the default lib.d.ts. */ - // "useDefineForClassFields": true, /* Emit ECMAScript-standard-compliant class fields. */ - // "moduleDetection": "auto", /* Control what method is used to detect module-format JS files. */ - - /* Modules */ - "module": "commonjs", /* Specify what module code is generated. */ - // "rootDir": "./", /* Specify the root folder within your source files. */ - // "moduleResolution": "node10", /* Specify how TypeScript looks up a file from a given module specifier. */ - // "baseUrl": "./", /* Specify the base directory to resolve non-relative module names. */ - // "paths": {}, /* Specify a set of entries that re-map imports to additional lookup locations. */ - // "rootDirs": [], /* Allow multiple folders to be treated as one when resolving modules. */ - // "typeRoots": [], /* Specify multiple folders that act like './node_modules/@types'. */ - // "types": [], /* Specify type package names to be included without being referenced in a source file. */ - // "allowUmdGlobalAccess": true, /* Allow accessing UMD globals from modules. */ - // "moduleSuffixes": [], /* List of file name suffixes to search when resolving a module. */ - // "allowImportingTsExtensions": true, /* Allow imports to include TypeScript file extensions. Requires '--moduleResolution bundler' and either '--noEmit' or '--emitDeclarationOnly' to be set. */ - // "rewriteRelativeImportExtensions": true, /* Rewrite '.ts', '.tsx', '.mts', and '.cts' file extensions in relative import paths to their JavaScript equivalent in output files. */ - // "resolvePackageJsonExports": true, /* Use the package.json 'exports' field when resolving package imports. */ - // "resolvePackageJsonImports": true, /* Use the package.json 'imports' field when resolving imports. */ - // "customConditions": [], /* Conditions to set in addition to the resolver-specific defaults when resolving imports. */ - // "noUncheckedSideEffectImports": true, /* Check side effect imports. */ - // "resolveJsonModule": true, /* Enable importing .json files. */ - // "allowArbitraryExtensions": true, /* Enable importing files with any extension, provided a declaration file is present. */ - // "noResolve": true, /* Disallow 'import's, 'require's or ''s from expanding the number of files TypeScript should add to a project. */ - - /* JavaScript Support */ - // "allowJs": true, /* Allow JavaScript files to be a part of your program. Use the 'checkJS' option to get errors from these files. */ - // "checkJs": true, /* Enable error reporting in type-checked JavaScript files. */ - // "maxNodeModuleJsDepth": 1, /* Specify the maximum folder depth used for checking JavaScript files from 'node_modules'. Only applicable with 'allowJs'. */ - - /* Emit */ - "declaration": true, /* Generate .d.ts files from TypeScript and JavaScript files in your project. */ - "declarationMap": true, /* Create sourcemaps for d.ts files. */ - // "emitDeclarationOnly": true, /* Only output d.ts files and not JavaScript files. */ - "sourceMap": true, /* Create source map files for emitted JavaScript files. */ - // "inlineSourceMap": true, /* Include sourcemap files inside the emitted JavaScript. */ - // "noEmit": true, /* Disable emitting files from a compilation. */ - // "outFile": "./", /* Specify a file that bundles all outputs into one JavaScript file. If 'declaration' is true, also designates a file that bundles all .d.ts output. */ - "outDir": "./dist", /* Specify an output folder for all emitted files. */ - // "removeComments": true, /* Disable emitting comments. */ - // "importHelpers": true, /* Allow importing helper functions from tslib once per project, instead of including them per-file. */ - // "downlevelIteration": true, /* Emit more compliant, but verbose and less performant JavaScript for iteration. */ - // "sourceRoot": "", /* Specify the root path for debuggers to find the reference source code. */ - // "mapRoot": "", /* Specify the location where debugger should locate map files instead of generated locations. */ - // "inlineSources": true, /* Include source code in the sourcemaps inside the emitted JavaScript. */ - // "emitBOM": true, /* Emit a UTF-8 Byte Order Mark (BOM) in the beginning of output files. */ - // "newLine": "crlf", /* Set the newline character for emitting files. */ - // "stripInternal": true, /* Disable emitting declarations that have '@internal' in their JSDoc comments. */ - // "noEmitHelpers": true, /* Disable generating custom helper functions like '__extends' in compiled output. */ - // "noEmitOnError": true, /* Disable emitting files if any type checking errors are reported. */ - // "preserveConstEnums": true, /* Disable erasing 'const enum' declarations in generated code. */ - // "declarationDir": "./", /* Specify the output directory for generated declaration files. */ - - /* Interop Constraints */ - // "isolatedModules": true, /* Ensure that each file can be safely transpiled without relying on other imports. */ - // "verbatimModuleSyntax": true, /* Do not transform or elide any imports or exports not marked as type-only, ensuring they are written in the output file's format based on the 'module' setting. */ - // "isolatedDeclarations": true, /* Require sufficient annotation on exports so other tools can trivially generate declaration files. */ - // "erasableSyntaxOnly": true, /* Do not allow runtime constructs that are not part of ECMAScript. */ - // "allowSyntheticDefaultImports": true, /* Allow 'import x from y' when a module doesn't have a default export. */ - "esModuleInterop": true, /* Emit additional JavaScript to ease support for importing CommonJS modules. This enables 'allowSyntheticDefaultImports' for type compatibility. */ - // "preserveSymlinks": true, /* Disable resolving symlinks to their realpath. This correlates to the same flag in node. */ - "forceConsistentCasingInFileNames": true, /* Ensure that casing is correct in imports. */ - - /* Type Checking */ - "strict": true, /* Enable all strict type-checking options. */ - // "noImplicitAny": true, /* Enable error reporting for expressions and declarations with an implied 'any' type. */ - // "strictNullChecks": true, /* When type checking, take into account 'null' and 'undefined'. */ - // "strictFunctionTypes": true, /* When assigning functions, check to ensure parameters and the return values are subtype-compatible. */ - // "strictBindCallApply": true, /* Check that the arguments for 'bind', 'call', and 'apply' methods match the original function. */ - // "strictPropertyInitialization": true, /* Check for class properties that are declared but not set in the constructor. */ - // "strictBuiltinIteratorReturn": true, /* Built-in iterators are instantiated with a 'TReturn' type of 'undefined' instead of 'any'. */ - // "noImplicitThis": true, /* Enable error reporting when 'this' is given the type 'any'. */ - // "useUnknownInCatchVariables": true, /* Default catch clause variables as 'unknown' instead of 'any'. */ - // "alwaysStrict": true, /* Ensure 'use strict' is always emitted. */ - // "noUnusedLocals": true, /* Enable error reporting when local variables aren't read. */ - // "noUnusedParameters": true, /* Raise an error when a function parameter isn't read. */ - // "exactOptionalPropertyTypes": true, /* Interpret optional property types as written, rather than adding 'undefined'. */ - // "noImplicitReturns": true, /* Enable error reporting for codepaths that do not explicitly return in a function. */ - // "noFallthroughCasesInSwitch": true, /* Enable error reporting for fallthrough cases in switch statements. */ - // "noUncheckedIndexedAccess": true, /* Add 'undefined' to a type when accessed using an index. */ - // "noImplicitOverride": true, /* Ensure overriding members in derived classes are marked with an override modifier. */ - // "noPropertyAccessFromIndexSignature": true, /* Enforces using indexed accessors for keys declared using an indexed type. */ - // "allowUnusedLabels": true, /* Disable error reporting for unused labels. */ - // "allowUnreachableCode": true, /* Disable error reporting for unreachable code. */ - - /* Completeness */ - // "skipDefaultLibCheck": true, /* Skip type checking .d.ts files that are included with TypeScript. */ - "skipLibCheck": true /* Skip type checking all .d.ts files. */ - }, - "include": [ - "src/**/*" - ], - "exclude": [ - "node_modules", - "dist" - ] -} \ No newline at end of file diff --git a/SerpentRace_Docker/.env.dev b/SerpentRace_Docker/.env.dev deleted file mode 100644 index 40784ef3..00000000 --- a/SerpentRace_Docker/.env.dev +++ /dev/null @@ -1,17 +0,0 @@ -# Development Environment Variables -POSTGRES_PASSWORD=postgres -JWT_SECRET=dev_jwt_secret_change_in_production_please_use_a_long_random_string -JWT_EXPIRATION=24h -JWT_REFRESH_EXPIRATION=7d -MINIO_ACCESS_KEY=serpentrace -MINIO_SECRET_KEY=serpentrace123! - -# Optional: Email configuration for development -EMAIL_HOST= -EMAIL_PORT= -EMAIL_USER= -EMAIL_PASS= -EMAIL_FROM= - -# Optional: Other development settings -NODE_ENV=development diff --git a/SerpentRace_Docker/.env.example b/SerpentRace_Docker/.env.example deleted file mode 100644 index 44ced9fb..00000000 --- a/SerpentRace_Docker/.env.example +++ /dev/null @@ -1,53 +0,0 @@ -# Production Environment Variables - -# Production settings -NODE_ENV=production - - -#Backend -# Database -DB_HOST=localhost -DB_PORT=5432 -DB_NAME=serpentrace -DB_USERNAME=postgres -DB_PASSWORD=your_password - -# Redis -REDIS_URL=redis://localhost:6379 -REDIS_HOST=localhost -REDIS_PORT=6379 -REDIS_PASSWORD= - -# JWT - Use JWT_EXPIRY (seconds) or JWT_EXPIRATION (duration format like 24h, 7d) -JWT_SECRET=your_jwt_secret_key_here -JWT_EXPIRY=86400 -JWT_EXPIRATION=24h -JWT_REFRESH_EXPIRATION=7d - -# Email -EMAIL_HOST=smtp.example.com -EMAIL_PORT=587 -EMAIL_SECURE=false -EMAIL_USER=your_email@example.com -EMAIL_PASS=your_email_password -EMAIL_FROM="SerpentRace " - -# MinIO Object Storage -MINIO_ENDPOINT=localhost -MINIO_PORT=9000 -MINIO_USE_SSL=false -MINIO_ACCESS_KEY=serpentrace -MINIO_SECRET_KEY=serpentrace123! -MINIO_BUCKET_NAME=serpentrace-logs - -# Application -APP_BASE_URL=http://localhost:3000 -PORT=3000 - -# Chat Limits -CHAT_INACTIVITY_TIMEOUT_MINUTES=30 -CHAT_MAX_MESSAGES_PER_USER=100 -CHAT_MESSAGE_CLEANUP_WEEKS=4 - -# Logging -MAX_LOGS_PER_FILE=10000 \ No newline at end of file diff --git a/SerpentRace_Docker/.env.prod b/SerpentRace_Docker/.env.prod deleted file mode 100644 index fe058f0e..00000000 --- a/SerpentRace_Docker/.env.prod +++ /dev/null @@ -1,53 +0,0 @@ -# Production Environment Variables - -# Production settings -NODE_ENV=production - - -#Backend -# Database -DB_HOST=localhost -DB_PORT=5432 -DB_NAME=serpentrace -DB_USERNAME=postgres -DB_PASSWORD=your_password - -# Redis -REDIS_URL=redis://localhost:6379 -REDIS_HOST=localhost -REDIS_PORT=6379 -REDIS_PASSWORD= - -# JWT - Use JWT_EXPIRY (seconds) or JWT_EXPIRATION (duration format like 24h, 7d) -JWT_SECRET=your_jwt_secret_key_here -JWT_EXPIRY=86400 -JWT_EXPIRATION=24h -JWT_REFRESH_EXPIRATION=7d - -# Email -EMAIL_HOST=smtp.example.com -EMAIL_PORT=587 -EMAIL_SECURE=false -EMAIL_USER=your_email@example.com -EMAIL_PASS=your_email_password -EMAIL_FROM="SerpentRace " - -# MinIO Object Storage -MINIO_ENDPOINT=localhost -MINIO_PORT=9000 -MINIO_USE_SSL=false -MINIO_ACCESS_KEY=serpentrace -MINIO_SECRET_KEY=serpentrace123! -MINIO_BUCKET_NAME=serpentrace-logs - -# Application -APP_BASE_URL=http://localhost:3000 -PORT=3000 - -# Chat Limits -CHAT_INACTIVITY_TIMEOUT_MINUTES=30 -CHAT_MAX_MESSAGES_PER_USER=100 -CHAT_MESSAGE_CLEANUP_WEEKS=4 - -# Logging -MAX_LOGS_PER_FILE=10000 diff --git a/SerpentRace_Docker/DOCKER_README.md b/SerpentRace_Docker/DOCKER_README.md deleted file mode 100644 index 9b004668..00000000 --- a/SerpentRace_Docker/DOCKER_README.md +++ /dev/null @@ -1,267 +0,0 @@ -# SerpentRace Docker Development Environment - -This Docker setup provides a complete development environment for SerpentRace with hot reloading and all necessary services. - -## 🚀 Quick Start - -### Development Environment - -1. **Start the development environment:** - ```bash - # Windows - docker-manage.bat dev:start - - # Linux/Mac - ./docker-manage.sh dev:start - ``` - -2. **Access the applications:** - - **Frontend:** http://localhost:5173 - - **Backend API:** http://localhost:3000 - - **Swagger API Docs:** http://localhost:3000/api-docs - - **PostgreSQL:** localhost:5432 (user: postgres, password: postgres) - - **Redis:** localhost:6379 - - **MinIO Console:** http://localhost:9001 (serpentrace / serpentrace123!) - - **PgAdmin:** http://localhost:8080 (admin@serpentrace.dev / admin) - - **Redis Commander:** http://localhost:8081 - -3. **Stop the environment:** - ```bash - # Windows - docker-manage.bat dev:stop - - # Linux/Mac - ./docker-manage.sh dev:stop - ``` - -### Production Environment - -1. **Configure production environment:** - - Copy `.env.prod` and update all values with secure passwords - - Update JWT secrets and database passwords - -2. **Start production:** - ```bash - # Windows - docker-manage.bat prod:start - - # Linux/Mac - ./docker-manage.sh prod:start - ``` - -## 📁 File Structure - -``` -SzeSnake/ -├── docker-compose.dev.yml # Development environment -├── docker-compose.prod.yml # Production environment -├── docker-manage.sh # Linux/Mac management script -├── docker-manage.bat # Windows management script -├── .env.dev # Development environment variables -├── .env.prod # Production environment variables -├── SerpentRace_Backend/ -│ ├── Dockerfile # Production backend image -│ ├── Dockerfile.dev # Development backend image -│ └── .dockerignore -└── SerpentRace_Frontend/ - ├── Dockerfile # Production frontend image - ├── Dockerfile.dev # Development frontend image - ├── nginx.conf # Nginx configuration for production - └── .dockerignore -``` - -## 🛠 Development Features - -### Hot Reloading -- **Backend:** Uses `nodemon` and `ts-node` for automatic TypeScript compilation and server restart -- **Frontend:** Uses Vite's built-in HMR (Hot Module Replacement) - -### Volume Mapping -- Source code is mounted as volumes for instant file changes -- Node modules are preserved in named volumes for performance - -### Development Tools -- **PgAdmin:** Web-based PostgreSQL administration -- **Redis Commander:** Web-based Redis management -- **MinIO Console:** Object storage management - -### Database Initialization -- Automatic database setup with test data from `sql_dump_with_test_data.sql` - -## 🐳 Docker Services - -### Backend (`backend`) -- **Image:** Node.js 20 Alpine -- **Port:** 3000 -- **Features:** Hot reload, TypeScript support -- **Dependencies:** PostgreSQL, Redis, MinIO - -### Frontend (`frontend`) -- **Image:** Node.js 20 Alpine (dev) / Nginx Alpine (prod) -- **Port:** 5173 (dev) / 80 (prod) -- **Features:** Vite HMR, React Fast Refresh - -### PostgreSQL (`postgres`) -- **Image:** PostgreSQL 15 Alpine -- **Port:** 5432 -- **Database:** serpentrace -- **Credentials:** postgres/postgres (dev) - -### Redis (`redis`) -- **Image:** Redis 7 Alpine -- **Port:** 6379 -- **Features:** Persistence enabled - -### MinIO (`minio`) -- **Image:** MinIO latest -- **Ports:** 9000 (API), 9001 (Console) -- **Features:** S3-compatible object storage - -## 🔧 Management Commands - -### Using the Management Scripts - -```bash -# Start development environment -./docker-manage.sh dev:start - -# Stop development environment -./docker-manage.sh dev:stop - -# View logs for all services -./docker-manage.sh logs - -# View logs for specific service -./docker-manage.sh logs backend -./docker-manage.sh logs frontend - -# Clean up all resources -./docker-manage.sh cleanup - -# Production commands -./docker-manage.sh prod:start -./docker-manage.sh prod:stop -``` - -### Manual Docker Compose Commands - -```bash -# Development -docker-compose -f docker-compose.dev.yml --env-file .env.dev up --build -d -docker-compose -f docker-compose.dev.yml down - -# Production -docker-compose -f docker-compose.prod.yml --env-file .env.prod up --build -d -docker-compose -f docker-compose.prod.yml down - -# View logs -docker-compose -f docker-compose.dev.yml logs -f [service_name] - -# Rebuild specific service -docker-compose -f docker-compose.dev.yml up --build backend - -# Execute commands in running containers -docker-compose -f docker-compose.dev.yml exec backend npm run test -docker-compose -f docker-compose.dev.yml exec postgres psql -U postgres -d serpentrace -``` - -## 🔒 Security Considerations - -### Development -- Default passwords are used for convenience -- Services are exposed on localhost -- Debug tools are included - -### Production -- **IMPORTANT:** Update all passwords in `.env.prod` -- Use strong JWT secrets (256+ characters recommended) -- Services are not directly exposed -- No debug tools included - -## 🐛 Troubleshooting - -### Common Issues - -1. **Port conflicts:** - - Check if ports 3000, 5173, 5432, 6379, 9000, 9001, 8080, 8081 are available - - Modify port mappings in docker-compose files if needed - -2. **File watching issues on Windows:** - - WSL2 is recommended for better file system performance - - Ensure Docker Desktop is configured to use WSL2 - -3. **Database connection issues:** - - Wait for health checks to pass before the application starts - - Check logs: `./docker-manage.sh logs postgres` - -4. **Hot reload not working:** - - Ensure volumes are properly mounted - - Check file permissions on Linux/Mac systems - -### Performance Tips - -1. **Use WSL2 on Windows** for better file system performance -2. **Increase Docker memory** allocation if needed -3. **Use .dockerignore** to exclude unnecessary files -4. **Prune unused Docker resources** regularly: `docker system prune` - -## 📝 Environment Variables - -### Development (.env.dev) -```bash -POSTGRES_PASSWORD=postgres -JWT_SECRET=dev_jwt_secret_change_in_production -MINIO_ACCESS_KEY=serpentrace -MINIO_SECRET_KEY=serpentrace123! -``` - -### Production (.env.prod) -```bash -POSTGRES_PASSWORD=your_secure_password -JWT_SECRET=your_very_long_secure_jwt_secret -MINIO_ACCESS_KEY=your_minio_access_key -MINIO_SECRET_KEY=your_secure_minio_secret -``` - -## 🔄 Health Checks - -All services include health checks to ensure proper startup order: -- **PostgreSQL:** `pg_isready` -- **Redis:** `redis-cli ping` -- **MinIO:** HTTP health endpoint -- **Backend:** HTTP health endpoint -- **Frontend:** HTTP health endpoint (production) - -The application will only start after all dependencies are healthy. - -## 📊 Monitoring - -### Logs -```bash -# All services -./docker-manage.sh logs - -# Specific service -./docker-manage.sh logs backend -./docker-manage.sh logs frontend -./docker-manage.sh logs postgres -``` - -### Service Status -```bash -# Check running containers -docker ps - -# Check service health -docker-compose -f docker-compose.dev.yml ps -``` - -## 🚀 Deployment - -For production deployment: - -1. Update `.env.prod` with secure values -2. Ensure proper firewall configuration -3. Use reverse proxy (nginx/traefik) for SSL termination -4. Consider using Docker Swarm or Kubernetes for orchestration -5. Set up monitoring and backup solutions diff --git a/SerpentRace_Docker/Dockerfile_backend b/SerpentRace_Docker/Dockerfile_backend deleted file mode 100644 index bd7eb7cb..00000000 --- a/SerpentRace_Docker/Dockerfile_backend +++ /dev/null @@ -1,58 +0,0 @@ -# Production Dockerfile for SerpentRace Backend -FROM node:20-alpine AS builder - -# Set working directory -WORKDIR /app - -# Install dependencies needed for native modules -RUN apk add --no-cache python3 make g++ - -# Copy package files -COPY package.json package-lock.json* ./ - -# Install dependencies -RUN npm ci --only=production - -# Copy source code -COPY . . - -# Build the application -RUN npm run build || echo "No build script found" - -# Production stage -FROM node:20-alpine AS production - -# Set working directory -WORKDIR /app - -# Install dependencies needed for native modules -RUN apk add --no-cache python3 make g++ - -# Copy package files -COPY package.json package-lock.json* ./ - -# Install only production dependencies -RUN npm ci --only=production && npm cache clean --force - -# Copy built application or source files -COPY --from=builder /app/src ./src -COPY --from=builder /app/package.json ./ - -# Create logs directory -RUN mkdir -p logs - -# Create non-root user -RUN addgroup -g 1001 -S nodejs -RUN adduser -S serpentrace -u 1001 -RUN chown -R serpentrace:nodejs /app -USER serpentrace - -# Expose port -EXPOSE 3000 - -# Health check -HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD curl -f http://localhost:3000/health || exit 1 - -# Production command -CMD ["npm", "start"] diff --git a/SerpentRace_Docker/Dockerfile_backend.dev b/SerpentRace_Docker/Dockerfile_backend.dev deleted file mode 100644 index 0f977a19..00000000 --- a/SerpentRace_Docker/Dockerfile_backend.dev +++ /dev/null @@ -1,29 +0,0 @@ -# Development Dockerfile for SerpentRace Backend -FROM node:20-alpine - -# Set working directory -WORKDIR /app - -# Install dependencies needed for native modules -RUN apk add --no-cache python3 make g++ - -# Copy package files -COPY package.json package-lock.json* ./ - -# Install dependencies -RUN npm install - -# Install nodemon globally for development -RUN npm install -g nodemon ts-node - -# Copy source code -COPY . . - -# Create logs directory -RUN mkdir -p logs - -# Expose port -EXPOSE 3000 - -# Development command with hot reload -CMD ["npm", "run", "dev"] diff --git a/SerpentRace_Docker/Dockerfile_frontend b/SerpentRace_Docker/Dockerfile_frontend deleted file mode 100644 index 1c96d193..00000000 --- a/SerpentRace_Docker/Dockerfile_frontend +++ /dev/null @@ -1,36 +0,0 @@ -# Production Dockerfile for SerpentRace Frontend -FROM node:20-alpine AS builder - -# Set working directory -WORKDIR /app - -# Copy package files -COPY package.json package-lock.json* ./ - -# Install dependencies -RUN npm ci --only=production - -# Copy source code -COPY . . - -# Build the application -RUN npm run build - -# Production stage with nginx -FROM nginx:alpine AS production - -# Copy built application -COPY --from=builder /app/dist /usr/share/nginx/html - -# Copy nginx configuration -COPY nginx.conf /etc/nginx/conf.d/default.conf - -# Expose port -EXPOSE 80 - -# Health check -HEALTHCHECK --interval=30s --timeout=3s --start-period=5s --retries=3 \ - CMD curl -f http://localhost || exit 1 - -# Start nginx -CMD ["nginx", "-g", "daemon off;"] diff --git a/SerpentRace_Docker/Dockerfile_frontend.dev b/SerpentRace_Docker/Dockerfile_frontend.dev deleted file mode 100644 index c05e37de..00000000 --- a/SerpentRace_Docker/Dockerfile_frontend.dev +++ /dev/null @@ -1,20 +0,0 @@ -# Development Dockerfile for SerpentRace Frontend -FROM node:20-alpine - -# Set working directory -WORKDIR /app - -# Copy package files -COPY package.json package-lock.json* ./ - -# Install dependencies -RUN npm install - -# Copy source code -COPY . . - -# Expose port -EXPOSE 5173 - -# Development command with hot reload -CMD ["npm", "run", "dev", "--", "--host", "0.0.0.0"] diff --git a/SerpentRace_Docker/docker-compose.dev.yml b/SerpentRace_Docker/docker-compose.dev.yml deleted file mode 100644 index 22ab1f9c..00000000 --- a/SerpentRace_Docker/docker-compose.dev.yml +++ /dev/null @@ -1,184 +0,0 @@ -version: '3.8' - -services: - # Backend service with hot reload - backend: - build: - context: ../SerpentRace_Backend - dockerfile: ../SerpentRace_Docker/Dockerfile_backend.dev - container_name: serpentrace-backend-dev - restart: unless-stopped - ports: - - "3000:3000" - environment: - - NODE_ENV=development - - PORT=3000 - - DB_HOST=postgres - - DB_PORT=5432 - - DB_NAME=serpentrace - - DB_USERNAME=postgres - - DB_PASSWORD=postgres - - REDIS_URL=redis://redis:6379 - - REDIS_HOST=redis - - REDIS_PORT=6379 - - JWT_SECRET=dev_jwt_secret_change_in_production - - JWT_EXPIRATION=24h - - JWT_REFRESH_EXPIRATION=7d - - MINIO_ENDPOINT=minio - - MINIO_PORT=9000 - - MINIO_ACCESS_KEY=serpentrace - - MINIO_SECRET_KEY=serpentrace123! - - MINIO_USE_SSL=false - volumes: - - ../SerpentRace_Backend:/app - - /app/node_modules - - ../SerpentRace_Backend/logs:/app/logs - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - minio: - condition: service_healthy - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3000/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - - # Frontend service with hot reload - frontend: - build: - context: ../SerpentRace_Frontend - dockerfile: ../SerpentRace_Docker/Dockerfile_frontend.dev - container_name: serpentrace-frontend-dev - restart: unless-stopped - ports: - - "5173:5173" - environment: - - NODE_ENV=development - - VITE_API_URL=http://localhost:3000 - volumes: - - ../SerpentRace_Frontend:/app - - /app/node_modules - depends_on: - - backend - networks: - - serpentrace-network - - # PostgreSQL Database - postgres: - image: postgres:15-alpine - container_name: serpentrace-postgres-dev - restart: unless-stopped - ports: - - "5432:5432" - environment: - POSTGRES_DB: serpentrace - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_INITDB_ARGS: "--encoding=UTF-8" - volumes: - - postgres_dev_data:/var/lib/postgresql/data - - ./sql_dump_with_test_data.sql:/docker-entrypoint-initdb.d/init.sql:ro - networks: - - serpentrace-network - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 10s - timeout: 5s - retries: 5 - - # Redis Cache - redis: - image: redis:7-alpine - container_name: serpentrace-redis-dev - restart: unless-stopped - ports: - - "6379:6379" - volumes: - - redis_dev_data:/data - command: redis-server --appendonly yes - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 5 - - # MinIO Object Storage - minio: - image: minio/minio:latest - container_name: serpentrace-minio-dev - restart: unless-stopped - ports: - - "9000:9000" - - "9001:9001" - environment: - MINIO_ROOT_USER: serpentrace - MINIO_ROOT_PASSWORD: serpentrace123! - volumes: - - minio_dev_data:/data - command: server /data --console-address ":9001" - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 10s - timeout: 5s - retries: 5 - - # Redis Commander for development debugging - redis-commander: - image: rediscommander/redis-commander:latest - container_name: serpentrace-redis-commander-dev - restart: unless-stopped - ports: - - "8081:8081" - environment: - - REDIS_HOSTS=local:redis:6379 - depends_on: - redis: - condition: service_healthy - networks: - - serpentrace-network - - # Database administration tool - pgadmin: - image: dpage/pgadmin4:latest - container_name: serpentrace-pgadmin-dev - restart: unless-stopped - ports: - - "8080:80" - environment: - PGADMIN_DEFAULT_EMAIL: admin@serpentrace.dev - PGADMIN_DEFAULT_PASSWORD: admin - PGADMIN_CONFIG_SERVER_MODE: 'False' - PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: 'False' - PGADMIN_CONFIG_WTF_CSRF_ENABLED: 'False' - volumes: - - pgadmin_dev_data:/var/lib/pgadmin - - ./pgadmin_servers.json:/pgadmin4/servers.json:ro - depends_on: - postgres: - condition: service_healthy - networks: - - serpentrace-network - -volumes: - postgres_dev_data: - driver: local - redis_dev_data: - driver: local - minio_dev_data: - driver: local - pgadmin_dev_data: - driver: local - -networks: - serpentrace-network: - driver: bridge diff --git a/SerpentRace_Docker/docker-compose.prod.yml b/SerpentRace_Docker/docker-compose.prod.yml deleted file mode 100644 index 8596bd3b..00000000 --- a/SerpentRace_Docker/docker-compose.prod.yml +++ /dev/null @@ -1,141 +0,0 @@ -version: '3.8' - -services: - # Backend service - backend: - build: - context: ../SerpentRace_Backend - dockerfile: ../SerpentRace_Docker/Dockerfile_backend - container_name: serpentrace-backend - restart: unless-stopped - ports: - - "3000:3000" - environment: - - NODE_ENV=production - - PORT=3000 - - DB_HOST=postgres - - DB_PORT=5432 - - DB_NAME=serpentrace - - DB_USERNAME=postgres - - DB_PASSWORD=${POSTGRES_PASSWORD} - - REDIS_URL=redis://redis:6379 - - REDIS_HOST=redis - - REDIS_PORT=6379 - - JWT_SECRET=${JWT_SECRET} - - JWT_EXPIRATION=${JWT_EXPIRATION:-24h} - - JWT_REFRESH_EXPIRATION=${JWT_REFRESH_EXPIRATION:-7d} - - MINIO_ENDPOINT=minio - - MINIO_PORT=9000 - - MINIO_ACCESS_KEY=${MINIO_ACCESS_KEY} - - MINIO_SECRET_KEY=${MINIO_SECRET_KEY} - - MINIO_USE_SSL=false - volumes: - - ../SerpentRace_Backend/logs:/app/logs - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - minio: - condition: service_healthy - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3000/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - - # Frontend service with nginx - frontend: - build: - context: ../SerpentRace_Frontend - dockerfile: ../SerpentRace_Docker/Dockerfile_frontend - container_name: serpentrace-frontend - restart: unless-stopped - ports: - - "80:80" - depends_on: - - backend - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost/health"] - interval: 30s - timeout: 10s - retries: 3 - - # PostgreSQL Database - postgres: - image: postgres:15-alpine - container_name: serpentrace-postgres - restart: unless-stopped - ports: - - "5432:5432" - environment: - POSTGRES_DB: serpentrace - POSTGRES_USER: postgres - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_INITDB_ARGS: "--encoding=UTF-8" - volumes: - - postgres_data:/var/lib/postgresql/data - networks: - - serpentrace-network - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 10s - timeout: 5s - retries: 5 - - # Redis Cache - redis: - image: redis:7-alpine - container_name: serpentrace-redis - restart: unless-stopped - ports: - - "6379:6379" - volumes: - - redis_data:/data - command: redis-server --appendonly yes - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 5 - - # MinIO Object Storage - minio: - image: minio/minio:latest - container_name: serpentrace-minio - restart: unless-stopped - ports: - - "9000:9000" - - "9001:9001" - environment: - MINIO_ROOT_USER: ${MINIO_ACCESS_KEY} - MINIO_ROOT_PASSWORD: ${MINIO_SECRET_KEY} - volumes: - - minio_data:/data - command: server /data --console-address ":9001" - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 10s - timeout: 5s - retries: 5 - -volumes: - postgres_data: - driver: local - redis_data: - driver: local - minio_data: - driver: local - -networks: - serpentrace-network: - driver: bridge diff --git a/SerpentRace_Docker/docker-compose.watch.yml b/SerpentRace_Docker/docker-compose.watch.yml deleted file mode 100644 index f98816fe..00000000 --- a/SerpentRace_Docker/docker-compose.watch.yml +++ /dev/null @@ -1,217 +0,0 @@ -services: - # Backend service with hot reload - backend: - build: - context: ../SerpentRace_Backend - dockerfile: ../SerpentRace_Docker/Dockerfile_backend.dev - container_name: serpentrace-backend-dev - restart: unless-stopped - ports: - - "3000:3000" - environment: - - NODE_ENV=development - - PORT=3000 - - DB_HOST=postgres - - DB_PORT=5432 - - DB_NAME=serpentrace - - DB_USERNAME=postgres - - DB_PASSWORD=postgres - - REDIS_URL=redis://redis:6379 - - REDIS_HOST=redis - - REDIS_PORT=6379 - - JWT_SECRET=dev_jwt_secret_change_in_production - - JWT_EXPIRATION=24h - - JWT_REFRESH_EXPIRATION=7d - - MINIO_ENDPOINT=minio - - MINIO_PORT=9000 - - MINIO_ACCESS_KEY=serpentrace - - MINIO_SECRET_KEY=serpentrace123! - - MINIO_USE_SSL=false - volumes: [ ../SerpentRace_Backend/logs:/app/logs ] - develop: - watch: - - action: sync - path: ../SerpentRace_Backend/src - target: /app/src - ignore: - - node_modules/ - - dist/ - - "*.log" - - action: sync - path: ../SerpentRace_Backend/package.json - target: /app/package.json - - action: rebuild - path: ../SerpentRace_Backend/package-lock.json - - action: rebuild - path: ../SerpentRace_Backend/tsconfig.json - - action: rebuild - path: ./Dockerfile_backend.dev - - depends_on: - postgres: - condition: service_healthy - redis: - condition: service_healthy - minio: - condition: service_healthy - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:3000/health"] - interval: 30s - timeout: 10s - retries: 3 - start_period: 40s - - # Frontend service with hot reload - frontend: - build: - context: ../SerpentRace_Frontend - dockerfile: ../SerpentRace_Docker/Dockerfile_frontend.dev - container_name: serpentrace-frontend-dev - restart: unless-stopped - ports: - - "5173:5173" - environment: - - NODE_ENV=development - - VITE_API_URL=http://localhost:3000 - volumes: [] - develop: - watch: - - action: sync - path: ../SerpentRace_Frontend/src - target: /app/src - ignore: - - node_modules/ - - dist/ - - "*.log" - - action: sync - path: ../SerpentRace_Frontend/public - target: /app/public - - action: sync - path: ../SerpentRace_Frontend/package.json - target: /app/package.json - - action: rebuild - path: ../SerpentRace_Frontend/package-lock.json - - action: rebuild - path: ../SerpentRace_Frontend/vite.config.js - - action: rebuild - path: ./Dockerfile_frontend.dev - depends_on: - - backend - networks: - - serpentrace-network - - # PostgreSQL Database - postgres: - image: postgres:15-alpine - container_name: serpentrace-postgres-dev - restart: unless-stopped - ports: - - "5432:5432" - environment: - POSTGRES_DB: serpentrace - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_INITDB_ARGS: "--encoding=UTF-8" - volumes: - - postgres_dev_data:/var/lib/postgresql/data - - ./sql_dump_with_test_data.sql:/docker-entrypoint-initdb.d/init.sql:ro - networks: - - serpentrace-network - healthcheck: - test: ["CMD-SHELL", "pg_isready -U postgres"] - interval: 10s - timeout: 5s - retries: 5 - - # Redis Cache - redis: - image: redis:7-alpine - container_name: serpentrace-redis-dev - restart: unless-stopped - ports: - - "6379:6379" - volumes: - - redis_dev_data:/data - command: redis-server --appendonly yes - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "redis-cli", "ping"] - interval: 10s - timeout: 5s - retries: 5 - - # MinIO Object Storage - minio: - image: minio/minio:latest - container_name: serpentrace-minio-dev - restart: unless-stopped - ports: - - "9000:9000" - - "9001:9001" - environment: - MINIO_ROOT_USER: serpentrace - MINIO_ROOT_PASSWORD: serpentrace123! - volumes: - - minio_dev_data:/data - command: server /data --console-address ":9001" - networks: - - serpentrace-network - healthcheck: - test: ["CMD", "curl", "-f", "http://localhost:9000/minio/health/live"] - interval: 10s - timeout: 5s - retries: 5 - - # Redis Commander for development debugging - redis-commander: - image: rediscommander/redis-commander:latest - container_name: serpentrace-redis-commander-dev - restart: unless-stopped - ports: - - "8081:8081" - environment: - - REDIS_HOSTS=local:redis:6379 - depends_on: - redis: - condition: service_healthy - networks: - - serpentrace-network - - # Database administration tool - pgadmin: - image: dpage/pgadmin4:latest - container_name: serpentrace-pgadmin-dev - restart: unless-stopped - ports: - - "8080:80" - environment: - PGADMIN_DEFAULT_EMAIL: admin@serpentrace.dev - PGADMIN_DEFAULT_PASSWORD: admin - PGADMIN_CONFIG_SERVER_MODE: 'False' - PGADMIN_CONFIG_MASTER_PASSWORD_REQUIRED: 'False' - PGADMIN_CONFIG_WTF_CSRF_ENABLED: 'False' - volumes: - - pgadmin_dev_data:/var/lib/pgadmin - - ./pgadmin_servers.json:/pgadmin4/servers.json:ro - depends_on: - postgres: - condition: service_healthy - networks: - - serpentrace-network - -volumes: - postgres_dev_data: - driver: local - redis_dev_data: - driver: local - minio_dev_data: - driver: local - pgadmin_dev_data: - driver: local - -networks: - serpentrace-network: - driver: bridge diff --git a/SerpentRace_Docker/docker-manage.bat b/SerpentRace_Docker/docker-manage.bat deleted file mode 100644 index 856d6a97..00000000 --- a/SerpentRace_Docker/docker-manage.bat +++ /dev/null @@ -1,57 +0,0 @@ -```bat -@echo off -setlocal - -rem Define your services here -set SERVICES= - -rem Define the environment file -set ENV_FILE=.env - -rem Load the environment variables -if exist "%ENV_FILE%" ( - for /f "usebackq tokens=*" %%i in ("%ENV_FILE%") do ( - set "%%i" - ) -) - -rem Define the default action -set ACTION=up - -rem Parse command line arguments -:parse_args -if "%~1"=="" goto :end_parse -if "%~1"=="--build" ( - set ACTION=build -) else if "%~1"=="--down" ( - set ACTION=down -) else if "%~1"=="--help" ( - goto :help -) else if "%~1"=="dev:watch" ( - goto :dev_watch -) -shift -goto :parse_args - -:end_parse - -rem Display help -:help -echo Usage: docker-compose-wrapper [options] -echo. -echo Options: -echo --build Build the services -echo --down Stop and remove the containers -echo --help Display this help message -echo dev:watch Start development environment with file watchers -goto :eof - -rem Development watch mode -:dev_watch -echo Starting development environment with file watchers... -docker-compose -f docker-compose.watch.yml up --build -goto :eof - -rem Execute the docker-compose command with the parsed action -%DOCKER_COMPOSE% %ACTION% %SERVICES% -``` \ No newline at end of file diff --git a/SerpentRace_Docker/nginx.conf b/SerpentRace_Docker/nginx.conf deleted file mode 100644 index fa4630a8..00000000 --- a/SerpentRace_Docker/nginx.conf +++ /dev/null @@ -1,60 +0,0 @@ -server { - listen 80; - server_name localhost; - root /usr/share/nginx/html; - index index.html index.htm; - - # Enable gzip compression - gzip on; - gzip_vary on; - gzip_min_length 1024; - gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; - - # Security headers - add_header X-Frame-Options "SAMEORIGIN" always; - add_header X-Content-Type-Options "nosniff" always; - add_header X-XSS-Protection "1; mode=block" always; - - # Handle client routing - location / { - try_files $uri $uri/ /index.html; - } - - # API proxy to backend - location /api/ { - proxy_pass http://backend:3000/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - } - - # WebSocket support - location /socket.io/ { - proxy_pass http://backend:3000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Static assets caching - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - - # Health check endpoint - location /health { - access_log off; - return 200 "healthy\n"; - add_header Content-Type text/plain; - } -} diff --git a/SerpentRace_Docker/pgadmin_servers.json b/SerpentRace_Docker/pgadmin_servers.json deleted file mode 100644 index 828e872e..00000000 --- a/SerpentRace_Docker/pgadmin_servers.json +++ /dev/null @@ -1,24 +0,0 @@ -{ - "Servers": { - "1": { - "Name": "SerpentRace PostgreSQL Dev", - "Group": "Development", - "Host": "postgres", - "Port": 5432, - "MaintenanceDB": "serpentrace", - "Username": "postgres", - "UseSSLMode": "prefer", - "SSLMode": "prefer", - "SSLCompression": 0, - "Timeout": 10, - "UseSSHTunnel": 0, - "TunnelPort": "22", - "TunnelAuthentication": 0, - "KerberosAuthentication": false, - "ConnectionParameters": { - "sslmode": "prefer", - "connect_timeout": "10" - } - } - } -} diff --git a/SerpentRace_Docker/sql_dump_with_test_data.sql b/SerpentRace_Docker/sql_dump_with_test_data.sql deleted file mode 100644 index 43d22db0..00000000 --- a/SerpentRace_Docker/sql_dump_with_test_data.sql +++ /dev/null @@ -1,370 +0,0 @@ --- SerpentRace Backend Database Schema and Test Data --- Generated on: August 22, 2025 --- PostgreSQL Database Dump - --- Enable UUID extension -CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - --- ============================================================================ --- DROP EXISTING TABLES (in reverse dependency order) --- ============================================================================ -DROP TABLE IF EXISTS "ChatArchives"; -DROP TABLE IF EXISTS "Chats"; -DROP TABLE IF EXISTS "Contacts"; -DROP TABLE IF EXISTS "Decks"; -DROP TABLE IF EXISTS "Users"; -DROP TABLE IF EXISTS "Organizations"; -DROP TABLE IF EXISTS "migrations"; - --- ============================================================================ --- CREATE TABLES --- ============================================================================ - --- Organizations Table -CREATE TABLE "Organizations" ( - "id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "name" character varying(255) NOT NULL, - "contactfname" character varying(100) NOT NULL, - "contactlname" character varying(100) NOT NULL, - "contactphone" character varying(20) NOT NULL, - "contactemail" character varying(255) NOT NULL, - "state" integer NOT NULL DEFAULT 0, - "regdate" TIMESTAMP NOT NULL DEFAULT now(), - "updatedate" TIMESTAMP NOT NULL DEFAULT now(), - "url" character varying(500), - "userinorg" integer NOT NULL DEFAULT 0, - "maxOrganizationalDecks" integer, - CONSTRAINT "PK_Organizations" PRIMARY KEY ("id") -); - --- Users Table -CREATE TABLE "Users" ( - "id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "orgid" uuid, - "username" character varying(100) NOT NULL UNIQUE, - "password" character varying(255) NOT NULL, - "email" character varying(255) NOT NULL UNIQUE, - "fname" character varying(100) NOT NULL, - "lname" character varying(100) NOT NULL, - "token" character varying(255), - "TokenExpires" TIMESTAMP, - "type" character varying(50) NOT NULL, - "phone" character varying(20), - "state" integer NOT NULL DEFAULT 0, - "regdate" TIMESTAMP NOT NULL DEFAULT now(), - "updatedate" TIMESTAMP NOT NULL DEFAULT now(), - "Orglogindate" TIMESTAMP, - CONSTRAINT "PK_Users" PRIMARY KEY ("id"), - CONSTRAINT "FK_Users_Organizations" FOREIGN KEY ("orgid") REFERENCES "Organizations"("id") -); - --- Decks Table -CREATE TABLE "Decks" ( - "id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "name" character varying(255) NOT NULL, - "type" integer NOT NULL, - "user_id" uuid NOT NULL, - "creation_date" TIMESTAMP NOT NULL DEFAULT now(), - "cards" json NOT NULL, - "played_number" integer NOT NULL DEFAULT 0, - "ctype" integer NOT NULL DEFAULT 0, - "update_date" TIMESTAMP NOT NULL DEFAULT now(), - "state" integer NOT NULL DEFAULT 0, - "organization_id" uuid, - CONSTRAINT "PK_Decks" PRIMARY KEY ("id"), - CONSTRAINT "FK_Decks_Users" FOREIGN KEY ("user_id") REFERENCES "Users"("id"), - CONSTRAINT "FK_Decks_Organizations" FOREIGN KEY ("organization_id") REFERENCES "Organizations"("id") -); - --- Chats Table -CREATE TABLE "Chats" ( - "id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "users" uuid[] NOT NULL, - "messages" json NOT NULL DEFAULT '[]', - "updateDate" TIMESTAMP NOT NULL DEFAULT now(), - "state" integer NOT NULL DEFAULT 0, - "type" character varying(50) NOT NULL DEFAULT 'direct', - "name" character varying(255), - "gameId" uuid, - "createdBy" uuid, - "lastActivity" TIMESTAMP, - "createDate" TIMESTAMP NOT NULL DEFAULT now(), - "archiveDate" TIMESTAMP, - CONSTRAINT "PK_Chats" PRIMARY KEY ("id") -); - --- Chat Archives Table -CREATE TABLE "ChatArchives" ( - "id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "chatId" uuid NOT NULL, - "archivedMessages" json NOT NULL, - "archivedAt" TIMESTAMP NOT NULL, - "createDate" TIMESTAMP NOT NULL DEFAULT now(), - "chatType" character varying(50) NOT NULL, - "chatName" character varying(255), - "gameId" uuid, - "participants" uuid[] NOT NULL, - CONSTRAINT "PK_ChatArchives" PRIMARY KEY ("id") -); - --- Contacts Table -CREATE TABLE "Contacts" ( - "id" uuid NOT NULL DEFAULT uuid_generate_v4(), - "name" character varying(255) NOT NULL, - "email" character varying(255) NOT NULL, - "userid" uuid, - "type" integer NOT NULL, - "txt" text NOT NULL, - "state" integer NOT NULL DEFAULT 0, - "createDate" TIMESTAMP NOT NULL DEFAULT now(), - "updateDate" TIMESTAMP NOT NULL DEFAULT now(), - "adminResponse" text, - "responseDate" TIMESTAMP, - "respondedBy" uuid, - CONSTRAINT "PK_Contacts" PRIMARY KEY ("id"), - CONSTRAINT "FK_Contacts_Users" FOREIGN KEY ("userid") REFERENCES "Users"("id"), - CONSTRAINT "FK_Contacts_Admins" FOREIGN KEY ("respondedBy") REFERENCES "Users"("id") -); - --- Migrations table (for TypeORM) -CREATE TABLE "migrations" ( - "id" SERIAL NOT NULL, - "timestamp" bigint NOT NULL, - "name" character varying NOT NULL, - CONSTRAINT "PK_migrations" PRIMARY KEY ("id") -); - --- ============================================================================ --- CREATE INDEXES --- ============================================================================ -CREATE INDEX "IDX_DECK_USER_STATE_CTYPE" ON "Decks" ("user_id", "state", "ctype"); -CREATE INDEX "IDX_DECK_ORG_CTYPE_STATE" ON "Decks" ("organization_id", "ctype", "state"); -CREATE INDEX "IDX_USERS_EMAIL" ON "Users" ("email"); -CREATE INDEX "IDX_USERS_USERNAME" ON "Users" ("username"); -CREATE INDEX "IDX_USERS_ORGID" ON "Users" ("orgid"); - --- ============================================================================ --- INSERT TEST DATA --- ============================================================================ - --- Organizations Test Data -INSERT INTO "Organizations" ("id", "name", "contactfname", "contactlname", "contactphone", "contactemail", "state", "regdate", "updatedate", "url", "userinorg", "maxOrganizationalDecks") VALUES -('11111111-1111-1111-1111-111111111111', 'Tech Solutions Inc', 'John', 'Smith', '+1-555-0001', 'john.smith@techsolutions.com', 1, '2024-01-15 10:00:00', '2024-01-15 10:00:00', 'https://techsolutions.com', 5, 20), -('22222222-2222-2222-2222-222222222222', 'Educational Institute', 'Sarah', 'Johnson', '+1-555-0002', 'sarah.johnson@eduinst.edu', 1, '2024-02-01 09:30:00', '2024-02-01 09:30:00', 'https://eduinstitute.edu', 15, 50), -('33333333-3333-3333-3333-333333333333', 'Healthcare Corp', 'Michael', 'Brown', '+1-555-0003', 'michael.brown@healthcorp.com', 0, '2024-03-10 14:20:00', '2024-03-10 14:20:00', NULL, 0, 10); - --- Users Test Data -INSERT INTO "Users" ("id", "orgid", "username", "password", "email", "fname", "lname", "token", "TokenExpires", "type", "phone", "state", "regdate", "updatedate", "Orglogindate") VALUES --- Regular users -('aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', NULL, 'john_doe', '$2b$10$dPXxS9Byg7AbB.fngFtNWel1llS1nHJlQrTO4zQToy7vVitS9mr96', 'john.doe@email.com', 'John', 'Doe', NULL, NULL, 'personal', '+1-555-1001', 1, '2024-01-20 11:00:00', '2024-01-20 11:00:00', NULL), -('bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '11111111-1111-1111-1111-111111111111', 'jane_premium', '$2b$10$dPXxS9Byg7AbB.fngFtNWel1llS1nHJlQrTO4zQToy7vVitS9mr96', 'jane.smith@email.com', 'Jane', 'Smith', NULL, NULL, 'premium', '+1-555-1002', 2, '2024-01-25 12:30:00', '2024-01-25 12:30:00', '2024-01-25 12:30:00'), -('cccccccc-cccc-cccc-cccc-cccccccccccc', '22222222-2222-2222-2222-222222222222', 'teacher_bob', '$2b$10$dPXxS9Byg7AbB.fngFtNWel1llS1nHJlQrTO4zQToy7vVitS9mr96', 'bob.teacher@eduinst.edu', 'Bob', 'Teacher', NULL, NULL, 'premium', '+1-555-1003', 2, '2024-02-05 09:15:00', '2024-02-05 09:15:00', '2024-02-05 09:15:00'), --- Admin user -('dddddddd-dddd-dddd-dddd-dddddddddddd', NULL, 'admin_user', '$2b$10$dPXxS9Byg7AbB.fngFtNWel1llS1nHJlQrTO4zQToy7vVitS9mr96', 'admin@serpentrace.com', 'Admin', 'User', NULL, NULL, 'admin', '+1-555-9999', 5, '2024-01-01 08:00:00', '2024-01-01 08:00:00', NULL), --- Unverified user -('eeeeeeee-eeee-eeee-eeee-eeeeeeeeeeee', NULL, 'new_user', '$2b$10$dPXxS9Byg7AbB.fngFtNWel1llS1nHJlQrTO4zQToy7vVitS9mr96', 'newuser@email.com', 'New', 'User', 'verification_token_12345', '2025-08-23 23:59:59', 'personal', NULL, 0, '2025-08-22 16:00:00', '2025-08-22 16:00:00', NULL); - --- Decks Test Data -INSERT INTO "Decks" ("id", "name", "type", "user_id", "creation_date", "cards", "played_number", "ctype", "update_date", "state", "organization_id") VALUES --- Public decks -('dddd1111-1111-1111-1111-111111111111', 'General Knowledge Quiz', 2, 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '2024-02-01 10:00:00', -'[ - {"id": "c1", "type": 0, "text": "What is the capital of France?", "answer": "Paris", "options": ["London", "Paris", "Berlin", "Madrid"]}, - {"id": "c2", "type": 0, "text": "Which planet is known as the Red Planet?", "answer": "Mars", "options": ["Venus", "Mars", "Jupiter", "Saturn"]}, - {"id": "c3", "type": 1, "text": "The Great Wall of China", "answer": "is visible from space", "options": ["is visible from space", "was built in one century"]}, - {"id": "c4", "type": 2, "text": "Describe the process of photosynthesis", "answer": null}, - {"id": "c5", "type": 3, "text": "The Earth is flat", "answer": false} -]', -25, 0, '2024-02-01 10:00:00', 0, NULL), - -('dddd2222-2222-2222-2222-222222222222', 'Math Fundamentals', 2, 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '2024-02-05 14:30:00', -'[ - {"id": "m1", "type": 0, "text": "What is 2 + 2?", "answer": "4", "options": ["3", "4", "5", "6"]}, - {"id": "m2", "type": 0, "text": "What is the square root of 16?", "answer": "4", "options": ["2", "4", "8", "16"]}, - {"id": "m3", "type": 3, "text": "Pi is approximately 3.14", "answer": true}, - {"id": "m4", "type": 4, "text": "Complete the sequence: 2, 4, 6, ?", "answer": "8"} -]', -15, 0, '2024-02-05 14:30:00', 0, NULL), - --- Private decks -('dddd3333-3333-3333-3333-333333333333', 'My Personal Study Notes', 2, 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '2024-02-10 16:45:00', -'[ - {"id": "p1", "type": 2, "text": "What did I learn about React hooks today?", "answer": null}, - {"id": "p2", "type": 2, "text": "Key points from the management meeting", "answer": null} -]', -3, 1, '2024-02-10 16:45:00', 0, NULL), - --- Organizational decks -('dddd4444-4444-4444-4444-444444444444', 'Company Training Module', 2, 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '2024-02-15 11:20:00', -'[ - {"id": "o1", "type": 0, "text": "What is our company policy on remote work?", "answer": "Flexible hybrid model", "options": ["No remote work", "Full remote", "Flexible hybrid model", "Weekends only"]}, - {"id": "o2", "type": 3, "text": "All employees must attend the monthly all-hands meeting", "answer": true}, - {"id": "o3", "type": 2, "text": "Describe the steps for requesting vacation time", "answer": null} -]', -8, 2, '2024-02-15 11:20:00', 0, '11111111-1111-1111-1111-111111111111'), - -('dddd5555-5555-5555-5555-555555555555', 'Educational Content for Students', 2, 'cccccccc-cccc-cccc-cccc-cccccccccccc', '2024-03-01 08:15:00', -'[ - {"id": "e1", "type": 0, "text": "When did World War II end?", "answer": "1945", "options": ["1943", "1944", "1945", "1946"]}, - {"id": "e2", "type": 1, "text": "Shakespeare wrote", "answer": "Romeo and Juliet", "options": ["Romeo and Juliet", "The Great Gatsby"]}, - {"id": "e3", "type": 3, "text": "The American Revolution began in 1776", "answer": false}, - {"id": "e4", "type": 4, "text": "Name three primary colors", "answer": "Red, Blue, Yellow"} -]', -42, 2, '2024-03-01 08:15:00', 0, '22222222-2222-2222-2222-222222222222'), - --- Joker and Luck type decks -('dddd6666-6666-6666-6666-666666666666', 'Lucky Challenges', 0, 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '2024-03-05 13:40:00', -'[ - {"id": "l1", "type": 4, "text": "Do 10 jumping jacks", "answer": null}, - {"id": "l2", "type": 4, "text": "Name your favorite childhood memory", "answer": null}, - {"id": "l3", "type": 4, "text": "Sing happy birthday", "answer": null} -]', -7, 0, '2024-03-05 13:40:00', 0, NULL), - -('dddd7777-7777-7777-7777-777777777777', 'Wild Cards', 1, 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', '2024-03-08 19:25:00', -'[ - {"id": "j1", "type": 4, "text": "Skip your next turn", "answer": null}, - {"id": "j2", "type": 4, "text": "Draw two extra cards", "answer": null}, - {"id": "j3", "type": 4, "text": "Trade places with another player", "answer": null}, - {"id": "j4", "type": 4, "text": "Double your next score", "answer": null} -]', -12, 0, '2024-03-08 19:25:00', 0, NULL); - --- Chats Test Data -INSERT INTO "Chats" ("id", "users", "messages", "updateDate", "state", "type", "name", "gameId", "createdBy", "lastActivity", "createDate", "archiveDate") VALUES --- Direct message between two users -('chat1111-1111-1111-1111-111111111111', -'{"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"}', -'[ - {"id": "msg1", "date": "2024-03-20T10:30:00Z", "userid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "text": "Hey Jane! How are you doing?"}, - {"id": "msg2", "date": "2024-03-20T10:32:00Z", "userid": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "text": "Hi John! I'\''m great, thanks for asking. How about you?"}, - {"id": "msg3", "date": "2024-03-20T10:35:00Z", "userid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "text": "Doing well! Want to play a quiz game later?"}, - {"id": "msg4", "date": "2024-03-20T10:37:00Z", "userid": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "text": "Absolutely! I'\''ll prepare some questions."} -]', -'2024-03-20 10:37:00', 0, 'direct', NULL, NULL, NULL, '2024-03-20 10:37:00', '2024-03-20 10:30:00', NULL), - --- Group chat for organization -('chat2222-2222-2222-2222-222222222222', -'{"bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "cccccccc-cccc-cccc-cccc-cccccccccccc", "dddddddd-dddd-dddd-dddd-dddddddddddd"}', -'[ - {"id": "msg5", "date": "2024-03-21T14:15:00Z", "userid": "dddddddd-dddd-dddd-dddd-dddddddddddd", "text": "Welcome everyone to the study group!"}, - {"id": "msg6", "date": "2024-03-21T14:16:00Z", "userid": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "text": "Thanks for organizing this!"}, - {"id": "msg7", "date": "2024-03-21T14:18:00Z", "userid": "cccccccc-cccc-cccc-cccc-cccccccccccc", "text": "I'\''ve prepared some educational content to share"}, - {"id": "msg8", "date": "2024-03-21T14:20:00Z", "userid": "dddddddd-dddd-dddd-dddd-dddddddddddd", "text": "Great! Let'\''s start with the basics"} -]', -'2024-03-21 14:20:00', 0, 'group', 'Study Group', NULL, 'dddddddd-dddd-dddd-dddd-dddddddddddd', '2024-03-21 14:20:00', '2024-03-21 14:15:00', NULL), - --- Game chat -('chat3333-3333-3333-3333-333333333333', -'{"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"}', -'[ - {"id": "msg9", "date": "2024-03-22T16:45:00Z", "userid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "text": "Ready to start the quiz game?"}, - {"id": "msg10", "date": "2024-03-22T16:46:00Z", "userid": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "text": "Yes! Let'\''s do this!"}, - {"id": "msg11", "date": "2024-03-22T16:50:00Z", "userid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "text": "Great job on that last question!"}, - {"id": "msg12", "date": "2024-03-22T16:52:00Z", "userid": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "text": "Thanks! This is fun!"} -]', -'2024-03-22 16:52:00', 0, 'game', 'Quiz Game Session', 'game1111-1111-1111-1111-111111111111', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', '2024-03-22 16:52:00', '2024-03-22 16:45:00', NULL); - --- Chat Archives Test Data -INSERT INTO "ChatArchives" ("id", "chatId", "archivedMessages", "archivedAt", "createDate", "chatType", "chatName", "gameId", "participants") VALUES -('arch1111-1111-1111-1111-111111111111', 'chat0000-0000-0000-0000-000000000000', -'[ - {"id": "oldmsg1", "date": "2024-01-15T09:00:00Z", "userid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "text": "This is an old conversation"}, - {"id": "oldmsg2", "date": "2024-01-15T09:05:00Z", "userid": "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb", "text": "Yes, from last month"}, - {"id": "oldmsg3", "date": "2024-01-15T09:10:00Z", "userid": "aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "text": "Good times!"} -]', -'2024-02-15 00:00:00', '2024-02-15 00:00:00', 'direct', NULL, NULL, '{"aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa", "bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb"}'); - --- Contacts Test Data -INSERT INTO "Contacts" ("id", "name", "email", "userid", "type", "txt", "state", "createDate", "updateDate", "adminResponse", "responseDate", "respondedBy") VALUES --- Bug report from registered user -('cont1111-1111-1111-1111-111111111111', 'John Doe', 'john.doe@email.com', 'aaaaaaaa-aaaa-aaaa-aaaa-aaaaaaaaaaaa', 0, 'I found a bug when creating a new deck. The cards are not saving properly when I add more than 10 cards.', 1, '2024-03-18 14:30:00', '2024-03-19 09:15:00', 'Thank you for reporting this issue. We have identified the problem and deployed a fix. Please try creating your deck again.', '2024-03-19 09:15:00', 'dddddddd-dddd-dddd-dddd-dddddddddddd'), - --- General question from anonymous user -('cont2222-2222-2222-2222-222222222222', 'Sarah Wilson', 'sarah.wilson@email.com', NULL, 2, 'Hi, I'\''m interested in using SerpentRace for my classroom. Do you have any educational pricing or features specifically designed for teachers?', 0, '2024-03-19 11:20:00', '2024-03-19 11:20:00', NULL, NULL, NULL), - --- Problem report from premium user -('cont3333-3333-3333-3333-333333333333', 'Jane Smith', 'jane.smith@email.com', 'bbbbbbbb-bbbb-bbbb-bbbb-bbbbbbbbbbbb', 1, 'I'\''m having trouble with the organization deck sharing feature. When I share a deck with my team, they can'\''t see the latest updates I made.', 0, '2024-03-20 16:45:00', '2024-03-20 16:45:00', NULL, NULL, NULL), - --- Sales inquiry -('cont4444-4444-4444-4444-444444444444', 'Michael Chen', 'michael.chen@company.com', NULL, 3, 'Our company is interested in purchasing premium licenses for 50 employees. Could you provide pricing information and enterprise features?', 0, '2024-03-21 10:10:00', '2024-03-21 10:10:00', NULL, NULL, NULL), - --- Other type of contact -('cont5555-5555-5555-5555-555555555555', 'Lisa Johnson', 'lisa.johnson@email.com', NULL, 4, 'I love using SerpentRace! Could you add support for audio questions in the quiz decks? This would be great for language learning.', 0, '2024-03-22 13:25:00', '2024-03-22 13:25:00', NULL, NULL, NULL); - --- Migration entries -INSERT INTO "migrations" ("timestamp", "name") VALUES -(1755691733404, 'test1755691733404'), -(1755706019351, 'AddEmailVerificationFields1755706019351'), -(1755817306222, 'AddChatMessagingSystem1755817306222'), -(1755855028839, 'CreateContactTable1755855028839'), -(1692712800000, 'AddMaxOrganizationalDecksToOrganization1692712800000'); - --- ============================================================================ --- UPDATE ORGANIZATION USER COUNTS --- ============================================================================ -UPDATE "Organizations" SET "userinorg" = ( - SELECT COUNT(*) FROM "Users" WHERE "Users"."orgid" = "Organizations"."id" -); - --- ============================================================================ --- HELPFUL QUERIES FOR TESTING --- ============================================================================ - --- Query to see all users with their organizations --- SELECT u.username, u.email, u.state, o.name as organization_name --- FROM "Users" u --- LEFT JOIN "Organizations" o ON u.orgid = o.id; - --- Query to see deck distribution by type and visibility --- SELECT --- CASE ctype --- WHEN 0 THEN 'Public' --- WHEN 1 THEN 'Private' --- WHEN 2 THEN 'Organization' --- END as deck_type, --- CASE type --- WHEN 0 THEN 'Luck' --- WHEN 1 THEN 'Joker' --- WHEN 2 THEN 'Question' --- END as card_type, --- COUNT(*) as count --- FROM "Decks" --- WHERE state = 0 --- GROUP BY ctype, type --- ORDER BY ctype, type; - --- Query to see active chats with participant count --- SELECT --- id, --- type, --- name, --- array_length(users, 1) as participant_count, --- json_array_length(messages) as message_count, --- lastActivity --- FROM "Chats" --- WHERE state = 0 --- ORDER BY lastActivity DESC; - --- Query to see contact distribution by type and status --- SELECT --- CASE type --- WHEN 0 THEN 'Bug' --- WHEN 1 THEN 'Problem' --- WHEN 2 THEN 'Question' --- WHEN 3 THEN 'Sales' --- WHEN 4 THEN 'Other' --- END as contact_type, --- CASE state --- WHEN 0 THEN 'Active' --- WHEN 1 THEN 'Resolved' --- WHEN 2 THEN 'Deleted' --- END as status, --- COUNT(*) as count --- FROM "Contacts" --- GROUP BY type, state --- ORDER BY type, state; - --- ============================================================================ --- END OF SQL DUMP --- ============================================================================ diff --git a/SerpentRace_Frontend/.dockerignore b/SerpentRace_Frontend/.dockerignore deleted file mode 100644 index 51fba3e0..00000000 --- a/SerpentRace_Frontend/.dockerignore +++ /dev/null @@ -1,27 +0,0 @@ -node_modules -npm-debug.log -.git -.gitignore -README.md -.env -.env.local -.env.development.local -.env.test.local -.env.production.local -.cache -logs -*.log -.DS_Store -.vscode -.idea -*.swp -*.swo -dist -build -.next -.nuxt -.vuepress/dist -.serverless -.fusebox/ -.dynamodb/ -.tern-port diff --git a/SerpentRace_Frontend/.gitignore b/SerpentRace_Frontend/.gitignore deleted file mode 100644 index a547bf36..00000000 --- a/SerpentRace_Frontend/.gitignore +++ /dev/null @@ -1,24 +0,0 @@ -# Logs -logs -*.log -npm-debug.log* -yarn-debug.log* -yarn-error.log* -pnpm-debug.log* -lerna-debug.log* - -node_modules -dist -dist-ssr -*.local - -# Editor directories and files -.vscode/* -!.vscode/extensions.json -.idea -.DS_Store -*.suo -*.ntvs* -*.njsproj -*.sln -*.sw? diff --git a/SerpentRace_Frontend/README.md b/SerpentRace_Frontend/README.md deleted file mode 100644 index 7059a962..00000000 --- a/SerpentRace_Frontend/README.md +++ /dev/null @@ -1,12 +0,0 @@ -# React + Vite - -This template provides a minimal setup to get React working in Vite with HMR and some ESLint rules. - -Currently, two official plugins are available: - -- [@vitejs/plugin-react](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react) uses [Babel](https://babeljs.io/) for Fast Refresh -- [@vitejs/plugin-react-swc](https://github.com/vitejs/vite-plugin-react/blob/main/packages/plugin-react-swc) uses [SWC](https://swc.rs/) for Fast Refresh - -## Expanding the ESLint configuration - -If you are developing a production application, we recommend using TypeScript with type-aware lint rules enabled. Check out the [TS template](https://github.com/vitejs/vite/tree/main/packages/create-vite/template-react-ts) for information on how to integrate TypeScript and [`typescript-eslint`](https://typescript-eslint.io) in your project. diff --git a/SerpentRace_Frontend/eslint.config.js b/SerpentRace_Frontend/eslint.config.js deleted file mode 100644 index ec2b712d..00000000 --- a/SerpentRace_Frontend/eslint.config.js +++ /dev/null @@ -1,33 +0,0 @@ -import js from '@eslint/js' -import globals from 'globals' -import reactHooks from 'eslint-plugin-react-hooks' -import reactRefresh from 'eslint-plugin-react-refresh' - -export default [ - { ignores: ['dist'] }, - { - files: ['**/*.{js,jsx}'], - languageOptions: { - ecmaVersion: 2020, - globals: globals.browser, - parserOptions: { - ecmaVersion: 'latest', - ecmaFeatures: { jsx: true }, - sourceType: 'module', - }, - }, - plugins: { - 'react-hooks': reactHooks, - 'react-refresh': reactRefresh, - }, - rules: { - ...js.configs.recommended.rules, - ...reactHooks.configs.recommended.rules, - 'no-unused-vars': ['error', { varsIgnorePattern: '^[A-Z_]' }], - 'react-refresh/only-export-components': [ - 'warn', - { allowConstantExport: true }, - ], - }, - }, -] diff --git a/SerpentRace_Frontend/index.html b/SerpentRace_Frontend/index.html deleted file mode 100644 index 0c589ecc..00000000 --- a/SerpentRace_Frontend/index.html +++ /dev/null @@ -1,13 +0,0 @@ - - - - - - - Vite + React - - -
- - - diff --git a/SerpentRace_Frontend/nginx.conf b/SerpentRace_Frontend/nginx.conf deleted file mode 100644 index fa4630a8..00000000 --- a/SerpentRace_Frontend/nginx.conf +++ /dev/null @@ -1,60 +0,0 @@ -server { - listen 80; - server_name localhost; - root /usr/share/nginx/html; - index index.html index.htm; - - # Enable gzip compression - gzip on; - gzip_vary on; - gzip_min_length 1024; - gzip_types text/plain text/css text/xml text/javascript application/javascript application/xml+rss application/json; - - # Security headers - add_header X-Frame-Options "SAMEORIGIN" always; - add_header X-Content-Type-Options "nosniff" always; - add_header X-XSS-Protection "1; mode=block" always; - - # Handle client routing - location / { - try_files $uri $uri/ /index.html; - } - - # API proxy to backend - location /api/ { - proxy_pass http://backend:3000/; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection 'upgrade'; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - proxy_cache_bypass $http_upgrade; - } - - # WebSocket support - location /socket.io/ { - proxy_pass http://backend:3000; - proxy_http_version 1.1; - proxy_set_header Upgrade $http_upgrade; - proxy_set_header Connection "upgrade"; - proxy_set_header Host $host; - proxy_set_header X-Real-IP $remote_addr; - proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; - proxy_set_header X-Forwarded-Proto $scheme; - } - - # Static assets caching - location ~* \.(js|css|png|jpg|jpeg|gif|ico|svg)$ { - expires 1y; - add_header Cache-Control "public, immutable"; - } - - # Health check endpoint - location /health { - access_log off; - return 200 "healthy\n"; - add_header Content-Type text/plain; - } -} diff --git a/SerpentRace_Frontend/package-lock.json b/SerpentRace_Frontend/package-lock.json deleted file mode 100644 index d797a5de..00000000 --- a/SerpentRace_Frontend/package-lock.json +++ /dev/null @@ -1,3450 +0,0 @@ -{ - "name": "frontend", - "version": "0.0.0", - "lockfileVersion": 3, - "requires": true, - "packages": { - "": { - "name": "frontend", - "version": "0.0.0", - "dependencies": { - "@tailwindcss/vite": "^4.1.7", - "framer-motion": "^12.19.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-icons": "^5.5.0", - "react-router-dom": "^7.6.0", - "tailwindcss": "^4.1.7" - }, - "devDependencies": { - "@eslint/js": "^9.25.0", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.4.1", - "eslint": "^9.25.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^16.0.0", - "vite": "^6.3.5" - } - }, - "node_modules/@ampproject/remapping": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", - "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "license": "Apache-2.0", - "dependencies": { - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/code-frame": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.27.1.tgz", - "integrity": "sha512-cjQ7ZlQ0Mv3b47hABuTevyTuYN4i+loJKGeV9flcCgIK37cCXRh+L1bd3iBHlynerhQ7BhCkn2BPbQUL+rGqFg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-validator-identifier": "^7.27.1", - "js-tokens": "^4.0.0", - "picocolors": "^1.1.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/compat-data": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.27.2.tgz", - "integrity": "sha512-TUtMJYRPyUb/9aU8f3K0mjmjf6M9N5Woshn2CS6nqJSeJtTtQcpLUXjGt9vbF8ZGff0El99sWkLgzwW3VXnxZQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/core": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.27.1.tgz", - "integrity": "sha512-IaaGWsQqfsQWVLqMn9OB92MNN7zukfVA4s7KKAI0KfrrDsZ0yhi5uV4baBuLuN7n3vsZpwP8asPPcVwApxvjBQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/helper-compilation-targets": "^7.27.1", - "@babel/helper-module-transforms": "^7.27.1", - "@babel/helpers": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1", - "convert-source-map": "^2.0.0", - "debug": "^4.1.0", - "gensync": "^1.0.0-beta.2", - "json5": "^2.2.3", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/babel" - } - }, - "node_modules/@babel/generator": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.27.1.tgz", - "integrity": "sha512-UnJfnIpc/+JO0/+KRVQNGU+y5taA5vCbwN8+azkX6beii/ZF+enZJSOKo11ZSzGJjlNfJHfQtmQT8H+9TXPG2w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.27.1", - "@babel/types": "^7.27.1", - "@jridgewell/gen-mapping": "^0.3.5", - "@jridgewell/trace-mapping": "^0.3.25", - "jsesc": "^3.0.2" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-compilation-targets": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.27.2.tgz", - "integrity": "sha512-2+1thGUUWWjLTYTHZWK1n8Yga0ijBz1XAhUXcKy81rd5g6yh7hGqMp45v7cadSbEHc9G3OTv45SyneRN3ps4DQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/compat-data": "^7.27.2", - "@babel/helper-validator-option": "^7.27.1", - "browserslist": "^4.24.0", - "lru-cache": "^5.1.1", - "semver": "^6.3.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-imports": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.27.1.tgz", - "integrity": "sha512-0gSFWUPNXNopqtIPQvlD5WgXYI5GY2kP2cCvoT8kczjbfcfuIljTbcWrulD1CIPIX2gt1wghbDy08yE1p+/r3w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/traverse": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-module-transforms": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.27.1.tgz", - "integrity": "sha512-9yHn519/8KvTU5BjTVEEeIM3w9/2yXNKoD82JifINImhpKkARMJKPP59kLo+BafpdN5zgNeIcS4jsGDmd3l58g==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-module-imports": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1", - "@babel/traverse": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0" - } - }, - "node_modules/@babel/helper-plugin-utils": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-plugin-utils/-/helper-plugin-utils-7.27.1.tgz", - "integrity": "sha512-1gn1Up5YXka3YYAHGKpbideQ5Yjf1tDa9qYcgysz+cNCXukyLl6DjPXhD3VRwSb8c0J9tA4b2+rHEZtc6R0tlw==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-string-parser": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.27.1.tgz", - "integrity": "sha512-qMlSxKbpRlAridDExk92nSobyDdpPijUq2DW6oDnUqd0iOGxmQjyqhMIihI9+zv4LPyZdRje2cavWPbCbWm3eA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-identifier": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.27.1.tgz", - "integrity": "sha512-D2hP9eA+Sqx1kBZgzxZh0y1trbuU+JoDkiEwqhQ36nodYqJwyEIhPSdMNd7lOm/4io72luTPWH20Yda0xOuUow==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helper-validator-option": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.27.1.tgz", - "integrity": "sha512-YvjJow9FxbhFFKDSuFnVCe2WxXk1zWc22fFePVNEaWJEu8IrZVlda6N0uHwzZrUM1il7NC9Mlp4MaJYbYd9JSg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/helpers": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.27.1.tgz", - "integrity": "sha512-FCvFTm0sWV8Fxhpp2McP5/W53GPllQ9QeQ7SiqGWjMf/LVG07lFa5+pgK05IRhVwtvafT22KF+ZSnM9I545CvQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/parser": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.27.2.tgz", - "integrity": "sha512-QYLs8299NA7WM/bZAdp+CviYYkVoYXlDW2rzliy3chxd1PQjej7JORuMJDJXJUb9g0TT+B99EwaVLKmX+sPXWw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.27.1" - }, - "bin": { - "parser": "bin/babel-parser.js" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.27.1.tgz", - "integrity": "sha512-6UzkCs+ejGdZ5mFFC/OCUrv028ab2fp1znZmCZjAOBKiBK2jXD1O+BPSfX8X2qjJ75fZBMSnQn3Rq2mrBJK2mw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.27.1.tgz", - "integrity": "sha512-zbwoTsBruTeKB9hSq73ha66iFeJHuaFkUbwvqElnygoNbj/jHRsSeokowZFN3CZ64IvEqcmmkVe89OPXc7ldAw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-plugin-utils": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - }, - "peerDependencies": { - "@babel/core": "^7.0.0-0" - } - }, - "node_modules/@babel/template": { - "version": "7.27.2", - "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.27.2.tgz", - "integrity": "sha512-LPDZ85aEJyYSd18/DkjNh4/y1ntkE5KwUHWTiqgRxruuZL2F1yuHligVHLvcHY2vMHXttKFpJn6LwfI7cw7ODw==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/parser": "^7.27.2", - "@babel/types": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.27.1.tgz", - "integrity": "sha512-ZCYtZciz1IWJB4U61UPu4KEaqyfj+r5T1Q5mqPo+IBpcG9kHv30Z0aD8LXPgC1trYa6rK0orRyAhqUgk4MjmEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/code-frame": "^7.27.1", - "@babel/generator": "^7.27.1", - "@babel/parser": "^7.27.1", - "@babel/template": "^7.27.1", - "@babel/types": "^7.27.1", - "debug": "^4.3.1", - "globals": "^11.1.0" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/types": { - "version": "7.27.1", - "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.27.1.tgz", - "integrity": "sha512-+EzkxvLNfiUeKMgy/3luqfsCWFRXLb7U6wNQTk60tovuckwB15B191tJWvpp4HjiQWdJkCxO3Wbvc6jlk3Xb2Q==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/helper-string-parser": "^7.27.1", - "@babel/helper-validator-identifier": "^7.27.1" - }, - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/@esbuild/aix-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.25.4.tgz", - "integrity": "sha512-1VCICWypeQKhVbE9oW/sJaAmjLxhVqacdkvPLEjwlttjfwENRSClS8EjBz0KzRyFSCPDIkuXW34Je/vk7zdB7Q==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "aix" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.25.4.tgz", - "integrity": "sha512-QNdQEps7DfFwE3hXiU4BZeOV68HHzYwGd0Nthhd3uCkkEKK7/R6MTgM0P7H7FAs5pU/DIWsviMmEGxEoxIZ+ZQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.25.4.tgz", - "integrity": "sha512-bBy69pgfhMGtCnwpC/x5QhfxAz/cBgQ9enbtwjf6V9lnPI/hMyT9iWpR1arm0l3kttTr4L0KSLpKmLp/ilKS9A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/android-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.25.4.tgz", - "integrity": "sha512-TVhdVtQIFuVpIIR282btcGC2oGQoSfZfmBdTip2anCaVYcqWlZXGcdcKIUklfX2wj0JklNYgz39OBqh2cqXvcQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.25.4.tgz", - "integrity": "sha512-Y1giCfM4nlHDWEfSckMzeWNdQS31BQGs9/rouw6Ub91tkK79aIMTH3q9xHvzH8d0wDru5Ci0kWB8b3up/nl16g==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/darwin-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.25.4.tgz", - "integrity": "sha512-CJsry8ZGM5VFVeyUYB3cdKpd/H69PYez4eJh1W/t38vzutdjEjtP7hB6eLKBoOdxcAlCtEYHzQ/PJ/oU9I4u0A==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.25.4.tgz", - "integrity": "sha512-yYq+39NlTRzU2XmoPW4l5Ifpl9fqSk0nAJYM/V/WUGPEFfek1epLHJIkTQM6bBs1swApjO5nWgvr843g6TjxuQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/freebsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.25.4.tgz", - "integrity": "sha512-0FgvOJ6UUMflsHSPLzdfDnnBBVoCDtBTVyn/MrWloUNvq/5SFmh13l3dvgRPkDihRxb77Y17MbqbCAa2strMQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.25.4.tgz", - "integrity": "sha512-kro4c0P85GMfFYqW4TWOpvmF8rFShbWGnrLqlzp4X1TNWjRY3JMYUfDCtOxPKOIY8B0WC8HN51hGP4I4hz4AaQ==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.25.4.tgz", - "integrity": "sha512-+89UsQTfXdmjIvZS6nUnOOLoXnkUTB9hR5QAeLrQdzOSWZvNSAXAtcRDHWtqAUtAmv7ZM1WPOOeSxDzzzMogiQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.25.4.tgz", - "integrity": "sha512-yTEjoapy8UP3rv8dB0ip3AfMpRbyhSN3+hY8mo/i4QXFeDxmiYbEKp3ZRjBKcOP862Ua4b1PDfwlvbuwY7hIGQ==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-loong64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.25.4.tgz", - "integrity": "sha512-NeqqYkrcGzFwi6CGRGNMOjWGGSYOpqwCjS9fvaUlX5s3zwOtn1qwg1s2iE2svBe4Q/YOG1q6875lcAoQK/F4VA==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-mips64el": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.25.4.tgz", - "integrity": "sha512-IcvTlF9dtLrfL/M8WgNI/qJYBENP3ekgsHbYUIzEzq5XJzzVEV/fXY9WFPfEEXmu3ck2qJP8LG/p3Q8f7Zc2Xg==", - "cpu": [ - "mips64el" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-ppc64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.25.4.tgz", - "integrity": "sha512-HOy0aLTJTVtoTeGZh4HSXaO6M95qu4k5lJcH4gxv56iaycfz1S8GO/5Jh6X4Y1YiI0h7cRyLi+HixMR+88swag==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-riscv64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.25.4.tgz", - "integrity": "sha512-i8JUDAufpz9jOzo4yIShCTcXzS07vEgWzyX3NH2G7LEFVgrLEhjwL3ajFE4fZI3I4ZgiM7JH3GQ7ReObROvSUA==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-s390x": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.25.4.tgz", - "integrity": "sha512-jFnu+6UbLlzIjPQpWCNh5QtrcNfMLjgIavnwPQAfoGx4q17ocOU9MsQ2QVvFxwQoWpZT8DvTLooTvmOQXkO51g==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/linux-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.25.4.tgz", - "integrity": "sha512-6e0cvXwzOnVWJHq+mskP8DNSrKBr1bULBvnFLpc1KY+d+irZSgZ02TGse5FsafKS5jg2e4pbvK6TPXaF/A6+CA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-arm64/-/netbsd-arm64-0.25.4.tgz", - "integrity": "sha512-vUnkBYxZW4hL/ie91hSqaSNjulOnYXE1VSLusnvHg2u3jewJBz3YzB9+oCw8DABeVqZGg94t9tyZFoHma8gWZQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/netbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.25.4.tgz", - "integrity": "sha512-XAg8pIQn5CzhOB8odIcAm42QsOfa98SBeKUdo4xa8OvX8LbMZqEtgeWE9P/Wxt7MlG2QqvjGths+nq48TrUiKw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "netbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-arm64/-/openbsd-arm64-0.25.4.tgz", - "integrity": "sha512-Ct2WcFEANlFDtp1nVAXSNBPDxyU+j7+tId//iHXU2f/lN5AmO4zLyhDcpR5Cz1r08mVxzt3Jpyt4PmXQ1O6+7A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/openbsd-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.25.4.tgz", - "integrity": "sha512-xAGGhyOQ9Otm1Xu8NT1ifGLnA6M3sJxZ6ixylb+vIUVzvvd6GOALpwQrYrtlPouMqd/vSbgehz6HaVk4+7Afhw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "openbsd" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/sunos-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.25.4.tgz", - "integrity": "sha512-Mw+tzy4pp6wZEK0+Lwr76pWLjrtjmJyUB23tHKqEDP74R3q95luY/bXqXZeYl4NYlvwOqoRKlInQialgCKy67Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "sunos" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-arm64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.25.4.tgz", - "integrity": "sha512-AVUP428VQTSddguz9dO9ngb+E5aScyg7nOeJDrF1HPYu555gmza3bDGMPhmVXL8svDSoqPCsCPjb265yG/kLKQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-ia32": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.25.4.tgz", - "integrity": "sha512-i1sW+1i+oWvQzSgfRcxxG2k4I9n3O9NRqy8U+uugaT2Dy7kLO9Y7wI72haOahxceMX8hZAzgGou1FhndRldxRg==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@esbuild/win32-x64": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.25.4.tgz", - "integrity": "sha512-nOT2vZNw6hJ+z43oP1SPea/G/6AbN6X+bGNhNuq8NtRHy4wsMhw765IKLNmnjek7GvjWBYQ8Q5VBoYTFg9y1UQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">=18" - } - }, - "node_modules/@eslint-community/eslint-utils": { - "version": "4.7.0", - "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.7.0.tgz", - "integrity": "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw==", - "dev": true, - "license": "MIT", - "dependencies": { - "eslint-visitor-keys": "^3.4.3" - }, - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - }, - "peerDependencies": { - "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" - } - }, - "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint-community/regexpp": { - "version": "4.12.1", - "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.12.1.tgz", - "integrity": "sha512-CCZCDJuduB9OUkFkY2IgppNZMi2lBQgD2qzwXkEia16cge2pijY/aXi96CJMquDMn3nJdlPV1A5KrJEXwfLNzQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": "^12.0.0 || ^14.0.0 || >=16.0.0" - } - }, - "node_modules/@eslint/config-array": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/@eslint/config-array/-/config-array-0.21.0.tgz", - "integrity": "sha512-ENIdc4iLu0d93HeYirvKmrzshzofPw6VkZRKQGe9Nv46ZnWUzcF1xV01dcvEg/1wXUR61OmmlSfyeyO7EvjLxQ==", - "dev": true, - "dependencies": { - "@eslint/object-schema": "^2.1.6", - "debug": "^4.3.1", - "minimatch": "^3.1.2" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/config-helpers": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/@eslint/config-helpers/-/config-helpers-0.3.0.tgz", - "integrity": "sha512-ViuymvFmcJi04qdZeDc2whTHryouGcDlaxPqarTD0ZE10ISpxGUVZGZDx4w01upyIynL3iu6IXH2bS1NhclQMw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/core": { - "version": "0.15.1", - "resolved": "https://registry.npmjs.org/@eslint/core/-/core-0.15.1.tgz", - "integrity": "sha512-bkOp+iumZCCbt1K1CmWf0R9pM5yKpDv+ZXtvSyQpudrI9kuFLp+bM2WOPXImuD/ceQuaa8f5pj93Y7zyECIGNA==", - "dev": true, - "dependencies": { - "@types/json-schema": "^7.0.15" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/eslintrc": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-3.3.1.tgz", - "integrity": "sha512-gtF186CXhIl1p4pJNGZw8Yc6RlshoePRvE0X91oPGb3vZ8pM3qOS9W9NGPat9LziaBV7XrJWGylNQXkGcnM3IQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ajv": "^6.12.4", - "debug": "^4.3.2", - "espree": "^10.0.1", - "globals": "^14.0.0", - "ignore": "^5.2.0", - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "minimatch": "^3.1.2", - "strip-json-comments": "^3.1.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/@eslint/eslintrc/node_modules/globals": { - "version": "14.0.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-14.0.0.tgz", - "integrity": "sha512-oahGvuMGQlPw/ivIYBjVSrWAfWLBeku5tpPE2fOPLi+WHffIWbuh2tCjhyQhTBPMf5E9jDEH4FOmTYgYwbKwtQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/@eslint/js": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/@eslint/js/-/js-9.31.0.tgz", - "integrity": "sha512-LOm5OVt7D4qiKCqoiPbA7LWmI+tbw1VbTUowBcUMgQSuM6poJufkFkYDcQpo5KfgD39TnNySV26QjOh7VFpSyw==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - } - }, - "node_modules/@eslint/object-schema": { - "version": "2.1.6", - "resolved": "https://registry.npmjs.org/@eslint/object-schema/-/object-schema-2.1.6.tgz", - "integrity": "sha512-RBMg5FRL0I0gs51M/guSAj5/e14VQ4tpZnQNWwuDT66P14I43ItmPfIZRhO9fUVIPOAQXU47atlywZ/czoqFPA==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@eslint/plugin-kit": { - "version": "0.3.4", - "resolved": "https://registry.npmjs.org/@eslint/plugin-kit/-/plugin-kit-0.3.4.tgz", - "integrity": "sha512-Ul5l+lHEcw3L5+k8POx6r74mxEYKG5kOb6Xpy2gCRW6zweT6TEhAf8vhxGgjhqrd/VO/Dirhsb+1hNpD1ue9hw==", - "dev": true, - "dependencies": { - "@eslint/core": "^0.15.1", - "levn": "^0.4.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - } - }, - "node_modules/@humanfs/core": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@humanfs/core/-/core-0.19.1.tgz", - "integrity": "sha512-5DyQ4+1JEUzejeK1JGICcideyfUbGixgS9jNgex5nqkW+cY7WZhxBigmieN5Qnw9ZosSNVC9KQKyb+GUaGyKUA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node": { - "version": "0.16.6", - "resolved": "https://registry.npmjs.org/@humanfs/node/-/node-0.16.6.tgz", - "integrity": "sha512-YuI2ZHQL78Q5HbhDiBA1X4LmYdXCKCMQIfw0pw7piHJwyREFebJUvrQN4cMssyES6x+vfUbx1CIpaQUKYdQZOw==", - "dev": true, - "license": "Apache-2.0", - "dependencies": { - "@humanfs/core": "^0.19.1", - "@humanwhocodes/retry": "^0.3.0" - }, - "engines": { - "node": ">=18.18.0" - } - }, - "node_modules/@humanfs/node/node_modules/@humanwhocodes/retry": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.3.1.tgz", - "integrity": "sha512-JBxkERygn7Bv/GbN5Rv8Ul6LVknS+5Bp6RgDC/O8gEBU/yeH5Ui5C/OlWrTb6qct7LjjfT6Re2NxB0ln0yYybA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/module-importer": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", - "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=12.22" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@humanwhocodes/retry": { - "version": "0.4.3", - "resolved": "https://registry.npmjs.org/@humanwhocodes/retry/-/retry-0.4.3.tgz", - "integrity": "sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==", - "dev": true, - "license": "Apache-2.0", - "engines": { - "node": ">=18.18" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/nzakas" - } - }, - "node_modules/@isaacs/fs-minipass": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/@isaacs/fs-minipass/-/fs-minipass-4.0.1.tgz", - "integrity": "sha512-wgm9Ehl2jpeqP3zw/7mo3kRHFp5MEDhqAdwy1fTGkHAwnkGOVsgpvQhL8B5n1qlb01jV3n/bI0ZfZp5lWA1k4w==", - "license": "ISC", - "dependencies": { - "minipass": "^7.0.4" - }, - "engines": { - "node": ">=18.0.0" - } - }, - "node_modules/@jridgewell/gen-mapping": { - "version": "0.3.8", - "resolved": "https://registry.npmjs.org/@jridgewell/gen-mapping/-/gen-mapping-0.3.8.tgz", - "integrity": "sha512-imAbBGkb+ebQyxKgzv5Hu2nmROxoDOXHh80evxdoXNOrvAnVx7zimzc1Oo5h9RlfV4vPXaE2iM5pOFbvOCClWA==", - "license": "MIT", - "dependencies": { - "@jridgewell/set-array": "^1.2.1", - "@jridgewell/sourcemap-codec": "^1.4.10", - "@jridgewell/trace-mapping": "^0.3.24" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/resolve-uri": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/@jridgewell/resolve-uri/-/resolve-uri-3.1.2.tgz", - "integrity": "sha512-bRISgCIjP20/tbWSPWMEi54QVPRZExkuD9lJL+UIxUKtwVJA8wW1Trb1jMs1RFXo1CBTNZ/5hpC9QvmKWdopKw==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/set-array": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/@jridgewell/set-array/-/set-array-1.2.1.tgz", - "integrity": "sha512-R8gLRTZeyp03ymzP/6Lil/28tGeGEzhx1q2k703KGWRAI1VdvPIXdG70VJc2pAMw3NA6JKL5hhFu1sJX0Mnn/A==", - "license": "MIT", - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/@jridgewell/sourcemap-codec": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@jridgewell/sourcemap-codec/-/sourcemap-codec-1.5.0.tgz", - "integrity": "sha512-gv3ZRaISU3fjPAgNsriBRqGWQL6quFx04YMPW/zD8XMLsU32mhCCbfbO6KZFLjvYpCZ8zyDEgqsgf+PwPaM7GQ==", - "license": "MIT" - }, - "node_modules/@jridgewell/trace-mapping": { - "version": "0.3.25", - "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.25.tgz", - "integrity": "sha512-vNk6aEwybGtawWmy/PzwnGDOjCkLWSD2wqvjGGAgOAwCGWySYXfYoxt00IJkTF+8Lb57DwOb3Aa0o9CApepiYQ==", - "license": "MIT", - "dependencies": { - "@jridgewell/resolve-uri": "^3.1.0", - "@jridgewell/sourcemap-codec": "^1.4.14" - } - }, - "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.40.2.tgz", - "integrity": "sha512-JkdNEq+DFxZfUwxvB58tHMHBHVgX23ew41g1OQinthJ+ryhdRk67O31S7sYw8u2lTjHUPFxwar07BBt1KHp/hg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-android-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.40.2.tgz", - "integrity": "sha512-13unNoZ8NzUmnndhPTkWPWbX3vtHodYmy+I9kuLxN+F+l+x3LdVF7UCu8TWVMt1POHLh6oDHhnOA04n8oJZhBw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ] - }, - "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.40.2.tgz", - "integrity": "sha512-Gzf1Hn2Aoe8VZzevHostPX23U7N5+4D36WJNHK88NZHCJr7aVMG4fadqkIf72eqVPGjGc0HJHNuUaUcxiR+N/w==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.40.2.tgz", - "integrity": "sha512-47N4hxa01a4x6XnJoskMKTS8XZ0CZMd8YTbINbi+w03A2w4j1RTlnGHOz/P0+Bg1LaVL6ufZyNprSg+fW5nYQQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ] - }, - "node_modules/@rollup/rollup-freebsd-arm64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-arm64/-/rollup-freebsd-arm64-4.40.2.tgz", - "integrity": "sha512-8t6aL4MD+rXSHHZUR1z19+9OFJ2rl1wGKvckN47XFRVO+QL/dUSpKA2SLRo4vMg7ELA8pzGpC+W9OEd1Z/ZqoQ==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-freebsd-x64": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-freebsd-x64/-/rollup-freebsd-x64-4.40.2.tgz", - "integrity": "sha512-C+AyHBzfpsOEYRFjztcYUFsH4S7UsE9cDtHCtma5BK8+ydOZYgMmWg1d/4KBytQspJCld8ZIujFMAdKG1xyr4Q==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ] - }, - "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.40.2.tgz", - "integrity": "sha512-de6TFZYIvJwRNjmW3+gaXiZ2DaWL5D5yGmSYzkdzjBDS3W+B9JQ48oZEsmMvemqjtAFzE16DIBLqd6IQQRuG9Q==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm-musleabihf": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-musleabihf/-/rollup-linux-arm-musleabihf-4.40.2.tgz", - "integrity": "sha512-urjaEZubdIkacKc930hUDOfQPysezKla/O9qV+O89enqsqUmQm8Xj8O/vh0gHg4LYfv7Y7UsE3QjzLQzDYN1qg==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.40.2.tgz", - "integrity": "sha512-KlE8IC0HFOC33taNt1zR8qNlBYHj31qGT1UqWqtvR/+NuCVhfufAq9fxO8BMFC22Wu0rxOwGVWxtCMvZVLmhQg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.40.2.tgz", - "integrity": "sha512-j8CgxvfM0kbnhu4XgjnCWJQyyBOeBI1Zq91Z850aUddUmPeQvuAy6OiMdPS46gNFgy8gN1xkYyLgwLYZG3rBOg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-loongarch64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-loongarch64-gnu/-/rollup-linux-loongarch64-gnu-4.40.2.tgz", - "integrity": "sha512-Ybc/1qUampKuRF4tQXc7G7QY9YRyeVSykfK36Y5Qc5dmrIxwFhrOzqaVTNoZygqZ1ZieSWTibfFhQ5qK8jpWxw==", - "cpu": [ - "loong64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.40.2.tgz", - "integrity": "sha512-3FCIrnrt03CCsZqSYAOW/k9n625pjpuMzVfeI+ZBUSDT3MVIFDSPfSUgIl9FqUftxcUXInvFah79hE1c9abD+Q==", - "cpu": [ - "ppc64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.40.2.tgz", - "integrity": "sha512-QNU7BFHEvHMp2ESSY3SozIkBPaPBDTsfVNGx3Xhv+TdvWXFGOSH2NJvhD1zKAT6AyuuErJgbdvaJhYVhVqrWTg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-riscv64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-musl/-/rollup-linux-riscv64-musl-4.40.2.tgz", - "integrity": "sha512-5W6vNYkhgfh7URiXTO1E9a0cy4fSgfE4+Hl5agb/U1sa0kjOLMLC1wObxwKxecE17j0URxuTrYZZME4/VH57Hg==", - "cpu": [ - "riscv64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-s390x-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.40.2.tgz", - "integrity": "sha512-B7LKIz+0+p348JoAL4X/YxGx9zOx3sR+o6Hj15Y3aaApNfAshK8+mWZEf759DXfRLeL2vg5LYJBB7DdcleYCoQ==", - "cpu": [ - "s390x" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.40.2.tgz", - "integrity": "sha512-lG7Xa+BmBNwpjmVUbmyKxdQJ3Q6whHjMjzQplOs5Z+Gj7mxPtWakGHqzMqNER68G67kmCX9qX57aRsW5V0VOng==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.40.2.tgz", - "integrity": "sha512-tD46wKHd+KJvsmije4bUskNuvWKFcTOIM9tZ/RrmIvcXnbi0YK/cKS9FzFtAm7Oxi2EhV5N2OpfFB348vSQRXA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ] - }, - "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.40.2.tgz", - "integrity": "sha512-Bjv/HG8RRWLNkXwQQemdsWw4Mg+IJ29LK+bJPW2SCzPKOUaMmPEppQlu/Fqk1d7+DX3V7JbFdbkh/NMmurT6Pg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.40.2.tgz", - "integrity": "sha512-dt1llVSGEsGKvzeIO76HToiYPNPYPkmjhMHhP00T9S4rDern8P2ZWvWAQUEJ+R1UdMWJ/42i/QqJ2WV765GZcA==", - "cpu": [ - "ia32" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.40.2.tgz", - "integrity": "sha512-bwspbWB04XJpeElvsp+DCylKfF4trJDa2Y9Go8O6A7YLX2LIKGcNK/CYImJN6ZP4DcuOHB4Utl3iCbnR62DudA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ] - }, - "node_modules/@tailwindcss/node": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/node/-/node-4.1.7.tgz", - "integrity": "sha512-9rsOpdY9idRI2NH6CL4wORFY0+Q6fnx9XP9Ju+iq/0wJwGD5IByIgFmwVbyy4ymuyprj8Qh4ErxMKTUL4uNh3g==", - "license": "MIT", - "dependencies": { - "@ampproject/remapping": "^2.3.0", - "enhanced-resolve": "^5.18.1", - "jiti": "^2.4.2", - "lightningcss": "1.30.1", - "magic-string": "^0.30.17", - "source-map-js": "^1.2.1", - "tailwindcss": "4.1.7" - } - }, - "node_modules/@tailwindcss/oxide": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide/-/oxide-4.1.7.tgz", - "integrity": "sha512-5SF95Ctm9DFiUyjUPnDGkoKItPX/k+xifcQhcqX5RA85m50jw1pT/KzjdvlqxRja45Y52nR4MR9fD1JYd7f8NQ==", - "hasInstallScript": true, - "license": "MIT", - "dependencies": { - "detect-libc": "^2.0.4", - "tar": "^7.4.3" - }, - "engines": { - "node": ">= 10" - }, - "optionalDependencies": { - "@tailwindcss/oxide-android-arm64": "4.1.7", - "@tailwindcss/oxide-darwin-arm64": "4.1.7", - "@tailwindcss/oxide-darwin-x64": "4.1.7", - "@tailwindcss/oxide-freebsd-x64": "4.1.7", - "@tailwindcss/oxide-linux-arm-gnueabihf": "4.1.7", - "@tailwindcss/oxide-linux-arm64-gnu": "4.1.7", - "@tailwindcss/oxide-linux-arm64-musl": "4.1.7", - "@tailwindcss/oxide-linux-x64-gnu": "4.1.7", - "@tailwindcss/oxide-linux-x64-musl": "4.1.7", - "@tailwindcss/oxide-wasm32-wasi": "4.1.7", - "@tailwindcss/oxide-win32-arm64-msvc": "4.1.7", - "@tailwindcss/oxide-win32-x64-msvc": "4.1.7" - } - }, - "node_modules/@tailwindcss/oxide-android-arm64": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-android-arm64/-/oxide-android-arm64-4.1.7.tgz", - "integrity": "sha512-IWA410JZ8fF7kACus6BrUwY2Z1t1hm0+ZWNEzykKmMNM09wQooOcN/VXr0p/WJdtHZ90PvJf2AIBS/Ceqx1emg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "android" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-arm64": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-arm64/-/oxide-darwin-arm64-4.1.7.tgz", - "integrity": "sha512-81jUw9To7fimGGkuJ2W5h3/oGonTOZKZ8C2ghm/TTxbwvfSiFSDPd6/A/KE2N7Jp4mv3Ps9OFqg2fEKgZFfsvg==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-darwin-x64": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-darwin-x64/-/oxide-darwin-x64-4.1.7.tgz", - "integrity": "sha512-q77rWjEyGHV4PdDBtrzO0tgBBPlQWKY7wZK0cUok/HaGgbNKecegNxCGikuPJn5wFAlIywC3v+WMBt0PEBtwGw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-freebsd-x64": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-freebsd-x64/-/oxide-freebsd-x64-4.1.7.tgz", - "integrity": "sha512-RfmdbbK6G6ptgF4qqbzoxmH+PKfP4KSVs7SRlTwcbRgBwezJkAO3Qta/7gDy10Q2DcUVkKxFLXUQO6J3CRvBGw==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm-gnueabihf": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm-gnueabihf/-/oxide-linux-arm-gnueabihf-4.1.7.tgz", - "integrity": "sha512-OZqsGvpwOa13lVd1z6JVwQXadEobmesxQ4AxhrwRiPuE04quvZHWn/LnihMg7/XkN+dTioXp/VMu/p6A5eZP3g==", - "cpu": [ - "arm" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-gnu": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-gnu/-/oxide-linux-arm64-gnu-4.1.7.tgz", - "integrity": "sha512-voMvBTnJSfKecJxGkoeAyW/2XRToLZ227LxswLAwKY7YslG/Xkw9/tJNH+3IVh5bdYzYE7DfiaPbRkSHFxY1xA==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-arm64-musl": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-arm64-musl/-/oxide-linux-arm64-musl-4.1.7.tgz", - "integrity": "sha512-PjGuNNmJeKHnP58M7XyjJyla8LPo+RmwHQpBI+W/OxqrwojyuCQ+GUtygu7jUqTEexejZHr/z3nBc/gTiXBj4A==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-gnu": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-gnu/-/oxide-linux-x64-gnu-4.1.7.tgz", - "integrity": "sha512-HMs+Va+ZR3gC3mLZE00gXxtBo3JoSQxtu9lobbZd+DmfkIxR54NO7Z+UQNPsa0P/ITn1TevtFxXTpsRU7qEvWg==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-linux-x64-musl": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-linux-x64-musl/-/oxide-linux-x64-musl-4.1.7.tgz", - "integrity": "sha512-MHZ6jyNlutdHH8rd+YTdr3QbXrHXqwIhHw9e7yXEBcQdluGwhpQY2Eku8UZK6ReLaWtQ4gijIv5QoM5eE+qlsA==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-wasm32-wasi": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-wasm32-wasi/-/oxide-wasm32-wasi-4.1.7.tgz", - "integrity": "sha512-ANaSKt74ZRzE2TvJmUcbFQ8zS201cIPxUDm5qez5rLEwWkie2SkGtA4P+GPTj+u8N6JbPrC8MtY8RmJA35Oo+A==", - "bundleDependencies": [ - "@napi-rs/wasm-runtime", - "@emnapi/core", - "@emnapi/runtime", - "@tybys/wasm-util", - "@emnapi/wasi-threads", - "tslib" - ], - "cpu": [ - "wasm32" - ], - "license": "MIT", - "optional": true, - "dependencies": { - "@emnapi/core": "^1.4.3", - "@emnapi/runtime": "^1.4.3", - "@emnapi/wasi-threads": "^1.0.2", - "@napi-rs/wasm-runtime": "^0.2.9", - "@tybys/wasm-util": "^0.9.0", - "tslib": "^2.8.0" - }, - "engines": { - "node": ">=14.0.0" - } - }, - "node_modules/@tailwindcss/oxide-win32-arm64-msvc": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-arm64-msvc/-/oxide-win32-arm64-msvc-4.1.7.tgz", - "integrity": "sha512-HUiSiXQ9gLJBAPCMVRk2RT1ZrBjto7WvqsPBwUrNK2BcdSxMnk19h4pjZjI7zgPhDxlAbJSumTC4ljeA9y0tEw==", - "cpu": [ - "arm64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/oxide-win32-x64-msvc": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/oxide-win32-x64-msvc/-/oxide-win32-x64-msvc-4.1.7.tgz", - "integrity": "sha512-rYHGmvoHiLJ8hWucSfSOEmdCBIGZIq7SpkPRSqLsH2Ab2YUNgKeAPT1Fi2cx3+hnYOrAb0jp9cRyode3bBW4mQ==", - "cpu": [ - "x64" - ], - "license": "MIT", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 10" - } - }, - "node_modules/@tailwindcss/vite": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/@tailwindcss/vite/-/vite-4.1.7.tgz", - "integrity": "sha512-tYa2fO3zDe41I7WqijyVbRd8oWT0aEID1Eokz5hMT6wShLIHj3yvwj9XbfuloHP9glZ6H+aG2AN/+ZrxJ1Y5RQ==", - "license": "MIT", - "dependencies": { - "@tailwindcss/node": "4.1.7", - "@tailwindcss/oxide": "4.1.7", - "tailwindcss": "4.1.7" - }, - "peerDependencies": { - "vite": "^5.2.0 || ^6" - } - }, - "node_modules/@types/babel__core": { - "version": "7.20.5", - "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", - "integrity": "sha512-qoQprZvz5wQFJwMDqeseRXWv3rqMvhgpbXFfVyWhbx9X47POIA6i/+dXefEmZKoAgOaTdaIgNSMqMIU61yRyzA==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.20.7", - "@babel/types": "^7.20.7", - "@types/babel__generator": "*", - "@types/babel__template": "*", - "@types/babel__traverse": "*" - } - }, - "node_modules/@types/babel__generator": { - "version": "7.27.0", - "resolved": "https://registry.npmjs.org/@types/babel__generator/-/babel__generator-7.27.0.tgz", - "integrity": "sha512-ufFd2Xi92OAVPYsy+P4n7/U7e68fex0+Ee8gSG9KX7eo084CWiQ4sdxktvdl0bOPupXtVJPY19zk6EwWqUQ8lg==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__template": { - "version": "7.4.4", - "resolved": "https://registry.npmjs.org/@types/babel__template/-/babel__template-7.4.4.tgz", - "integrity": "sha512-h/NUaSyG5EyxBIp8YRxo4RMe2/qQgvyowRwVMzhYhBCONbW8PUsg4lkFMrhgZhUe5z3L3MiLDuvyJ/CaPa2A8A==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/parser": "^7.1.0", - "@babel/types": "^7.0.0" - } - }, - "node_modules/@types/babel__traverse": { - "version": "7.20.7", - "resolved": "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.7.tgz", - "integrity": "sha512-dkO5fhS7+/oos4ciWxyEyjWe48zmG6wbCheo/G2ZnHx4fs3EU6YC6UM8rk56gAjNJ9P3MTH2jo5jb92/K6wbng==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/types": "^7.20.7" - } - }, - "node_modules/@types/estree": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.7.tgz", - "integrity": "sha512-w28IoSUCJpidD/TGviZwwMJckNESJZXFu7NBZ5YJ4mEUnNraUn9Pm8HSZm/jDF1pDWYKspWE7oVphigUPRakIQ==", - "license": "MIT" - }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, - "node_modules/@types/react": { - "version": "19.1.4", - "resolved": "https://registry.npmjs.org/@types/react/-/react-19.1.4.tgz", - "integrity": "sha512-EB1yiiYdvySuIITtD5lhW4yPyJ31RkJkkDw794LaQYrxCSaQV/47y5o1FMC4zF9ZyjUjzJMZwbovEnT5yHTW6g==", - "dev": true, - "license": "MIT", - "dependencies": { - "csstype": "^3.0.2" - } - }, - "node_modules/@types/react-dom": { - "version": "19.1.5", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-19.1.5.tgz", - "integrity": "sha512-CMCjrWucUBZvohgZxkjd6S9h0nZxXjzus6yDfUb+xLxYM7VvjKNH1tQrE9GWLql1XoOP4/Ds3bwFqShHUYraGg==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "@types/react": "^19.0.0" - } - }, - "node_modules/@vitejs/plugin-react": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/@vitejs/plugin-react/-/plugin-react-4.4.1.tgz", - "integrity": "sha512-IpEm5ZmeXAP/osiBXVVP5KjFMzbWOonMs0NaQQl+xYnUAcq4oHUBsF2+p4MgKWG4YMmFYJU8A6sxRPuowllm6w==", - "dev": true, - "license": "MIT", - "dependencies": { - "@babel/core": "^7.26.10", - "@babel/plugin-transform-react-jsx-self": "^7.25.9", - "@babel/plugin-transform-react-jsx-source": "^7.25.9", - "@types/babel__core": "^7.20.5", - "react-refresh": "^0.17.0" - }, - "engines": { - "node": "^14.18.0 || >=16.0.0" - }, - "peerDependencies": { - "vite": "^4.2.0 || ^5.0.0 || ^6.0.0" - } - }, - "node_modules/acorn": { - "version": "8.15.0", - "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", - "integrity": "sha512-NZyJarBfL7nWwIq+FDL6Zp/yHEhePMNnnJ0y3qfieCrmNvYct8uvtiV41UvlSe6apAfk0fY1FbWx+NwfmpvtTg==", - "dev": true, - "bin": { - "acorn": "bin/acorn" - }, - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/acorn-jsx": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", - "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/ajv": { - "version": "6.12.6", - "resolved": "https://registry.npmjs.org/ajv/-/ajv-6.12.6.tgz", - "integrity": "sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==", - "dev": true, - "license": "MIT", - "dependencies": { - "fast-deep-equal": "^3.1.1", - "fast-json-stable-stringify": "^2.0.0", - "json-schema-traverse": "^0.4.1", - "uri-js": "^4.2.2" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/epoberezkin" - } - }, - "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/argparse": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", - "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", - "dev": true, - "license": "Python-2.0" - }, - "node_modules/balanced-match": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/brace-expansion": { - "version": "1.1.12", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", - "integrity": "sha512-9T9UjW3r0UW5c1Q7GTwllptXwhvYmEzFhzMfZ9H7FQWt+uZePjZPjBP/W1ZEyZ1twGWom5/56TF4lPcqjnDHcg==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, - "node_modules/browserslist": { - "version": "4.24.5", - "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.24.5.tgz", - "integrity": "sha512-FDToo4Wo82hIdgc1CQ+NQD0hEhmpPjrZ3hiUgwgOG6IuTdlpr8jdjyG24P6cNP1yJpTLzS5OcGgSw0xmDU1/Tw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "caniuse-lite": "^1.0.30001716", - "electron-to-chromium": "^1.5.149", - "node-releases": "^2.0.19", - "update-browserslist-db": "^1.1.3" - }, - "bin": { - "browserslist": "cli.js" - }, - "engines": { - "node": "^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7" - } - }, - "node_modules/callsites": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", - "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/caniuse-lite": { - "version": "1.0.30001718", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001718.tgz", - "integrity": "sha512-AflseV1ahcSunK53NfEs9gFWgOEmzr0f+kaMFA4xiLZlr9Hzt7HxcSpIFcnNCUkz6R6dWKa54rUz3HUmI3nVcw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/caniuse-lite" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "CC-BY-4.0" - }, - "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/chownr": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/chownr/-/chownr-3.0.0.tgz", - "integrity": "sha512-+IxzY9BZOQd/XuYPRmrvEVjF/nqj5kgT4kEq7VofrDoM1MxoRjEWkrCC3EtLi59TVawxTAn+orJwFQcrqEN1+g==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" - } - }, - "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", - "dev": true, - "license": "MIT" - }, - "node_modules/concat-map": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true, - "license": "MIT" - }, - "node_modules/convert-source-map": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true, - "license": "MIT" - }, - "node_modules/cross-spawn": { - "version": "7.0.6", - "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.6.tgz", - "integrity": "sha512-uV2QOWP2nWzsy2aMp8aRibhi9dlzF5Hgh5SHaB9OiTGEyDTiJJyx0uy51QXdyWbtAHNua4XJzUKca3OzKUd3vA==", - "dev": true, - "dependencies": { - "path-key": "^3.1.0", - "shebang-command": "^2.0.0", - "which": "^2.0.1" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/csstype": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", - "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==", - "dev": true, - "license": "MIT" - }, - "node_modules/debug": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.4.1.tgz", - "integrity": "sha512-KcKCqiftBJcZr++7ykoDIEwSa3XWowTfNPo92BYxjXiyYEVrUQh2aLyhxBCwww+heortUFxEJYcRzosstTEBYQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "ms": "^2.1.3" - }, - "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } - } - }, - "node_modules/deep-is": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/detect-libc": { - "version": "2.0.4", - "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.4.tgz", - "integrity": "sha512-3UDv+G9CsCKO1WKMGw9fwq/SWJYbI0c5Y7LU1AXYoDdbhE2AHQ6N6Nb34sG8Fj7T5APy8qXDCKuuIHd1BR0tVA==", - "license": "Apache-2.0", - "engines": { - "node": ">=8" - } - }, - "node_modules/electron-to-chromium": { - "version": "1.5.155", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.5.155.tgz", - "integrity": "sha512-ps5KcGGmwL8VaeJlvlDlu4fORQpv3+GIcF5I3f9tUKUlJ/wsysh6HU8P5L1XWRYeXfA0oJd4PyM8ds8zTFf6Ng==", - "dev": true, - "license": "ISC" - }, - "node_modules/enhanced-resolve": { - "version": "5.18.1", - "resolved": "https://registry.npmjs.org/enhanced-resolve/-/enhanced-resolve-5.18.1.tgz", - "integrity": "sha512-ZSW3ma5GkcQBIpwZTSRAI8N71Uuwgs93IezB7mf7R60tC8ZbJideoDNKjHn2O9KIlx6rkGTTEk1xUCK2E1Y2Yg==", - "license": "MIT", - "dependencies": { - "graceful-fs": "^4.2.4", - "tapable": "^2.2.0" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/esbuild": { - "version": "0.25.4", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.25.4.tgz", - "integrity": "sha512-8pgjLUcUjcgDg+2Q4NYXnPbo/vncAY4UmyaCm0jZevERqCHZIaWwdJHkf8XQtu4AxSKCdvrUbT0XUr1IdZzI8Q==", - "hasInstallScript": true, - "license": "MIT", - "bin": { - "esbuild": "bin/esbuild" - }, - "engines": { - "node": ">=18" - }, - "optionalDependencies": { - "@esbuild/aix-ppc64": "0.25.4", - "@esbuild/android-arm": "0.25.4", - "@esbuild/android-arm64": "0.25.4", - "@esbuild/android-x64": "0.25.4", - "@esbuild/darwin-arm64": "0.25.4", - "@esbuild/darwin-x64": "0.25.4", - "@esbuild/freebsd-arm64": "0.25.4", - "@esbuild/freebsd-x64": "0.25.4", - "@esbuild/linux-arm": "0.25.4", - "@esbuild/linux-arm64": "0.25.4", - "@esbuild/linux-ia32": "0.25.4", - "@esbuild/linux-loong64": "0.25.4", - "@esbuild/linux-mips64el": "0.25.4", - "@esbuild/linux-ppc64": "0.25.4", - "@esbuild/linux-riscv64": "0.25.4", - "@esbuild/linux-s390x": "0.25.4", - "@esbuild/linux-x64": "0.25.4", - "@esbuild/netbsd-arm64": "0.25.4", - "@esbuild/netbsd-x64": "0.25.4", - "@esbuild/openbsd-arm64": "0.25.4", - "@esbuild/openbsd-x64": "0.25.4", - "@esbuild/sunos-x64": "0.25.4", - "@esbuild/win32-arm64": "0.25.4", - "@esbuild/win32-ia32": "0.25.4", - "@esbuild/win32-x64": "0.25.4" - } - }, - "node_modules/escalade": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", - "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/escape-string-regexp": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", - "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/eslint": { - "version": "9.31.0", - "resolved": "https://registry.npmjs.org/eslint/-/eslint-9.31.0.tgz", - "integrity": "sha512-QldCVh/ztyKJJZLr4jXNUByx3gR+TDYZCRXEktiZoUR3PGy4qCmSbkxcIle8GEwGpb5JBZazlaJ/CxLidXdEbQ==", - "dev": true, - "dependencies": { - "@eslint-community/eslint-utils": "^4.2.0", - "@eslint-community/regexpp": "^4.12.1", - "@eslint/config-array": "^0.21.0", - "@eslint/config-helpers": "^0.3.0", - "@eslint/core": "^0.15.0", - "@eslint/eslintrc": "^3.3.1", - "@eslint/js": "9.31.0", - "@eslint/plugin-kit": "^0.3.1", - "@humanfs/node": "^0.16.6", - "@humanwhocodes/module-importer": "^1.0.1", - "@humanwhocodes/retry": "^0.4.2", - "@types/estree": "^1.0.6", - "@types/json-schema": "^7.0.15", - "ajv": "^6.12.4", - "chalk": "^4.0.0", - "cross-spawn": "^7.0.6", - "debug": "^4.3.2", - "escape-string-regexp": "^4.0.0", - "eslint-scope": "^8.4.0", - "eslint-visitor-keys": "^4.2.1", - "espree": "^10.4.0", - "esquery": "^1.5.0", - "esutils": "^2.0.2", - "fast-deep-equal": "^3.1.3", - "file-entry-cache": "^8.0.0", - "find-up": "^5.0.0", - "glob-parent": "^6.0.2", - "ignore": "^5.2.0", - "imurmurhash": "^0.1.4", - "is-glob": "^4.0.0", - "json-stable-stringify-without-jsonify": "^1.0.1", - "lodash.merge": "^4.6.2", - "minimatch": "^3.1.2", - "natural-compare": "^1.4.0", - "optionator": "^0.9.3" - }, - "bin": { - "eslint": "bin/eslint.js" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://eslint.org/donate" - }, - "peerDependencies": { - "jiti": "*" - }, - "peerDependenciesMeta": { - "jiti": { - "optional": true - } - } - }, - "node_modules/eslint-plugin-react-hooks": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-hooks/-/eslint-plugin-react-hooks-5.2.0.tgz", - "integrity": "sha512-+f15FfK64YQwZdJNELETdn5ibXEUQmW1DZL6KXhNnc2heoy/sg9VJJeT7n8TlMWouzWqSWavFkIhHyIbIAEapg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "eslint": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0-0 || ^9.0.0" - } - }, - "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.20.tgz", - "integrity": "sha512-XpbHQ2q5gUF8BGOX4dHe+71qoirYMhApEPZ7sfhF/dNnOF1UXnCMGZf79SFTBO7Bz5YEIT4TMieSlJBWhP9WBA==", - "dev": true, - "license": "MIT", - "peerDependencies": { - "eslint": ">=8.40" - } - }, - "node_modules/eslint-scope": { - "version": "8.4.0", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-8.4.0.tgz", - "integrity": "sha512-sNXOfKCn74rt8RICKMvJS7XKV/Xk9kA7DyJr8mJik3S7Cwgy3qlkkmyS2uQB3jiJg6VNdZd/pDBJu0nvG2NlTg==", - "dev": true, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/eslint-visitor-keys": { - "version": "4.2.1", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-4.2.1.tgz", - "integrity": "sha512-Uhdk5sfqcee/9H/rCOJikYz67o0a2Tw2hGRPOG2Y1R2dg7brRe1uG0yaNQDHu+TO/uQPF/5eCapvYSmHUjt7JQ==", - "dev": true, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/espree": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/espree/-/espree-10.4.0.tgz", - "integrity": "sha512-j6PAQ2uUr79PZhBjP5C5fhl8e39FmRnOjsD5lGnWrFU8i2G776tBK7+nP8KuQUTTyAZUwfQqXAgrVH5MbH9CYQ==", - "dev": true, - "dependencies": { - "acorn": "^8.15.0", - "acorn-jsx": "^5.3.2", - "eslint-visitor-keys": "^4.2.1" - }, - "engines": { - "node": "^18.18.0 || ^20.9.0 || >=21.1.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" - } - }, - "node_modules/esquery": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.6.0.tgz", - "integrity": "sha512-ca9pw9fomFcKPvFLXhBKUK90ZvGibiGOvRJNbjljY7s7uq/5YO4BOzcYtJqExdx99rF6aAcnRxHmcUHcz6sQsg==", - "dev": true, - "license": "BSD-3-Clause", - "dependencies": { - "estraverse": "^5.1.0" - }, - "engines": { - "node": ">=0.10" - } - }, - "node_modules/esrecurse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", - "integrity": "sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==", - "dev": true, - "dependencies": { - "estraverse": "^5.2.0" - }, - "engines": { - "node": ">=4.0" - } - }, - "node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=4.0" - } - }, - "node_modules/esutils": { - "version": "2.0.3", - "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", - "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", - "dev": true, - "license": "BSD-2-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/fast-deep-equal": { - "version": "3.1.3", - "resolved": "https://registry.npmjs.org/fast-deep-equal/-/fast-deep-equal-3.1.3.tgz", - "integrity": "sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-json-stable-stringify": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/fast-json-stable-stringify/-/fast-json-stable-stringify-2.1.0.tgz", - "integrity": "sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fast-levenshtein": { - "version": "2.0.6", - "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true, - "license": "MIT" - }, - "node_modules/fdir": { - "version": "6.4.4", - "resolved": "https://registry.npmjs.org/fdir/-/fdir-6.4.4.tgz", - "integrity": "sha512-1NZP+GK4GfuAv3PqKvxQRDMjdSRZjnkq7KfhlNrCNNlZ0ygQFpebfrnfnq/W7fpUnAv9aGWmY1zKx7FYL3gwhg==", - "license": "MIT", - "peerDependencies": { - "picomatch": "^3 || ^4" - }, - "peerDependenciesMeta": { - "picomatch": { - "optional": true - } - } - }, - "node_modules/file-entry-cache": { - "version": "8.0.0", - "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-8.0.0.tgz", - "integrity": "sha512-XXTUwCvisa5oacNGRP9SfNtYBNAMi+RPwBFmblZEF7N7swHYQS6/Zfk7SRwx4D5j3CH211YNRco1DEMNVfZCnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "flat-cache": "^4.0.0" - }, - "engines": { - "node": ">=16.0.0" - } - }, - "node_modules/find-up": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", - "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, - "license": "MIT", - "dependencies": { - "locate-path": "^6.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/flat-cache": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-4.0.1.tgz", - "integrity": "sha512-f7ccFPK3SXFHpx15UIGyRJ/FJQctuKZ0zVuN3frBo4HnK3cay9VEW0R6yPYFHC0AgqhukPzKjq22t5DmAyqGyw==", - "dev": true, - "license": "MIT", - "dependencies": { - "flatted": "^3.2.9", - "keyv": "^4.5.4" - }, - "engines": { - "node": ">=16" - } - }, - "node_modules/flatted": { - "version": "3.3.3", - "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.3.tgz", - "integrity": "sha512-GX+ysw4PBCz0PzosHDepZGANEuFCMLrnRTiEy9McGjmkCQYwRq4A/X786G/fjM/+OjsWSU1ZrY5qyARZmO/uwg==", - "dev": true, - "license": "ISC" - }, - "node_modules/framer-motion": { - "version": "12.19.1", - "resolved": "https://registry.npmjs.org/framer-motion/-/framer-motion-12.19.1.tgz", - "integrity": "sha512-nq9hwWAEKf4gzprbOZzKugLV5OVKF7zrNDY6UOVu+4D3ZgIkg8L9Jy6AMrpBM06fhbKJ6LEG6UY5+t7Eq6wNlg==", - "license": "MIT", - "dependencies": { - "motion-dom": "^12.19.0", - "motion-utils": "^12.19.0", - "tslib": "^2.4.0" - }, - "peerDependencies": { - "@emotion/is-prop-valid": "*", - "react": "^18.0.0 || ^19.0.0", - "react-dom": "^18.0.0 || ^19.0.0" - }, - "peerDependenciesMeta": { - "@emotion/is-prop-valid": { - "optional": true - }, - "react": { - "optional": true - }, - "react-dom": { - "optional": true - } - } - }, - "node_modules/fsevents": { - "version": "2.3.3", - "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", - "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", - "hasInstallScript": true, - "license": "MIT", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": "^8.16.0 || ^10.6.0 || >=11.0.0" - } - }, - "node_modules/gensync": { - "version": "1.0.0-beta.2", - "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", - "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6.9.0" - } - }, - "node_modules/glob-parent": { - "version": "6.0.2", - "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", - "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, - "license": "ISC", - "dependencies": { - "is-glob": "^4.0.3" - }, - "engines": { - "node": ">=10.13.0" - } - }, - "node_modules/globals": { - "version": "16.1.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-16.1.0.tgz", - "integrity": "sha512-aibexHNbb/jiUSObBgpHLj+sIuUmJnYcgXBlrfsiDZ9rt4aF2TFRbyLgZ2iFQuVZ1K5Mx3FVkbKRSgKrbK3K2g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/graceful-fs": { - "version": "4.2.11", - "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", - "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", - "license": "ISC" - }, - "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/ignore": { - "version": "5.3.2", - "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.2.tgz", - "integrity": "sha512-hsBTNUqQTDwkWtcdYI2i06Y/nUBEsNEDJKjWdigLvegy8kDuJAS8uRlpkkcQpyEXL0Z/pjDy5HBmMjRCJ2gq+g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 4" - } - }, - "node_modules/import-fresh": { - "version": "3.3.1", - "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.1.tgz", - "integrity": "sha512-TR3KfrTZTYLPB6jUjfx6MF9WcWrHL9su5TObK4ZkYgBdWKPOFoSoQIdEuTuR82pmtxH2spWG9h6etwfr1pLBqQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "parent-module": "^1.0.0", - "resolve-from": "^4.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/imurmurhash": { - "version": "0.1.4", - "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", - "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.8.19" - } - }, - "node_modules/is-extglob": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", - "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/is-glob": { - "version": "4.0.3", - "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", - "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, - "license": "MIT", - "dependencies": { - "is-extglob": "^2.1.1" - }, - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/isexe": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true - }, - "node_modules/jiti": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/jiti/-/jiti-2.4.2.tgz", - "integrity": "sha512-rg9zJN+G4n2nfJl5MW3BMygZX56zKPNVEYYqq7adpmMh4Jn2QNEwhvQlFy6jPVdcod7txZtKHWnyZiA3a0zP7A==", - "license": "MIT", - "bin": { - "jiti": "lib/jiti-cli.mjs" - } - }, - "node_modules/js-tokens": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", - "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/js-yaml": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", - "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", - "dev": true, - "license": "MIT", - "dependencies": { - "argparse": "^2.0.1" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, - "node_modules/jsesc": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-3.1.0.tgz", - "integrity": "sha512-/sM3dO2FOzXjKQhJuo0Q173wf2KOo8t4I8vHy6lF9poUp7bKT0/NHE8fPX23PwfhnykfqnC2xRxOnVw5XuGIaA==", - "dev": true, - "license": "MIT", - "bin": { - "jsesc": "bin/jsesc" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/json-buffer": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-schema-traverse": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/json-schema-traverse/-/json-schema-traverse-0.4.1.tgz", - "integrity": "sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==", - "dev": true, - "license": "MIT" - }, - "node_modules/json-stable-stringify-without-jsonify": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true, - "license": "MIT" - }, - "node_modules/json5": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", - "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, - "license": "MIT", - "bin": { - "json5": "lib/cli.js" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/keyv": { - "version": "4.5.4", - "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", - "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, - "license": "MIT", - "dependencies": { - "json-buffer": "3.0.1" - } - }, - "node_modules/levn": { - "version": "0.4.1", - "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", - "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1", - "type-check": "~0.4.0" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/lightningcss": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss/-/lightningcss-1.30.1.tgz", - "integrity": "sha512-xi6IyHML+c9+Q3W0S4fCQJOym42pyurFiJUHEcEyHS0CeKzia4yZDEsLlqOFykxOdHpNy0NmvVO31vcSqAxJCg==", - "license": "MPL-2.0", - "dependencies": { - "detect-libc": "^2.0.3" - }, - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - }, - "optionalDependencies": { - "lightningcss-darwin-arm64": "1.30.1", - "lightningcss-darwin-x64": "1.30.1", - "lightningcss-freebsd-x64": "1.30.1", - "lightningcss-linux-arm-gnueabihf": "1.30.1", - "lightningcss-linux-arm64-gnu": "1.30.1", - "lightningcss-linux-arm64-musl": "1.30.1", - "lightningcss-linux-x64-gnu": "1.30.1", - "lightningcss-linux-x64-musl": "1.30.1", - "lightningcss-win32-arm64-msvc": "1.30.1", - "lightningcss-win32-x64-msvc": "1.30.1" - } - }, - "node_modules/lightningcss-darwin-arm64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-arm64/-/lightningcss-darwin-arm64-1.30.1.tgz", - "integrity": "sha512-c8JK7hyE65X1MHMN+Viq9n11RRC7hgin3HhYKhrMyaXflk5GVplZ60IxyoVtzILeKr+xAJwg6zK6sjTBJ0FKYQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-darwin-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-darwin-x64/-/lightningcss-darwin-x64-1.30.1.tgz", - "integrity": "sha512-k1EvjakfumAQoTfcXUcHQZhSpLlkAuEkdMBsI/ivWw9hL+7FtilQc0Cy3hrx0AAQrVtQAbMI7YjCgYgvn37PzA==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "darwin" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-freebsd-x64": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-freebsd-x64/-/lightningcss-freebsd-x64-1.30.1.tgz", - "integrity": "sha512-kmW6UGCGg2PcyUE59K5r0kWfKPAVy4SltVeut+umLCFoJ53RdCUWxcRDzO1eTaxf/7Q2H7LTquFHPL5R+Gjyig==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "freebsd" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm-gnueabihf": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm-gnueabihf/-/lightningcss-linux-arm-gnueabihf-1.30.1.tgz", - "integrity": "sha512-MjxUShl1v8pit+6D/zSPq9S9dQ2NPFSQwGvxBCYaBYLPlCWuPh9/t1MRS8iUaR8i+a6w7aps+B4N0S1TYP/R+Q==", - "cpu": [ - "arm" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-gnu/-/lightningcss-linux-arm64-gnu-1.30.1.tgz", - "integrity": "sha512-gB72maP8rmrKsnKYy8XUuXi/4OctJiuQjcuqWNlJQ6jZiWqtPvqFziskH3hnajfvKB27ynbVCucKSm2rkQp4Bw==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-arm64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-arm64-musl/-/lightningcss-linux-arm64-musl-1.30.1.tgz", - "integrity": "sha512-jmUQVx4331m6LIX+0wUhBbmMX7TCfjF5FoOH6SD1CttzuYlGNVpA7QnrmLxrsub43ClTINfGSYyHe2HWeLl5CQ==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-gnu": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-gnu/-/lightningcss-linux-x64-gnu-1.30.1.tgz", - "integrity": "sha512-piWx3z4wN8J8z3+O5kO74+yr6ze/dKmPnI7vLqfSqI8bccaTGY5xiSGVIJBDd5K5BHlvVLpUB3S2YCfelyJ1bw==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-linux-x64-musl": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-linux-x64-musl/-/lightningcss-linux-x64-musl-1.30.1.tgz", - "integrity": "sha512-rRomAK7eIkL+tHY0YPxbc5Dra2gXlI63HL+v1Pdi1a3sC+tJTcFrHX+E86sulgAXeI7rSzDYhPSeHHjqFhqfeQ==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "linux" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-arm64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-arm64-msvc/-/lightningcss-win32-arm64-msvc-1.30.1.tgz", - "integrity": "sha512-mSL4rqPi4iXq5YVqzSsJgMVFENoa4nGTT/GjO2c0Yl9OuQfPsIfncvLrEW6RbbB24WtZ3xP/2CCmI3tNkNV4oA==", - "cpu": [ - "arm64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/lightningcss-win32-x64-msvc": { - "version": "1.30.1", - "resolved": "https://registry.npmjs.org/lightningcss-win32-x64-msvc/-/lightningcss-win32-x64-msvc-1.30.1.tgz", - "integrity": "sha512-PVqXh48wh4T53F/1CCu8PIPCxLzWyCnn/9T5W1Jpmdy5h9Cwd+0YQS6/LwhHXSafuc61/xg9Lv5OrCby6a++jg==", - "cpu": [ - "x64" - ], - "license": "MPL-2.0", - "optional": true, - "os": [ - "win32" - ], - "engines": { - "node": ">= 12.0.0" - }, - "funding": { - "type": "opencollective", - "url": "https://opencollective.com/parcel" - } - }, - "node_modules/locate-path": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", - "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-locate": "^5.0.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/lodash.merge": { - "version": "4.6.2", - "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true, - "license": "MIT" - }, - "node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "license": "ISC", - "dependencies": { - "yallist": "^3.0.2" - } - }, - "node_modules/magic-string": { - "version": "0.30.17", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.17.tgz", - "integrity": "sha512-sNPKHvyjVf7gyjwS4xGTaW/mCnF8wnjtifKBEhxfZ7E/S8tQ0rssrwGNn6q8JH/ohItJfSQp9mBtQYuTlH5QnA==", - "license": "MIT", - "dependencies": { - "@jridgewell/sourcemap-codec": "^1.5.0" - } - }, - "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, - "license": "ISC", - "dependencies": { - "brace-expansion": "^1.1.7" - }, - "engines": { - "node": "*" - } - }, - "node_modules/minipass": { - "version": "7.1.2", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.2.tgz", - "integrity": "sha512-qOOzS1cBTWYF4BH8fVePDBOO9iptMnGUEZwNc/cMWnTV2nVLZ7VoNWEPHkYczZA0pdoA7dl6e7FL659nX9S2aw==", - "license": "ISC", - "engines": { - "node": ">=16 || 14 >=14.17" - } - }, - "node_modules/minizlib": { - "version": "3.0.2", - "resolved": "https://registry.npmjs.org/minizlib/-/minizlib-3.0.2.tgz", - "integrity": "sha512-oG62iEk+CYt5Xj2YqI5Xi9xWUeZhDI8jjQmC5oThVH5JGCTgIjr7ciJDzC7MBzYd//WvR1OTmP5Q38Q8ShQtVA==", - "license": "MIT", - "dependencies": { - "minipass": "^7.1.2" - }, - "engines": { - "node": ">= 18" - } - }, - "node_modules/mkdirp": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-3.0.1.tgz", - "integrity": "sha512-+NsyUUAZDmo6YVHzL/stxSu3t9YS1iljliy3BSDrXJ/dkn1KYdmtZODGGjLcc9XLgVVpH4KshHB8XmZgMhaBXg==", - "license": "MIT", - "bin": { - "mkdirp": "dist/cjs/src/bin.js" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, - "node_modules/motion-dom": { - "version": "12.19.0", - "resolved": "https://registry.npmjs.org/motion-dom/-/motion-dom-12.19.0.tgz", - "integrity": "sha512-m96uqq8VbwxFLU0mtmlsIVe8NGGSdpBvBSHbnnOJQxniPaabvVdGgxSamhuDwBsRhwX7xPxdICgVJlOpzn/5bw==", - "license": "MIT", - "dependencies": { - "motion-utils": "^12.19.0" - } - }, - "node_modules/motion-utils": { - "version": "12.19.0", - "resolved": "https://registry.npmjs.org/motion-utils/-/motion-utils-12.19.0.tgz", - "integrity": "sha512-BuFTHINYmV07pdWs6lj6aI63vr2N4dg0vR+td0rtrdpWOhBzIkEklZyLcvKBoEtwSqx8Jg06vUB5RS0xDiUybw==", - "license": "MIT" - }, - "node_modules/ms": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.3.tgz", - "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==", - "dev": true, - "license": "MIT" - }, - "node_modules/nanoid": { - "version": "3.3.11", - "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-3.3.11.tgz", - "integrity": "sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==", - "funding": [ - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "bin": { - "nanoid": "bin/nanoid.cjs" - }, - "engines": { - "node": "^10 || ^12 || ^13.7 || ^14 || >=15.0.1" - } - }, - "node_modules/natural-compare": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true, - "license": "MIT" - }, - "node_modules/node-releases": { - "version": "2.0.19", - "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz", - "integrity": "sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw==", - "dev": true, - "license": "MIT" - }, - "node_modules/optionator": { - "version": "0.9.4", - "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", - "integrity": "sha512-6IpQ7mKUxRcZNLIObR0hz7lxsapSSIYNZJwXPGeF0mTVqGKFIXj1DQcMoT22S3ROcLyY/rz0PWaWZ9ayWmad9g==", - "dev": true, - "license": "MIT", - "dependencies": { - "deep-is": "^0.1.3", - "fast-levenshtein": "^2.0.6", - "levn": "^0.4.1", - "prelude-ls": "^1.2.1", - "type-check": "^0.4.0", - "word-wrap": "^1.2.5" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/p-limit": { - "version": "3.1.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", - "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "yocto-queue": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", - "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, - "license": "MIT", - "dependencies": { - "p-limit": "^3.0.2" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/parent-module": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", - "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", - "dev": true, - "license": "MIT", - "dependencies": { - "callsites": "^3.0.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - } - }, - "node_modules/path-key": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", - "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/picocolors": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.1.1.tgz", - "integrity": "sha512-xceH2snhtb5M9liqDsmEw56le376mTZkEX/jEb/RxNFyegNul7eNslCXP9FDj/Lcu0X8KEyMceP2ntpaHrDEVA==", - "license": "ISC" - }, - "node_modules/picomatch": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-4.0.2.tgz", - "integrity": "sha512-M7BAV6Rlcy5u+m6oPhAPFgJTzAioX/6B0DxyvDlo9l8+T3nLKbrczg2WLUyzd45L8RqfUMyGPzekbMvX2Ldkwg==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/jonschlinkert" - } - }, - "node_modules/postcss": { - "version": "8.5.3", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.5.3.tgz", - "integrity": "sha512-dle9A3yYxlBSrt8Fu+IpjGT8SY8hN0mlaA6GY8t0P5PjIOZemULz/E2Bnm/2dcUOena75OTNkHI76uZBNUUq3A==", - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/postcss/" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/postcss" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "nanoid": "^3.3.8", - "picocolors": "^1.1.1", - "source-map-js": "^1.2.1" - }, - "engines": { - "node": "^10 || ^12 || >=14" - } - }, - "node_modules/prelude-ls": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", - "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/punycode": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/punycode/-/punycode-2.3.1.tgz", - "integrity": "sha512-vYt7UD1U9Wg6138shLtLOvdAu+8DsC/ilFtEVHcH+wydcSpNE20AfSOduf6MkRFahL5FY7X1oU7nKVZFtfq8Fg==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/react": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react/-/react-19.1.0.tgz", - "integrity": "sha512-FS+XFBNvn3GTAWq26joslQgWNoFu08F4kl0J4CgdNKADkdSGXQyTCnKteIAJy96Br6YbpEU1LSzV5dYtjMkMDg==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-dom": { - "version": "19.1.0", - "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-19.1.0.tgz", - "integrity": "sha512-Xs1hdnE+DyKgeHJeJznQmYMIBG3TKIHJJT95Q58nHLSrElKlGQqDTR2HQ9fx5CN/Gk6Vh/kupBTDLU11/nDk/g==", - "license": "MIT", - "dependencies": { - "scheduler": "^0.26.0" - }, - "peerDependencies": { - "react": "^19.1.0" - } - }, - "node_modules/react-icons": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-5.5.0.tgz", - "integrity": "sha512-MEFcXdkP3dLo8uumGI5xN3lDFNsRtrjbOEKDLD7yv76v4wpnEq2Lt2qeHaQOr34I/wPN3s3+N08WkQ+CW37Xiw==", - "license": "MIT", - "peerDependencies": { - "react": "*" - } - }, - "node_modules/react-refresh": { - "version": "0.17.0", - "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.17.0.tgz", - "integrity": "sha512-z6F7K9bV85EfseRCp2bzrpyQ0Gkw1uLoCel9XBVWPg/TjRj94SkJzUTGfOa4bs7iJvBWtQG0Wq7wnI0syw3EBQ==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/react-router": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/react-router/-/react-router-7.6.0.tgz", - "integrity": "sha512-GGufuHIVCJDbnIAXP3P9Sxzq3UUsddG3rrI3ut1q6m0FI6vxVBF3JoPQ38+W/blslLH4a5Yutp8drkEpXoddGQ==", - "license": "MIT", - "dependencies": { - "cookie": "^1.0.1", - "set-cookie-parser": "^2.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - }, - "peerDependenciesMeta": { - "react-dom": { - "optional": true - } - } - }, - "node_modules/react-router-dom": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/react-router-dom/-/react-router-dom-7.6.0.tgz", - "integrity": "sha512-DYgm6RDEuKdopSyGOWZGtDfSm7Aofb8CCzgkliTjtu/eDuB0gcsv6qdFhhi8HdtmA+KHkt5MfZ5K2PdzjugYsA==", - "license": "MIT", - "dependencies": { - "react-router": "7.6.0" - }, - "engines": { - "node": ">=20.0.0" - }, - "peerDependencies": { - "react": ">=18", - "react-dom": ">=18" - } - }, - "node_modules/react-router/node_modules/cookie": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-1.0.2.tgz", - "integrity": "sha512-9Kr/j4O16ISv8zBBhJoi4bXOYNTkFLOqSL3UDB0njXxCXNezjeyVrJyGOWtgfs/q2km1gwBcfH8q1yEGoMYunA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, - "node_modules/resolve-from": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", - "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/rollup": { - "version": "4.40.2", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.40.2.tgz", - "integrity": "sha512-tfUOg6DTP4rhQ3VjOO6B4wyrJnGOX85requAXvqYTHsOgb2TFJdZ3aWpT8W2kPoypSGP7dZUyzxJ9ee4buM5Fg==", - "license": "MIT", - "dependencies": { - "@types/estree": "1.0.7" - }, - "bin": { - "rollup": "dist/bin/rollup" - }, - "engines": { - "node": ">=18.0.0", - "npm": ">=8.0.0" - }, - "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.40.2", - "@rollup/rollup-android-arm64": "4.40.2", - "@rollup/rollup-darwin-arm64": "4.40.2", - "@rollup/rollup-darwin-x64": "4.40.2", - "@rollup/rollup-freebsd-arm64": "4.40.2", - "@rollup/rollup-freebsd-x64": "4.40.2", - "@rollup/rollup-linux-arm-gnueabihf": "4.40.2", - "@rollup/rollup-linux-arm-musleabihf": "4.40.2", - "@rollup/rollup-linux-arm64-gnu": "4.40.2", - "@rollup/rollup-linux-arm64-musl": "4.40.2", - "@rollup/rollup-linux-loongarch64-gnu": "4.40.2", - "@rollup/rollup-linux-powerpc64le-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-gnu": "4.40.2", - "@rollup/rollup-linux-riscv64-musl": "4.40.2", - "@rollup/rollup-linux-s390x-gnu": "4.40.2", - "@rollup/rollup-linux-x64-gnu": "4.40.2", - "@rollup/rollup-linux-x64-musl": "4.40.2", - "@rollup/rollup-win32-arm64-msvc": "4.40.2", - "@rollup/rollup-win32-ia32-msvc": "4.40.2", - "@rollup/rollup-win32-x64-msvc": "4.40.2", - "fsevents": "~2.3.2" - } - }, - "node_modules/scheduler": { - "version": "0.26.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.26.0.tgz", - "integrity": "sha512-NlHwttCI/l5gCPR3D1nNXtWABUmBwvZpEQiD4IXSbIDq8BzLIK/7Ir5gTFSGZDUu37K5cMNp0hFtzO38sC7gWA==", - "license": "MIT" - }, - "node_modules/semver": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", - "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, - "license": "ISC", - "bin": { - "semver": "bin/semver.js" - } - }, - "node_modules/set-cookie-parser": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/set-cookie-parser/-/set-cookie-parser-2.7.1.tgz", - "integrity": "sha512-IOc8uWeOZgnb3ptbCURJWNjWUPcO3ZnTTdzsurqERrP6nPyv+paC55vJM0LpOlT2ne+Ix+9+CRG1MNLlyZ4GjQ==", - "license": "MIT" - }, - "node_modules/shebang-command": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", - "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, - "dependencies": { - "shebang-regex": "^3.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/shebang-regex": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", - "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, - "engines": { - "node": ">=8" - } - }, - "node_modules/source-map-js": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.1.tgz", - "integrity": "sha512-UXWMKhLOwVKb728IUtQPXxfYU+usdybtUrK/8uGE8CQMvrhOpwvzDBwj0QhSL7MQc7vIsISBG8VQ8+IDQxpfQA==", - "license": "BSD-3-Clause", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/strip-json-comments": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", - "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/tailwindcss": { - "version": "4.1.7", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-4.1.7.tgz", - "integrity": "sha512-kr1o/ErIdNhTz8uzAYL7TpaUuzKIE6QPQ4qmSdxnoX/lo+5wmUHQA6h3L5yIqEImSRnAAURDirLu/BgiXGPAhg==", - "license": "MIT" - }, - "node_modules/tapable": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/tapable/-/tapable-2.2.1.tgz", - "integrity": "sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/tar": { - "version": "7.4.3", - "resolved": "https://registry.npmjs.org/tar/-/tar-7.4.3.tgz", - "integrity": "sha512-5S7Va8hKfV7W5U6g3aYxXmlPoZVAwUMy9AOKyF2fVuZa2UD3qZjg578OrLRt8PcNN1PleVaL/5/yYATNL0ICUw==", - "license": "ISC", - "dependencies": { - "@isaacs/fs-minipass": "^4.0.0", - "chownr": "^3.0.0", - "minipass": "^7.1.2", - "minizlib": "^3.0.1", - "mkdirp": "^3.0.1", - "yallist": "^5.0.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/tar/node_modules/yallist": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-5.0.0.tgz", - "integrity": "sha512-YgvUTfwqyc7UXVMrB+SImsVYSmTS8X/tSrtdNZMImM+n7+QTriRXyXim0mBrTXNeqzVF0KWGgHPeiyViFFrNDw==", - "license": "BlueOak-1.0.0", - "engines": { - "node": ">=18" - } - }, - "node_modules/tinyglobby": { - "version": "0.2.13", - "resolved": "https://registry.npmjs.org/tinyglobby/-/tinyglobby-0.2.13.tgz", - "integrity": "sha512-mEwzpUgrLySlveBwEVDMKk5B57bhLPYovRfPAXD5gA/98Opn0rCDj3GtLwFvCvH5RK9uPCExUROW5NjDwvqkxw==", - "license": "MIT", - "dependencies": { - "fdir": "^6.4.4", - "picomatch": "^4.0.2" - }, - "engines": { - "node": ">=12.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/SuperchupuDev" - } - }, - "node_modules/tslib": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.8.1.tgz", - "integrity": "sha512-oJFu94HQb+KVduSUQL7wnpmqnfmLsOA/nAh6b6EH0wCEoK0/mPeXU6c3wKDV83MkOuHPRHtSXKKU99IBazS/2w==", - "license": "0BSD" - }, - "node_modules/type-check": { - "version": "0.4.0", - "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", - "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, - "license": "MIT", - "dependencies": { - "prelude-ls": "^1.2.1" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/update-browserslist-db": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/update-browserslist-db/-/update-browserslist-db-1.1.3.tgz", - "integrity": "sha512-UxhIZQ+QInVdunkDAaiazvvT/+fXL5Osr0JZlJulepYu6Jd7qJtDZjlur0emRlT71EN3ScPoE7gvsuIKKNavKw==", - "dev": true, - "funding": [ - { - "type": "opencollective", - "url": "https://opencollective.com/browserslist" - }, - { - "type": "tidelift", - "url": "https://tidelift.com/funding/github/npm/browserslist" - }, - { - "type": "github", - "url": "https://github.com/sponsors/ai" - } - ], - "license": "MIT", - "dependencies": { - "escalade": "^3.2.0", - "picocolors": "^1.1.1" - }, - "bin": { - "update-browserslist-db": "cli.js" - }, - "peerDependencies": { - "browserslist": ">= 4.21.0" - } - }, - "node_modules/uri-js": { - "version": "4.4.1", - "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", - "integrity": "sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==", - "dev": true, - "license": "BSD-2-Clause", - "dependencies": { - "punycode": "^2.1.0" - } - }, - "node_modules/vite": { - "version": "6.3.5", - "resolved": "https://registry.npmjs.org/vite/-/vite-6.3.5.tgz", - "integrity": "sha512-cZn6NDFE7wdTpINgs++ZJ4N49W2vRp8LCKrn3Ob1kYNtOo21vfDoaV5GzBfLU4MovSAB8uNRm4jgzVQZ+mBzPQ==", - "license": "MIT", - "dependencies": { - "esbuild": "^0.25.0", - "fdir": "^6.4.4", - "picomatch": "^4.0.2", - "postcss": "^8.5.3", - "rollup": "^4.34.9", - "tinyglobby": "^0.2.13" - }, - "bin": { - "vite": "bin/vite.js" - }, - "engines": { - "node": "^18.0.0 || ^20.0.0 || >=22.0.0" - }, - "funding": { - "url": "https://github.com/vitejs/vite?sponsor=1" - }, - "optionalDependencies": { - "fsevents": "~2.3.3" - }, - "peerDependencies": { - "@types/node": "^18.0.0 || ^20.0.0 || >=22.0.0", - "jiti": ">=1.21.0", - "less": "*", - "lightningcss": "^1.21.0", - "sass": "*", - "sass-embedded": "*", - "stylus": "*", - "sugarss": "*", - "terser": "^5.16.0", - "tsx": "^4.8.1", - "yaml": "^2.4.2" - }, - "peerDependenciesMeta": { - "@types/node": { - "optional": true - }, - "jiti": { - "optional": true - }, - "less": { - "optional": true - }, - "lightningcss": { - "optional": true - }, - "sass": { - "optional": true - }, - "sass-embedded": { - "optional": true - }, - "stylus": { - "optional": true - }, - "sugarss": { - "optional": true - }, - "terser": { - "optional": true - }, - "tsx": { - "optional": true - }, - "yaml": { - "optional": true - } - } - }, - "node_modules/which": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", - "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, - "dependencies": { - "isexe": "^2.0.0" - }, - "bin": { - "node-which": "bin/node-which" - }, - "engines": { - "node": ">= 8" - } - }, - "node_modules/word-wrap": { - "version": "1.2.5", - "resolved": "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz", - "integrity": "sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true, - "license": "ISC" - }, - "node_modules/yocto-queue": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", - "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - } - } -} diff --git a/SerpentRace_Frontend/package.json b/SerpentRace_Frontend/package.json deleted file mode 100644 index 9efa2b81..00000000 --- a/SerpentRace_Frontend/package.json +++ /dev/null @@ -1,32 +0,0 @@ -{ - "name": "frontend", - "private": true, - "version": "0.0.0", - "type": "module", - "scripts": { - "dev": "vite", - "build": "vite build", - "lint": "eslint .", - "preview": "vite preview" - }, - "dependencies": { - "@tailwindcss/vite": "^4.1.7", - "framer-motion": "^12.19.1", - "react": "^19.1.0", - "react-dom": "^19.1.0", - "react-icons": "^5.5.0", - "react-router-dom": "^7.6.0", - "tailwindcss": "^4.1.7" - }, - "devDependencies": { - "@eslint/js": "^9.25.0", - "@types/react": "^19.1.2", - "@types/react-dom": "^19.1.2", - "@vitejs/plugin-react": "^4.4.1", - "eslint": "^9.25.0", - "eslint-plugin-react-hooks": "^5.2.0", - "eslint-plugin-react-refresh": "^0.4.19", - "globals": "^16.0.0", - "vite": "^6.3.5" - } -} diff --git a/SerpentRace_Frontend/src/App.jsx b/SerpentRace_Frontend/src/App.jsx deleted file mode 100644 index 96b7afe2..00000000 --- a/SerpentRace_Frontend/src/App.jsx +++ /dev/null @@ -1,65 +0,0 @@ -import { useState, useEffect } from "react" -import { BrowserRouter as Router, Route, Routes } from "react-router-dom" -import AuthRegister from "./pages/Auth/AuthRegister" -import AuthLogin from "./pages/Auth/AuthLogin" -import EmailVerification from "./pages/Auth/EmailVerification" -import Test from "./pages/Testing/Test" -import ForgotPassword from "./pages/Auth/ForgotPassword" -import ResetPassword from "./pages/Auth/ResetPassword" -import Landingpage from "./pages/Landing/Landingpage" -import Home from "./pages/Landing/Home" -import DeckManagerPage from "./pages/Decks/DeckManagerPage" -import CompanyHub from "./pages/Companies/Companies" -import About from "./pages/About/About" -import ScrollToTop from "./components/ScrollToTop" -import GameScreen from "./pages/Game/GameScreen" - -function App() { - const [isMobile, setIsMobile] = useState(false) - - useEffect(() => { - const handleResize = () => { - setIsMobile(window.innerWidth <= 1280) - } - - handleResize() - window.addEventListener("resize", handleResize) - - return () => window.removeEventListener("resize", handleResize) - }, []) - - // if (isMobile) { - // return ( - // - // - // } /> - // } /> - // } /> - // - // - // ); - // } - - return ( - - - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - } /> - - {/* Add more routes as needed */} - - - ) -} - -export default App diff --git a/SerpentRace_Frontend/src/assets/SerpentRace_Animation/Path.module.css b/SerpentRace_Frontend/src/assets/SerpentRace_Animation/Path.module.css deleted file mode 100755 index f3ef5754..00000000 --- a/SerpentRace_Frontend/src/assets/SerpentRace_Animation/Path.module.css +++ /dev/null @@ -1,96 +0,0 @@ -.animation { - animation: fill 0.5s ease forwards 2.9s; -} - -.path0 { - stroke-dasharray: 603.0596923828125; - stroke-dashoffset: 603.0596923828125; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.45s; -} - -.path1 { - stroke-dasharray: 503.0904846191406; - stroke-dashoffset: 503.0904846191406; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.5s; -} - -.path2 { - stroke-dasharray: 625.779541015625; - stroke-dashoffset: 625.779541015625; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.45s; -} - -.path3 { - stroke-dasharray: 714.129638671875; - stroke-dashoffset: 714.129638671875; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.4s; -} - -.path4 { - stroke-dasharray: 427.98114013671875; - stroke-dashoffset: 427.98114013671875; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.35s; -} - -.path5 { - stroke-dasharray: 593.7645263671875; - stroke-dashoffset: 593.7645263671875; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.3s; -} - -.path6 { - stroke-dasharray: 603.0399780273438; - stroke-dashoffset: 603.0399780273438; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.25s; -} - -.path7 { - stroke-dasharray: 731.757568359375; - stroke-dashoffset: 731.757568359375; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.2s; -} - -.path8 { - stroke-dasharray: 382.3065185546875; - stroke-dashoffset: 382.3065185546875; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.2s; -} - -.path9 { - stroke-dasharray: 603.0382690429688; - stroke-dashoffset: 603.0382690429688; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.15s; -} - -.path10 { - stroke-dasharray: 652.2447509765625; - stroke-dashoffset: 652.2447509765625; - animation: draw 3s ease-in-out forwards; - animation-delay: 0.1s; -} - -@keyframes draw { - to { - stroke-dashoffset: 0; - } -} - -@keyframes fill { - from { - fill: transparent; - } - to { - fill: #ffffff; - } -} - diff --git a/SerpentRace_Frontend/src/assets/SerpentRace_Animation/SerpentRace_Animation.jsx b/SerpentRace_Frontend/src/assets/SerpentRace_Animation/SerpentRace_Animation.jsx deleted file mode 100755 index 352f06d6..00000000 --- a/SerpentRace_Frontend/src/assets/SerpentRace_Animation/SerpentRace_Animation.jsx +++ /dev/null @@ -1,34 +0,0 @@ -// src/assets/SerpentRace_Animation/SerpentRace_Animation.jsx -// Animációs kiírás: SerpentRace - -import styles from "./Path.module.css"; -import React, { useRef } from "react"; - -const Animation = ({ sizePercentage = 100 }) => { - const width = (1253 * sizePercentage) / 100; - const height = (136 * sizePercentage) / 100; - - // 11 path-hoz refs - const pathRefs = Array.from({ length: 11 }, () => useRef(null)); - - return ( -
- {/* prettier-ignore */} - - - - - - - - - - - - - -
- ); -}; - -export default Animation; diff --git a/SerpentRace_Frontend/src/assets/backgrounds/Background.jsx b/SerpentRace_Frontend/src/assets/backgrounds/Background.jsx deleted file mode 100755 index 026dc944..00000000 --- a/SerpentRace_Frontend/src/assets/backgrounds/Background.jsx +++ /dev/null @@ -1,97 +0,0 @@ -import React, { useEffect, useState } from "react" -import { motion } from "framer-motion" - -const Background = () => { - const [gridSize, setGridSize] = useState({ cols: 12, rows: 6 }) - const [mousePos, setMousePos] = useState({ x: 0, y: 0 }) - const [path, setPath] = useState([]) - - useEffect(() => { - const updateGrid = () => { - const width = window.innerWidth - const height = window.innerHeight - const cols = Math.max(8, Math.floor(width / 100)) - const rows = Math.max(5, Math.floor(height / 100)) - setGridSize({ cols, rows }) - } - - const handleMouseMove = (e) => { - setMousePos({ x: e.clientX, y: e.clientY }) - } - - updateGrid() - window.addEventListener("resize", updateGrid) - window.addEventListener("mousemove", handleMouseMove) - - return () => { - window.removeEventListener("resize", updateGrid) - window.removeEventListener("mousemove", handleMouseMove) - } - }, []) - - useEffect(() => { - const interval = setInterval(() => { - const newCol = Math.floor(Math.random() * gridSize.cols) - const newRow = Math.floor(Math.random() * gridSize.rows) - setPath((prevPath) => { - const newPath = [...prevPath, { col: newCol, row: newRow, opacity: 1 }] - if (newPath.length > 10) newPath.shift() - return newPath - }) - }, 500) - - const fadeInterval = setInterval(() => { - setPath((prevPath) => - prevPath - .map((point) => ({ ...point, opacity: Math.max(0, point.opacity - 0.05) })) - .filter((point) => point.opacity > 0) - ) - }, 100) - - return () => { - clearInterval(interval) - clearInterval(fadeInterval) - } - }, [gridSize]) - - return ( -
-
- {[...Array(gridSize.cols * gridSize.rows)].map((_, i) => { - const col = i % gridSize.cols - const row = Math.floor(i / gridSize.cols) - const cellX = (col + 0.5) * (window.innerWidth / gridSize.cols) - const cellY = (row + 0.5) * (window.innerHeight / gridSize.rows) - - const dx = cellX - mousePos.x - const dy = cellY - mousePos.y - const distance = Math.sqrt(dx * dx + dy * dy) - const distanceFactor = Math.max(0, 1 - distance / 300) - - const pathPoint = path.find((p) => p.col === col && p.row === row) - const pathOpacity = pathPoint ? pathPoint.opacity : 0 - - return ( - - ) - })} -
-
- ) -} - -export default Background diff --git a/SerpentRace_Frontend/src/assets/pictures/Logo.jsx b/SerpentRace_Frontend/src/assets/pictures/Logo.jsx deleted file mode 100644 index 28376797..00000000 --- a/SerpentRace_Frontend/src/assets/pictures/Logo.jsx +++ /dev/null @@ -1,18 +0,0 @@ -// src/assets/pictures/Logo.png -// Logo kép importálása és paraméterezése - -import React from 'react'; -import logo from './Logo.png'; - -const Logo = ({ size = 100 }) => ( - Logo -); - -export default Logo; - diff --git a/SerpentRace_Frontend/src/assets/pictures/Logo.png b/SerpentRace_Frontend/src/assets/pictures/Logo.png deleted file mode 100644 index 480d8c5d..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/Logo.png and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/LogoCard.jsx b/SerpentRace_Frontend/src/assets/pictures/LogoCard.jsx deleted file mode 100644 index a356f976..00000000 --- a/SerpentRace_Frontend/src/assets/pictures/LogoCard.jsx +++ /dev/null @@ -1,134 +0,0 @@ -import { useRef, useState } from "react" -import { motion, useMotionValue, useSpring } from "framer-motion" - -const springValues = { - damping: 30, - stiffness: 100, - mass: 2, -} - -export default function LogoCard({ - imageSrc, - altText = "Tilted card image", - captionText = "", - containerHeight = "300px", - containerWidth = "100%", - imageHeight = "300px", - imageWidth = "300px", - scaleOnHover = 1.1, - rotateAmplitude = 14, - showMobileWarning = true, - showTooltip = true, - overlayContent = null, - displayOverlayContent = false, -}) { - const ref = useRef(null) - const x = useMotionValue(0) - const y = useMotionValue(0) - const rotateX = useSpring(useMotionValue(0), springValues) - const rotateY = useSpring(useMotionValue(0), springValues) - const scale = useSpring(1, springValues) - const opacity = useSpring(0) - const rotateFigcaption = useSpring(0, { - stiffness: 350, - damping: 30, - mass: 1, - }) - - const [lastY, setLastY] = useState(0) - - function handleMouse(e) { - if (!ref.current) return - - const rect = ref.current.getBoundingClientRect() - const offsetX = e.clientX - rect.left - rect.width / 2 - const offsetY = e.clientY - rect.top - rect.height / 2 - - const rotationX = (offsetY / (rect.height / 2)) * -rotateAmplitude - const rotationY = (offsetX / (rect.width / 2)) * rotateAmplitude - - rotateX.set(rotationX) - rotateY.set(rotationY) - - x.set(e.clientX - rect.left) - y.set(e.clientY - rect.top) - - const velocityY = offsetY - lastY - rotateFigcaption.set(-velocityY * 0.6) - setLastY(offsetY) - } - - function handleMouseEnter() { - scale.set(scaleOnHover) - opacity.set(1) - } - - function handleMouseLeave() { - opacity.set(0) - scale.set(1) - rotateX.set(0) - rotateY.set(0) - rotateFigcaption.set(0) - } - - return ( -
- {showMobileWarning && ( -
- This effect is not optimized for mobile. Check on desktop. -
- )} - - - - - {displayOverlayContent && overlayContent && ( - - {overlayContent} - - )} - - - {showTooltip && ( - - {captionText} - - )} -
- ) -} diff --git a/SerpentRace_Frontend/src/assets/pictures/busi.JPG b/SerpentRace_Frontend/src/assets/pictures/busi.JPG deleted file mode 100644 index ba062184..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/busi.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/donat.JPG b/SerpentRace_Frontend/src/assets/pictures/donat.JPG deleted file mode 100644 index d1fb7651..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/donat.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/gege.JPG b/SerpentRace_Frontend/src/assets/pictures/gege.JPG deleted file mode 100644 index cbef7bca..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/gege.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/piskor.JPG b/SerpentRace_Frontend/src/assets/pictures/piskor.JPG deleted file mode 100644 index 0d88b774..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/piskor.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/turo.JPG b/SerpentRace_Frontend/src/assets/pictures/turo.JPG deleted file mode 100644 index 07bf7ba8..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/turo.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/walke.JPG b/SerpentRace_Frontend/src/assets/pictures/walke.JPG deleted file mode 100644 index f8701e85..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/walke.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/assets/pictures/zsola.JPG b/SerpentRace_Frontend/src/assets/pictures/zsola.JPG deleted file mode 100644 index d210a8c6..00000000 Binary files a/SerpentRace_Frontend/src/assets/pictures/zsola.JPG and /dev/null differ diff --git a/SerpentRace_Frontend/src/components/Buttons/Button.jsx b/SerpentRace_Frontend/src/components/Buttons/Button.jsx deleted file mode 100755 index f5f98836..00000000 --- a/SerpentRace_Frontend/src/components/Buttons/Button.jsx +++ /dev/null @@ -1,22 +0,0 @@ -// src/components/Inputs/InputBox.jsx -// Gomb komponens - -import { motion } from "framer-motion" - -export default function Button({ text, type, onClick, width, className }) { - const widthClass = width ? width : "w-full" - - return ( - - {text} - - ) -} diff --git a/SerpentRace_Frontend/src/components/Buttons/ButtonDark.jsx b/SerpentRace_Frontend/src/components/Buttons/ButtonDark.jsx deleted file mode 100644 index 896e75d5..00000000 --- a/SerpentRace_Frontend/src/components/Buttons/ButtonDark.jsx +++ /dev/null @@ -1,20 +0,0 @@ -// src/components/Inputs/InputBox.jsx -// Gomb komponens - -import { motion } from "framer-motion" - -export default function Button({ text, type, onClick, width }) { - const widthClass = width ? width : "w-full" - - return ( - - {text} - - ) -} diff --git a/SerpentRace_Frontend/src/components/Buttons/ButtonGreen.jsx b/SerpentRace_Frontend/src/components/Buttons/ButtonGreen.jsx deleted file mode 100644 index 459348c6..00000000 --- a/SerpentRace_Frontend/src/components/Buttons/ButtonGreen.jsx +++ /dev/null @@ -1,20 +0,0 @@ -// src/components/Buttons/ButtonGreen.jsx -// Zöld gomb komponens (ButtonGreen) - -import { motion } from "framer-motion" - -export default function ButtonGreen({ text, type, onClick, width }) { - const widthClass = width ? width : "w-full" - - return ( - - {text} - - ) -} diff --git a/SerpentRace_Frontend/src/components/Card/Card.jsx b/SerpentRace_Frontend/src/components/Card/Card.jsx deleted file mode 100644 index 675a6cb6..00000000 --- a/SerpentRace_Frontend/src/components/Card/Card.jsx +++ /dev/null @@ -1,19 +0,0 @@ -import React from "react"; - -export default function Card({ title, children, onClose }) { - return ( -
- - {title &&

{title}

} -
{children}
-
- ); -} - - diff --git a/SerpentRace_Frontend/src/components/Footer/Footer.jsx b/SerpentRace_Frontend/src/components/Footer/Footer.jsx deleted file mode 100644 index 2752c031..00000000 --- a/SerpentRace_Frontend/src/components/Footer/Footer.jsx +++ /dev/null @@ -1,112 +0,0 @@ -import React, { useEffect, useRef, useState } from "react" -import { Link } from "react-router-dom" -import Logo from "../../assets/pictures/Logo" - - -const ArrowUpIcon = () => - -const Footer = () => { - const [isVisible, setIsVisible] = useState(false) - const footerRef = useRef(null) - - useEffect(() => { - const observer = new IntersectionObserver( - ([entry]) => { - setIsVisible(entry.isIntersecting) - }, - { threshold: 0.3 } - ) - - if (footerRef.current) { - observer.observe(footerRef.current) - } - - return () => { - if (footerRef.current) { - observer.unobserve(footerRef.current) - } - } - }, []) - - const scrollToTop = () => { - window.scrollTo({ top: 0, behavior: "smooth" }) - } - - return ( -
- - -
- {/* Logó */} -
- - - - SerpentRace -
- - {/* Oldalak */} -
- - Oldalak - - Főoldal - - Rólunk - - Kapcsolat -
- - {/* Közösség */} -
- - Közösség - - Discord - GitHub -
- - {/* Elérhetőség */} -
- - Elérhetőség - - Email: info@serpentrace.hu - Telefon: +36 30 123 4567 -
-
- -
- © {new Date().getFullYear()} SerpentRace. Minden jog fenntartva. -
- - {/* Scroll to top */} - {isVisible && ( - - )} -
- ) -} - -export default Footer diff --git a/SerpentRace_Frontend/src/components/Inputs/InputBox.jsx b/SerpentRace_Frontend/src/components/Inputs/InputBox.jsx deleted file mode 100755 index d8a4dc65..00000000 --- a/SerpentRace_Frontend/src/components/Inputs/InputBox.jsx +++ /dev/null @@ -1,16 +0,0 @@ -// src/components/Inputs/InputBox.jsx -// InputBox komponens - -export default function InputBox({ type, placeholder, value, onChange, width }) { - const widthClass = width ? width : "w-full"; - - return ( - - ); -} diff --git a/SerpentRace_Frontend/src/components/Inputs/InputBoxDark.jsx b/SerpentRace_Frontend/src/components/Inputs/InputBoxDark.jsx deleted file mode 100644 index 4aa564f3..00000000 --- a/SerpentRace_Frontend/src/components/Inputs/InputBoxDark.jsx +++ /dev/null @@ -1,16 +0,0 @@ -// src/components/Inputs/InputBox.jsx -// InputBox komponens - -export default function InputBox({ type, placeholder, value, onChange, width }) { - const widthClass = width ? width : "w-full" - - return ( - - ) -} diff --git a/SerpentRace_Frontend/src/components/Landingpage/DeckManager.jsx b/SerpentRace_Frontend/src/components/Landingpage/DeckManager.jsx deleted file mode 100644 index 2951956a..00000000 --- a/SerpentRace_Frontend/src/components/Landingpage/DeckManager.jsx +++ /dev/null @@ -1,292 +0,0 @@ -import React, { useState } from "react" -import { - FaPlus, - FaFilter, - FaCalendarAlt, - FaArrowUp, - FaArrowDown, - FaSortAlphaDown, - FaSortAlphaUp, - FaQuestionCircle, -} from "react-icons/fa" -import SearchBox from "../Search/SearchBox" -import PopUp from "../PopUp/PopUp" - -const deckTypes = [ - { label: "Luck", color: "var(--color-luck)" }, - { label: "Question", color: "var(--color-question)" }, - { label: "Fun", color: "var(--color-fun)" }, -] - -const mockDecks = [ - // Just for visual mockup - { id: 1, name: "Party Luck", type: "Luck", created: "2025-07-01", origin: "Vállalati" }, - { id: 2, name: "Quiz Night", type: "Question", created: "2025-07-02", origin: "Saját" }, - { id: 3, name: "Fun Times", type: "Fun", created: "2025-07-03", origin: "Vállalati" }, - { id: 4, name: "Corporate Challenge", type: "Question", created: "2025-07-04", origin: "Vállalati" }, - { id: 5, name: "Randomizer", type: "Luck", created: "2025-07-05", origin: "Saját" }, - { id: 6, name: "Afterwork luck", type: "Luck", created: "2025-07-06", origin: "Saját" }, - { id: 7, name: "Serpent Quiz", type: "Question", created: "2025-07-07", origin: "Vállalati" }, - { id: 8, name: "Green Fortune", type: "Luck", created: "2025-07-08", origin: "Vállalati" }, - { id: 9, name: "Team Builder", type: "Fun", created: "2025-07-09", origin: "Saját" }, - { id: 10, name: "Knowledge Race", type: "Question", created: "2025-07-10", origin: "Saját" }, -] - -const origins = ["Mind", "Vállalati", "Saját"] - -const sortOptions = [ - { - value: "date-asc", - label: ( - <> - - - - ), - }, - { - value: "date-desc", - label: ( - <> - - - - ), - }, - { - value: "abc-asc", - label: ( - <> - - - ), - }, - { - value: "abc-desc", - label: ( - <> - - - ), - }, -] - -const DeckManager = () => { - const [selectedType, setSelectedType] = useState("All") - const [selectedOrigin, setSelectedOrigin] = useState("Mind") - const [sortBy, setSortBy] = useState("date-desc") - const [search, setSearch] = useState("") - const [showSortHelp, setShowSortHelp] = useState(false) - - // Filter logic (mock) - let filteredDecks = mockDecks.filter((deck) => { - const typeMatch = selectedType === "All" || deck.type === selectedType - const originMatch = selectedOrigin === "Mind" || deck.origin === selectedOrigin - const searchMatch = !search || deck.name.toLowerCase().includes(search.toLowerCase()) - return typeMatch && originMatch && searchMatch - }) - - // Sort logic - filteredDecks = [...filteredDecks].sort((a, b) => { - if (sortBy === "date-asc") { - return a.created.localeCompare(b.created) - } else if (sortBy === "date-desc") { - return b.created.localeCompare(a.created) - } else if (sortBy === "abc-asc") { - return a.name.localeCompare(b.name) - } else if (sortBy === "abc-desc") { - return b.name.localeCompare(a.name) - } - return 0 - }) - - return ( -
-
- {/* Filters */} -
-
- setSearch(e.target.value)} - width={240} - placeholder="Keresés..." - className="mr-4" - /> - - Típus: - - {deckTypes.map((type) => ( - - ))} - Eredet: - - - Rendezés: - - - - {showSortHelp && ( - setShowSortHelp(false)}> -

Rendezési lehetőségek magyarázata

-
    -
  • - 📅↑ – Dátum szerint növekvő sorrendben (legrégebbi - elöl) -
  • -
  • - 📅↓ – Dátum szerint csökkenő sorrendben (legújabb elöl) -
  • -
  • - A→Z – Név szerint növekvő sorrendben (A-tól Z-ig) -
  • -
  • - Z→A – Név szerint csökkenő sorrendben (Z-től A-ig) -
  • -
- -
- )} -
-
- {/* Decks Grid */} -
- {/* Create New Deck (Mockup) */} -
- - Új pakli létrehozása -
- {/* Existing Decks (Mockup) */} - {filteredDecks.map((deck) => { - const deckType = deckTypes.find((t) => t.label === deck.type) - const borderColor = deckType ? deckType.color : "var(--color-success)" - return ( -
-
- - {deck.type === "Luck" - ? "Szerencse" - : deck.type === "Question" - ? "Kérdés" - : deck.type === "Fun" - ? "Szórakozás" - : deck.type} - -

- {deck.name} -

-
-
- Létrehozva: {deck.created} -
-
- ) - })} -
-
-
- ) -} - -export default DeckManager diff --git a/SerpentRace_Frontend/src/components/Landingpage/LandingPage.jsx b/SerpentRace_Frontend/src/components/Landingpage/LandingPage.jsx deleted file mode 100644 index 86f1f507..00000000 --- a/SerpentRace_Frontend/src/components/Landingpage/LandingPage.jsx +++ /dev/null @@ -1,178 +0,0 @@ -import React from "react" -import SerpentRaceAnimation from "../../assets/SerpentRace_Animation/SerpentRace_Animation.jsx" -import LogoCard from "../../assets/pictures/LogoCard.jsx" -import logoImg from "../../assets/pictures/Logo.png" -import ButtonGreen from "../Buttons/ButtonGreen.jsx" -import { FaUsers, FaPaintBrush, FaHeadset } from "react-icons/fa" -import { motion } from "framer-motion" - -const LandingPage = ({ onNavigateToPlay, onNavigateToAuth }) => { - return ( -
- {/* Hero Section */} - -
- {/* Animált logo és cím */} -
- -
- - - A társasjáték, ami összeköt - - - - A SerpentRace egy társasjáték, ahol új barátokra lelhetsz, közösséget építhetsz és tanulhatsz – - mindezt szórakozva! - - - WE ARE READY, ARE YOU? - - - - - - -
-
- - {/* Features Section */} - -
- - Miért a SerpentRace a legjobb választás? - - -
- {/* Feature 1 */} - -
- -
-

Közösségi élmény

-

- Ismerkedj, nevess, tanulj! A SerpentRace összehozza a társaságot, legyen szó baráti - összejövetelről vagy csapatépítésről. -

-
- - {/* Feature 2 */} - -
- -
-

Személyre szabható

-

- Kérdéskártyák, szabályok, design – minden a te igényeidhez igazítható, akár céges brandinggel - is! -

-
- - {/* Feature 3 */} - -
- -
-

Folyamatos támogatás

-

- Gyors, segítőkész ügyfélszolgálat – ha bármilyen kérdésed vagy problémád van, mindig - számíthatsz ránk! -

-
-
-
-
- - {/* Call to Action Section */} - -
- -

- Próbáld ki te is a SerpentRace-t! -

- -

- Legyél részese egy új közösségi élménynek, vagy rendeld meg saját, személyre szabott - társasjátékodat – mi mindenben segítünk! -

- - -
-
-
-
- ) -} - -export default LandingPage diff --git a/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx b/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx deleted file mode 100644 index 81e65632..00000000 --- a/SerpentRace_Frontend/src/components/Landingpage/PlayMenu.jsx +++ /dev/null @@ -1,77 +0,0 @@ -import React, { useState } from "react" -import LogoCard from "../../assets/pictures/LogoCard.jsx" -import logoImg from "../../assets/pictures/Logo.png" // <-- EZT ADD HOZZÁ -import ButtonDark from "../Buttons/ButtonDark.jsx" -import InputBoxDark from "../Inputs/InputBoxDark.jsx" - -const PlayMenu = ({ onJoinGame, onCreateGame, user }) => { - const [joinCode, setJoinCode] = useState("") - const [error, setError] = useState("") - - const handleJoin = () => { - if (!joinCode.trim()) { - setError("Add meg a játék kódját!") - return - } - setError("") - onJoinGame(joinCode) - } - - const handleCreate = () => { - onCreateGame() - } - - return ( -
- {/* Bal oldali animáció/kép */} -
- -
- {/* Jobb oldali panel */} -
-
-
-

Csatlakozás játékhoz

-
- setJoinCode(e.target.value)} - width="w-full" - /> -
- {error &&
{error}
} -
- -
-
- {user && ( -
-

Új játék létrehozása

- -
- )} -
-
-
- ) -} - -export default PlayMenu diff --git a/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx b/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx deleted file mode 100644 index 3d03f6b6..00000000 --- a/SerpentRace_Frontend/src/components/Navbar/Navbar.jsx +++ /dev/null @@ -1,89 +0,0 @@ -import React, { useState } from "react" -import Logo from "../../assets/pictures/Logo" -import About from "../../pages/About/About" - -const navLinkClass = "px-3 py-2 rounded-lg text-white transition-all duration-200 hover:bg-white/10" - -const Navbar = () => { - const [menuOpen, setMenuOpen] = useState(false) - - return ( - - - ) -} - -export default Navbar diff --git a/SerpentRace_Frontend/src/components/PopUp/History.jsx b/SerpentRace_Frontend/src/components/PopUp/History.jsx deleted file mode 100644 index 55985a21..00000000 --- a/SerpentRace_Frontend/src/components/PopUp/History.jsx +++ /dev/null @@ -1,59 +0,0 @@ -import { useState } from "react"; -import Button from "../../components/Buttons/Button"; -import InputBox from "../../components/Inputs/InputBox"; -import PopUp from "../../components/PopUp/PopUp"; - -const jatekEredmenyek = [ - { helyezes: 1, datum: "2025-03-24 14:22" }, - { helyezes: 5, datum: "2025-03-24 14:20" }, - { helyezes: 3, datum: "2025-03-24 14:18" }, - { helyezes: 4, datum: "2025-03-24 14:15" }, -]; - -export default function Test() { - const [showPopup, setShowPopup] = useState(false); - const [inputValue, setInputValue] = useState(""); - - return ( -
- setInputValue(e.target.value)} - /> -
- - - )} - - ); -} diff --git a/SerpentRace_Frontend/src/components/PopUp/PopUp.jsx b/SerpentRace_Frontend/src/components/PopUp/PopUp.jsx deleted file mode 100644 index ac7a471f..00000000 --- a/SerpentRace_Frontend/src/components/PopUp/PopUp.jsx +++ /dev/null @@ -1,21 +0,0 @@ -// src/components/PopUp/PopUp.jsx -// sima komponens, ami megjeleníti a popupot - -import React from "react" - -export default function PopUp({ children, onClose }) { - return ( -
-
- - {children} -
-
- ) -} diff --git a/SerpentRace_Frontend/src/components/PopUp/RatingSet.jsx b/SerpentRace_Frontend/src/components/PopUp/RatingSet.jsx deleted file mode 100644 index 5c61f7e8..00000000 --- a/SerpentRace_Frontend/src/components/PopUp/RatingSet.jsx +++ /dev/null @@ -1,27 +0,0 @@ -// src/components/PopUp/RatingSet.jsx - -export default function RatingSet() { - // Ezeket lehet később props-ból vagy API-ból is betölteni - const stats = [ - { label: "Win Rate", value: "68%" }, - { label: "Success Rate", value: "85%" }, - { label: "My cards rate", value: "72%" }, - ]; - - return ( -
-

Statisztikák

-
- {stats.map((stat, index) => ( -
-

{stat.label}

- {stat.value} -
- ))} -
-
- ); -} diff --git a/SerpentRace_Frontend/src/components/ScrollToTop.jsx b/SerpentRace_Frontend/src/components/ScrollToTop.jsx deleted file mode 100644 index ab3bf700..00000000 --- a/SerpentRace_Frontend/src/components/ScrollToTop.jsx +++ /dev/null @@ -1,14 +0,0 @@ -import { useEffect } from "react"; -import { useLocation } from "react-router-dom"; - -const ScrollToTop = () => { - const { pathname } = useLocation(); - - useEffect(() => { - window.scrollTo({ top: 0, behavior: "smooth" }); - }, [pathname]); - - return null; -}; - -export default ScrollToTop; diff --git a/SerpentRace_Frontend/src/components/Search/SearchBox.jsx b/SerpentRace_Frontend/src/components/Search/SearchBox.jsx deleted file mode 100644 index 3d5bb7fd..00000000 --- a/SerpentRace_Frontend/src/components/Search/SearchBox.jsx +++ /dev/null @@ -1,22 +0,0 @@ -import React from "react" -import { FaSearch } from "react-icons/fa" - -const SearchBox = ({ value, onChange, width = 220, placeholder = "Keresés...", className = "" }) => { - return ( -
- - -
- ) -} - -export default SearchBox diff --git a/SerpentRace_Frontend/src/components/Userdetails/Userdetails.jsx b/SerpentRace_Frontend/src/components/Userdetails/Userdetails.jsx deleted file mode 100644 index 3fcd1134..00000000 --- a/SerpentRace_Frontend/src/components/Userdetails/Userdetails.jsx +++ /dev/null @@ -1,161 +0,0 @@ -import React, { useState } from "react" -import { - FaCommentDots, - FaUserFriends, - FaBriefcase, - FaFacebookF, - FaTwitter, - FaDribbble, - FaSun, - FaMoon, - FaMedal -} from "react-icons/fa" - -const ProfileCard = () => { - const [darkMode, setDarkMode] = useState(false) - const activityLevel = 87 - const isPremium = true - - let activityColor = "" - let activityEmoji = "" - let blocksToColor = 1 - let celebrationEmoji = "" - - if (activityLevel <= 24) { - activityColor = "red-600" - activityEmoji = "😞" - blocksToColor = 1 - } else if (activityLevel <= 49) { - activityColor = "orange-500" - activityEmoji = "😐" - blocksToColor = 2 - } else if (activityLevel <= 74) { - activityColor = "yellow-400" - activityEmoji = "🙂" - blocksToColor = 3 - } else { - activityColor = "emerald-500" - activityEmoji = "😄" - blocksToColor = 4 - celebrationEmoji = "🎉" - } - - const colorMap = { - "red-600": "#dc2626", - "orange-500": "#f97316", - "yellow-400": "#facc15", - "emerald-500": "#10b981" - } - - const getBlockStyle = (index) => ({ - backgroundColor: index < blocksToColor ? colorMap[activityColor] : (darkMode ? "#4b5563" : "#d1d5db") - }) - - const stats = [ - { label: "Játékok", value: 1256, icon: }, - { label: "Barátok", value: 8562, icon: }, - { label: "Győzelmek", value: 189, icon: }, - { label: "Badge-ek", value: 6, icon: } - ] - - const badges = ["🏆", "🔥", "🎯", "🧠", "💎", "🚀"] - - return ( -
-
- - - -
- Avatar - -
-

- BÉKAAAAA -

-
-
- {isPremium ? "Premium Account" : "Free Account"} -
-
-

- Active | Male | 23.05.1992 -

-
- -
-

- Activity Level: {activityLevel}% - {activityEmoji} - {celebrationEmoji && {celebrationEmoji}} -

-
- -
- {[0, 1, 2, 3].map(i => ( -
- ))} -
- - {/* Badge szekció */} -
-

Badge-ek

-
- {badges.map((badge, i) => ( - - {badge} - - ))} -
-
- - {/* Statisztikák */} -
- {stats.map((s, i) => ( -
-
{s.icon}
-

{s.value}

-

{s.label}

-
- ))} -
- -

- Gyere és játsz velünk! -

- -
- - - -
-
-
-
- ) -} - -export default ProfileCard - - -import UserProfile from "../../components/Userdetails/Userdetails.jsx" - diff --git a/SerpentRace_Frontend/src/index.css b/SerpentRace_Frontend/src/index.css deleted file mode 100644 index c62959a3..00000000 --- a/SerpentRace_Frontend/src/index.css +++ /dev/null @@ -1,48 +0,0 @@ -@import "tailwindcss"; - -@theme { - /* Fő színek */ - --color-night: #0d0d0f; - --color-battleship-gray: #8d8e83; - --color-gunmetal: #222d2f; - --color-eerie-black: #181d23; - - --color-mint: #15803d; - --color-mint-dark: #136636; - --color-mint-darker: #11522b; - - /* Gombok */ - --color-button-primary: #16a34a; - --color-button-primary-hover: #15803d; - --color-button-secondary: #181d23; - --color-button-secondary-hover: #0d0d0f; - --color-button-green: #178a5b; - --color-button-green-hover: #14784d; - - /* Funkcionális színek */ - --color-primary: #15803d; - --color-secondary: #8d8e83; - --color-accent: #0d0d0f; - - /* Deck típus színek */ - --color-luck: #5fa985; /* zöld, mint a success */ - --color-question: #4f7be6; /* új kék, illik az oldalhoz */ - --color-fun: #e15b64; /* piros, mint az error */ - - /* Háttérszínek */ - --color-background: #181d23; - --color-background-selected: #232a31; - --color-surface: #222d2f; - --color-surface-selected: #314045; - --color-card: #2c383b; - - /* Szövegszínek */ - --color-text: #f0f0ff; - --color-text-muted: #c0c0c0; - --color-text-inverse: #0d0d0f; - - /* Hatás/állapot színek */ - --color-success: #5fa985; - --color-warning: #e6c04f; - --color-error: #e15b64; -} diff --git a/SerpentRace_Frontend/src/main.jsx b/SerpentRace_Frontend/src/main.jsx deleted file mode 100644 index b9a1a6de..00000000 --- a/SerpentRace_Frontend/src/main.jsx +++ /dev/null @@ -1,10 +0,0 @@ -import { StrictMode } from 'react' -import { createRoot } from 'react-dom/client' -import './index.css' -import App from './App.jsx' - -createRoot(document.getElementById('root')).render( - - - , -) diff --git a/SerpentRace_Frontend/src/pages/About/About.jsx b/SerpentRace_Frontend/src/pages/About/About.jsx deleted file mode 100644 index f87c9257..00000000 --- a/SerpentRace_Frontend/src/pages/About/About.jsx +++ /dev/null @@ -1,163 +0,0 @@ -import React, { useEffect, useRef, useState } from "react" -import Navbar from "../../components/Navbar/Navbar" -import Footer from "../../components/Footer/Footer" -import Background from "../../assets/backgrounds/Background.jsx" -import Walke from "../../assets/pictures/walke.jpg" -import Busi from "../../assets/pictures/busi.jpg" -import Gege from "../../assets/pictures/gege.jpg" -import Zsola from "../../assets/pictures/zsola.jpg" -import Donat from "../../assets/pictures/donat.jpg" -import Turo from "../../assets/pictures/turo.jpg" -import Piskor from "../../assets/pictures/piskor.jpg" - -const About = () => { - const [visible, setVisible] = useState(false) - const sectionRef = useRef(null) - - const teamMembers = [ - { - name: "Magda Donát", - role: "Backend fejlesztő", - photo: Donat, - }, - { - name: "Máté Gergely", - role: "UI/UX designer", - photo: Gege, - }, - { - name: "Walke Gábor", - role: "UI/UX designer, Frontend fejlesztő", - photo: Walke, - }, - { - name: "Piskor Barnabás", - role: "Frontend fejlesztő", - photo: Piskor, - }, - { - name: "Buús Levente", - role: "UI/UX designer", - photo: Busi, - }, - { - name: "Pintér Zsolt", - role: "UI/UX designer", - photo: Zsola, - }, - { - name: "Thuróczy Attila", - role: "UI/UX designer", - photo: Turo, - }, - ] - - useEffect(() => { - const observer = new IntersectionObserver( - ([entry]) => { - if (entry.isIntersecting) setVisible(true) - }, - { threshold: 0.3 } - ) - if (sectionRef.current) observer.observe(sectionRef.current) - return () => observer.disconnect() - }, []) - - return ( -
- - {/* Háttér – fix pozíció, a teljes képernyőre */} -
- -
- - {/* Navbar fix */} -
- -
- - {/* Tartalom */} -
- - {/* Vissza gomb */} -
-
- Főoldalra -
-
- -
- {/* Rólunk cím */} -

- Rólunk -

- - {/* Leírás */} -

- Célunk, hogy egy innovatív, közösségorientált platformot építsünk, ahol a versenyzés, játék és technológia találkozik. Elhivatott csapatunk minden nap azon dolgozik, hogy élményt és értéket nyújtson a felhasználóinknak. -

- - {/* Küldetésünk */} -
-

Küldetésünk

-
-
-

Innováció

-

Folyamatosan fejlesztjük rendszereinket a legmodernebb technológiákkal.

-
-
-

Közösség

-

Fontos számunkra, hogy egy összetartó, aktív közösséget építsünk ki.

-
-
-

Minőség

-

Minden részletre figyelünk a felhasználói élmény és biztonság érdekében.

-
-
-
- - {/* Csapat */} -
-

Csapatunk

-
- {teamMembers.map((member, i) => { - const isLast = i === teamMembers.length - 1 - const itemsInLastRow = teamMembers.length % 3 - const shouldCenter = itemsInLastRow === 1 && isLast - - return ( -
- {member.name} -

{member.name}

-

{member.role}

-
- ) - })} -
-
-
-
- - {/* Footer (nem scrollozható alá) */} -
-
-
-
- ) -} - -export default About diff --git a/SerpentRace_Frontend/src/pages/Auth/AuthCard.jsx b/SerpentRace_Frontend/src/pages/Auth/AuthCard.jsx deleted file mode 100755 index e3656e24..00000000 --- a/SerpentRace_Frontend/src/pages/Auth/AuthCard.jsx +++ /dev/null @@ -1,46 +0,0 @@ -// src/pages/Auth/AuthLogin.jsx -// Kártya amelyiken a bejelentkezés és regisztráció van - -import { motion, AnimatePresence } from "framer-motion"; -import Animation from "../../assets/SerpentRace_Animation/SerpentRace_Animation"; -import LoginForm from "./LoginForm"; -import RegisterForm from "./RegisterForm"; -import Logo from "../../assets/pictures/Logo"; - -export default function AuthCard({ isRegistering, setIsRegistering }) { - return ( - - {/* Bal oldali kép és szöveg */} -
- -
- -

- Lépj be és légy a legjobb! -

-
- - {/* Jobb oldali űrlap */} -
- - {isRegistering ? : } - - setIsRegistering(!isRegistering)} - > - {isRegistering - ? "Már van fiókod? Jelentkezz be itt!" - : "Nincs még fiókod? Regisztrálj itt!"} - -
- - ); -} diff --git a/SerpentRace_Frontend/src/pages/Auth/AuthLogin.jsx b/SerpentRace_Frontend/src/pages/Auth/AuthLogin.jsx deleted file mode 100755 index 6b3eda73..00000000 --- a/SerpentRace_Frontend/src/pages/Auth/AuthLogin.jsx +++ /dev/null @@ -1,18 +0,0 @@ -// src/pages/Auth/AuthLogin.jsx -// Login url címre érkezés (registering = false) - -import { useState } from "react"; -import Background from "../../assets/backgrounds/Background"; -import AuthCard from "./AuthCard"; - -export default function AuthLogin() { - const [isRegistering, setIsRegistering] = useState(false); - - return ( -
- - - -
- ); -} diff --git a/SerpentRace_Frontend/src/pages/Auth/AuthRegister.jsx b/SerpentRace_Frontend/src/pages/Auth/AuthRegister.jsx deleted file mode 100755 index e4716f57..00000000 --- a/SerpentRace_Frontend/src/pages/Auth/AuthRegister.jsx +++ /dev/null @@ -1,17 +0,0 @@ -// src/pages/Auth/AuthRegister.jsx -// Register url címre érkezés (registering = true) - -import { useState } from "react"; -import Background from "../../assets/backgrounds/Background"; -import AuthCard from "./AuthCard"; - -export default function AuthRegister() { - const [isRegistering, setIsRegistering] = useState(true); - - return ( -
- - -
- ); -} diff --git a/SerpentRace_Frontend/src/pages/Auth/EmailVerification.jsx b/SerpentRace_Frontend/src/pages/Auth/EmailVerification.jsx deleted file mode 100755 index 1a018745..00000000 --- a/SerpentRace_Frontend/src/pages/Auth/EmailVerification.jsx +++ /dev/null @@ -1,89 +0,0 @@ -// src/pages/Auth/EmailVerification.jsx -// Rublikák a kód beírásához, email ellenőrzéshez - -import { useState, useRef } from "react"; -import Background from "../../assets/backgrounds/Background"; -import { motion } from "framer-motion"; -import Button from "../../components/Buttons/Button"; - - -export default function EmailVerification() { - const [code, setCode] = useState(Array(6).fill("")); - const inputRefs = useRef([]); - - const handleChange = (e, index) => { - const { value } = e.target; - if (/^\d*$/.test(value) && value.length <= 1) { - const newCode = [...code]; - newCode[index] = value; - setCode(newCode); - if (value && index < 5) { - inputRefs.current[index + 1].focus(); - } - } - }; - - const handleKeyDown = (e, index) => { - if (e.key === "Backspace" && !code[index] && index > 0) { - inputRefs.current[index - 1].focus(); - } else if (e.key === "ArrowLeft" && index > 0) { - inputRefs.current[index - 1].focus(); - } else if (e.key === "ArrowRight" && index < 5) { - inputRefs.current[index + 1].focus(); - } else if (/^\d$/.test(e.key) && code[index]) { - e.preventDefault(); - const newCode = [...code]; - newCode[index] = e.key; - setCode(newCode); - - if (index < 5) { - setTimeout(() => { - inputRefs.current[index + 1].focus(); - }, 0); - } - } - }; - - const handleSubmit = (e) => { - e.preventDefault(); - console.log("Kód:", code.join("")); - // Backend API - }; - - return ( -
- - -
-

- Email megerősítés -

-
-
- {code.map((digit, index) => ( - handleChange(e, index)} - onKeyDown={(e) => handleKeyDown(e, index)} - ref={(el) => (inputRefs.current[index] = el)} - className={`w-12 h-12 px-2 py-3 border rounded-lg focus:ring-4 focus:ring-indigo-400 text-gray-700 placeholder-gray-400 bg-gray-50 text-center text-2xl tracking-widest ${!digit ? 'placeholder-opacity-100' : 'placeholder-opacity-0'}`} - // nem tudom, hogy hogyan jobb - // placeholder="_" - maxLength="1" - /> - ))} -
-
-
-
- ); -} \ No newline at end of file diff --git a/SerpentRace_Frontend/src/pages/Auth/ForgotPassword.jsx b/SerpentRace_Frontend/src/pages/Auth/ForgotPassword.jsx deleted file mode 100644 index 0d70df12..00000000 --- a/SerpentRace_Frontend/src/pages/Auth/ForgotPassword.jsx +++ /dev/null @@ -1,45 +0,0 @@ -// src/pages/Auth/ForgotPassword.jsx -// Itt kéri az emailt amire a jelszó visszaállítást kérjük - -import { useState } from "react"; -import Background from "../../assets/backgrounds/Background"; -import { motion } from "framer-motion"; -import Button from "../../components/Buttons/Button"; -import InputBox from "../../components/Inputs/InputBox"; - -export default function ForgotPassword() { - const [email, setEmail] = useState(""); - - const handleSubmit = (e) => { - e.preventDefault(); - // Backend API - console.log("Elfelejtett jelszó email:", email); - }; - - return ( -
- - -
-

- Elfelejtett jelszó -

-
- setEmail(e.target.value)} - /> -
-
-
- ); -} diff --git a/SerpentRace_Frontend/src/pages/Auth/LoginForm.jsx b/SerpentRace_Frontend/src/pages/Auth/LoginForm.jsx deleted file mode 100755 index 76276c10..00000000 --- a/SerpentRace_Frontend/src/pages/Auth/LoginForm.jsx +++ /dev/null @@ -1,62 +0,0 @@ -// src/pages/Auth/LoginForm.jsx -// Bejelentkezési űrlap - -import InputBox from "../../components/Inputs/InputBox"; -import Button from "../../components/Buttons/Button"; -import { motion } from "framer-motion"; -import { useState } from "react"; - -export default function LoginForm() { - const [email, setEmail] = useState(""); - const [password, setPassword] = useState(""); - const [error, setError] = useState(""); - - function validateEmail(email) { - return /\S+@\S+\.\S+/.test(email); - } - - const handleSubmit = (e) => { - e.preventDefault(); - setError(""); - if (!email || !password) { - setError("Minden mező kitöltése kötelező."); - return; - } - if (!validateEmail(email)) { - setError("Hibás email formátum."); - return; - } - // Backend API - console.log("Bejelentkezés:", { email, password }); - }; - - return ( - -

Bejelentkezés

- {error && ( -
{error}
- )} -
- setEmail(e.target.value)} - /> - setPassword(e.target.value)} - /> -
-
-
- ); -} diff --git a/SerpentRace_Frontend/src/pages/Companies/Companies.jsx b/SerpentRace_Frontend/src/pages/Companies/Companies.jsx deleted file mode 100644 index 0a73794b..00000000 --- a/SerpentRace_Frontend/src/pages/Companies/Companies.jsx +++ /dev/null @@ -1,226 +0,0 @@ -import React from "react" -import Navbar from "../../components/Navbar/Navbar.jsx" -import Footer from "../../components/Footer/Footer.jsx" -import Background from "../../assets/backgrounds/Background" -import { - FaBuilding, - FaEnvelope, - FaHandshake, - FaPalette, - FaTags, - FaUserCheck, - FaDollarSign, - FaChartLine, - FaVideo, - FaHandsHelping, - FaTrophy, - FaChartBar, - FaUsers, - FaHeadset, -} from "react-icons/fa" - -const Card = ({ icon, label, description, targetId, className }) => { - const handleClick = () => { - const section = document.getElementById(targetId) - if (section) { - section.scrollIntoView({ behavior: "smooth" }) - } - } - - return ( -
-
{icon}
-

{label}

-

{description}

-
- ) -} - -const SectionContainer = ({ id, title, children }) => { - return ( -
-
-

- {title} -

-
- {children} -
- ) -} - -const CompanyHub = () => { - return ( -
- {/* Background fixed behind everything */} -
- -
- -
- - -
-
- } - label="Mit nyújtunk" - description="Játékosított tanulási platform cégeknek." - targetId="intro" - className="bg-gradient-to-br from-pink-500 via-purple-600 to-purple-800" - /> - } - label="Kapcsolat" - description="Lépj kapcsolatba velünk vagy kérj ajánlatot!" - targetId="contact" - className="bg-gradient-to-br from-blue-700 to-blue-500" - /> - } - label="Csatlakozás" - description="Legyél partnerünk, és fejlődj velünk!" - targetId="join" - className="bg-gradient-to-br from-green-700 to-green-500" - /> -
- - {/* Mit nyújtunk */} - -
- {/* Egyénre szabás */} -
-

- - Egyénre szabás -

-
    -
  • - - Testreszabható design és színek -
  • -
  • - - Egyedi badge és jutalmazási rendszer -
  • -
  • - - Fejlődési útvonalak -
  • -
-
- - {/* Árazás */} -
-

- - Árazás -

-
    -
  • - - Kedvezményes csomagok KKV-knak -
  • -
  • - - Testreszabott megoldások -
  • -
  • - - Nincs rejtett költség -
  • -
-
- - {/* Demó videó */} -
-

- - Csapatunk videó -

- -
-
-
- - {/* Contact + Join Section */} -
- {/* Contact */} -
-

- Kapcsolatfelvétel cégeknek -

-
- - -