Add routes for deletion
This commit is contained in:
parent
f67495bd38
commit
3ce2bf6efa
5
main.py
5
main.py
@ -34,7 +34,6 @@ app.install(plugin)
|
||||
|
||||
|
||||
# Routes
|
||||
# TODO: Routes for deletion
|
||||
@app.get("/")
|
||||
def index():
|
||||
return tools.APIResponse(tools.pretty_json({
|
||||
@ -47,6 +46,10 @@ app.get("/papers/<id:int>/relationships/<name>",
|
||||
callback=routes.get.fetch_relationship)
|
||||
app.get("/papers/<id:int>/<name>",
|
||||
callback=routes.get.fetch_relationship)
|
||||
app.route("/papers/<id:int>", method="DELETE",
|
||||
callback=routes.delete.delete_paper)
|
||||
app.route("/papers/<id:int>/relationships/<name>", method="DELETE",
|
||||
callback=routes.delete.delete_relationship)
|
||||
|
||||
|
||||
app.post("/papers", callback=routes.post.create_paper)
|
||||
|
@ -1,4 +1,5 @@
|
||||
from . import delete
|
||||
from . import get
|
||||
from . import post
|
||||
|
||||
__all__ = ["get", "post"]
|
||||
__all__ = ["delete", "get", "post"]
|
||||
|
85
routes/delete.py
Normal file
85
routes/delete.py
Normal file
@ -0,0 +1,85 @@
|
||||
"""
|
||||
This file contains DELETE routes methods.
|
||||
"""
|
||||
import bottle
|
||||
|
||||
import database
|
||||
import json
|
||||
import tools
|
||||
|
||||
|
||||
def delete_paper(id, db):
|
||||
"""
|
||||
Delete a given paper.
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
DELETE /papers/1
|
||||
Accept: application/vnd.api+json
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
HTTP 204
|
||||
|
||||
:param id: The id of the requested paper to be deleted.
|
||||
:param db: A database session, injected by the ``Bottle`` plugin.
|
||||
:returns: An ``HTTPResponse``.
|
||||
"""
|
||||
resource = db.query(database.Paper).filter_by(id=id).first()
|
||||
if resource:
|
||||
db.delete(resource)
|
||||
return tools.APIResponse(status=204, body="")
|
||||
return bottle.HTTPError(404, "Not found")
|
||||
|
||||
|
||||
def delete_relationship(id, name, db):
|
||||
"""
|
||||
Delete a given relationship
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
DELETE /papers/1/relationships/cite
|
||||
Content-Type: application/vnd.api+json
|
||||
Accept: application/vnd.api+json
|
||||
|
||||
{
|
||||
"data": [
|
||||
{ "type": "cite", "id": "2" },
|
||||
…
|
||||
]
|
||||
}
|
||||
|
||||
|
||||
.. code-block:: bash
|
||||
|
||||
HTTP 204
|
||||
|
||||
:param id: The id of the requested paper from which the relationship \
|
||||
should be deleted.
|
||||
:param name: The name of the relationship to delete from.
|
||||
:param db: A database session, injected by the ``Bottle`` plugin.
|
||||
:returns: An ``HTTPResponse``.
|
||||
"""
|
||||
data = json.loads(bottle.request.body.read().decode("utf-8"))
|
||||
# Validate the request
|
||||
if "data" not in data:
|
||||
return bottle.HTTPError(403, "Forbidden")
|
||||
# Filter data, invalid entries are ignored
|
||||
data = [i for i in data["data"]
|
||||
if "type" in i and i["type"] == name and "id" in i]
|
||||
# Complete replacement (data == []) is forbidden
|
||||
if len(data) == 0:
|
||||
return bottle.HTTPError(403, "Forbidden")
|
||||
# Delete all the requested relationships
|
||||
for i in data:
|
||||
relationship = (db.query(database.Association)
|
||||
.filter_by(left_id=id, right_id=i["id"])
|
||||
.filter(database.Relationship.name == name)
|
||||
.first())
|
||||
if relationship is None:
|
||||
# An error occurred => 403
|
||||
return bottle.HTTPError(403, "Forbidden")
|
||||
db.delete(relationship)
|
||||
# Return an empty 204 on success
|
||||
return tools.APIResponse(status=204, body="")
|
@ -44,7 +44,12 @@ def create_paper(db):
|
||||
"self": "/papers/1"
|
||||
},
|
||||
"relationships": {
|
||||
TODO
|
||||
"cite": {
|
||||
"links": {
|
||||
"related": "/papers/1/relationships/cite"
|
||||
}
|
||||
},
|
||||
…
|
||||
}
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user