Loading config/autoload/local.php.dist +2 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ return array( // gearman 'gearman-job-server-host' => 'localhost', // Clé d'API Sirene INSEE 'insee-sirene-api-key' => '', //////////////////////////////////////////////////////////////////////// // ! EXPERIMENTAL ! Loading module/Oscar/config/module.config.php +9 −0 Original line number Diff line number Diff line Loading @@ -549,6 +549,14 @@ return array( 'action' => ['privileges-modifier'], 'privileges' => [\Oscar\Provider\Privileges::DROIT_PRIVILEGE_EDITION], ], [ 'controller' => 'ApisPubliques', 'action' => [ 'pageSimple', 'api' ], 'roles' => ['user'] ], ] ], ], Loading Loading @@ -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 Loading module/Oscar/config/routes.yml +16 −0 Original line number Diff line number Diff line Loading @@ -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 module/Oscar/src/Oscar/Controller/ApisPubliquesController.php 0 → 100644 +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') ]; } } module/Oscar/src/Oscar/Controller/ApisPubliquesControllerFactory.php 0 → 100644 +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
config/autoload/local.php.dist +2 −1 Original line number Diff line number Diff line Loading @@ -25,7 +25,8 @@ return array( // gearman 'gearman-job-server-host' => 'localhost', // Clé d'API Sirene INSEE 'insee-sirene-api-key' => '', //////////////////////////////////////////////////////////////////////// // ! EXPERIMENTAL ! Loading
module/Oscar/config/module.config.php +9 −0 Original line number Diff line number Diff line Loading @@ -549,6 +549,14 @@ return array( 'action' => ['privileges-modifier'], 'privileges' => [\Oscar\Provider\Privileges::DROIT_PRIVILEGE_EDITION], ], [ 'controller' => 'ApisPubliques', 'action' => [ 'pageSimple', 'api' ], 'roles' => ['user'] ], ] ], ], Loading Loading @@ -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 Loading
module/Oscar/config/routes.yml +16 −0 Original line number Diff line number Diff line Loading @@ -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
module/Oscar/src/Oscar/Controller/ApisPubliquesController.php 0 → 100644 +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') ]; } }
module/Oscar/src/Oscar/Controller/ApisPubliquesControllerFactory.php 0 → 100644 +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; } }