Skip to content

Commit 8340043

Browse files
committed
feat(movie): add find movie awards method #67
1 parent cfba651 commit 8340043

File tree

5 files changed

+63
-11
lines changed

5 files changed

+63
-11
lines changed

src/common/decorators/paginated.decorator.ts

+10-6
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,7 @@ export interface EntityFields {
1616
}
1717

1818
export interface Entities {
19-
movie: EntityFields;
20-
person: EntityFields;
21-
review: EntityFields;
22-
season: EntityFields;
23-
image: EntityFields;
24-
personaward: EntityFields;
19+
[key: string]: EntityFields;
2520
}
2621

2722
const entitiesField: Entities = {
@@ -180,6 +175,15 @@ const entitiesField: Entities = {
180175
dateSearchKeys: [],
181176
numberSearchKeys: ['movie.id', 'personId', 'movie.rating'],
182177
},
178+
movieaward: {
179+
excludedValuesFields: [],
180+
blacklistFields: ['-_id', 'id'],
181+
allowFieldsFindAll: [],
182+
idKeys: ['movieId'],
183+
regexSearchKeys: ['nomination.award.title', 'movie.name'],
184+
dateSearchKeys: [],
185+
numberSearchKeys: ['movieId'],
186+
},
183187
};
184188

185189
export const Paginated = (

src/movie/movie.controller.ts

+15-1
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,15 @@ import { Movie } from './schemas/movie.schema';
44

55
import { BaseControllerWithFindById } from 'src/common/base/base.controller';
66
import { Controller } from 'src/common/decorators/controller.decorator';
7-
import { Get, Query } from '@nestjs/common';
7+
import { CacheInterceptor, Get, Query, UseInterceptors, Version } from '@nestjs/common';
88
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
99
import { PossibleValueDto as PossibleValueDto } from './dto/response/possible-value.response.dto';
1010
import { GetPossibleValueDto } from './dto/get-possible-values.dto';
11+
import { Paginated } from '../common/decorators/paginated.decorator';
12+
13+
import { IQuery } from '../common/interfaces/query.interface';
14+
import { MovieAward } from './schemas/movie-award.schema';
15+
import { MovieAwardDocsResponseDto } from './dto/response/movie-award-docs.response.dto';
1116

1217
@Controller('movie', 'Фильмы, сериалы, и т.д.')
1318
export class MovieController extends BaseControllerWithFindById(Movie, MovieDocsResponseDto, 'Поиск тайтлов') {
@@ -28,4 +33,13 @@ export class MovieController extends BaseControllerWithFindById(Movie, MovieDocs
2833
async getPossibleValuesByFieldName(@Query() dto: GetPossibleValueDto): Promise<PossibleValueDto[]> {
2934
return this.movieService.getPossibleValuesByFieldName(dto);
3035
}
36+
37+
@Version('1.1')
38+
@Get('awards')
39+
@UseInterceptors(CacheInterceptor)
40+
@ApiOperation({ summary: 'Награды тайтлов' })
41+
@Paginated(MovieAwardDocsResponseDto, MovieAward, { findForAllProperties: true })
42+
async findManyAwardsByQuery(@Query() query: IQuery): Promise<MovieAwardDocsResponseDto> {
43+
return this.service.findManyAwards(query);
44+
}
3145
}

src/movie/movie.module.ts

+8-2
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,17 @@
11
import { Module } from '@nestjs/common';
22
import { MovieService } from './movie.service';
33
import { MovieController } from './movie.controller';
4-
import { MovieSchema } from './schemas/movie.schema';
4+
import { Movie, MovieSchema } from './schemas/movie.schema';
55
import { MongooseModule } from '@nestjs/mongoose';
6+
import { MovieAward, MovieAwardSchema } from './schemas/movie-award.schema';
67

78
@Module({
8-
imports: [MongooseModule.forFeature([{ name: 'movies', schema: MovieSchema }])],
9+
imports: [
10+
MongooseModule.forFeature([
11+
{ name: Movie.name, schema: MovieSchema },
12+
{ name: MovieAward.name, schema: MovieAwardSchema },
13+
]),
14+
],
915
controllers: [MovieController],
1016
providers: [MovieService],
1117
})

src/movie/movie.service.ts

+29-1
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,16 @@ import { BaseService } from 'src/common/base/base.service';
66
import { getRandomInt } from 'src/common/utils/get-random-int.util';
77
import { GetPossibleValueDto } from './dto/get-possible-values.dto';
88
import { PossibleValueDto } from './dto/response/possible-value.response.dto';
9+
import { IQuery } from '../common/interfaces/query.interface';
10+
import { MovieAward, MovieAwardDocument } from './schemas/movie-award.schema';
11+
import { MovieAwardDocsResponseDto } from './dto/response/movie-award-docs.response.dto';
912

1013
@Injectable()
1114
export class MovieService extends BaseService<Movie> {
12-
constructor(@InjectModel('movies') private readonly movieModel: Model<MovieDocument>) {
15+
constructor(
16+
@InjectModel(Movie.name) private readonly movieModel: Model<MovieDocument>,
17+
@InjectModel(MovieAward.name) private readonly movieAwardModel: Model<MovieAwardDocument>,
18+
) {
1319
super(movieModel);
1420
}
1521

@@ -33,4 +39,26 @@ export class MovieService extends BaseService<Movie> {
3339

3440
return values.filter((value) => value).map((value) => new PossibleValueDto(value));
3541
}
42+
43+
async findManyAwards(query: IQuery): Promise<MovieAwardDocsResponseDto> {
44+
const [total, docs] = await Promise.all([
45+
this.movieAwardModel.countDocuments(query.filter),
46+
this.movieAwardModel
47+
.find(query.filter)
48+
.limit(query.limit)
49+
.skip(query.skip)
50+
.select(query.select)
51+
.sort(Object.keys(query.sort)?.length ? query.sort : { 'nomination.award.year': -1 })
52+
.exec(),
53+
]);
54+
55+
const docsToJson = docs.map((doc) => doc?.toJSON());
56+
return {
57+
docs: docsToJson,
58+
total,
59+
limit: query.limit,
60+
page: query.skip / query.limit + 1,
61+
pages: Math.ceil(total / query.limit),
62+
};
63+
}
3664
}

src/person/person.controller.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,7 @@ export class PersonController extends BaseControllerWithFindById(Person, PersonD
1919
@Version('1.1')
2020
@Get('awards')
2121
@UseInterceptors(CacheInterceptor)
22-
@ApiOperation({ summary: 'Наград актеров' })
22+
@ApiOperation({ summary: 'Награды актеров' })
2323
@Paginated(PersonAwardDocsResponseDto, PersonAward, { findForAllProperties: true })
2424
async findManyAwardsByQuery(@Query() query: IQuery): Promise<PersonAwardDocsResponseDto> {
2525
console.log(query);

0 commit comments

Comments
 (0)