/
Qialet
/
StudentLabs
Обзор
Документация
Войти
/
Qialet
/
StudentLabs
Код
Запросы
1
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
src/form/form.controller.ts
178 строк
6 KB
Qialet_PC
Add docs
11 мар 2026, 17:33
11 мар 2026, 17:33
9d9eb66
Код
Авторство
О чём код?
import { Body, Controller, Delete, Get, HttpCode, HttpStatus, Param, ParseUUIDPipe, Patch, Post, Query, Req, } from '@nestjs/common'; import { FormService } from './form.service'; import { CreateFormDto } from './dto/create-form.dto'; import { AuthRequest } from '../auth/type/auth-request.type'; import { ApiBearerAuth, ApiBody, ApiOperation, ApiParam, ApiResponse, ApiTags, } from '@nestjs/swagger'; import { UpdateFormDto } from './dto/update-form.dto'; import { CreateSubmissionDto } from './dto/create-submission.dto'; import { IsNonOwner } from '../auth/decorator/is-non-owner.decorator'; import { GetFormsQueryDto } from './dto/get-forms-query.dto'; import { Form, FormSubmission } from '@prisma/client'; @Controller('form') @ApiBearerAuth() @ApiTags('Forms') export class FormController { constructor(private readonly service: FormService) {} @Post() @ApiOperation({ summary: 'Создать форму', description: 'Создаёт новую форму. Форма привязывается к авторизованному пользователю', }) @ApiBody({ type: CreateFormDto }) @ApiResponse({ status: 201, description: 'Форма создана' }) async create( @Body() dto: CreateFormDto, @Req() request: AuthRequest, ): Promise<Form> { const userId = request.user.sub; return await this.service.create(userId, dto); } @IsNonOwner() @Post(':formId/submissions') @ApiOperation({ summary: 'Отправить ответ на форму', description: 'Отправляет заполненную форму. Владелец формы не может отвечать на свою форму', }) @ApiParam({ name: 'formId', description: 'UUID формы', example: '550e8400-e29b-41d4-a716-446655440000', }) @ApiBody({ type: CreateSubmissionDto }) @ApiResponse({ status: 201, description: 'Ответ записан' }) @ApiResponse({ status: 400, description: 'Ошибка валидации ответов (тип поля / обязательность)', }) @ApiResponse({ status: 404, description: 'Форма не найдена' }) submission( @Param('formId', ParseUUIDPipe) formId: string, @Body() dto: CreateSubmissionDto, @Req() request: AuthRequest, ): Promise<FormSubmission> { const userId = request.user.sub; return this.service.submission(formId, dto, userId); } @Get('my-forms') @ApiOperation({ summary: 'Мои формы', description: 'Возвращает все формы созданные авторизованным пользователем', }) @ApiResponse({ status: 200, description: 'Список форм' }) async getMyForms(@Req() request: AuthRequest): Promise<Form[]> { const userId = request.user.sub; return this.service.getMyForms(userId); } @Get('my-submissions') @ApiOperation({ summary: 'Мои ответы', description: 'Возвращает все отправленные авторизованным пользователем ответы на формы', }) @ApiResponse({ status: 200, description: 'Список ответов' }) async getMySubmissions( @Req() request: AuthRequest, ): Promise<FormSubmission[]> { const userId = request.user.sub; return this.service.getMySubmissions(userId); } @IsNonOwner() @ApiOperation({ summary: 'Поиск форм по параметрам', description: 'Фильтрация, сортировка и пагинация форм. Доступно всем пользователям', }) @ApiResponse({ status: 200, description: 'Список форм по фильтру' }) @Get('get-by-params') async getByParams(@Query() query: GetFormsQueryDto): Promise<Form[]> { const { sortBy, sortOrder, skip, take, ...filter } = query; return this.service.getByParams( filter, { sortBy, sortOrder }, { skip, take }, ); } @IsNonOwner() @ApiOperation({ summary: 'Получить форму по ID', description: 'Возвращает форму со всеми полями и вариантами ответов', }) @ApiParam({ name: 'formId', description: 'UUID формы', example: '550e8400-e29b-41d4-a716-446655440000', }) @ApiResponse({ status: 200, description: 'Форма найдена' }) @ApiResponse({ status: 404, description: 'Форма не найдена' }) @Get(':formId') async getById(@Param('formId', ParseUUIDPipe) id: string): Promise<Form> { return await this.service.getById(id); } @Patch(':formId') @ApiOperation({ summary: 'Обновить форму', description: 'Изменяет title или description. Только владелец формы', }) @ApiParam({ name: 'formId', description: 'UUID формы', example: '550e8400-e29b-41d4-a716-446655440000', }) @ApiBody({ type: UpdateFormDto }) @ApiResponse({ status: 200, description: 'Форма обновлена' }) async update( @Param('formId', ParseUUIDPipe) id: string, @Body() dto: UpdateFormDto, ): Promise<Form> { return await this.service.update(id, dto); } @Delete(':formId') @HttpCode(HttpStatus.NO_CONTENT) @ApiOperation({ summary: 'Удалить форму', description: 'Удаляет форму со всеми полями и ответами (cascade). Только владелец', }) @ApiParam({ name: 'formId', description: 'UUID формы', example: '550e8400-e29b-41d4-a716-446655440000', }) @ApiResponse({ status: 204, description: 'Форма удалена' }) @ApiResponse({ status: 403, description: 'Нет доступа' }) @ApiResponse({ status: 404, description: 'Форма не найдена' }) async remove(@Param('formId', ParseUUIDPipe) id: string): Promise<void> { return await this.service.remove(id); } }