patreon-8.x-2.x-dev/src/Controller/PatreonController.php

src/Controller/PatreonController.php
<?php

namespace Drupal\patreon\Controller;

use Drupal\Core\Controller\ControllerBase;
use Drupal\Core\State\StateInterface;
use Drupal\patreon\PatreonServiceInterface;
use Psr\Log\LoggerInterface;
use Symfony\Component\DependencyInjection\ContainerInterface;
use Symfony\Component\HttpFoundation\RedirectResponse;
use Symfony\Component\HttpFoundation\RequestStack;

/**
 * A Controller for the Oauth endpoint.
 *
 * @package Drupal\patreon\Controller
 */
class PatreonController extends ControllerBase {

  /**
   * Creates the controller.
   *
   * @param \Drupal\patreon\PatreonServiceInterface $service
   *   A Patreon API service.
   * @param \Symfony\Component\HttpFoundation\RequestStack $stack
   *   The request stack service.
   * @param \Psr\Log\LoggerInterface $logger
   *   A logger channel.
   * @param \Drupal\Core\State\StateInterface $state
   *   A State service.
   */
  public function __construct(
    protected readonly PatreonServiceInterface $service,
    protected readonly RequestStack $stack,
    protected readonly LoggerInterface $logger,
    protected readonly StateInterface $state,
  ) {
  }

  /**
   * Create function.
   *
   * @param \Symfony\Component\DependencyInjection\ContainerInterface $container
   *   Dependency Injection Container.
   *
   * @return \Drupal\patreon\Controller\PatreonController
   *   The Controller interface.
   */
  public static function create(ContainerInterface $container) {
    return new static(
      $container->get('patreon.api'),
      $container->get('request_stack'),
      $container->get('logger.factory')->get('patreon'),
      $container->get('state')
    );
  }

  /**
   * Patreon oauth callback.
   *
   * @return \Symfony\Component\HttpFoundation\RedirectResponse
   *   Redirects to the Patreon settings form.
   */
  public function oauth(): RedirectResponse {

    // Get the variables we need.
    $code = $this->stack->getCurrentRequest()->query->get('code');
    $state = $this->stack->getCurrentRequest()->query->get('state');

    $session = $this->stack->getCurrentRequest()->getSession();
    $session_state = $session->get('oauth2state');

    // Now we have what we need, we can clear out the session for security
    // reasons.
    $session->remove('oauth2state');

    if (!$code || !$state || $state !== $session_state) {

      // If anything is missing, let's get out of here.
      $this->logger->critical($this->t('Could not authenticate Oauth2 return for Patreon API access.'));
      return $this->redirect('<front>');
    }

    try {
      $tokens = $this->service->tokensFromCode($code);
      $this->service->storeTokens($tokens);

      if ($return = $this->service->fetchUser()) {
        if ($id = $this->service->getValueByKey($return, [
          'data',
          'id',
        ])) {
          $this->state->set('patreon.creator_id', $id);
          $this->service->storeCampaigns();
        }
      }
    }
    catch (\Exception $e) {
      $message = $this->t('The Patreon API returned the following error: :error', [
        ':error' => $e->getMessage(),
      ]);
      $this->logger->error($message);
      $this->messenger()->addError($message);
    }

    return $this->redirect('patreon.settings_form');
  }

}

Главная | Обратная связь

drupal hosting | друпал хостинг | it patrol .inc