Skip to content

Commit 56a79bb

Browse files
committed
feat(person): add award method #58
1 parent 5d50293 commit 56a79bb

File tree

4 files changed

+63
-3
lines changed

4 files changed

+63
-3
lines changed

src/common/decorators/paginated.decorator.ts

+10
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,7 @@ export interface Entities {
2121
review: EntityFields;
2222
season: EntityFields;
2323
image: EntityFields;
24+
personaward: EntityFields;
2425
}
2526

2627
const entitiesField: Entities = {
@@ -170,6 +171,15 @@ const entitiesField: Entities = {
170171
dateSearchKeys: [],
171172
numberSearchKeys: ['movieId', 'height', 'width'],
172173
},
174+
personaward: {
175+
excludedValuesFields: [],
176+
blacklistFields: ['-_id', 'id'],
177+
allowFieldsFindAll: [],
178+
idKeys: ['personId'],
179+
regexSearchKeys: ['nomination.award.title', 'movie.name'],
180+
dateSearchKeys: [],
181+
numberSearchKeys: ['movie.id', 'personId', 'movie.rating'],
182+
},
173183
};
174184

175185
export const Paginated = (

src/person/person.controller.ts

+17-1
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,28 @@
1+
import { CacheInterceptor, Get, Query, UseInterceptors, Version } from '@nestjs/common';
2+
import { ApiOperation } from '@nestjs/swagger';
13
import { BaseControllerWithFindById } from 'src/common/base/base.controller';
24
import { Controller } from 'src/common/decorators/controller.decorator';
3-
import { PersonDocsResponseDto } from './dto/person-docs.response.dto';
5+
import { Paginated } from 'src/common/decorators/paginated.decorator';
6+
import { IQuery } from 'src/common/interfaces/query.interface';
7+
import { PersonAwardDocsResponseDto } from './dto/person-award-docs.response.dto';
8+
import { PersonDocsResponseDto } from './dto/person-docs.response';
49
import { PersonService } from './person.service';
10+
import { PersonAward } from './schemas/person-award.schema';
511
import { Person } from './schemas/person.schema';
612

713
@Controller('person', 'Актеры, режиссеры, операторы, и т.д')
814
export class PersonController extends BaseControllerWithFindById(Person, PersonDocsResponseDto, 'Поиск персон') {
915
constructor(private readonly personService: PersonService) {
1016
super(personService);
1117
}
18+
19+
@Version('1.1')
20+
@Get('awards')
21+
@UseInterceptors(CacheInterceptor)
22+
@ApiOperation({ summary: 'Наград актеров' })
23+
@Paginated(PersonAwardDocsResponseDto, PersonAward, { findForAllProperties: true })
24+
async findManyAwardsByQuery(@Query() query: IQuery): Promise<PersonAwardDocsResponseDto> {
25+
console.log(query);
26+
return this.service.findManyAwards(query);
27+
}
1228
}

src/person/person.module.ts

+7-1
Original file line numberDiff line numberDiff line change
@@ -3,9 +3,15 @@ import { PersonService } from './person.service';
33
import { PersonController } from './person.controller';
44
import { MongooseModule } from '@nestjs/mongoose';
55
import { Person, PersonSchema } from './schemas/person.schema';
6+
import { PersonAward, PersonAwardSchema } from './schemas/person-award.schema';
67

78
@Module({
8-
imports: [MongooseModule.forFeature([{ name: Person.name, schema: PersonSchema }])],
9+
imports: [
10+
MongooseModule.forFeature([
11+
{ name: Person.name, schema: PersonSchema },
12+
{ name: PersonAward.name, schema: PersonAwardSchema },
13+
]),
14+
],
915
controllers: [PersonController],
1016
providers: [PersonService],
1117
})

src/person/person.service.ts

+29-1
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,39 @@ import { Injectable } from '@nestjs/common';
22
import { InjectModel } from '@nestjs/mongoose';
33
import { Model } from 'mongoose';
44
import { BaseService } from 'src/common/base/base.service';
5+
import { IQuery } from 'src/common/interfaces/query.interface';
56
import { Person, PersonDocument } from 'src/person/schemas/person.schema';
7+
import { PersonAwardDocsResponseDto } from './dto/person-award-docs.response.dto';
8+
import { PersonAward, PersonAwardDocument } from './schemas/person-award.schema';
69

710
@Injectable()
811
export class PersonService extends BaseService<Person> {
9-
constructor(@InjectModel(Person.name) private readonly personModel: Model<PersonDocument>) {
12+
constructor(
13+
@InjectModel(Person.name) private readonly personModel: Model<PersonDocument>,
14+
@InjectModel(PersonAward.name) private readonly personAwardModel: Model<PersonAwardDocument>,
15+
) {
1016
super(personModel);
1117
}
18+
19+
async findManyAwards(query: IQuery): Promise<PersonAwardDocsResponseDto> {
20+
const [total, docs] = await Promise.all([
21+
this.personAwardModel.countDocuments(query.filter),
22+
this.personAwardModel
23+
.find(query.filter)
24+
.limit(query.limit)
25+
.skip(query.skip)
26+
.select(query.select)
27+
.sort(Object.keys(query.sort)?.length ? query.sort : { 'nomination.award.year': -1 })
28+
.exec(),
29+
]);
30+
31+
const docsToJson = docs.map((doc) => doc?.toJSON());
32+
return {
33+
docs: docsToJson,
34+
total,
35+
limit: query.limit,
36+
page: query.skip / query.limit + 1,
37+
pages: Math.ceil(total / query.limit),
38+
};
39+
}
1240
}

0 commit comments

Comments
 (0)