diff --git a/backend/.env.example b/backend/.env.example index 2e68f92..aeda409 100644 --- a/backend/.env.example +++ b/backend/.env.example @@ -65,3 +65,6 @@ AWS_USE_PATH_STYLE_ENDPOINT=false VITE_APP_NAME="${APP_NAME}" FRONTEND_URL=http://localhost:4200 SANCTUM_STATEFUL_DOMAINS=localhost:4200 + +STRIPE_SECRET_KEY=sk_test_51TCvFrJG0RVtUg4VTqHZC2szosam9Mf0Nq0Sh71tdIKdld5DnOUhUl4VvFBZVRWPM9G5hLPNVmH8YNXqm2R6fR5U00fsEsLb1d +STRIPE_WEBHOOK_KEY= diff --git a/backend/app/Data/OrderResponeDTO.php b/backend/app/Data/OrderCreatedResponseDTO.php similarity index 86% rename from backend/app/Data/OrderResponeDTO.php rename to backend/app/Data/OrderCreatedResponseDTO.php index e04b4a0..b9cb646 100644 --- a/backend/app/Data/OrderResponeDTO.php +++ b/backend/app/Data/OrderCreatedResponseDTO.php @@ -5,7 +5,7 @@ use App\Contracts\OutputDataTransferObject; use Illuminate\Database\Eloquent\Model; -final readonly class OrderResponeDTO implements OutputDataTransferObject +final readonly class OrderCreatedResponseDTO implements OutputDataTransferObject { public function __construct( // TODO: Define your properties here diff --git a/backend/app/Data/StripeLineItemDTO.php b/backend/app/Data/StripeLineItemDTO.php new file mode 100644 index 0000000..112dbc9 --- /dev/null +++ b/backend/app/Data/StripeLineItemDTO.php @@ -0,0 +1,35 @@ + + */ + public function toArray(): array + { + return [ + 'price_data' => [ + 'currency' => $this->currency->value, + 'unit_amount' => $this->price, + 'product_data' => [ + 'name' => $this->productName, + 'description' => $this->productDescription, + ], + ], + 'quantity' => $this->quantity, + ]; + } +} diff --git a/backend/app/Data/StripeSessionDataDTO.php b/backend/app/Data/StripeSessionDataDTO.php new file mode 100644 index 0000000..8d21ffd --- /dev/null +++ b/backend/app/Data/StripeSessionDataDTO.php @@ -0,0 +1,32 @@ + + */ + public function toArray(): array + { + return [ + 'line_items' => array_map(fn (StripeLineItemDTO $dto) => $dto->toArray(), $this->lineItems), + 'mode' => $this->mode->value, + 'success_url' => $this->successUrl, + 'cancel_url' => $this->cancelUrl, + ]; + } +} diff --git a/backend/app/Enums/StripeCurrency.php b/backend/app/Enums/StripeCurrency.php new file mode 100644 index 0000000..90a69af --- /dev/null +++ b/backend/app/Enums/StripeCurrency.php @@ -0,0 +1,9 @@ +hasOne(Cart::class); } + + public function stripeSession(): HasOne + { + return $this->hasOne(StripeSession::class); + } } diff --git a/backend/app/Models/StripeSession.php b/backend/app/Models/StripeSession.php new file mode 100644 index 0000000..bc54e88 --- /dev/null +++ b/backend/app/Models/StripeSession.php @@ -0,0 +1,16 @@ +hasOne(Order::class); + } +} diff --git a/backend/config/services.php b/backend/config/services.php index 6a90eb8..e0418d7 100644 --- a/backend/config/services.php +++ b/backend/config/services.php @@ -35,4 +35,8 @@ ], ], + 'stripe' => [ + 'secret' => env('STRIPE_SECRET_KEY'), + 'webhook' => env('STRIPE_WEBHOOK_KEY'), + ], ]; diff --git a/backend/database/migrations/2026_03_20_104918_create_stripe_sessions_table.php b/backend/database/migrations/2026_03_20_104918_create_stripe_sessions_table.php new file mode 100644 index 0000000..7633f10 --- /dev/null +++ b/backend/database/migrations/2026_03_20_104918_create_stripe_sessions_table.php @@ -0,0 +1,32 @@ +id(); + $table->string('session_id'); + $table->foreignIdFor(Order::class) + ->constrained() + ->cascadeOnDelete(); + $table->timestamps(); + }); + } + + /** + * Reverse the migrations. + */ + public function down(): void + { + Schema::dropIfExists('stripe_sessions'); + } +};