diff --git a/package-lock.json b/package-lock.json index 4f569fe..eae3ff0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -4275,15 +4275,6 @@ "queue-microtask": "^1.1.2" } }, - "node_modules/axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "peer": true, - "dependencies": { - "follow-redirects": "^1.14.0" - } - }, "node_modules/babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -14346,8 +14337,7 @@ "@opentelemetry/context-async-hooks": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@opentelemetry/context-async-hooks/-/context-async-hooks-1.0.1.tgz", - "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==", - "requires": {} + "integrity": "sha512-oGCPjDlZ03gXPAdLxw5iqaQJIpL8BZFaiZhAPgF7Vj6XYmrmrA/FXVIsjfNECQTa2D+lt5p8vf0xYIkFufgceQ==" }, "@opentelemetry/core": { "version": "1.0.1", @@ -14722,8 +14712,7 @@ "@opentelemetry/propagation-utils": { "version": "0.27.0", "resolved": "https://registry.npmjs.org/@opentelemetry/propagation-utils/-/propagation-utils-0.27.0.tgz", - "integrity": "sha512-jN+9c3DPbPgm8kzVH7QEv5VSYhKn3I5JXfWolzV37X3TvmSa8mu4KLbwR9rHnccN9Qvd6sJw3eg5L5pl8Nvu/g==", - "requires": {} + "integrity": "sha512-jN+9c3DPbPgm8kzVH7QEv5VSYhKn3I5JXfWolzV37X3TvmSa8mu4KLbwR9rHnccN9Qvd6sJw3eg5L5pl8Nvu/g==" }, "@opentelemetry/propagator-aws-xray": { "version": "1.0.1", @@ -15132,8 +15121,7 @@ "@svtslv/nestjs-minio": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@svtslv/nestjs-minio/-/nestjs-minio-1.0.1.tgz", - "integrity": "sha512-wO83GddyNdcq9ZwqxnzGu16H1SjZ2+Q5OEe1lu7YQye5L6x+AuA1oLhdoXEB5vr+PrVwxjM7xnB2QfWaEWEJ+Q==", - "requires": {} + "integrity": "sha512-wO83GddyNdcq9ZwqxnzGu16H1SjZ2+Q5OEe1lu7YQye5L6x+AuA1oLhdoXEB5vr+PrVwxjM7xnB2QfWaEWEJ+Q==" }, "@swan-io/boxed": { "version": "0.8.0", @@ -15985,15 +15973,13 @@ "version": "1.8.0", "resolved": "https://registry.npmjs.org/acorn-import-assertions/-/acorn-import-assertions-1.8.0.tgz", "integrity": "sha512-m7VZ3jwz4eK6A4Vtt8Ew1/mNbP24u0FhdyfA7fSvnJR6LMdfOYnmuIrrJAgrYfYJ10F/otaHTtrtrtmHdMNzEw==", - "dev": true, - "requires": {} + "dev": true }, "acorn-jsx": { "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, - "requires": {} + "dev": true }, "acorn-walk": { "version": "7.2.0", @@ -16177,15 +16163,6 @@ "queue-microtask": "^1.1.2" } }, - "axios": { - "version": "0.21.4", - "resolved": "https://registry.npmjs.org/axios/-/axios-0.21.4.tgz", - "integrity": "sha512-ut5vewkiu8jjGBdqpM44XxjuCjq9LAKeHVmoVfHVzy8eHgxxq8SbAVQNovDA8mVi05kP0Ea/n/UzcSHcTJQfNg==", - "peer": true, - "requires": { - "follow-redirects": "^1.14.0" - } - }, "babel-jest": { "version": "27.5.1", "resolved": "https://registry.npmjs.org/babel-jest/-/babel-jest-27.5.1.tgz", @@ -17740,8 +17717,7 @@ "version": "8.5.0", "resolved": "https://registry.npmjs.org/eslint-config-prettier/-/eslint-config-prettier-8.5.0.tgz", "integrity": "sha512-obmWKLUNCnhtQRKc+tmnYuQl0pFU1ibYJQ5BGhTVB08bHe9wC8qUeG7c08dj9XX+AuPj1YSGSQIHl1pnDHZR0Q==", - "dev": true, - "requires": {} + "dev": true }, "eslint-plugin-prettier": { "version": "4.0.0", @@ -19515,8 +19491,7 @@ "version": "1.2.2", "resolved": "https://registry.npmjs.org/jest-pnp-resolver/-/jest-pnp-resolver-1.2.2.tgz", "integrity": "sha512-olV41bKSMm8BdnuMsewT4jqlZ8+3TCARAXjZGT9jcoSnrfUnRCqnMoF9XEeoWjbzObpqF9dRhHQj0Xb9QdF6/w==", - "dev": true, - "requires": {} + "dev": true }, "jest-regex-util": { "version": "27.5.1", @@ -20787,8 +20762,7 @@ "pg-pool": { "version": "3.5.1", "resolved": "https://registry.npmjs.org/pg-pool/-/pg-pool-3.5.1.tgz", - "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==", - "requires": {} + "integrity": "sha512-6iCR0wVrro6OOHFsyavV+i6KYL4lVNyYAB9RD18w66xSzN+d8b66HiwuP30Gp1SH5O9T82fckkzsRjlrhD0ioQ==" }, "pg-protocol": { "version": "1.5.0", @@ -21330,8 +21304,7 @@ "version": "3.5.2", "resolved": "https://registry.npmjs.org/ajv-keywords/-/ajv-keywords-3.5.2.tgz", "integrity": "sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==", - "dev": true, - "requires": {} + "dev": true }, "json-schema-traverse": { "version": "0.4.1", @@ -22707,8 +22680,7 @@ "version": "7.5.7", "resolved": "https://registry.npmjs.org/ws/-/ws-7.5.7.tgz", "integrity": "sha512-KMvVuFzpKBuiIXW3E4u3mySRO2/mCHSyZDJQM5NQ9Q9KHWHWh0NHgfbRMLLrceUK5qAL4ytALJbpRMjixFZh8A==", - "dev": true, - "requires": {} + "dev": true }, "xml": { "version": "1.0.1", diff --git a/src/main/modules/application/dto/video-create.dto.ts b/src/main/modules/application/dto/video-create.dto.ts index dd01b2d..9517031 100644 --- a/src/main/modules/application/dto/video-create.dto.ts +++ b/src/main/modules/application/dto/video-create.dto.ts @@ -9,8 +9,6 @@ export type VideoCreateDto = { visibility: Visibility; - draft: boolean; - source: string; attachments?: string[]; // Optional list of attachments id diff --git a/src/main/modules/application/dto/video-response.dto.ts b/src/main/modules/application/dto/video-response.dto.ts index f4f7b07..4a02d2c 100644 --- a/src/main/modules/application/dto/video-response.dto.ts +++ b/src/main/modules/application/dto/video-response.dto.ts @@ -1,7 +1,7 @@ -import { Visibility } from "../../infrastructure/adapters/repositories/entities/content.model"; -import { VideoSource } from "../../domain/models/video.model"; import { PresignedUrlResponse } from "../../../core/types/presigned-url.type"; +import { VideoSource } from "../../domain/models/video.model"; import { Watchtime } from "../../domain/models/watchtime.model"; +import { Visibility } from "../../infrastructure/adapters/repositories/entities/content.model"; import { UserDto } from "./user.dto"; export type VideoPsuResponse = { @@ -24,8 +24,6 @@ export class VideoResponse { visibility: Visibility; - draft: boolean; - likes?: number; views?: number; diff --git a/src/main/modules/application/dto/video-update.dto.ts b/src/main/modules/application/dto/video-update.dto.ts index d33fd8d..cb307bd 100644 --- a/src/main/modules/application/dto/video-update.dto.ts +++ b/src/main/modules/application/dto/video-update.dto.ts @@ -11,8 +11,6 @@ export type VideoUpdateDto = { visibility: Visibility; - draft: string; - source: string; attachments?: string[]; // Optional list of attachments ids diff --git a/src/main/modules/domain/models/video.model.ts b/src/main/modules/domain/models/video.model.ts index 12c1bc2..d06cdde 100644 --- a/src/main/modules/domain/models/video.model.ts +++ b/src/main/modules/domain/models/video.model.ts @@ -60,8 +60,6 @@ export class VideoProps { visibility: Visibility; - draft: boolean; - likes?: number; views?: number; @@ -92,7 +90,6 @@ export class Video { public thumbnail: string, public publisher: User, public visibility: Visibility, - public draft: boolean, public likes: number, public views: number, public sourceType: VideoSource, @@ -112,7 +109,6 @@ export class Video { props.thumbnail, props.publisher, props.visibility, - props.draft, props.likes, props.views, props.sourceType, diff --git a/src/main/modules/infrastructure/adapters/mappers/video.api.mapper.ts b/src/main/modules/infrastructure/adapters/mappers/video.api.mapper.ts index c523be3..719ca04 100644 --- a/src/main/modules/infrastructure/adapters/mappers/video.api.mapper.ts +++ b/src/main/modules/infrastructure/adapters/mappers/video.api.mapper.ts @@ -26,7 +26,6 @@ export class VideoApiMapper extends AbstractMapper { description: apiModel.description, thumbnail: apiModel.thumbnail, visibility: apiModel.visibility, - draft: apiModel.draft, source: apiModel.source }; if (apiModel.slug) { @@ -70,7 +69,6 @@ export class VideoApiMapper extends AbstractMapper { thumbnail: formatThumbnailUri(), publisher: entity.publisher, visibility: entity.visibility, - draft: entity.draft, likes: entity.likes, views: entity.views, sourceType: entity.sourceType, diff --git a/src/main/modules/infrastructure/adapters/mappers/video.entity.mapper.ts b/src/main/modules/infrastructure/adapters/mappers/video.entity.mapper.ts index d8b32d9..2f51175 100644 --- a/src/main/modules/infrastructure/adapters/mappers/video.entity.mapper.ts +++ b/src/main/modules/infrastructure/adapters/mappers/video.entity.mapper.ts @@ -23,7 +23,6 @@ export class VideoEntityMapper extends AbstractMapper { thumbnail: apiModel.thumbnail, publisherId: apiModel.publisher?.id, visibility: apiModel.visibility, - draft: apiModel.draft, likes: apiModel.likes, views: apiModel.views, sourceType: apiModel.sourceType, @@ -41,7 +40,6 @@ export class VideoEntityMapper extends AbstractMapper { thumbnail: entity.thumbnail, publisher: this.userEntityMapper.entityToApi(entity.publisher), visibility: entity.visibility, - draft: entity.draft, likes: entity.likes, views: entity.views, sourceType: entity.sourceType, diff --git a/src/main/modules/infrastructure/adapters/repositories/entities/content.model.ts b/src/main/modules/infrastructure/adapters/repositories/entities/content.model.ts index 2dc4923..e6cf89e 100644 --- a/src/main/modules/infrastructure/adapters/repositories/entities/content.model.ts +++ b/src/main/modules/infrastructure/adapters/repositories/entities/content.model.ts @@ -1,6 +1,6 @@ -import { BaseModel } from "./base.model"; -import { IsBoolean, IsOptional, Matches } from "class-validator"; +import { IsOptional, Matches } from "class-validator"; import { Column } from "typeorm"; +import { BaseModel } from "./base.model"; export enum Visibility { PUBLIC = "public", @@ -18,9 +18,4 @@ export class ContentModel extends BaseModel { @IsOptional({ always: true }) @Column({ enum: Visibility, type: "enum", default: Visibility.PUBLIC }) visibility?: Visibility; - - @IsBoolean() - @IsOptional({ always: true }) - @Column({ default: false }) - draft?: boolean; } diff --git a/src/main/modules/infrastructure/adapters/repositories/entities/video.entity.ts b/src/main/modules/infrastructure/adapters/repositories/entities/video.entity.ts index dd0d7ae..c55108f 100644 --- a/src/main/modules/infrastructure/adapters/repositories/entities/video.entity.ts +++ b/src/main/modules/infrastructure/adapters/repositories/entities/video.entity.ts @@ -34,9 +34,6 @@ export class VideoEntity extends BaseModel { @Column({ enum: Visibility, type: "enum", default: Visibility.PUBLIC }) visibility?: Visibility; - @Column({ default: false }) - draft?: boolean; - @Column({ enum: VideoSource, type: "enum" }) sourceType: VideoSource; diff --git a/src/main/modules/infrastructure/controllers/admin/video.controller.ts b/src/main/modules/infrastructure/controllers/admin/video.controller.ts index b545381..0f7fce9 100644 --- a/src/main/modules/infrastructure/controllers/admin/video.controller.ts +++ b/src/main/modules/infrastructure/controllers/admin/video.controller.ts @@ -10,14 +10,14 @@ import { } from "@nestjs/common"; import { MeId, Roles } from "@polyflix/x-utils"; import { Role } from "@polyflix/x-utils/dist/types/roles.enum"; -import { VideoService } from "../../services/video.service"; -import { VideoApiMapper } from "../../adapters/mappers/video.api.mapper"; import { Span } from "nestjs-otel"; -import { VideoParams } from "../../filters/video.params"; import { Paginate } from "../../../../core/types/pagination.dto"; import { VideoResponse } from "../../../application/dto/video-response.dto"; -import { Video } from "../../../domain/models/video.model"; import { VideoUpdateDto } from "../../../application/dto/video-update.dto"; +import { Video } from "../../../domain/models/video.model"; +import { VideoApiMapper } from "../../adapters/mappers/video.api.mapper"; +import { VideoParams } from "../../filters/video.params"; +import { VideoService } from "../../services/video.service"; @Controller("admin/videos") @Roles(Role.Admin) @@ -69,17 +69,6 @@ export class AdminVideoController { return this.videoApiMapper.entityToApi(updated_video); } - @Put(":slug/draft") - @Span("VIDEO_ADMIN_CONTROLLER_TOGGLE_DRAFT_MODE") - async toggleVideoDraftMode( - @Param("slug") slug: string - ): Promise { - const updated_video = await this.videoService.toggleVideoDraftMode( - slug - ); - return this.videoApiMapper.entityToApi(updated_video); - } - @Put(":slug/visibility") @Span("VIDEO_ADMIN_CONTROLLER_UPDATE_VISIBILITY") async updateVideoVisibility( diff --git a/src/main/modules/infrastructure/controllers/messages-video.controller.ts b/src/main/modules/infrastructure/controllers/messages-video.controller.ts index 7a8dbd1..a179267 100644 --- a/src/main/modules/infrastructure/controllers/messages-video.controller.ts +++ b/src/main/modules/infrastructure/controllers/messages-video.controller.ts @@ -1,16 +1,15 @@ -import { ClientKafka, EventPattern, Payload } from "@nestjs/microservices"; import { Controller, Logger } from "@nestjs/common"; import { ConfigService } from "@nestjs/config"; -import { VideoService } from "../services/video.service"; +import { ClientKafka, EventPattern, Payload } from "@nestjs/microservices"; import { InjectKafkaClient, - TriggerType, - PolyflixKafkaValue + PolyflixKafkaValue, + TriggerType } from "@polyflix/x-utils"; +import { UserDto } from "../../application/dto/user.dto"; import { VideoResponse } from "../../application/dto/video-response.dto"; import { UserService } from "../services/user.service"; -import { UserDto } from "../../application/dto/user.dto"; -import { VideoUpdateDto } from "../../application/dto/video-update.dto"; +import { VideoService } from "../services/video.service"; @Controller() export class MessageVideoController { @@ -71,11 +70,7 @@ export class MessageVideoController { this.videoService.create(videoResponse, null); break; case TriggerType.UPDATE: - const videoDTO: VideoUpdateDto = { - ...videoResponse, - draft: videoResponse.draft.toString() - }; - this.videoService.update(videoResponse.slug, videoDTO); + this.videoService.update(videoResponse.slug, videoResponse); break; case TriggerType.DELETE: this.videoService.delete(videoResponse.slug); diff --git a/src/main/modules/infrastructure/filters/video.filter.ts b/src/main/modules/infrastructure/filters/video.filter.ts index 1e28c45..8c7bf60 100644 --- a/src/main/modules/infrastructure/filters/video.filter.ts +++ b/src/main/modules/infrastructure/filters/video.filter.ts @@ -82,37 +82,26 @@ export class VideoFilter extends AbstractFilter { } if (isMe || isAdmin) { - if (has(params, "visibility") || has(params, "draft")) { + if (has(params, "visibility")) { VideoFilter.buildVisibilityFilters( queryBuilder, - params.visibility, - params.draft + params.visibility ); } } else { - VideoFilter.buildVisibilityFilters( - queryBuilder, - Visibility.PUBLIC, - false - ); + VideoFilter.buildVisibilityFilters(queryBuilder, Visibility.PUBLIC); } } private static buildVisibilityFilters( queryBuilder: SelectQueryBuilder, - visibility?: Visibility, - draft?: boolean + visibility?: Visibility ) { if (visibility != null) { queryBuilder.andWhere("video.visibility = :visibility", { visibility }); } - if (draft != null) { - queryBuilder.andWhere("video.draft = :draft", { - draft - }); - } } buildPaginationAndSort( diff --git a/src/main/modules/infrastructure/filters/video.params.ts b/src/main/modules/infrastructure/filters/video.params.ts index 428b244..2310828 100644 --- a/src/main/modules/infrastructure/filters/video.params.ts +++ b/src/main/modules/infrastructure/filters/video.params.ts @@ -1,13 +1,7 @@ +import { Type } from "class-transformer"; +import { IsEnum, IsInt, IsOptional, IsString } from "class-validator"; import { Pagination } from "../../../core/types/pagination.type"; -import { - IsBoolean, - IsEnum, - IsInt, - IsOptional, - IsString -} from "class-validator"; import { Visibility } from "../adapters/repositories/entities/content.model"; -import { Type } from "class-transformer"; export const DefaultVideoParams: VideoParams = { page: 1, @@ -24,11 +18,6 @@ export class VideoParams extends Pagination { @IsOptional() visibility?: Visibility; - @IsBoolean() - @IsOptional() - @Type(() => Boolean) - draft?: boolean; - @IsString() @IsOptional() title?: string; diff --git a/src/main/modules/infrastructure/services/video.service.ts b/src/main/modules/infrastructure/services/video.service.ts index 20108a9..c958ea0 100644 --- a/src/main/modules/infrastructure/services/video.service.ts +++ b/src/main/modules/infrastructure/services/video.service.ts @@ -1,27 +1,27 @@ import { Injectable, Logger, NotFoundException } from "@nestjs/common"; -import { DefaultVideoParams, VideoParams } from "../filters/video.params"; +import { ConfigService } from "@nestjs/config"; +import { Option, Result } from "@swan-io/boxed"; +import { google, youtube_v3 } from "googleapis"; +import { nanoid } from "nanoid"; +import { Span } from "nestjs-otel"; +import * as urlSlug from "url-slug"; +import { MINIO_THUMBNAIL_FILE_NAME } from "../../../core/constants/video.constant"; +import { VideoCreateDto } from "../../application/dto/video-create.dto"; +import { VideoResponse } from "../../application/dto/video-response.dto"; +import { VideoUpdateDto } from "../../application/dto/video-update.dto"; +import { VideoPSU } from "../../domain/models/presigned-url.entity"; import { formatMinIOFilename, isYoutubeVideo, Video } from "../../domain/models/video.model"; -import { VideoCreateDto } from "../../application/dto/video-create.dto"; +import { VideoPublisher } from "../../domain/ports/publishers/video.publisher"; +import { VideoRepository } from "../../domain/ports/repositories/video.repository"; import { VideoApiMapper } from "../adapters/mappers/video.api.mapper"; +import { DefaultVideoParams, VideoParams } from "../filters/video.params"; import { ExternalVideoService } from "./external-video.service"; import { InternalVideoService } from "./internal-video.service"; -import { VideoRepository } from "../../domain/ports/repositories/video.repository"; -import { ConfigService } from "@nestjs/config"; -import { google, youtube_v3 } from "googleapis"; -import { Option, Result } from "@swan-io/boxed"; -import { VideoUpdateDto } from "../../application/dto/video-update.dto"; -import * as urlSlug from "url-slug"; -import { VideoPSU } from "../../domain/models/presigned-url.entity"; -import { Span } from "nestjs-otel"; -import { VideoPublisher } from "../../domain/ports/publishers/video.publisher"; -import { nanoid } from "nanoid"; -import { MINIO_THUMBNAIL_FILE_NAME } from "../../../core/constants/video.constant"; import { TokenService } from "./token.service"; -import { VideoResponse } from "../../application/dto/video-response.dto"; @Injectable() export class VideoService { @@ -113,8 +113,7 @@ export class VideoService { const updateObject: Partial = { ...oldVideo, ...videoDTO, - source: oldVideo.source, - draft: videoDTO.draft === "true" + source: oldVideo.source }; if (videoDTO.thumbnail) { @@ -188,13 +187,4 @@ export class VideoService { throw new NotFoundException("video not found"); } } - - async toggleVideoDraftMode(video_slug: string): Promise