diff --git a/backend/build.gradle.kts b/backend/build.gradle.kts index f10394a..565e524 100644 --- a/backend/build.gradle.kts +++ b/backend/build.gradle.kts @@ -24,6 +24,7 @@ repositories { } dependencies { + implementation("com.stripe:stripe-java:20.79.0") implementation("org.springframework.boot:spring-boot-starter-data-jpa") implementation("org.springframework.boot:spring-boot-starter-web") compileOnly("org.projectlombok:lombok") diff --git a/backend/src/main/java/de/szut/casino/deposit/DepositController.java b/backend/src/main/java/de/szut/casino/deposit/DepositController.java new file mode 100644 index 0000000..c7c85a8 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/deposit/DepositController.java @@ -0,0 +1,48 @@ +package de.szut.casino.deposit; + +import com.stripe.Stripe; +import com.stripe.exception.StripeException; +import com.stripe.model.checkout.Session; +import com.stripe.param.InvoiceItemCreateParams; +import com.stripe.param.PriceCreateParams; +import com.stripe.param.checkout.SessionCreateParams; +import de.szut.casino.deposit.dto.AmountDto; +import de.szut.casino.deposit.dto.SessionIdDto; +import org.springframework.boot.autoconfigure.cassandra.CassandraProperties; +import org.springframework.http.ResponseEntity; +import org.springframework.web.bind.annotation.PostMapping; +import org.springframework.web.bind.annotation.RequestBody; +import org.springframework.web.bind.annotation.RequestHeader; +import org.springframework.web.bind.annotation.RestController; + +@RestController +public class DepositController { + @PostMapping("/deposit/checkout") + public ResponseEntity extends Object> checkout(@RequestBody AmountDto amountDto) { + Stripe.apiKey = "sk_test_51QrePYIvCfqz7ANgqam8rEwWcMeKiLOof3j6SCMgu2sl4sESP45DJxca16mWcYo1sQaiBv32CMR6Z4AAAGQPCJo300ubuZKO8I"; + try { + SessionCreateParams params = SessionCreateParams.builder() + .addLineItem(SessionCreateParams.LineItem.builder() + .setPriceData(InvoiceItemCreateParams.PriceData.builder() + .setCurrency("EUR") + .setUnitAmount(1L) + .build() + ) + .build()) + .setSuccessUrl("http://localhost:8080/deposit/success") + .setMode(SessionCreateParams.Mode.PAYMENT) + .build(); + try { + Session session = Session.create(params); + + return ResponseEntity.ok(new SessionIdDto(session.getId())); + } catch (StripeException e) { + return ResponseEntity.ok(e); + } + } catch (Exception e) { + return ResponseEntity.ok(e); + } + + } +} + diff --git a/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java b/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java new file mode 100644 index 0000000..7996d85 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/deposit/dto/AmountDto.java @@ -0,0 +1,21 @@ +package de.szut.casino.deposit.dto; + +public class AmountDto { + private double amount; + + public AmountDto() { + } + + public AmountDto(double amount) { + this.amount = amount; + } + + public double getAmount() { + return amount; + } + + public void setAmount(double amount) { + this.amount = amount; + } +} + diff --git a/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java b/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java new file mode 100644 index 0000000..67ade61 --- /dev/null +++ b/backend/src/main/java/de/szut/casino/deposit/dto/SessionIdDto.java @@ -0,0 +1,21 @@ +package de.szut.casino.deposit.dto; + +public class SessionIdDto { + private String sessionId; + + public SessionIdDto() { + } + + public SessionIdDto(String sessionId) { + this.sessionId = sessionId; + } + + public String getSessionId() { + return sessionId; + } + + public void setSessionId(String sessionId) { + this.sessionId = sessionId; + } +} + diff --git a/backend/src/main/resources/application.properties b/backend/src/main/resources/application.properties index d668f7a..938ce25 100644 --- a/backend/src/main/resources/application.properties +++ b/backend/src/main/resources/application.properties @@ -1,4 +1,4 @@ -spring.datasource.url=jdbc:postgresql://${DB_HOST:-localhost}:5432/postgresdb +spring.datasource.url=jdbc:postgresql://localhost:5432/postgresdb spring.datasource.username=postgres_user spring.datasource.password=postgres_pass server.port=8080 diff --git a/frontend/bun.lock b/frontend/bun.lock index 5011117..d2559e9 100644 --- a/frontend/bun.lock +++ b/frontend/bun.lock @@ -12,6 +12,7 @@ "@angular/platform-browser": "^18.2.0", "@angular/platform-browser-dynamic": "^18.2.0", "@angular/router": "^18.2.0", + "@stripe/stripe-js": "^5.6.0", "@tailwindcss/postcss": "^4.0.3", "keycloak-angular": "^16.0.1", "keycloak-js": "^25.0.5", @@ -489,6 +490,8 @@ "@socket.io/component-emitter": ["@socket.io/component-emitter@3.1.2", "", {}, "sha512-9BCxFwvbGg/RsZK9tjXd8s4UcwR0MWeFQ1XEKIQVVvAGJyINdrqKMcTRyLoK8Rse1GjzLV9cwjWV1olXRWEXVA=="], + "@stripe/stripe-js": ["@stripe/stripe-js@5.6.0", "", {}, "sha512-w8CEY73X/7tw2KKlL3iOk679V9bWseE4GzNz3zlaYxcTjmcmWOathRb0emgo/QQ3eoNzmq68+2Y2gxluAv3xGw=="], + "@tailwindcss/node": ["@tailwindcss/node@4.0.3", "", { "dependencies": { "enhanced-resolve": "^5.18.0", "jiti": "^2.4.2", "tailwindcss": "4.0.3" } }, "sha512-QsVJokOl0pJ4AbJV33D2npvLcHGPWi5MOSZtrtE0GT3tSx+3D0JE2lokLA8yHS1x3oCY/3IyRyy7XX6tmzid7A=="], "@tailwindcss/oxide": ["@tailwindcss/oxide@4.0.3", "", { "optionalDependencies": { "@tailwindcss/oxide-android-arm64": "4.0.3", "@tailwindcss/oxide-darwin-arm64": "4.0.3", "@tailwindcss/oxide-darwin-x64": "4.0.3", "@tailwindcss/oxide-freebsd-x64": "4.0.3", "@tailwindcss/oxide-linux-arm-gnueabihf": "4.0.3", "@tailwindcss/oxide-linux-arm64-gnu": "4.0.3", "@tailwindcss/oxide-linux-arm64-musl": "4.0.3", "@tailwindcss/oxide-linux-x64-gnu": "4.0.3", "@tailwindcss/oxide-linux-x64-musl": "4.0.3", "@tailwindcss/oxide-win32-arm64-msvc": "4.0.3", "@tailwindcss/oxide-win32-x64-msvc": "4.0.3" } }, "sha512-FFcp3VNvRjjmFA39ORM27g2mbflMQljhvM7gxBAujHxUy4LXlKa6yMF9wbHdTbPqTONiCyyOYxccvJyVyI/XBg=="], diff --git a/frontend/package.json b/frontend/package.json index 962c3f0..4840fd1 100644 --- a/frontend/package.json +++ b/frontend/package.json @@ -20,6 +20,7 @@ "@angular/platform-browser": "^18.2.0", "@angular/platform-browser-dynamic": "^18.2.0", "@angular/router": "^18.2.0", + "@stripe/stripe-js": "^5.6.0", "@tailwindcss/postcss": "^4.0.3", "keycloak-angular": "^16.0.1", "keycloak-js": "^25.0.5", diff --git a/frontend/src/app/app.routes.ts b/frontend/src/app/app.routes.ts index 02b958c..90b84b0 100644 --- a/frontend/src/app/app.routes.ts +++ b/frontend/src/app/app.routes.ts @@ -2,6 +2,7 @@ import { Routes } from '@angular/router'; import { LandingPageComponent } from './landing-page/landing-page.component'; import { HomepageComponent } from './homepage/homepage/homepage.component'; import { authGuard } from './auth.guard'; +import { DepositComponent } from './deposit/deposit.component'; export const routes: Routes = [ { @@ -13,4 +14,9 @@ export const routes: Routes = [ component: HomepageComponent, canActivate: [authGuard], }, + { + path: 'deposit', + component: DepositComponent, + canActivate: [authGuard], + } ]; diff --git a/frontend/src/app/deposit/deposit.component.css b/frontend/src/app/deposit/deposit.component.css new file mode 100644 index 0000000..e69de29 diff --git a/frontend/src/app/deposit/deposit.component.html b/frontend/src/app/deposit/deposit.component.html new file mode 100644 index 0000000..f3bbbb2 --- /dev/null +++ b/frontend/src/app/deposit/deposit.component.html @@ -0,0 +1,14 @@ +
diff --git a/frontend/src/app/deposit/deposit.component.ts b/frontend/src/app/deposit/deposit.component.ts new file mode 100644 index 0000000..f28c694 --- /dev/null +++ b/frontend/src/app/deposit/deposit.component.ts @@ -0,0 +1,32 @@ +import { Component, OnInit } from '@angular/core'; +import { FormControl, FormGroup, ReactiveFormsModule, Validators } from '@angular/forms'; +import { loadStripe, Stripe } from '@stripe/stripe-js'; + +@Component({ + selector: 'app-deposit', + standalone: true, + imports: [ + ReactiveFormsModule, + ], + templateUrl: './deposit.component.html', + styleUrl: './deposit.component.css' +}) +export class DepositComponent implements OnInit{ + protected form = new FormGroup({amount: new FormControl(50, [Validators.min(50)])}); + private stripe: Stripe | null; + + async ngOnInit() { + this.stripe = await loadStripe('pk_test_51'); + } + + submit() { + if (this.stripe) { + fetch('/backend/deposit/checkout', { + method: 'POST', + body: JSON.stringify(this.form.value), + }).then(response => response.json()).then(response => { + this.stripe?.redirectToCheckout({sessionId: response.sessionId}); + }); + } + } +}