Skip to content

Commit a3505e2

Browse files
committed
feat: add v1.4 persons search
1 parent 282e365 commit a3505e2

6 files changed

+46
-42
lines changed

src/person/constants/person-index.ts

+1
Original file line numberDiff line numberDiff line change
@@ -1 +1,2 @@
11
export const PERSON_INDEX = 'persons';
2+
export const PERSON_V1_4_INDEX = 'persons_v1_4';
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
import { AbstractDocsResponseDto } from 'src/common/dto/abstract/abstract-docs.response.dto';
2+
import { MeiliPersonEntityV1_4 } from '../../entities/v1.4/meili-person.entity';
3+
4+
export class SearchPersonResponseDtoV1_4 extends AbstractDocsResponseDto(MeiliPersonEntityV1_4) {
5+
constructor(partial: Partial<SearchPersonResponseDtoV1_4>) {
6+
super(partial);
7+
Object.assign(this, partial);
8+
}
9+
}

src/person/entities/meili-person.entity.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@ export class MeiliPersonEntity {
2323
@Expose()
2424
sex: string;
2525

26-
@ApiProperty()
26+
@ApiProperty() 1;
2727
@Expose()
2828
growth: number;
2929

src/person/entities/v1.4/meili-person.entity.ts

+1-38
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
1-
import { Expose } from 'class-transformer';
2-
import { ApiProperty, ApiPropertyOptional, OmitType } from '@nestjs/swagger';
1+
import { ApiPropertyOptional, OmitType } from '@nestjs/swagger';
32
import { MeiliPersonEntity } from '../meili-person.entity';
43
import { Prop } from '@nestjs/mongoose';
54
import { BirthPlace, DeathPlace, Person, Profession } from '../../schemas/person.schema';
@@ -10,42 +9,6 @@ export class MeiliPersonEntityV1_4 extends OmitType(MeiliPersonEntity, [
109
'profession',
1110
'fromMongoDocument',
1211
] as const) {
13-
@ApiProperty()
14-
@Expose()
15-
id: number;
16-
17-
@ApiProperty()
18-
@Expose()
19-
name: string;
20-
21-
@ApiProperty()
22-
@Expose()
23-
enName: string;
24-
25-
@ApiProperty()
26-
@Expose()
27-
photo: string;
28-
29-
@ApiProperty()
30-
@Expose()
31-
sex: string;
32-
33-
@ApiProperty()
34-
@Expose()
35-
growth: number;
36-
37-
@ApiProperty()
38-
@Expose()
39-
birthday: string;
40-
41-
@ApiProperty()
42-
@Expose()
43-
death: string;
44-
45-
@ApiProperty()
46-
@Expose()
47-
age: number;
48-
4912
@ApiPropertyOptional({ type: () => BirthPlace, isArray: true })
5013
@Prop({ items: BirthPlace })
5114
birthPlace: BirthPlace[];

src/person/person.controller.ts

+11-2
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { CacheInterceptor, Get, Query, UseInterceptors, Version } from '@nestjs/common';
2-
import { ApiOperation } from '@nestjs/swagger';
2+
import { ApiExcludeEndpoint, ApiOperation } from '@nestjs/swagger';
33
import { BaseControllerWithFindById } from 'src/common/base/base.controller';
44
import { Controller } from 'src/common/decorators/controller.decorator';
55
import { Paginated } from 'src/common/decorators/paginated.decorator';
@@ -11,6 +11,7 @@ import { PersonAward } from './schemas/person-award.schema';
1111
import { Person } from './schemas/person.schema';
1212
import { SearchDto } from 'src/common/dto/query/search.dto';
1313
import { SearchPersonResponseDto } from './dto/search-person.response.dto';
14+
import { SearchPersonResponseDtoV1_4 } from './dto/v1.4/search-person.response.dto';
1415

1516
@Controller('person', 'Актеры, режиссеры, операторы, и т.д')
1617
export class PersonController extends BaseControllerWithFindById(
@@ -22,13 +23,21 @@ export class PersonController extends BaseControllerWithFindById(
2223
super(personService);
2324
}
2425

25-
@Version('1.2')
26+
@Version('1.4')
2627
@Get('search')
2728
@UseInterceptors(CacheInterceptor)
2829
@ApiOperation({
2930
summary: 'Полнотекстовый поиск',
3031
description: `Этот метод предназначен для полнотекстового поиска персон по текстовому запросу. Он принимает только один параметр \`query\`. Если вам нужны фильтры, гибкость и множество результатов, используйте метод \`Универсальный поиск с фильтрами\` (findMany). В этом методе также не доступен выбор полей. А в ответ приходит упрощенная модель, которая подходит только для отображения результатов поиска.`,
3132
})
33+
async searchPersonV1_4(@Query() query: SearchDto): Promise<SearchPersonResponseDtoV1_4> {
34+
return this.service.searchPersonV1_4(query);
35+
}
36+
37+
@Version('1.2')
38+
@Get('search')
39+
@UseInterceptors(CacheInterceptor)
40+
@ApiExcludeEndpoint()
3241
async searchPerson(@Query() query: SearchDto): Promise<SearchPersonResponseDto> {
3342
return this.service.searchPerson(query);
3443
}

src/person/person.service.ts

+23-1
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,9 @@ import { SearchDto } from 'src/common/dto/query/search.dto';
1010
import { SearchPersonResponseDto } from './dto/search-person.response.dto';
1111
import { MeiliService } from 'src/meili/meili.service';
1212
import { MeiliPersonEntity } from './entities/meili-person.entity';
13-
import { PERSON_INDEX } from './constants/person-index';
13+
import { PERSON_INDEX, PERSON_V1_4_INDEX } from './constants/person-index';
14+
import { SearchPersonResponseDtoV1_4 } from './dto/v1.4/search-person.response.dto';
15+
import { MeiliPersonEntityV1_4 } from './entities/v1.4/meili-person.entity';
1416

1517
@Injectable()
1618
export class PersonService extends BaseService<Person> {
@@ -22,6 +24,26 @@ export class PersonService extends BaseService<Person> {
2224
super(personModel);
2325
}
2426

27+
async searchPersonV1_4(dto: SearchDto): Promise<SearchPersonResponseDtoV1_4> {
28+
const offset = (dto.page - 1) * dto.limit;
29+
const searchResponse = await this.meiliService.search<MeiliPersonEntityV1_4>(
30+
dto.query,
31+
PERSON_V1_4_INDEX,
32+
dto.limit,
33+
offset,
34+
);
35+
36+
const personEntities = searchResponse.hits.map((person) => new MeiliPersonEntityV1_4(person));
37+
38+
return {
39+
docs: personEntities,
40+
total: searchResponse.estimatedTotalHits,
41+
limit: dto.limit,
42+
page: dto.page,
43+
pages: Math.ceil(searchResponse.estimatedTotalHits / dto.limit),
44+
};
45+
}
46+
2547
async searchPerson(dto: SearchDto): Promise<SearchPersonResponseDto> {
2648
const offset = (dto.page - 1) * dto.limit;
2749
const searchResponse = await this.meiliService.search<MeiliPersonEntity>(

0 commit comments

Comments
 (0)