From e25ffdb02a5ab942c7894562a4cc0a37fb5d8bd7 Mon Sep 17 00:00:00 2001 From: Janis Blatsios Date: Tue, 25 Jun 2024 22:33:17 +0200 Subject: [PATCH] =?UTF-8?q?podbitka=20angulara=20dodanie=20Auditingu=20do?= =?UTF-8?q?=20encji=20i=20wydzielenie=20wsp=C3=B3lnych=20rzeczy=20do=20Bas?= =?UTF-8?q?eEntity=20maile=20s=C4=85=20wysy=C5=82ane=20@Async?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/main/frontend/package-lock.json | 494 ++++++------------ src/main/frontend/package.json | 28 +- src/main/java/pl/janis/komornik/Komornik.java | 4 + .../janis/komornik/entities/BaseEntity.java | 33 ++ .../pl/janis/komornik/entities/Category.java | 21 +- .../java/pl/janis/komornik/entities/Debt.java | 15 +- .../pl/janis/komornik/entities/Expense.java | 15 +- .../pl/janis/komornik/entities/Group.java | 17 +- .../java/pl/janis/komornik/entities/User.java | 34 +- .../janis/komornik/service/EmailService.java | 3 + 10 files changed, 240 insertions(+), 424 deletions(-) create mode 100644 src/main/java/pl/janis/komornik/entities/BaseEntity.java diff --git a/src/main/frontend/package-lock.json b/src/main/frontend/package-lock.json index b4510df..91a644b 100644 --- a/src/main/frontend/package-lock.json +++ b/src/main/frontend/package-lock.json @@ -8,17 +8,17 @@ "name": "frontend", "version": "0.0.0", "dependencies": { - "@angular/animations": "^18.0.3", - "@angular/cdk": "^18.0.3", - "@angular/common": "^18.0.3", - "@angular/compiler": "^18.0.3", - "@angular/core": "^18.0.3", - "@angular/forms": "^18.0.3", - "@angular/material": "^18.0.3", - "@angular/platform-browser": "^18.0.3", - "@angular/platform-browser-dynamic": "^18.0.3", - "@angular/router": "^18.0.3", - "@angular/service-worker": "^18.0.3", + "@angular/animations": "^18.0.4", + "@angular/cdk": "^18.0.4", + "@angular/common": "^18.0.4", + "@angular/compiler": "^18.0.4", + "@angular/core": "^18.0.4", + "@angular/forms": "^18.0.4", + "@angular/material": "^18.0.4", + "@angular/platform-browser": "^18.0.4", + "@angular/platform-browser-dynamic": "^18.0.4", + "@angular/router": "^18.0.4", + "@angular/service-worker": "^18.0.4", "@fortawesome/fontawesome-free": "5.15.4", "@material/density": "^15.0.0-canary.a246a4439.0", "bootstrap": "^5.0.2", @@ -28,9 +28,9 @@ "zone.js": "~0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.0.4", - "@angular/cli": "~18.0.4", - "@angular/compiler-cli": "^18.0.3", + "@angular-devkit/build-angular": "^18.0.5", + "@angular/cli": "~18.0.5", + "@angular/compiler-cli": "^18.0.4", "@types/jasmine": "~4.3.0", "jasmine-core": "~4.5.0", "karma": "~6.4.0", @@ -55,12 +55,12 @@ } }, "node_modules/@angular-devkit/architect": { - "version": "0.1800.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.4.tgz", - "integrity": "sha512-82TKhYnSO8aGIBo5TxPtyUQnZFcbV+qB2bIIYOAKsJgxAVxLeFD6QA6gTmHOZPXw5pBEPUO/+PUwq+Uk5xesgw==", + "version": "0.1800.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/architect/-/architect-0.1800.5.tgz", + "integrity": "sha512-KliFJTqwAIyRvW10JnJLlpXK86yx683unTgwgvkg9V4gUc/7cNCmWJiOCmYh1+gATpFq+3d3o36EdTzb4QS03g==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.4", + "@angular-devkit/core": "18.0.5", "rxjs": "7.8.1" }, "engines": { @@ -70,16 +70,16 @@ } }, "node_modules/@angular-devkit/build-angular": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.0.4.tgz", - "integrity": "sha512-lFu1NDEUPIUxY+CmZJ3JspqVZDesrvdae5RbqQXCl87RfSy+ZDIa7rOtQxyBQtt2BuQIB9pWQSzCMii5kTHd6w==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-angular/-/build-angular-18.0.5.tgz", + "integrity": "sha512-itZN5tAZ+66bHZ4JNxIiPxfbSvQP6Gk4hcCzfGzcs3G0VsahR0rpX0Rg+1CRX1bpDzan3z8AVfwIxlLPKSOBbg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.4", - "@angular-devkit/build-webpack": "0.1800.4", - "@angular-devkit/core": "18.0.4", - "@angular/build": "18.0.4", + "@angular-devkit/architect": "0.1800.5", + "@angular-devkit/build-webpack": "0.1800.5", + "@angular-devkit/core": "18.0.5", + "@angular/build": "18.0.5", "@babel/core": "7.24.5", "@babel/generator": "7.24.5", "@babel/helper-annotate-as-pure": "7.22.5", @@ -90,12 +90,11 @@ "@babel/preset-env": "7.24.5", "@babel/runtime": "7.24.5", "@discoveryjs/json-ext": "0.5.7", - "@ngtools/webpack": "18.0.4", + "@ngtools/webpack": "18.0.5", "@vitejs/plugin-basic-ssl": "1.1.0", "ansi-colors": "4.1.3", "autoprefixer": "10.4.19", "babel-loader": "9.1.3", - "babel-plugin-istanbul": "6.1.1", "browserslist": "^4.21.5", "copy-webpack-plugin": "11.0.0", "critters": "0.0.22", @@ -105,6 +104,7 @@ "http-proxy-middleware": "3.0.0", "https-proxy-agent": "7.0.4", "inquirer": "9.2.22", + "istanbul-lib-instrument": "6.0.2", "jsonc-parser": "3.2.1", "karma-source-map-support": "1.4.0", "less": "4.2.0", @@ -244,6 +244,22 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "dev": true }, + "node_modules/@angular-devkit/build-angular/node_modules/istanbul-lib-instrument": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/istanbul-lib-instrument/-/istanbul-lib-instrument-6.0.2.tgz", + "integrity": "sha512-1WUsZ9R1lA0HtBSohTkm39WTPlNKSJ5iFk7UwqXkBLoHQT+hfqPsfsTDVuZdKGaBwn7din9bS7SsnoAr943hvw==", + "dev": true, + "dependencies": { + "@babel/core": "^7.23.9", + "@babel/parser": "^7.23.9", + "@istanbuljs/schema": "^0.1.3", + "istanbul-lib-coverage": "^3.2.0", + "semver": "^7.5.4" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/@angular-devkit/build-angular/node_modules/semver": { "version": "7.6.2", "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", @@ -257,12 +273,12 @@ } }, "node_modules/@angular-devkit/build-webpack": { - "version": "0.1800.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1800.4.tgz", - "integrity": "sha512-EtWyWH3Hb7Rh8u0Jb4cWJKRxlqiUo4qhHKjU+62E8XplWlajbuld3ltL50a3t8lkZQYYgl7nPt53E5kM/zFVrw==", + "version": "0.1800.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/build-webpack/-/build-webpack-0.1800.5.tgz", + "integrity": "sha512-/eiIwlQJBZlCWLsfaoSOsSGFY24cLKCCY4fs/fvcBXxG5/g1FFx24Zt73j0qRoNeK3soUg9+lmCAiRvO6cGpJg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1800.4", + "@angular-devkit/architect": "0.1800.5", "rxjs": "7.8.1" }, "engines": { @@ -276,9 +292,9 @@ } }, "node_modules/@angular-devkit/core": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.4.tgz", - "integrity": "sha512-8vYvJ5FF2NjFUia00hv8KWakOjOZ+09PbnNqd+lntJBekIg1lHDOF/vNMlVHtU5LiE1aNi9P/69/VXTckPfU9g==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/core/-/core-18.0.5.tgz", + "integrity": "sha512-sGtrS0SqkcBvyuv0QkIfyadwPgDhMroz1r51lMh1hwzJaJ0LNuVMLviEeYIybeBnvAdp9YvYC8I1WgB/FUEFBw==", "dev": true, "dependencies": { "ajv": "8.13.0", @@ -320,12 +336,12 @@ } }, "node_modules/@angular-devkit/schematics": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.4.tgz", - "integrity": "sha512-hCHmuu/Z1teOQPx1AMJa/gcK6depk+XgU5dIpEvflC+ApW3hglNe2QKaqajDZ+34s+PKAVWa86M8IOV7o/mHuA==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular-devkit/schematics/-/schematics-18.0.5.tgz", + "integrity": "sha512-hZwAq3hwuJzCuh7uqO/7T9IMERhYVxz+ganJlEykpyr58o0IjUM1Q4ZSH5UOYlGRPdBCZJbfiafZ0Sg5w5xBww==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.4", + "@angular-devkit/core": "18.0.5", "jsonc-parser": "3.2.1", "magic-string": "0.30.10", "ora": "5.4.1", @@ -338,9 +354,9 @@ } }, "node_modules/@angular/animations": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.3.tgz", - "integrity": "sha512-Wlll6y7euIXYsOHpTh0hvVTBs7lVnbKDHiyd4Dz7kAMSeE2zyQo6OcRN+FFH3GH9BUi5UooAICNX8dJDfps6Mw==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/animations/-/animations-18.0.4.tgz", + "integrity": "sha512-xbdtBUvpTGEmVQkCoOad26LBMRy9ddM9pvCidMZBWXiM7NEuc3dfVT99a1cU4MZFiJeiQEvOWQn03iXskbBMGQ==", "dependencies": { "tslib": "^2.3.0" }, @@ -348,17 +364,17 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.3" + "@angular/core": "18.0.4" } }, "node_modules/@angular/build": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.4.tgz", - "integrity": "sha512-70HQQnbCOXFT5F3ROyWNNfS9A63Fzts5ANJKJY1MJLrn+dgNEG7jdIWjTtvohL3RZz97rlzSq3qRZnfxqf1lsQ==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/build/-/build-18.0.5.tgz", + "integrity": "sha512-6C+azPDYqPWX9/+53OTyvzmAKxrGwgQcDnueC/Sc6NZJOAs2VsOIn5ULPtcRDlrf/Rbo0dGM4OvKCM2q1BRuBg==", "dev": true, "dependencies": { "@ampproject/remapping": "2.3.0", - "@angular-devkit/architect": "0.1800.4", + "@angular-devkit/architect": "0.1800.5", "@babel/core": "7.24.5", "@babel/helper-annotate-as-pure": "7.22.5", "@babel/helper-split-export-declaration": "7.24.5", @@ -477,9 +493,9 @@ } }, "node_modules/@angular/cdk": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.0.3.tgz", - "integrity": "sha512-F6kXAoIWUbvhvbSGnMxrKJZsI7rhGKDXVFFf9m+ZQAbqboSyDbbszux7Em4CEh27LaXYNFltUcKdCQ3hdp7Kig==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/cdk/-/cdk-18.0.4.tgz", + "integrity": "sha512-OCG1EGv/nyZYGcSu7y6IAuarC5gZcZYhhvEQsgMUDrf1TGRSa+0dBN5W2HxRWKs6NsGgDjW1VcK+AC85PYLXPA==", "dependencies": { "tslib": "^2.3.0" }, @@ -493,15 +509,15 @@ } }, "node_modules/@angular/cli": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.4.tgz", - "integrity": "sha512-i7DLVIc4HN0CFZZKbEeVeQSADRG1Dt2CwXh/wTUzglRLu/tE7Q+WMrqJ2+lGTT2edZp2KKysM4Gxp+ATAzP8AQ==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@angular/cli/-/cli-18.0.5.tgz", + "integrity": "sha512-w3NOdj6T7QhBmFleavc+AEhcAMyPkt7RsyWW2saufD6x55gzynGQZb9UBZwKDUAR6UtqchBX/HEBWCLNnjbiHg==", "dev": true, "dependencies": { - "@angular-devkit/architect": "0.1800.4", - "@angular-devkit/core": "18.0.4", - "@angular-devkit/schematics": "18.0.4", - "@schematics/angular": "18.0.4", + "@angular-devkit/architect": "0.1800.5", + "@angular-devkit/core": "18.0.5", + "@angular-devkit/schematics": "18.0.5", + "@schematics/angular": "18.0.5", "@yarnpkg/lockfile": "1.1.0", "ansi-colors": "4.1.3", "ini": "4.1.2", @@ -538,9 +554,9 @@ } }, "node_modules/@angular/common": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.3.tgz", - "integrity": "sha512-lmT9QbWHduqzpsB0osQFHeSwvQB1iUeNwTVUyMtcs6i46l4qOPtAt2/9DvHUWEUp01EBDxyi385ZI3vD+FHH/w==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/common/-/common-18.0.4.tgz", + "integrity": "sha512-7WxZKLzSu5QtyLGrtlZrtUQlP3WfDR++yHr5jF9DJZ3IY35UutwiPCegCcq4Qh5X2xWqnRKGm20TLlKVoj0t5Q==", "dependencies": { "tslib": "^2.3.0" }, @@ -548,14 +564,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.3", + "@angular/core": "18.0.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/compiler": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.3.tgz", - "integrity": "sha512-wrXxgBsZX4yTrj/oZ8PDGmvhqj9S2TZfcuivaUitprNC2uBWTVb1UcOS45Qw9YlLB0sYa2AmBudICDqYpb8lfw==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler/-/compiler-18.0.4.tgz", + "integrity": "sha512-OVPXtJo5SkGQUCioCVxKcRfEw48tz8xCtJGDXjVKWtyOkXnmWl8Y/e54mteiJd1KybXHvPLW0LPtWZYB06Qy7g==", "dependencies": { "tslib": "^2.3.0" }, @@ -563,7 +579,7 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/core": "18.0.3" + "@angular/core": "18.0.4" }, "peerDependenciesMeta": { "@angular/core": { @@ -572,9 +588,9 @@ } }, "node_modules/@angular/compiler-cli": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.3.tgz", - "integrity": "sha512-mxwQEeP94YBM6C9A2YfkV7ug1sHgh0fU/TSBpQcm5ni4cZiVPu6q/+Ft7hyFTKe2p3tKQme33+xVjsWhtOCx0A==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/compiler-cli/-/compiler-cli-18.0.4.tgz", + "integrity": "sha512-pUv664JCZHKHsLDvO8iNjWXVHOB2ggKxVoxiowOMNpR4dqxrK/oOLGkPGltYUW/xF6Eajc7Zs0lK/R5uljoYQg==", "dev": true, "dependencies": { "@babel/core": "7.24.7", @@ -595,14 +611,14 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/compiler": "18.0.3", + "@angular/compiler": "18.0.4", "typescript": ">=5.4 <5.5" } }, "node_modules/@angular/core": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.3.tgz", - "integrity": "sha512-376hijhEqNpeA+qKncpVTIaZXRdBT6RctEBnFhJ2l57aHPH5S3oaSBQu1k3TEi07FlKOD4XF1+NzX9dvdup1eg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/core/-/core-18.0.4.tgz", + "integrity": "sha512-k0AUZbJc0eyzRexvKlR1sR0qNhe54Om9ln6lRn7y1+gAsg+OwFDyF427fFuzqpZVe/MmpvX3CXWdl0twZAYEiA==", "dependencies": { "tslib": "^2.3.0" }, @@ -615,9 +631,9 @@ } }, "node_modules/@angular/forms": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.3.tgz", - "integrity": "sha512-+CjDiooUi5FkTP3YQmdO8YRbjZicgLGZonvCdz3mSucLrTY6w3oBocNs6+Kc7fLuO1NKSkFmAfYApBwK3fKBMg==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/forms/-/forms-18.0.4.tgz", + "integrity": "sha512-LM2rVIuJa2fGxP0oCy0uFSGY6h9tyL64gtGp02QqKaVszG4oJ8wue0/VSbBtKyH0xEN4eOXDzOXbiahbtFhRZA==", "dependencies": { "tslib": "^2.3.0" }, @@ -625,16 +641,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3", + "@angular/common": "18.0.4", + "@angular/core": "18.0.4", + "@angular/platform-browser": "18.0.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/material": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.0.3.tgz", - "integrity": "sha512-VIlK+0CxreAkDmr05TKelTr11I7yUtGPwRTFaWfQtXNkYEwGE1iuZGz3Iz8otxvHsTLC74Er4vMSYndwJvMyjQ==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/material/-/material-18.0.4.tgz", + "integrity": "sha512-ES4peq3+tMEPKe9RgdQ3pp3CcjM0Cr+vi4f+0ruH2wu1NTBk522/1/ABHncg3A/eCurKS96JJdihqOAjMek4Ow==", "dependencies": { "@material/animation": "15.0.0-canary.7f224ddd4.0", "@material/auto-init": "15.0.0-canary.7f224ddd4.0", @@ -688,7 +704,7 @@ }, "peerDependencies": { "@angular/animations": "^18.0.0 || ^19.0.0", - "@angular/cdk": "18.0.3", + "@angular/cdk": "18.0.4", "@angular/common": "^18.0.0 || ^19.0.0", "@angular/core": "^18.0.0 || ^19.0.0", "@angular/forms": "^18.0.0 || ^19.0.0", @@ -705,9 +721,9 @@ } }, "node_modules/@angular/platform-browser": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.3.tgz", - "integrity": "sha512-1fl/oJOca8BLxLxN0EjwxQZ3xzn3PCCN96ytM54bjdEMiELz+0AcQe5GNKcVjXlwMkibRLl1BP5GIdvnQYqJRA==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser/-/platform-browser-18.0.4.tgz", + "integrity": "sha512-8TJEPzIRV89s1ZP9T+7g9K7PFNfec+4Xyw5BLaTRBOqjXHmMzk+miRx0L18Lr66rp5r2vbNEE9vojMVHQRwhVA==", "dependencies": { "tslib": "^2.3.0" }, @@ -715,9 +731,9 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/animations": "18.0.3", - "@angular/common": "18.0.3", - "@angular/core": "18.0.3" + "@angular/animations": "18.0.4", + "@angular/common": "18.0.4", + "@angular/core": "18.0.4" }, "peerDependenciesMeta": { "@angular/animations": { @@ -726,9 +742,9 @@ } }, "node_modules/@angular/platform-browser-dynamic": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.0.3.tgz", - "integrity": "sha512-+kHMn7P552YKk1gkVQNO1QXzHVaIeFiVa1rV1MNvX4DvumKT3puknx1SzcmtxZTX+9ee22OuPuyLNSAKREDAQQ==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/platform-browser-dynamic/-/platform-browser-dynamic-18.0.4.tgz", + "integrity": "sha512-K36/gamqs8etGlmWew7IwZ/bDJdI5ZeUqvOUmkKjJ9F2I/g5P/zZrB1qExwN/zsxzxd9idkvEhwY+YDeiZEEJg==", "dependencies": { "tslib": "^2.3.0" }, @@ -736,16 +752,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/compiler": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3" + "@angular/common": "18.0.4", + "@angular/compiler": "18.0.4", + "@angular/core": "18.0.4", + "@angular/platform-browser": "18.0.4" } }, "node_modules/@angular/router": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.3.tgz", - "integrity": "sha512-/cglLev0USxUNMc4M+EBFGrqw1EpKq87LUJL3+0Ztr012sVSeOU38ad41fs6pPcMBePBDZIw7KmSXypvUJJFMA==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/router/-/router-18.0.4.tgz", + "integrity": "sha512-nr1ZI3lynKBtr3a75APuVkIaiXRG5mEnW/RIyxwzxbKBB14901mby46o0jm9Y/CPb2rH5UpuwZhTKRE6QS/xLw==", "dependencies": { "tslib": "^2.3.0" }, @@ -753,16 +769,16 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/core": "18.0.3", - "@angular/platform-browser": "18.0.3", + "@angular/common": "18.0.4", + "@angular/core": "18.0.4", + "@angular/platform-browser": "18.0.4", "rxjs": "^6.5.3 || ^7.4.0" } }, "node_modules/@angular/service-worker": { - "version": "18.0.3", - "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.0.3.tgz", - "integrity": "sha512-/8BXh8VxkIAmdl6ftBUh2may6GRGANesvQor9yqH0ddCUpYeIafqqbwIMgHqxe4PJ3ApSkO2zcnXgoUZHL0a/A==", + "version": "18.0.4", + "resolved": "https://registry.npmjs.org/@angular/service-worker/-/service-worker-18.0.4.tgz", + "integrity": "sha512-0KaQLoJRIZTCjmZfmB+0PynIre8uHuIl+bq6ojZLpzSHgVF1I3xKdPuKZf0X6C5snows+uWS22BBU997erI8YA==", "dependencies": { "tslib": "^2.3.0" }, @@ -773,8 +789,8 @@ "node": "^18.19.1 || ^20.11.1 || >=22.0.0" }, "peerDependencies": { - "@angular/common": "18.0.3", - "@angular/core": "18.0.3" + "@angular/common": "18.0.4", + "@angular/core": "18.0.4" } }, "node_modules/@babel/code-frame": { @@ -3170,22 +3186,6 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, - "node_modules/@istanbuljs/load-nyc-config": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/@istanbuljs/load-nyc-config/-/load-nyc-config-1.1.0.tgz", - "integrity": "sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==", - "dev": true, - "dependencies": { - "camelcase": "^5.3.1", - "find-up": "^4.1.0", - "get-package-type": "^0.1.0", - "js-yaml": "^3.13.1", - "resolve-from": "^5.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/@istanbuljs/schema": { "version": "0.1.3", "resolved": "https://registry.npmjs.org/@istanbuljs/schema/-/schema-0.1.3.tgz", @@ -3292,9 +3292,9 @@ } }, "node_modules/@jsonjoy.com/util": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.1.3.tgz", - "integrity": "sha512-g//kkF4kOwUjemValCtOc/xiYzmwMRmWq3Bn+YnzOzuZLHq2PpMOxxIayN3cKbo7Ko2Np65t6D9H81IvXbXhqg==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/@jsonjoy.com/util/-/util-1.2.0.tgz", + "integrity": "sha512-4B8B+3vFsY4eo33DMKyJPlQ3sBMpPFUZK2dr3O3rXrOGKKbYG44J0XSFkDo1VOQiri5HFEhIeVvItjR2xcazmg==", "dev": true, "engines": { "node": ">=10.0" @@ -4322,9 +4322,9 @@ ] }, "node_modules/@ngtools/webpack": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.0.4.tgz", - "integrity": "sha512-eWQkAuHEnLme01Ey4Z0FoG6upJHYhnJfsCTBnyEB2LTfdyBUk+PC0gwPXInK8oltWjFfiMnCwxrUQvQsvPW7Hg==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@ngtools/webpack/-/webpack-18.0.5.tgz", + "integrity": "sha512-Dx386WZZn0RwUaBHQYhDW8oi254SxEu8Ty5LHnStqBP6xXdcnsdGel+h9qvJ67He9iu8Rj0PB64EFE4PiklMdQ==", "dev": true, "engines": { "node": "^18.19.1 || ^20.11.1 || >=22.0.0", @@ -4874,13 +4874,13 @@ ] }, "node_modules/@schematics/angular": { - "version": "18.0.4", - "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.4.tgz", - "integrity": "sha512-fN4whuym9ZmcQFdTfwLZr4j+NcZ4LzbdLk8XYrYdxt1z8c9ujs5LqJYn0LYc3UWiYl7z2RVc9NOxzNrkiXdwlw==", + "version": "18.0.5", + "resolved": "https://registry.npmjs.org/@schematics/angular/-/angular-18.0.5.tgz", + "integrity": "sha512-dV50GIEGl6S5wE6xtAhmHWdLhsOlnNUpAx/v3BPR2AOr90zJvIM03TqAQTzAlnPatxK2WLelRgqVMbPfAVvLAg==", "dev": true, "dependencies": { - "@angular-devkit/core": "18.0.4", - "@angular-devkit/schematics": "18.0.4", + "@angular-devkit/core": "18.0.5", + "@angular-devkit/schematics": "18.0.5", "jsonc-parser": "3.2.1" }, "engines": { @@ -5107,9 +5107,9 @@ } }, "node_modules/@types/express-serve-static-core": { - "version": "4.19.3", - "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.3.tgz", - "integrity": "sha512-KOzM7MhcBFlmnlr/fzISFF5vGWVSvN6fTd4T+ExOt08bA/dA5kpSzY52nMsI1KDFmUREpJelPYyuslLRSjjgCg==", + "version": "4.19.5", + "resolved": "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.19.5.tgz", + "integrity": "sha512-y6W03tvrACO72aijJ5uF02FRq5cgDR9lUxddQ8vyF+GvmjJQqbzDcJngEjURc+ZsG31VI3hODNZJ2URj86pzmg==", "dev": true, "dependencies": { "@types/node": "*", @@ -5633,15 +5633,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/argparse": { - "version": "1.0.10", - "resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz", - "integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==", - "dev": true, - "dependencies": { - "sprintf-js": "~1.0.2" - } - }, "node_modules/array-flatten": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", @@ -5702,22 +5693,6 @@ "webpack": ">=5" } }, - "node_modules/babel-plugin-istanbul": { - "version": "6.1.1", - "resolved": "https://registry.npmjs.org/babel-plugin-istanbul/-/babel-plugin-istanbul-6.1.1.tgz", - "integrity": "sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==", - "dev": true, - "dependencies": { - "@babel/helper-plugin-utils": "^7.0.0", - "@istanbuljs/load-nyc-config": "^1.0.0", - "@istanbuljs/schema": "^0.1.2", - "istanbul-lib-instrument": "^5.0.4", - "test-exclude": "^6.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/babel-plugin-polyfill-corejs2": { "version": "0.4.11", "resolved": "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.11.tgz", @@ -6135,15 +6110,6 @@ "node": ">=6" } }, - "node_modules/camelcase": { - "version": "5.3.1", - "resolved": "https://registry.npmjs.org/camelcase/-/camelcase-5.3.1.tgz", - "integrity": "sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==", - "dev": true, - "engines": { - "node": ">=6" - } - }, "node_modules/caniuse-lite": { "version": "1.0.30001600", "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001600.tgz", @@ -7336,19 +7302,6 @@ "node": ">=8.0.0" } }, - "node_modules/esprima": { - "version": "4.0.1", - "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", - "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", - "dev": true, - "bin": { - "esparse": "bin/esparse.js", - "esvalidate": "bin/esvalidate.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -7661,19 +7614,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/find-up": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", - "integrity": "sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==", - "dev": true, - "dependencies": { - "locate-path": "^5.0.0", - "path-exists": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/flat": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/flat/-/flat-5.0.2.tgz", @@ -7846,15 +7786,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/get-package-type": { - "version": "0.1.0", - "resolved": "https://registry.npmjs.org/get-package-type/-/get-package-type-0.1.0.tgz", - "integrity": "sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==", - "dev": true, - "engines": { - "node": ">=8.0.0" - } - }, "node_modules/get-stream": { "version": "6.0.1", "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz", @@ -8882,19 +8813,6 @@ "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", "dev": true }, - "node_modules/js-yaml": { - "version": "3.14.1", - "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.14.1.tgz", - "integrity": "sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==", - "dev": true, - "dependencies": { - "argparse": "^1.0.7", - "esprima": "^4.0.0" - }, - "bin": { - "js-yaml": "bin/js-yaml.js" - } - }, "node_modules/jsbn": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", @@ -9250,9 +9168,9 @@ } }, "node_modules/launch-editor": { - "version": "2.6.1", - "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.6.1.tgz", - "integrity": "sha512-eB/uXmFVpY4zezmGp5XtU21kwo7GBbKB+EQ+UZeWtGb9yAM5xt/Evk+lYH3eRNAtId+ej4u7TYPFZ07w4s7rRw==", + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/launch-editor/-/launch-editor-2.8.0.tgz", + "integrity": "sha512-vJranOAJrI/llyWGRQqiDM+adrw+k83fvmmx3+nV47g3+36xM15jE+zyZ6Ffel02+xSvuM0b2GDRosXZkbb6wA==", "dev": true, "dependencies": { "picocolors": "^1.0.0", @@ -9424,18 +9342,6 @@ "node": ">= 12.13.0" } }, - "node_modules/locate-path": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-5.0.0.tgz", - "integrity": "sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==", - "dev": true, - "dependencies": { - "p-locate": "^4.1.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/lodash": { "version": "4.17.21", "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", @@ -9628,14 +9534,14 @@ } }, "node_modules/memfs": { - "version": "4.9.2", - "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.2.tgz", - "integrity": "sha512-f16coDZlTG1jskq3mxarwB+fGRrd0uXWt+o1WIhRfOwbXQZqUDsTVxQBFK9JjRQHblg8eAG2JSbprDXKjc7ijQ==", + "version": "4.9.3", + "resolved": "https://registry.npmjs.org/memfs/-/memfs-4.9.3.tgz", + "integrity": "sha512-bsYSSnirtYTWi1+OPMFb0M048evMKyUYe0EbtuGQgq6BVQM1g1W8/KIUJCCvjgI/El0j6Q4WsmMiBwLUBSw8LA==", "dev": true, "dependencies": { "@jsonjoy.com/json-pack": "^1.0.3", "@jsonjoy.com/util": "^1.1.2", - "sonic-forest": "^1.0.0", + "tree-dump": "^1.0.1", "tslib": "^2.0.0" }, "engines": { @@ -10703,33 +10609,6 @@ "node": ">=0.10.0" } }, - "node_modules/p-limit": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-2.3.0.tgz", - "integrity": "sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==", - "dev": true, - "dependencies": { - "p-try": "^2.0.0" - }, - "engines": { - "node": ">=6" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/p-locate": { - "version": "4.1.0", - "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-4.1.0.tgz", - "integrity": "sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==", - "dev": true, - "dependencies": { - "p-limit": "^2.2.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/p-map": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/p-map/-/p-map-4.0.0.tgz", @@ -10771,14 +10650,11 @@ "node": ">= 4" } }, - "node_modules/p-try": { - "version": "2.2.0", - "resolved": "https://registry.npmjs.org/p-try/-/p-try-2.2.0.tgz", - "integrity": "sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==", - "dev": true, - "engines": { - "node": ">=6" - } + "node_modules/package-json-from-dist": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/package-json-from-dist/-/package-json-from-dist-1.0.0.tgz", + "integrity": "sha512-dATvCeZN/8wQsGywez1mzHtTlP22H8OEfPrVMLNr4/eGa+ijtLn/6M5f0dY8UKNrC2O9UCU6SSoG3qRKnt7STw==", + "dev": true }, "node_modules/pacote": { "version": "18.0.6", @@ -10897,15 +10773,6 @@ "node": ">= 0.8" } }, - "node_modules/path-exists": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", - "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/path-is-absolute": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", @@ -11546,15 +11413,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/resolve-from": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-5.0.0.tgz", - "integrity": "sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==", - "dev": true, - "engines": { - "node": ">=8" - } - }, "node_modules/resolve-url-loader": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/resolve-url-loader/-/resolve-url-loader-5.0.0.tgz", @@ -12274,25 +12132,6 @@ "node": ">= 14" } }, - "node_modules/sonic-forest": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sonic-forest/-/sonic-forest-1.0.3.tgz", - "integrity": "sha512-dtwajos6IWMEWXdEbW1IkEkyL2gztCAgDplRIX+OT5aRKnEd5e7r7YCxRgXZdhRP1FBdOBf8axeTPhzDv8T4wQ==", - "dev": true, - "dependencies": { - "tree-dump": "^1.0.0" - }, - "engines": { - "node": ">=10.0" - }, - "funding": { - "type": "github", - "url": "https://github.com/sponsors/streamich" - }, - "peerDependencies": { - "tslib": "2" - } - }, "node_modules/source-map": { "version": "0.7.4", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.7.4.tgz", @@ -12424,12 +12263,6 @@ "wbuf": "^1.7.3" } }, - "node_modules/sprintf-js": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", - "integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==", - "dev": true - }, "node_modules/ssri": { "version": "10.0.6", "resolved": "https://registry.npmjs.org/ssri/-/ssri-10.0.6.tgz", @@ -12771,20 +12604,6 @@ "url": "https://opencollective.com/webpack" } }, - "node_modules/test-exclude": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", - "integrity": "sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==", - "dev": true, - "dependencies": { - "@istanbuljs/schema": "^0.1.2", - "glob": "^7.1.4", - "minimatch": "^3.0.4" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/thingies": { "version": "1.21.0", "resolved": "https://registry.npmjs.org/thingies/-/thingies-1.21.0.tgz", @@ -12846,9 +12665,9 @@ } }, "node_modules/tree-dump": { - "version": "1.0.1", - "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.1.tgz", - "integrity": "sha512-WCkcRBVPSlHHq1dc/px9iOfqklvzCbdRwvlNfxGZsrHqf6aZttfPrd7DJTt6oR10dwUfpFFQeVTkPbBIZxX/YA==", + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/tree-dump/-/tree-dump-1.0.2.tgz", + "integrity": "sha512-dpev9ABuLWdEubk+cIaI9cHwRNNDjkBBLXTwI4UCUFdQ5xXKqNXoK4FEciw/vxf+NQ7Cb7sGUyeUtORvHIdRXQ==", "dev": true, "engines": { "node": ">=10.0" @@ -13805,15 +13624,16 @@ } }, "node_modules/webpack-dev-server/node_modules/glob": { - "version": "10.4.1", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.1.tgz", - "integrity": "sha512-2jelhlq3E4ho74ZyVLN03oKdAZVUa6UDZzFLVH1H7dnoax+y9qyaq8zBkfDIggjniU19z0wU18y16jMB2eyVIw==", + "version": "10.4.2", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.4.2.tgz", + "integrity": "sha512-GwMlUF6PkPo3Gk21UxkCohOv0PLcIXVtKyLlpEI28R/cO/4eNOdmLk3CMW1wROV/WR/EsZOWAfBbBOqYvs88/w==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^3.1.2", "minimatch": "^9.0.4", "minipass": "^7.1.2", + "package-json-from-dist": "^1.0.0", "path-scurry": "^1.11.1" }, "bin": { @@ -13917,9 +13737,9 @@ } }, "node_modules/webpack-dev-server/node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.17.1", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.1.tgz", + "integrity": "sha512-6XQFvXTkbfUOZOKKILFG1PDK2NDQs4azKQl26T0YS5CxqWLgXajbPZ+h4gZekJyRqFU8pvnbAbbs/3TgRPy+GQ==", "dev": true, "engines": { "node": ">=10.0.0" diff --git a/src/main/frontend/package.json b/src/main/frontend/package.json index 2e4d2e4..94bdccc 100644 --- a/src/main/frontend/package.json +++ b/src/main/frontend/package.json @@ -10,17 +10,17 @@ }, "private": true, "dependencies": { - "@angular/animations": "^18.0.3", - "@angular/cdk": "^18.0.3", - "@angular/common": "^18.0.3", - "@angular/compiler": "^18.0.3", - "@angular/core": "^18.0.3", - "@angular/forms": "^18.0.3", - "@angular/material": "^18.0.3", - "@angular/platform-browser": "^18.0.3", - "@angular/platform-browser-dynamic": "^18.0.3", - "@angular/router": "^18.0.3", - "@angular/service-worker": "^18.0.3", + "@angular/animations": "^18.0.4", + "@angular/cdk": "^18.0.4", + "@angular/common": "^18.0.4", + "@angular/compiler": "^18.0.4", + "@angular/core": "^18.0.4", + "@angular/forms": "^18.0.4", + "@angular/material": "^18.0.4", + "@angular/platform-browser": "^18.0.4", + "@angular/platform-browser-dynamic": "^18.0.4", + "@angular/router": "^18.0.4", + "@angular/service-worker": "^18.0.4", "@fortawesome/fontawesome-free": "5.15.4", "@material/density": "^15.0.0-canary.a246a4439.0", "bootstrap": "^5.0.2", @@ -30,9 +30,9 @@ "zone.js": "~0.14.2" }, "devDependencies": { - "@angular-devkit/build-angular": "^18.0.4", - "@angular/cli": "~18.0.4", - "@angular/compiler-cli": "^18.0.3", + "@angular-devkit/build-angular": "^18.0.5", + "@angular/cli": "~18.0.5", + "@angular/compiler-cli": "^18.0.4", "@types/jasmine": "~4.3.0", "jasmine-core": "~4.5.0", "karma": "~6.4.0", diff --git a/src/main/java/pl/janis/komornik/Komornik.java b/src/main/java/pl/janis/komornik/Komornik.java index 3ae7898..c36d624 100644 --- a/src/main/java/pl/janis/komornik/Komornik.java +++ b/src/main/java/pl/janis/komornik/Komornik.java @@ -2,8 +2,12 @@ import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; +import org.springframework.data.jpa.repository.config.EnableJpaAuditing; +import org.springframework.scheduling.annotation.EnableAsync; @SpringBootApplication +@EnableAsync +@EnableJpaAuditing public class Komornik { public static void main(String[] args) { diff --git a/src/main/java/pl/janis/komornik/entities/BaseEntity.java b/src/main/java/pl/janis/komornik/entities/BaseEntity.java new file mode 100644 index 0000000..b5b89bc --- /dev/null +++ b/src/main/java/pl/janis/komornik/entities/BaseEntity.java @@ -0,0 +1,33 @@ +package pl.janis.komornik.entities; + +import jakarta.persistence.*; +import lombok.Getter; +import lombok.Setter; +import lombok.ToString; +import org.springframework.data.annotation.CreatedDate; +import org.springframework.data.annotation.LastModifiedDate; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; + +import java.time.LocalDateTime; + +@MappedSuperclass +@EntityListeners(AuditingEntityListener.class) +@Getter +@Setter +@ToString(exclude = {"createdDate", "lastModifiedAt"}) +public class BaseEntity { + + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + private Integer id; + + @Version + private Integer version; + + @CreatedDate + @Column(updatable = false, nullable = false) + private LocalDateTime createdDate; + @LastModifiedDate + @Column(insertable = false) + private LocalDateTime lastModifiedAt; +} diff --git a/src/main/java/pl/janis/komornik/entities/Category.java b/src/main/java/pl/janis/komornik/entities/Category.java index 7991fc6..f39c921 100644 --- a/src/main/java/pl/janis/komornik/entities/Category.java +++ b/src/main/java/pl/janis/komornik/entities/Category.java @@ -1,11 +1,11 @@ package pl.janis.komornik.entities; import com.fasterxml.jackson.annotation.JsonManagedReference; -import jakarta.persistence.*; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.OneToMany; +import jakarta.persistence.Table; +import lombok.*; import org.hibernate.proxy.HibernateProxy; import java.util.LinkedHashSet; @@ -14,16 +14,13 @@ @Getter @Setter -@ToString +@ToString(callSuper = true) @RequiredArgsConstructor +@AllArgsConstructor +@Builder @Entity @Table(name = "categories", schema = "komornik") -public class Category { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", nullable = false) - private Integer id; +public class Category extends BaseEntity { @Column(name = "category_name", nullable = false) private String categoryName; diff --git a/src/main/java/pl/janis/komornik/entities/Debt.java b/src/main/java/pl/janis/komornik/entities/Debt.java index d3822fc..833426a 100644 --- a/src/main/java/pl/janis/komornik/entities/Debt.java +++ b/src/main/java/pl/janis/komornik/entities/Debt.java @@ -2,10 +2,7 @@ import com.fasterxml.jackson.annotation.JsonBackReference; import jakarta.persistence.*; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import lombok.*; import org.hibernate.proxy.HibernateProxy; import java.math.BigDecimal; @@ -13,16 +10,12 @@ @Getter @Setter -@ToString +@ToString(callSuper = true) @RequiredArgsConstructor +@AllArgsConstructor @Entity @Table(name = "debts", schema = "komornik") -public class Debt { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", nullable = false) - private Integer id; +public class Debt extends BaseEntity { @ManyToOne(fetch = FetchType.LAZY, optional = false, cascade = CascadeType.MERGE) @JoinColumn(name = "expense_id") diff --git a/src/main/java/pl/janis/komornik/entities/Expense.java b/src/main/java/pl/janis/komornik/entities/Expense.java index d4e19e5..937cebb 100644 --- a/src/main/java/pl/janis/komornik/entities/Expense.java +++ b/src/main/java/pl/janis/komornik/entities/Expense.java @@ -3,10 +3,7 @@ import com.fasterxml.jackson.annotation.JsonBackReference; import com.fasterxml.jackson.annotation.JsonFormat; import jakarta.persistence.*; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import lombok.*; import org.hibernate.proxy.HibernateProxy; import java.math.BigDecimal; @@ -16,8 +13,9 @@ @Getter @Setter -@ToString +@ToString(callSuper = true) @RequiredArgsConstructor +@AllArgsConstructor @Entity @Table(name = "expenses", schema = "komornik") @NamedNativeQuery(name = "findBalanceForGroup", @@ -31,15 +29,10 @@ @ColumnResult(name = "balance"), @ColumnResult(name = "currency")}) }) -public class Expense { +public class Expense extends BaseEntity { // select debt.userTo.id as userId, sum(debt.amount) as balance from Expense e inner join e.debt debt " + // " where e.group.id = :groupId group by debt.userTo.id - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", nullable = false) - private Integer id; - @ManyToOne(fetch = FetchType.EAGER, cascade = CascadeType.MERGE) @JoinColumn(name = "category_id") @JsonBackReference diff --git a/src/main/java/pl/janis/komornik/entities/Group.java b/src/main/java/pl/janis/komornik/entities/Group.java index 217b9af..ccd94ae 100644 --- a/src/main/java/pl/janis/komornik/entities/Group.java +++ b/src/main/java/pl/janis/komornik/entities/Group.java @@ -2,11 +2,9 @@ import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import lombok.*; import org.hibernate.proxy.HibernateProxy; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; import java.util.ArrayList; import java.util.List; @@ -14,16 +12,13 @@ @Getter @Setter -@ToString +@ToString(callSuper = true) @RequiredArgsConstructor +@AllArgsConstructor @Entity @Table(name = "groups", schema = "komornik") -public class Group { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", nullable = false) - private Integer id; +@EntityListeners(AuditingEntityListener.class) +public class Group extends BaseEntity { @Column(name = "group_name", nullable = false) private String groupName; diff --git a/src/main/java/pl/janis/komornik/entities/User.java b/src/main/java/pl/janis/komornik/entities/User.java index f5a0a0f..5a9b33a 100644 --- a/src/main/java/pl/janis/komornik/entities/User.java +++ b/src/main/java/pl/janis/komornik/entities/User.java @@ -2,10 +2,8 @@ import com.fasterxml.jackson.annotation.JsonManagedReference; import jakarta.persistence.*; -import lombok.Getter; -import lombok.RequiredArgsConstructor; -import lombok.Setter; -import lombok.ToString; +import lombok.*; +import org.springframework.data.jpa.domain.support.AuditingEntityListener; import org.springframework.security.core.GrantedAuthority; import org.springframework.security.core.userdetails.UserDetails; @@ -14,16 +12,13 @@ @Getter @Setter -@ToString +@ToString(callSuper = true) @RequiredArgsConstructor +@AllArgsConstructor @Entity @Table(name = "users", schema = "komornik") -public class User implements UserDetails { - - @Id - @GeneratedValue(strategy = GenerationType.IDENTITY) - @Column(name = "id", nullable = false) - private Integer id; +@EntityListeners(AuditingEntityListener.class) +public class User extends BaseEntity implements UserDetails { @Column(name = "username", nullable = false) private String name; @@ -68,25 +63,8 @@ public String getUsername() { return getName(); } - @Override - public boolean isAccountNonExpired() { - return true; - } - - @Override - public boolean isAccountNonLocked() { - return true; - } - - @Override - public boolean isCredentialsNonExpired() { - return true; - } - @Override public boolean isEnabled() { return this.isVerified; } - - } diff --git a/src/main/java/pl/janis/komornik/service/EmailService.java b/src/main/java/pl/janis/komornik/service/EmailService.java index 534d2ba..b13b5b5 100644 --- a/src/main/java/pl/janis/komornik/service/EmailService.java +++ b/src/main/java/pl/janis/komornik/service/EmailService.java @@ -8,6 +8,7 @@ import org.springframework.mail.SimpleMailMessage; import org.springframework.mail.javamail.JavaMailSender; import org.springframework.mail.javamail.MimeMessageHelper; +import org.springframework.scheduling.annotation.Async; import org.springframework.stereotype.Service; import pl.janis.komornik.entities.User; @@ -18,6 +19,7 @@ public class EmailService { private final JavaMailSender mailSender; private final Environment env; + @Async public void resetPasswordEmail(String to, int newPassword) { SimpleMailMessage message = new SimpleMailMessage(); message.setTo(to); @@ -27,6 +29,7 @@ public void resetPasswordEmail(String to, int newPassword) { mailSender.send(message); } + @Async public void sendVerificationEmail(User user) { try {