import { Controller, Get, Post, Patch, Delete, Body, Param, UseGuards, } from '@nestjs/common'; import { AuthGuard } from '@nestjs/passport'; import { ApiTags, ApiOperation, ApiBearerAuth } from '@nestjs/swagger'; import { ClustersService } from './clusters.service'; import { CreateClusterDto, UpdateClusterDto } from './dto/cluster.dto'; import { CreateClusterPoolDto, UpdateClusterPoolDto } from './dto/cluster-pool.dto'; import { RolesGuard } from '../common/guards/roles.guard'; import { Roles } from '../common/decorators/roles.decorator'; import { UserRole } from '../common/enums'; @ApiTags('Clusters') @ApiBearerAuth() @Controller('clusters') @UseGuards(AuthGuard('jwt'), RolesGuard) export class ClustersController { constructor(private readonly clustersService: ClustersService) {} // ─── Public endpoints (any authenticated user) ──────────────────── @Get('public') @ApiOperation({ summary: 'List available clusters (public info, no kubeconfig)' }) async findAllPublic() { return this.clustersService.findAllPublic(); } @Get('pools/public') @ApiOperation({ summary: 'List active cluster pools with resolved cluster names' }) async findAllPoolsPublic() { return this.clustersService.findAllPoolsPublic(); } // ─── Cluster admin endpoints ────────────────────────────────────── @Post() @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Register a new Kubernetes cluster (Admin/Technical)' }) async create(@Body() dto: CreateClusterDto) { return this.clustersService.create(dto); } @Get() @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'List all clusters (Admin/Technical)' }) async findAll() { return this.clustersService.findAll(); } @Get(':id/resources') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Get cluster resource usage — nodes, CPU, memory, pods (Admin/Technical)' }) async getClusterResources(@Param('id') id: string) { return this.clustersService.getClusterResources(id); } @Get(':id') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Get cluster details (Admin/Technical)' }) async findOne(@Param('id') id: string) { return this.clustersService.findOne(id); } @Patch(':id') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Update cluster configuration (Admin/Technical)' }) async update(@Param('id') id: string, @Body() dto: UpdateClusterDto) { return this.clustersService.update(id, dto); } @Post(':id/test') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Test connectivity to a registered cluster (Admin/Technical)' }) async testConnection(@Param('id') id: string) { return this.clustersService.testClusterById(id); } @Delete(':id') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Remove a cluster (Admin/Technical)' }) async delete(@Param('id') id: string) { await this.clustersService.delete(id); return { message: 'Cluster deleted' }; } // ─── Cluster Pool admin endpoints ───────────────────────────────── @Post('pools') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Create a cluster pool for load balancing (Admin/Technical)' }) async createPool(@Body() dto: CreateClusterPoolDto) { return this.clustersService.createPool(dto); } @Get('pools') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'List all cluster pools (Admin/Technical)' }) async findAllPools() { return this.clustersService.findAllPools(); } @Get('pools/:id') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Get cluster pool details (Admin/Technical)' }) async findOnePool(@Param('id') id: string) { return this.clustersService.findOnePool(id); } @Patch('pools/:id') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Update cluster pool (Admin/Technical)' }) async updatePool(@Param('id') id: string, @Body() dto: UpdateClusterPoolDto) { return this.clustersService.updatePool(id, dto); } @Delete('pools/:id') @Roles(UserRole.ADMIN, UserRole.TECHNICAL) @ApiOperation({ summary: 'Delete a cluster pool (Admin/Technical)' }) async deletePool(@Param('id') id: string) { await this.clustersService.deletePool(id); return { message: 'Cluster pool deleted' }; } }