Skip to content

Commit

Permalink
Initial commit:
Browse files Browse the repository at this point in the history
-Created saved_search schema
-Created saved_search API
  • Loading branch information
chrtorres committed Oct 2, 2024
1 parent 3e75136 commit 6f508a8
Show file tree
Hide file tree
Showing 3 changed files with 192 additions and 0 deletions.
108 changes: 108 additions & 0 deletions backend/src/xfd_django/xfd_api/api_methods/saved_search.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,108 @@
"""Saved Search API"""


# Standard Python Libraries
import json
import uuid

# Third-Party Libraries
from django.http import JsonResponse
from fastapi import HTTPException

from ..models import SavedSearch

PAGE_SIZE = 20


def create_saved_search(request):
data = json.loads(request.body)
search = SavedSearch.objects.create(
name=data["name"],
count=data["count"],
sort_direction=data["sortDirection"],
sort_field=data["sortField"],
search_term=data["searchTerm"],
search_path=data["searchPath"],
filters=data["filters"],
create_vulnerabilities=data["createVulnerabilities"],
vulnerability_template=data.get("vulnerabilityTemplate"),
created_by=request.user,
)
return JsonResponse({"status": "Created", "search": search.id}, status=201)


def list_saved_searches(request):
"""List all saved searches."""
page_size = int(request.GET.get("pageSize", PAGE_SIZE))
page = int(request.GET.get("page", 1))
searches = SavedSearch.objects.filter(created_by=request.user)
total_count = searches.count()
searches = searches[(page - 1) * page_size : page * page_size]
data = list(searches.values())
return JsonResponse({"result": data, "count": total_count}, safe=False)


def get_saved_search(request, search_id):
if not uuid.UUID(search_id):
raise HTTPException({"error": "Invalid UUID"}, status=404)

try:
search = SavedSearch.objects.get(id=search_id, created_by=request.user)
data = {
"id": str(search.id),
"name": search.name,
"count": search.count,
"sort_direction": search.sort_direction,
"sort_field": search.sort_field,
"search_term": search.search_term,
"search_path": search.search_path,
"filters": search.filters,
"create_vulnerabilities": search.create_vulnerabilities,
"vulnerability_template": search.vulnerability_template,
"created_by": search.created_by.id,
}
return JsonResponse(data)
except SavedSearch.DoesNotExist as e:
raise HTTPException(status_code=404, detail=str(e))


def update_saved_search(request, search_id):
if not uuid.UUID(search_id):
raise HTTPException(status_code=404, detail={"error": "Invalid UUID"})

try:
search = SavedSearch.objects.get(id=search_id, created_by=request.user)
except SavedSearch.DoesNotExist as e:
return HTTPException(status_code=404, detail=str(e))

data = json.loads(request.body)
search.name = data.get("name", search.name)
search.count = data.get("count", search.count)
search.sort_direction = data.get("sortDirection", search.sort_direction)
search.sort_field = data.get("sortField", search.sort_field)
search.search_term = data.get("searchTerm", search.search_term)
search.search_path = data.get("searchPath", search.search_path)
search.filters = data.get("filters", search.filters)
search.create_vulnerabilities = data.get(
"createVulnerabilities", search.create_vulnerabilities
)
search.vulnerability_template = data.get(
"vulnerabilityTemplate", search.vulnerability_template
)
search.save()
return JsonResponse({"status": "Updated", "search": search.id}, status=200)


def delete_saved_search(request, search_id):
"""Delete saved search by id."""
if not uuid.UUID(search_id):
raise HTTPException(status_code=404, detail={"error": "Invalid UUID"})

try:
search = SavedSearch.objects.get(id=search_id, created_by=request.user)
search.delete()
return JsonResponse(
{"status": "success", "message": f"Saved search id:{search_id} deleted."}
)
except SavedSearch.DoesNotExist as e:
raise HTTPException(status_code=404, detail=str(e))
50 changes: 50 additions & 0 deletions backend/src/xfd_django/xfd_api/schema_models/saved_search.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,50 @@
"""Saved Search schemas."""
# Standard Python Libraries
from datetime import datetime
from typing import Any, Optional
from uuid import UUID

# Third-Party Libraries
from pydantic import BaseModel, Json


class SavedSearch(BaseModel):
"""SavedSearch schema."""

id: UUID
name: str
count: int
sort_direction: str
sort_field: str
search_term: str
search_path: str
filters: Json[Any]
create_vulnerabilities: bool
vulnerability_template: Optional[Json[Any]]
created_by: UUID
created_at: datetime
updated_at: datetime


class SavedSearchFilters(BaseModel):
"""SavedSearchFilters schema."""

id: Optional[UUID]
name: Optional[str]
sort_direction: Optional[str]
sort_field: Optional[str]
search_term: Optional[str]
search_path: Optional[str]
create_vulnerabilities: Optional[bool]
created_by: Optional[UUID]


class SavedSearchSearch(BaseModel):
"""SavedSearchSearch schema."""

page: int
sort: Optional[str]
order: str
filters: Optional[SavedSearchFilters]
pageSize: Optional[int]
groupBy: Optional[str]
34 changes: 34 additions & 0 deletions backend/src/xfd_django/xfd_api/views.py
Original file line number Diff line number Diff line change
Expand Up @@ -316,6 +316,40 @@ async def call_get_organizations(
return get_organizations(state, regionId)


# TODO: Typescript endpoints for reference, not implemented in FastAPI.
# Remove after implementation
# authenticatedRoute.get('/saved-searches', handlerToExpress(savedSearches.list));
# authenticatedRoute.post(
# '/saved-searches',
# handlerToExpress(savedSearches.create)
# );
# authenticatedRoute.get(
# '/saved-searches/:searchId',
# handlerToExpress(savedSearches.get)
# );
# authenticatedRoute.put(
# '/saved-searches/:searchId',
# handlerToExpress(savedSearches.update)
# );
# authenticatedRoute.delete(
# '/saved-searches/:searchId',
# handlerToExpress(savedSearches.del)
# );

# ========================================
# Saved Search Endpoints
# ========================================


# @api_router.get(
# "/saved-searches",
# dependencies=[Depends(get_current_active_user)],
# response_model=savedSearchSchema.GetSavedSearchesResponseModel,
# tags=["Saved Searches"],

# )


# ========================================
# Scan Endpoints
# ========================================
Expand Down

0 comments on commit 6f508a8

Please sign in to comment.