From fe6f5ef757dc4af47242fee9c861cfe4da9d4b13 Mon Sep 17 00:00:00 2001 From: rubikscraft Date: Fri, 25 Feb 2022 14:13:19 +0100 Subject: [PATCH] Add demo mode --- backend/src/app.module.ts | 2 ++ .../collections/imagedb/imagedb.service.ts | 16 ++++++++++++++- backend/src/env.ts | 12 +++++++++-- backend/src/main.ts | 2 +- .../src/managers/demo/demomanager.module.ts | 20 +++++++++++++++++++ .../src/managers/demo/demomanager.service.ts | 18 +++++++++++++++++ 6 files changed, 66 insertions(+), 4 deletions(-) create mode 100644 backend/src/managers/demo/demomanager.module.ts create mode 100644 backend/src/managers/demo/demomanager.service.ts diff --git a/backend/src/app.module.ts b/backend/src/app.module.ts index 473b977..1a8eecd 100644 --- a/backend/src/app.module.ts +++ b/backend/src/app.module.ts @@ -6,6 +6,7 @@ import { ImageModule } from './routes/image/imageroute.module'; import { ServeStaticModule } from '@nestjs/serve-static'; import Config from './env'; import { ImageEntity } from './collections/imagedb/image.entity'; +import { DemoManagerModule } from './managers/demo/demomanager.module'; @Module({ imports: [ @@ -25,6 +26,7 @@ import { ImageEntity } from './collections/imagedb/image.entity'; }), AuthModule, ImageModule, + DemoManagerModule, ], }) export class AppModule {} diff --git a/backend/src/collections/imagedb/imagedb.service.ts b/backend/src/collections/imagedb/imagedb.service.ts index a4d2192..c7680b8 100644 --- a/backend/src/collections/imagedb/imagedb.service.ts +++ b/backend/src/collections/imagedb/imagedb.service.ts @@ -4,7 +4,12 @@ import { Repository } from 'typeorm'; import { ImageEntity } from './image.entity'; import Crypto from 'crypto'; import { SupportedMime } from './mimes.service'; -import { AsyncFailable, Fail, HasFailed, HasSuccess } from 'imagur-shared/dist/types'; +import { + AsyncFailable, + Fail, + HasFailed, + HasSuccess, +} from 'imagur-shared/dist/types'; @Injectable() export class ImageDBService { @@ -73,6 +78,15 @@ export class ImageDBService { return true; } + public async deleteAll(): AsyncFailable { + try { + await this.imageRepository.delete({}); + } catch (e: any) { + return Fail(e?.message); + } + return true; + } + private hash(image: Buffer): string { return Crypto.createHash('sha256').update(image).digest('hex'); } diff --git a/backend/src/env.ts b/backend/src/env.ts index 448b24d..abc5597 100644 --- a/backend/src/env.ts +++ b/backend/src/env.ts @@ -3,8 +3,10 @@ import { fileURLToPath } from 'url'; const packageRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../'); const Config = { - host: process.env.IMAGUR_HOST || '0.0.0.0', - port: process.env.IMAGUR_PORT || 8080, + main: { + host: process.env.IMAGUR_HOST || '0.0.0.0', + port: process.env.IMAGUR_PORT || 8080, + }, database: { host: process.env.IMAGUR_DB_HOST ?? 'localhost', port: process.env.IMAGUR_DB_PORT @@ -38,6 +40,12 @@ const Config = { join(packageRoot, '../frontend/dist'), backendRoutes: ['i', 'api'], }, + demo: { + enabled: process.env.IMAGUR_DEMO?.toLowerCase() === 'true', + interval: process.env.IMAGUR_DEMO_INTERVAL + ? parseInt(process.env.IMAGUR_DEMO_INTERVAL) + : 1000 * 60 * 5, + }, }; export default Config; diff --git a/backend/src/main.ts b/backend/src/main.ts index 0caf1a9..5b7c012 100644 --- a/backend/src/main.ts +++ b/backend/src/main.ts @@ -24,7 +24,7 @@ async function bootstrap() { app.useGlobalFilters(new MainExceptionFilter()); app.useGlobalInterceptors(new SuccessInterceptor()); app.useGlobalPipes(new ValidationPipe({ disableErrorMessages: true })); - await app.listen(Config.port, Config.host); + await app.listen(Config.main.port, Config.main.host); } bootstrap().catch(console.error); diff --git a/backend/src/managers/demo/demomanager.module.ts b/backend/src/managers/demo/demomanager.module.ts new file mode 100644 index 0000000..3e12baf --- /dev/null +++ b/backend/src/managers/demo/demomanager.module.ts @@ -0,0 +1,20 @@ +import { Module, OnModuleInit } from '@nestjs/common'; +import { ImageDBModule } from '../../collections/imagedb/imagedb.module'; +import Config from '../../env'; +import { DemoManagerService } from './demomanager.service'; + +@Module({ + imports: [ImageDBModule], + providers: [DemoManagerService], +}) +export class DemoManagerModule implements OnModuleInit { + constructor(private readonly demoManagerService: DemoManagerService) {} + + private interval: NodeJS.Timeout; + + onModuleInit() { + if (Config.demo.enabled) { + setInterval(this.demoManagerService.execute, Config.demo.interval); + } + } +} diff --git a/backend/src/managers/demo/demomanager.service.ts b/backend/src/managers/demo/demomanager.service.ts new file mode 100644 index 0000000..d589cab --- /dev/null +++ b/backend/src/managers/demo/demomanager.service.ts @@ -0,0 +1,18 @@ +import { Injectable, Logger } from '@nestjs/common'; +import { ImageDBService } from '../../collections/imagedb/imagedb.service'; + +@Injectable() +export class DemoManagerService { + private readonly logger = new Logger('DemoManagerService'); + + constructor(private readonly imagesService: ImageDBService) {} + + private async executeAsync() { + this.logger.log('Executing demo cleanup'); + await this.imagesService.deleteAll(); + } + + public execute() { + this.executeAsync().catch(this.logger.error); + } +}