basic search feature down

This commit is contained in:
Nick A 2025-04-04 17:08:02 -04:00
parent bdc6600a3f
commit b4c9e5e93a
4 changed files with 59 additions and 3 deletions

18
backend/api/search.py Normal file
View File

@ -0,0 +1,18 @@
from fastapi import APIRouter, Depends
from ..services import SearchService
from ..models.resource_model import Resource
from ..models.service_model import Service
api = APIRouter(prefix="/api/search")
openapi_tags = {
"name": "Search",
"description": "Search through all resources and services for a string.",
}
@api.post("", tags=["Search"])
def search(query: str, search_svc: SearchService = Depends()) -> list[Resource | Service]:
return search_svc.search(query)

View File

@ -3,7 +3,7 @@ from fastapi.responses import JSONResponse
from fastapi.middleware.gzip import GZipMiddleware
from .api import user, health, service, resource, tag
from .api import user, health, service, resource, tag, search
description = """
Welcome to the **COMPASS** RESTful Application Programming Interface.
@ -24,7 +24,7 @@ app = FastAPI(
app.add_middleware(GZipMiddleware)
feature_apis = [user, health, service, resource, tag]
feature_apis = [user, health, service, resource, tag, search]
for feature_api in feature_apis:
app.include_router(feature_api.api)

View File

@ -1,4 +1,5 @@
from .user import UserService
from .resource import ResourceService
from .tag import TagService
from .service import ServiceService
from .service import ServiceService
from .search import SearchService

View File

@ -0,0 +1,37 @@
from fastapi import Depends
from ..database import db_session
from sqlalchemy.orm import Session
from sqlalchemy import or_, select
from ..models.resource_model import Resource
from ..models.service_model import Service
from ..entities.resource_entity import ResourceEntity
from backend.entities.service_entity import ServiceEntity
from ..models.user_model import User, UserTypeEnum
class SearchService:
def __init__(self, session: Session = Depends(db_session)):
self._session = session
def search(self, query_str: str) -> list[Resource | Service]:
results = []
models = [
ResourceEntity,
ServiceEntity,
]
for model in models:
columns = [column for column in model.__table__.columns]
filters = [
column.ilike(f"%{query_str}%")
for column in columns
if column.type.__class__.__name__ in ["String", "Text"]
]
if filters:
query = self._session.query(model).filter(or_(*filters))
results.extend(query.all())
return results