Skip to content

Commit e8a7d84

Browse files
committed
feat(movie): add posible method
1 parent ae51715 commit e8a7d84

7 files changed

+78
-2
lines changed

package.json

+1
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,7 @@
4242
"reflect-metadata": "^0.1.13",
4343
"rimraf": "^3.0.2",
4444
"rxjs": "^7.2.0",
45+
"transliteration": "^2.3.5",
4546
"uuid-apikey": "^1.5.3"
4647
},
4748
"devDependencies": {

src/app-cluster.service.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ import * as cluster from 'cluster';
44
import * as os from 'os';
55
import { Injectable } from '@nestjs/common';
66

7-
const numCPUs = os.cpus().length;
7+
const numCPUs = process.env.NODE_ENV === 'production' ? os.cpus().length : 1;
88

99
@Injectable()
1010
export class AppClusterService {
+20
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { IsEnum } from 'class-validator';
3+
4+
export enum DistinctFields {
5+
GENRES = 'genres.name',
6+
COUNTRIES = 'countries.name',
7+
TYPES = 'type',
8+
TYPE_NUMBERS = 'typeNumber',
9+
STATUS = 'status',
10+
}
11+
12+
export class GetPosibleValueDto {
13+
@ApiProperty({ enum: DistinctFields })
14+
@IsEnum(DistinctFields)
15+
field: DistinctFields;
16+
17+
constructor(partial: Partial<GetPosibleValueDto>) {
18+
Object.assign(this, partial);
19+
}
20+
}
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
import { ApiProperty } from '@nestjs/swagger';
2+
import { Expose } from 'class-transformer';
3+
import { transliterate } from 'transliteration';
4+
5+
export class PosibleValueDto {
6+
@ApiProperty({ description: 'Значение по которому нужно делать запрос в базу данных' })
7+
@Expose()
8+
name: string;
9+
10+
@ApiProperty({ description: 'Вспомогательное значение' })
11+
@Expose()
12+
slug: string;
13+
14+
constructor(value: string) {
15+
this.name = value;
16+
this.slug = transliterate(value, { replace: [[' ', '-']] });
17+
}
18+
}

src/movie/movie.controller.ts

+10-1
Original file line numberDiff line numberDiff line change
@@ -4,8 +4,10 @@ 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 } from '@nestjs/common';
7+
import { Get, Query } from '@nestjs/common';
88
import { ApiOperation, ApiResponse } from '@nestjs/swagger';
9+
import { PosibleValueDto } from './dto/response/posible-value.response.dto';
10+
import { GetPosibleValueDto } from './dto/get-posible-values.dto';
911

1012
@Controller('movie', 'Фильмы, сериалы, и т.д.')
1113
export class MovieController extends BaseControllerWithFindById(Movie, MovieDocsResponseDto, 'Поиск тайтлов') {
@@ -19,4 +21,11 @@ export class MovieController extends BaseControllerWithFindById(Movie, MovieDocs
1921
async getRandomMovie(): Promise<Movie> {
2022
return this.movieService.getRandomMovie();
2123
}
24+
25+
@Get('possible-values-by-field')
26+
@ApiOperation({ summary: 'Получить все возможные значения полей' })
27+
@ApiResponse({ type: PosibleValueDto, isArray: true })
28+
async getPossibleValuesByFieldName(@Query() dto: GetPosibleValueDto): Promise<PosibleValueDto[]> {
29+
return this.movieService.getPossibleValuesByFieldName(dto);
30+
}
2231
}

src/movie/movie.service.ts

+8
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ import { Movie, MovieDocument } from './schemas/movie.schema';
44
import { Model } from 'mongoose';
55
import { BaseService } from 'src/common/base/base.service';
66
import { getRandomInt } from 'src/common/utils/get-random-int.util';
7+
import { GetPosibleValueDto } from './dto/get-posible-values.dto';
8+
import { PosibleValueDto } from './dto/response/posible-value.response.dto';
79

810
@Injectable()
911
export class MovieService extends BaseService<Movie> {
@@ -25,4 +27,10 @@ export class MovieService extends BaseService<Movie> {
2527

2628
return this.movieModel.findOne(filter).skip(getRandomInt(1, count)).lean();
2729
}
30+
31+
async getPossibleValuesByFieldName({ field }: GetPosibleValueDto): Promise<PosibleValueDto[]> {
32+
const values = await this.movieModel.distinct(field).exec();
33+
34+
return values.filter((value) => value).map((value) => new PosibleValueDto(value));
35+
}
2836
}

yarn.lock

+20
Original file line numberDiff line numberDiff line change
@@ -5577,6 +5577,13 @@ tr46@~0.0.3:
55775577
resolved "https://registry.yarnpkg.com/tr46/-/tr46-0.0.3.tgz#8184fd347dac9cdc185992f3a6622e14b9d9ab6a"
55785578
integrity sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==
55795579

5580+
transliteration@^2.3.5:
5581+
version "2.3.5"
5582+
resolved "https://registry.yarnpkg.com/transliteration/-/transliteration-2.3.5.tgz#8f92309575f69e4a8a525dab4ff705ebcf961c45"
5583+
integrity sha512-HAGI4Lq4Q9dZ3Utu2phaWgtm3vB6PkLUFqWAScg/UW+1eZ/Tg6Exo4oC0/3VUol/w4BlefLhUUSVBr/9/ZGQOw==
5584+
dependencies:
5585+
yargs "^17.5.1"
5586+
55805587
tree-kill@1.2.2:
55815588
version "1.2.2"
55825589
resolved "https://registry.yarnpkg.com/tree-kill/-/tree-kill-1.2.2.tgz#4ca09a9092c88b73a7cdc5e8a01b507b0790a0cc"
@@ -5939,6 +5946,19 @@ yargs@^17.3.1:
59395946
y18n "^5.0.5"
59405947
yargs-parser "^21.1.1"
59415948

5949+
yargs@^17.5.1:
5950+
version "17.7.0"
5951+
resolved "https://registry.yarnpkg.com/yargs/-/yargs-17.7.0.tgz#b21e9af1e0a619a2a9c67b1133219b2975a07985"
5952+
integrity sha512-dwqOPg5trmrre9+v8SUo2q/hAwyKoVfu8OC1xPHKJGNdxAvPl4sKxL4vBnh3bQz/ZvvGAFeA5H3ou2kcOY8sQQ==
5953+
dependencies:
5954+
cliui "^8.0.1"
5955+
escalade "^3.1.1"
5956+
get-caller-file "^2.0.5"
5957+
require-directory "^2.1.1"
5958+
string-width "^4.2.3"
5959+
y18n "^5.0.5"
5960+
yargs-parser "^21.1.1"
5961+
59425962
yn@3.1.1:
59435963
version "3.1.1"
59445964
resolved "https://registry.yarnpkg.com/yn/-/yn-3.1.1.tgz#1e87401a09d767c1d5eab26a6e4c185182d2eb50"

0 commit comments

Comments
 (0)