Skip to content

Commit 3d7aad8

Browse files
committed
Merge branch 'develop' of https://github.com/aiondemand/AIOD-rest-api into enh/update_person
2 parents 1511fbd + 94404cc commit 3d7aad8

34 files changed

+713
-349
lines changed

.env

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,15 +28,14 @@ AIBUILDER_API_TOKEN=""
2828
ES_USER=elastic
2929
ES_PASSWORD=changeme
3030
ES_DISCOVERY_TYPE=single-node
31-
ES_ROLE="edit_aiod_resources"
3231
ES_JAVA_OPTS="-Xmx256m -Xms256m"
3332
AIOD_ES_HTTP_PORT=9200
3433
AIOD_ES_TRANSPORT_PORT=9300
3534

3635
#LOGSTASH
3736
LS_JAVA_OPTS="-Xmx256m -Xms256m"
3837
AIOD_LOGSTASH_BEATS_PORT=5044
39-
AIOD_LOGSTASH_PORT=5000
38+
AIOD_LOGSTASH_PORT=5001
4039
AIOD_LOGSTASH_API_PORT=9600
4140

4241
#NGINX

data/keycloak/data/import/aiod-realm.json

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -75,17 +75,9 @@
7575
"clientRole" : false,
7676
"containerId" : "3df7e07d-ebbd-41c4-bc0c-1ba0e1a40ac5",
7777
"attributes" : { }
78-
}, {
79-
"id" : "18c2dc78-1119-4432-970b-3187f49bfa58",
80-
"name" : "edit_aiod_resources",
81-
"description" : "",
82-
"composite" : false,
83-
"clientRole" : false,
84-
"containerId" : "3df7e07d-ebbd-41c4-bc0c-1ba0e1a40ac5",
85-
"attributes" : { }
8678
}, {
8779
"id" : "2acb73ad-574d-4b77-b5dc-0fa9fd2ec8d7",
88-
"name" : "${REVIEWER_ROLE_NAME}",
80+
"name" : "review_aiod_resources",
8981
"description" : "Can review submitted AIoD resources",
9082
"composite" : false,
9183
"clientRole" : false,
@@ -1232,7 +1224,7 @@
12321224
"subType" : "authenticated",
12331225
"subComponents" : { },
12341226
"config" : {
1235-
"allowed-protocol-mapper-types" : [ "saml-role-list-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-full-name-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper" ]
1227+
"allowed-protocol-mapper-types" : [ "oidc-full-name-mapper", "saml-user-attribute-mapper", "oidc-sha256-pairwise-sub-mapper", "oidc-address-mapper", "oidc-usermodel-property-mapper", "oidc-usermodel-attribute-mapper", "saml-role-list-mapper", "saml-user-property-mapper" ]
12361228
}
12371229
}, {
12381230
"id" : "10f8b9b2-1038-4c98-b7a5-a9ac88fed69e",
@@ -1274,7 +1266,7 @@
12741266
"subType" : "anonymous",
12751267
"subComponents" : { },
12761268
"config" : {
1277-
"allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-address-mapper", "oidc-usermodel-attribute-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper", "saml-role-list-mapper" ]
1269+
"allowed-protocol-mapper-types" : [ "oidc-usermodel-property-mapper", "saml-user-property-mapper", "saml-user-attribute-mapper", "oidc-usermodel-attribute-mapper", "oidc-address-mapper", "saml-role-list-mapper", "oidc-full-name-mapper", "oidc-sha256-pairwise-sub-mapper" ]
12781270
}
12791271
}, {
12801272
"id" : "1d21f027-e0ae-4b80-b95e-f21d9426f115",

data/keycloak/data/import/aiod-users-0.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,7 @@
5656
} ],
5757
"disableableCredentialTypes" : [ ],
5858
"requiredActions" : [ ],
59-
"realmRoles" : [ "default-roles-aiod", "edit_aiod_resources" ],
59+
"realmRoles" : [ "default-roles-aiod"],
6060
"notBefore" : 0,
6161
"groups" : [ ]
6262
} ]

docs/contributing.md

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,8 +90,17 @@ It is also generally useful to set add an `override.env` file to the project's r
9090
the line `USE_LOCAL_DEV=true` added. This will allow utility scripts `./scripts/up.sh` and `./scripts/down.sh`
9191
to start docker containers in a way that reflects local changes.
9292

93+
### Pre-commit
94+
Finally, configure your [pre-commit](https://pre-commit.com) hooks using `pre-commit install`.
95+
This will install some hooks to run before a commit can be made, these hooks will run various checks such as a code formatter, linter, file validation, and unit tests.
96+
These hooks help make sure formatting is more homogeneous across the project, and that no breaking changes are accidentally committed.
97+
9398
## Making a Code Changes
9499
See the ["Developer Documentation"](developer/index.md) for the technical documentation of this project.
95100
More to be added.
96101

102+
Note that when using our convenience scripts to launch docker containers (see ["Shorthands"](hosting/index.md#shorthands)),
103+
local code changes are not mounted to the docker containers unless `USE_LOCAL_DEV` is set to `true`. You should configure this
104+
variable in your `override.env`.
105+
97106
[//]: # (## Setting up a pull request)

docs/developer/authentication.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,9 +4,9 @@ For authentication, we use a [keycloak](https://www.keycloak.org) service.
44
For development, make sure to use the `USE_LOCAL_DEV=true` environment variable so that the local
55
keycloak server is configured with default users:
66

7-
| User | Password | Role(s) | Comment |
8-
|------|----------|----------------------------------------------------------------------------|---------|
9-
| user | password | edit_aiod_resources, default-roles-aiod, offline_access, uma_authorization | |
7+
| User | Password | Role(s) | Comment |
8+
|------|----------|-------------------------------------------------------|---------|
9+
| user | password | default-roles-aiod, offline_access, uma_authorization | |
1010

1111
For a description of the roles, see ["AIoD Keycloak Roles"](../hosting/authentication.md#roles).
1212
With the local development configuration, you will only be able to authenticate with keycloak users (OAuth2, password) not by other means.

docs/developer/users.md

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ The user model in AIoD allows users to maintain and share ownership over assets,
44
and to allow a review process for new assets.
55
The components of this user model are defined in [src/database/authorization.py](https://github.com/aiondemand/AIOD-rest-api/blob/develop/src/database/authorization.py)
66
and [src/database/review.py](https://github.com/aiondemand/AIOD-rest-api/blob/develop/src/database/review.py).
7+
Note that for special users (e.g., administrators), this user model may be circumvented through
8+
special Keycloak roles (for more information, see ["Roles"](../hosting/authentication.md)).
79

810
[//]: # (Add a diagram overview once the model is more final, e.g., groups are added)
911

@@ -26,6 +28,10 @@ When user A uploads an asset and assigns user B administrator rights, they have
2628
There is no special privilege for user A, and this also means that e.g., user B may remove administrator rights from user A.
2729

2830
## Reviews
31+
32+
!!! info
33+
The upload and review process is described from a user perspective in ["Uploading"](../using/upload.md).
34+
2935
An asset uploaded by a user is by default in `draft` state.
3036
The user may request the asset to be `published` by submitting it for review through the REST API.
3137
To do this, they submit the identifier of the asset to the `ASSET_TYPE/submit/v1/{identifier}` endpoint.

docs/hosting/authentication.md

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,16 @@ Create both a private and a public client in the external provider (this step is
3838
## Roles
3939

4040
Roles identify a type or category of user and determine their access and permissions within applications.
41-
Currently, only the ` edit_aiod_resources` role is defined, granting users the ability to upload and edit resources.
41+
Roles are generally only necessary for special cases.
42+
The normal flow for granting individual users permissions for individual assets is detailed in the ["user model"](../developer/users.md) documentation.
43+
These are the roles the metadata catalogue uses (`*` in a role indicates its defined for each asset type individually):
44+
45+
* `review_aiod_resources`: identifies the user as having permission to view asset submissions and review them.
46+
* `read_*`: allows the user read access to all assets on the platform, regardless of the asset-specific permissions.
47+
* `update_*`: allows the user update permission for all assets on the platform, regardless of the asset-specific permissions.
48+
* `delete_*`: allows the user delete permission for all assets on the platform, regardless of the asset-specific permissions.
49+
* `create_platforms`: allows the user to define new platforms.
50+
4251
Note that roles may be used for services other than the metadata catalogue.
4352
New roles can be created from the admin console, see ["Creating a realm role"](https://www.keycloak.org/docs/latest/server_admin/index.html#proc-creating-realm-roles_server_administration_guide).
4453

Lines changed: 121 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,121 @@
1+
<mxfile host="app.diagrams.net" agent="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/605.1.15 (KHTML, like Gecko) Version/17.5 Safari/605.1.15" version="26.1.1">
2+
<diagram id="C5RBs43oDa-KdzZeNtuy" name="Page-1">
3+
<mxGraphModel dx="1026" dy="603" grid="1" gridSize="10" guides="1" tooltips="1" connect="1" arrows="1" fold="1" page="1" pageScale="1" pageWidth="827" pageHeight="1169" math="0" shadow="0">
4+
<root>
5+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-0" />
6+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-1" parent="WIyWlLk6GJQsqaUBKTNV-0" />
7+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-2" value="" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=block;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-3" target="WIyWlLk6GJQsqaUBKTNV-6" edge="1">
8+
<mxGeometry relative="1" as="geometry" />
9+
</mxCell>
10+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-3" value="&lt;b&gt;Submit Asset&lt;/b&gt;&lt;div&gt;(POST to&amp;nbsp;/ASSET/v1)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
11+
<mxGeometry x="250" y="65" width="137.5" height="40" as="geometry" />
12+
</mxCell>
13+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-5" value="No" style="edgeStyle=orthogonalEdgeStyle;rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=block;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;" parent="WIyWlLk6GJQsqaUBKTNV-1" edge="1">
14+
<mxGeometry y="10" relative="1" as="geometry">
15+
<mxPoint as="offset" />
16+
<mxPoint x="510" y="109" as="sourcePoint" />
17+
<mxPoint x="490" y="240" as="targetPoint" />
18+
<Array as="points">
19+
<mxPoint x="490" y="109" />
20+
</Array>
21+
</mxGeometry>
22+
</mxCell>
23+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-6" value="&lt;b&gt;Ready for review?&lt;/b&gt;" style="rhombus;whiteSpace=wrap;html=1;shadow=0;fontFamily=Helvetica;fontSize=12;align=center;strokeWidth=1;spacing=6;spacingTop=-4;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
24+
<mxGeometry x="440" y="45" width="100" height="80" as="geometry" />
25+
</mxCell>
26+
<mxCell id="WIyWlLk6GJQsqaUBKTNV-7" value="&lt;b&gt;Edit Asset&lt;/b&gt;&lt;div&gt;(PUT to&amp;nbsp;/ASSET/v1)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" parent="WIyWlLk6GJQsqaUBKTNV-1" vertex="1">
27+
<mxGeometry x="400" y="240" width="150" height="40" as="geometry" />
28+
</mxCell>
29+
<mxCell id="QkUigUnqfaAujryV4CyO-2" value="" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=block;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;entryX=0;entryY=1;entryDx=0;entryDy=0;exitX=0.427;exitY=-0.043;exitDx=0;exitDy=0;exitPerimeter=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="WIyWlLk6GJQsqaUBKTNV-7" target="WIyWlLk6GJQsqaUBKTNV-6">
30+
<mxGeometry relative="1" as="geometry">
31+
<mxPoint x="420" y="187" as="sourcePoint" />
32+
<mxPoint x="450" y="95" as="targetPoint" />
33+
<Array as="points" />
34+
</mxGeometry>
35+
</mxCell>
36+
<mxCell id="QkUigUnqfaAujryV4CyO-4" value="&lt;b&gt;Submit for Review&lt;/b&gt;&lt;div&gt;(POST to /ASSET/submit/v1/IDENTIFIER)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
37+
<mxGeometry x="600" y="65" width="240" height="40" as="geometry" />
38+
</mxCell>
39+
<mxCell id="QkUigUnqfaAujryV4CyO-5" value="" style="rounded=0;html=1;jettySize=auto;orthogonalLoop=1;fontSize=11;endArrow=block;endFill=0;endSize=8;strokeWidth=1;shadow=0;labelBackgroundColor=none;edgeStyle=orthogonalEdgeStyle;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="QkUigUnqfaAujryV4CyO-4">
40+
<mxGeometry relative="1" as="geometry">
41+
<mxPoint x="540" y="84.5" as="sourcePoint" />
42+
<mxPoint x="672" y="84.5" as="targetPoint" />
43+
</mxGeometry>
44+
</mxCell>
45+
<mxCell id="QkUigUnqfaAujryV4CyO-7" value="Yes" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="QkUigUnqfaAujryV4CyO-5">
46+
<mxGeometry x="-0.3338" y="2" relative="1" as="geometry">
47+
<mxPoint y="-13" as="offset" />
48+
</mxGeometry>
49+
</mxCell>
50+
<mxCell id="QkUigUnqfaAujryV4CyO-18" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0.5;exitY=1;exitDx=0;exitDy=0;endArrow=block;endFill=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="QkUigUnqfaAujryV4CyO-8" target="QkUigUnqfaAujryV4CyO-17">
51+
<mxGeometry relative="1" as="geometry">
52+
<mxPoint x="1150" y="350" as="targetPoint" />
53+
<Array as="points">
54+
<mxPoint x="950" y="110" />
55+
<mxPoint x="1120" y="110" />
56+
<mxPoint x="1120" y="300" />
57+
</Array>
58+
</mxGeometry>
59+
</mxCell>
60+
<mxCell id="QkUigUnqfaAujryV4CyO-21" value="Pending&lt;div&gt;Want to Retract&lt;/div&gt;" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="QkUigUnqfaAujryV4CyO-18">
61+
<mxGeometry x="0.2439" relative="1" as="geometry">
62+
<mxPoint x="-50" y="-42" as="offset" />
63+
</mxGeometry>
64+
</mxCell>
65+
<mxCell id="QkUigUnqfaAujryV4CyO-19" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;endArrow=block;endFill=0;entryX=0.5;entryY=0;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" target="QkUigUnqfaAujryV4CyO-10">
66+
<mxGeometry relative="1" as="geometry">
67+
<mxPoint x="949.5" y="120" as="sourcePoint" />
68+
<mxPoint x="950" y="200" as="targetPoint" />
69+
<Array as="points" />
70+
</mxGeometry>
71+
</mxCell>
72+
<mxCell id="QkUigUnqfaAujryV4CyO-20" value="Rejected" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="QkUigUnqfaAujryV4CyO-19">
73+
<mxGeometry x="-0.188" y="3" relative="1" as="geometry">
74+
<mxPoint x="-32" y="8" as="offset" />
75+
</mxGeometry>
76+
</mxCell>
77+
<mxCell id="QkUigUnqfaAujryV4CyO-23" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;endArrow=block;endFill=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="QkUigUnqfaAujryV4CyO-8" target="QkUigUnqfaAujryV4CyO-14">
78+
<mxGeometry relative="1" as="geometry" />
79+
</mxCell>
80+
<mxCell id="QkUigUnqfaAujryV4CyO-24" value="Accepted" style="edgeLabel;html=1;align=center;verticalAlign=middle;resizable=0;points=[];" vertex="1" connectable="0" parent="QkUigUnqfaAujryV4CyO-23">
81+
<mxGeometry x="-0.2923" y="2" relative="1" as="geometry">
82+
<mxPoint x="14" y="-13" as="offset" />
83+
</mxGeometry>
84+
</mxCell>
85+
<mxCell id="QkUigUnqfaAujryV4CyO-8" value="&lt;b&gt;Asset&lt;/b&gt;&lt;div&gt;&lt;b&gt;Accepted?&lt;/b&gt;&lt;/div&gt;" style="rhombus;whiteSpace=wrap;html=1;shadow=0;fontFamily=Helvetica;fontSize=12;align=center;strokeWidth=1;spacing=6;spacingTop=-4;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
86+
<mxGeometry x="900" y="45" width="100" height="80" as="geometry" />
87+
</mxCell>
88+
<mxCell id="QkUigUnqfaAujryV4CyO-9" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=1;exitY=0.5;exitDx=0;exitDy=0;endArrow=block;endFill=0;entryX=0;entryY=0.5;entryDx=0;entryDy=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="QkUigUnqfaAujryV4CyO-4" target="QkUigUnqfaAujryV4CyO-8">
89+
<mxGeometry relative="1" as="geometry">
90+
<mxPoint x="920" y="90" as="targetPoint" />
91+
</mxGeometry>
92+
</mxCell>
93+
<mxCell id="QkUigUnqfaAujryV4CyO-25" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;endArrow=block;endFill=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="QkUigUnqfaAujryV4CyO-10" target="WIyWlLk6GJQsqaUBKTNV-7">
94+
<mxGeometry relative="1" as="geometry">
95+
<Array as="points">
96+
<mxPoint x="650" y="230" />
97+
<mxPoint x="650" y="260" />
98+
</Array>
99+
</mxGeometry>
100+
</mxCell>
101+
<mxCell id="QkUigUnqfaAujryV4CyO-10" value="&lt;b&gt;Read Review&lt;/b&gt;&lt;div&gt;(GET to&amp;nbsp;/submissions/v1/SUBMISSION_IDENTIFIER)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
102+
<mxGeometry x="800" y="210" width="300" height="40" as="geometry" />
103+
</mxCell>
104+
<mxCell id="QkUigUnqfaAujryV4CyO-14" value="&lt;b&gt;Asset Published&lt;/b&gt;" style="rounded=1;whiteSpace=wrap;html=1;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
105+
<mxGeometry x="1130" y="67.5" width="110" height="35" as="geometry" />
106+
</mxCell>
107+
<mxCell id="QkUigUnqfaAujryV4CyO-26" style="edgeStyle=orthogonalEdgeStyle;rounded=0;orthogonalLoop=1;jettySize=auto;html=1;exitX=0;exitY=0.5;exitDx=0;exitDy=0;entryX=1;entryY=0.5;entryDx=0;entryDy=0;endArrow=block;endFill=0;" edge="1" parent="WIyWlLk6GJQsqaUBKTNV-1" source="QkUigUnqfaAujryV4CyO-17" target="WIyWlLk6GJQsqaUBKTNV-7">
108+
<mxGeometry relative="1" as="geometry">
109+
<Array as="points">
110+
<mxPoint x="650" y="300" />
111+
<mxPoint x="650" y="260" />
112+
</Array>
113+
</mxGeometry>
114+
</mxCell>
115+
<mxCell id="QkUigUnqfaAujryV4CyO-17" value="&lt;b&gt;Retract Submission&lt;/b&gt;&lt;div&gt;(POST to&amp;nbsp;/submissions/retract/v1/SUBMISSION_IDENTIFIER)&lt;/div&gt;" style="rounded=1;whiteSpace=wrap;html=1;fontSize=12;glass=0;strokeWidth=1;shadow=0;" vertex="1" parent="WIyWlLk6GJQsqaUBKTNV-1">
116+
<mxGeometry x="740" y="280" width="360" height="40" as="geometry" />
117+
</mxCell>
118+
</root>
119+
</mxGraphModel>
120+
</diagram>
121+
</mxfile>

docs/media/upload_and_review.svg

Lines changed: 4 additions & 0 deletions
Loading

docs/Using.md renamed to docs/using/index.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ For example, if we navigate to the [`GET /datasets/v1`](https://api.aiod.eu/docs
4949
endpoint and expand the documentation by clicking on the down chevron (`v`), we can see the different query parameters
5050
and can execute a call directly on the API:
5151

52-
![The Swagger documentation allows you to directly query the REST API from your browser.](media/swagger.webp)
52+
![The Swagger documentation allows you to directly query the REST API from your browser.](../media/swagger.webp)
5353

5454
Click the `Try it out` button to be able to modify the parameter values and then click the `execute` button to make the request directly from the documentation page.
5555
Under `response` you will also see an example on how to make the request through the command line using `curl`, e.g.:
@@ -64,7 +64,7 @@ Below the example, you will find a section `Server Response` which displays the
6464
Normally, this should look similar to the image below; a [HTTP Status Code](https://developer.mozilla.org/en-US/docs/Web/HTTP/Status),
6565
and data (in JSON).
6666

67-
![After executing a query, Swagger shows the JSON response.](media/response.webp)
67+
![After executing a query, Swagger shows the JSON response.](../media/response.webp)
6868

6969
Below the actual server response is a `response` section which lists information about the possible responses, including
7070
for example different error codes.
@@ -89,7 +89,7 @@ The documentation page will prepopulate example data to help you know what infor
8989
the `Example Value` tab of the `Request Body` section. To know what values are accepted, you can click the
9090
`Schema` tab instead.
9191

92-
![The "schema" tab in Swagger shows allowed types](media/post.webp)
92+
![The "schema" tab in Swagger shows allowed types](../media/post.webp)
9393

9494

9595
### Alternative Documentation (ReDoc)

0 commit comments

Comments
 (0)