diff --git a/entities/api.py b/entities/api.py index c5e0553..fdef4ba 100644 --- a/entities/api.py +++ b/entities/api.py @@ -11,8 +11,23 @@ router = Router() @router.get("/entities", response=List[EntityOut]) -def list_entities(request): - qs = services.list_entities() +def list_entities( + request, + name: str = None, + name_op: str = "contains", + description: str = None, + description_op: str = "contains", + type: str = None, + type_op: str = "contains", +): + qs = services.list_entities( + name=name, + name_op=name_op, + description=description, + description_op=description_op, + type=type, + type_op=type_op, + ) return list(qs) @router.get("/entities/{entity_id}", response=EntityOut) diff --git a/entities/services.py b/entities/services.py index 68c6779..79745f6 100644 --- a/entities/services.py +++ b/entities/services.py @@ -2,8 +2,34 @@ from django.db import transaction from .models import Entity -def list_entities(): - return Entity.objects.all().order_by("-created_at") +def list_entities( + name: str = None, + name_op: str = "contains", + description: str = None, + description_op: str = "contains", + type: str = None, + type_op: str = "contains", +): + qs = Entity.objects.all() + op_map = { + "equals": "exact", + "contains": "icontains", + "startswith": "istartswith", + "endswith": "iendswith", + } + + def apply(qs, field, value, op): + if not value: + return qs + if op == "notcontains": + return qs.exclude(**{f"{field}__icontains": value}) + lookup = op_map.get(op, "icontains") + return qs.filter(**{f"{field}__{lookup}": value}) + + qs = apply(qs, "name", name, name_op) + qs = apply(qs, "description", description, description_op) + qs = apply(qs, "type", type, type_op) + return qs.order_by("-created_at") def get_entity(entity_id: int) -> Entity: return Entity.objects.get(pk=entity_id)