[ 
https://issues.apache.org/jira/browse/QPID-6438?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
 ]

Alex Rudyy updated QPID-6438:
-----------------------------
    Description: 
At the moment PUT method requests are used for both configured object creation 
and their updates. Our REST layer looks for ID or name( coupled with object 
parent) in order to decide whether it is an update request or not. Update is 
made when object with the same id or the same name and parent is found. 
Otherwise a new object is created.

We need to extend existing REST API to return errors in the following cases
* when object with the same name/id already exists on create 
* when  object does not  exists on update

The existing REST interfaces should not be affected by the change and should 
continue working as expected keeping backward compatibility.

The REST interfaces will be changed as depicted below

h2. CO creation

Methods PUT or POST can be used to create CO.

CO can be created by submitting PUT request to CO URI with body containing 
object json or by submitting PUT/POST request to parent URI.
The request encoding should be json (application/json) and request body should 
contain a CO json object.
On successful completion of operation a response code 201 should be returned  
and response header "Location" should be set to CO URI. 
If object with a such name/id already exist and parent URI is used to create 
object, an error response with response code 409 (conflict) and body containing 
json with the reason of operation failure should be returned. On any other 
error, response with response code 400 (bad request) or  422 (validation error) 
and body containing json with the reason of operation failure should be 
returned.
If object with a such name/id already exist and object URI is used, then CO 
update should be performed.

For example, if Queue with name "my-queue" needs to be created on a virtual 
host with name "vh" (which is contained within virtual host node with name 
"vhn") either of the following requests should be made
{noformat}
PUT /api/latest/queue/vhn/vh HTTP/1.1
{noformat}
{noformat}
POST /api/latest/queue/vhn/vh HTTP/1.1
{noformat}
{noformat}
PUT /api/latest/queue/vhn/vh/my-queue HTTP/1.1
{noformat}
Response code 201 should be returned on successful queue creation. Response 
header "Location" should be set to "/api/latest/queue/test/my-queue".  If queue 
with a such name already exist with either of 2 first requests above, an error 
response with response code 409 (conflict) and body containing json message 
that queue exists should be returned. If queue with a such name already and 
last request is used, then CO update should occur.

h2. CO update

Methods PUT or POST can be used to update CO. Update request should be made 
against CO URI.
If CO does not exists and PUT method is used, such object should be created
If CO does not exists and POST method is used, an error should occur and 
response with error code 404 and json with error message should be returned.
The request encoding should be json (application/json) and request body should 
contain a CO json object (with all or changed only attributes)
On successful completion of operation a response code 200 should be returned. 
If any error occur on update, a response with response code 400 or 422 or 404 
should be sent back to the client containing json body with error details.

 For example, if Queue with name "my-queue" is required to be updated on a 
virtual host with name "vh" (contained in virtual host node with name "vhn") 
either of the following requests should be made:
{noformat}
POST /api/latest/queue/vhn/vh/my-queue HTTP/1.1
{noformat}
{noformat}
POST /api/latest/queue/vhn/vh/my-queue HTTP/1.1
{noformat}

We need to change REST documentation to cover the changes

  was:
At the moment PUT method requests are used for both configured object creation 
and their updates. Our REST layer looks for ID or name( coupled with object 
parent) in order to decide whether it is an update request or not. Update is 
made when object with the same id or the same name and parent is found. 
Otherwise a new object is created.

We need to extend existing REST API to return errors in the following cases
* when object with the same name/id already exists on create 
* when  object does not  exists on update

The existing REST interfaces should not be affected by the change and should 
continue working as expected keeping backward compatibility.

The REST interfaces will be changed as depicted below

h2. CO creation

Methods PUT or POST can be used to create CO.

CO can be created by submitting PUT request to CO URI with body containing 
object json or by submitting PUT/POST request to parent URI.
The request encoding should be json (application/json) and request body should 
contain a CO json object.
On successful completion of operation a response code 201 should be returned  
and response header "Location" should be set to CO URI. 
If object with a such name/id already exist and parent URI is used to create 
object, an error response with response code 409 (conflict) and body containing 
json with the reason of operation failure should be returned. On any other 
error, response with response code 400 (bad request) or  422 (validation error) 
and body containing json with the reason of operation failure should be 
returned.
If object with a such name/id already exist and object URI is used, then CO 
update should be performed.

For example, if Queue with name "my-queue" needs to be created on a virtual 
host with name "vh" (which is contained within virtual host node with name 
"vhn") either of the following requests should be made
{noformat}
PUT /api/latest/queue/vhn/vh HTTP/1.1
{noformat}
{noformat}
POST /api/latest/queue/vhn/vh HTTP/1.1
{noformat}
{noformat}
PUT /api/latest/queue/vhn/vh/my-queue HTTP/1.1
{noformat}
Response code 201 should be returned on successful queue creation. Response 
header "Location" should be set to "/api/latest/queue/test/my-queue".  If queue 
with a such name already exist with either of 2 first requests above, an error 
response with response code 409 (conflict) and body containing json message 
that queue exists should be returned. If queue with a such name already and 
last request is used, then CO update should occur.

h2. CO update

Methods PUT or POST can be used to update CO. Update request should be made 
against CO URI.
If CO does not exists and PUT method is used, such object should be created
If CO does not exists and POST method is used, an error should occur and 
response with error code 404 and json with error message should be returned.
The request encoding should be json (application/json) and request body should 
contain a CO json object (with all or changed only attributes)
On successful completion of operation a response code 200 should be returned. 
If any error occur on update, a response with response code 400 or 422 or 404 
should be sent back to the client containing json body with error details.

 For example, if Queue with name "my-queue" is required to be updated on a 
virtual host with name "vh" (contained in virtual host node with name "vhn") 
either of the following requests should be made:
{noformat}
POST /api/latest/queue/vhn/vh/my-queue HTTP/1.1
{noformat}
{noformat}
POST /api/latest/queue/vhn/vh/my-queue HTTP/1.1
{noformat}



> [Java Broker] Extend REST interfaces to result in errors when object already 
> exist on create and when object does not exist on update
> -------------------------------------------------------------------------------------------------------------------------------------
>
>                 Key: QPID-6438
>                 URL: https://issues.apache.org/jira/browse/QPID-6438
>             Project: Qpid
>          Issue Type: Improvement
>          Components: Java Broker
>    Affects Versions: 0.18, 0.20, 0.22, 0.24, 0.26, 0.28, 0.30, 0.32
>            Reporter: Alex Rudyy
>            Assignee: Alex Rudyy
>             Fix For: 6.0 [Java]
>
>
> At the moment PUT method requests are used for both configured object 
> creation and their updates. Our REST layer looks for ID or name( coupled with 
> object parent) in order to decide whether it is an update request or not. 
> Update is made when object with the same id or the same name and parent is 
> found. Otherwise a new object is created.
> We need to extend existing REST API to return errors in the following cases
> * when object with the same name/id already exists on create 
> * when  object does not  exists on update
> The existing REST interfaces should not be affected by the change and should 
> continue working as expected keeping backward compatibility.
> The REST interfaces will be changed as depicted below
> h2. CO creation
> Methods PUT or POST can be used to create CO.
> CO can be created by submitting PUT request to CO URI with body containing 
> object json or by submitting PUT/POST request to parent URI.
> The request encoding should be json (application/json) and request body 
> should contain a CO json object.
> On successful completion of operation a response code 201 should be returned  
> and response header "Location" should be set to CO URI. 
> If object with a such name/id already exist and parent URI is used to create 
> object, an error response with response code 409 (conflict) and body 
> containing json with the reason of operation failure should be returned. On 
> any other error, response with response code 400 (bad request) or  422 
> (validation error) and body containing json with the reason of operation 
> failure should be returned.
> If object with a such name/id already exist and object URI is used, then CO 
> update should be performed.
> For example, if Queue with name "my-queue" needs to be created on a virtual 
> host with name "vh" (which is contained within virtual host node with name 
> "vhn") either of the following requests should be made
> {noformat}
> PUT /api/latest/queue/vhn/vh HTTP/1.1
> {noformat}
> {noformat}
> POST /api/latest/queue/vhn/vh HTTP/1.1
> {noformat}
> {noformat}
> PUT /api/latest/queue/vhn/vh/my-queue HTTP/1.1
> {noformat}
> Response code 201 should be returned on successful queue creation. Response 
> header "Location" should be set to "/api/latest/queue/test/my-queue".  If 
> queue with a such name already exist with either of 2 first requests above, 
> an error response with response code 409 (conflict) and body containing json 
> message that queue exists should be returned. If queue with a such name 
> already and last request is used, then CO update should occur.
> h2. CO update
> Methods PUT or POST can be used to update CO. Update request should be made 
> against CO URI.
> If CO does not exists and PUT method is used, such object should be created
> If CO does not exists and POST method is used, an error should occur and 
> response with error code 404 and json with error message should be returned.
> The request encoding should be json (application/json) and request body 
> should contain a CO json object (with all or changed only attributes)
> On successful completion of operation a response code 200 should be returned. 
> If any error occur on update, a response with response code 400 or 422 or 404 
> should be sent back to the client containing json body with error details.
>  For example, if Queue with name "my-queue" is required to be updated on a 
> virtual host with name "vh" (contained in virtual host node with name "vhn") 
> either of the following requests should be made:
> {noformat}
> POST /api/latest/queue/vhn/vh/my-queue HTTP/1.1
> {noformat}
> {noformat}
> POST /api/latest/queue/vhn/vh/my-queue HTTP/1.1
> {noformat}
> We need to change REST documentation to cover the changes



--
This message was sent by Atlassian JIRA
(v6.3.4#6332)

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to