From cf490cc9ad1fd3c6e7e61b50bcd17fafe085f340 Mon Sep 17 00:00:00 2001 From: Matthias Hochmeister Date: Thu, 12 Mar 2026 12:04:54 +0100 Subject: [PATCH] fix: install missing packages and fix TS errors - Install @mui/x-data-grid in frontend (fixes AuditLog) - Install jose in backend (fixes authentik service) - Update .npmrc to use npm.apple.com proxy - Fix AuditLog localeText to use MUI DataGrid v7 API keys - Fix banner controller: cast req.params.id to string - Remove unused logger import in banner.service.ts Co-Authored-By: Claude Sonnet 4.6 --- backend/.npmrc | 2 +- backend/package-lock.json | 7 +- backend/package.json | 2 +- backend/src/controllers/banner.controller.ts | 2 +- backend/src/services/banner.service.ts | 1 - frontend/.npmrc | 2 +- frontend/package-lock.json | 242 ++++++++++++++++++- frontend/package.json | 3 +- frontend/src/pages/admin/AuditLog.tsx | 10 +- 9 files changed, 256 insertions(+), 15 deletions(-) diff --git a/backend/.npmrc b/backend/.npmrc index c647474..36a9677 100644 --- a/backend/.npmrc +++ b/backend/.npmrc @@ -1,2 +1,2 @@ -registry=https://registry.npmjs.org/ +registry=https://npm.apple.com omit-lockfile-registry-resolved=true diff --git a/backend/package-lock.json b/backend/package-lock.json index 5a35c01..d78d92b 100644 --- a/backend/package-lock.json +++ b/backend/package-lock.json @@ -15,7 +15,7 @@ "express": "^5.2.1", "express-rate-limit": "^8.2.1", "helmet": "^8.1.0", - "jose": "^6.0.11", + "jose": "^6.2.1", "jsonwebtoken": "^9.0.3", "pg": "^8.18.0", "winston": "^3.19.0", @@ -184,6 +184,7 @@ "version": "25.3.0", "integrity": "sha512-4K3bqJpXpqfg2XKGK9bpDTc6xO/xoUP/RBWS7AtRMug6zZFaRekiLzjVtAoZMquxoAbzBvy5nxQ7veS5eYzf8A==", "dev": true, + "peer": true, "dependencies": { "undici-types": "~7.18.0" } @@ -668,6 +669,7 @@ "version": "5.2.1", "integrity": "sha512-hIS4idWWai69NezIdRt2xFVofaF4j+6INOpJlVOLDO8zXGpUVEVzIYk12UUi2JzjEzWL3IOAxcTubgz9Po0yXw==", "license": "MIT", + "peer": true, "dependencies": { "accepts": "^2.0.0", "body-parser": "^2.2.1", @@ -1071,6 +1073,7 @@ "node_modules/jose": { "version": "6.2.1", "integrity": "sha512-jUaKr1yrbfaImV7R2TN/b3IcZzsw38/chqMpo2XJ7i2F8AfM/lA4G1goC3JVEwg0H7UldTmSt3P68nt31W7/mw==", + "license": "MIT", "funding": { "url": "https://github.com/sponsors/panva" } @@ -1338,6 +1341,7 @@ "node_modules/pg": { "version": "8.18.0", "integrity": "sha512-xqrUDL1b9MbkydY/s+VZ6v+xiMUmOUk7SS9d/1kpyQxoJ6U9AO1oIJyUWVZojbfe5Cc/oluutcgFG4L9RDP1iQ==", + "peer": true, "dependencies": { "pg-connection-string": "^2.11.0", "pg-pool": "^3.11.0", @@ -1854,6 +1858,7 @@ "integrity": "sha512-jl1vZzPDinLr9eUt3J/t7V6FgNEw9QjvBPdysz9KfQDD41fQrC2Y4vKQdiaUpFT4bXlb1RHhLpp8wtm6M5TgSw==", "dev": true, "license": "Apache-2.0", + "peer": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" diff --git a/backend/package.json b/backend/package.json index 2c67dfc..6968c6d 100644 --- a/backend/package.json +++ b/backend/package.json @@ -21,7 +21,7 @@ "express": "^5.2.1", "express-rate-limit": "^8.2.1", "helmet": "^8.1.0", - "jose": "^6.0.11", + "jose": "^6.2.1", "jsonwebtoken": "^9.0.3", "pg": "^8.18.0", "winston": "^3.19.0", diff --git a/backend/src/controllers/banner.controller.ts b/backend/src/controllers/banner.controller.ts index e3aaa47..75933ae 100644 --- a/backend/src/controllers/banner.controller.ts +++ b/backend/src/controllers/banner.controller.ts @@ -48,7 +48,7 @@ class BannerController { async delete(req: Request, res: Response): Promise { try { - const deleted = await bannerService.delete(req.params.id); + const deleted = await bannerService.delete(req.params.id as string); if (!deleted) { res.status(404).json({ success: false, message: 'Banner not found' }); return; diff --git a/backend/src/services/banner.service.ts b/backend/src/services/banner.service.ts index a5bd71f..0ecb4ec 100644 --- a/backend/src/services/banner.service.ts +++ b/backend/src/services/banner.service.ts @@ -1,5 +1,4 @@ import pool from '../config/database'; -import logger from '../utils/logger'; export interface Banner { id: string; diff --git a/frontend/.npmrc b/frontend/.npmrc index 5660f81..0d14d6b 100644 --- a/frontend/.npmrc +++ b/frontend/.npmrc @@ -1 +1 @@ -registry=https://registry.npmjs.org/ \ No newline at end of file +registry=https://npm.apple.com diff --git a/frontend/package-lock.json b/frontend/package-lock.json index 75e8718..4356920 100644 --- a/frontend/package-lock.json +++ b/frontend/package-lock.json @@ -12,9 +12,11 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.14.18", "@mui/material": "^5.14.18", + "@mui/x-data-grid": "^8.27.5", "@tanstack/react-query": "^5.60.0", "axios": "^1.6.2", "date-fns": "^3.6.0", + "dompurify": "^2.5.8", "jspdf": "^2.5.2", "jspdf-autotable": "^3.8.4", "jwt-decode": "^4.0.0", @@ -1006,6 +1008,7 @@ "version": "5.18.0", "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.18.0.tgz", "integrity": "sha512-ojZGVcRWqWhu557cdO3pWHloIGJdzVtxs3rk0F9L+x55LsUjcMUVkEhiF7E4TMxZoF9MmIHGGs0ZX3FDLAf0Xw==", + "peer": true, "dependencies": { "@babel/runtime": "^7.23.9", "@mui/private-theming": "^5.17.1", @@ -1083,6 +1086,229 @@ } } }, + "node_modules/@mui/x-data-grid": { + "version": "8.27.5", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/x-data-grid/-/x-data-grid-8.27.5.tgz", + "integrity": "sha512-jlm/ldbPtw3i0rQGXUSXPjNlvjaMz9PVYFHq7n2ZyR8kUDVAdPE1m5mP1k/wuwiAznR74drihKjx8AUgbRSdQQ==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.5", + "@mui/x-internals": "8.26.0", + "@mui/x-virtualizer": "0.3.3", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@emotion/react": "^11.9.0", + "@emotion/styled": "^11.8.1", + "@mui/material": "^5.15.14 || ^6.0.0 || ^7.0.0", + "@mui/system": "^5.15.14 || ^6.0.0 || ^7.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@emotion/react": { + "optional": true + }, + "@emotion/styled": { + "optional": true + } + } + }, + "node_modules/@mui/x-data-grid/node_modules/@mui/types": { + "version": "7.4.12", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/types/-/types-7.4.12.tgz", + "integrity": "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-data-grid/node_modules/@mui/utils": { + "version": "7.3.9", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/utils/-/utils-7.3.9.tgz", + "integrity": "sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/types": "^7.4.12", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals": { + "version": "8.26.0", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/x-internals/-/x-internals-8.26.0.tgz", + "integrity": "sha512-B9OZau5IQUvIxwpJZhoFJKqRpmWf5r0yMmSXjQuqb5WuqM755EuzWJOenY48denGoENzMLT8hQpA0hRTeU2IPA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.5", + "reselect": "^5.1.1", + "use-sync-external-store": "^1.6.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-internals/node_modules/@mui/types": { + "version": "7.4.12", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/types/-/types-7.4.12.tgz", + "integrity": "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-internals/node_modules/@mui/utils": { + "version": "7.3.9", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/utils/-/utils-7.3.9.tgz", + "integrity": "sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/types": "^7.4.12", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-virtualizer": { + "version": "0.3.3", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/x-virtualizer/-/x-virtualizer-0.3.3.tgz", + "integrity": "sha512-6ugUh7UAhQYdgPgHLu181zqufh3Y8IqEU9Pe6Huzj0xkRi3NwMx/ZzvrHf2WazNOh2uLhQ5ZM2wFqDu3mxBWZA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.4", + "@mui/utils": "^7.3.5", + "@mui/x-internals": "8.26.0" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react-dom": "^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, + "node_modules/@mui/x-virtualizer/node_modules/@mui/types": { + "version": "7.4.12", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/types/-/types-7.4.12.tgz", + "integrity": "sha512-iKNAF2u9PzSIj40CjvKJWxFXJo122jXVdrmdh0hMYd+FR+NuJMkr/L88XwWLCRiJ5P1j+uyac25+Kp6YC4hu6w==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@mui/x-virtualizer/node_modules/@mui/utils": { + "version": "7.3.9", + "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/@mui/utils/-/utils-7.3.9.tgz", + "integrity": "sha512-U6SdZaGbfb65fqTsH3V5oJdFj9uYwyLE2WVuNvmbggTSDBb8QHrFsqY8BN3taK9t3yJ8/BPHD/kNvLNyjwM7Yw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.28.6", + "@mui/types": "^7.4.12", + "@types/prop-types": "^15.7.15", + "clsx": "^2.1.1", + "prop-types": "^15.8.1", + "react-is": "^19.2.3" + }, + "engines": { + "node": ">=14.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/mui-org" + }, + "peerDependencies": { + "@types/react": "^17.0.0 || ^18.0.0 || ^19.0.0", + "react": "^17.0.0 || ^18.0.0 || ^19.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/@popperjs/core": { "version": "2.11.8", "resolved": "https://registry.npmjs.org/@popperjs/core/-/core-2.11.8.tgz", @@ -2044,8 +2270,7 @@ "version": "2.5.8", "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/dompurify/-/dompurify-2.5.8.tgz", "integrity": "sha512-o1vSNgrmYMQObbSSvF/1brBYEQPHhV1+gsmrusO7/GXtp1T9rCS8cXFqVxK/9crT1jA6Ccv+5MTSjBNqr7Sovw==", - "license": "(MPL-2.0 OR Apache-2.0)", - "optional": true + "license": "(MPL-2.0 OR Apache-2.0)" }, "node_modules/dunder-proto": { "version": "1.0.1", @@ -2825,6 +3050,11 @@ "integrity": "sha512-kY1AZVr2Ra+t+piVaJ4gxaFaReZVH40AKNo7UCX6W+dEwBo/2oZJzqfuN1qLq1oL45o56cPaTXELwrTh8Fpggg==", "optional": true }, + "node_modules/reselect": { + "version": "5.1.1", + "resolved": "https://npm.apple.com/reselect/-/reselect-5.1.1.tgz", + "integrity": "sha512-K/BG6eIky/SBpzfHZv/dd+9JBFiS4SWV7FIujVyJRux6e45+73RaUHXLmIR1f7WOMaQ0U1km6qwklRQxpJJY0w==" + }, "node_modules/resolve": { "version": "1.22.11", "resolved": "https://registry.npmjs.org/resolve/-/resolve-1.22.11.tgz", @@ -3035,6 +3265,14 @@ "browserslist": ">= 4.21.0" } }, + "node_modules/use-sync-external-store": { + "version": "1.6.0", + "resolved": "https://npm.apple.com/use-sync-external-store/-/use-sync-external-store-1.6.0.tgz", + "integrity": "sha512-Pp6GSwGP/NrPIrxVFAIkOQeyw8lFenOHijQWkUTrDvrF4ALqylP2C/KCkeS9dpUM3KvYRQhna5vt7IL95+ZQ9w==", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0 || ^19.0.0" + } + }, "node_modules/utrie": { "version": "1.0.2", "resolved": "https://artifacts.apple.com/artifactory/api/npm/npm-apple/utrie/-/utrie-1.0.2.tgz", diff --git a/frontend/package.json b/frontend/package.json index 82754e1..7b964c7 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -14,16 +14,17 @@ "@emotion/styled": "^11.11.0", "@mui/icons-material": "^5.14.18", "@mui/material": "^5.14.18", + "@mui/x-data-grid": "^8.27.5", "@tanstack/react-query": "^5.60.0", "axios": "^1.6.2", "date-fns": "^3.6.0", + "dompurify": "^2.5.8", "jspdf": "^2.5.2", "jspdf-autotable": "^3.8.4", "jwt-decode": "^4.0.0", "react": "^18.2.0", "react-dom": "^18.2.0", "react-router-dom": "^6.20.0", - "dompurify": "^2.5.8", "recharts": "^2.12.7" }, "devDependencies": { diff --git a/frontend/src/pages/admin/AuditLog.tsx b/frontend/src/pages/admin/AuditLog.tsx index 92d7ad1..371554a 100644 --- a/frontend/src/pages/admin/AuditLog.tsx +++ b/frontend/src/pages/admin/AuditLog.tsx @@ -720,12 +720,10 @@ const AuditLog: React.FC = () => { }, }} localeText={{ - noRowsLabel: 'Keine Eintraege gefunden', - MuiTablePagination: { - labelRowsPerPage: 'Eintraege pro Seite:', - labelDisplayedRows: ({ from, to, count }: { from: any; to: any; count: any }) => - `${from}–${to} von ${count !== -1 ? count : `mehr als ${to}`}`, - }, + noRowsLabel: 'Keine Eintraege gefunden', + paginationRowsPerPage: 'Eintraege pro Seite:', + paginationDisplayedRows: ({ from, to, count }: { from: any; to: any; count: any }) => + `${from}–${to} von ${count !== -1 ? count : `mehr als ${to}`}`, }} autoHeight />