diff --git a/package-lock.json b/package-lock.json index cfbc2a5..1a5914d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,19 +1,19 @@ { "name": "ff-admin-server", - "version": "1.7.2", + "version": "1.7.6", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "ff-admin-server", - "version": "1.7.2", + "version": "1.7.6", "license": "AGPL-3.0-only", "dependencies": { "cors": "^2.8.5", "crypto": "^1.0.1", "dotenv": "^17.2.0", "express": "^5.1.0", - "express-rate-limit": "^7.5.1", + "express-rate-limit": "^8.0.1", "express-validator": "^7.2.1", "handlebars": "^4.7.8", "helmet": "^8.1.0", @@ -23,14 +23,14 @@ "lodash.clonedeep": "^4.5.0", "lodash.uniqby": "^4.7.0", "moment": "^2.30.1", - "morgan": "^1.10.0", + "morgan": "^1.10.1", "ms": "^2.1.3", - "multer": "^2.0.1", + "multer": "^2.0.2", "node-schedule": "^2.1.1", "nodemailer": "^7.0.5", "pdf-lib": "^1.17.1", "pg": "^8.16.3", - "puppeteer": "^24.12.1", + "puppeteer": "^24.14.0", "qrcode": "^1.5.4", "reflect-metadata": "^0.2.2", "rss-parser": "^3.13.0", @@ -52,7 +52,7 @@ "@types/morgan": "^1.9.10", "@types/ms": "^2.1.0", "@types/multer": "^2.0.0", - "@types/node": "^24.0.13", + "@types/node": "^24.0.15", "@types/node-schedule": "^2.1.8", "@types/nodemailer": "^6.4.17", "@types/pg": "~8.15.4", @@ -744,9 +744,9 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.10.5", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.5.tgz", - "integrity": "sha512-eifa0o+i8dERnngJwKrfp3dEq7ia5XFyoqB17S4gK8GhsQE4/P8nxOfQSE0zQHxzzLo/cmF+7+ywEQ7wK7Fb+w==", + "version": "2.10.6", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.10.6.tgz", + "integrity": "sha512-pHUn6ZRt39bP3698HFQlu2ZHCkS/lPcpv7fVQcGBSzNNygw171UXAKrCUhy+TEMw4lEttOKDgNpb04hwUAJeiQ==", "license": "Apache-2.0", "dependencies": { "debug": "^4.4.1", @@ -754,7 +754,7 @@ "progress": "^2.0.3", "proxy-agent": "^6.5.0", "semver": "^7.7.2", - "tar-fs": "^3.0.8", + "tar-fs": "^3.1.0", "yargs": "^17.7.2" }, "bin": { @@ -966,9 +966,9 @@ } }, "node_modules/@types/node": { - "version": "24.0.13", - "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.13.tgz", - "integrity": "sha512-Qm9OYVOFHFYg3wJoTSrz80hoec5Lia/dPp84do3X7dZvLikQvM1YpmvTBEdIr/e+U8HTkFjLHLnl78K/qjf+jQ==", + "version": "24.0.15", + "resolved": "https://registry.npmjs.org/@types/node/-/node-24.0.15.tgz", + "integrity": "sha512-oaeTSbCef7U/z7rDeJA138xpG3NuKc64/rZ2qmUFkFJmnMsAPaluIifqyWd8hSSMxyP9oie3dLAqYPblag9KgA==", "license": "MIT", "dependencies": { "undici-types": "~7.8.0" @@ -1686,9 +1686,9 @@ } }, "node_modules/chromium-bidi": { - "version": "5.1.0", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-5.1.0.tgz", - "integrity": "sha512-9MSRhWRVoRPDG0TgzkHrshFSJJNZzfY5UFqUMuksg7zL1yoZIZ3jLB0YAgHclbiAxPI86pBnwDX1tbzoiV8aFw==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-7.1.1.tgz", + "integrity": "sha512-L2BKQ0rSLADgbPMIdDh3wnYHs3EiUiMay2Sq0CTolheaADmWIf6Pe+T9LJRcnh5rcMz0U7MVk0cQVvKsGRMa1g==", "license": "Apache-2.0", "dependencies": { "mitt": "^3.0.1", @@ -2483,10 +2483,13 @@ } }, "node_modules/express-rate-limit": { - "version": "7.5.1", - "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-7.5.1.tgz", - "integrity": "sha512-7iN8iPMDzOMHPUYllBEsQdWVB6fPDMPqwjBaFrgr4Jgr/+okjvzAy+UHlYYL/Vs0OsOrMkwS6PJDkFlJwoxUnw==", + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/express-rate-limit/-/express-rate-limit-8.0.1.tgz", + "integrity": "sha512-aZVCnybn7TVmxO4BtlmnvX+nuz8qHW124KKJ8dumsBsmv5ZLxE0pYu7S2nwyRBGHHCAzdmnGyrc5U/rksSPO7Q==", "license": "MIT", + "dependencies": { + "ip-address": "10.0.1" + }, "engines": { "node": ">= 16" }, @@ -2497,6 +2500,15 @@ "express": ">= 4.11" } }, + "node_modules/express-rate-limit/node_modules/ip-address": { + "version": "10.0.1", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-10.0.1.tgz", + "integrity": "sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==", + "license": "MIT", + "engines": { + "node": ">= 12" + } + }, "node_modules/express-validator": { "version": "7.2.1", "resolved": "https://registry.npmjs.org/express-validator/-/express-validator-7.2.1.tgz", @@ -3673,16 +3685,16 @@ } }, "node_modules/morgan": { - "version": "1.10.0", - "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.0.tgz", - "integrity": "sha512-AbegBVI4sh6El+1gNwvD5YIck7nSA36weD7xvIxG4in80j/UoK8AEGaWnnz8v1GxonMCltmlNs5ZKbGvl9b1XQ==", + "version": "1.10.1", + "resolved": "https://registry.npmjs.org/morgan/-/morgan-1.10.1.tgz", + "integrity": "sha512-223dMRJtI/l25dJKWpgij2cMtywuG/WiUKXdvwfbhGKBhy1puASqXwFzmWZ7+K73vUPoR7SS2Qz2cI/g9MKw0A==", "license": "MIT", "dependencies": { "basic-auth": "~2.0.1", "debug": "2.6.9", "depd": "~2.0.0", "on-finished": "~2.3.0", - "on-headers": "~1.0.2" + "on-headers": "~1.1.0" }, "engines": { "node": ">= 0.8.0" @@ -3722,9 +3734,9 @@ "license": "MIT" }, "node_modules/multer": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.1.tgz", - "integrity": "sha512-Ug8bXeTIUlxurg8xLTEskKShvcKDZALo1THEX5E41pYCD2sCVub5/kIRIGqWNoqV6szyLyQKV6mD4QUrWE5GCQ==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/multer/-/multer-2.0.2.tgz", + "integrity": "sha512-u7f2xaZ/UG8oLXHvtF/oWTRvT44p9ecwBBqTwgJVq0+4BW1g8OW01TyMEGWBHbyMOYVHXslaut7qEQ1meATXgw==", "license": "MIT", "dependencies": { "append-field": "^1.0.0", @@ -3972,9 +3984,9 @@ } }, "node_modules/on-headers": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.0.2.tgz", - "integrity": "sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==", + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/on-headers/-/on-headers-1.1.0.tgz", + "integrity": "sha512-737ZY3yNnXy37FHkQxPzt4UZ2UWPWiCZWLvFZ4fu5cueciegX0zGPnrlY6bwRg4FdQOe9YU8MkmJwGhoMybl8A==", "license": "MIT", "engines": { "node": ">= 0.8" @@ -4510,17 +4522,17 @@ } }, "node_modules/puppeteer": { - "version": "24.12.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.12.1.tgz", - "integrity": "sha512-+vvwl+Xo4z5uXLLHG+XW8uXnUXQ62oY6KU6bEFZJvHWLutbmv5dw9A/jcMQ0fqpQdLydHmK0Uy7/9Ilj8ufwSQ==", + "version": "24.14.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-24.14.0.tgz", + "integrity": "sha512-GB7suRDkp9pUnxpNGAORICQCtw11KFbg6U2iJXVTflzJLK5D1qzq8xOOmLgN/QnDBpDMdpn96ri52XkuN83Giw==", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.5", - "chromium-bidi": "5.1.0", + "@puppeteer/browsers": "2.10.6", + "chromium-bidi": "7.1.1", "cosmiconfig": "^9.0.0", "devtools-protocol": "0.0.1464554", - "puppeteer-core": "24.12.1", + "puppeteer-core": "24.14.0", "typed-query-selector": "^2.12.0" }, "bin": { @@ -4531,13 +4543,13 @@ } }, "node_modules/puppeteer-core": { - "version": "24.12.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.12.1.tgz", - "integrity": "sha512-8odp6d3ERKBa3BAVaYWXn95UxQv3sxvP1reD+xZamaX6ed8nCykhwlOiHSaHR9t/MtmIB+rJmNencI6Zy4Gxvg==", + "version": "24.14.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-24.14.0.tgz", + "integrity": "sha512-NO9XpCl+i8oB0zJp81iPhzMo2QK8/JTj4ramSvTpGCo9CPCNo4AZ8qVOGpSgXzlcOfOT3VHOkzTfPo08GOE5jA==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.10.5", - "chromium-bidi": "5.1.0", + "@puppeteer/browsers": "2.10.6", + "chromium-bidi": "7.1.1", "debug": "^4.4.1", "devtools-protocol": "0.0.1464554", "typed-query-selector": "^2.12.0", diff --git a/package.json b/package.json index cf7f32c..f1dd2ee 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "ff-admin-server", - "version": "1.7.2", + "version": "1.7.6", "description": "Feuerwehr/Verein Mitgliederverwaltung Server", "main": "dist/index.js", "scripts": { @@ -29,7 +29,7 @@ "crypto": "^1.0.1", "dotenv": "^17.2.0", "express": "^5.1.0", - "express-rate-limit": "^7.5.1", + "express-rate-limit": "^8.0.1", "express-validator": "^7.2.1", "handlebars": "^4.7.8", "helmet": "^8.1.0", @@ -39,14 +39,14 @@ "lodash.clonedeep": "^4.5.0", "lodash.uniqby": "^4.7.0", "moment": "^2.30.1", - "morgan": "^1.10.0", + "morgan": "^1.10.1", "ms": "^2.1.3", - "multer": "^2.0.1", + "multer": "^2.0.2", "node-schedule": "^2.1.1", "nodemailer": "^7.0.5", "pdf-lib": "^1.17.1", "pg": "^8.16.3", - "puppeteer": "^24.12.1", + "puppeteer": "^24.14.0", "qrcode": "^1.5.4", "reflect-metadata": "^0.2.2", "rss-parser": "^3.13.0", @@ -68,7 +68,7 @@ "@types/morgan": "^1.9.10", "@types/ms": "^2.1.0", "@types/multer": "^2.0.0", - "@types/node": "^24.0.13", + "@types/node": "^24.0.15", "@types/node-schedule": "^2.1.8", "@types/nodemailer": "^6.4.17", "@types/pg": "~8.15.4", diff --git a/src/controller/admin/club/memberController.ts b/src/controller/admin/club/memberController.ts index 6301cec..23615a1 100644 --- a/src/controller/admin/club/memberController.ts +++ b/src/controller/admin/club/memberController.ts @@ -215,7 +215,8 @@ export async function getMembershipTotalStatisticsById(req: Request, res: Respon const memberId = req.params.memberId; let member = await MembershipService.getTotalStatisticsById(memberId); - res.json(MembershipFactory.mapToSingleTotalStatistic(member)); + if (!member) res.sendStatus(204); + else res.json(MembershipFactory.mapToSingleTotalStatistic(member)); } /** diff --git a/src/data-source.ts b/src/data-source.ts index ed56dad..74399a3 100644 --- a/src/data-source.ts +++ b/src/data-source.ts @@ -50,6 +50,7 @@ import { memberEducations } from "./entity/club/member/memberEducations"; import { BackupAndResetDatabase1749296262915 } from "./migrations/1749296262915-BackupAndResetDatabase"; import { CreateSchema1749296280721 } from "./migrations/1749296280721-CreateSchema"; +import { UpdateNewsletterQueryRelation1752502069178 } from "./migrations/1752502069178-updateNewsletterQueryRelation"; configCheck(); @@ -108,7 +109,11 @@ const dataSource = new DataSource({ webapiPermission, setting, ], - migrations: [BackupAndResetDatabase1749296262915, CreateSchema1749296280721], + migrations: [ + BackupAndResetDatabase1749296262915, + CreateSchema1749296280721, + UpdateNewsletterQueryRelation1752502069178, + ], migrationsRun: true, migrationsTransactionMode: "each", subscribers: [], diff --git a/src/entity/club/newsletter/newsletter.ts b/src/entity/club/newsletter/newsletter.ts index ead7052..c17aa98 100644 --- a/src/entity/club/newsletter/newsletter.ts +++ b/src/entity/club/newsletter/newsletter.ts @@ -40,7 +40,7 @@ export class newsletter { @ManyToOne(() => query, { nullable: true, - onDelete: "CASCADE", + onDelete: "SET NULL", onUpdate: "RESTRICT", cascade: ["insert"], }) diff --git a/src/helpers/dynamicQueryBuilder.ts b/src/helpers/dynamicQueryBuilder.ts index 25d7554..5548ffd 100644 --- a/src/helpers/dynamicQueryBuilder.ts +++ b/src/helpers/dynamicQueryBuilder.ts @@ -65,7 +65,7 @@ export default abstract class DynamicQueryBuilder { count?: number; noLimit?: boolean; }): SelectQueryBuilder { - let affix = queryObj.id.replaceAll("-", "") ?? StringHelper.random(10); + let affix = queryObj.id?.replaceAll("-", "") ?? StringHelper.random(10); let query = dataSource.getRepository(queryObj.table).createQueryBuilder(`${affix}_${queryObj.table}`); this.buildDynamicQuery(query, queryObj, affix); @@ -118,7 +118,7 @@ export default abstract class DynamicQueryBuilder { if (queryObject.join) { for (const join of queryObject.join) { - let subaffix = join.id.replaceAll("-", "") ?? StringHelper.random(10); + let subaffix = join.id?.replaceAll("-", "") ?? StringHelper.random(10); if (join.type == undefined) join.type = "defined"; if (join.type == "defined") { query.innerJoin(`${alias}.${join.foreignColumn}`, `${subaffix}_${join.table}`); diff --git a/src/migrations/1752502069178-updateNewsletterQueryRelation.ts b/src/migrations/1752502069178-updateNewsletterQueryRelation.ts new file mode 100644 index 0000000..759820c --- /dev/null +++ b/src/migrations/1752502069178-updateNewsletterQueryRelation.ts @@ -0,0 +1,44 @@ +import { MigrationInterface, QueryRunner, TableForeignKey } from "typeorm"; +import { newsletter_table } from "./baseSchemaTables/newsletter"; + +export class UpdateNewsletterQueryRelation1752502069178 implements MigrationInterface { + name = "UpdateNewsletterQueryRelation1752502069178"; + + public async up(queryRunner: QueryRunner): Promise { + const table = await queryRunner.getTable("newsletter"); + const foreignKey = table?.foreignKeys.find((fk) => fk.columnNames.includes("recipientsByQueryId")); + if (foreignKey) { + await queryRunner.dropForeignKey("newsletter", foreignKey); + } + + await queryRunner.createForeignKey( + newsletter_table, + new TableForeignKey({ + columnNames: ["recipientsByQueryId"], + referencedColumnNames: ["id"], + referencedTableName: "query", + onDelete: "SET NULL", + onUpdate: "RESTRICT", + }) + ); + } + + public async down(queryRunner: QueryRunner): Promise { + const table = await queryRunner.getTable("newsletter"); + const foreignKey = table?.foreignKeys.find((fk) => fk.columnNames.includes("recipientsByQueryId")); + if (foreignKey) { + await queryRunner.dropForeignKey("newsletter", foreignKey); + } + + await queryRunner.createForeignKey( + newsletter_table, + new TableForeignKey({ + columnNames: ["recipientsByQueryId"], + referencedColumnNames: ["id"], + referencedTableName: "query", + onDelete: "CASCADE", + onUpdate: "RESTRICT", + }) + ); + } +} diff --git a/src/routes/invite.ts b/src/routes/invite.ts index ebb4ddd..9c1159d 100644 --- a/src/routes/invite.ts +++ b/src/routes/invite.ts @@ -10,7 +10,7 @@ router.post("/verify", ParamaterPassCheckHelper.requiredIncludedMiddleware(["mai router.put( "/", - ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "secret", "routine "]), + ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "secret", "routine"]), async (req, res) => { await finishInvite(req, res); } diff --git a/src/routes/setup.ts b/src/routes/setup.ts index 4830d4a..68748c9 100644 --- a/src/routes/setup.ts +++ b/src/routes/setup.ts @@ -50,7 +50,7 @@ router.post( router.post( "/finish", - ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "totp"]), + ParamaterPassCheckHelper.requiredIncludedMiddleware(["mail", "token", "secret", "routine"]), async (req, res) => { await finishInvite(req, res, true); } diff --git a/src/service/club/calendarService.ts b/src/service/club/calendarService.ts index 7e8f86b..c6c7128 100644 --- a/src/service/club/calendarService.ts +++ b/src/service/club/calendarService.ts @@ -13,7 +13,7 @@ export default abstract class CalendarService { .getRepository(calendar) .createQueryBuilder("calendar") .leftJoinAndSelect("calendar.type", "type") - .orderBy("starttime", "ASC") + .orderBy("calendar.starttime", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/club/member/membershipService.ts b/src/service/club/member/membershipService.ts index d423b13..b36e2fb 100644 --- a/src/service/club/member/membershipService.ts +++ b/src/service/club/member/membershipService.ts @@ -77,7 +77,7 @@ export default abstract class MembershipService { .getRepository(membershipTotalView) .createQueryBuilder("membershipTotalView") .where("membershipTotalView.memberId = :memberId", { memberId: memberId }) - .getOneOrFail() + .getOne() .then((res) => { return res; }) diff --git a/src/service/club/newsletter/newsletterService.ts b/src/service/club/newsletter/newsletterService.ts index b11bfd7..d2401b3 100644 --- a/src/service/club/newsletter/newsletterService.ts +++ b/src/service/club/newsletter/newsletterService.ts @@ -12,7 +12,7 @@ export default abstract class NewsletterService { return await dataSource .getRepository(newsletter) .createQueryBuilder("newsletter") - .orderBy("createdAt", "DESC") + .orderBy("newsletter.createdAt", "DESC") .offset(offset) .limit(count) .getManyAndCount() diff --git a/src/service/club/protocol/protocolService.ts b/src/service/club/protocol/protocolService.ts index 185d76a..a8c5828 100644 --- a/src/service/club/protocol/protocolService.ts +++ b/src/service/club/protocol/protocolService.ts @@ -14,7 +14,7 @@ export default abstract class ProtocolService { .createQueryBuilder("protocol") .offset(offset) .limit(count) - .orderBy("date", "DESC") + .orderBy("protocol.date", "DESC") .getManyAndCount() .then((res) => { return res; diff --git a/src/service/configuration/awardService.ts b/src/service/configuration/awardService.ts index 223d676..f7a0b66 100644 --- a/src/service/configuration/awardService.ts +++ b/src/service/configuration/awardService.ts @@ -13,7 +13,7 @@ export default abstract class AwardService { return await dataSource .getRepository(award) .createQueryBuilder("award") - .orderBy("award", "ASC") + .orderBy("award.award", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/calendarTypeService.ts b/src/service/configuration/calendarTypeService.ts index 7d82ef4..a84e5a9 100644 --- a/src/service/configuration/calendarTypeService.ts +++ b/src/service/configuration/calendarTypeService.ts @@ -12,7 +12,7 @@ export default abstract class CalendarTypeService { return await dataSource .getRepository(calendarType) .createQueryBuilder("calendarType") - .orderBy("type", "ASC") + .orderBy("calendarType.type", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/communicationTypeService.ts b/src/service/configuration/communicationTypeService.ts index 4ee9de0..44fef7f 100644 --- a/src/service/configuration/communicationTypeService.ts +++ b/src/service/configuration/communicationTypeService.ts @@ -12,7 +12,7 @@ export default abstract class CommunicationTypeService { return await dataSource .getRepository(communicationType) .createQueryBuilder("communicationType") - .orderBy("type", "ASC") + .orderBy("communicationType.type", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/education.ts b/src/service/configuration/education.ts index b621db3..13a2e52 100644 --- a/src/service/configuration/education.ts +++ b/src/service/configuration/education.ts @@ -11,7 +11,7 @@ export default abstract class EducationService { return await dataSource .getRepository(education) .createQueryBuilder("education") - .orderBy("education", "ASC") + .orderBy("education.education", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/executivePositionService.ts b/src/service/configuration/executivePositionService.ts index 6a2bf8d..542093e 100644 --- a/src/service/configuration/executivePositionService.ts +++ b/src/service/configuration/executivePositionService.ts @@ -13,7 +13,7 @@ export default abstract class ExecutivePositionService { return await dataSource .getRepository(executivePosition) .createQueryBuilder("executivePosition") - .orderBy("position", "ASC") + .orderBy("executivePosition.position", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/membershipStatusService.ts b/src/service/configuration/membershipStatusService.ts index ade5a53..d8b5ded 100644 --- a/src/service/configuration/membershipStatusService.ts +++ b/src/service/configuration/membershipStatusService.ts @@ -13,7 +13,7 @@ export default abstract class MembershipStatusService { return await dataSource .getRepository(membershipStatus) .createQueryBuilder("membershipStatus") - .orderBy("status", "ASC") + .orderBy("membershipStatus.status", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/qualification.ts b/src/service/configuration/qualification.ts index 137bda2..367fe6a 100644 --- a/src/service/configuration/qualification.ts +++ b/src/service/configuration/qualification.ts @@ -14,7 +14,7 @@ export default abstract class QualificationService { return await dataSource .getRepository(qualification) .createQueryBuilder("qualification") - .orderBy("qualification", "ASC") + .orderBy("qualification.qualification", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/queryStoreService.ts b/src/service/configuration/queryStoreService.ts index ecce9cc..c2e969f 100644 --- a/src/service/configuration/queryStoreService.ts +++ b/src/service/configuration/queryStoreService.ts @@ -12,7 +12,7 @@ export default abstract class QueryStoreService { return await dataSource .getRepository(query) .createQueryBuilder("queryStore") - .orderBy("title", "ASC") + .orderBy("queryStore.title", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/salutationService.ts b/src/service/configuration/salutationService.ts index f8a020e..0e97cc1 100644 --- a/src/service/configuration/salutationService.ts +++ b/src/service/configuration/salutationService.ts @@ -12,7 +12,7 @@ export default abstract class SalutationService { return await dataSource .getRepository(salutation) .createQueryBuilder("salutation") - .orderBy("salutation", "ASC") + .orderBy("salutation.salutation", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/templateService.ts b/src/service/configuration/templateService.ts index dd3e008..fcc2eb6 100644 --- a/src/service/configuration/templateService.ts +++ b/src/service/configuration/templateService.ts @@ -13,7 +13,7 @@ export default abstract class TemplateService { return await dataSource .getRepository(template) .createQueryBuilder("template") - .orderBy("template", "ASC") + .orderBy("template.template", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/configuration/templateUsageService.ts b/src/service/configuration/templateUsageService.ts index ce6b508..99fe2dc 100644 --- a/src/service/configuration/templateUsageService.ts +++ b/src/service/configuration/templateUsageService.ts @@ -15,7 +15,7 @@ export default abstract class TemplateUsageService { .leftJoinAndSelect("templateUsage.header", "headerTemplate") .leftJoinAndSelect("templateUsage.body", "bodyTemplate") .leftJoinAndSelect("templateUsage.footer", "footerTemplate") - .orderBy("scope", "ASC") + .orderBy("templateUsage.scope", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/management/roleService.ts b/src/service/management/roleService.ts index c3a2dcd..4aa761b 100644 --- a/src/service/management/roleService.ts +++ b/src/service/management/roleService.ts @@ -13,7 +13,7 @@ export default abstract class RoleService { .getRepository(role) .createQueryBuilder("role") .leftJoinAndSelect("role.permissions", "role_permissions") - .orderBy("role", "ASC") + .orderBy("role.role", "ASC") .getMany() .then((res) => { return res; diff --git a/src/service/management/userService.ts b/src/service/management/userService.ts index d273315..dd877ee 100644 --- a/src/service/management/userService.ts +++ b/src/service/management/userService.ts @@ -16,8 +16,8 @@ export default abstract class UserService { .leftJoinAndSelect("user.roles", "roles") .leftJoinAndSelect("user.permissions", "permissions") .leftJoinAndSelect("roles.permissions", "role_permissions") - .orderBy("firstname", "ASC") - .addOrderBy("lastname", "ASC") + .orderBy("user.firstname", "ASC") + .addOrderBy("user.lastname", "ASC") .getMany() .then((res) => { return res;