From 690a640b317c7e15db3c50c8be8d49bbfec18114 Mon Sep 17 00:00:00 2001 From: Jonas Date: Tue, 5 May 2026 12:29:45 +0200 Subject: [PATCH] Add Random Image --- src/dto | 2 +- src/galerie/galerie.controller.ts | 145 +++++++++++++++++++++--------- src/galerie/galerie.module.ts | 4 +- src/galerie/galerie.service.ts | 28 ++++-- 4 files changed, 128 insertions(+), 51 deletions(-) diff --git a/src/dto b/src/dto index 12938c8..78d9d15 160000 --- a/src/dto +++ b/src/dto @@ -1 +1 @@ -Subproject commit 12938c81257e48bc33d9caf7950038780d3f9f04 +Subproject commit 78d9d15d640d127734c77e9904d42b689d1a844b diff --git a/src/galerie/galerie.controller.ts b/src/galerie/galerie.controller.ts index 7614468..8e1172c 100644 --- a/src/galerie/galerie.controller.ts +++ b/src/galerie/galerie.controller.ts @@ -1,50 +1,115 @@ -import { BadRequestException, Controller, Get, Header, Inject, Param, Res } from "@nestjs/common"; -import { GalerieService } from "./galerie.service"; -import sharp from "sharp"; -import path from "path"; +import { Controller, Get, Header, Inject, Param, Res } from '@nestjs/common'; +import { GalerieService } from './galerie.service'; +import sharp from 'sharp'; +import path from 'path'; +import { Args, Field, ObjectType, Query, Resolver } from '@nestjs/graphql'; +import { JahrMitBild } from 'src/dto/galerie.dto'; @Controller('/api/galerie') export class GalerieController { - constructor( - @Inject() - private readonly galerieService: GalerieService - ){} + constructor( + @Inject() + private readonly galerieService: GalerieService, + ) {} - @Get("/bilder/:event/:jahr") - async getBilder( - @Param("event") - event: string, - @Param("jahr") - jahr: string - ): Promise { - return this.galerieService.getBilder(event, jahr); - } + @Get('/bilder/:event/:jahr') + async getBilder( + @Param('event') event: string, + @Param('jahr') jahr: number, + ): Promise { + return this.galerieService.getBilder(event, jahr); + } + @Get('/jahre/:event') + async getJahre(@Param('event') event: string): Promise { + return this.galerieService.getJahre(event); + } - @Get("/jahre/:event") - async getJahre( - @Param("event") - event: string - ): Promise { - return this.galerieService.getJahre(event); - } + @Get('/bild/:event/:jahr/:bild') + @Header('Content-Type', 'image/png') + async getBild( + @Param('event') + event: string, + @Param('jahr') + jahr: number, + @Param('bild') + bild: string, + ): Promise { + const filePath = + '/bilder/' + + path.basename(event) + + '/' + + path.basename(jahr.toString()) + + '/' + + path.basename(bild); - @Get("/bild/:event/:jahr/:bild") - @Header('Content-Type', 'image/png') - async getBild( - @Param("event") - event: string, - @Param("jahr") - jahr: string, - @Param("bild") - bild: string, - ): Promise { + return sharp(filePath).png().toBuffer(); + } + @Get('/randomimage/:event') + @Header('Content-Type', 'image/png') + async getRandomImageOhneJahr( + @Param('event') + event: string, + ): Promise { + const jahr=await this.galerieService.getRandomYear(event) + const filePath = + '/bilder/' + + path.basename(event) + + '/' + + jahr+ + '/' + + await this.galerieService.getRandomImage(event,jahr) - const filePath="/bilder/"+path.basename(event)+"/"+path.basename(jahr)+"/"+path.basename(bild); - - - return sharp(filePath).png().toBuffer(); - - } + return sharp(filePath).png().toBuffer(); + } + @Get('/randomimage/:event/:jahr') + @Header('Content-Type', 'image/png') + async getRandomImage( + @Param('event') + event: string, + @Param('jahr') + jahr: number, + ): Promise { + const filePath = + '/bilder/' + + path.basename(event) + + '/' + + path.basename(jahr.toString()) + + '/' + + await this.galerieService.getRandomImage(event,jahr) + return sharp(filePath).png().toBuffer(); + } +} + +@Resolver() +export class GalerieResolver { + constructor(private readonly galerieService: GalerieService) {} + + @Query(() => [String]) + async getBilder( + @Args('event', { type: () => String }) event: string, + @Args('jahr', { type: () => Number }) jahr: number, + ): Promise { + return this.galerieService.getBilder(event, jahr); + } + + @Query(() => [JahrMitBildEntity]) + async bilder( + @Args('event', { type: () => String }) event: string, + ): Promise { + return this.galerieService.getJahre(event); + } +} + +@ObjectType() +export class JahrMitBildEntity implements JahrMitBild { + @Field(() => Number) + jahr: number; + @Field(() => [String]) + bild: string[]; + constructor(jahr: number, bild: string[]) { + this.jahr = jahr; + this.bild = bild; + } } diff --git a/src/galerie/galerie.module.ts b/src/galerie/galerie.module.ts index f27d83d..ac8e7ad 100644 --- a/src/galerie/galerie.module.ts +++ b/src/galerie/galerie.module.ts @@ -1,6 +1,6 @@ import { Module } from '@nestjs/common'; import { TypeOrmModule } from '@nestjs/typeorm'; -import { GalerieController } from './galerie.controller'; +import { GalerieController, GalerieResolver } from './galerie.controller'; import { GalerieService } from './galerie.service'; @Module({ @@ -11,7 +11,7 @@ import { GalerieService } from './galerie.service'; GalerieController ], providers: [ - GalerieService, GalerieController + GalerieService, GalerieResolver ] }) export class GalerieModule {} diff --git a/src/galerie/galerie.service.ts b/src/galerie/galerie.service.ts index fa8afa5..dd8ca0a 100644 --- a/src/galerie/galerie.service.ts +++ b/src/galerie/galerie.service.ts @@ -1,6 +1,7 @@ import { Injectable } from "@nestjs/common"; import { promises as fs } from 'fs'; import * as path from 'path'; +import { JahrMitBild } from "src/dto/galerie.dto"; @Injectable() export class GalerieService { @@ -11,9 +12,9 @@ export class GalerieService { async getBilder( event: string, - jahr: string + jahr: number ): Promise { - const files= await fs.readdir(path.join(this.imagesPath,event, jahr)); + const files= await fs.readdir(path.join(this.imagesPath,event, jahr.toString())); // Nur Bilddateien filtern const imageFiles = files.filter(file => @@ -25,25 +26,36 @@ export class GalerieService { async getJahre( event: string - ): Promise { - const files= await fs.readdir(path.join(this.imagesPath,event)); + ): Promise { + const files= await fs.readdir(path.join(this.imagesPath,event).toString()); // Nur Verzeichnisse filtern (Jahre) - const directories: string[] = []; + const directories: JahrMitBild[] = []; for (const file of files) { const filePath = path.join(this.imagesPath, event, file); const stat = await fs.stat(filePath); if (stat.isDirectory()) { - directories.push(file); + directories.push(new JahrMitBild(parseInt(file), await this.getBilder(event,parseInt(file)))); } } return directories; } - async getBild( + async getRandomImage(event: string, jahr: number): Promise{ + const bilder=await this.getBilder(event,jahr); + + const index = Math.floor(Math.random() * bilder.length); - ) { + return bilder[index]; + + } + + async getRandomYear(event:string): Promise{ + const jahre=(await this.getJahre(event)).map((jahr)=>jahr.jahr); + + const index = Math.floor(Math.random() * jahre.length); + return jahre[index]; } } \ No newline at end of file