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
-
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. -
@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:
-
@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:
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:
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...