assessment.controller.ts 3.4 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273
  1. import { Controller, Post, Body, Get, Param, UseGuards, Request, Sse, MessageEvent, Query } from '@nestjs/common';
  2. import { map } from 'rxjs/operators';
  3. import { AssessmentService } from './assessment.service';
  4. import { CombinedAuthGuard } from '../auth/combined-auth.guard';
  5. import { ApiTags, ApiOperation, ApiResponse } from '@nestjs/swagger';
  6. @ApiTags('Assessment')
  7. @Controller('assessment')
  8. @UseGuards(CombinedAuthGuard)
  9. export class AssessmentController {
  10. constructor(private readonly assessmentService: AssessmentService) { }
  11. @Post('start')
  12. @ApiOperation({ summary: 'Start a new assessment session' })
  13. async startSession(@Request() req: any, @Body() body: { knowledgeBaseId?: string, language?: string, templateId?: string }) {
  14. const { id: userId, tenantId } = req.user;
  15. console.log(`[AssessmentController] startSession: user=${userId}, tenant=${tenantId}, templateId=${body.templateId}, kbId=${body.knowledgeBaseId}`);
  16. return this.assessmentService.startSession(userId, body.knowledgeBaseId, tenantId, body.language, body.templateId);
  17. }
  18. @Post(':id/answer')
  19. @ApiOperation({ summary: 'Submit an answer to the current question' })
  20. async submitAnswer(
  21. @Request() req: any,
  22. @Param('id') sessionId: string,
  23. @Body() body: { answer: string, language?: string }
  24. ) {
  25. const { id: userId } = req.user;
  26. console.log(`[AssessmentController] submitAnswer: user=${userId}, session=${sessionId}, answerLen=${body.answer?.length}`);
  27. return this.assessmentService.submitAnswer(sessionId, userId, body.answer, body.language);
  28. }
  29. @Sse(':id/start-stream')
  30. @ApiOperation({ summary: 'Stream initial session generation' })
  31. startSessionStream(@Request() req: any, @Param('id') sessionId: string) {
  32. const { id: userId } = req.user;
  33. console.log(`[AssessmentController] startSessionStream: user=${userId}, session=${sessionId}`);
  34. return this.assessmentService.startSessionStream(sessionId, userId).pipe(
  35. map(data => ({ data } as MessageEvent))
  36. );
  37. }
  38. @Sse(':id/answer-stream')
  39. @ApiOperation({ summary: 'Stream answer evaluation and next question generation' })
  40. submitAnswerStream(
  41. @Request() req: any,
  42. @Param('id') sessionId: string,
  43. @Query('answer') answer: string,
  44. @Query('language') language?: string
  45. ) {
  46. const { id: userId } = req.user;
  47. console.log(`[AssessmentController] submitAnswerStream: user=${userId}, session=${sessionId}, lang=${language}`);
  48. return this.assessmentService.submitAnswerStream(sessionId, userId, answer, language).pipe(
  49. map(data => ({ data } as MessageEvent))
  50. );
  51. }
  52. @Get(':id/state')
  53. @ApiOperation({ summary: 'Get the current state of an assessment session' })
  54. async getSessionState(@Request() req: any, @Param('id') sessionId: string) {
  55. const { id: userId } = req.user;
  56. console.log(`[AssessmentController] getSessionState: user=${userId}, session=${sessionId}`);
  57. return this.assessmentService.getSessionState(sessionId, userId);
  58. }
  59. @Get()
  60. @ApiOperation({ summary: 'Get assessment session history' })
  61. async getHistory(@Request() req: any) {
  62. const { id: userId, tenantId } = req.user;
  63. console.log(`[AssessmentController] getHistory: user=${userId}, tenant=${tenantId}`);
  64. return this.assessmentService.getHistory(userId, tenantId);
  65. }
  66. }