feat: Complete NestJS backend scaffold — 22 modules, 39 entities, WebSocket gateway
All checks were successful
Test Asgard Runner / test (push) Successful in 3s

Full backend rewrite from Rust/Axum to NestJS/TypeScript.
- 22 feature modules (auth, servers, wipes, maps, plugins, players, console,
  chat, team, notifications, settings, schedules, analytics, alerts, status,
  store, webstore, admin, setup, migration, users, licenses)
- 39 TypeORM entities matching PostgreSQL schema (12 migrations)
- Common infrastructure: JWT/RBAC guards, decorators, exception filter
- NATS service with pub/sub/request-reply
- Socket.IO WebSocket gateway with NATS bridge
- Docker: NestJS Dockerfile + updated docker-compose.yml
- Zero compile errors (npx tsc --noEmit clean)

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Vantz Stockwell
2026-02-15 21:29:25 -05:00
parent 0f8d0dd14f
commit d20493d533
141 changed files with 13552 additions and 4 deletions

View File

@@ -0,0 +1,24 @@
import { IsString, IsOptional, MaxLength, IsObject } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
export class CreateProfileDto {
@ApiProperty({ example: 'Standard Monthly Wipe', maxLength: 100 })
@IsString()
@MaxLength(100)
profile_name: string;
@ApiPropertyOptional({ example: 'Complete wipe with all plugins reset' })
@IsOptional()
@IsString()
description?: string;
@ApiPropertyOptional({ example: { backup: true, notify_players: true } })
@IsOptional()
@IsObject()
pre_wipe_config?: Record<string, any>;
@ApiPropertyOptional({ example: { start_server: true, send_discord_notification: true } })
@IsOptional()
@IsObject()
post_wipe_config?: Record<string, any>;
}

View File

@@ -0,0 +1,33 @@
import { IsString, IsEnum, IsUUID, IsOptional, IsBoolean, MaxLength } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
export class CreateScheduleDto {
@ApiProperty({ example: '550e8400-e29b-41d4-a716-446655440000' })
@IsUUID()
wipe_profile_id: string;
@ApiProperty({ example: 'Weekly Thursday Wipe', maxLength: 100 })
@IsString()
@MaxLength(100)
schedule_name: string;
@ApiProperty({ example: 'map', enum: ['map', 'blueprint', 'full'] })
@IsEnum(['map', 'blueprint', 'full'])
wipe_type: 'map' | 'blueprint' | 'full';
@ApiProperty({ example: '0 14 * * 4', description: 'Cron expression for schedule' })
@IsString()
@MaxLength(100)
cron_expression: string;
@ApiPropertyOptional({ example: 'America/New_York', default: 'America/New_York' })
@IsOptional()
@IsString()
@MaxLength(50)
timezone?: string;
@ApiPropertyOptional({ example: false, default: false })
@IsOptional()
@IsBoolean()
wipe_blueprints?: boolean;
}

View File

@@ -0,0 +1,13 @@
import { IsEnum, IsUUID, IsOptional } from 'class-validator';
import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger';
export class TriggerWipeDto {
@ApiProperty({ example: 'map', enum: ['map', 'blueprint', 'full'] })
@IsEnum(['map', 'blueprint', 'full'])
wipe_type: 'map' | 'blueprint' | 'full';
@ApiPropertyOptional({ example: '550e8400-e29b-41d4-a716-446655440000' })
@IsOptional()
@IsUUID()
wipe_profile_id?: string;
}

View File

@@ -0,0 +1,4 @@
import { PartialType } from '@nestjs/swagger';
import { CreateProfileDto } from './create-profile.dto';
export class UpdateProfileDto extends PartialType(CreateProfileDto) {}