- From: Tomasz Pluskiewicz via GitHub <sysbot+gh@w3.org>
- Date: Tue, 27 Apr 2021 19:39:44 +0000
- To: public-hydra-logs@w3.org
tpluscode has just created a new issue for https://github.com/HydraCG/Specifications:
== Using collection to create resources vs adding members ==
## Describe your API requirement
This a question not specifically related to Hydra as I have seen similar discussion for other systems too.
A typical scenario for using a collection resource, in our case an instance of `hydra:Collection`, is to do a `POST` request with the intended member representation
```http
POST /users
Content-Type: text/turtle
prefix schema: <http://schema.org/>
<> a schema:Person ; schema:name "John Doe"
```
For the above request, the server could create a new identifier, for example by slugifying the name to produce a URL `/user/john-doe`.
The question is, how an API would expose the functionality of adding **existing resources** for the client to understand.
## Solution(s)
I consider implementing a generic supported operation handler, which would work slightly differently depending on the operation's definition.
### Base operation
The core would be just a POST, expecting `api:User` as payload
```turtle
api:UserCollection
hydra:supportedOperation [
hydra:method "POST" ;
hydra:expects api:User ;
] ;
.
```
### Operation to create users
```diff
api:UserCollection
hydra:supportedOperation [
+ rdf:type schema:CreateAction ;
hydra:method "POST" ;
hydra:expects api:User ;
] ;
.
```
By adding the `schema:CreateAction` type, the client would be informed that the operation creates new users. A request containing `<> a api:User` or `[] a api:User` would have these resources created with a server-defined URI as mentioned above
### Operation to add resources to collection
Now the fun part: How to change an operation so that the client and the server know that they should send existing resources. And what would the request look like?
```diff
api:UserCollection
hydra:supportedOperation [
+ rdf:type schema:UpdateAction ;
hydra:method "POST" ;
- hydra:expects api:User ;
+ hydra:expects ?? ;
] ;
.
```
By typing the operation as `schema:UpdateAction` but not the other, the server would only allow payloads with existing user representations. It should be enough to send just the identifiers, right? To add two members to collection, could that be either
```turtle
<user/John> a api:User .
<user/Jane> a api:User .
```
or, using a different `expects`:
```turtle
POST <users>
<users> hydra:member <user/John> ; <user/Jane> .
```
### Having it both ways?
Given what I've just realised when writing the previous section, two alternative operations could be necessary to have a single collection resource allow both kinds of requests. Combined:
```diff
api:UserCollection
hydra:supportedOperation [
rdf:type schema:CreateAction ;
hydra:method "POST" ;
hydra:expects api:User ;
] , [
rdf:type schema:UpdateAction ;
hydra:method "POST" ;
hydra:expects ?? ;
] ;
.
```
Please view or discuss this issue at https://github.com/HydraCG/Specifications/issues/237 using your GitHub account
--
Sent via github-notify-ml as configured in https://github.com/w3c/github-notify-ml-config
Received on Tuesday, 27 April 2021 19:39:47 UTC