Skip to content

Commit

Permalink
feat(main.py): Implement /nodes/set endpoint
Browse files Browse the repository at this point in the history
Implement batch "field to value" bulk set to improve speed of some
batch operations.
This way we can update field on multiple nodes to particular value
at once.

Signed-off-by: Denys Fedoryshchenko <[email protected]>
  • Loading branch information
nuclearcat committed Dec 5, 2024
1 parent 22febf3 commit d8b5730
Showing 1 changed file with 40 additions and 0 deletions.
40 changes: 40 additions & 0 deletions api/main.py
Original file line number Diff line number Diff line change
Expand Up @@ -771,6 +771,46 @@ async def put_node(node_id: str, node: Node,
return obj


@app.put('/nodes/set', response_model=int)
async def put_nodes_set(nodes: List[str], field: str, value: str,
user: str = Depends(authorize_user)):
"""
Set a field to a value for multiple nodes
TBD: Make db.bulkupdate to update multiple nodes in one go
"""
metrics.add('http_requests_total', 1)
updated = 0
for node_id in nodes:
node_from_id = await db.find_by_id(Node, node_id)
if not node_from_id:
raise HTTPException(
status_code=status.HTTP_404_NOT_FOUND,
detail=f"Node not found with id: {node_id}"
)
# verify ownership
if not user.username == node_from_id.owner:
raise HTTPException(
status_code=status.HTTP_401_UNAUTHORIZED,
detail="Unauthorized to complete the operation"
)
# right now we support only field:
# processed_by_kcidb_bridge, also value should be boolean
if field == 'processed_by_kcidb_bridge':
if value == 'true' or value == 'True':

Check warning on line 799 in api/main.py

View workflow job for this annotation

GitHub Actions / Lint

Consider merging these comparisons with "in" to "value in ('true', 'True')"
value = True
elif value == 'false' or value == 'False':

Check warning on line 801 in api/main.py

View workflow job for this annotation

GitHub Actions / Lint

Consider merging these comparisons with "in" to "value in ('false', 'False')"
value = False
setattr(node_from_id, field, value)
await db.update(node_from_id)
updated += 1
else:
raise HTTPException(
status_code=status.HTTP_400_BAD_REQUEST,
detail="Field not supported"
)
return updated


async def _set_node_ownership_recursively(user: User, hierarchy: Hierarchy,
submitter: str, treeid: str):
"""Set node ownership information for a hierarchy of nodes"""
Expand Down

0 comments on commit d8b5730

Please sign in to comment.