dishplanner/app/Http/Controllers/SubscriptionController.php

73 lines
2.4 KiB
PHP
Raw Normal View History

2026-01-05 23:51:50 +01:00
<?php
namespace App\Http\Controllers;
use Illuminate\Http\RedirectResponse;
use Illuminate\Http\Request;
use Laravel\Cashier\Cashier;
use Symfony\Component\HttpFoundation\Response;
2026-01-05 23:51:50 +01:00
class SubscriptionController extends Controller
{
public function checkout(Request $request)
2026-01-05 23:51:50 +01:00
{
$planner = $request->user();
if ($planner->subscribed()) {
2026-01-05 23:51:50 +01:00
return redirect()->route('dashboard');
}
$plan = $request->input('plan', 'monthly');
$priceId = $plan === 'yearly'
? env('STRIPE_PRICE_YEARLY')
: env('STRIPE_PRICE_MONTHLY');
return $planner->newSubscription('default', $priceId)
->checkout([
'success_url' => route('subscription.success') . '?session_id={CHECKOUT_SESSION_ID}',
'cancel_url' => route('subscription.index'),
]);
}
public function success(Request $request): RedirectResponse
{
$sessionId = $request->query('session_id');
if ($sessionId) {
$planner = $request->user();
$session = Cashier::stripe()->checkout->sessions->retrieve($sessionId, [
'expand' => ['subscription'],
]);
if ($session->subscription && ! $planner->subscribed()) {
$subscription = $session->subscription;
$planner->subscriptions()->create([
'type' => 'default',
'stripe_id' => $subscription->id,
'stripe_status' => $subscription->status,
'stripe_price' => $subscription->items->data[0]->price->id ?? null,
'quantity' => $subscription->items->data[0]->quantity ?? 1,
'trial_ends_at' => $subscription->trial_end ? now()->setTimestamp($subscription->trial_end) : null,
'ends_at' => null,
]);
}
}
2026-01-05 23:51:50 +01:00
return redirect()->route('dashboard')->with('success', 'Subscription activated!');
}
public function cancel(Request $request): RedirectResponse
{
$planner = $request->user();
2026-01-05 23:51:50 +01:00
if (! $planner->subscribed()) {
2026-01-05 23:51:50 +01:00
return back()->with('error', 'No active subscription found.');
}
$planner->subscription()->cancel();
2026-01-05 23:51:50 +01:00
return back()->with('success', 'Subscription canceled. Access will continue until the end of your billing period.');
}
}