From 80ba785798e60d3a99aa33af59f7c6dbc812fc02 Mon Sep 17 00:00:00 2001 From: jurgis Date: Sat, 10 Dec 2022 19:47:52 +0100 Subject: [PATCH] all-files: implement titles (shows, movies) list --- src/KodiApi/AllFiles/Entity/file.entity.ts | 42 ++++++++++++++++++++ src/KodiApi/AllFiles/Entity/title.entity.ts | 12 ++++-- src/KodiApi/AllFiles/all-files.controller.ts | 14 +++---- src/KodiApi/AllFiles/all-files.module.ts | 3 +- src/KodiApi/AllFiles/all-files.service.ts | 26 ++++++++++-- src/config/config.service.ts | 3 +- 6 files changed, 82 insertions(+), 18 deletions(-) create mode 100644 src/KodiApi/AllFiles/Entity/file.entity.ts diff --git a/src/KodiApi/AllFiles/Entity/file.entity.ts b/src/KodiApi/AllFiles/Entity/file.entity.ts new file mode 100644 index 0000000..37784d8 --- /dev/null +++ b/src/KodiApi/AllFiles/Entity/file.entity.ts @@ -0,0 +1,42 @@ +import { Column, Entity, JoinColumn, ManyToOne, PrimaryColumn } from 'typeorm'; +import { TitleEntity } from './title.entity'; + +@Entity('files') +export class FileEntity { + @PrimaryColumn() + id: number; + + @Column() + path: string; + + @Column() + deleted: boolean; + + @Column() + size: number; + + @Column({ name: 'relative_path' }) + relativePath: string; + + @Column({ name: 'file_name' }) + fileName: string; + + @Column() + infos: string; + + @Column() + info: string; + + @Column({ name: 'title_id' }) + titleId: number; + + @ManyToOne(() => TitleEntity, (title) => title.files) + @JoinColumn({ name: 'title_id' }) + title: TitleEntity; + + @Column() + season: number | null; + + @Column() + duration: number; +} diff --git a/src/KodiApi/AllFiles/Entity/title.entity.ts b/src/KodiApi/AllFiles/Entity/title.entity.ts index b8b9630..6f8a649 100644 --- a/src/KodiApi/AllFiles/Entity/title.entity.ts +++ b/src/KodiApi/AllFiles/Entity/title.entity.ts @@ -1,14 +1,18 @@ -import { Column, Entity, PrimaryColumn } from 'typeorm'; +import { Column, Entity, OneToMany, PrimaryColumn } from 'typeorm'; import { TitleTypeEnum } from '../Enum/title-type.enum'; +import { FileEntity } from './file.entity'; @Entity('titles') export class TitleEntity { - @PrimaryColumn({ name: 'id' }) + @PrimaryColumn() id: number; - @Column({ name: 'title' }) + @Column() title: string; - @Column({ name: 'type' }) + @Column() type: TitleTypeEnum; + + @OneToMany(() => FileEntity, (file) => file.title) + files: FileEntity[]; } diff --git a/src/KodiApi/AllFiles/all-files.controller.ts b/src/KodiApi/AllFiles/all-files.controller.ts index 36387bf..95ae5c1 100644 --- a/src/KodiApi/AllFiles/all-files.controller.ts +++ b/src/KodiApi/AllFiles/all-files.controller.ts @@ -1,6 +1,7 @@ import { Controller, Get, Param } from '@nestjs/common'; import ApiResponse from '../Dto/api-response.dto'; import { AllFilesService } from './all-files.service'; +import { TitleTypeEnum } from './Enum/title-type.enum'; @Controller('api/all') export class AllFilesController { @@ -11,19 +12,14 @@ export class AllFilesController { return this.allFilesService.getMenu(); } - @Get('titles') - async titles() { - return this.allFilesService.getAllTitles(); - } - @Get('show') - getShows() { - return { will: 'show shows list' }; + getShows(): Promise { + return this.allFilesService.getListOfTitles(TitleTypeEnum.show); } @Get('movie') - getMovies() { - return { will: 'show movies list' }; + async getMovies(): Promise { + return this.allFilesService.getListOfTitles(TitleTypeEnum.movie); } @Get('play') diff --git a/src/KodiApi/AllFiles/all-files.module.ts b/src/KodiApi/AllFiles/all-files.module.ts index c1e6689..f565c63 100644 --- a/src/KodiApi/AllFiles/all-files.module.ts +++ b/src/KodiApi/AllFiles/all-files.module.ts @@ -4,9 +4,10 @@ import { AllFilesService } from './all-files.service'; import { KodiApiResponseFactory } from '../kodi-api-response.factory'; import { TypeOrmModule } from '@nestjs/typeorm'; import { TitleEntity } from './Entity/title.entity'; +import { FileEntity } from './Entity/file.entity'; @Module({ - imports: [TypeOrmModule.forFeature([TitleEntity])], + imports: [TypeOrmModule.forFeature([TitleEntity, FileEntity])], controllers: [AllFilesController], providers: [AllFilesService, KodiApiResponseFactory], }) diff --git a/src/KodiApi/AllFiles/all-files.service.ts b/src/KodiApi/AllFiles/all-files.service.ts index 67a5df6..5891414 100644 --- a/src/KodiApi/AllFiles/all-files.service.ts +++ b/src/KodiApi/AllFiles/all-files.service.ts @@ -4,6 +4,8 @@ import { KodiApiResponseFactory } from '../kodi-api-response.factory'; import { InjectRepository } from '@nestjs/typeorm'; import { Repository } from 'typeorm'; import { TitleEntity } from './Entity/title.entity'; +import { FileEntity } from './Entity/file.entity'; +import { TitleTypeEnum } from './Enum/title-type.enum'; @Injectable() export class AllFilesService { @@ -11,6 +13,8 @@ export class AllFilesService { private readonly koiApiResponseFactory: KodiApiResponseFactory, @InjectRepository(TitleEntity) private titleRepository: Repository, + @InjectRepository(FileEntity) + private fileRepository: Repository, ) {} getMenu(): ApiResponse { @@ -29,8 +33,24 @@ export class AllFilesService { return apiResponse; } - async getAllTitles() { - return this.titleRepository.find(); - //return { todo: true }; + async getListOfTitles(type: TitleTypeEnum): Promise { + const entities = await this.titleRepository + .createQueryBuilder() + .setFindOptions({ relations: { files: true } }) + .where('type = :type', { type: type }) + .andWhere('deleted = :deleted', { deleted: false }) + .getMany(); + + const response = this.koiApiResponseFactory.createApiResponse(); + response.setTitle('All ' + type + 's'); + entities.forEach((entity) => { + response + .createItem() + .setLabel(entity.title) + .setToFolder() + .setPlot(entity.files.length + ' files'); + }); + + return response; } } diff --git a/src/config/config.service.ts b/src/config/config.service.ts index b1daf1c..6d81674 100644 --- a/src/config/config.service.ts +++ b/src/config/config.service.ts @@ -3,6 +3,7 @@ import { TypeOrmModuleOptions } from '@nestjs/typeorm'; import { LrtCategory } from '../KodiApi/LRT/LrtApiClient/Entity/lrt-category.entity'; import { join } from 'path'; import { TitleEntity } from '../KodiApi/AllFiles/Entity/title.entity'; +import { FileEntity } from '../KodiApi/AllFiles/Entity/file.entity'; env.config(); @@ -21,7 +22,7 @@ export class ConfigService { return { type: 'sqlite', database: this.getEnv('DB_PATH'), - entities: [LrtCategory, TitleEntity], + entities: [LrtCategory, TitleEntity, FileEntity], }; }