Refactor webhook event handling logic

This commit is contained in:
Andras Bacsai
2024-11-01 00:07:01 +01:00
parent 5ce2422b90
commit 4fa533aae8

View File

@@ -168,6 +168,14 @@ class Stripe extends Controller
$subscriptionId = data_get($data, 'id'); $subscriptionId = data_get($data, 'id');
$teamId = data_get($data, 'metadata.team_id'); $teamId = data_get($data, 'metadata.team_id');
$userId = data_get($data, 'metadata.user_id'); $userId = data_get($data, 'metadata.user_id');
if (! $teamId || ! $userId) {
$subscription = Subscription::where('stripe_customer_id', $customerId)->first();
if ($subscription) {
return response("Subscription already exists for customer: {$customerId}", 200);
}
return response('No team id or user id found', 400);
}
$team = Team::find($teamId); $team = Team::find($teamId);
$found = $team->members->where('id', $userId)->first(); $found = $team->members->where('id', $userId)->first();
if (! $found->isAdmin()) { if (! $found->isAdmin()) {
@@ -177,7 +185,7 @@ class Stripe extends Controller
} }
$subscription = Subscription::where('team_id', $teamId)->first(); $subscription = Subscription::where('team_id', $teamId)->first();
if ($subscription) { if ($subscription) {
return response("Subscription already exists for team: {$teamId}", 400); return response("Subscription already exists for team: {$teamId}", 200);
} else { } else {
Subscription::create([ Subscription::create([
'team_id' => $teamId, 'team_id' => $teamId,
@@ -185,9 +193,12 @@ class Stripe extends Controller
'stripe_customer_id' => $customerId, 'stripe_customer_id' => $customerId,
'stripe_invoice_paid' => false, 'stripe_invoice_paid' => false,
]); ]);
return response('Subscription created');
} }
break;
case 'customer.subscription.updated': case 'customer.subscription.updated':
$teamId = data_get($data, 'metadata.team_id');
$userId = data_get($data, 'metadata.user_id');
$customerId = data_get($data, 'customer'); $customerId = data_get($data, 'customer');
$status = data_get($data, 'status'); $status = data_get($data, 'status');
$subscriptionId = data_get($data, 'items.data.0.subscription'); $subscriptionId = data_get($data, 'items.data.0.subscription');
@@ -199,26 +210,25 @@ class Stripe extends Controller
$subscription = Subscription::where('stripe_customer_id', $customerId)->first(); $subscription = Subscription::where('stripe_customer_id', $customerId)->first();
if (! $subscription) { if (! $subscription) {
if ($status === 'incomplete_expired') { if ($status === 'incomplete_expired') {
// send_internal_notification('Subscription incomplete expired for customer: '.$customerId);
return response('Subscription incomplete expired', 200); return response('Subscription incomplete expired', 200);
} }
// send_internal_notification('No subscription found for: '.$customerId); if ($teamId) {
$subscription = Subscription::create([
return response('No subscription found', 400); 'team_id' => $teamId,
'stripe_subscription_id' => $subscriptionId,
'stripe_customer_id' => $customerId,
'stripe_invoice_paid' => false,
]);
} else {
return response('No subscription and team id found', 400);
}
} }
$trialEndedAlready = data_get($subscription, 'stripe_trial_already_ended');
$cancelAtPeriodEnd = data_get($data, 'cancel_at_period_end'); $cancelAtPeriodEnd = data_get($data, 'cancel_at_period_end');
$alreadyCancelAtPeriodEnd = data_get($subscription, 'stripe_cancel_at_period_end');
$feedback = data_get($data, 'cancellation_details.feedback'); $feedback = data_get($data, 'cancellation_details.feedback');
$comment = data_get($data, 'cancellation_details.comment'); $comment = data_get($data, 'cancellation_details.comment');
$lookup_key = data_get($data, 'items.data.0.price.lookup_key'); $lookup_key = data_get($data, 'items.data.0.price.lookup_key');
if (str($lookup_key)->contains('ultimate') || str($lookup_key)->contains('dynamic')) {
if (str($lookup_key)->contains('dynamic')) { if (str($lookup_key)->contains('dynamic')) {
$quantity = data_get($data, 'items.data.0.quantity', 2); $quantity = data_get($data, 'items.data.0.quantity', 2);
} else {
$quantity = data_get($data, 'items.data.0.quantity', 10);
}
$team = data_get($subscription, 'team'); $team = data_get($subscription, 'team');
if ($team) { if ($team) {
$team->update([ $team->update([
@@ -237,28 +247,12 @@ class Stripe extends Controller
$subscription->update([ $subscription->update([
'stripe_invoice_paid' => false, 'stripe_invoice_paid' => false,
]); ]);
// send_internal_notification('Subscription paused or incomplete for customer: '.$customerId);
} }
// Trial ended but subscribed, reactive servers
if ($trialEndedAlready && $status === 'active') {
$team = data_get($subscription, 'team');
$team->trialEndedButSubscribed();
}
if ($feedback) { if ($feedback) {
$reason = "Cancellation feedback for {$customerId}: '".$feedback."'"; $reason = "Cancellation feedback for {$customerId}: '".$feedback."'";
if ($comment) { if ($comment) {
$reason .= ' with comment: \''.$comment."'"; $reason .= ' with comment: \''.$comment."'";
} }
// send_internal_notification($reason);
}
if ($alreadyCancelAtPeriodEnd !== $cancelAtPeriodEnd) {
if ($cancelAtPeriodEnd) {
// send_internal_notification('Subscription cancelled at period end for team: ' . $subscription->team->id);
} else {
// send_internal_notification('customer.subscription.updated for customer: '.$customerId);
}
} }
break; break;
case 'customer.subscription.deleted': case 'customer.subscription.deleted':