Добавление параметров поиска по названию документа (name) и типу документа (type_id) в API backend

Для реализации поиска по названию документа и типу документа в NestJS, вы можете использовать параметры запроса (query parameters). Это позволит передавать параметры name и type_id через строку запроса (например, /documents?name=example&type_id=1).


Обновленный контроллер

Вот как можно обновить ваш контроллер для обработки этих параметров:

typescript

import { Controller, Get, Query, NotFoundException } from '@nestjs/common';
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
import { DocumentsService } from './documents.service';

@Controller('documents')
export class DocumentsController {
  constructor(private readonly documentsService: DocumentsService) {}

  @ApiOperation({ summary: 'Получить список документов по названию и типу' })
  @ApiResponse({ status: 200, description: 'Документы успешно найдены.' })
  @ApiResponse({ status: 404, description: 'Документы не найдены.' })
  @Get()
  async findDocuments(
    @Query('name') name: string,
    @Query('type_id') typeId: number,
  ) {
    const documents = await this.documentsService.findDocuments(name, typeId);

    if (!documents || documents.length === 0) {
      throw new NotFoundException('Документы не найдены.');
    }

    return documents;
  }
}


Обновленный сервис

В сервисе DocumentsService нужно реализовать метод findDocuments, который будет обрабатывать параметры name и type_id:

typescript

import { Injectable } from '@nestjs/common';

@Injectable()
export class DocumentsService {
  private documents = [
    // Пример данных
    { id: 1, name: 'Document 1', type_id: 1 },
    { id: 2, name: 'Document 2', type_id: 2 },
    { id: 3, name: 'Document 3', type_id: 1 },
  ];

  async findDocuments(name?: string, typeId?: number) {
    // Фильтрация документов по названию и типу
    return this.documents.filter((doc) => {
      const matchesName = name ? doc.name.includes(name) : true;
      const matchesType = typeId ? doc.type_id === typeId : true;
      return matchesName && matchesType;
    });
  }
}


Объяснение кода

  1. Контроллер:
    • Используется декоратор @Query для получения параметров name и type_id из строки запроса.
    • Если документы не найдены, выбрасывается исключение NotFoundException.
  2. Сервис:
    • Метод findDocuments фильтрует массив документов по переданным параметрам name и type_id.
    • Если параметры не переданы, фильтрация по соответствующему критерию пропускается.

Пример запросов

  1. Поиск по названию документа:javascriptGET /documents?name=Document
  2. Поиск по типу документа:javascriptGET /documents?type_id=1
  3. Поиск по названию и типу:javascriptGET /documents?name=Document&type_id=1
  4. Если параметры не переданы, возвращаются все документы:javascriptGET /documents

Swagger-документация

Если вы используете @nestjs/swagger, параметры запроса можно задокументировать с помощью декоратора @ApiQuery:

typescript

import { ApiQuery } from '@nestjs/swagger';

@ApiOperation({ summary: 'Получить список документов по названию и типу' })
@ApiResponse({ status: 200, description: 'Документы успешно найдены.' })
@ApiResponse({ status: 404, description: 'Документы не найдены.' })
@ApiQuery({ name: 'name', required: false, description: 'Название документа' })
@ApiQuery({ name: 'type_id', required: false, description: 'Тип документа' })
@Get()
async findDocuments(
  @Query('name') name: string,
  @Query('type_id') typeId: number,
) {
  const documents = await this.documentsService.findDocuments(name, typeId);

  if (!documents || documents.length === 0) {
    throw new NotFoundException('Документы не найдены.');
  }

  return documents;
}


Результат

Теперь ваш API поддерживает поиск документов по названию и типу, а также предоставляет удобную документацию через Swagger. Если у вас есть дополнительные вопросы, дайте знать! 😊