20 Commits

Author SHA1 Message Date
2a96ec4007 Update dependency @types/node to v25
Some checks failed
renovate/artifacts Artifact file update failure
2026-06-06 15:07:59 +00:00
82c374ed44 Merge pull request 'rebase! Update dependency eslint to v9.39.4' (#9) from renovate/eslint-9.x into nestjs
Reviewed-on: #9
2026-05-30 08:52:52 +00:00
3935509b3a Merge pull request 'Update dependency @types/node to v22.19.19' (#8) from renovate/node-22.x into nestjs
Reviewed-on: #8
2026-05-30 08:52:39 +00:00
51b4cb736b Update dependency eslint to v9.39.4
Some checks failed
renovate/artifacts Artifact file update failure
2026-05-30 08:33:07 +00:00
a4443cf8d8 Update dependency @types/node to v22.19.19
Some checks failed
renovate/artifacts Artifact file update failure
2026-05-30 08:32:53 +00:00
cd2bbfe240 Merge pull request 'Update dependency @types/node to v25' (#6) from renovate/node-25.x into nestjs
Reviewed-on: #6
2026-05-09 10:21:18 +00:00
4efc18c2d9 Update dependency eslint to v10 (#7) 2026-05-09 10:17:45 +00:00
df0a43ecc5 Update dependency eslint to v10
Some checks failed
renovate/artifacts Artifact file update failure
2026-05-08 11:06:51 +00:00
8a90fef0a5 Update dependency @types/node to v25
Some checks failed
renovate/artifacts Artifact file update failure
2026-05-08 11:06:42 +00:00
aeb0e126c1 Merge pull request 'Update dependency @types/supertest to v7' (#2) from renovate/supertest-7.x into nestjs
Reviewed-on: #2
2026-05-06 17:32:53 +00:00
29612c3e02 Update dependency @types/supertest to v7
Some checks failed
renovate/artifacts Artifact file update failure
2026-05-06 17:31:01 +00:00
e83e5da007 Update dependency @eslint/js to v9.39.4 (#3) 2026-05-06 13:56:51 +00:00
7f4155fcdf Update dependency @eslint/js to v9.39.4
Some checks failed
renovate/artifacts Artifact file update failure
2026-05-06 13:51:07 +00:00
d3d0d7f1d1 Merge branch 'nestjs' of https://git.ritzenbergen.de/Jonas/ritzenbergen-backend into nestjs 2026-05-06 14:49:06 +02:00
b40ed36358 Modify gallery controller 2026-05-06 14:49:03 +02:00
842783cae0 Merge pull request 'Update dependency @eslint/js to v10' (#1) from renovate/eslint-js-10.x into nestjs
Reviewed-on: #1
2026-05-06 12:47:33 +00:00
8f1e0cd204 Update dependency @eslint/js to v10 2026-05-06 11:39:49 +00:00
690a640b31 Add Random Image 2026-05-05 12:29:45 +02:00
623cdc6c37 Add Galerie Controller 2026-05-04 20:59:09 +02:00
e9a0e12276 Update Dependencies 2026-05-02 19:12:00 +02:00
7 changed files with 1234 additions and 494 deletions

1517
package-lock.json generated

File diff suppressed because it is too large Load Diff

View File

@@ -32,24 +32,27 @@
"graphql": "^16.12.0", "graphql": "^16.12.0",
"mercurius": "^16.7.0", "mercurius": "^16.7.0",
"mysql2": "^3.16.2", "mysql2": "^3.16.2",
"node-addon-api": "^8.7.0",
"reflect-metadata": "^0.2.2", "reflect-metadata": "^0.2.2",
"rxjs": "^7.8.1", "rxjs": "^7.8.1",
"sharp": "^0.34.5",
"typeorm": "^0.3.28" "typeorm": "^0.3.28"
}, },
"devDependencies": { "devDependencies": {
"@eslint/eslintrc": "^3.2.0", "@eslint/eslintrc": "^3.2.0",
"@eslint/js": "^9.18.0", "@eslint/js": "^9.39.2",
"@nestjs/cli": "^11.0.0", "@nestjs/cli": "^11.0.0",
"@nestjs/schematics": "^11.0.0", "@nestjs/schematics": "^11.0.0",
"@nestjs/testing": "^11.0.1", "@nestjs/testing": "^11.0.1",
"@types/jest": "^30.0.0", "@types/jest": "^30.0.0",
"@types/node": "^22.10.7", "@types/node": "^25.0.0",
"@types/supertest": "^6.0.2", "@types/supertest": "^7.0.0",
"eslint": "^9.18.0", "eslint": "^9.39.2",
"eslint-config-prettier": "^10.0.1", "eslint-config-prettier": "^10.0.1",
"eslint-plugin-prettier": "^5.2.2", "eslint-plugin-prettier": "^5.2.2",
"globals": "^16.0.0", "globals": "^16.0.0",
"jest": "^30.0.0", "jest": "^30.0.0",
"node-gyp": "^12.3.0",
"prettier": "^3.4.2", "prettier": "^3.4.2",
"source-map-support": "^0.5.21", "source-map-support": "^0.5.21",
"supertest": "^7.0.0", "supertest": "^7.0.0",

View File

@@ -11,6 +11,7 @@ import { FormularEntity } from './formular/formular.entity';
import { FieldEntity } from './formular/fields.entity'; import { FieldEntity } from './formular/fields.entity';
import { FormResultEntity } from './formular/result.entity'; import { FormResultEntity } from './formular/result.entity';
import { FormResultsEntity } from './formular/results.entity'; import { FormResultsEntity } from './formular/results.entity';
import { GalerieModule } from './galerie/galerie.module';
@Module({ @Module({
imports: [ imports: [
@@ -31,6 +32,7 @@ import { FormResultsEntity } from './formular/results.entity';
entities: [EventEntity, FormularEntity,FieldEntity,FormResultEntity,FormResultsEntity] entities: [EventEntity, FormularEntity,FieldEntity,FormResultEntity,FormResultsEntity]
}), }),
FormularModule, FormularModule,
GalerieModule
], ],
controllers: [AppController], controllers: [AppController],

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

View File

@@ -0,0 +1,118 @@
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,
) {}
@Get('/bilder/:event/:jahr')
async getBilder(
@Param('event') event: string,
@Param('jahr') jahr: number,
): Promise<string[]> {
return this.galerieService.getBilder(event, jahr);
}
@Get('/jahre/:event')
async getJahre(@Param('event') event: string): Promise<JahrMitBild[]> {
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<Buffer> {
const filePath =
'/bilder/' +
path.basename(event) +
'/' +
path.basename(jahr.toString()) +
'/' +
path.basename(bild);
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,
@Args('jahr', { type: () => Number, nullable: true }) jahr: number,
): Promise<JahrMitBildEntity[]> {
if(jahr==null) return this.galerieService.getJahre(event);
return (await this.galerieService.getJahre(event))
.filter(jahrmitbild=>jahrmitbild.jahr==jahr);
}
}
@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

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

View File

@@ -0,0 +1,61 @@
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 {
private readonly imagesPath = "/bilder";
constructor(
){}
async getBilder(
event: string,
jahr: number
): Promise<string[]> {
const files= await fs.readdir(path.join(this.imagesPath,event, jahr.toString()));
// Nur Bilddateien filtern
const imageFiles = files.filter(file =>
/\.(jpg|jpeg|png|gif|webp)$/i.test(file)
);
return imageFiles;
}
async getJahre(
event: string
): Promise<JahrMitBild[]> {
const files= await fs.readdir(path.join(this.imagesPath,event).toString());
// Nur Verzeichnisse filtern (Jahre)
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(new JahrMitBild(parseInt(file), await this.getBilder(event,parseInt(file))));
}
}
return directories;
}
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];
}
}