From e4f81275036b40f1a335c0d00ed6ec5e8e5e35fc Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Thu, 8 May 2025 14:17:14 +0200 Subject: [PATCH 001/225] perf: increase slots performance by 1500% !!!! --- .../feature/game/slots/slots.component.html | 29 ++++++++++++------- .../app/feature/game/slots/slots.component.ts | 2 +- 2 files changed, 19 insertions(+), 12 deletions(-) diff --git a/frontend/src/app/feature/game/slots/slots.component.html b/frontend/src/app/feature/game/slots/slots.component.html index c5929df..3ac9bf4 100644 --- a/frontend/src/app/feature/game/slots/slots.component.html +++ b/frontend/src/app/feature/game/slots/slots.component.html @@ -9,15 +9,27 @@
-
-

Slot Machine

+
+ +
+

Slot Machine

+ + +{{ slotResult().amount | currency: 'EUR' }} + +
+ +
{{ @@ -42,20 +54,15 @@ class="bg-deep-blue-contrast rounded-lg shadow-md p-2 flex items-center justify-center" > {{ - cell - }} + cell + }}
} }
- -
-
- +{{ slotResult().amount | currency: 'EUR' }} -
-
+
diff --git a/frontend/src/app/feature/game/slots/slots.component.ts b/frontend/src/app/feature/game/slots/slots.component.ts index 71fa482..6672d06 100644 --- a/frontend/src/app/feature/game/slots/slots.component.ts +++ b/frontend/src/app/feature/game/slots/slots.component.ts @@ -119,7 +119,7 @@ export default class SlotsComponent implements OnInit, OnDestroy { this.userService.refreshCurrentUser(); this.isSpinning = false; - }, 1500); + }, 100); }, error: (err) => { console.error('Error spinning slot machine:', err); From 27c7ee5ff9c8a0b0ca4a0a6d5b87b5d698fafef8 Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Thu, 8 May 2025 14:20:53 +0200 Subject: [PATCH 002/225] style: fml: fml --- frontend/src/app/feature/game/slots/slots.component.html | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/feature/game/slots/slots.component.html b/frontend/src/app/feature/game/slots/slots.component.html index 3ac9bf4..794760a 100644 --- a/frontend/src/app/feature/game/slots/slots.component.html +++ b/frontend/src/app/feature/game/slots/slots.component.html @@ -54,8 +54,8 @@ class="bg-deep-blue-contrast rounded-lg shadow-md p-2 flex items-center justify-center" > {{ - cell - }} + cell + }}
} } From 156379c12ceb42e5c8b92adb73afde107ccf0a35 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Thu, 8 May 2025 21:02:03 +0000 Subject: [PATCH 003/225] chore(deps): update postgres docker tag to v17.5 --- compose.yml | 2 +- docker/docker-compose.yml | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/compose.yml b/compose.yml index 5e53cc6..98574ad 100644 --- a/compose.yml +++ b/compose.yml @@ -3,7 +3,7 @@ volumes: services: db: - image: postgres:17.4 + image: postgres:17.5 container_name: casino-db restart: unless-stopped volumes: diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml index 7bc0a3b..5487079 100644 --- a/docker/docker-compose.yml +++ b/docker/docker-compose.yml @@ -3,7 +3,7 @@ volumes: services: db: - image: postgres:17.4 + image: postgres:17.5 container_name: casino-db restart: unless-stopped volumes: From 7b0e37b14ba738f83b70a0501bf06931ce3106b2 Mon Sep 17 00:00:00 2001 From: Renovate Bot Date: Mon, 12 May 2025 18:01:47 +0000 Subject: [PATCH 004/225] chore(deps): update devdependencies (non-major) --- frontend/bun.lock | 114 ++++++++++++------------------------------ frontend/package.json | 4 +- 2 files changed, 33 insertions(+), 85 deletions(-) diff --git a/frontend/bun.lock b/frontend/bun.lock index 70cba54..91c97c6 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -33,7 +33,7 @@ "@angular/cli": "^19.2.5", "@angular/compiler-cli": "^19.0.0", "@types/jasmine": "~5.1.0", - "angular-eslint": "19.3.0", + "angular-eslint": "19.4.0", "eslint": "^9.25.1", "jasmine-core": "~5.7.0", "karma": "~6.4.0", @@ -43,7 +43,7 @@ "karma-jasmine-html-reporter": "~2.1.0", "prettier": "^3.4.2", "typescript": "~5.8.0", - "typescript-eslint": "8.32.0", + "typescript-eslint": "8.32.1", }, }, }, @@ -62,19 +62,19 @@ "@angular-devkit/schematics": ["@angular-devkit/schematics@19.2.6", "", { "dependencies": { "@angular-devkit/core": "19.2.6", "jsonc-parser": "3.3.1", "magic-string": "0.30.17", "ora": "5.4.1", "rxjs": "7.8.1" } }, "sha512-YTAxNnT++5eflx19OUHmOWu597/TbTel+QARiZCv1xQw99+X8DCKKOUXtqBRd53CAHlREDI33Rn/JLY3NYgMLQ=="], - "@angular-eslint/builder": ["@angular-eslint/builder@19.3.0", "", { "dependencies": { "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", "@angular-devkit/core": ">= 19.0.0 < 20.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-j9xNrzZJq29ONSG6EaeQHve0Squkm6u6Dm8fZgWP7crTFOrtLXn7Wxgxuyl9eddpbWY1Ov1gjFuwBVnxIdyAqg=="], + "@angular-eslint/builder": ["@angular-eslint/builder@19.4.0", "", { "dependencies": { "@angular-devkit/architect": ">= 0.1900.0 < 0.2000.0", "@angular-devkit/core": ">= 19.0.0 < 20.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-+mI/YwXiT+IPRNuTNrQqOm97iqbPM5Zc4fxR3p9N1xj1dxLyXJrtGXbbWJPK6i74ON7KdpkY3WLhMKnhWM4RzQ=="], - "@angular-eslint/bundled-angular-compiler": ["@angular-eslint/bundled-angular-compiler@19.3.0", "", {}, "sha512-63Zci4pvnUR1iSkikFlNbShF1tO5HOarYd8fvNfmOZwFfZ/1T3j3bCy9YbE+aM5SYrWqPaPP/OcwZ3wJ8WNvqA=="], + "@angular-eslint/bundled-angular-compiler": ["@angular-eslint/bundled-angular-compiler@19.4.0", "", {}, "sha512-Djq+je34czagDxvkBbbe1dLlhUGYK2MbHjEgPTQ00tVkacLQGAW4UmT1A0JGZzfzl/lDVvli64/lYQsJTSSM6A=="], - "@angular-eslint/eslint-plugin": ["@angular-eslint/eslint-plugin@19.3.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.3.0", "@angular-eslint/utils": "19.3.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-nBLslLI20KnVbqlfNW7GcnI9R6cYCvRGjOE2QYhzxM316ciAQ62tvQuXP9ZVnRBLSKDAVnMeC0eTq9O4ysrxrQ=="], + "@angular-eslint/eslint-plugin": ["@angular-eslint/eslint-plugin@19.4.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.4.0", "@angular-eslint/utils": "19.4.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-jXhyYYIdo5ItCFfmw7W5EqDRQx8rYtiYbpezI84CemKPHB/VPiP/zqLIvdTVBdJdXlqS31ueXn2YlWU0w6AAgg=="], - "@angular-eslint/eslint-plugin-template": ["@angular-eslint/eslint-plugin-template@19.3.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.3.0", "@angular-eslint/utils": "19.3.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-WyouppTpOYut+wvv13wlqqZ8EHoDrCZxNfGKuEUYK1BPmQlTB8EIZfQH4iR1rFVS28Rw+XRIiXo1x3oC0SOfnA=="], + "@angular-eslint/eslint-plugin-template": ["@angular-eslint/eslint-plugin-template@19.4.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.4.0", "@angular-eslint/utils": "19.4.0", "aria-query": "5.3.2", "axobject-query": "4.1.0" }, "peerDependencies": { "@typescript-eslint/types": "^7.11.0 || ^8.0.0", "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-6WAGnHf5SKi7k8/AOOLwGCoN3iQUE8caKsg0OucL4CWPUyzsYpQjx7ALKyxx9lqoAngn3CTlQ2tcwDv6aYtfmg=="], - "@angular-eslint/schematics": ["@angular-eslint/schematics@19.3.0", "", { "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", "@angular-eslint/eslint-plugin": "19.3.0", "@angular-eslint/eslint-plugin-template": "19.3.0", "ignore": "7.0.3", "semver": "7.7.1", "strip-json-comments": "3.1.1" } }, "sha512-Wl5sFQ4t84LUb8mJ2iVfhYFhtF55IugXu7rRhPHtgIu9Ty5s1v3HGUx4LKv51m2kWhPPeFOTmjeBv1APzFlmnQ=="], + "@angular-eslint/schematics": ["@angular-eslint/schematics@19.4.0", "", { "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", "@angular-eslint/eslint-plugin": "19.4.0", "@angular-eslint/eslint-plugin-template": "19.4.0", "ignore": "7.0.4", "semver": "7.7.1", "strip-json-comments": "3.1.1" } }, "sha512-gW6RkLC5/CHiD1CXjve6LO0iit0EbHyhV6Jnb7FeRhTaFHhktbuI0zQ8wnSI/D0Pm8ZvV1PoNyhB2k2AWZT9sQ=="], - "@angular-eslint/template-parser": ["@angular-eslint/template-parser@19.3.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.3.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-VxMNgsHXMWbbmZeBuBX5i8pzsSSEaoACVpaE+j8Muk60Am4Mxc0PytJm4n3znBSvI3B7Kq2+vStSRYPkOER4lA=="], + "@angular-eslint/template-parser": ["@angular-eslint/template-parser@19.4.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.4.0", "eslint-scope": "^8.0.2" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-f4t7Z6zo8owOTUqAtZ3G/cMA5hfT3RE2OKR0dLn7YI6LxUJkrlcHq75n60UHiapl5sais6heo70hvjQgJ3fDxQ=="], - "@angular-eslint/utils": ["@angular-eslint/utils@19.3.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.3.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-ovvbQh96FIJfepHqLCMdKFkPXr3EbcvYc9kMj9hZyIxs/9/VxwPH7x25mMs4VsL6rXVgH2FgG5kR38UZlcTNNw=="], + "@angular-eslint/utils": ["@angular-eslint/utils@19.4.0", "", { "dependencies": { "@angular-eslint/bundled-angular-compiler": "19.4.0" }, "peerDependencies": { "@typescript-eslint/utils": "^7.11.0 || ^8.0.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": "*" } }, "sha512-2hZ7rf/0YBkn1Rk0i7AlYGlfxQ7+DqEXUsgp1M56mf0cy7/GCFiWZE0lcXFY4kzb4yQK3G2g+kIF092MwelT7Q=="], "@angular/animations": ["@angular/animations@19.2.5", "", { "dependencies": { "tslib": "^2.3.0" }, "peerDependencies": { "@angular/common": "19.2.5", "@angular/core": "19.2.5" } }, "sha512-m4RtY3z1JuHFCh6OrOHxo25oKEigBDdR/XmdCfXIwfTiObZzNA7VQhysgdrb9IISO99kXbjZUYKDtLzgWT8Klg=="], @@ -680,21 +680,21 @@ "@types/ws": ["@types/ws@8.18.1", "", { "dependencies": { "@types/node": "*" } }, "sha512-ThVF6DCVhA8kUGy+aazFQ4kXQ7E1Ty7A3ypFOe0IcJV8O/M511G99AW24irKrW56Wt44yG9+ij8FaqoBGkuBXg=="], - "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.0", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/type-utils": "8.32.0", "@typescript-eslint/utils": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-/jU9ettcntkBFmWUzzGgsClEi2ZFiikMX5eEQsmxIAWMOn4H3D4rvHssstmAHGVvrYnaMqdWWWg0b5M6IN/MTQ=="], + "@typescript-eslint/eslint-plugin": ["@typescript-eslint/eslint-plugin@8.32.1", "", { "dependencies": { "@eslint-community/regexpp": "^4.10.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/type-utils": "8.32.1", "@typescript-eslint/utils": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "graphemer": "^1.4.0", "ignore": "^7.0.0", "natural-compare": "^1.4.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "@typescript-eslint/parser": "^8.0.0 || ^8.0.0-alpha.0", "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-6u6Plg9nP/J1GRpe/vcjjabo6Uc5YQPAMxsgQyGC/I0RuukiG1wIe3+Vtg3IrSCVJDmqK3j8adrtzXSENRtFgg=="], - "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.0", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-B2MdzyWxCE2+SqiZHAjPphft+/2x2FlO9YBx7eKE1BCb+rqBlQdhtAEhzIEdozHd55DXPmxBdpMygFJjfjjA9A=="], + "@typescript-eslint/parser": ["@typescript-eslint/parser@8.32.1", "", { "dependencies": { "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-LKMrmwCPoLhM45Z00O1ulb6jwyVr2kr3XJp+G+tSEZcbauNnScewcQwtJqXDhXeYPDEjZ8C1SjXm015CirEmGg=="], - "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.29.0", "", { "dependencies": { "@typescript-eslint/types": "8.29.0", "@typescript-eslint/visitor-keys": "8.29.0" } }, "sha512-aO1PVsq7Gm+tcghabUpzEnVSFMCU4/nYIgC2GOatJcllvWfnhrgW0ZEbnTxm36QsikmCN1K/6ZgM7fok2I7xNw=="], + "@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1" } }, "sha512-7IsIaIDeZn7kffk7qXC3o6Z4UblZJKV3UBpkvRNpr5NSyLji7tvTcvmnMNYuYLyh26mN8W723xpo3i4MlD33vA=="], - "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.0", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.0", "@typescript-eslint/utils": "8.32.0", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-t2vouuYQKEKSLtJaa5bB4jHeha2HJczQ6E5IXPDPgIty9EqcJxpr1QHQ86YyIPwDwxvUmLfP2YADQ5ZY4qddZg=="], + "@typescript-eslint/type-utils": ["@typescript-eslint/type-utils@8.32.1", "", { "dependencies": { "@typescript-eslint/typescript-estree": "8.32.1", "@typescript-eslint/utils": "8.32.1", "debug": "^4.3.4", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-mv9YpQGA8iIsl5KyUPi+FGLm7+bA4fgXaeRcFKRDRwDMu4iwrSHeDPipwueNXhdIIZltwCJv+NkxftECbIZWfA=="], - "@typescript-eslint/types": ["@typescript-eslint/types@8.29.0", "", {}, "sha512-wcJL/+cOXV+RE3gjCyl/V2G877+2faqvlgtso/ZRbTCnZazh0gXhe+7gbAnfubzN2bNsBtZjDvlh7ero8uIbzg=="], + "@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.29.0", "", { "dependencies": { "@typescript-eslint/types": "8.29.0", "@typescript-eslint/visitor-keys": "8.29.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.0.1" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-yOfen3jE9ISZR/hHpU/bmNvTtBW1NjRbkSFdZOksL1N+ybPEE7UVGMwqvS6CP022Rp00Sb0tdiIkhSCe6NI8ow=="], + "@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "@typescript-eslint/visitor-keys": "8.32.1", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-Y3AP9EIfYwBb4kWGb+simvPaqQoT5oJuzzj9m0i6FCY6SPvlomY2Ei4UEMm7+FXtlNJbor80ximyslzaQF6xhg=="], - "@typescript-eslint/utils": ["@typescript-eslint/utils@8.29.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", "@typescript-eslint/scope-manager": "8.29.0", "@typescript-eslint/types": "8.29.0", "@typescript-eslint/typescript-estree": "8.29.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-gX/A0Mz9Bskm8avSWFcK0gP7cZpbY4AIo6B0hWYFCaIsz750oaiWR4Jr2CI+PQhfW1CpcQr9OlfPS+kMFegjXA=="], + "@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.1", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.1", "@typescript-eslint/types": "8.32.1", "@typescript-eslint/typescript-estree": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-DsSFNIgLSrc89gpq1LJB7Hm1YpuhK086DRDJSNrewcGvYloWW1vZLHBTIvarKZDcAORIy/uWNx8Gad+4oMpkSA=="], - "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-1rYQTCLFFzOI5Nl0c8LUpJT8HxpwVRn9E4CkMsYfuN6ctmQqExjSTzzSk0Tz2apmXy7WU6/6fyaZVVA/thPN+w=="], + "@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.32.1", "", { "dependencies": { "@typescript-eslint/types": "8.32.1", "eslint-visitor-keys": "^4.2.0" } }, "sha512-ar0tjQfObzhSaW3C3QNmTc5ofj0hDoNQ5XWrCy6zDyabdr0TWhCkClp+rywGNj/odAFBVzzJrK4tEq5M4Hmu4w=="], "@vitejs/plugin-basic-ssl": ["@vitejs/plugin-basic-ssl@1.2.0", "", { "peerDependencies": { "vite": "^3.0.0 || ^4.0.0 || ^5.0.0 || ^6.0.0" } }, "sha512-mkQnxTkcldAzIsomk1UuLfAu9n+kpQ3JbHcpCp7d2Oo6ITtji8pHS3QToOWjhPFvNQSnhlkAjmGbhv2QvwO/7Q=="], @@ -752,7 +752,7 @@ "ajv-keywords": ["ajv-keywords@5.1.0", "", { "dependencies": { "fast-deep-equal": "^3.1.3" }, "peerDependencies": { "ajv": "^8.8.2" } }, "sha512-YCS/JNFAUyr5vAuhk1DWm1CBxRHW9LbJ2ozWeemrIqpbsqKjHVxYPyi5GC0rjZIT5JxJ3virVTS8wk4i/Z+krw=="], - "angular-eslint": ["angular-eslint@19.3.0", "", { "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", "@angular-eslint/builder": "19.3.0", "@angular-eslint/eslint-plugin": "19.3.0", "@angular-eslint/eslint-plugin-template": "19.3.0", "@angular-eslint/schematics": "19.3.0", "@angular-eslint/template-parser": "19.3.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*", "typescript-eslint": "^8.0.0" } }, "sha512-19hkkH3z/2wGhKk3LfttEBkl6CtQP/tFK6/mJoO/MbIkXV0SSJWtbPbOpEaxICLlfCw0oR6W9OoQqByWkwXjkQ=="], + "angular-eslint": ["angular-eslint@19.4.0", "", { "dependencies": { "@angular-devkit/core": ">= 19.0.0 < 20.0.0", "@angular-devkit/schematics": ">= 19.0.0 < 20.0.0", "@angular-eslint/builder": "19.4.0", "@angular-eslint/eslint-plugin": "19.4.0", "@angular-eslint/eslint-plugin-template": "19.4.0", "@angular-eslint/schematics": "19.4.0", "@angular-eslint/template-parser": "19.4.0", "@typescript-eslint/types": "^8.0.0", "@typescript-eslint/utils": "^8.0.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": "*", "typescript-eslint": "^8.0.0" } }, "sha512-/Xg77jhVHqn67AxZL6ELPV6JpwNLZKUTRYYfZcG7ro7CpOgdOXaJg7a1UeZLxFuNGGrfhacBQNX0ajM4Giue7A=="], "ansi-colors": ["ansi-colors@4.1.3", "", {}, "sha512-/6w/C21Pm1A7aZitlI5Ni/2J6FFQN8i1Cvz3kHABAAbw93v/NlvKdVOqz7CCWz/3iv/JplRSEEZ83XION15ovw=="], @@ -1770,7 +1770,7 @@ "typescript": ["typescript@5.8.2", "", { "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" } }, "sha512-aJn6wq13/afZp/jT9QZmwEjDqqvSGp1VT5GVg+f/t6/oVyrgXM6BY1h9BRh/O5p3PlUPAe+WuiEZOmb/49RqoQ=="], - "typescript-eslint": ["typescript-eslint@8.32.0", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.0", "@typescript-eslint/parser": "8.32.0", "@typescript-eslint/utils": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-UMq2kxdXCzinFFPsXc9o2ozIpYCCOiEC46MG3yEh5Vipq6BO27otTtEBZA1fQ66DulEUgE97ucQ/3YY66CPg0A=="], + "typescript-eslint": ["typescript-eslint@8.32.1", "", { "dependencies": { "@typescript-eslint/eslint-plugin": "8.32.1", "@typescript-eslint/parser": "8.32.1", "@typescript-eslint/utils": "8.32.1" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-D7el+eaDHAmXvrZBy1zpzSNIRqnCOrkwTgZxTu3MUqRWk8k0q9m9Ho4+vPf7iHtgUfrK/o8IZaEApsxPlHTFCg=="], "ua-parser-js": ["ua-parser-js@0.7.40", "", { "bin": { "ua-parser-js": "script/cli.js" } }, "sha512-us1E3K+3jJppDBa3Tl0L3MOJiGhe1C6P0+nIvQAFYbxlMAx0h81eOwLmU57xgqToduDDPx3y5QsdjPfDu+FgOQ=="], @@ -1880,7 +1880,7 @@ "@angular-devkit/schematics/rxjs": ["rxjs@7.8.1", "", { "dependencies": { "tslib": "^2.1.0" } }, "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg=="], - "@angular-eslint/schematics/ignore": ["ignore@7.0.3", "", {}, "sha512-bAH5jbK/F3T3Jls4I0SO1hmPR0dKU0a7+SY6n1yzRtG54FLO8d6w/nxLFX2Nb7dBu6cCWXPaAME6cYqFUMmuCA=="], + "@angular-eslint/schematics/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], "@angular/compiler-cli/@babel/core": ["@babel/core@7.26.9", "", { "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.26.2", "@babel/generator": "^7.26.9", "@babel/helper-compilation-targets": "^7.26.5", "@babel/helper-module-transforms": "^7.26.0", "@babel/helpers": "^7.26.9", "@babel/parser": "^7.26.9", "@babel/template": "^7.26.9", "@babel/traverse": "^7.26.9", "@babel/types": "^7.26.9", "convert-source-map": "^2.0.0", "debug": "^4.1.0", "gensync": "^1.0.0-beta.2", "json5": "^2.2.3", "semver": "^6.3.1" } }, "sha512-lWBYIrF7qK5+GjY5Uy+/hEgp8OJWOD/rpy74GplYRhEauvbHDeFB8t5hPOZxCZ0Oxf4Cc36tK51/l3ymJysrKw=="], @@ -1964,27 +1964,21 @@ "@types/express/@types/express-serve-static-core": ["@types/express-serve-static-core@4.19.6", "", { "dependencies": { "@types/node": "*", "@types/qs": "*", "@types/range-parser": "*", "@types/send": "*" } }, "sha512-N4LZ2xG7DatVqhCZzOGb1Yi5lMbXSZcmdLDe9EzSndPV2HpWYWzRbaerl2n27irrm94EPpprqa8KpskPT085+A=="], - "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], + "@typescript-eslint/eslint-plugin/ignore": ["ignore@7.0.4", "", {}, "sha512-gJzzk+PQNznz8ysRrC0aOkBNVRBDtE1n53IqyqEf3PXrYwomFs5q4pGMizBMJF+ykh03insJ27hB8gSrD2Hn8A=="], - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw=="], + "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], - "@typescript-eslint/parser/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], + "@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], - "@typescript-eslint/parser/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - - "@typescript-eslint/parser/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], - - "@typescript-eslint/scope-manager/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.29.0", "", { "dependencies": { "@typescript-eslint/types": "8.29.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], - - "@typescript-eslint/type-utils/@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw=="], - - "@typescript-eslint/typescript-estree/@typescript-eslint/visitor-keys": ["@typescript-eslint/visitor-keys@8.29.0", "", { "dependencies": { "@typescript-eslint/types": "8.29.0", "eslint-visitor-keys": "^4.2.0" } }, "sha512-Sne/pVz8ryR03NFK21VpN88dZ2FdQXOlq3VIklbrTYEt8yXtRFr9tvUhqvCeKjqYk5FSim37sHbooT6vzBTZcg=="], + "@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], "@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], + "@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], + + "@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], + + "@typescript-eslint/visitor-keys/@typescript-eslint/types": ["@typescript-eslint/types@8.32.1", "", {}, "sha512-YmybwXUJcgGqgAp6bEsgpPXEg6dcCyPyCSr0CAAueacR/CCBi25G3V8gGQ2kRzQRBNol7VQknxMs9HvVa9Rvfg=="], "accepts/negotiator": ["negotiator@0.6.3", "", {}, "sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg=="], @@ -2148,8 +2142,6 @@ "tar/mkdirp": ["mkdirp@1.0.4", "", { "bin": { "mkdirp": "bin/cmd.js" } }, "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw=="], - "typescript-eslint/@typescript-eslint/utils": ["@typescript-eslint/utils@8.32.0", "", { "dependencies": { "@eslint-community/eslint-utils": "^4.7.0", "@typescript-eslint/scope-manager": "8.32.0", "@typescript-eslint/types": "8.32.0", "@typescript-eslint/typescript-estree": "8.32.0" }, "peerDependencies": { "eslint": "^8.57.0 || ^9.0.0", "typescript": ">=4.8.4 <5.9.0" } }, "sha512-8S9hXau6nQ/sYVtC3D6ISIDoJzS1NsCK+gluVhLN2YkBPX+/1wkwyUiDKnxRh15579WoOIyVWnoyIf3yGI9REw=="], - "webpack/eslint-scope": ["eslint-scope@5.1.1", "", { "dependencies": { "esrecurse": "^4.3.0", "estraverse": "^4.1.1" } }, "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw=="], "webpack-dev-server/chokidar": ["chokidar@3.6.0", "", { "dependencies": { "anymatch": "~3.1.2", "braces": "~3.0.2", "glob-parent": "~5.1.2", "is-binary-path": "~2.1.0", "is-glob": "~4.0.1", "normalize-path": "~3.0.0", "readdirp": "~3.6.0" }, "optionalDependencies": { "fsevents": "~2.3.2" } }, "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw=="], @@ -2184,28 +2176,10 @@ "@tufjs/models/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "@typescript-eslint/eslint-plugin/@typescript-eslint/scope-manager/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], - - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "@typescript-eslint/type-utils/@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], - - "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], - - "@typescript-eslint/type-utils/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - "@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], + "@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], + "body-parser/debug/ms": ["ms@2.0.0", "", {}, "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A=="], "cacache/glob/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], @@ -2282,14 +2256,6 @@ "tar/minizlib/minipass": ["minipass@3.3.6", "", { "dependencies": { "yallist": "^4.0.0" } }, "sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw=="], - "typescript-eslint/@typescript-eslint/utils/@eslint-community/eslint-utils": ["@eslint-community/eslint-utils@4.7.0", "", { "dependencies": { "eslint-visitor-keys": "^3.4.3" }, "peerDependencies": { "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, "sha512-dyybb3AcajC7uha6CvhdVRJqaKyn7w2YKqKyAN37NKYgZT36w+iRb0Dymmc5qEJ549c/S31cMMSFd75bteCpCw=="], - - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/scope-manager": ["@typescript-eslint/scope-manager@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0" } }, "sha512-jc/4IxGNedXkmG4mx4nJTILb6TMjL66D41vyeaPWvDUmeYQzF3lKtN15WsAeTr65ce4mPxwopPSo1yUUAWw0hQ=="], - - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/types": ["@typescript-eslint/types@8.32.0", "", {}, "sha512-O5Id6tGadAZEMThM6L9HmVf5hQUXNSxLVKeGJYWNhhVseps/0LddMkp7//VDkzwJ69lPL0UmZdcZwggj9akJaA=="], - - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree": ["@typescript-eslint/typescript-estree@8.32.0", "", { "dependencies": { "@typescript-eslint/types": "8.32.0", "@typescript-eslint/visitor-keys": "8.32.0", "debug": "^4.3.4", "fast-glob": "^3.3.2", "is-glob": "^4.0.3", "minimatch": "^9.0.4", "semver": "^7.6.0", "ts-api-utils": "^2.1.0" }, "peerDependencies": { "typescript": ">=4.8.4 <5.9.0" } }, "sha512-pU9VD7anSCOIoBFnhTGfOzlVFQIA1XXiQpH/CezqOBaDppRwTglJzCC6fUQGpfwey4T183NKhF1/mfatYmjRqQ=="], - "webpack-dev-server/chokidar/glob-parent": ["glob-parent@5.1.2", "", { "dependencies": { "is-glob": "^4.0.1" } }, "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow=="], "webpack-dev-server/chokidar/readdirp": ["readdirp@3.6.0", "", { "dependencies": { "picomatch": "^2.2.1" } }, "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA=="], @@ -2302,16 +2268,6 @@ "@npmcli/package-json/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - - "@typescript-eslint/parser/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "@typescript-eslint/type-utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - - "@typescript-eslint/type-utils/@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - "cacache/glob/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], "cli-truncate/string-width/strip-ansi/ansi-regex": ["ansi-regex@6.1.0", "", {}, "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA=="], @@ -2324,18 +2280,10 @@ "pkg-dir/find-up/locate-path/p-locate": ["p-locate@6.0.0", "", { "dependencies": { "p-limit": "^4.0.0" } }, "sha512-wPrq66Llhl7/4AGC6I+cqxT07LhXvWL08LNXz1fENOw0Ap4sRZZ/gZpTTJ5jpurzzzfS2W/Ge9BY3LgLjCShcw=="], - "typescript-eslint/@typescript-eslint/utils/@eslint-community/eslint-utils/eslint-visitor-keys": ["eslint-visitor-keys@3.4.3", "", {}, "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag=="], - - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch": ["minimatch@9.0.5", "", { "dependencies": { "brace-expansion": "^2.0.1" } }, "sha512-G6T0ZX48xgozx7587koeX9Ys2NYy6Gmv//P89sEte9V9whIapMNF4idKxnW2QtCcLiTWlb/wfCabAtAFWhhBow=="], - "webpack-dev-server/chokidar/readdirp/picomatch": ["picomatch@2.3.1", "", {}, "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA=="], - "@typescript-eslint/eslint-plugin/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "pkg-dir/find-up/locate-path/p-locate/p-limit": ["p-limit@4.0.0", "", { "dependencies": { "yocto-queue": "^1.0.0" } }, "sha512-5b0R4txpzjPWVw/cXXUResoD4hb6U/x9BH08L7nw+GN1sezDzPdxeRvpc9c433fZhBan/wusjbCsqwqm4EIBIQ=="], - "typescript-eslint/@typescript-eslint/utils/@typescript-eslint/typescript-estree/minimatch/brace-expansion": ["brace-expansion@2.0.1", "", { "dependencies": { "balanced-match": "^1.0.0" } }, "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA=="], - "pkg-dir/find-up/locate-path/p-locate/p-limit/yocto-queue": ["yocto-queue@1.2.1", "", {}, "sha512-AyeEbWOu/TAXdxlV9wmGcR0+yh2j3vYPGOECcIj2S7MkrLyC7ne+oye2BKTItt0ii2PHk4cDy+95+LshzbXnGg=="], } } diff --git a/frontend/package.json b/frontend/package.json index ab8328e..2e49281 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -43,7 +43,7 @@ "@angular/cli": "^19.2.5", "@angular/compiler-cli": "^19.0.0", "@types/jasmine": "~5.1.0", - "angular-eslint": "19.3.0", + "angular-eslint": "19.4.0", "eslint": "^9.25.1", "jasmine-core": "~5.7.0", "karma": "~6.4.0", @@ -53,6 +53,6 @@ "karma-jasmine-html-reporter": "~2.1.0", "prettier": "^3.4.2", "typescript": "~5.8.0", - "typescript-eslint": "8.32.0" + "typescript-eslint": "8.32.1" } } From 110dacb6ddae651154c3c2626734a54fce31bb79 Mon Sep 17 00:00:00 2001 From: Constantin Simonis Date: Wed, 7 May 2025 18:11:54 +0200 Subject: [PATCH 005/225] feat(email): add email service and configuration for sending emails --- backend/build.gradle.kts | 1 + .../de/szut/casino/CasinoApplication.java | 9 ++++ .../szut/casino/health/HealthController.java | 12 +++++ .../casino/security/service/EmailService.java | 48 +++++++++++++++++++ .../casino/security/service/MailConfig.java | 25 ++++++++++ .../src/main/resources/application.properties | 8 ++++ compose.yml | 12 ++++- 7 files changed, 114 insertions(+), 1 deletion(-) create mode 100644 backend/src/main/java/de/szut/casino/security/service/EmailService.java create mode 100644 backend/src/main/java/de/szut/casino/security/service/MailConfig.java diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index a0b6899..2c735c4 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -54,6 +54,7 @@ dependencies { implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") + compileOnly("org.springframework.boot:spring-boot-starter-mail") } tasks.withType { diff --git a/backend/src/main/java/de/szut/casino/CasinoApplication.java b/backend/src/main/java/de/szut/casino/CasinoApplication.java index 2818f23..9a5db34 100644 --- a/backend/src/main/java/de/szut/casino/CasinoApplication.java +++ b/backend/src/main/java/de/szut/casino/CasinoApplication.java @@ -8,6 +8,10 @@ import org.springframework.boot.CommandLineRunner; import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.Bean; +import org.springframework.mail.MailException; +import org.springframework.mail.MailSender; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSenderImpl; import org.springframework.web.client.RestTemplate; import java.math.BigDecimal; @@ -26,6 +30,11 @@ public class CasinoApplication { return new RestTemplate(); } + @Bean + public static JavaMailSenderImpl javaMailSenderImpl() { + return new JavaMailSenderImpl(); + } + @Bean public CommandLineRunner initData(LootBoxRepository lootBoxRepository, RewardRepository rewardRepository) { return _ -> { diff --git a/backend/src/main/java/de/szut/casino/health/HealthController.java b/backend/src/main/java/de/szut/casino/health/HealthController.java index da05352..dbe873e 100644 --- a/backend/src/main/java/de/szut/casino/health/HealthController.java +++ b/backend/src/main/java/de/szut/casino/health/HealthController.java @@ -1,5 +1,8 @@ package de.szut.casino.health; +import de.szut.casino.security.service.EmailService; +import de.szut.casino.user.UserEntity; +import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -8,8 +11,17 @@ import java.util.Map; @RestController public class HealthController { + @Autowired + private EmailService emailService; + @GetMapping("/health") public Map healthCheck() { + UserEntity user = new UserEntity(); + user.setEmail("user@mail.com"); + user.setUsername("user"); + + this.emailService.sendRegistrationEmail(user); + return Map.of("status", "UP"); } } diff --git a/backend/src/main/java/de/szut/casino/security/service/EmailService.java b/backend/src/main/java/de/szut/casino/security/service/EmailService.java new file mode 100644 index 0000000..31ad65b --- /dev/null +++ b/backend/src/main/java/de/szut/casino/security/service/EmailService.java @@ -0,0 +1,48 @@ +package de.szut.casino.security.service; + +import de.szut.casino.user.UserEntity; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Value; +import org.springframework.mail.SimpleMailMessage; +import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.stereotype.Service; + +import java.util.List; + +@Service +public class EmailService { + private JavaMailSenderImpl mailSender; + + private MailConfig mailConfig; + + public EmailService(JavaMailSenderImpl mailSender, MailConfig mailConfig) { + try { + this.mailSender = mailSender; + this.mailConfig = mailConfig; + this.mailSender.setHost(mailConfig.host); + this.mailSender.setPort(mailConfig.port); + if (mailConfig.authenticationEnabled) { + this.mailSender.setUsername(mailConfig.username); + this.mailSender.setPassword(mailConfig.password); + } + } catch (Exception e) { + System.out.println(e.getMessage()); + } + } + + public void sendRegistrationEmail(UserEntity user) { + String body = "Hallo " + user.getUsername() + ",\n\nA Willkommen bei Trustworthy Casino©! Wir freuen uns, Sie an Bord zu haben.\n\n"; + SimpleMailMessage mail = new SimpleMailMessage(); + + mail.setFrom(mailConfig.fromAddress); + mail.setSubject("Willkommen bei Trustworthy Casino©"); + mail.setTo(user.getEmail()); + mail.setText(body); + + sendEmail(mail); + } + + private void sendEmail(SimpleMailMessage mail) { + this.mailSender.send(mail); + } +} diff --git a/backend/src/main/java/de/szut/casino/security/service/MailConfig.java b/backend/src/main/java/de/szut/casino/security/service/MailConfig.java new file mode 100644 index 0000000..56c7250 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/security/service/MailConfig.java @@ -0,0 +1,25 @@ +package de.szut.casino.security.service; + +import org.springframework.beans.factory.annotation.Value; +import org.springframework.stereotype.Service; + +@Service +public class MailConfig { + @Value("${app.mail.host}") + public String host; + + @Value("${app.mail.port}") + public Integer port; + + @Value("${app.mail.authentication}") + public Boolean authenticationEnabled; + + @Value("${app.mail.username}") + public String username; + + @Value("${app.mail.password}") + public String password; + + @Value("${app.mail.from-address}") + public String fromAddress; +} diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index 0d18cfd..0eaca18 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -5,8 +5,16 @@ server.port=${HTTP_PORT:8080} spring.jpa.hibernate.ddl-auto=update stripe.secret.key=${STRIPE_SECRET_KEY:sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I} stripe.webhook.secret=${STRIPE_WEBHOOK_SECRET:whsec_746b6a488665f6057118bdb4a2b32f4916f16c277109eeaed5e8f8e8b81b8c15} + app.frontend-host=${FE_URL:http://localhost:4200} +app.mail.authentication=${MAIL_AUTHENTICATION:false} +app.mail.host=${MAIL_HOST:localhost} +app.mail.port=${MAIL_PORT:1025} +app.mail.username=${MAIL_USER:null} +app.mail.password=${MAIL_PASS:null} +app.mail.from-address=${MAIL_FROM:casino@localhost} + spring.application.name=casino # JWT Configuration diff --git a/compose.yml b/compose.yml index 5e53cc6..88cf628 100644 --- a/compose.yml +++ b/compose.yml @@ -15,4 +15,14 @@ services: healthcheck: test: "exit 0" ports: - - "5432:5432" \ No newline at end of file + - "5432:5432" + mailpit: + image: axllent/mailpit + container_name: casino-mailpit + restart: unless-stopped + ports: + - 8025:8025 + - 1025:1025 + environment: + MP_SMTP_AUTH_ACCEPT_ANY: 1 + MP_SMTP_AUTH_ALLOW_INSECURE: 1 From 13b344312704a5fe2eba9bd22f4812545c76aa6c Mon Sep 17 00:00:00 2001 From: csimonis Date: Thu, 8 May 2025 15:39:02 +0200 Subject: [PATCH 006/225] chore: crazy ahh email template and styles --- .../casino/security/service/EmailService.java | 49 +++++-- .../templates/email/registration.html | 129 ++++++++++++++++++ 2 files changed, 163 insertions(+), 15 deletions(-) create mode 100644 backend/src/main/resources/templates/email/registration.html diff --git a/backend/src/main/java/de/szut/casino/security/service/EmailService.java b/backend/src/main/java/de/szut/casino/security/service/EmailService.java index 31ad65b..9d39134 100644 --- a/backend/src/main/java/de/szut/casino/security/service/EmailService.java +++ b/backend/src/main/java/de/szut/casino/security/service/EmailService.java @@ -1,19 +1,26 @@ package de.szut.casino.security.service; import de.szut.casino.user.UserEntity; -import org.springframework.beans.factory.annotation.Autowired; +import jakarta.mail.MessagingException; +import jakarta.mail.internet.MimeMessage; import org.springframework.beans.factory.annotation.Value; -import org.springframework.mail.SimpleMailMessage; +import org.springframework.core.io.ClassPathResource; import org.springframework.mail.javamail.JavaMailSenderImpl; +import org.springframework.mail.javamail.MimeMessageHelper; import org.springframework.stereotype.Service; +import org.springframework.util.FileCopyUtils; -import java.util.List; +import java.io.IOException; +import java.io.InputStreamReader; +import java.io.Reader; +import java.nio.charset.StandardCharsets; @Service public class EmailService { private JavaMailSenderImpl mailSender; - private MailConfig mailConfig; + @Value("${app.frontend-host}") + private String feUrl; public EmailService(JavaMailSenderImpl mailSender, MailConfig mailConfig) { try { @@ -31,18 +38,30 @@ public class EmailService { } public void sendRegistrationEmail(UserEntity user) { - String body = "Hallo " + user.getUsername() + ",\n\nA Willkommen bei Trustworthy Casino©! Wir freuen uns, Sie an Bord zu haben.\n\n"; - SimpleMailMessage mail = new SimpleMailMessage(); + try { + String template = loadTemplate("email/registration.html"); + String htmlContent = template + .replace("${username}", user.getUsername()) + .replace("${feUrl}", feUrl); - mail.setFrom(mailConfig.fromAddress); - mail.setSubject("Willkommen bei Trustworthy Casino©"); - mail.setTo(user.getEmail()); - mail.setText(body); - - sendEmail(mail); + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setFrom(mailConfig.fromAddress); + helper.setTo(user.getEmail()); + helper.setSubject("Willkommen bei Trustworthy Casino©"); + helper.setText(htmlContent, true); + + mailSender.send(message); + } catch (MessagingException | IOException e) { + System.err.println("Failed to send registration email: " + e.getMessage()); + } } - - private void sendEmail(SimpleMailMessage mail) { - this.mailSender.send(mail); + + private String loadTemplate(String templatePath) throws IOException { + ClassPathResource resource = new ClassPathResource("templates/" + templatePath); + try (Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)) { + return FileCopyUtils.copyToString(reader); + } } } diff --git a/backend/src/main/resources/templates/email/registration.html b/backend/src/main/resources/templates/email/registration.html new file mode 100644 index 0000000..27fe15a --- /dev/null +++ b/backend/src/main/resources/templates/email/registration.html @@ -0,0 +1,129 @@ + + + + + + Willkommen bei Trustworthy Casino© + + + +
+
+

Trustworthy Casino©

+
+
+

Hallo ${username},

+ +

Herzlich willkommen bei Trustworthy Casino©! Wir freuen uns, Sie an Bord zu haben.

+ +
+ +

Bei uns erwarten Sie:

+
    +
  • Spannende Casino-Spiele
  • +
  • Sichere Transaktionen
  • +
  • Exklusive Boni und Aktionen
  • +
+ +
+ +

Melden Sie sich jetzt an und beginnen Sie Ihr Spielerlebnis!

+ + + +

Bei Fragen stehen wir Ihnen jederzeit zur Verfügung.

+ +

Mit freundlichen Grüßen,
+ Ihr Trustworthy Casino© Team

+
+ +
+ + \ No newline at end of file From e6c34ffe90ff632ce99968cde9eaa80a6984b5af Mon Sep 17 00:00:00 2001 From: csimonis Date: Wed, 14 May 2025 08:39:05 +0200 Subject: [PATCH 007/225] feat(email): update registration email template to welcome email --- .../de/szut/casino/security/service/EmailService.java | 2 +- .../email/{registration.html => welcome.html} | 11 +++++------ 2 files changed, 6 insertions(+), 7 deletions(-) rename backend/src/main/resources/templates/email/{registration.html => welcome.html} (90%) diff --git a/backend/src/main/java/de/szut/casino/security/service/EmailService.java b/backend/src/main/java/de/szut/casino/security/service/EmailService.java index 9d39134..dba1439 100644 --- a/backend/src/main/java/de/szut/casino/security/service/EmailService.java +++ b/backend/src/main/java/de/szut/casino/security/service/EmailService.java @@ -39,7 +39,7 @@ public class EmailService { public void sendRegistrationEmail(UserEntity user) { try { - String template = loadTemplate("email/registration.html"); + String template = loadTemplate("email/welcome.html"); String htmlContent = template .replace("${username}", user.getUsername()) .replace("${feUrl}", feUrl); diff --git a/backend/src/main/resources/templates/email/registration.html b/backend/src/main/resources/templates/email/welcome.html similarity index 90% rename from backend/src/main/resources/templates/email/registration.html rename to backend/src/main/resources/templates/email/welcome.html index 27fe15a..2a10134 100644 --- a/backend/src/main/resources/templates/email/registration.html +++ b/backend/src/main/resources/templates/email/welcome.html @@ -59,7 +59,6 @@ } h2 { color: #ffffff; - border-bottom: 2px solid #34d399; padding-bottom: 10px; display: inline-block; } @@ -75,7 +74,7 @@ color: #34d399; } .highlight { - color: #fbbf24; + color: #10b981; font-weight: bold; } .divider { @@ -91,12 +90,12 @@
-

Trustworthy Casino©

+

Trustworthy Casino

Hallo ${username},

-

Herzlich willkommen bei Trustworthy Casino©! Wir freuen uns, Sie an Bord zu haben.

+

Herzlich willkommen bei Trustworthy Casino! Wir freuen uns, Sie an Bord zu haben.

@@ -118,10 +117,10 @@

Bei Fragen stehen wir Ihnen jederzeit zur Verfügung.

Mit freundlichen Grüßen,
- Ihr Trustworthy Casino© Team

+ Ihr Trustworthy Casino Team

From 73710a15423883219a90dad24020c4b2cc7c583a Mon Sep 17 00:00:00 2001 From: csimonis Date: Wed, 14 May 2025 08:44:37 +0200 Subject: [PATCH 008/225] feat: whoops --- .../szut/casino/health/HealthController.java | 12 ----- .../szut/casino/security/AuthController.java | 5 +- .../casino/security/service/AuthService.java | 11 +++- .../casino/security/service/EmailService.java | 52 ++++++++----------- 4 files changed, 36 insertions(+), 44 deletions(-) diff --git a/backend/src/main/java/de/szut/casino/health/HealthController.java b/backend/src/main/java/de/szut/casino/health/HealthController.java index dbe873e..da05352 100644 --- a/backend/src/main/java/de/szut/casino/health/HealthController.java +++ b/backend/src/main/java/de/szut/casino/health/HealthController.java @@ -1,8 +1,5 @@ package de.szut.casino.health; -import de.szut.casino.security.service.EmailService; -import de.szut.casino.user.UserEntity; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RestController; @@ -11,17 +8,8 @@ import java.util.Map; @RestController public class HealthController { - @Autowired - private EmailService emailService; - @GetMapping("/health") public Map healthCheck() { - UserEntity user = new UserEntity(); - user.setEmail("user@mail.com"); - user.setUsername("user"); - - this.emailService.sendRegistrationEmail(user); - return Map.of("status", "UP"); } } diff --git a/backend/src/main/java/de/szut/casino/security/AuthController.java b/backend/src/main/java/de/szut/casino/security/AuthController.java index b5c0639..6d99625 100644 --- a/backend/src/main/java/de/szut/casino/security/AuthController.java +++ b/backend/src/main/java/de/szut/casino/security/AuthController.java @@ -5,6 +5,7 @@ import de.szut.casino.security.dto.LoginRequestDto; import de.szut.casino.security.service.AuthService; import de.szut.casino.user.dto.CreateUserDto; import de.szut.casino.user.dto.GetUserDto; +import jakarta.mail.MessagingException; import jakarta.validation.Valid; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.http.ResponseEntity; @@ -13,6 +14,8 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; + @RestController @RequestMapping("/auth") public class AuthController { @@ -27,7 +30,7 @@ public class AuthController { } @PostMapping("/register") - public ResponseEntity registerUser(@Valid @RequestBody CreateUserDto signUpRequest) { + public ResponseEntity registerUser(@Valid @RequestBody CreateUserDto signUpRequest) throws MessagingException, IOException { GetUserDto response = authService.register(signUpRequest); return ResponseEntity.ok(response); } diff --git a/backend/src/main/java/de/szut/casino/security/service/AuthService.java b/backend/src/main/java/de/szut/casino/security/service/AuthService.java index 88687ba..ed2b70c 100644 --- a/backend/src/main/java/de/szut/casino/security/service/AuthService.java +++ b/backend/src/main/java/de/szut/casino/security/service/AuthService.java @@ -7,6 +7,7 @@ import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserService; import de.szut.casino.user.dto.CreateUserDto; import de.szut.casino.user.dto.GetUserDto; +import jakarta.mail.MessagingException; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.security.authentication.AuthenticationManager; import org.springframework.security.authentication.UsernamePasswordAuthenticationToken; @@ -14,6 +15,8 @@ import org.springframework.security.core.Authentication; import org.springframework.security.core.context.SecurityContextHolder; import org.springframework.stereotype.Service; +import java.io.IOException; + @Service public class AuthService { @@ -26,6 +29,9 @@ public class AuthService { @Autowired private UserService userService; + @Autowired + private EmailService emailService; + public AuthResponseDto login(LoginRequestDto loginRequest) { Authentication authentication = authenticationManager.authenticate( new UsernamePasswordAuthenticationToken( @@ -38,8 +44,11 @@ public class AuthService { return new AuthResponseDto(jwt); } - public GetUserDto register(CreateUserDto signUpRequest) { + public GetUserDto register(CreateUserDto signUpRequest) throws MessagingException, IOException { UserEntity user = userService.createUser(signUpRequest); + + this.emailService.sendRegistrationEmail(user); + return new GetUserDto( user.getId(), user.getEmail(), diff --git a/backend/src/main/java/de/szut/casino/security/service/EmailService.java b/backend/src/main/java/de/szut/casino/security/service/EmailService.java index dba1439..fb875b8 100644 --- a/backend/src/main/java/de/szut/casino/security/service/EmailService.java +++ b/backend/src/main/java/de/szut/casino/security/service/EmailService.java @@ -23,41 +23,33 @@ public class EmailService { private String feUrl; public EmailService(JavaMailSenderImpl mailSender, MailConfig mailConfig) { - try { - this.mailSender = mailSender; - this.mailConfig = mailConfig; - this.mailSender.setHost(mailConfig.host); - this.mailSender.setPort(mailConfig.port); - if (mailConfig.authenticationEnabled) { - this.mailSender.setUsername(mailConfig.username); - this.mailSender.setPassword(mailConfig.password); - } - } catch (Exception e) { - System.out.println(e.getMessage()); + this.mailSender = mailSender; + this.mailConfig = mailConfig; + this.mailSender.setHost(mailConfig.host); + this.mailSender.setPort(mailConfig.port); + if (mailConfig.authenticationEnabled) { + this.mailSender.setUsername(mailConfig.username); + this.mailSender.setPassword(mailConfig.password); } } - public void sendRegistrationEmail(UserEntity user) { - try { - String template = loadTemplate("email/welcome.html"); - String htmlContent = template - .replace("${username}", user.getUsername()) - .replace("${feUrl}", feUrl); + public void sendRegistrationEmail(UserEntity user) throws IOException, MessagingException { + String template = loadTemplate("email/welcome.html"); + String htmlContent = template + .replace("${username}", user.getUsername()) + .replace("${feUrl}", feUrl); - MimeMessage message = mailSender.createMimeMessage(); - MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); - - helper.setFrom(mailConfig.fromAddress); - helper.setTo(user.getEmail()); - helper.setSubject("Willkommen bei Trustworthy Casino©"); - helper.setText(htmlContent, true); - - mailSender.send(message); - } catch (MessagingException | IOException e) { - System.err.println("Failed to send registration email: " + e.getMessage()); - } + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setFrom(mailConfig.fromAddress); + helper.setTo(user.getEmail()); + helper.setSubject("Willkommen bei Trustworthy Casino©"); + helper.setText(htmlContent, true); + + mailSender.send(message); } - + private String loadTemplate(String templatePath) throws IOException { ClassPathResource resource = new ClassPathResource("templates/" + templatePath); try (Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)) { From 893939a081dc989e30c8d77e94a675b5048857fc Mon Sep 17 00:00:00 2001 From: Jan-Marlon Leibl Date: Wed, 14 May 2025 08:55:44 +0200 Subject: [PATCH 009/225] fix: update starting balance and welcome bonus text --- backend/src/main/java/de/szut/casino/user/UserService.java | 2 +- frontend/src/app/feature/landing/landing.component.html | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/backend/src/main/java/de/szut/casino/user/UserService.java b/backend/src/main/java/de/szut/casino/user/UserService.java index 66f2d52..f74bff9 100644 --- a/backend/src/main/java/de/szut/casino/user/UserService.java +++ b/backend/src/main/java/de/szut/casino/user/UserService.java @@ -30,7 +30,7 @@ public class UserService { createUserDto.getEmail(), createUserDto.getUsername(), passwordEncoder.encode(createUserDto.getPassword()), - BigDecimal.valueOf(10) // Starting balance + BigDecimal.valueOf(100) // Starting balance ); return userRepository.save(user); diff --git a/frontend/src/app/feature/landing/landing.component.html b/frontend/src/app/feature/landing/landing.component.html index 1e5627d..111a0dc 100644 --- a/frontend/src/app/feature/landing/landing.component.html +++ b/frontend/src/app/feature/landing/landing.component.html @@ -7,8 +7,8 @@

Willkommensbonus

-
200% bis zu 500€
-

+ 200 Freispiele

+
von bis zu €100
+

Fangen Sie an, zu gewinnen!

@if (authService.isLoggedIn()) { From 961f3b7ec5bf5b5b2966e140201cf7728f056885 Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Wed, 14 May 2025 08:59:56 +0200 Subject: [PATCH 010/225] feat: import mailer during runtime and compiling, remove duplicated games section --- backend/build.gradle.kts | 2 +- .../src/app/feature/home/home.component.html | 29 +------------------ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 2c735c4..8328cf7 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") - compileOnly("org.springframework.boot:spring-boot-starter-mail") + implementation("org.springframework.boot:spring-boot-starter-mail") } tasks.withType { diff --git a/frontend/src/app/feature/home/home.component.html b/frontend/src/app/feature/home/home.component.html index dc8ee59..73a67e8 100644 --- a/frontend/src/app/feature/home/home.component.html +++ b/frontend/src/app/feature/home/home.component.html @@ -7,7 +7,7 @@
-

Beliebte Spiele

+

Alle Spiele

- -
-

Alle Spiele

-
-
-
- -
-
-

{{ game.name }}

- -
-
-
-
-
-
From aca65a397dfae639f62cc48a75ab3a3ddb927d53 Mon Sep 17 00:00:00 2001 From: jank Date: Wed, 14 May 2025 08:41:56 +0200 Subject: [PATCH 011/225] fix: Fix buttons on starting page --- frontend/src/app/feature/landing/landing.component.html | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/frontend/src/app/feature/landing/landing.component.html b/frontend/src/app/feature/landing/landing.component.html index 111a0dc..f81c75f 100644 --- a/frontend/src/app/feature/landing/landing.component.html +++ b/frontend/src/app/feature/landing/landing.component.html @@ -48,7 +48,7 @@

Slots

Klassische Spielautomaten

- + Jetzt Spielen
@@ -62,7 +62,7 @@

Blackjack

Klassisches Kartenspiel

- + Jetzt Spielen
@@ -86,7 +86,7 @@

Lootboxen

Überraschungskisten

- + Jetzt Spielen
From 565d31db1ed9089b1418d235e5231fc84bb6737d Mon Sep 17 00:00:00 2001 From: jank Date: Wed, 14 May 2025 09:13:50 +0200 Subject: [PATCH 012/225] fix: prettier --- frontend/src/app/feature/landing/landing.component.html | 8 ++++++-- 1 file changed, 6 insertions(+), 2 deletions(-) diff --git a/frontend/src/app/feature/landing/landing.component.html b/frontend/src/app/feature/landing/landing.component.html index f81c75f..5a942b0 100644 --- a/frontend/src/app/feature/landing/landing.component.html +++ b/frontend/src/app/feature/landing/landing.component.html @@ -62,7 +62,9 @@

Blackjack

Klassisches Kartenspiel

- Jetzt Spielen + Jetzt Spielen
@@ -86,7 +88,9 @@

Lootboxen

Überraschungskisten

- Jetzt Spielen + Jetzt Spielen
From 0a0c801716dba38344f5d5a519310695689b078a Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Wed, 14 May 2025 08:59:56 +0200 Subject: [PATCH 013/225] feat: import mailer during runtime and compiling, remove duplicated games section --- backend/build.gradle.kts | 2 +- .../src/app/feature/home/home.component.html | 29 +------------------ 2 files changed, 2 insertions(+), 29 deletions(-) diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index 2c735c4..8328cf7 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -54,7 +54,7 @@ dependencies { implementation("io.jsonwebtoken:jjwt-api:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-impl:0.11.5") runtimeOnly("io.jsonwebtoken:jjwt-jackson:0.11.5") - compileOnly("org.springframework.boot:spring-boot-starter-mail") + implementation("org.springframework.boot:spring-boot-starter-mail") } tasks.withType { diff --git a/frontend/src/app/feature/home/home.component.html b/frontend/src/app/feature/home/home.component.html index dc8ee59..73a67e8 100644 --- a/frontend/src/app/feature/home/home.component.html +++ b/frontend/src/app/feature/home/home.component.html @@ -7,7 +7,7 @@
-

Beliebte Spiele

+

Alle Spiele

- -
-

Alle Spiele

-
-
-
- -
-
-

{{ game.name }}

- -
-
-
-
-
-
From 98bc3cc2cad65e19293d4762a180f75322aa5e62 Mon Sep 17 00:00:00 2001 From: Jan-Marlon Leibl Date: Wed, 14 May 2025 09:14:38 +0200 Subject: [PATCH 014/225] style(landing): update button to inline-block text-center --- .../app/feature/landing/landing.component.html | 16 ++++++---------- 1 file changed, 6 insertions(+), 10 deletions(-) diff --git a/frontend/src/app/feature/landing/landing.component.html b/frontend/src/app/feature/landing/landing.component.html index 5a942b0..6b7ee97 100644 --- a/frontend/src/app/feature/landing/landing.component.html +++ b/frontend/src/app/feature/landing/landing.component.html @@ -48,23 +48,21 @@

Slots

Klassische Spielautomaten

- Jetzt Spielen + Jetzt Spielen

Plinko

Spannendes Geschicklichkeitsspiel

- + Jetzt Spielen
@@ -74,23 +72,21 @@

Poker

Texas Hold'em & mehr

- + Jetzt Spielen

Liars Dice

Würfelspiel mit Strategie

- + Jetzt Spielen
From b2ceb8e9af9f02d234ad5ca13bc072032bfecdd9 Mon Sep 17 00:00:00 2001 From: Jan-Marlon Leibl Date: Wed, 14 May 2025 09:16:04 +0200 Subject: [PATCH 015/225] style(landing): format HTML links for better readability --- .../feature/landing/landing.component.html | 36 +++++++++++++++---- 1 file changed, 30 insertions(+), 6 deletions(-) diff --git a/frontend/src/app/feature/landing/landing.component.html b/frontend/src/app/feature/landing/landing.component.html index 6b7ee97..b064e28 100644 --- a/frontend/src/app/feature/landing/landing.component.html +++ b/frontend/src/app/feature/landing/landing.component.html @@ -48,21 +48,33 @@

Slots

Klassische Spielautomaten

- Jetzt Spielen + Jetzt Spielen

Plinko

Spannendes Geschicklichkeitsspiel

- Jetzt Spielen + Jetzt Spielen
@@ -72,21 +84,33 @@

Poker

Texas Hold'em & mehr

- Jetzt Spielen + Jetzt Spielen

Liars Dice

Würfelspiel mit Strategie

- Jetzt Spielen + Jetzt Spielen
From 7fbe1c375367494635ccbc3dff1e1619e1189fd8 Mon Sep 17 00:00:00 2001 From: csimonis Date: Wed, 14 May 2025 09:22:15 +0200 Subject: [PATCH 016/225] feat(email): add deposit confirmation email template and logic --- .../casino/deposit/TransactionService.java | 10 +- .../casino/deposit/WebhookController.java | 4 +- .../casino/security/service/EmailService.java | 22 ++- .../java/de/szut/casino/user/UserEntity.java | 4 + .../resources/templates/email/deposit.html | 136 ++++++++++++++++++ 5 files changed, 172 insertions(+), 4 deletions(-) create mode 100644 backend/src/main/resources/templates/email/deposit.html diff --git a/backend/src/main/java/de/szut/casino/deposit/TransactionService.java b/backend/src/main/java/de/szut/casino/deposit/TransactionService.java index fceb27b..26f2e25 100644 --- a/backend/src/main/java/de/szut/casino/deposit/TransactionService.java +++ b/backend/src/main/java/de/szut/casino/deposit/TransactionService.java @@ -3,10 +3,13 @@ package de.szut.casino.deposit; import com.stripe.exception.StripeException; import com.stripe.model.checkout.Session; import com.stripe.param.checkout.SessionRetrieveParams; +import de.szut.casino.security.service.EmailService; import de.szut.casino.user.UserEntity; import de.szut.casino.user.UserRepository; +import jakarta.mail.MessagingException; import org.springframework.stereotype.Service; +import java.io.IOException; import java.math.BigDecimal; import java.util.Optional; @@ -14,10 +17,12 @@ import java.util.Optional; public class TransactionService { private final TransactionRepository transactionRepository; private final UserRepository userRepository; + private final EmailService emailService; - public TransactionService(TransactionRepository transactionRepository, UserRepository userRepository) { + public TransactionService(TransactionRepository transactionRepository, UserRepository userRepository, EmailService emailService) { this.transactionRepository = transactionRepository; this.userRepository = userRepository; + this.emailService = emailService; } public void createTransaction( @@ -34,7 +39,7 @@ public class TransactionService { transactionRepository.save(transaction); } - public void fulfillCheckout(String sessionID) throws StripeException { + public void fulfillCheckout(String sessionID) throws StripeException, MessagingException, IOException { SessionRetrieveParams params = SessionRetrieveParams.builder() .addExpand("line_items") .build(); @@ -60,5 +65,6 @@ public class TransactionService { userRepository.save(user); transactionRepository.save(transaction); + emailService.sendDepositEmail(transaction); } } diff --git a/backend/src/main/java/de/szut/casino/deposit/WebhookController.java b/backend/src/main/java/de/szut/casino/deposit/WebhookController.java index dba9041..45ba4c1 100644 --- a/backend/src/main/java/de/szut/casino/deposit/WebhookController.java +++ b/backend/src/main/java/de/szut/casino/deposit/WebhookController.java @@ -6,6 +6,7 @@ import com.stripe.model.Event; import com.stripe.model.checkout.Session; import com.stripe.net.Webhook; import jakarta.annotation.PostConstruct; +import jakarta.mail.MessagingException; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.annotation.Value; @@ -15,6 +16,7 @@ import org.springframework.web.bind.annotation.RequestBody; import org.springframework.web.bind.annotation.RequestHeader; import org.springframework.web.bind.annotation.RestController; +import java.io.IOException; import java.util.Objects; @RestController @@ -38,7 +40,7 @@ public class WebhookController { } @PostMapping("/webhook") - public ResponseEntity webhook(@RequestBody String payload, @RequestHeader("Stripe-Signature") String sigHeader) throws StripeException { + public ResponseEntity webhook(@RequestBody String payload, @RequestHeader("Stripe-Signature") String sigHeader) throws StripeException, MessagingException, IOException { Event event = Webhook.constructEvent(payload, sigHeader, webhookSecret); if (Objects.equals(event.getType(), "checkout.session.completed") || Objects.equals(event.getType(), "checkout.session.async_payment_succeeded")) { diff --git a/backend/src/main/java/de/szut/casino/security/service/EmailService.java b/backend/src/main/java/de/szut/casino/security/service/EmailService.java index fb875b8..861a0c2 100644 --- a/backend/src/main/java/de/szut/casino/security/service/EmailService.java +++ b/backend/src/main/java/de/szut/casino/security/service/EmailService.java @@ -1,5 +1,6 @@ package de.szut.casino.security.service; +import de.szut.casino.deposit.TransactionEntity; import de.szut.casino.user.UserEntity; import jakarta.mail.MessagingException; import jakarta.mail.internet.MimeMessage; @@ -14,6 +15,7 @@ import java.io.IOException; import java.io.InputStreamReader; import java.io.Reader; import java.nio.charset.StandardCharsets; +import java.util.List; @Service public class EmailService { @@ -43,13 +45,31 @@ public class EmailService { MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); helper.setFrom(mailConfig.fromAddress); - helper.setTo(user.getEmail()); + helper.setTo(user.getEmailAddress()); helper.setSubject("Willkommen bei Trustworthy Casino©"); helper.setText(htmlContent, true); mailSender.send(message); } + public void sendDepositEmail(TransactionEntity transaction) throws IOException, MessagingException { + String template = loadTemplate("email/deposit.html"); + String htmlContent = template + .replace("${username}", transaction.getUser().getUsername()) + .replace("${amount}", String.valueOf(transaction.getAmount())) + .replace("${feUrl}", feUrl); + + MimeMessage message = mailSender.createMimeMessage(); + MimeMessageHelper helper = new MimeMessageHelper(message, true, "UTF-8"); + + helper.setFrom(mailConfig.fromAddress); + helper.setTo(transaction.getUser().getEmailAddress()); + helper.setSubject("Einzahlung über ${amount}€ Erfolgreich".replace("${amount}", String.valueOf(transaction.getAmount()))); + helper.setText(htmlContent, true); + + mailSender.send(message); + } + private String loadTemplate(String templatePath) throws IOException { ClassPathResource resource = new ClassPathResource("templates/" + templatePath); try (Reader reader = new InputStreamReader(resource.getInputStream(), StandardCharsets.UTF_8)) { diff --git a/backend/src/main/java/de/szut/casino/user/UserEntity.java b/backend/src/main/java/de/szut/casino/user/UserEntity.java index 913e69d..270d178 100644 --- a/backend/src/main/java/de/szut/casino/user/UserEntity.java +++ b/backend/src/main/java/de/szut/casino/user/UserEntity.java @@ -64,4 +64,8 @@ public class UserEntity { this.balance = this.balance.subtract(amountToSubtract); } + + public String getEmailAddress() { + return "${name} <${email}>".replace("${name}", this.username).replace("${email}", this.email); + } } diff --git a/backend/src/main/resources/templates/email/deposit.html b/backend/src/main/resources/templates/email/deposit.html new file mode 100644 index 0000000..632d7ab --- /dev/null +++ b/backend/src/main/resources/templates/email/deposit.html @@ -0,0 +1,136 @@ + + + + + + Einzahlung bestätigt - Trustworthy Casino© + + + +
+
+

Trustworthy Casino

+
+
+

Hallo ${username},

+ +

vielen Dank für Ihre Einzahlung bei Trustworthy Casino. Wir bestätigen den Eingang Ihres Guthabens.

+ +
+

Eingezahlter Betrag

+
${amount}€
+
+ +
+ +

Ihr Guthaben wurde Ihrem Konto sofort gutgeschrieben und steht ab sofort zum Spielen zur Verfügung.

+ + + +

Bei Fragen zu Ihrer Einzahlung kontaktieren Sie bitte unseren Kundenservice.

+ +

Mit freundlichen Grüßen,
+ Ihr Trustworthy Casino Team

+
+ +
+ + \ No newline at end of file From 45313989e702de9a61952acc742eb3e3b51441a8 Mon Sep 17 00:00:00 2001 From: jank Date: Wed, 14 May 2025 09:21:23 +0200 Subject: [PATCH 017/225] fix: only run docker pipelines when needed --- .gitea/workflows/ci.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.gitea/workflows/ci.yml b/.gitea/workflows/ci.yml index 50742f0..e33246b 100644 --- a/.gitea/workflows/ci.yml +++ b/.gitea/workflows/ci.yml @@ -77,6 +77,7 @@ jobs: validate-docker-frontend: runs-on: ubuntu-latest name: Docker frontend validation + if: ${{ needs.changed_files.outputs.frontend == 'true' || needs.changed_files.outputs.workflow == 'true' }} container: image: catthehacker/ubuntu:act-latest steps: @@ -92,6 +93,7 @@ jobs: validate-docker-backend: runs-on: ubuntu-latest name: Docker backend validation + if: ${{ needs.changed_files.outputs.backend == 'true' || needs.changed_files.outputs.workflow == 'true' }} container: image: catthehacker/ubuntu:act-latest steps: From 34ff29c7ac409513414bea4586c768d694710be4 Mon Sep 17 00:00:00 2001 From: Phan Huy Tran Date: Wed, 14 May 2025 09:33:38 +0200 Subject: [PATCH 018/225] refactor: remove docker folder, refactor frontend files --- docker/docker-compose.yml | 18 -------- frontend/src/app/app.component.html | 1 + frontend/src/app/app.component.ts | 3 +- frontend/src/app/auth.guard.ts | 2 +- .../feature/auth/login/login.component.html | 2 - .../app/feature/auth/login/login.component.ts | 15 +++---- .../auth/register/register.component.html | 2 - .../auth/register/register.component.ts | 15 +++---- .../app/feature/deposit/deposit.component.ts | 14 +++--- .../game/blackjack/blackjack.component.html | 2 - .../game/blackjack/blackjack.component.ts | 34 +++++++-------- .../feature/game/slots/slots.component.html | 2 - .../app/feature/game/slots/slots.component.ts | 25 ++++------- .../src/app/feature/home/home.component.html | 1 - .../src/app/feature/home/home.component.ts | 22 +++++----- .../feature/landing/landing.component.html | 2 - .../app/feature/landing/landing.component.ts | 11 +++-- .../login-success/login-success.component.css | 0 .../login-success.component.html | 1 - .../login-success/login-success.component.ts | 43 ------------------- .../lootbox-opening.component.html | 2 - .../lootbox-opening.component.ts | 19 ++++---- .../lootbox-selection.component.html | 1 - .../lootbox-selection.component.ts | 21 +++++---- .../transaction-history.component.ts | 17 +++----- .../components/navbar/navbar.component.html | 8 ++-- .../components/navbar/navbar.component.ts | 3 +- 27 files changed, 94 insertions(+), 192 deletions(-) delete mode 100644 docker/docker-compose.yml delete mode 100644 frontend/src/app/feature/login-success/login-success.component.css delete mode 100644 frontend/src/app/feature/login-success/login-success.component.html delete mode 100644 frontend/src/app/feature/login-success/login-success.component.ts diff --git a/docker/docker-compose.yml b/docker/docker-compose.yml deleted file mode 100644 index 5487079..0000000 --- a/docker/docker-compose.yml +++ /dev/null @@ -1,18 +0,0 @@ -volumes: - casino-db-data: - -services: - db: - image: postgres:17.5 - container_name: casino-db - restart: unless-stopped - volumes: - - casino-db-data:/var/lib/postgresql/data - environment: - POSTGRES_DB: postgresdb - POSTGRES_USER: postgres_user - POSTGRES_PASSWORD: postgres_pass - healthcheck: - test: "exit 0" - ports: - - "5432:5432" \ No newline at end of file diff --git a/frontend/src/app/app.component.html b/frontend/src/app/app.component.html index 41260d2..2e3cd9a 100644 --- a/frontend/src/app/app.component.html +++ b/frontend/src/app/app.component.html @@ -1,5 +1,6 @@
+
diff --git a/frontend/src/app/app.component.ts b/frontend/src/app/app.component.ts index 30666e9..07aa848 100644 --- a/frontend/src/app/app.component.ts +++ b/frontend/src/app/app.component.ts @@ -2,11 +2,12 @@ import { ChangeDetectionStrategy, Component } from '@angular/core'; import { CommonModule } from '@angular/common'; import { RouterOutlet } from '@angular/router'; import { FooterComponent } from '@shared/components/footer/footer.component'; +import {NavbarComponent} from "@shared/components/navbar/navbar.component"; @Component({ selector: 'app-root', standalone: true, - imports: [CommonModule, RouterOutlet, FooterComponent], + imports: [CommonModule, RouterOutlet, FooterComponent, NavbarComponent], providers: [], templateUrl: './app.component.html', styleUrl: './app.component.css', diff --git a/frontend/src/app/auth.guard.ts b/frontend/src/app/auth.guard.ts index d088c30..ffb2526 100644 --- a/frontend/src/app/auth.guard.ts +++ b/frontend/src/app/auth.guard.ts @@ -1,6 +1,6 @@ import { CanActivateFn, Router } from '@angular/router'; import { inject } from '@angular/core'; -import { AuthService } from './service/auth.service'; +import { AuthService } from '@service/auth.service'; export const authGuard: CanActivateFn = async () => { const authService = inject(AuthService); diff --git a/frontend/src/app/feature/auth/login/login.component.html b/frontend/src/app/feature/auth/login/login.component.html index c41002d..c10b232 100644 --- a/frontend/src/app/feature/auth/login/login.component.html +++ b/frontend/src/app/feature/auth/login/login.component.html @@ -1,5 +1,3 @@ - -