# Code coverage report for modules/ai/ai.controller.ts

# All files / modules/ai ai.controller.ts

0% Statements 0/26
0% Branches 0/4
0% Functions 0/8
0% Lines 0/24

Press n or j to go to the next uncovered block, b, p or k for the previous block.

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121

     import {
      Controller,
      Get,
      Post,
      Patch,
      Body,
      Query,
      UseGuards,
      HttpCode,
      HttpStatus,
    } from '@nestjs/common';
    import {
      ApiTags,
      ApiOperation,
      ApiResponse,
      ApiBearerAuth,
      ApiQuery,
    } from '@nestjs/swagger';
    import { JwtAuthGuard } from '../auth/guards/jwt-auth.guard';
    import { CurrentUser } from '../auth/decorators/current-user.decorator';
    import { AIService } from './services';
    import {
      ChatRequestDto,
      ChatResponseDto,
      UpdateAIConfigDto,
      AIConfigResponseDto,
      UsageStatsDto,
      AIModelDto,
    } from './dto';

    interface RequestUser {
      id: string;
      tenant_id: string;
      email: string;
      role: string;
    }

    @ApiTags('ai')
    @Controller('ai')
    @UseGuards(JwtAuthGuard)
    @ApiBearerAuth()
    export class AIController {
      constructor(private readonly aiService: AIService) {}

      // ==================== Chat ====================

      @Post('chat')
      @HttpCode(HttpStatus.OK)
      @ApiOperation({ summary: 'Send chat completion request' })
      @ApiResponse({ status: 200, description: 'Chat response', type: ChatResponseDto })
      @ApiResponse({ status: 400, description: 'Bad request or AI disabled' })
      async chat(
        @CurrentUser() user: RequestUser,
        @Body() dto: ChatRequestDto,
      ): Promise<ChatResponseDto> {
        return this.aiService.chat(user.tenant_id, user.id, dto);
      }

      // ==================== Models ====================

      @Get('models')
      @ApiOperation({ summary: 'List available AI models' })
      @ApiResponse({ status: 200, description: 'List of models', type: [AIModelDto] })
      async getModels(): Promise<AIModelDto[]> {
        return this.aiService.getModels();
      }

      // ==================== Configuration ====================

      @Get('config')
      @ApiOperation({ summary: 'Get AI configuration for tenant' })
      @ApiResponse({ status: 200, description: 'AI configuration', type: AIConfigResponseDto })
      async getConfig(@CurrentUser() user: RequestUser): Promise<AIConfigResponseDto> {
        const config = await this.aiService.getConfig(user.tenant_id);
        return config as AIConfigResponseDto;
      }

      @Patch('config')
      @ApiOperation({ summary: 'Update AI configuration' })
      @ApiResponse({ status: 200, description: 'Updated configuration', type: AIConfigResponseDto })
      async updateConfig(
        @CurrentUser() user: RequestUser,
        @Body() dto: UpdateAIConfigDto,
      ): Promise<AIConfigResponseDto> {
        const config = await this.aiService.updateConfig(user.tenant_id, dto);
        return config as AIConfigResponseDto;
      }

      // ==================== Usage ====================

      @Get('usage')
      @ApiOperation({ summary: 'Get usage history' })
      @ApiQuery({ name: 'page', required: false, type: Number })
      @ApiQuery({ name: 'limit', required: false, type: Number })
      async getUsage(
        @CurrentUser() user: RequestUser,
        @Query('page') page = 1,
        @Query('limit') limit = 20,
      ) {
        return this.aiService.getUsageHistory(user.tenant_id, page, limit);
      }

      @Get('usage/current')
      @ApiOperation({ summary: 'Get current month usage stats' })
      @ApiResponse({ status: 200, description: 'Usage statistics', type: UsageStatsDto })
      async getCurrentUsage(@CurrentUser() user: RequestUser): Promise<UsageStatsDto> {
        return this.aiService.getCurrentMonthUsage(user.tenant_id);
      }

      // ==================== Health ====================

      @Get('health')
      @ApiOperation({ summary: 'Check AI service health' })
      async health() {
        return {
          status: this.aiService.isServiceReady() ? 'ready' : 'not_configured',
          timestamp: new Date().toISOString(),
        };
      }
    }