feat: Profilseite, Etikettendruck mit QR-Code, mehr Automatisierungen und Entra-ID-SSO
- Profilseite mit MFA-Einrichtung, Passwort/E-Mail/Name aendern, Konto deaktivieren - Bearbeiten-Buttons fuer Bienenstaende/Voelker/Koeniginnen/Aufgaben-Datensaetze - Restliche englische Enum-Werte durch deutsche Labels ersetzt (SelectValue-Fix) - Sidebar-Eintraege fuer Ernten/Schleuderungen ergaenzt - Automatisierungen von 3 auf 6 Regeln erweitert (Schwarmstimmung, kritischer Gesundheitsstatus, Lagerbestand) - Responsive Grid-Layout fuer Volk-/Koeniginnen-/Honigchargen-/Bienenstand-Detailseiten - Etikettenvorlagen mit Platzhaltern inkl. QR-Code (verweist auf Herkunftsseite) und PDF-Druck - Entra-ID-SSO (Authorization Code + PKCE, kein Auto-Provisioning, Secrets nur ueber Environment-Variablen)
This commit is contained in:
1 parent
0a52b29c57
commit
8432313fa9
83 files changed
+2684
-289
No files matched your search
@@ -0,0 +1,81 @@
|
||||
import {
|
||||
Body,
|
||||
Controller,
|
||||
Delete,
|
||||
Get,
|
||||
Param,
|
||||
Patch,
|
||||
Post,
|
||||
Res,
|
||||
} from '@nestjs/common';
|
||||
import { ApiBearerAuth, ApiTags } from '@nestjs/swagger';
|
||||
import type { Response } from 'express';
|
||||
import { RequirePermission } from '../auth/decorators/require-permission.decorator';
|
||||
import { CurrentUser } from '../auth/decorators/current-user.decorator';
|
||||
import type { AuthenticatedUser } from '../auth/types/authenticated-user';
|
||||
import { CreateLabelTemplateDto } from './dto/create-label-template.dto';
|
||||
import { UpdateLabelTemplateDto } from './dto/update-label-template.dto';
|
||||
import { LabelTemplatesService } from './label-templates.service';
|
||||
|
||||
@ApiTags('label-templates')
|
||||
@ApiBearerAuth()
|
||||
@Controller('label-templates')
|
||||
export class LabelTemplatesController {
|
||||
constructor(private readonly labelTemplatesService: LabelTemplatesService) {}
|
||||
|
||||
@RequirePermission('label-templates:read')
|
||||
@Get()
|
||||
findAll() {
|
||||
return this.labelTemplatesService.findAll();
|
||||
}
|
||||
|
||||
@RequirePermission('label-templates:read')
|
||||
@Get(':id')
|
||||
findOne(@Param('id') id: string) {
|
||||
return this.labelTemplatesService.findById(id);
|
||||
}
|
||||
|
||||
@RequirePermission('label-templates:create')
|
||||
@Post()
|
||||
create(
|
||||
@Body() dto: CreateLabelTemplateDto,
|
||||
@CurrentUser() actor: AuthenticatedUser,
|
||||
) {
|
||||
return this.labelTemplatesService.create(dto, actor.id);
|
||||
}
|
||||
|
||||
@RequirePermission('label-templates:update')
|
||||
@Patch(':id')
|
||||
update(
|
||||
@Param('id') id: string,
|
||||
@Body() dto: UpdateLabelTemplateDto,
|
||||
@CurrentUser() actor: AuthenticatedUser,
|
||||
) {
|
||||
return this.labelTemplatesService.update(id, dto, actor.id);
|
||||
}
|
||||
|
||||
@RequirePermission('label-templates:deactivate')
|
||||
@Delete(':id')
|
||||
deactivate(@Param('id') id: string, @CurrentUser() actor: AuthenticatedUser) {
|
||||
return this.labelTemplatesService.deactivate(id, actor.id);
|
||||
}
|
||||
|
||||
@RequirePermission('label-templates:print')
|
||||
@Get(':id/print/:bottlingBatchId')
|
||||
async print(
|
||||
@Param('id') id: string,
|
||||
@Param('bottlingBatchId') bottlingBatchId: string,
|
||||
@Res() res: Response,
|
||||
): Promise<void> {
|
||||
const pdf = await this.labelTemplatesService.renderLabelsPdf(
|
||||
id,
|
||||
bottlingBatchId,
|
||||
);
|
||||
res.setHeader('Content-Type', 'application/pdf');
|
||||
res.setHeader(
|
||||
'Content-Disposition',
|
||||
'attachment; filename="etiketten.pdf"',
|
||||
);
|
||||
res.send(pdf);
|
||||
}
|
||||
}
|
||||
Reference in new issue
Block a user