From b2a48d9665130a992ecf83a422323a752e19eafb Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Tue, 17 Nov 2020 17:00:56 +0100 Subject: [PATCH 01/13] :heavy_plus_sign: add drf-nested-routers --- requirements/base.in | 1 + requirements/base.txt | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/requirements/base.in b/requirements/base.in index bc0f4795..b4f97f5f 100644 --- a/requirements/base.in +++ b/requirements/base.in @@ -22,6 +22,7 @@ django-sniplates djangorestframework # django-extra-fields # django-filter +drf-nested-routers drf-yasg # api documentation # WSGI servers & monitoring - production oriented diff --git a/requirements/base.txt b/requirements/base.txt index 77c9c426..d7610c5a 100644 --- a/requirements/base.txt +++ b/requirements/base.txt @@ -28,7 +28,7 @@ django-solo==1.1.3 # via vng-api-common django==2.2.12 # via -r requirements/base.in, django-appconf, django-axes, django-choices, django-filter, django-jsonsuit, django-redis, django-rest-framework-condition, django-rosetta, django-sniplates, drf-nested-routers, drf-yasg, vng-api-common djangorestframework-camel-case==1.2.0 # via vng-api-common djangorestframework==3.9.4 # via -r requirements/base.in, drf-nested-routers, drf-yasg, vng-api-common -drf-nested-routers==0.91 # via vng-api-common +drf-nested-routers==0.91 # via -r requirements/base.in, vng-api-common drf-yasg==1.16.0 # via -r requirements/base.in, vng-api-common elastic-apm==5.5.2 # via -r requirements/base.in gemma-zds-client==0.13.3 # via vng-api-common From 2988c6f8fb459eaaf8312d3ad337222ce3b63d9a Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Tue, 17 Nov 2020 17:48:58 +0100 Subject: [PATCH 02/13] :sparkles: https://github.com/maykinmedia/objects-api/issues/95 -- add /versions nested endpoint --- src/objecttypes/api/serializers.py | 25 ++++++++++++++++++++++--- src/objecttypes/api/urls.py | 12 ++++++++---- src/objecttypes/api/views.py | 11 +++++++++-- 3 files changed, 39 insertions(+), 9 deletions(-) diff --git a/src/objecttypes/api/serializers.py b/src/objecttypes/api/serializers.py index 84e17c06..17c57ac6 100644 --- a/src/objecttypes/api/serializers.py +++ b/src/objecttypes/api/serializers.py @@ -1,26 +1,45 @@ from rest_framework import serializers +from rest_framework_nested.relations import NestedHyperlinkedRelatedField +from rest_framework_nested.serializers import NestedHyperlinkedModelSerializer from objecttypes.core.models import ObjectType, ObjectVersion -class ObjectVersionSerializer(serializers.ModelSerializer): +class ObjectVersionSerializer(NestedHyperlinkedModelSerializer): + parent_lookup_kwargs = {"objecttype_uuid": "object_type__uuid"} + class Meta: model = ObjectVersion fields = ( + "url", "version", + "objectType", "publicationDate", "status", "jsonSchema", ) extra_kwargs = { - "publicationDate": {"source": "publication_date"}, + "url": {"lookup_field": "version"}, + "version": {"read_only": True}, + "objectType": { + "source": "object_type", + "lookup_field": "uuid", + "read_only": True, + }, + "publicationDate": {"source": "publication_date", "read_only": True}, "jsonSchema": {"source": "json_schema"}, "status": {"read_only": True}, } class ObjectTypeSerializer(serializers.HyperlinkedModelSerializer): - versions = ObjectVersionSerializer(many=True) + versions = NestedHyperlinkedRelatedField( + many=True, + read_only=True, + lookup_field="version", + view_name="objectversion-detail", + parent_lookup_kwargs={"objecttype_uuid": "object_type__uuid"}, + ) class Meta: model = ObjectType diff --git a/src/objecttypes/api/urls.py b/src/objecttypes/api/urls.py index 1c108607..bd97114a 100644 --- a/src/objecttypes/api/urls.py +++ b/src/objecttypes/api/urls.py @@ -1,13 +1,17 @@ from django.conf.urls import include from django.urls import path, re_path -from rest_framework import routers +from vng_api_common import routers from vng_api_common.schema import SchemaView -from .views import ObjectTypeViewSet +from .views import ObjectTypeViewSet, ObjectVersionViewSet -router = routers.DefaultRouter(trailing_slash=False) -router.register(r"objecttypes", ObjectTypeViewSet) +router = routers.DefaultRouter() +router.register( + r"objecttypes", + ObjectTypeViewSet, + [routers.nested("versions", ObjectVersionViewSet)], +) urlpatterns = [ diff --git a/src/objecttypes/api/views.py b/src/objecttypes/api/views.py index dfafc5be..446db6cd 100644 --- a/src/objecttypes/api/views.py +++ b/src/objecttypes/api/views.py @@ -1,9 +1,10 @@ from rest_framework import viewsets +from vng_api_common.viewsets import NestedViewSetMixin -from objecttypes.core.models import ObjectType +from objecttypes.core.models import ObjectType, ObjectVersion from .filters import ObjectTypeFilterSet -from .serializers import ObjectTypeSerializer +from .serializers import ObjectTypeSerializer, ObjectVersionSerializer class ObjectTypeViewSet(viewsets.ReadOnlyModelViewSet): @@ -11,3 +12,9 @@ class ObjectTypeViewSet(viewsets.ReadOnlyModelViewSet): serializer_class = ObjectTypeSerializer lookup_field = "uuid" filterset_class = ObjectTypeFilterSet + + +class ObjectVersionViewSet(NestedViewSetMixin, viewsets.ModelViewSet): + queryset = ObjectVersion.objects.order_by("object_type", "-version") + serializer_class = ObjectVersionSerializer + lookup_field = "version" From 31401571b6fd9c0a7affe4a3f2c4dc7f92387192 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Tue, 17 Nov 2020 18:00:11 +0100 Subject: [PATCH 03/13] :sparkles: make API endpoints writable --- src/objecttypes/api/views.py | 13 ++++++++++--- 1 file changed, 10 insertions(+), 3 deletions(-) diff --git a/src/objecttypes/api/views.py b/src/objecttypes/api/views.py index 446db6cd..9025b456 100644 --- a/src/objecttypes/api/views.py +++ b/src/objecttypes/api/views.py @@ -1,4 +1,4 @@ -from rest_framework import viewsets +from rest_framework import mixins, viewsets from vng_api_common.viewsets import NestedViewSetMixin from objecttypes.core.models import ObjectType, ObjectVersion @@ -7,14 +7,21 @@ from .serializers import ObjectTypeSerializer, ObjectVersionSerializer -class ObjectTypeViewSet(viewsets.ReadOnlyModelViewSet): +class ObjectTypeViewSet( + mixins.CreateModelMixin, mixins.UpdateModelMixin, viewsets.ReadOnlyModelViewSet +): queryset = ObjectType.objects.prefetch_related("versions").order_by("-pk") serializer_class = ObjectTypeSerializer lookup_field = "uuid" filterset_class = ObjectTypeFilterSet -class ObjectVersionViewSet(NestedViewSetMixin, viewsets.ModelViewSet): +class ObjectVersionViewSet( + NestedViewSetMixin, + mixins.CreateModelMixin, + mixins.UpdateModelMixin, + viewsets.ReadOnlyModelViewSet, +): queryset = ObjectVersion.objects.order_by("object_type", "-version") serializer_class = ObjectVersionSerializer lookup_field = "version" From 643b083f4517c9630f38aafb4ffe938f952499d9 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 18 Nov 2020 14:28:58 +0100 Subject: [PATCH 04/13] :sparkle: generate version number for objecttypes --- .../migrations/0013_auto_20201118_1251.py | 20 +++++++++++ src/objecttypes/core/models.py | 20 ++++++++++- src/objecttypes/core/tests/factories.py | 1 - .../tests/test_version_generate.py | 33 +++++++++++++++++++ 4 files changed, 72 insertions(+), 2 deletions(-) create mode 100644 src/objecttypes/core/migrations/0013_auto_20201118_1251.py create mode 100644 src/objecttypes/tests/test_version_generate.py diff --git a/src/objecttypes/core/migrations/0013_auto_20201118_1251.py b/src/objecttypes/core/migrations/0013_auto_20201118_1251.py new file mode 100644 index 00000000..b7c62b0e --- /dev/null +++ b/src/objecttypes/core/migrations/0013_auto_20201118_1251.py @@ -0,0 +1,20 @@ +# Generated by Django 2.2.12 on 2020-11-18 11:51 + +from django.db import migrations, models + + +class Migration(migrations.Migration): + + dependencies = [ + ("core", "0012_auto_20201112_1123"), + ] + + operations = [ + migrations.AlterField( + model_name="objectversion", + name="version", + field=models.PositiveSmallIntegerField( + help_text="Integer version of the OBJECTTYPE", verbose_name="version" + ), + ), + ] diff --git a/src/objecttypes/core/models.py b/src/objecttypes/core/models.py index 72ce09eb..1f25d830 100644 --- a/src/objecttypes/core/models.py +++ b/src/objecttypes/core/models.py @@ -120,7 +120,7 @@ class ObjectVersion(models.Model): ObjectType, on_delete=models.CASCADE, related_name="versions" ) version = models.PositiveSmallIntegerField( - _("version"), help_text=_("Integer version of the OBJECTTYPE"), default=1 + _("version"), help_text=_("Integer version of the OBJECTTYPE") ) publication_date = models.DateField( _("publication date"), @@ -152,3 +152,21 @@ def clean(self): schema_validator.check_schema(self.json_schema) except SchemaError as exc: raise ValidationError(exc.args[0]) from exc + + def save(self, *args, **kwargs): + if not self.version: + self.version = self.generate_version_number() + + super().save(*args, **kwargs) + + def generate_version_number(self) -> int: + existed_versions = ObjectVersion.objects.filter(object_type=self.object_type) + + max_version = 0 + if existed_versions.exists(): + max_version = existed_versions.aggregate(models.Max("version"))[ + "version__max" + ] + + version_number = max_version + 1 + return version_number diff --git a/src/objecttypes/core/tests/factories.py b/src/objecttypes/core/tests/factories.py index c8074ff3..07dab6a7 100644 --- a/src/objecttypes/core/tests/factories.py +++ b/src/objecttypes/core/tests/factories.py @@ -14,7 +14,6 @@ class Meta: class ObjectVersionFactory(factory.django.DjangoModelFactory): object_type = factory.SubFactory(ObjectTypeFactory) - version = factory.Sequence(lambda n: n) json_schema = { "type": "object", "title": "Tree", diff --git a/src/objecttypes/tests/test_version_generate.py b/src/objecttypes/tests/test_version_generate.py new file mode 100644 index 00000000..2f0d2e84 --- /dev/null +++ b/src/objecttypes/tests/test_version_generate.py @@ -0,0 +1,33 @@ +from django.test import TestCase + +from objecttypes.core.models import ObjectVersion +from objecttypes.core.tests.factories import ObjectTypeFactory, ObjectVersionFactory + +JSON_SCHEMA = { + "type": "object", + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["diameter"], + "properties": {"diameter": {"type": "integer", "description": "size in cm."}}, +} + + +class GenerateVersionTests(TestCase): + def test_generate_version_for_new_objecttype(self): + object_type = ObjectTypeFactory.create() + + object_version = ObjectVersion.objects.create( + json_schema=JSON_SCHEMA, object_type=object_type + ) + + self.assertEqual(object_version.version, 1) + + def test_generate_version_for_objecttype_with_existed_version(self): + object_type = ObjectTypeFactory.create() + ObjectVersionFactory.create(object_type=object_type, version=1) + + object_version = ObjectVersion.objects.create( + json_schema=JSON_SCHEMA, object_type=object_type + ) + + self.assertEqual(object_version.version, 2) From b7df151e3e83c3c6f2cdca544c545fae96fba88f Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 18 Nov 2020 17:25:30 +0100 Subject: [PATCH 05/13] :sparkles: retrieve object_type when creating version --- src/objecttypes/api/serializers.py | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/src/objecttypes/api/serializers.py b/src/objecttypes/api/serializers.py index 17c57ac6..c33eee42 100644 --- a/src/objecttypes/api/serializers.py +++ b/src/objecttypes/api/serializers.py @@ -31,6 +31,13 @@ class Meta: "status": {"read_only": True}, } + def create(self, validated_data): + kwargs = self.context["request"].resolver_match.kwargs + object_type = ObjectType.objects.get(uuid=kwargs["objecttype_uuid"]) + validated_data["object_type"] = object_type + + return super().create(validated_data) + class ObjectTypeSerializer(serializers.HyperlinkedModelSerializer): versions = NestedHyperlinkedRelatedField( From 090ea598131d9402411139075830d52fceecc9e1 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 18 Nov 2020 17:26:15 +0100 Subject: [PATCH 06/13] :white_check_mark: Ref. https://github.com/maykinmedia/objects-api/issues/95 -- test writable API --- src/objecttypes/tests/test_objecttype_api.py | 161 ++++++++++++++++++- 1 file changed, 155 insertions(+), 6 deletions(-) diff --git a/src/objecttypes/tests/test_objecttype_api.py b/src/objecttypes/tests/test_objecttype_api.py index 9d9df688..0856e421 100644 --- a/src/objecttypes/tests/test_objecttype_api.py +++ b/src/objecttypes/tests/test_objecttype_api.py @@ -1,11 +1,27 @@ +from datetime import date + from django.urls import reverse from rest_framework import status from rest_framework.test import APITestCase +from objecttypes.core.constants import ( + DataClassificationChoices, + ObjectVersionStatus, + UpdateFrequencyChoices, +) +from objecttypes.core.models import ObjectType, ObjectVersion from objecttypes.core.tests.factories import ObjectTypeFactory, ObjectVersionFactory from objecttypes.utils.test import TokenAuthMixin +JSON_SCHEMA = { + "type": "object", + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["diameter"], + "properties": {"diameter": {"type": "integer", "description": "size in cm."}}, +} + class ObjectTypeAPITests(TokenAuthMixin, APITestCase): def test_get_objecttypes(self): @@ -34,12 +50,145 @@ def test_get_objecttypes(self): "documentationUrl": object_type.documentation_url, "labels": object_type.labels, "versions": [ - { - "version": object_version.version, - "publicationDate": object_version.publication_date.isoformat(), - "jsonSchema": object_version.json_schema, - "status": object_version.status, - } + f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_version.version])}" ], }, ) + + def test_create_objecttype(self): + url = reverse("objecttype-list") + data = { + "name": "boom", + "namePlural": "bomen", + "description": "tree type description", + "dataClassification": DataClassificationChoices.intern, + "maintainerOrganization": "tree municipality", + "maintainerDepartment": "object types department", + "contactPerson": "John Smith", + "contactEmail": "John.Smith@objecttypes.nl", + "source": "tree system", + "updateFrequency": UpdateFrequencyChoices.monthly, + "providerOrganization": "tree provider", + "documentationUrl": "http://example.com/doc/trees", + "labels": {"key1": "value1"}, + } + + response = self.client.post(url, data) + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(ObjectType.objects.count(), 1) + + object_type = ObjectType.objects.get() + + self.assertEqual(object_type.name, "boom") + self.assertEqual(object_type.name_plural, "bomen") + self.assertEqual(object_type.description, "tree type description") + self.assertEqual( + object_type.data_classification, DataClassificationChoices.intern + ) + self.assertEqual(object_type.maintainer_organization, "tree municipality") + self.assertEqual(object_type.maintainer_department, "object types department") + self.assertEqual(object_type.contact_person, "John Smith") + self.assertEqual(object_type.contact_email, "John.Smith@objecttypes.nl") + self.assertEqual(object_type.source, "tree system") + self.assertEqual(object_type.update_frequency, UpdateFrequencyChoices.monthly) + self.assertEqual(object_type.provider_organization, "tree provider") + self.assertEqual(object_type.documentation_url, "http://example.com/doc/trees") + self.assertEqual(object_type.labels, {"key1": "value1"}) + + def test_update_objecttype(self): + object_type = ObjectTypeFactory.create( + data_classification=DataClassificationChoices.intern + ) + url = reverse("objecttype-detail", args=[object_type.uuid]) + + response = self.client.patch( + url, {"dataClassification": DataClassificationChoices.open} + ) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + object_type.refresh_from_db() + + self.assertEqual( + object_type.data_classification, DataClassificationChoices.open + ) + + def test_delete_objecttype_not_supported(self): + object_type = ObjectTypeFactory.create() + url = reverse("objecttype-detail", args=[object_type.uuid]) + + response = self.client.delete(url) + + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + + +class ObjectVersionAPITests(TokenAuthMixin, APITestCase): + def test_get_versions(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse("objectversion-list", args=[object_type.uuid]) + + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual( + response.json(), + [ + { + "url": f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_version.version])}", + "version": object_version.version, + "objectType": f"http://testserver{reverse('objecttype-detail', args=[object_version.object_type.uuid])}", + "publicationDate": object_version.publication_date.isoformat(), + "status": object_version.status, + "jsonSchema": JSON_SCHEMA, + } + ], + ) + + def test_create_version(self): + object_type = ObjectTypeFactory.create() + data = {"jsonSchema": JSON_SCHEMA} + url = reverse("objectversion-list", args=[object_type.uuid]) + + response = self.client.post(url, data) + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(ObjectVersion.objects.count(), 1) + + object_version = ObjectVersion.objects.get() + + self.assertEqual(object_version.object_type, object_type) + self.assertEqual(object_version.json_schema, JSON_SCHEMA) + self.assertEqual(object_version.version, 1) + self.assertEqual(object_version.publication_date, date.today()) + self.assertEqual(object_version.status, ObjectVersionStatus.draft) + + def test_update_version(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse( + "objectversion-detail", args=[object_type.uuid, object_version.version] + ) + new_json_schema = { + "type": "object", + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["diameter"], + "properties": {"diameter": {"type": "number"}}, + } + + response = self.client.put(url, {"jsonSchema": new_json_schema}) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_delete_version_not_supported(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse( + "objectversion-detail", args=[object_type.uuid, object_version.version] + ) + + response = self.client.delete(url) + + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) From 167a00c9d6a17173007ccaca001c862344107427 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 18 Nov 2020 17:39:06 +0100 Subject: [PATCH 07/13] :sparkles: add versions//publish endpoint --- src/objecttypes/api/views.py | 15 +++++++++++++++ 1 file changed, 15 insertions(+) diff --git a/src/objecttypes/api/views.py b/src/objecttypes/api/views.py index 9025b456..f7bea0cc 100644 --- a/src/objecttypes/api/views.py +++ b/src/objecttypes/api/views.py @@ -1,6 +1,10 @@ +from drf_yasg.utils import no_body, swagger_auto_schema from rest_framework import mixins, viewsets +from rest_framework.decorators import action +from rest_framework.response import Response from vng_api_common.viewsets import NestedViewSetMixin +from objecttypes.core.constants import ObjectVersionStatus from objecttypes.core.models import ObjectType, ObjectVersion from .filters import ObjectTypeFilterSet @@ -25,3 +29,14 @@ class ObjectVersionViewSet( queryset = ObjectVersion.objects.order_by("object_type", "-version") serializer_class = ObjectVersionSerializer lookup_field = "version" + + @swagger_auto_schema(request_body=no_body) + @action(detail=True, methods=["post"]) + def publish(self, request, *args, **kwargs): + instance = self.get_object() + instance.status = ObjectVersionStatus.published + instance.save() + + serializer = self.get_serializer(instance) + + return Response(serializer.data) From 39b78c236098e7c9602c2f8f9d554fd858910924 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 18 Nov 2020 18:01:59 +0100 Subject: [PATCH 08/13] :white_check_mark: test publish endpoint --- src/objecttypes/tests/test_objecttype_api.py | 89 +--------------- src/objecttypes/tests/test_version_api.py | 105 +++++++++++++++++++ 2 files changed, 107 insertions(+), 87 deletions(-) create mode 100644 src/objecttypes/tests/test_version_api.py diff --git a/src/objecttypes/tests/test_objecttype_api.py b/src/objecttypes/tests/test_objecttype_api.py index 0856e421..259fdd2a 100644 --- a/src/objecttypes/tests/test_objecttype_api.py +++ b/src/objecttypes/tests/test_objecttype_api.py @@ -1,27 +1,13 @@ -from datetime import date - from django.urls import reverse from rest_framework import status from rest_framework.test import APITestCase -from objecttypes.core.constants import ( - DataClassificationChoices, - ObjectVersionStatus, - UpdateFrequencyChoices, -) -from objecttypes.core.models import ObjectType, ObjectVersion +from objecttypes.core.constants import DataClassificationChoices, UpdateFrequencyChoices +from objecttypes.core.models import ObjectType from objecttypes.core.tests.factories import ObjectTypeFactory, ObjectVersionFactory from objecttypes.utils.test import TokenAuthMixin -JSON_SCHEMA = { - "type": "object", - "title": "Tree", - "$schema": "http://json-schema.org/draft-07/schema#", - "required": ["diameter"], - "properties": {"diameter": {"type": "integer", "description": "size in cm."}}, -} - class ObjectTypeAPITests(TokenAuthMixin, APITestCase): def test_get_objecttypes(self): @@ -121,74 +107,3 @@ def test_delete_objecttype_not_supported(self): response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - - -class ObjectVersionAPITests(TokenAuthMixin, APITestCase): - def test_get_versions(self): - object_type = ObjectTypeFactory.create() - object_version = ObjectVersionFactory.create(object_type=object_type) - url = reverse("objectversion-list", args=[object_type.uuid]) - - response = self.client.get(url) - - self.assertEqual(response.status_code, status.HTTP_200_OK) - self.assertEqual( - response.json(), - [ - { - "url": f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_version.version])}", - "version": object_version.version, - "objectType": f"http://testserver{reverse('objecttype-detail', args=[object_version.object_type.uuid])}", - "publicationDate": object_version.publication_date.isoformat(), - "status": object_version.status, - "jsonSchema": JSON_SCHEMA, - } - ], - ) - - def test_create_version(self): - object_type = ObjectTypeFactory.create() - data = {"jsonSchema": JSON_SCHEMA} - url = reverse("objectversion-list", args=[object_type.uuid]) - - response = self.client.post(url, data) - - self.assertEqual(response.status_code, status.HTTP_201_CREATED) - self.assertEqual(ObjectVersion.objects.count(), 1) - - object_version = ObjectVersion.objects.get() - - self.assertEqual(object_version.object_type, object_type) - self.assertEqual(object_version.json_schema, JSON_SCHEMA) - self.assertEqual(object_version.version, 1) - self.assertEqual(object_version.publication_date, date.today()) - self.assertEqual(object_version.status, ObjectVersionStatus.draft) - - def test_update_version(self): - object_type = ObjectTypeFactory.create() - object_version = ObjectVersionFactory.create(object_type=object_type) - url = reverse( - "objectversion-detail", args=[object_type.uuid, object_version.version] - ) - new_json_schema = { - "type": "object", - "title": "Tree", - "$schema": "http://json-schema.org/draft-07/schema#", - "required": ["diameter"], - "properties": {"diameter": {"type": "number"}}, - } - - response = self.client.put(url, {"jsonSchema": new_json_schema}) - - self.assertEqual(response.status_code, status.HTTP_200_OK) - - def test_delete_version_not_supported(self): - object_type = ObjectTypeFactory.create() - object_version = ObjectVersionFactory.create(object_type=object_type) - url = reverse( - "objectversion-detail", args=[object_type.uuid, object_version.version] - ) - - response = self.client.delete(url) - - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) diff --git a/src/objecttypes/tests/test_version_api.py b/src/objecttypes/tests/test_version_api.py new file mode 100644 index 00000000..2dd8969a --- /dev/null +++ b/src/objecttypes/tests/test_version_api.py @@ -0,0 +1,105 @@ +from datetime import date + +from django.urls import reverse + +from rest_framework import status +from rest_framework.test import APITestCase + +from objecttypes.core.constants import ObjectVersionStatus +from objecttypes.core.models import ObjectVersion +from objecttypes.core.tests.factories import ObjectTypeFactory, ObjectVersionFactory +from objecttypes.utils.test import TokenAuthMixin + +JSON_SCHEMA = { + "type": "object", + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["diameter"], + "properties": {"diameter": {"type": "integer", "description": "size in cm."}}, +} + + +class ObjectVersionAPITests(TokenAuthMixin, APITestCase): + def test_get_versions(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse("objectversion-list", args=[object_type.uuid]) + + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + self.assertEqual( + response.json(), + [ + { + "url": f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_version.version])}", + "version": object_version.version, + "objectType": f"http://testserver{reverse('objecttype-detail', args=[object_version.object_type.uuid])}", + "publicationDate": object_version.publication_date.isoformat(), + "status": object_version.status, + "jsonSchema": JSON_SCHEMA, + } + ], + ) + + def test_create_version(self): + object_type = ObjectTypeFactory.create() + data = {"jsonSchema": JSON_SCHEMA} + url = reverse("objectversion-list", args=[object_type.uuid]) + + response = self.client.post(url, data) + + self.assertEqual(response.status_code, status.HTTP_201_CREATED) + self.assertEqual(ObjectVersion.objects.count(), 1) + + object_version = ObjectVersion.objects.get() + + self.assertEqual(object_version.object_type, object_type) + self.assertEqual(object_version.json_schema, JSON_SCHEMA) + self.assertEqual(object_version.version, 1) + self.assertEqual(object_version.publication_date, date.today()) + self.assertEqual(object_version.status, ObjectVersionStatus.draft) + + def test_update_version(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse( + "objectversion-detail", args=[object_type.uuid, object_version.version] + ) + new_json_schema = { + "type": "object", + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["diameter"], + "properties": {"diameter": {"type": "number"}}, + } + + response = self.client.put(url, {"jsonSchema": new_json_schema}) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + def test_delete_version_not_supported(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse( + "objectversion-detail", args=[object_type.uuid, object_version.version] + ) + + response = self.client.delete(url) + + self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + + def test_publish_version(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create(object_type=object_type) + url = reverse( + "objectversion-publish", args=[object_type.uuid, object_version.version] + ) + + response = self.client.post(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + object_version.refresh_from_db() + + self.assertEqual(object_version.status, ObjectVersionStatus.published) From 50f3e8f9ff1f532f61b29f2caaa8657b2ea8f9b0 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 18 Nov 2020 18:18:38 +0100 Subject: [PATCH 09/13] :sparkles: add validators to API since it's writable now --- src/objecttypes/api/serializers.py | 8 ++++++- src/objecttypes/api/validators.py | 38 ++++++++++++++++++++++++++++++ src/objecttypes/core/models.py | 11 ++------- src/objecttypes/core/utils.py | 12 ++++++++++ 4 files changed, 59 insertions(+), 10 deletions(-) create mode 100644 src/objecttypes/api/validators.py create mode 100644 src/objecttypes/core/utils.py diff --git a/src/objecttypes/api/serializers.py b/src/objecttypes/api/serializers.py index c33eee42..f88ce5ee 100644 --- a/src/objecttypes/api/serializers.py +++ b/src/objecttypes/api/serializers.py @@ -4,6 +4,8 @@ from objecttypes.core.models import ObjectType, ObjectVersion +from .validators import JsonSchemaValidator, VersionUpdateValidator + class ObjectVersionSerializer(NestedHyperlinkedModelSerializer): parent_lookup_kwargs = {"objecttype_uuid": "object_type__uuid"} @@ -27,9 +29,13 @@ class Meta: "read_only": True, }, "publicationDate": {"source": "publication_date", "read_only": True}, - "jsonSchema": {"source": "json_schema"}, + "jsonSchema": { + "source": "json_schema", + "validators": [JsonSchemaValidator()], + }, "status": {"read_only": True}, } + validators = [VersionUpdateValidator()] def create(self, validated_data): kwargs = self.context["request"].resolver_match.kwargs diff --git a/src/objecttypes/api/validators.py b/src/objecttypes/api/validators.py new file mode 100644 index 00000000..a3883274 --- /dev/null +++ b/src/objecttypes/api/validators.py @@ -0,0 +1,38 @@ +from django.core.exceptions import ValidationError +from django.utils.translation import ugettext_lazy as _ + +from rest_framework import serializers + +from objecttypes.core.constants import ObjectVersionStatus +from objecttypes.core.utils import check_json_schema + + +class VersionUpdateValidator: + message = _("Only draft versions can be changed") + code = "non-draft-object" + + def set_context(self, serializer): + """ + This hook is called by the serializer instance, + prior to the validation call being made. + """ + # Determine the existing instance, if this is an update operation. + self.instance = getattr(serializer, "instance", None) + self.request = serializer.context["request"] + + def __call__(self, attrs): + if not self.instance: + return + + if self.instance.status != ObjectVersionStatus.draft: + raise serializers.ValidationError(self.message, code=self.code) + + +class JsonSchemaValidator: + code = "invalid-json-schema" + + def __call__(self, value): + try: + check_json_schema(value) + except ValidationError as exc: + raise serializers.ValidationError(exc.args[0], code=self.code) from exc diff --git a/src/objecttypes/core/models.py b/src/objecttypes/core/models.py index 1f25d830..3025df54 100644 --- a/src/objecttypes/core/models.py +++ b/src/objecttypes/core/models.py @@ -2,18 +2,15 @@ from datetime import date from django.contrib.postgres.fields import JSONField -from django.core.exceptions import ValidationError from django.db import models from django.utils.translation import ugettext_lazy as _ -from jsonschema.exceptions import SchemaError -from jsonschema.validators import validator_for - from .constants import ( DataClassificationChoices, ObjectVersionStatus, UpdateFrequencyChoices, ) +from .utils import check_json_schema class ObjectType(models.Model): @@ -147,11 +144,7 @@ def __str__(self): def clean(self): super().clean() - schema_validator = validator_for(self.json_schema) - try: - schema_validator.check_schema(self.json_schema) - except SchemaError as exc: - raise ValidationError(exc.args[0]) from exc + check_json_schema(self.json_schema) def save(self, *args, **kwargs): if not self.version: diff --git a/src/objecttypes/core/utils.py b/src/objecttypes/core/utils.py new file mode 100644 index 00000000..a0d7dd78 --- /dev/null +++ b/src/objecttypes/core/utils.py @@ -0,0 +1,12 @@ +from django.core.exceptions import ValidationError + +from jsonschema.exceptions import SchemaError +from jsonschema.validators import validator_for + + +def check_json_schema(json_schema: dict): + schema_validator = validator_for(json_schema) + try: + schema_validator.check_schema(json_schema) + except SchemaError as exc: + raise ValidationError(exc.args[0]) from exc From 48ba19b163dcb0bc4f71903092aaccbc034e1333 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Thu, 19 Nov 2020 11:57:12 +0100 Subject: [PATCH 10/13] :white_check_mark: test input validation --- src/objecttypes/tests/test_validation.py | 51 ++++++++++++++++++++++++ 1 file changed, 51 insertions(+) create mode 100644 src/objecttypes/tests/test_validation.py diff --git a/src/objecttypes/tests/test_validation.py b/src/objecttypes/tests/test_validation.py new file mode 100644 index 00000000..3dbc0356 --- /dev/null +++ b/src/objecttypes/tests/test_validation.py @@ -0,0 +1,51 @@ +from django.urls import reverse + +from rest_framework import status +from rest_framework.test import APITestCase + +from objecttypes.core.constants import ObjectVersionStatus +from objecttypes.core.tests.factories import ObjectTypeFactory, ObjectVersionFactory +from objecttypes.utils.test import TokenAuthMixin + + +class ObjectVersionValidationTests(TokenAuthMixin, APITestCase): + def test_create_version_with_incorrect_schema_fail(self): + object_type = ObjectTypeFactory.create() + url = reverse("objectversion-list", args=[object_type.uuid]) + data = { + "jsonSchema": { + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "type": "any", + } + } + + response = self.client.post(url, data) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + self.assertTrue("jsonSchema" in response.json()) + + def test_update_published_version_fail(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create( + object_type=object_type, status=ObjectVersionStatus.published + ) + url = reverse( + "objectversion-detail", args=[object_type.uuid, object_version.version] + ) + new_json_schema = { + "type": "object", + "title": "Tree", + "$schema": "http://json-schema.org/draft-07/schema#", + "required": ["diameter"], + "properties": {"diameter": {"type": "number"}}, + } + + response = self.client.put(url, {"jsonSchema": new_json_schema}) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + data = response.json() + self.assertEqual( + data["non_field_errors"], ["Only draft versions can be changed"] + ) From dc47659bed774f1a66eac8d4e4c53619743677bd Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Thu, 19 Nov 2020 11:58:39 +0100 Subject: [PATCH 11/13] :memo: update OAS with writable endpoints --- src/openapi.yaml | 1339 +++++++++++++++++++++++++++++++++-- src/swagger2.0.json | 1609 +++++++++++++++++++++++++++++++++++++++++-- 2 files changed, 2846 insertions(+), 102 deletions(-) diff --git a/src/openapi.yaml b/src/openapi.yaml index f4abcf55..a5c64f56 100644 --- a/src/openapi.yaml +++ b/src/openapi.yaml @@ -147,40 +147,1246 @@ paths: $ref: '#/components/schemas/Fout' tags: - objecttypes + post: + operationId: objecttype_create + description: '' + parameters: + - name: Content-Type + in: header + description: Content type van de verzoekinhoud. + required: true + schema: + type: string + enum: + - application/json + requestBody: + $ref: '#/components/requestBodies/ObjectType' + responses: + '201': + description: Created + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + Location: + schema: + type: string + format: uri + description: URL waar de resource leeft. + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectType' + '400': + description: Bad request + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ValidatieFout' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes parameters: [] + /objecttypes/{objecttype_uuid}/versions: + get: + operationId: objectversion_list + description: '' + responses: + '200': + description: OK + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/json: + schema: + type: array + items: + $ref: '#/components/schemas/ObjectVersion' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + post: + operationId: objectversion_create + description: '' + parameters: + - name: Content-Type + in: header + description: Content type van de verzoekinhoud. + required: true + schema: + type: string + enum: + - application/json + requestBody: + $ref: '#/components/requestBodies/ObjectVersion' + responses: + '201': + description: Created + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + Location: + schema: + type: string + format: uri + description: URL waar de resource leeft. + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectVersion' + '400': + description: Bad request + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ValidatieFout' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + parameters: + - name: objecttype_uuid + in: path + required: true + description: Unieke resource identifier (UUID4) + schema: + type: string + format: uuid + /objecttypes/{objecttype_uuid}/versions/{version}: + get: + operationId: objectversion_read + description: '' + parameters: + - name: If-None-Match + in: header + description: "Voer een voorwaardelijk verzoek uit. Deze header moet \xE9\xE9\ + n of meerdere ETag-waardes bevatten van resources die de consumer gecached\ + \ heeft. Indien de waarde van de ETag van de huidige resource voorkomt in\ + \ deze set, dan antwoordt de provider met een lege HTTP 304 request. Zie\ + \ [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)\ + \ voor meer informatie." + required: false + examples: + oneValue: + summary: "E\xE9n ETag-waarde" + value: '"79054025255fb1a26e4bc422aef54eb4"' + multipleValues: + summary: Meerdere ETag-waardes + value: '"79054025255fb1a26e4bc422aef54eb4", "e4d909c290d0fb1ca068ffaddf22cbd0"' + schema: + type: string + responses: + '200': + description: OK + headers: + ETag: + description: De ETag berekend op de response body JSON. Indien twee + resources exact dezelfde ETag hebben, dan zijn deze resources identiek + aan elkaar. Je kan de ETag gebruiken om caching te implementeren. + schema: + type: string + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectVersion' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + put: + operationId: objectversion_update + description: '' + parameters: + - name: Content-Type + in: header + description: Content type van de verzoekinhoud. + required: true + schema: + type: string + enum: + - application/json + requestBody: + $ref: '#/components/requestBodies/ObjectVersion' + responses: + '200': + description: OK + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectVersion' + '400': + description: Bad request + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ValidatieFout' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + patch: + operationId: objectversion_partial_update + description: '' + parameters: + - name: Content-Type + in: header + description: Content type van de verzoekinhoud. + required: true + schema: + type: string + enum: + - application/json + requestBody: + $ref: '#/components/requestBodies/ObjectVersion' + responses: + '200': + description: OK + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectVersion' + '400': + description: Bad request + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ValidatieFout' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + parameters: + - name: objecttype_uuid + in: path + required: true + description: Unieke resource identifier (UUID4) + schema: + type: string + format: uuid + - name: version + in: path + description: Integer version of the OBJECTTYPE + required: true + schema: + type: integer + /objecttypes/{objecttype_uuid}/versions/{version}/publish: + post: + operationId: objectversion_publish + description: '' + parameters: + - name: Content-Type + in: header + description: Content type van de verzoekinhoud. + required: true + schema: + type: string + enum: + - application/json + responses: + '201': + description: Created + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + Location: + schema: + type: string + format: uri + description: URL waar de resource leeft. + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectVersion' + tags: + - objecttypes + parameters: + - name: objecttype_uuid + in: path + required: true + description: Unieke resource identifier (UUID4) + schema: + type: string + format: uuid + - name: version + in: path + description: Integer version of the OBJECTTYPE + required: true + schema: + type: integer /objecttypes/{uuid}: get: operationId: objecttype_read description: '' parameters: - - name: If-None-Match + - name: If-None-Match + in: header + description: "Voer een voorwaardelijk verzoek uit. Deze header moet \xE9\xE9\ + n of meerdere ETag-waardes bevatten van resources die de consumer gecached\ + \ heeft. Indien de waarde van de ETag van de huidige resource voorkomt in\ + \ deze set, dan antwoordt de provider met een lege HTTP 304 request. Zie\ + \ [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)\ + \ voor meer informatie." + required: false + examples: + oneValue: + summary: "E\xE9n ETag-waarde" + value: '"79054025255fb1a26e4bc422aef54eb4"' + multipleValues: + summary: Meerdere ETag-waardes + value: '"79054025255fb1a26e4bc422aef54eb4", "e4d909c290d0fb1ca068ffaddf22cbd0"' + schema: + type: string + responses: + '200': + description: OK + headers: + ETag: + description: De ETag berekend op de response body JSON. Indien twee + resources exact dezelfde ETag hebben, dan zijn deze resources identiek + aan elkaar. Je kan de ETag gebruiken om caching te implementeren. + schema: + type: string + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectType' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + put: + operationId: objecttype_update + description: '' + parameters: + - name: Content-Type in: header - description: "Voer een voorwaardelijk verzoek uit. Deze header moet \xE9\xE9\ - n of meerdere ETag-waardes bevatten van resources die de consumer gecached\ - \ heeft. Indien de waarde van de ETag van de huidige resource voorkomt in\ - \ deze set, dan antwoordt de provider met een lege HTTP 304 request. Zie\ - \ [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match)\ - \ voor meer informatie." - required: false - examples: - oneValue: - summary: "E\xE9n ETag-waarde" - value: '"79054025255fb1a26e4bc422aef54eb4"' - multipleValues: - summary: Meerdere ETag-waardes - value: '"79054025255fb1a26e4bc422aef54eb4", "e4d909c290d0fb1ca068ffaddf22cbd0"' + description: Content type van de verzoekinhoud. + required: true schema: type: string + enum: + - application/json + requestBody: + $ref: '#/components/requestBodies/ObjectType' responses: '200': description: OK headers: - ETag: - description: De ETag berekend op de response body JSON. Indien twee - resources exact dezelfde ETag hebben, dan zijn deze resources identiek - aan elkaar. Je kan de ETag gebruiken om caching te implementeren. + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectType' + '400': + description: Bad request + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ValidatieFout' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: schema: type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes + patch: + operationId: objecttype_partial_update + description: '' + parameters: + - name: Content-Type + in: header + description: Content type van de verzoekinhoud. + required: true + schema: + type: string + enum: + - application/json + requestBody: + $ref: '#/components/requestBodies/ObjectType' + responses: + '200': + description: OK + headers: API-version: schema: type: string @@ -190,6 +1396,18 @@ paths: application/json: schema: $ref: '#/components/schemas/ObjectType' + '400': + description: Bad request + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/ValidatieFout' '401': description: Unauthorized headers: @@ -314,44 +1532,29 @@ tags: servers: - url: https://example.com/api/v1 components: + requestBodies: + ObjectType: + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectType' + required: true + ObjectVersion: + content: + application/json: + schema: + $ref: '#/components/schemas/ObjectVersion' + required: true securitySchemes: Token: type: apiKey name: Authorization in: header schemas: - ObjectVersion: - type: object - properties: - version: - title: Versie - description: Integer version of the OBJECTTYPE - type: integer - maximum: 32767 - minimum: 0 - publicationDate: - title: Publicationdate - description: Date of Version publication - type: string - format: date - status: - title: Status - description: Status of the object type version - type: string - enum: - - published - - draft - - deprecated - readOnly: true - jsonSchema: - title: JSON schema - description: JSON schema for Object validation - type: object ObjectType: required: - name - namePlural - - versions type: object properties: url: @@ -447,7 +1650,10 @@ components: versions: type: array items: - $ref: '#/components/schemas/ObjectVersion' + type: string + format: uri + readOnly: true + uniqueItems: true Fout: required: - code @@ -551,3 +1757,40 @@ components: type: array items: $ref: '#/components/schemas/FieldValidationError' + ObjectVersion: + type: object + properties: + url: + title: Url + type: string + format: uri + readOnly: true + version: + title: Versie + description: Integer version of the OBJECTTYPE + type: integer + readOnly: true + objectType: + title: Objecttype + type: string + format: uri + readOnly: true + publicationDate: + title: Publicationdate + description: Date of Version publication + type: string + format: date + readOnly: true + status: + title: Status + description: Status of the object type version + type: string + enum: + - published + - draft + - deprecated + readOnly: true + jsonSchema: + title: JSON schema + description: JSON schema for Object validation + type: object diff --git a/src/swagger2.0.json b/src/swagger2.0.json index ff4ac62e..ade57b10 100755 --- a/src/swagger2.0.json +++ b/src/swagger2.0.json @@ -197,28 +197,1505 @@ "objecttypes" ] }, + "post": { + "operationId": "objecttype_create", + "description": "", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "Content type van de verzoekinhoud.", + "required": true, + "type": "string", + "enum": [ + "application/json" + ] + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ObjectType" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/ObjectType" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + }, + "Location": { + "schema": { + "type": "string", + "format": "uri" + }, + "description": "URL waar de resource leeft." + } + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/ValidatieFout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, "parameters": [] }, + "/objecttypes/{objecttype_uuid}/versions": { + "get": { + "operationId": "objectversion_list", + "description": "", + "parameters": [], + "responses": { + "200": { + "description": "OK", + "schema": { + "type": "array", + "items": { + "$ref": "#/definitions/ObjectVersion" + } + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "post": { + "operationId": "objectversion_create", + "description": "", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "Content type van de verzoekinhoud.", + "required": true, + "type": "string", + "enum": [ + "application/json" + ] + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ObjectVersion" + } + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/ObjectVersion" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + }, + "Location": { + "schema": { + "type": "string", + "format": "uri" + }, + "description": "URL waar de resource leeft." + } + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/ValidatieFout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "parameters": [ + { + "name": "objecttype_uuid", + "in": "path", + "required": true, + "type": "string", + "format": "uuid", + "description": "Unieke resource identifier (UUID4)" + } + ] + }, + "/objecttypes/{objecttype_uuid}/versions/{version}": { + "get": { + "operationId": "objectversion_read", + "description": "", + "parameters": [ + { + "name": "If-None-Match", + "in": "header", + "description": "Voer een voorwaardelijk verzoek uit. Deze header moet \u00e9\u00e9n of meerdere ETag-waardes bevatten van resources die de consumer gecached heeft. Indien de waarde van de ETag van de huidige resource voorkomt in deze set, dan antwoordt de provider met een lege HTTP 304 request. Zie [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) voor meer informatie.", + "required": false, + "type": "string", + "examples": { + "oneValue": { + "summary": "E\u00e9n ETag-waarde", + "value": "\"79054025255fb1a26e4bc422aef54eb4\"" + }, + "multipleValues": { + "summary": "Meerdere ETag-waardes", + "value": "\"79054025255fb1a26e4bc422aef54eb4\", \"e4d909c290d0fb1ca068ffaddf22cbd0\"" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ObjectVersion" + }, + "headers": { + "ETag": { + "description": "De ETag berekend op de response body JSON. Indien twee resources exact dezelfde ETag hebben, dan zijn deze resources identiek aan elkaar. Je kan de ETag gebruiken om caching te implementeren.", + "type": "string" + }, + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "put": { + "operationId": "objectversion_update", + "description": "", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "Content type van de verzoekinhoud.", + "required": true, + "type": "string", + "enum": [ + "application/json" + ] + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ObjectVersion" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ObjectVersion" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/ValidatieFout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "patch": { + "operationId": "objectversion_partial_update", + "description": "", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "Content type van de verzoekinhoud.", + "required": true, + "type": "string", + "enum": [ + "application/json" + ] + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ObjectVersion" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ObjectVersion" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/ValidatieFout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "parameters": [ + { + "name": "objecttype_uuid", + "in": "path", + "required": true, + "type": "string", + "format": "uuid", + "description": "Unieke resource identifier (UUID4)" + }, + { + "name": "version", + "in": "path", + "description": "Integer version of the OBJECTTYPE", + "required": true, + "type": "integer" + } + ] + }, + "/objecttypes/{objecttype_uuid}/versions/{version}/publish": { + "post": { + "operationId": "objectversion_publish", + "description": "", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "Content type van de verzoekinhoud.", + "required": true, + "type": "string", + "enum": [ + "application/json" + ] + } + ], + "responses": { + "201": { + "description": "Created", + "schema": { + "$ref": "#/definitions/ObjectVersion" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + }, + "Location": { + "schema": { + "type": "string", + "format": "uri" + }, + "description": "URL waar de resource leeft." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "parameters": [ + { + "name": "objecttype_uuid", + "in": "path", + "required": true, + "type": "string", + "format": "uuid", + "description": "Unieke resource identifier (UUID4)" + }, + { + "name": "version", + "in": "path", + "description": "Integer version of the OBJECTTYPE", + "required": true, + "type": "integer" + } + ] + }, "/objecttypes/{uuid}": { "get": { "operationId": "objecttype_read", "description": "", "parameters": [ { - "name": "If-None-Match", + "name": "If-None-Match", + "in": "header", + "description": "Voer een voorwaardelijk verzoek uit. Deze header moet \u00e9\u00e9n of meerdere ETag-waardes bevatten van resources die de consumer gecached heeft. Indien de waarde van de ETag van de huidige resource voorkomt in deze set, dan antwoordt de provider met een lege HTTP 304 request. Zie [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) voor meer informatie.", + "required": false, + "type": "string", + "examples": { + "oneValue": { + "summary": "E\u00e9n ETag-waarde", + "value": "\"79054025255fb1a26e4bc422aef54eb4\"" + }, + "multipleValues": { + "summary": "Meerdere ETag-waardes", + "value": "\"79054025255fb1a26e4bc422aef54eb4\", \"e4d909c290d0fb1ca068ffaddf22cbd0\"" + } + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ObjectType" + }, + "headers": { + "ETag": { + "description": "De ETag berekend op de response body JSON. Indien twee resources exact dezelfde ETag hebben, dan zijn deze resources identiek aan elkaar. Je kan de ETag gebruiken om caching te implementeren.", + "type": "string" + }, + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "put": { + "operationId": "objecttype_update", + "description": "", + "parameters": [ + { + "name": "Content-Type", + "in": "header", + "description": "Content type van de verzoekinhoud.", + "required": true, + "type": "string", + "enum": [ + "application/json" + ] + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ObjectType" + } + } + ], + "responses": { + "200": { + "description": "OK", + "schema": { + "$ref": "#/definitions/ObjectType" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/ValidatieFout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, + "patch": { + "operationId": "objecttype_partial_update", + "description": "", + "parameters": [ + { + "name": "Content-Type", "in": "header", - "description": "Voer een voorwaardelijk verzoek uit. Deze header moet \u00e9\u00e9n of meerdere ETag-waardes bevatten van resources die de consumer gecached heeft. Indien de waarde van de ETag van de huidige resource voorkomt in deze set, dan antwoordt de provider met een lege HTTP 304 request. Zie [MDN](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/If-None-Match) voor meer informatie.", - "required": false, + "description": "Content type van de verzoekinhoud.", + "required": true, "type": "string", - "examples": { - "oneValue": { - "summary": "E\u00e9n ETag-waarde", - "value": "\"79054025255fb1a26e4bc422aef54eb4\"" - }, - "multipleValues": { - "summary": "Meerdere ETag-waardes", - "value": "\"79054025255fb1a26e4bc422aef54eb4\", \"e4d909c290d0fb1ca068ffaddf22cbd0\"" - } + "enum": [ + "application/json" + ] + }, + { + "name": "data", + "in": "body", + "required": true, + "schema": { + "$ref": "#/definitions/ObjectType" } } ], @@ -229,10 +1706,20 @@ "$ref": "#/definitions/ObjectType" }, "headers": { - "ETag": { - "description": "De ETag berekend op de response body JSON. Indien twee resources exact dezelfde ETag hebben, dan zijn deze resources identiek aan elkaar. Je kan de ETag gebruiken om caching te implementeren.", - "type": "string" - }, + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "400": { + "description": "Bad request", + "schema": { + "$ref": "#/definitions/ValidatieFout" + }, + "headers": { "API-version": { "schema": { "type": "string" @@ -385,45 +1872,10 @@ } }, "definitions": { - "ObjectVersion": { - "type": "object", - "properties": { - "version": { - "title": "Versie", - "description": "Integer version of the OBJECTTYPE", - "type": "integer", - "maximum": 32767, - "minimum": 0 - }, - "publicationDate": { - "title": "Publicationdate", - "description": "Date of Version publication", - "type": "string", - "format": "date" - }, - "status": { - "title": "Status", - "description": "Status of the object type version", - "type": "string", - "enum": [ - "published", - "draft", - "deprecated" - ], - "readOnly": true - }, - "jsonSchema": { - "title": "JSON schema", - "description": "JSON schema for Object validation", - "type": "object" - } - } - }, "ObjectType": { "required": [ "name", - "namePlural", - "versions" + "namePlural" ], "type": "object", "properties": { @@ -532,8 +1984,11 @@ "versions": { "type": "array", "items": { - "$ref": "#/definitions/ObjectVersion" - } + "type": "string", + "format": "uri" + }, + "readOnly": true, + "uniqueItems": true } } }, @@ -663,6 +2118,52 @@ } } } + }, + "ObjectVersion": { + "type": "object", + "properties": { + "url": { + "title": "Url", + "type": "string", + "format": "uri", + "readOnly": true + }, + "version": { + "title": "Versie", + "description": "Integer version of the OBJECTTYPE", + "type": "integer", + "readOnly": true + }, + "objectType": { + "title": "Objecttype", + "type": "string", + "format": "uri", + "readOnly": true + }, + "publicationDate": { + "title": "Publicationdate", + "description": "Date of Version publication", + "type": "string", + "format": "date", + "readOnly": true + }, + "status": { + "title": "Status", + "description": "Status of the object type version", + "type": "string", + "enum": [ + "published", + "draft", + "deprecated" + ], + "readOnly": true + }, + "jsonSchema": { + "title": "JSON schema", + "description": "JSON schema for Object validation", + "type": "object" + } + } } }, "tags": [ From bb0499f7b0db32218ebaee636b769e2b5009c6bc Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 25 Nov 2020 14:29:35 +0100 Subject: [PATCH 12/13] :ok_hand: process PR feedback - remove /publish endpoint --- src/objecttypes/api/serializers.py | 1 - src/objecttypes/api/views.py | 11 --------- src/objecttypes/tests/test_version_api.py | 29 +++++++++-------------- 3 files changed, 11 insertions(+), 30 deletions(-) diff --git a/src/objecttypes/api/serializers.py b/src/objecttypes/api/serializers.py index f88ce5ee..155c6d2c 100644 --- a/src/objecttypes/api/serializers.py +++ b/src/objecttypes/api/serializers.py @@ -33,7 +33,6 @@ class Meta: "source": "json_schema", "validators": [JsonSchemaValidator()], }, - "status": {"read_only": True}, } validators = [VersionUpdateValidator()] diff --git a/src/objecttypes/api/views.py b/src/objecttypes/api/views.py index f7bea0cc..b074e749 100644 --- a/src/objecttypes/api/views.py +++ b/src/objecttypes/api/views.py @@ -29,14 +29,3 @@ class ObjectVersionViewSet( queryset = ObjectVersion.objects.order_by("object_type", "-version") serializer_class = ObjectVersionSerializer lookup_field = "version" - - @swagger_auto_schema(request_body=no_body) - @action(detail=True, methods=["post"]) - def publish(self, request, *args, **kwargs): - instance = self.get_object() - instance.status = ObjectVersionStatus.published - instance.save() - - serializer = self.get_serializer(instance) - - return Response(serializer.data) diff --git a/src/objecttypes/tests/test_version_api.py b/src/objecttypes/tests/test_version_api.py index 2dd8969a..17fb1c94 100644 --- a/src/objecttypes/tests/test_version_api.py +++ b/src/objecttypes/tests/test_version_api.py @@ -44,7 +44,7 @@ def test_get_versions(self): def test_create_version(self): object_type = ObjectTypeFactory.create() - data = {"jsonSchema": JSON_SCHEMA} + data = {"jsonSchema": JSON_SCHEMA, "status": ObjectVersionStatus.published} url = reverse("objectversion-list", args=[object_type.uuid]) response = self.client.post(url, data) @@ -58,7 +58,7 @@ def test_create_version(self): self.assertEqual(object_version.json_schema, JSON_SCHEMA) self.assertEqual(object_version.version, 1) self.assertEqual(object_version.publication_date, date.today()) - self.assertEqual(object_version.status, ObjectVersionStatus.draft) + self.assertEqual(object_version.status, ObjectVersionStatus.published) def test_update_version(self): object_type = ObjectTypeFactory.create() @@ -74,10 +74,18 @@ def test_update_version(self): "properties": {"diameter": {"type": "number"}}, } - response = self.client.put(url, {"jsonSchema": new_json_schema}) + response = self.client.put( + url, + {"jsonSchema": new_json_schema, "status": ObjectVersionStatus.published}, + ) self.assertEqual(response.status_code, status.HTTP_200_OK) + object_version.refresh_from_db() + + self.assertEqual(object_version.json_schema, new_json_schema) + self.assertEqual(object_version.status, ObjectVersionStatus.published) + def test_delete_version_not_supported(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) @@ -88,18 +96,3 @@ def test_delete_version_not_supported(self): response = self.client.delete(url) self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) - - def test_publish_version(self): - object_type = ObjectTypeFactory.create() - object_version = ObjectVersionFactory.create(object_type=object_type) - url = reverse( - "objectversion-publish", args=[object_type.uuid, object_version.version] - ) - - response = self.client.post(url) - - self.assertEqual(response.status_code, status.HTTP_200_OK) - - object_version.refresh_from_db() - - self.assertEqual(object_version.status, ObjectVersionStatus.published) From df9184d43aaf9051a0e22aadd7cc56b90bb6d767 Mon Sep 17 00:00:00 2001 From: Anna Shamray Date: Wed, 25 Nov 2020 15:50:12 +0100 Subject: [PATCH 13/13] :ok_hand: process PR feedback --- src/objecttypes/api/validators.py | 2 +- src/objecttypes/api/views.py | 48 ++- src/objecttypes/tests/test_objecttype_api.py | 28 +- src/objecttypes/tests/test_validation.py | 37 +++ src/objecttypes/tests/test_version_api.py | 5 +- src/openapi.yaml | 264 +++++++++++++-- src/swagger2.0.json | 318 ++++++++++++++++--- 7 files changed, 607 insertions(+), 95 deletions(-) diff --git a/src/objecttypes/api/validators.py b/src/objecttypes/api/validators.py index a3883274..2bae0e70 100644 --- a/src/objecttypes/api/validators.py +++ b/src/objecttypes/api/validators.py @@ -9,7 +9,7 @@ class VersionUpdateValidator: message = _("Only draft versions can be changed") - code = "non-draft-object" + code = "non-draft-version-update" def set_context(self, serializer): """ diff --git a/src/objecttypes/api/views.py b/src/objecttypes/api/views.py index b074e749..614d6d6f 100644 --- a/src/objecttypes/api/views.py +++ b/src/objecttypes/api/views.py @@ -1,7 +1,8 @@ -from drf_yasg.utils import no_body, swagger_auto_schema -from rest_framework import mixins, viewsets -from rest_framework.decorators import action -from rest_framework.response import Response +from django.utils.translation import ugettext_lazy as _ + +from rest_framework import viewsets +from rest_framework.exceptions import ValidationError +from rest_framework.settings import api_settings from vng_api_common.viewsets import NestedViewSetMixin from objecttypes.core.constants import ObjectVersionStatus @@ -11,21 +12,42 @@ from .serializers import ObjectTypeSerializer, ObjectVersionSerializer -class ObjectTypeViewSet( - mixins.CreateModelMixin, mixins.UpdateModelMixin, viewsets.ReadOnlyModelViewSet -): +class ObjectTypeViewSet(viewsets.ModelViewSet): queryset = ObjectType.objects.prefetch_related("versions").order_by("-pk") serializer_class = ObjectTypeSerializer lookup_field = "uuid" filterset_class = ObjectTypeFilterSet + def perform_destroy(self, instance): + if instance.versions.exists(): + raise ValidationError( + { + api_settings.NON_FIELD_ERRORS_KEY: [ + _( + "All related versions should be destroyed before destroying the objecttype" + ) + ] + }, + code="pending-versions", + ) + + super().perform_destroy(instance) + -class ObjectVersionViewSet( - NestedViewSetMixin, - mixins.CreateModelMixin, - mixins.UpdateModelMixin, - viewsets.ReadOnlyModelViewSet, -): +class ObjectVersionViewSet(NestedViewSetMixin, viewsets.ModelViewSet): queryset = ObjectVersion.objects.order_by("object_type", "-version") serializer_class = ObjectVersionSerializer lookup_field = "version" + + def perform_destroy(self, instance): + if instance.status != ObjectVersionStatus.draft: + raise ValidationError( + { + api_settings.NON_FIELD_ERRORS_KEY: [ + _("Only draft versions can be destroyed") + ] + }, + code="non-draft-version-destroy", + ) + + super().perform_destroy(instance) diff --git a/src/objecttypes/tests/test_objecttype_api.py b/src/objecttypes/tests/test_objecttype_api.py index 259fdd2a..4c076271 100644 --- a/src/objecttypes/tests/test_objecttype_api.py +++ b/src/objecttypes/tests/test_objecttype_api.py @@ -41,6 +41,29 @@ def test_get_objecttypes(self): }, ) + def test_get_objecttypes_with_versions(self): + object_types = ObjectTypeFactory.create_batch(2) + object_versions = [ + ObjectVersionFactory.create(object_type=object_type) + for object_type in object_types + ] + for i, object_type in enumerate(object_types): + with self.subTest(object_type=object_type): + url = reverse("objecttype-detail", args=[object_type.uuid]) + + response = self.client.get(url) + + self.assertEqual(response.status_code, status.HTTP_200_OK) + + data = response.json() + self.assertEqual(len(data["versions"]), 1) + self.assertEqual( + data["versions"], + [ + f"http://testserver{reverse('objectversion-detail', args=[object_type.uuid, object_versions[i].version])}" + ], + ) + def test_create_objecttype(self): url = reverse("objecttype-list") data = { @@ -100,10 +123,11 @@ def test_update_objecttype(self): object_type.data_classification, DataClassificationChoices.open ) - def test_delete_objecttype_not_supported(self): + def test_delete_objecttype(self): object_type = ObjectTypeFactory.create() url = reverse("objecttype-detail", args=[object_type.uuid]) response = self.client.delete(url) - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertEqual(ObjectType.objects.count(), 0) diff --git a/src/objecttypes/tests/test_validation.py b/src/objecttypes/tests/test_validation.py index 3dbc0356..ffc50e1f 100644 --- a/src/objecttypes/tests/test_validation.py +++ b/src/objecttypes/tests/test_validation.py @@ -8,6 +8,25 @@ from objecttypes.utils.test import TokenAuthMixin +class ObjectTypeValidationTests(TokenAuthMixin, APITestCase): + def test_delete_objecttype_with_versions_fail(self): + object_type = ObjectTypeFactory.create() + ObjectVersionFactory.create(object_type=object_type) + url = reverse("objecttype-detail", args=[object_type.uuid]) + + response = self.client.delete(url) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + data = response.json() + self.assertEqual( + data["non_field_errors"], + [ + "All related versions should be destroyed before destroying the objecttype" + ], + ) + + class ObjectVersionValidationTests(TokenAuthMixin, APITestCase): def test_create_version_with_incorrect_schema_fail(self): object_type = ObjectTypeFactory.create() @@ -49,3 +68,21 @@ def test_update_published_version_fail(self): self.assertEqual( data["non_field_errors"], ["Only draft versions can be changed"] ) + + def test_delete_puclished_version_fail(self): + object_type = ObjectTypeFactory.create() + object_version = ObjectVersionFactory.create( + object_type=object_type, status=ObjectVersionStatus.published + ) + url = reverse( + "objectversion-detail", args=[object_type.uuid, object_version.version] + ) + + response = self.client.delete(url) + + self.assertEqual(response.status_code, status.HTTP_400_BAD_REQUEST) + + data = response.json() + self.assertEqual( + data["non_field_errors"], ["Only draft versions can be destroyed"] + ) diff --git a/src/objecttypes/tests/test_version_api.py b/src/objecttypes/tests/test_version_api.py index 17fb1c94..17d673cf 100644 --- a/src/objecttypes/tests/test_version_api.py +++ b/src/objecttypes/tests/test_version_api.py @@ -86,7 +86,7 @@ def test_update_version(self): self.assertEqual(object_version.json_schema, new_json_schema) self.assertEqual(object_version.status, ObjectVersionStatus.published) - def test_delete_version_not_supported(self): + def test_delete_version(self): object_type = ObjectTypeFactory.create() object_version = ObjectVersionFactory.create(object_type=object_type) url = reverse( @@ -95,4 +95,5 @@ def test_delete_version_not_supported(self): response = self.client.delete(url) - self.assertEqual(response.status_code, status.HTTP_405_METHOD_NOT_ALLOWED) + self.assertEqual(response.status_code, status.HTTP_204_NO_CONTENT) + self.assertEqual(ObjectVersion.objects.count(), 0) diff --git a/src/openapi.yaml b/src/openapi.yaml index a5c64f56..97565b43 100644 --- a/src/openapi.yaml +++ b/src/openapi.yaml @@ -1007,51 +1007,126 @@ paths: $ref: '#/components/schemas/Fout' tags: - objecttypes - parameters: - - name: objecttype_uuid - in: path - required: true - description: Unieke resource identifier (UUID4) - schema: - type: string - format: uuid - - name: version - in: path - description: Integer version of the OBJECTTYPE - required: true - schema: - type: integer - /objecttypes/{objecttype_uuid}/versions/{version}/publish: - post: - operationId: objectversion_publish + delete: + operationId: objectversion_delete description: '' - parameters: - - name: Content-Type - in: header - description: Content type van de verzoekinhoud. - required: true - schema: - type: string - enum: - - application/json responses: - '201': - description: Created + '204': + description: No content headers: API-version: schema: type: string description: 'Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1.' - Location: + '401': + description: Unauthorized + headers: + API-version: schema: type: string - format: uri - description: URL waar de resource leeft. + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' content: - application/json: + application/problem+json: schema: - $ref: '#/components/schemas/ObjectVersion' + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' tags: - objecttypes parameters: @@ -1518,6 +1593,128 @@ paths: $ref: '#/components/schemas/Fout' tags: - objecttypes + delete: + operationId: objecttype_delete + description: '' + responses: + '204': + description: No content + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + '401': + description: Unauthorized + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '403': + description: Forbidden + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '404': + description: Not found + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '406': + description: Not acceptable + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '409': + description: Conflict + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '410': + description: Gone + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '415': + description: Unsupported media type + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '429': + description: Too many requests + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + '500': + description: Internal server error + headers: + API-version: + schema: + type: string + description: 'Geeft een specifieke API-versie aan in de context van + een specifieke aanroep. Voorbeeld: 1.2.1.' + content: + application/problem+json: + schema: + $ref: '#/components/schemas/Fout' + tags: + - objecttypes parameters: - name: uuid in: path @@ -1789,7 +1986,6 @@ components: - published - draft - deprecated - readOnly: true jsonSchema: title: JSON schema description: JSON schema for Object validation diff --git a/src/swagger2.0.json b/src/swagger2.0.json index ade57b10..41601711 100755 --- a/src/swagger2.0.json +++ b/src/swagger2.0.json @@ -1241,45 +1241,26 @@ "objecttypes" ] }, - "parameters": [ - { - "name": "objecttype_uuid", - "in": "path", - "required": true, - "type": "string", - "format": "uuid", - "description": "Unieke resource identifier (UUID4)" - }, - { - "name": "version", - "in": "path", - "description": "Integer version of the OBJECTTYPE", - "required": true, - "type": "integer" - } - ] - }, - "/objecttypes/{objecttype_uuid}/versions/{version}/publish": { - "post": { - "operationId": "objectversion_publish", + "delete": { + "operationId": "objectversion_delete", "description": "", - "parameters": [ - { - "name": "Content-Type", - "in": "header", - "description": "Content type van de verzoekinhoud.", - "required": true, - "type": "string", - "enum": [ - "application/json" - ] - } - ], + "parameters": [], "responses": { - "201": { - "description": "Created", + "204": { + "description": "No content", + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", "schema": { - "$ref": "#/definitions/ObjectVersion" + "$ref": "#/definitions/Fout" }, "headers": { "API-version": { @@ -1287,13 +1268,118 @@ "type": "string" }, "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." - }, - "Location": { + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { "schema": { - "type": "string", - "format": "uri" + "type": "string" }, - "description": "URL waar de resource leeft." + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." } } } @@ -1859,6 +1945,153 @@ "objecttypes" ] }, + "delete": { + "operationId": "objecttype_delete", + "description": "", + "parameters": [], + "responses": { + "204": { + "description": "No content", + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "401": { + "description": "Unauthorized", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "403": { + "description": "Forbidden", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "404": { + "description": "Not found", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "406": { + "description": "Not acceptable", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "409": { + "description": "Conflict", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "410": { + "description": "Gone", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "415": { + "description": "Unsupported media type", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "429": { + "description": "Too many requests", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + }, + "500": { + "description": "Internal server error", + "schema": { + "$ref": "#/definitions/Fout" + }, + "headers": { + "API-version": { + "schema": { + "type": "string" + }, + "description": "Geeft een specifieke API-versie aan in de context van een specifieke aanroep. Voorbeeld: 1.2.1." + } + } + } + }, + "tags": [ + "objecttypes" + ] + }, "parameters": [ { "name": "uuid", @@ -2155,8 +2388,7 @@ "published", "draft", "deprecated" - ], - "readOnly": true + ] }, "jsonSchema": { "title": "JSON schema",