Commit 4e2daf49 authored by Jean-Baptiste Oellers's avatar Jean-Baptiste Oellers
Browse files

Apis publiques

parent 2d027b8e
Loading
Loading
Loading
Loading
Loading
+2 −1
Original line number Diff line number Diff line
@@ -25,7 +25,8 @@ return array(
        // gearman
        'gearman-job-server-host' => 'localhost',


        // Clé d'API Sirene INSEE
        'insee-sirene-api-key' => '',

        ////////////////////////////////////////////////////////////////////////
        // ! EXPERIMENTAL !
+9 −0
Original line number Diff line number Diff line
@@ -549,6 +549,14 @@ return array(
                    'action' => ['privileges-modifier'],
                    'privileges' => [\Oscar\Provider\Privileges::DROIT_PRIVILEGE_EDITION],
                ],
                [
                    'controller' => 'ApisPubliques',
                    'action' => [
                        'pageSimple',
                        'api'
                    ],
                    'roles' => ['user']
                ],
            ]
        ],
    ],
@@ -649,6 +657,7 @@ return array(
            'Timesheet' => \Oscar\Controller\TimesheetControllerFactory::class,
            'Person' => \Oscar\Controller\PersonControllerFactory::class,
            'WorkPackage' => \Oscar\Controller\WorkPackageControllerFactory::class,
            'ApisPubliques' => \Oscar\Controller\ApisPubliquesControllerFactory::class,
        ],
        "aliases" => [
            'Enroll' => \Oscar\Controller\EnrollController::class
+16 −0
Original line number Diff line number Diff line
@@ -2214,3 +2214,19 @@ activity-mots-cles:
        route: /api
        defaults:
          action: api

apis-publiques:
  type: literal
  options:
    route: /apis-publiques
    defaults:
      controller: ApisPubliques
      action: pageSimple
  may_terminate: true
  child_routes:
    api:
      type: segment
      options:
        route: /api
        defaults:
          action: api
+182 −0
Original line number Diff line number Diff line
<?php

namespace Oscar\Controller;

use Laminas\Http\Response;
use Laminas\View\Model\JsonModel;
use Oscar\Service\OscarConfigurationService;

class ApisPubliquesController extends AbstractOscarController
{

  /** @var OscarConfigurationService */
  public $oscarConfigurationService;

  public function apiAction()
  {

    try {

      if ($this->getRequest()->getMethod() == "POST") {

        $action_json = json_decode($this->getRequest()->getContent());

        if ($action_json->action == "recherche-ror") {

          $curl = curl_init();
          $url = 'https://api.ror.org/v2/organizations?query=' . urlencode($action_json->search);
          curl_setopt($curl, CURLOPT_URL, $url);
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
          $return = curl_exec($curl);
          $errno = curl_errno($curl);
          if ($errno != 0) {
            curl_close($curl);
            $response = new Response();
            $response->setStatusCode(Response::STATUS_CODE_500);
            $response->setContent(curl_error($curl));
            return $response;
          }
          $resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
          if ($resultStatus != 200) {
            curl_close($curl);
            $response = new Response();
            $response->setStatusCode(Response::STATUS_CODE_500);
            $response->setContent($return);
            return $response;
          }
          curl_close($curl);

          $response = new JsonModel();
          $response->setVariables(json_decode($return, true));
          return $response;
        } else if ($action_json->action == "recherche-orcid") {

          $curl = curl_init();
          $url = 'https://pub.orcid.org/v3.0/search/?q=email:' . urlencode($action_json->search);
          curl_setopt($curl, CURLOPT_URL, $url);
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
          $return = curl_exec($curl);
          $errno = curl_errno($curl);
          if ($errno != 0) {
            curl_close($curl);
            $response = new Response();
            $response->setStatusCode(Response::STATUS_CODE_500);
            $response->setContent(curl_error($curl));
            return $response;
          }
          $resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
          if ($resultStatus != 200) {
            curl_close($curl);
            $response = new Response();
            $response->setStatusCode(Response::STATUS_CODE_500);
            $response->setContent($return);
            return $response;
          }
          curl_close($curl);

          $all = json_decode($return, true);

          $persons = [];
          if ($all['num-found'] > 0) {
            foreach($all['result'] as $r) {
              $person = [];
              $person['uri'] = $r['orcid-identifier']['uri'];
              $person['path'] = $r['orcid-identifier']['path'];

              $curl = curl_init();
              $url = 'https://pub.orcid.org/v3.0/' . $r['orcid-identifier']['path'] . '/record';
              curl_setopt($curl, CURLOPT_URL, $url);
              curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
              curl_setopt($curl, CURLOPT_HTTPHEADER, array('Accept: application/json'));
              $return = curl_exec($curl);
              $errno = curl_errno($curl);
              if ($errno != 0) {
                curl_close($curl);
                $response = new Response();
                $response->setStatusCode(Response::STATUS_CODE_500);
                $response->setContent(curl_error($curl));
                return $response;
              }
              $resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
              if ($resultStatus != 200) {
                curl_close($curl);
                $response = new Response();
                $response->setStatusCode(Response::STATUS_CODE_500);
                $response->setContent($return);
                return $response;
              }
              curl_close($curl);

              $details = json_decode($return, true);
              $person['familyname'] = $details['person']['name']['family-name']['value'];
              $person['givenname'] = $details['person']['name']['given-names']['value'];
              $emails = [];
              foreach ($details['person']['emails']['email'] as $e) {
                $emails[] = $e['email'];
              }
              $person['emails'] = $emails;

              $persons[] = $person;
              if (count($persons) >= 2) {
                break;
              }
            }
          }

          $response = new JsonModel();
          $response->setVariable('numfound', $all['num-found']);
          $response->setVariable('persons', $persons);
          return $response;
        } else if ($action_json->action == "recherche-sirene") {

          $curl = curl_init();
          $url = 'https://api.insee.fr/api-sirene/3.11/siret?q=denominationUniteLegale:*' . urlencode($action_json->search) . '*';
          curl_setopt($curl, CURLOPT_URL, $url);
          curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
          curl_setopt($curl, CURLOPT_HTTPHEADER, array('accept: application/json;charset=utf-8;qs=1', 'X-INSEE-Api-Key-Integration: ' . $this->oscarConfigurationService->getConfiguration('insee-sirene-api-key')));
          $return = curl_exec($curl);
          $errno = curl_errno($curl);
          if ($errno != 0) {
            curl_close($curl);
            $response = new Response();
            $response->setStatusCode(Response::STATUS_CODE_500);
            $response->setContent(curl_error($curl));
            return $response;
          }
          $resultStatus = curl_getinfo($curl, CURLINFO_HTTP_CODE);
          if ($resultStatus != 200) {
            curl_close($curl);
            $response = new Response();
            $response->setStatusCode(Response::STATUS_CODE_500);
            $response->setContent($return);
            return $response;
          }
          curl_close($curl);

          $response = new JsonModel();
          $response->setVariables(json_decode($return, true));
          return $response;
        }
      }

      $response = new Response();
      $response->setStatusCode(Response::STATUS_CODE_405);
      $response->setContent("Method Not Allowed.");
      return $response;

    } catch (Throwable $e) {
        $response = new Response();
        $response->setStatusCode(Response::STATUS_CODE_500);
        $response->setContent($e->getMessage());
        return $response;
    }
  }

  public function pageSimpleAction() {
    return [
      'urlApisPubliquesApi' => $this->url()->fromRoute('apis-publiques/api')
    ];
  }

}
+17 −0
Original line number Diff line number Diff line
<?php

namespace Oscar\Controller;

use Interop\Container\ContainerInterface;
use Laminas\ServiceManager\Factory\FactoryInterface;
use Oscar\Service\OscarConfigurationService;

class ApisPubliquesControllerFactory implements FactoryInterface
{
    public function __invoke(ContainerInterface $container, $requestedName, array $options = null)
    {
        $c = new ApisPubliquesController();
        $c->oscarConfigurationService = $container->get(OscarConfigurationService::class);
        return $c;
    }
}
Loading