513 - Billing Stripe initial implementation - #5378
Conversation
cc79340 to
c540f29
Compare
There was a problem hiding this comment.
Pull request overview
Introduces an initial Stripe-based billing implementation across server and client, including subscription lifecycle endpoints, webhook handling, usage metering, persistence (Liquibase), and UI scaffolding to manage plans.
Changes:
- Added new platform billing modules (API/REST/service) with Stripe client integration, subscription facade/services, repositories, and Liquibase schema.
- Implemented REST endpoints + webhook endpoint (OpenAPI-generated stubs) and wired security exemptions for Stripe webhooks.
- Added client-side billing settings route/UI and generated TypeScript API client, plus AWS/Quartz-based usage reporting scheduling hooks.
Reviewed changes
Copilot reviewed 77 out of 89 changed files in this pull request and generated 7 comments.
Show a summary per file
| File | Description |
|---|---|
| settings.gradle.kts | Registers new platform billing Gradle modules. |
| server/libs/platform/platform-billing/platform-billing-service/src/test/java/com/bytechef/platform/billing/service/BillingUsageServiceImplTest.java | Adds unit tests for usage reporting logic. |
| server/libs/platform/platform-billing/platform-billing-service/src/test/java/com/bytechef/platform/billing/service/BillingSubscriptionServiceImplTest.java | Adds unit tests for subscription lookup behavior. |
| server/libs/platform/platform-billing/platform-billing-service/src/test/java/com/bytechef/platform/billing/facade/BillingSubscriptionFacadeImplOperationsTest.java | Adds tests covering subscription facade operations (upgrade/downgrade/cancel/reactivate). |
| server/libs/platform/platform-billing/platform-billing-service/src/main/resources/META-INF/spring/org.springframework.boot.autoconfigure.AutoConfiguration.imports | Auto-imports billing JDBC repository configuration. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/resources/config/liquibase/changelog/platform/billing/20260429000000_platform_billing_init.xml | Creates billing subscription + webhook event tables and FK constraint. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/service/BillingWebhookEventServiceImpl.java | Implements webhook event persistence service. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/service/BillingUsageServiceImpl.java | Implements usage counting + Stripe metered event reporting across tenants. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/service/BillingSubscriptionServiceImpl.java | Implements subscription persistence + retrieval methods. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/repository/BillingWebhookEventRepository.java | Adds Spring Data JDBC repository for webhook event deduplication. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/repository/BillingSubscriptionRepository.java | Adds Spring Data JDBC repository plus cross-module usage-count query. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/job/StripeUsageReportingJob.java | Quartz job to trigger periodic Stripe usage reporting. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/facade/BillingSubscriptionFacadeImpl.java | Core billing orchestration: checkout, plan updates, webhook handling, subscription DTO. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/config/PlatformBillingJdbcRepositoryConfiguration.java | Enables JDBC repositories + binds billing properties in autoconfig. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/config/BillingSchedulingConfiguration.java | Wires Quartz trigger/job for usage reporting when billing enabled. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/config/BillingProperties.java | Defines billing configuration properties record (bytechef.billing.*). |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/client/StripeClientImpl.java | Stripe SDK integration: subscription changes, checkout, webhook verification, metered events. |
| server/libs/platform/platform-billing/platform-billing-service/src/main/java/com/bytechef/platform/billing/client/StripeClient.java | Defines Stripe client abstraction used by billing services/facade. |
| server/libs/platform/platform-billing/platform-billing-service/build.gradle.kts | Adds Stripe SDK + Spring/JDBC/Quartz/security dependencies for billing service. |
| server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/security/config/BillingSecurityConfigurerContributor.java | Disables CSRF for webhook endpoint. |
| server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/security/config/BillingAuthorizeHttpRequestContributor.java | Permits unauthenticated webhook endpoint access. |
| server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/mapper/config/PlatformBillingMapperSpringConfig.java | Adds MapStruct mapper config for billing REST models. |
| server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/mapper/BillingMapper.java | Maps billing DTO to REST model. |
| server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/BillingWebhookApiController.java | Implements Stripe webhook endpoint controller. |
| server/libs/platform/platform-billing/platform-billing-rest/src/main/java/com/bytechef/platform/billing/web/rest/BillingApiController.java | Implements internal billing subscription/checkout endpoints. |
| server/libs/platform/platform-billing/platform-billing-rest/openapi.yaml | Defines internal billing REST API contract. |
| server/libs/platform/platform-billing/platform-billing-rest/openapi-webhook.yaml | Defines webhook REST API contract. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/model/CheckoutSessionRequestModel.java | Generated OpenAPI model for checkout/plan change request. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/model/CheckoutSessionModel.java | Generated OpenAPI model for checkout session response. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/model/BillingSubscriptionModel.java | Generated OpenAPI model for subscription response. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/BillingWebhookApi.java | Generated OpenAPI interface for webhook endpoint. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/BillingApi.java | Generated OpenAPI interface for internal billing API. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/src/main/java/com/bytechef/platform/billing/web/rest/ApiUtil.java | Generated OpenAPI utility for example responses. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/README.md | Generated OpenAPI stub README. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/pom.xml | Generated OpenAPI stub Maven build file. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/.openapi-generator/VERSION | Records OpenAPI generator version used. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/.openapi-generator/FILES | Records generated file inventory. |
| server/libs/platform/platform-billing/platform-billing-rest/generated/.openapi-generator-ignore | Generated ignore rules. |
| server/libs/platform/platform-billing/platform-billing-rest/build.gradle.kts | Adds OpenAPI generator tasks (Spring + TS fetch) and wires generated sources. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/service/BillingWebhookEventService.java | Billing API service contract for webhook event deduplication. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/service/BillingUsageService.java | Billing API service contract for metered usage counting/reporting. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/service/BillingSubscriptionService.java | Billing API service contract for subscription persistence. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/facade/BillingSubscriptionFacade.java | Billing API facade contract for REST/webhook orchestration. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/dto/BillingSubscriptionDTO.java | DTO representing subscription + computed usage. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/domain/BillingSubscriptionWebhookEvent.java | Domain model for webhook event persistence. |
| server/libs/platform/platform-billing/platform-billing-api/src/main/java/com/bytechef/platform/billing/domain/BillingSubscription.java | Domain model for persisted subscription state. |
| server/libs/platform/platform-billing/platform-billing-api/build.gradle.kts | Adds API module dependencies for billing types/contracts. |
| server/libs/config/liquibase-config/src/main/resources/config/liquibase/master.xml | Includes billing Liquibase changelogs. |
| server/libs/config/app-config/src/main/java/com/bytechef/config/ApplicationProperties.java | Adds billing configuration section to application properties. |
| server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/listener/StripeUsageReportListener.java | Adds SQS listener that triggers usage reporting in EE AWS scheduler mode. |
| server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/constant/AwsBillingSchedulingConstants.java | Adds constants for Stripe usage reporting scheduler/listener/queue. |
| server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/config/AwsSchedulerConfiguration.java | Wires Stripe usage schedule + listener and shares SchedulerClient bean. |
| server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/src/main/java/com/bytechef/ee/platform/scheduler/aws/AwsStripeUsageReportScheduler.java | Creates EventBridge Scheduler schedule for periodic Stripe usage reporting. |
| server/ee/libs/platform/platform-scheduler/platform-scheduler-aws/build.gradle.kts | Adds dependency on billing API for the AWS scheduler module. |
| server/apps/server-app/src/main/resources/config/application.yml | Exposes billing enabled flag under actuator info. |
| server/apps/server-app/src/main/resources/config/application-bytechef.yml | Adds local defaults for billing Stripe properties. |
| server/apps/server-app/build.gradle.kts | Adds billing REST + service modules to the server app. |
| client/src/shared/stores/useApplicationInfoStore.tsx | Adds billing enabled flag to app info store. |
| client/src/shared/queries/platform/billing.queries.ts | Adds React Query hook for current subscription. |
| client/src/shared/mutations/platform/billing.mutations.ts | Adds mutations for cancel/reactivate/upgrade subscription. |
| client/src/shared/middleware/platform/billing/runtime.ts | Generated TS fetch runtime for billing API. |
| client/src/shared/middleware/platform/billing/models/UpgradeSubscription.ts | Generated TS model (currently unused by exports). |
| client/src/shared/middleware/platform/billing/models/index.ts | Exports generated billing models. |
| client/src/shared/middleware/platform/billing/models/CheckoutSessionRequest.ts | Generated TS model for checkout/plan change request. |
| client/src/shared/middleware/platform/billing/models/CheckoutSession.ts | Generated TS model for checkout session response. |
| client/src/shared/middleware/platform/billing/models/BillingSubscription.ts | Generated TS model for subscription response. |
| client/src/shared/middleware/platform/billing/index.ts | Exports generated billing runtime/apis/models. |
| client/src/shared/middleware/platform/billing/docs/UpgradeSubscription.md | Generated docs for UpgradeSubscription model. |
| client/src/shared/middleware/platform/billing/docs/CheckoutSessionRequest.md | Generated docs for checkout session request model. |
| client/src/shared/middleware/platform/billing/docs/CheckoutSession.md | Generated docs for checkout session model. |
| client/src/shared/middleware/platform/billing/docs/BillingSubscription.md | Generated docs for billing subscription model. |
| client/src/shared/middleware/platform/billing/docs/BillingApi.md | Generated docs for billing API. |
| client/src/shared/middleware/platform/billing/apis/index.ts | Exports generated billing API client. |
| client/src/shared/middleware/platform/billing/apis/BillingApi.ts | Generated TS client for billing API endpoints. |
| client/src/shared/middleware/platform/billing/.openapi-generator/VERSION | Records OpenAPI generator version for TS client. |
| client/src/shared/middleware/platform/billing/.openapi-generator/FILES | Records generated TS file inventory. |
| client/src/shared/middleware/platform/billing/.openapi-generator-ignore | Generated ignore rules for TS output. |
| client/src/shared/layout/Settings.tsx | Gates the Billing settings nav item behind server-provided billing flag. |
| client/src/routes.tsx | Adds Billing route and sidebar nav entry for platform settings. |
| client/src/ee/pages/settings/platform/billing/components/UpgradeConfirmationDialog.tsx | Adds upgrade confirmation dialog UI. |
| client/src/ee/pages/settings/platform/billing/components/SelectPlanDialog.tsx | Adds plan selection dialog + checkout/upgrade/downgrade flows. |
| client/src/ee/pages/settings/platform/billing/components/ReactivatePlanDialog.tsx | Adds reactivate confirmation dialog UI. |
| client/src/ee/pages/settings/platform/billing/components/PlanTierCard.tsx | Adds plan tier card UI. |
| client/src/ee/pages/settings/platform/billing/components/PlanCard.tsx | Adds subscription summary card UI (usage bar, renewal/cancel state). |
| client/src/ee/pages/settings/platform/billing/components/DowngradeConfirmationDialog.tsx | Adds downgrade confirmation dialog UI. |
| client/src/ee/pages/settings/platform/billing/components/CancelPlanDialog.tsx | Adds cancellation confirmation dialog UI. |
| client/src/ee/pages/settings/platform/billing/Billing.tsx | Adds Billing settings page with polling/checkout UX and plan management. |
| client/package-lock.json | Updates lockfile metadata (removes platform libc constraints for some optional deps). |
Files not reviewed (1)
- client/package-lock.json: Generated file
💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.
|
@ivicac server check failure due to |
| private boolean isUpgrade(String currentPlanName, String newPlanName) { | ||
| return planTier(newPlanName) > planTier(currentPlanName); | ||
| } | ||
|
|
||
| private int planTier(String planName) { | ||
| if ("STARTER".equalsIgnoreCase(planName)) { | ||
| return 1; | ||
| } else if ("GROWTH".equalsIgnoreCase(planName)) { | ||
| return 2; | ||
| } | ||
|
|
||
| return 0; | ||
| } |
There was a problem hiding this comment.
@matijapetanjek da li mozemo izbjeci hardkodiranje imena planova? Da li informacija o tipu plana(0,1,2), moze doci iz Stripe-a(metapodaci) ili biti zapisana negdje?
| if (billingProperties.stripe().productStarterId() | ||
| .equals(productId)) { | ||
| newPlanName = "STARTER"; | ||
| } else if (billingProperties.stripe().productGrowthId() | ||
| .equals(productId)) { | ||
| newPlanName = "GROWTH"; |
There was a problem hiding this comment.
hardkodirana imena planova, mozemo li izbjeci?
| private String resolveFlatProductId(String planName) { | ||
| if ("STARTER".equalsIgnoreCase(planName)) { | ||
| return billingProperties.stripe().productStarterId(); | ||
| } else if ("GROWTH".equalsIgnoreCase(planName)) { |
There was a problem hiding this comment.
hardkodirana imena planova, mozemo li izbjeci?
75ce63d to
a494ac7
Compare
… in an internal api
…, upgrade, downgrade, cancellation and webhook events)
…Task Executions with COMPLETED status)
…Stripe, don't just assume customer doesn/t exist
…rectly from Stripe
…duplicated checkWebhookSignature call which was present as a workaround for @transactional annotation
…lling is disabled
…tions. Update trial parameters
…executions for billing usage
…ecutionsSince Companion fix to the Task 1 interface rename: TrialServiceImpl and BillingSubscriptionFacadeImpl (plus their tests) live in the same Gradle module as BillingUsageService, so renaming the interface method broke compilation for the whole module, not just the file that declared it. Call sites only — the tasksUsed variable/DTO field names are unchanged here and are handled by Tasks 2 and 3.
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
Co-Authored-By: Claude Sonnet 5 <noreply@anthropic.com>
|
|







Uh oh!
There was an error while loading. Please reload this page.