Fehler in openapi.json definition der privacyPolicyAgreement?



  • Hallo Zusammen,
    wir sind gerade daran zum neuen REST Api eine PHP client library zu machen.
    Dazu machen wir erste Versuche mit https://github.com/janephp/janephp und die Clientklassen sehen gut aus und funktionieren auch grösstenteils.

    Was aber nicht funktioniert ist der Zugriff auf die Personen, und zwar stolpert es hier über das Feld "privacyPolicyAgreement".

    Gemäss openapi.json sollte das ein objekt sein, das API scheint mir hier aber ein (leeres) Array zurückzugeben.

    Hier die Definition:

    "privacyPolicyAgreement": {
      "type": "object",
      "properties": {
        "date": {
        "type": "string",
        "format": "date",
        "nullable": true
      },
      "typeId": {
        "type": "integer",
        "nullable": true
      },
      "whoId": {
        "type": "integer",
        "nullable": true
      }
    }
    },
    

    Was mir aber das Api beim aufruf zurückgibt:

    {
      "data": {
        "id": 6,
    Zeilen gelöscht wegen privacy
        "email": "meineemail",
        "cmsUserId": "xxxxxx",
        "privacyPolicyAgreement": [],
        "nationalityId": 150,
        "familyStatusId": 2,
    Zeilen gelöscht wegen privacy
      }
    }
    

    Da scheint ein Array zurückzukommen....

    Frage nun: Macht das Jane PHP Framework etwas falsch, weil es da ein Objekt erwartet, oder macht CT da etwas falsch (entweder die Definition oder die Antwort)?



  • @aschild Hier übrigens noch etwas was swagger am Schema zu beanstanden hat, wenn man das file in https://editor.swagger.io/ öffnet.

    Errors
    
    Structural error at paths./persons/{id}/servicerequests.get.parameters.0
    should NOT have additional properties
    additionalProperty: id
    Jump to line 2873
    

    Ich vermute mal, dass das Feld id nicht Optional sein kann, da es ja in der URL verwendet wird.....

    '/persons/{id}/servicerequests':
       get:
         summary: Get all service requests for a person
         description: Use this endpoint to get all service requests for this user.
         operationId: getOpenServiceRequestsForPerson
         tags:
           - Person
           - Service & Service Groups
         parameters:
           - id: null
             name: id
             in: path
             description: ID of person
             required: true
             schema:
               type: integer
               example: 42
    

  • ChurchToolsMitarbeiter

    Wenn ich das richtig sehe ist das ein PHP Problem 🙂

    Also, normalerweise kommt da ein Objekt zurück, aber wenn das leer ist kommt ein Array zurück.

    Das liegt daran, dass in PHP Arrays auch als Maps verwendet werden.

    Beispiel:

    Map: ['foo' => 'bar']
    Array: ['bar']

    Wenn jetzt die Map oder das Array leer sind sehen beide so aus: []
    Das führt dazu, dass beim Konvertieren der Struktur ein Array bei einer leeren Map rauskommt.
    Ich hab das jetzt nicht überprüft, aber sieht mir stark nach dem Problem aus.


  • ChurchToolsMitarbeiter

    @aschild Den Fehler zu den servicerequests hab ich in der Docu behoben und kommt dann mit der nächsten Version.

    Hier der git diff falls du es selber schon ausprobieren willst:

    Screenshot 2019-11-20 at 21.19.04.png



  • @davidschilling sagte in Fehler in openapi.json definition der privacyPolicyAgreement?:

    @aschild Den Fehler zu den servicerequests hab ich in der Docu behoben und kommt dann mit der nächsten Version.

    Hier der git diff falls du es selber schon ausprobieren willst:

    Screenshot 2019-11-20 at 21.19.04.png
    @davidschilling

    Die Sourcedatei habe ich auf dem Server nicht gefunden, aber kein Problem, da kann ich auf die nächste Version warten.



  • @davidschilling Ich habe nun mal im finalen openapi.json das entfernt und dann durch den Validator gejagt:

    http://online.swagger.io/validator/debug?url=https://tools.ref-nidau.ch/system/runtime/swagger/openapi.json

    0	"attribute components.schemas.PersonSetting.items is missing"
    1	"attribute paths.'/persons/{id}/settings'(get).responses.200.content.schema.items is missing"
    2	"attribute paths.'/persons/{id}/settings/{module}'(get).responses.200.content.schema.items is missing"
    3	"attribute paths.'/persons/{id}/settings/{module}/{attribute}'(get).responses.200.content.schema.items is missing"
    4	"attribute paths.'/persons/{id}/settings/{module}/{attribute}'(put).responses.200.content.schema.items is missing"
    

    Auch der hier stolpert an der gleichen Stelle
    https://openapi-generator.tech/

    Und mittels https://speccy.io/

    speccy lint openapi.json
    Specification schema is invalid.
    
    #/paths/~1persons~1{id}~1settings/get/responses/200/content/application~1json/oneOf/2
    expected Object { type: 'array' } to have property items
    
    #/paths/~1persons~1{id}~1settings/get/responses/200/content/application~1json
    expected Object {
      summary: 'Get a specific campus',
      tags: Array [ 'Campus' ],
      parameters: Array [
        Object {
      ... snip ...
    } to have property operationId
    
    #/paths/~1persons~1{id}~1settings/get/responses/200/content
    expected Object {
      summary: 'Update campus',
      tags: Array [ 'Campus' ],
      parameters: Array [
        Object {
      ... snip ...
    } to have property operationId
    
    #/paths/~1persons~1{id}~1settings/get/responses/200
    expected Object {
      summary: 'Delete a campus',
      tags: Array [ 'Campus' ],
      parameters: Array [
        Object {
      ... snip ...
    } to have property operationId
    
    #/paths/~1persons~1{id}~1settings/get/responses
    expected Object {
      summary: 'Get a specific status',
      tags: Array [ 'Status' ],
      parameters: Array [
        Object {
      ... snip ...
    } to have property operationId
    
    #/paths/~1persons~1{id}~1settings/get
    expected Object {
      summary: 'Update status',
      tags: Array [ 'Status' ],
      parameters: Array [
        Object {
      ... snip ...
    } to have property operationId
    
    #/paths/~1persons~1{id}~1settings
    expected Object {
      summary: 'Delete a status',
      tags: Array [ 'Status' ],
      parameters: Array [
        Object {
      ... snip ...
    } to have property operationId
    


  • @davidschilling sagte in Fehler in openapi.json definition der privacyPolicyAgreement?:

    Wenn ich das richtig sehe ist das ein PHP Problem 🙂

    Also, normalerweise kommt da ein Objekt zurück, aber wenn das leer ist kommt ein Array zurück.

    Das liegt daran, dass in PHP Arrays auch als Maps verwendet werden.

    Beispiel:

    Map: ['foo' => 'bar']
    Array: ['bar']

    Wenn jetzt die Map oder das Array leer sind sehen beide so aus: []
    Das führt dazu, dass beim Konvertieren der Struktur ein Array bei einer leeren Map rauskommt.
    Ich hab das jetzt nicht überprüft, aber sieht mir stark nach dem Problem aus.

    So wie ich das sehe, passend hier Definition und Rückgabewert nicht zusammen, wenn bei der Person keine privacyPolicyAgreement gespeichert ist.

    Die Definition erwartet ein Objekt mit den 3 properties date/typeId/whoId, die zwar alle null sein dürfen, aber das objekt selbst sollte in der JSON Anwort daherkommen.

    Wenn keine privacyPolicyAgreement vorhanden ist, dann sollte doch das Feld privacyPolicyAgreement als Nullable definiert sein und auch als null zurückgeliefert werden...

    Wir als Schweizer dürfen dieses Feld glücklicherweise noch für 2-3 Jahre ignorieren, daher ist es bei uns noch Leer und führt zu diesem Stolpern...


Log in to reply