From f8a5183f1ab006e76fdbd9896d63389b284cb9e8 Mon Sep 17 00:00:00 2001 From: Julian Krauser Date: Wed, 19 Mar 2025 15:19:03 +0100 Subject: [PATCH] system queries + custom template selection --- .../admin/club/listprintController.ts | 18 +++++++--- src/helpers/dynamicQueryBuilder.ts | 35 ++++++++++++++++++- src/helpers/pdfExport.ts | 1 + src/helpers/templateHelper.ts | 4 ++- src/routes/admin/club/listprint.ts | 2 +- 5 files changed, 52 insertions(+), 8 deletions(-) diff --git a/src/controller/admin/club/listprintController.ts b/src/controller/admin/club/listprintController.ts index edd4961..1159d9f 100644 --- a/src/controller/admin/club/listprintController.ts +++ b/src/controller/admin/club/listprintController.ts @@ -2,6 +2,7 @@ import { Request, Response } from "express"; import { PdfExport } from "../../../helpers/pdfExport"; import DynamicQueryBuilder from "../../../helpers/dynamicQueryBuilder"; import QueryStoreService from "../../../service/configuration/queryStoreService"; +import InternalException from "../../../exceptions/internalException"; /** * @description print list by query and template @@ -18,13 +19,19 @@ export async function printListByQueryAndTemplate(req: Request, res: Response): const headerHeight = req.body.headerHeight ?? null; const footerHeight = req.body.footerHeight ?? null; - // \/ integrate into query builder execution via shortcut - //await MemberService.getByRunningMembership(); - //await MemberService.getAll({ noLimit:true }); + let query = queryStore; + if (queryStore != "member" && queryStore != "memberByRunningMembership") { + query = (await QueryStoreService.getById(queryStore)).query; + } - let query = (await QueryStoreService.getById(queryStore)).query; + let data = await DynamicQueryBuilder.executeQuery({ + query: query.startsWith("{") ? JSON.parse(query) : query, + noLimit: true, + }); - await DynamicQueryBuilder.executeQuery({ query, noLimit: true }); + if (data.stats == "error") { + throw new InternalException("Failed executing Query"); + } let pdf = await PdfExport.renderFile({ title: title, @@ -32,6 +39,7 @@ export async function printListByQueryAndTemplate(req: Request, res: Response): saveToDisk: false, data: { today: new Date(), + list: data.rows, }, customTemplate: { headerId, diff --git a/src/helpers/dynamicQueryBuilder.ts b/src/helpers/dynamicQueryBuilder.ts index 1749016..446fc22 100644 --- a/src/helpers/dynamicQueryBuilder.ts +++ b/src/helpers/dynamicQueryBuilder.ts @@ -314,6 +314,13 @@ export default abstract class DynamicQueryBuilder { count: number; } > { + if (query == "member") { + query = memberQuery; + } + if (query == "memberByRunningMembership") { + query = memberByRunningMembershipQuery; + } + if (typeof query == "string") { const upperQuery = query.trim().toUpperCase(); if (!upperQuery.startsWith("SELECT") || /INSERT|UPDATE|DELETE|ALTER|DROP|CREATE|TRUNCATE/.test(upperQuery)) { @@ -330,7 +337,7 @@ export default abstract class DynamicQueryBuilder { return await dataSource .transaction(async (manager) => { - data = await manager.query(query); + data = await manager.query(query.toString()); throw new Error("AllwaysRollbackQuery"); }) @@ -382,3 +389,29 @@ export default abstract class DynamicQueryBuilder { } } } + +const memberQuery: DynamicQueryStructure = { + select: "*", + table: "member", + orderBy: [ + { column: "lastname", order: "ASC" }, + { column: "firstname", order: "ASC" }, + ], +}; + +const memberByRunningMembershipQuery: DynamicQueryStructure = { + select: "*", + table: "member", + join: [ + { + select: "*", + table: "membership", + where: [{ structureType: "condition", concat: "_", operation: "null", column: "end", value: "" }], + foreignColumn: "memberships", + }, + ], + orderBy: [ + { column: "lastname", order: "ASC" }, + { column: "firstname", order: "ASC" }, + ], +}; diff --git a/src/helpers/pdfExport.ts b/src/helpers/pdfExport.ts index b22f061..e59ba54 100644 --- a/src/helpers/pdfExport.ts +++ b/src/helpers/pdfExport.ts @@ -41,6 +41,7 @@ export abstract class PdfExport { })); } else { ({ header, footer, body, headerMargin, footerMargin } = await TemplateHelper.renderFileForCustom({ + module: template, customTemplate, headerData: data, bodyData: data, diff --git a/src/helpers/templateHelper.ts b/src/helpers/templateHelper.ts index 54a48fc..e75c87c 100644 --- a/src/helpers/templateHelper.ts +++ b/src/helpers/templateHelper.ts @@ -81,12 +81,14 @@ export abstract class TemplateHelper { } static async renderFileForCustom({ + module, title = "pdf-export FF Admin", headerData = {}, bodyData = {}, footerData = {}, customTemplate, }: { + module: `${PermissionModule}` | `${PermissionModule}.${string}`; title?: string; headerData?: any; bodyData?: any; @@ -118,7 +120,7 @@ export abstract class TemplateHelper { if (customTemplate.bodyId && typeof customTemplate.bodyId == "number") { body = await this.getTemplateFromStore(customTemplate.bodyId); } else { - body = this.getTemplateFromFile(module + ".body"); + body = this.getTemplateFromFile((customTemplate.bodyId || module) + ".body"); } body = this.applyDataToTemplate(body, { title, ...bodyData }); diff --git a/src/routes/admin/club/listprint.ts b/src/routes/admin/club/listprint.ts index 9bb8a7d..08e24d5 100644 --- a/src/routes/admin/club/listprint.ts +++ b/src/routes/admin/club/listprint.ts @@ -3,7 +3,7 @@ import { printListByQueryAndTemplate } from "../../../controller/admin/club/list var router = express.Router({ mergeParams: true }); -router.get("/", async (req: Request, res: Response) => { +router.post("/", async (req: Request, res: Response) => { await printListByQueryAndTemplate(req, res); });