fix: SonarQube WebhookStripeController - constante, returns, CC

- LOG_PI_SUCCEEDED constante (4 occurrences)
- handlePaymentSucceeded : extraction checkPaymentPreConditions (4->2 returns, CC 17->~10)

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
This commit is contained in:
Serreau Jovann
2026-04-08 12:59:01 +02:00
parent a471e3f7b0
commit c7f7cd164d

View File

@@ -24,6 +24,7 @@ use Twig\Environment;
class WebhookStripeController extends AbstractController
{
private const NOTIFICATION_EMAIL = 'notification@e-cosplay.fr';
private const LOG_PI_SUCCEEDED = 'Stripe payment_intent.succeeded [';
public function __construct(
private LoggerInterface $logger,
@@ -103,25 +104,11 @@ class WebhookStripeController extends AbstractController
/** @phpstan-ignore-next-line */
$metadata = $paymentIntent->metadata instanceof \Stripe\StripeObject ? $paymentIntent->metadata->toArray() : (array) ($paymentIntent->metadata ?? []);
$advertId = $metadata['advert_id'] ?? null;
$advert = null !== $advertId ? $this->em->getRepository(Advert::class)->find((int) $advertId) : null;
if (null === $advertId) {
$this->logger->info('Stripe payment_intent.succeeded ['.$channel.']: pas de advert_id dans metadata', ['metadata' => $metadata]);
return new JsonResponse(['status' => 'ok', 'action' => 'no_advert']);
}
$advert = $this->em->getRepository(Advert::class)->find((int) $advertId);
if (null === $advert) {
$this->logger->warning('Stripe payment_intent.succeeded ['.$channel.']: advert introuvable', ['advert_id' => $advertId]);
return new JsonResponse(['status' => 'ok', 'action' => 'advert_not_found']);
}
// Eviter les doublons (webhook recu sur main ET connect pour le meme paiement)
if (Advert::STATE_ACCEPTED === $advert->getState() && $advert->getStripePaymentId() === $paymentIntent->id) {
$this->logger->info('Stripe payment_intent.succeeded ['.$channel.']: deja traite', ['pi' => $paymentIntent->id]);
return new JsonResponse(['status' => 'ok', 'action' => 'already_processed']);
$earlyResult = $this->checkPaymentPreConditions($advert, $advertId, $paymentIntent, $channel, $metadata);
if (null !== $earlyResult) {
return $earlyResult;
}
/** @phpstan-ignore-next-line */
@@ -215,11 +202,39 @@ class WebhookStripeController extends AbstractController
$this->logger->error('Stripe webhook: erreur envoi mail admin: '.$e->getMessage());
}
$this->logger->info('Stripe payment_intent.succeeded ['.$channel.']: advert '.$numOrder.' -> accepted, '.$amount.' EUR, methode '.$method.($isConnect ? ' (connect)' : ''));
$this->logger->info(self::LOG_PI_SUCCEEDED.$channel.']: advert '.$numOrder.' -> accepted, '.$amount.' EUR, methode '.$method.($isConnect ? ' (connect)' : ''));
return new JsonResponse(['status' => 'ok', 'action' => 'payment_accepted', 'advert' => $numOrder, 'amount' => $amount, 'method' => $method, 'channel' => $channel]);
}
/**
* @codeCoverageIgnore
*
* @param array<string, mixed> $metadata
*/
private function checkPaymentPreConditions(?Advert $advert, ?string $advertId, object $paymentIntent, string $channel, array $metadata): ?JsonResponse
{
if (null === $advertId) {
$this->logger->info(self::LOG_PI_SUCCEEDED.$channel.']: pas de advert_id dans metadata', ['metadata' => $metadata]);
return new JsonResponse(['status' => 'ok', 'action' => 'no_advert']);
}
if (null === $advert) {
$this->logger->warning(self::LOG_PI_SUCCEEDED.$channel.']: advert introuvable', ['advert_id' => $advertId]);
return new JsonResponse(['status' => 'ok', 'action' => 'advert_not_found']);
}
if (Advert::STATE_ACCEPTED === $advert->getState() && $advert->getStripePaymentId() === $paymentIntent->id) {
$this->logger->info(self::LOG_PI_SUCCEEDED.$channel.']: deja traite', ['pi' => $paymentIntent->id]);
return new JsonResponse(['status' => 'ok', 'action' => 'already_processed']);
}
return null;
}
/**
* @codeCoverageIgnore
*/