Add Random Image

This commit is contained in:
2026-05-05 12:29:45 +02:00
parent 623cdc6c37
commit 690a640b31
4 changed files with 128 additions and 51 deletions

Submodule src/dto updated: 12938c8125...78d9d15d64

View File

@@ -1,50 +1,115 @@
import { BadRequestException, Controller, Get, Header, Inject, Param, Res } from "@nestjs/common"; import { Controller, Get, Header, Inject, Param, Res } from '@nestjs/common';
import { GalerieService } from "./galerie.service"; import { GalerieService } from './galerie.service';
import sharp from "sharp"; import sharp from 'sharp';
import path from "path"; import path from 'path';
import { Args, Field, ObjectType, Query, Resolver } from '@nestjs/graphql';
import { JahrMitBild } from 'src/dto/galerie.dto';
@Controller('/api/galerie') @Controller('/api/galerie')
export class GalerieController { export class GalerieController {
constructor( constructor(
@Inject() @Inject()
private readonly galerieService: GalerieService private readonly galerieService: GalerieService,
) {} ) {}
@Get("/bilder/:event/:jahr") @Get('/bilder/:event/:jahr')
async getBilder( async getBilder(
@Param("event") @Param('event') event: string,
event: string, @Param('jahr') jahr: number,
@Param("jahr")
jahr: string
): Promise<string[]> { ): Promise<string[]> {
return this.galerieService.getBilder(event, jahr); return this.galerieService.getBilder(event, jahr);
} }
@Get('/jahre/:event')
@Get("/jahre/:event") async getJahre(@Param('event') event: string): Promise<JahrMitBild[]> {
async getJahre(
@Param("event")
event: string
): Promise<string[]> {
return this.galerieService.getJahre(event); return this.galerieService.getJahre(event);
} }
@Get("/bild/:event/:jahr/:bild") @Get('/bild/:event/:jahr/:bild')
@Header('Content-Type', 'image/png') @Header('Content-Type', 'image/png')
async getBild( async getBild(
@Param("event") @Param('event')
event: string, event: string,
@Param("jahr") @Param('jahr')
jahr: string, jahr: number,
@Param("bild") @Param('bild')
bild: string, bild: string,
): Promise<Buffer> { ): Promise<Buffer> {
const filePath =
const filePath="/bilder/"+path.basename(event)+"/"+path.basename(jahr)+"/"+path.basename(bild); '/bilder/' +
path.basename(event) +
'/' +
path.basename(jahr.toString()) +
'/' +
path.basename(bild);
return sharp(filePath).png().toBuffer(); return sharp(filePath).png().toBuffer();
}
@Get('/randomimage/:event')
@Header('Content-Type', 'image/png')
async getRandomImageOhneJahr(
@Param('event')
event: string,
): Promise<Buffer> {
const jahr=await this.galerieService.getRandomYear(event)
const filePath =
'/bilder/' +
path.basename(event) +
'/' +
jahr+
'/' +
await this.galerieService.getRandomImage(event,jahr)
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<Buffer> {
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<string[]> {
return this.galerieService.getBilder(event, jahr);
}
@Query(() => [JahrMitBildEntity])
async bilder(
@Args('event', { type: () => String }) event: string,
): Promise<JahrMitBildEntity[]> {
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;
}
} }

View File

@@ -1,6 +1,6 @@
import { Module } from '@nestjs/common'; import { Module } from '@nestjs/common';
import { TypeOrmModule } from '@nestjs/typeorm'; import { TypeOrmModule } from '@nestjs/typeorm';
import { GalerieController } from './galerie.controller'; import { GalerieController, GalerieResolver } from './galerie.controller';
import { GalerieService } from './galerie.service'; import { GalerieService } from './galerie.service';
@Module({ @Module({
@@ -11,7 +11,7 @@ import { GalerieService } from './galerie.service';
GalerieController GalerieController
], ],
providers: [ providers: [
GalerieService, GalerieController GalerieService, GalerieResolver
] ]
}) })
export class GalerieModule {} export class GalerieModule {}

View File

@@ -1,6 +1,7 @@
import { Injectable } from "@nestjs/common"; import { Injectable } from "@nestjs/common";
import { promises as fs } from 'fs'; import { promises as fs } from 'fs';
import * as path from 'path'; import * as path from 'path';
import { JahrMitBild } from "src/dto/galerie.dto";
@Injectable() @Injectable()
export class GalerieService { export class GalerieService {
@@ -11,9 +12,9 @@ export class GalerieService {
async getBilder( async getBilder(
event: string, event: string,
jahr: string jahr: number
): Promise<string[]> { ): Promise<string[]> {
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 // Nur Bilddateien filtern
const imageFiles = files.filter(file => const imageFiles = files.filter(file =>
@@ -25,25 +26,36 @@ export class GalerieService {
async getJahre( async getJahre(
event: string event: string
): Promise<string[]> { ): Promise<JahrMitBild[]> {
const files= await fs.readdir(path.join(this.imagesPath,event)); const files= await fs.readdir(path.join(this.imagesPath,event).toString());
// Nur Verzeichnisse filtern (Jahre) // Nur Verzeichnisse filtern (Jahre)
const directories: string[] = []; const directories: JahrMitBild[] = [];
for (const file of files) { for (const file of files) {
const filePath = path.join(this.imagesPath, event, file); const filePath = path.join(this.imagesPath, event, file);
const stat = await fs.stat(filePath); const stat = await fs.stat(filePath);
if (stat.isDirectory()) { if (stat.isDirectory()) {
directories.push(file); directories.push(new JahrMitBild(parseInt(file), await this.getBilder(event,parseInt(file))));
} }
} }
return directories; return directories;
} }
async getBild( async getRandomImage(event: string, jahr: number): Promise<string>{
const bilder=await this.getBilder(event,jahr);
) { const index = Math.floor(Math.random() * bilder.length);
return bilder[index];
}
async getRandomYear(event:string): Promise<number>{
const jahre=(await this.getJahre(event)).map((jahr)=>jahr.jahr);
const index = Math.floor(Math.random() * jahre.length);
return jahre[index];
} }
} }