diff --git a/CHANGELOG.md b/CHANGELOG.md index 3eac30a5c..77a388922 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,14 +10,19 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0 ### Added - Added a new endpoint to get all platforms (`GET api/v1/platforms`) +- Added the session url to the endpoint response of the _Stripe_ checkout ### Changed - Improved the routing of the user detail dialog in the users section of the admin control panel - Lifted the asset profile identifier editing restriction for `MANUAL` data sources in the asset profile details dialog of the admin control panel +- Deprecated the public _Stripe_ key - Improved the language localization for German (`de`) +- Eliminated `ngx-stripe` - Upgraded `angular` from version `20.2.4` to `20.3.9` +- Upgraded `marked` from version `15.0.4` to `16.4.2` - Upgraded `ng-extract-i18n-merge` from `3.1.0` to `3.2.1` +- Upgraded `ngx-markdown` from version `20.0.0` to `20.1.0` - Upgraded `Nx` from version `21.5.1` to `22.1.3` - Upgraded `shx` from version `0.3.4` to `0.4.0` - Upgraded `storybook` from version `9.1.5` to `10.1.10` diff --git a/apps/api/src/app/subscription/subscription.service.ts b/apps/api/src/app/subscription/subscription.service.ts index 0fad8c8ac..8dc7d27f1 100644 --- a/apps/api/src/app/subscription/subscription.service.ts +++ b/apps/api/src/app/subscription/subscription.service.ts @@ -100,7 +100,8 @@ export class SubscriptionService { ); return { - sessionId: session.id + sessionId: session.id, + sessionUrl: session.url }; } diff --git a/apps/client/project.json b/apps/client/project.json index c97fd85ee..09968d23f 100644 --- a/apps/client/project.json +++ b/apps/client/project.json @@ -75,7 +75,6 @@ "ngswConfigPath": "apps/client/ngsw-config.json", "optimization": false, "polyfills": "apps/client/src/polyfills.ts", - "scripts": ["node_modules/marked/lib/marked.umd.js"], "serviceWorker": true, "sourceMap": true, "styles": [ diff --git a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts index 069ea4b0e..8eec9c188 100644 --- a/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts +++ b/apps/client/src/app/components/user-account-membership/user-account-membership.component.ts @@ -21,9 +21,8 @@ import { MatCardModule } from '@angular/material/card'; import { MatSnackBar } from '@angular/material/snack-bar'; import { RouterModule } from '@angular/router'; import ms, { StringValue } from 'ms'; -import { StripeService } from 'ngx-stripe'; import { EMPTY, Subject } from 'rxjs'; -import { catchError, switchMap, takeUntil } from 'rxjs/operators'; +import { catchError, takeUntil } from 'rxjs/operators'; @Component({ changeDetection: ChangeDetectionStrategy.OnPush, @@ -62,7 +61,6 @@ export class GfUserAccountMembershipComponent implements OnDestroy { private dataService: DataService, private notificationService: NotificationService, private snackBar: MatSnackBar, - private stripeService: StripeService, private userService: UserService ) { const { baseCurrency, globalPermissions } = this.dataService.fetchInfo(); @@ -113,23 +111,17 @@ export class GfUserAccountMembershipComponent implements OnDestroy { priceId: this.priceId }) .pipe( - catchError((error) => { + catchError((error: Error) => { this.notificationService.alert({ title: error.message }); - throw error; + return EMPTY; }), - switchMap(({ sessionId }) => { - return this.stripeService.redirectToCheckout({ sessionId }); - }) + takeUntil(this.unsubscribeSubject) ) - .subscribe((result) => { - if (result.error) { - this.notificationService.alert({ - title: result.error.message - }); - } + .subscribe(({ sessionUrl }) => { + window.location.href = sessionUrl; }); } diff --git a/apps/client/src/app/pages/pricing/pricing-page.component.ts b/apps/client/src/app/pages/pricing/pricing-page.component.ts index 6ed8dfd31..aaf0c597b 100644 --- a/apps/client/src/app/pages/pricing/pricing-page.component.ts +++ b/apps/client/src/app/pages/pricing/pricing-page.component.ts @@ -27,9 +27,8 @@ import { informationCircleOutline } from 'ionicons/icons'; import { StringValue } from 'ms'; -import { StripeService } from 'ngx-stripe'; -import { Subject } from 'rxjs'; -import { catchError, switchMap, takeUntil } from 'rxjs/operators'; +import { EMPTY, Subject } from 'rxjs'; +import { catchError, takeUntil } from 'rxjs/operators'; @Component({ host: { class: 'page' }, @@ -98,7 +97,6 @@ export class GfPricingPageComponent implements OnDestroy, OnInit { private changeDetectorRef: ChangeDetectorRef, private dataService: DataService, private notificationService: NotificationService, - private stripeService: StripeService, private userService: UserService ) { addIcons({ @@ -155,23 +153,17 @@ export class GfPricingPageComponent implements OnDestroy, OnInit { priceId: this.priceId }) .pipe( - switchMap(({ sessionId }) => { - return this.stripeService.redirectToCheckout({ sessionId }); - }), - catchError((error) => { + catchError((error: Error) => { this.notificationService.alert({ title: error.message }); - throw error; - }) + return EMPTY; + }), + takeUntil(this.unsubscribeSubject) ) - .subscribe((result) => { - if (result.error) { - this.notificationService.alert({ - title: result.error.message - }); - } + .subscribe(({ sessionUrl }) => { + window.location.href = sessionUrl; }); } diff --git a/apps/client/src/main.ts b/apps/client/src/main.ts index 7fb79a78a..c15703645 100644 --- a/apps/client/src/main.ts +++ b/apps/client/src/main.ts @@ -27,7 +27,6 @@ import { ServiceWorkerModule } from '@angular/service-worker'; import { provideIonicAngular } from '@ionic/angular/standalone'; import { provideMarkdown } from 'ngx-markdown'; import { provideNgxSkeletonLoader } from 'ngx-skeleton-loader'; -import { NgxStripeModule, STRIPE_PUBLISHABLE_KEY } from 'ngx-stripe'; import { CustomDateAdapter } from './app/adapter/custom-date-adapter'; import { DateFormats } from './app/adapter/date-formats'; @@ -54,8 +53,6 @@ import { environment } from './environments/environment'; (window as any).info = info; - environment.stripePublicKey = info.stripePublicKey; - if (environment.production) { enableProdMode(); } @@ -69,7 +66,6 @@ import { environment } from './environments/environment'; MatNativeDateModule, MatSnackBarModule, MatTooltipModule, - NgxStripeModule.forRoot(environment.stripePublicKey), RouterModule.forRoot(routes, { anchorScrolling: 'enabled', preloadingStrategy: ModulePreloadService, @@ -97,10 +93,6 @@ import { environment } from './environments/environment'; provide: MAT_DATE_FORMATS, useValue: DateFormats }, - { - provide: STRIPE_PUBLISHABLE_KEY, - useFactory: () => environment.stripePublicKey - }, { provide: TitleStrategy, useClass: PageTitleStrategy diff --git a/libs/common/src/lib/interfaces/info-item.interface.ts b/libs/common/src/lib/interfaces/info-item.interface.ts index 098154a6a..c2ee54526 100644 --- a/libs/common/src/lib/interfaces/info-item.interface.ts +++ b/libs/common/src/lib/interfaces/info-item.interface.ts @@ -18,6 +18,9 @@ export interface InfoItem { platforms: Platform[]; statistics: Statistics; + + /** @deprecated */ stripePublicKey?: string; + subscriptionOffer?: SubscriptionOffer; } diff --git a/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts index 18c9e4400..1222ac6e9 100644 --- a/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts +++ b/libs/common/src/lib/interfaces/responses/create-stripe-checkout-session-response.interface.ts @@ -1,3 +1,6 @@ export interface CreateStripeCheckoutSessionResponse { + /** @deprecated */ sessionId: string; + + sessionUrl: string; } diff --git a/package-lock.json b/package-lock.json index f6b4fbf48..7e172ac9d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -41,7 +41,6 @@ "@prisma/client": "6.19.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "8.6.0", "ai": "4.3.16", "alphavantage": "2.2.0", "big.js": "7.0.1", @@ -76,7 +75,6 @@ "ngx-device-detector": "11.0.0", "ngx-markdown": "21.0.1", "ngx-skeleton-loader": "11.3.0", - "ngx-stripe": "21.8.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0", @@ -11565,15 +11563,6 @@ "storybook": "^10.1.10" } }, - "node_modules/@stripe/stripe-js": { - "version": "8.6.0", - "resolved": "https://registry.npmjs.org/@stripe/stripe-js/-/stripe-js-8.6.0.tgz", - "integrity": "sha512-EB0/GGgs4hfezzkiMkinlRgWtjz8fSdwVQhwYS7Sg/RQrSvuNOz+ssPjD+lAzqaYTCB0zlbrt0fcqVziLJrufQ==", - "license": "MIT", - "engines": { - "node": ">=12.16" - } - }, "node_modules/@swc/helpers": { "version": "0.5.17", "resolved": "https://registry.npmjs.org/@swc/helpers/-/helpers-0.5.17.tgz", @@ -25577,7 +25566,7 @@ "@angular/common": "^21.0.0", "@angular/core": "^21.0.0", "@angular/platform-browser": "^21.0.0", - "marked": "^17.0.0", + "marked": "^17.0.0 || ^16.0.0", "rxjs": "^6.5.3 || ^7.4.0", "zone.js": "~0.15.0 || ~0.16.0" } @@ -25595,20 +25584,6 @@ "@angular/core": ">=19.0.0" } }, - "node_modules/ngx-stripe": { - "version": "21.8.0", - "resolved": "https://registry.npmjs.org/ngx-stripe/-/ngx-stripe-21.8.0.tgz", - "integrity": "sha512-UfohuoqtjnFDcFdn1GzxgdIony372gIIQfXkI1znCXg5GPUqbUkguc0Hd+z5YjBTg9pPXo1aLZnsagdxiKctrw==", - "license": "MIT", - "dependencies": { - "tslib": "^2.3.0" - }, - "peerDependencies": { - "@angular/common": ">=21.0.0 <22.0.0", - "@angular/core": ">=21.0.0 <22.0.0", - "@stripe/stripe-js": ">=8.0.0 <9.0.0" - } - }, "node_modules/nice-try": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/nice-try/-/nice-try-1.0.5.tgz", @@ -28511,9 +28486,9 @@ } }, "node_modules/qs": { - "version": "6.14.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.0.tgz", - "integrity": "sha512-YWWTjgABSKcvs/nWBi9PycY/JiPJqOD4JA6o9Sej2AtvSGarXxKC3OQSk4pAarbdQlKAh5D4FCQkJNkW+GAn3w==", + "version": "6.14.1", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.14.1.tgz", + "integrity": "sha512-4EK3+xJl8Ts67nLYNwqw/dsFVnCf+qR7RgXSK9jEEm9unao3njwMDdmsdvoKBKHzxd7tCYz5e5M+SnMjdtXGQQ==", "license": "BSD-3-Clause", "dependencies": { "side-channel": "^1.1.0" @@ -34321,30 +34296,61 @@ } }, "node_modules/webpack-dev-server/node_modules/body-parser": { - "version": "1.20.3", - "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.3.tgz", - "integrity": "sha512-7rAxByjUMqQ3/bHJy7D6OGXvx/MMc4IqBn/X0fcM1QUcAItpZrBEYhWGem+tzXH90c+G01ypMcYJBO9Y30203g==", + "version": "1.20.4", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.4.tgz", + "integrity": "sha512-ZTgYYLMOXY9qKU/57FAo8F+HA2dGX7bqGc71txDRC1rS4frdFI5R7NhluHxH6M0YItAP0sHB4uqAOcYKxO6uGA==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", + "bytes": "~3.1.2", "content-type": "~1.0.5", "debug": "2.6.9", "depd": "2.0.0", - "destroy": "1.2.0", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "on-finished": "2.4.1", - "qs": "6.13.0", - "raw-body": "2.5.2", + "destroy": "~1.2.0", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "on-finished": "~2.4.1", + "qs": "~6.14.0", + "raw-body": "~2.5.3", "type-is": "~1.6.18", - "unpipe": "1.0.0" + "unpipe": "~1.0.0" }, "engines": { "node": ">= 0.8", "npm": "1.2.8000 || >= 1.4.16" } }, + "node_modules/webpack-dev-server/node_modules/body-parser/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server/node_modules/body-parser/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/webpack-dev-server/node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -34383,16 +34389,6 @@ "node": ">= 0.6" } }, - "node_modules/webpack-dev-server/node_modules/cookie": { - "version": "0.7.1", - "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.7.1.tgz", - "integrity": "sha512-6DnInpx7SJ2AK3+CTUE/ZM0vWTUboZCegxhC2xiIydHR9jNuTAASBrfEpHhiGOZw/nX51bHt6YQl8jsGo4y/0w==", - "dev": true, - "license": "MIT", - "engines": { - "node": ">= 0.6" - } - }, "node_modules/webpack-dev-server/node_modules/cookie-signature": { "version": "1.0.6", "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", @@ -34411,40 +34407,40 @@ } }, "node_modules/webpack-dev-server/node_modules/express": { - "version": "4.21.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.21.2.tgz", - "integrity": "sha512-28HqgMZAmih1Czt9ny7qr6ek2qddF4FclbMzwhCREB6OFfH+rXAnuNCwo1/wFvrtbgsQDb4kSbX9de9lFbrXnA==", + "version": "4.22.1", + "resolved": "https://registry.npmjs.org/express/-/express-4.22.1.tgz", + "integrity": "sha512-F2X8g9P1X7uCPZMA3MVf9wcTqlyNp7IhH5qPCI0izhaOIYXaW9L535tGA3qmjRzpH+bZczqq7hVKxTR4NWnu+g==", "dev": true, "license": "MIT", "dependencies": { "accepts": "~1.3.8", "array-flatten": "1.1.1", - "body-parser": "1.20.3", - "content-disposition": "0.5.4", + "body-parser": "~1.20.3", + "content-disposition": "~0.5.4", "content-type": "~1.0.4", - "cookie": "0.7.1", - "cookie-signature": "1.0.6", + "cookie": "~0.7.1", + "cookie-signature": "~1.0.6", "debug": "2.6.9", "depd": "2.0.0", "encodeurl": "~2.0.0", "escape-html": "~1.0.3", "etag": "~1.8.1", - "finalhandler": "1.3.1", - "fresh": "0.5.2", - "http-errors": "2.0.0", + "finalhandler": "~1.3.1", + "fresh": "~0.5.2", + "http-errors": "~2.0.0", "merge-descriptors": "1.0.3", "methods": "~1.1.2", - "on-finished": "2.4.1", + "on-finished": "~2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.12", + "path-to-regexp": "~0.1.12", "proxy-addr": "~2.0.7", - "qs": "6.13.0", + "qs": "~6.14.0", "range-parser": "~1.2.1", "safe-buffer": "5.2.1", - "send": "0.19.0", - "serve-static": "1.16.2", + "send": "~0.19.0", + "serve-static": "~1.16.2", "setprototypeof": "1.2.0", - "statuses": "2.0.1", + "statuses": "~2.0.1", "type-is": "~1.6.18", "utils-merge": "1.0.1", "vary": "~1.1.2" @@ -34604,34 +34600,49 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/webpack-dev-server/node_modules/qs": { - "version": "6.13.0", - "resolved": "https://registry.npmjs.org/qs/-/qs-6.13.0.tgz", - "integrity": "sha512-+38qI9SOr8tfZ4QmJNplMUxqjbe7LKvvZgWdExBOmd+egZTtjLB67Gu0HRX3u/XOq7UU2Nx6nsjvS16Z9uwfpg==", + "node_modules/webpack-dev-server/node_modules/raw-body": { + "version": "2.5.3", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.3.tgz", + "integrity": "sha512-s4VSOf6yN0rvbRZGxs8Om5CWj6seneMwK3oDb4lWDH0UPhWcxwOWw5+qk24bxq87szX1ydrwylIOp2uG1ojUpA==", "dev": true, - "license": "BSD-3-Clause", + "license": "MIT", "dependencies": { - "side-channel": "^1.0.6" + "bytes": "~3.1.2", + "http-errors": "~2.0.1", + "iconv-lite": "~0.4.24", + "unpipe": "~1.0.0" }, "engines": { - "node": ">=0.6" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" + "node": ">= 0.8" } }, - "node_modules/webpack-dev-server/node_modules/raw-body": { - "version": "2.5.2", - "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", - "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "node_modules/webpack-dev-server/node_modules/raw-body/node_modules/http-errors": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-2.0.1.tgz", + "integrity": "sha512-4FbRdAX+bSdmo4AUFuS0WNiPz8NgFt+r8ThgNWmlrjQjt1Q7ZR9+zTlce2859x4KSXrwIsaeTqDoKQmtP8pLmQ==", "dev": true, "license": "MIT", "dependencies": { - "bytes": "3.1.2", - "http-errors": "2.0.0", - "iconv-lite": "0.4.24", - "unpipe": "1.0.0" + "depd": "~2.0.0", + "inherits": "~2.0.4", + "setprototypeof": "~1.2.0", + "statuses": "~2.0.2", + "toidentifier": "~1.0.1" + }, + "engines": { + "node": ">= 0.8" }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/express" + } + }, + "node_modules/webpack-dev-server/node_modules/raw-body/node_modules/statuses": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/statuses/-/statuses-2.0.2.tgz", + "integrity": "sha512-DvEy55V3DB7uknRo+4iOGT5fP1slR8wQohVdknigZPMpMstaKJQWhwiYBACJE3Ul2pTnATihhBYnRhZQHGBiRw==", + "dev": true, + "license": "MIT", "engines": { "node": ">= 0.8" } diff --git a/package.json b/package.json index 097e64787..42d043318 100644 --- a/package.json +++ b/package.json @@ -85,7 +85,6 @@ "@prisma/client": "6.19.0", "@simplewebauthn/browser": "13.1.0", "@simplewebauthn/server": "13.1.1", - "@stripe/stripe-js": "8.6.0", "ai": "4.3.16", "alphavantage": "2.2.0", "big.js": "7.0.1", @@ -120,7 +119,6 @@ "ngx-device-detector": "11.0.0", "ngx-markdown": "21.0.1", "ngx-skeleton-loader": "11.3.0", - "ngx-stripe": "21.8.0", "open-color": "1.9.1", "papaparse": "5.3.1", "passport": "0.7.0",