Commit 5c450909 authored by Bertrand Gauthier's avatar Bertrand Gauthier
Browse files

WIP API : validation de la requête selon un schema OpenAPI

parent c498d232
Loading
Loading
Loading
Loading
Loading
+4 −1
+12 −3
Original line number Diff line number Diff line
<?php

use SygalApi\Validator\ValidatorAbstractFactory;
namespace SygalApi;

use SygalApi\Validator\OpenApi\OpenApiValidatorFactory;
use SygalApi\Validator\OpenApi\OpenApiContentValidationManagerFactory;
use SygalApi\Validator\OpenApi\OpenApiContentValidationManager;

return [
    'service_manager' => [
        'factories' => [
            OpenApiContentValidationManager::class => OpenApiContentValidationManagerFactory::class,
        ],
    ],
    'validators' => [
        'abstract_factories' => [
            ValidatorAbstractFactory::class,
        ],
            OpenApiValidatorFactory::class,
        ]
    ],
    'api-tools-versioning' => [
        'uri' => [
+13 −30
Original line number Diff line number Diff line
@@ -8,16 +8,16 @@ return [
            \SygalApi\V1\Rest\Inscription\InscriptionResource::class => \SygalApi\V1\Rest\Inscription\InscriptionResourceFactory::class,
        ],
    ],
    'validators' => [
        'aliases' => [
            'SygalApi\\V1\\Rest\\Inscription\\Validator' => \SygalApi\V1\Rest\Inscription\Validator\InscriptionResourceValidator::class,
    'openapi_content_validation' => [
        // 'controller' => 'validator'
        'SygalApi\V1\Rest\Inscription\Controller' => 'SygalApi\V1\Rest\Inscription\OpenApiValidator',
    ],
    'openapi_validator_specs' => [
        // 'validator' => [config]
        'SygalApi\V1\Rest\Inscription\OpenApiValidator' => [
            'oas_file_format' => 'yaml',
            'oas_file_path' => __DIR__ . '/schema/inscription/doctorant-api-v1.yaml',
        ],
    'resource_validators' => [
        \SygalApi\V1\Rest\Inscription\Validator\InscriptionResourceValidator::class => [
            'json_schema_file_path' => __DIR__ . '/inscription_schema.json',
            'json_schema_id' => "http://schema/inscription_schema.json",
        ]
    ],
    'router' => [
        'routes' => [
@@ -42,7 +42,7 @@ return [
            'api.rest.inscription' => [
                'type' => 'Segment',
                'options' => [
                    'route' => '/inscription[/:inscription_id]',
                    'route' => '/inscription-administrative[/:inscription_id]',
                    'defaults' => [
                        'controller' => 'SygalApi\\V1\\Rest\\Inscription\\Controller',
                    ],
@@ -201,29 +201,12 @@ return [
            'input_filter' => 'SygalApi\\V1\\Rest\\Diplomation\\Validator',
        ],
        'SygalApi\\V1\\Rest\\Inscription\\Controller' => [
//            'input_filter' => 'SygalApi\\V1\\Rest\\Inscription\\Validator',
            'validator' => 'SygalApi\\V1\\Rest\\Inscription\\Validator',
            'input_filter' => 'SygalApi\\V1\\Rest\\Inscription\\Validator',
        ],
    ],
    'input_filter_specs' => [
        'SygalApi\\V1\\Rest\\Diplomation\\Validator' => [
            0 => [
                'required' => true,
                'validators' => [],
                'filters' => [],
                'name' => 'IdInstancePegase',
                'field_type' => 'string',
            ],
        ],
//        'SygalApi\\V1\\Rest\\Inscription\\Validator' => [
//            0 => [
//                'required' => true,
//                'validators' => [],
//                'filters' => [],
//                'name' => 'IdInstancePegase',
//                'field_type' => 'string',
//            ],
//        ],
        'SygalApi\\V1\\Rest\\Diplomation\\Validator' => [],
        'SygalApi\\V1\\Rest\\Inscription\\Validator' => [],
    ],
    'api-tools-mvc-auth' => [
        'authorization' => [
+0 −48
Original line number Diff line number Diff line
{
  "$schema": "https://json-schema.org/draft/2020-12/schema",

  "type": "object",

  "properties": {

    "routage": {
      "type": "object",
      "properties": {
        "IdInstancePegase": {
          "type": "string"
        }
      },
      "required": ["IdInstancePegase"],
      "additionalProperties": false
    },

    "periode": {
      "type": "object",
      "properties": {
        "code": {
          "type": "string"
        },
        "datedebut": {
          "type": "string",
          "format": "date"
        },
        "datefin": {
          "type": "string",
          "format": "date"
        },
        "anneeuniversitaire": {
          "type": "integer"
        }
      },
      "required": ["code", "datedebut", "datefin"],
      "additionalProperties": false
    }
  },

  "required": [
    "routage",
//    "periode"
  ],

  "additionalProperties": false
}
+305 −0
Original line number Diff line number Diff line
openapi: '3.0.1'
info:
  description: |
    Il s'agit de l'API présentée par l'application de 3ème cycle pour gérer les échanges avec Pegase. 
    Dans cette version initiale une seul flux est géré

    __Inscriptions administratives :__ ce flux permet de pousser les inscriptions administratives des doctorants de Pegase vers l'application de 3ème cycle
  title: Connecteur 3eme cycle pour Pegase v0
  version: '0.1'
servers:
  - url: https://api.server.test/v1
paths:
  /inscription-administrative:
   post:
      tags:
      - doctorant
      summary: Ajout d'une inscription administrative
      description: Ajout d'une inscription administrative
      operationId: creerInscriptionAdministrative
      requestBody:
        description: Les informations de l'inscription administrative pour le doctorant
        required: true
        content:
          application/json:
            schema:
              $ref: '#/components/schemas/InscriptionAdministrative'
      security:
      - idTokenAuth: []
      responses:
        201:
          description: Inscription administrative reçue
        403:
          description: non autorise
        500:
          description: erreur serveur
components:
 securitySchemes:
  # Authorization: Bearer id.token.
  idTokenAuth:
    type: http
    scheme: basic
 schemas:
  InscriptionAdministrative:
    type: object
    required:
      - instancePegase
      - apprenant
      - inscription
    properties:
      instancePegase:
        type: string
        description: identifiant de l'instance de Pegase émettrice. Ceci servira lors des flux retour
      apprenant:
        $ref: '#/components/schemas/Apprenant'
      # dans cette version l'ensemble des incriptions de l'apprenant pour la période est transmis. VOIR SI ON LIMITE A L'INSCRIPTION EN DOCTORANT
      inscription:
        description: l'inscription validée ou annulée.
        $ref: '#/components/schemas/Inscription'
  Apprenant:
    type: object
    description: Les données de l'apprenant
    properties:
      code:
        type: string
        description: le code Pegase de l'apprenant
      INE:
        type: string
        description: Le numéro INE de l'apprenant si connu
      nomDeNaissance:
        type: string
        description: Le nom de naissance
      nomUsuel:
        type: string
        description: Le nom usuel
      prenom:
        type: string
        description: Le prénom
      deuxiemePrenom:
        type: string
        description: Le deuxième prénom
      troisiemePrenom:
        type: string
        description: Le troisième prénom
      prenomUsage:
        type: string
        description: Le prénom d'usage (vide pour le moment)
      genre:
        type: string
        description: Les valeurs `M` ou `F` sont acceptées
      naissance:
        $ref: '#/components/schemas/Naissance'
      mailPersonnel:
        type: string
        description: Adresse de messagerie électronique personnelle
      mailUrgence:
        type: string
        description: Adresse de messagerie électronique d'urgence
      telephonePersonnel:
        type: string
        description: Numéro de téléphone personnel
      telephoneUrgence:
        type: string
        description: Numéro de téléphone d'urgence
      adresseFixeHorsPeriodeUniversitaire:
        description: Adresse postale hors periode universitaire
        $ref: '#/components/schemas/Adresse'
      adresseResidenceUniversitaire:
        description: Adresse postale universitaire
        $ref: '#/components/schemas/Adresse'
  Inscription:
    type: object
    properties:
      noCandidat:
        type: string
        description: Le numéro de candidature
      origine:
        description: L'origine de la candidature de l'étudiant.
        enum:
        - concours
        - parcoursup
        - ecandidat
        - manuel
        - reinscription
        - monmaster
      formation:
        type: string
        description: le libellé de la formation
      chemin:
        type: string
        description: liste des codes ObjetFormation ou Groupement depuis la Formation racine incluse.
        example: LICENCE_MAI>LICENCE-MAI-L1
      codeStructureEtablissementDuChemin:
        type: string
        description: Le code structure de l’établissement pour le chemin
      periode:
        $ref: '#/components/schemas/Periode'
      principale:
        type: boolean
        description: le temoin indiquant si une inscription est principale ou pas
      statutInscription:
        description: Le statut de l'inscription
        type: string
        enum:
        - valide
        - annulee
      regimeInscription:
        $ref: '#/components/schemas/RegimeInscription'
      boursesEtAides:
        type: array
        items:
          $ref: '#/components/schemas/BourseOuAideFinanciere'
        description: Les bourses et aides financières
      cesure:
        type: string
        enum:
          - SANS
          - SEMESTRE
          - ANNEE
        description: La césure
      mobilite:
        type: string
        enum:
          - SANS
          - ENTRANTE
          - SORTANTE
        description: La mobilité
      ecoleDoctorale:
        type: string
        description: code de la nomenclature école doctorale
      dateInscription:
        type: string
        description: La date de l'inscription au format AAAA-MM-JJ
      dateAnnulation:
        type: string
        description: La date d'annulation de l'inscription au format AAAA-MM-JJ

  Naissance:
    type: object
    properties:
      dateDeNaissance:
        type: string
        description: La date de naissance au format AAAA-MM-JJ
      paysDeNaissance:
        type: string
        description: |
          Le code pays du pays de naissance (code ISO-alpha 2)
          Ex : 100 = France
        example: 100
      libellePaysDeNaissance:
        type: string
        description: |
          Le libelle du pays de naissance
        example: France
      communeDeNaissance:
        type: string
        description: |
          Le code INSEE de la commune de naissance en France
          Ex : 67482 = Strasbourg
        example: 67482
      libelleCommuneDeNaissance:
        type: string
        description: Le libelle de la commune de naissance en France
        example: Strasbourg
      communeDeNaissanceEtranger:
        type: string
        description: La commune de naissance à l'étranger
      nationalite:
        type: string
        description: Le code pays associé à la nationalité (code ISO-alpha 2)
      libelleNationalite:
        type: string
        description: Le libelle pays associé à la nationalité issu de la nomenclature Pays et Nationalités
      deuxiemeNationalite:
        type: string
        description: Le code pays associé à la deuxième nationalité (code ISO-alpha 2)
      libelleDeuxiemeNationalite:
        type: string
        description: Le libelle pays associé à la deuxième nationalité issu de la nomenclature Pays et Nationalités
      dateDObtentionDeLaDeuxiemeNationalite:
        type: string
        description: La date d'obtention de la deuxième nationalité au format AAAA-MM-JJ

  Adresse:
    type: object
    required:
      - pays
    properties:
      pays:
        type: string
        description: Code ISO-alpha 2 du pays (FR pour la France, sinon l'adresse est à l'étranger)
      libellePays:
        type: string
        description: libelle du pays
      ligne1OuEtage:
        type: string
        description: Le n°app/étage/couloir/esc/chez ou ligne 1 de l'adresse étrangère
      ligne2OuBatiment:
        type: string
        description: L'entrée/bâtiment/immeuble/résidence ou ligne 2 de l'adresse étrangère
      ligne3OuVoie:
        type: string
        description: Le numéro et le libellé de la voie ou ligne 3 de l'adresse étrangère
      ligne4OuComplement:
        type: string
        description: Le lieu-dit ou service particulier de distribution ou ligne 4 de l'adresse étrangère
      ligne5Etranger:
        type: string
        description: Ligne 5 de l'adresse étrangère (vide si adresse en France)
      codePostal:
        type: string
        description: Le code postal de l'adresse en France (vide si adresse étrangère)
      codeInsee:
        type: string
        description: Le code INSEE de la commune de l'adresse en France (vide si adresse étrangère)
      libelleCommune:
        type: string
        description: Le libelle de la commune de l'adresse en France (vide si adresse étrangère)

  Periode:
    description: La période de mise en œuvre associée à la formation
    type: object
    properties:
      code:
        type: string
        description: le code de la période
      libelle:
        type: string
        description: Le libellé de la période de mise en œuvre.
      dateDebut:
        type: string
        description: date de début de validité au format AAAA-MM-JJ
      dateFin:
        type: string
        description: date de fin de validité au format AAAA-MM-JJ
      anneeUniversitaire:
        type: integer
        description: L'année universitaire associée à la période au format AAAA.

  BourseOuAideFinanciere:
    type: object
    description: bourse ou aide financiere
    required:
      - code
      - libelle
    properties:
      code:
        type: string
        description: le code
      libelle:
        type: string
        description: le libellé d'affichage

  RegimeInscription:
    type: object
    description: régime d'inscription
    required:
      - code
      - libelle
    properties:
      code:
        type: string
        description: le code
      libelle:
        type: string
        description: le libellé d'affichage
Loading