Skip to content

Commit b6a1a56

Browse files
committed
Update aql query endpoint
1 parent 40144d9 commit b6a1a56

3 files changed

Lines changed: 30 additions & 12 deletions

File tree

multinet/api/tests/test_workspace.py

Lines changed: 19 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -447,10 +447,16 @@ def test_workspace_rest_aql(
447447
node_table = populated_table(workspace, False)
448448
nodes: Cursor = node_table.get_rows()
449449
nodes_list = list(nodes)
450+
450451
# try and execute a valid non-mutating query on the data
451-
query = f'FOR document IN {node_table.name} RETURN document'
452-
r = authenticated_api_client.get(
453-
f'/api/workspaces/{workspace.name}/aql/', data={'query': query}
452+
r = authenticated_api_client.post(
453+
f'/api/workspaces/{workspace.name}/aql/',
454+
{
455+
'query': 'FOR doc IN @@TABLE RETURN doc',
456+
'bind_vars': {
457+
'@TABLE': node_table.name,
458+
},
459+
},
454460
)
455461
assert r.status_code == status_code
456462

@@ -466,11 +472,17 @@ def test_workspace_rest_aql_mutating_query(
466472
):
467473
workspace.set_user_permission(user, WorkspaceRoleChoice.READER)
468474
fake = Faker()
469-
470475
node_table = populated_table(workspace, False)
476+
471477
# Mutating query
472-
query = f"INSERT {{ 'name': {fake.pystr()} }} INTO {node_table.name}"
473-
r = authenticated_api_client.get(
474-
f'/api/workspaces/{workspace.name}/aql/', data={'query': query}
478+
r = authenticated_api_client.post(
479+
f'/api/workspaces/{workspace.name}/aql/',
480+
data={
481+
'query': 'INSERT {name: @DOCNAME} INTO @@TABLE',
482+
'bind_vars': {
483+
'@TABLE': node_table.name,
484+
'DOCNAME': fake.pystr(),
485+
},
486+
},
475487
)
476488
assert r.status_code == 400

multinet/api/views/serializers.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -89,6 +89,7 @@ class SingleUserWorkspacePermissionSerializer(serializers.Serializer):
8989

9090
class AqlQuerySerializer(serializers.Serializer):
9191
query = serializers.CharField()
92+
bind_vars = serializers.DictField(child=serializers.CharField())
9293

9394

9495
class AqlQueryTaskSerializer(serializers.ModelSerializer):

multinet/api/views/workspace.py

Lines changed: 10 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -178,17 +178,22 @@ def put_workspace_permissions(self, request, name: str):
178178

179179
return Response(PermissionsReturnSerializer(workspace).data, status=status.HTTP_200_OK)
180180

181-
@swagger_auto_schema(query_serializer=AqlQuerySerializer())
182-
@action(detail=True)
181+
@swagger_auto_schema(request_body=AqlQuerySerializer())
182+
@action(detail=True, methods=['POST'])
183183
@require_workspace_permission(WorkspaceRoleChoice.READER)
184184
def aql(self, request, name: str):
185185
"""Execute AQL in a workspace."""
186-
serializer = AqlQuerySerializer(data=request.query_params)
186+
serializer = AqlQuerySerializer(data=request.data)
187187
serializer.is_valid(raise_exception=True)
188-
query_str = serializer.validated_data['query']
188+
189+
# Retrieve workspace and db
189190
workspace: Workspace = get_object_or_404(Workspace, name=name)
190191
database = workspace.get_arango_db()
191-
query = ArangoQuery(database, query_str)
192+
193+
# Form query
194+
query_str = serializer.validated_data['query']
195+
bind_vars = serializer.validated_data['bind_vars']
196+
query = ArangoQuery(database, query_str=query_str, bind_vars=bind_vars)
192197

193198
try:
194199
cursor: Cursor = query.execute()

0 commit comments

Comments
 (0)