diff --git a/src/repo_registry/core/service.py b/src/repo_registry/core/service.py index 6bbe187..32428ac 100644 --- a/src/repo_registry/core/service.py +++ b/src/repo_registry/core/service.py @@ -587,10 +587,14 @@ class RegistryService: status: str | None = None, language: str | None = None, framework: str | None = None, + ability: str | None = None, + capability: str | None = None, ) -> list[SearchResult]: return self.store.search( query, status=status, language=language, framework=framework, + ability=ability, + capability=capability, ) diff --git a/src/repo_registry/storage/sqlite.py b/src/repo_registry/storage/sqlite.py index a75b88e..1edadfa 100644 --- a/src/repo_registry/storage/sqlite.py +++ b/src/repo_registry/storage/sqlite.py @@ -1282,6 +1282,8 @@ class RegistryStore: status: str | None = None, language: str | None = None, framework: str | None = None, + ability: str | None = None, + capability: str | None = None, ) -> list[SearchResult]: term = query.strip() needle = f"%{term}%" @@ -1294,6 +1296,8 @@ class RegistryStore: status=status, language=language, framework=framework, + ability=ability, + capability=capability, ) if repository_ids is not None and not repository_ids: return [] @@ -1502,6 +1506,8 @@ class RegistryStore: status: str | None, language: str | None, framework: str | None, + ability: str | None, + capability: str | None, ) -> list[int] | None: filters: list[set[int]] = [] if status: @@ -1530,6 +1536,26 @@ class RegistryStore: (framework,), ).fetchall() filters.append({row["repository_id"] for row in rows}) + if ability: + rows = connection.execute( + """ + SELECT DISTINCT repository_id + FROM approved_abilities + WHERE name LIKE ? OR description LIKE ? + """, + (f"%{ability}%", f"%{ability}%"), + ).fetchall() + filters.append({row["repository_id"] for row in rows}) + if capability: + rows = connection.execute( + """ + SELECT DISTINCT repository_id + FROM approved_capabilities + WHERE name LIKE ? OR description LIKE ? + """, + (f"%{capability}%", f"%{capability}%"), + ).fetchall() + filters.append({row["repository_id"] for row in rows}) if not filters: return None repository_ids = set.intersection(*filters) diff --git a/src/repo_registry/web_api/app.py b/src/repo_registry/web_api/app.py index 6dcc34a..57383e6 100644 --- a/src/repo_registry/web_api/app.py +++ b/src/repo_registry/web_api/app.py @@ -771,6 +771,8 @@ def search( status: str | None = None, language: str | None = None, framework: str | None = None, + ability: str | None = None, + capability: str | None = None, service: RegistryService = Depends(get_service), ) -> list[dict[str, object]]: return [ @@ -780,6 +782,8 @@ def search( status=status, language=language, framework=framework, + ability=ability, + capability=capability, ) ] diff --git a/src/repo_registry/web_ui/views.py b/src/repo_registry/web_ui/views.py index 4b619d6..cd67515 100644 --- a/src/repo_registry/web_ui/views.py +++ b/src/repo_registry/web_ui/views.py @@ -179,6 +179,8 @@ def search_page( status: str = "", language: str = "", framework: str = "", + ability: str = "", + capability: str = "", service: RegistryService = Depends(get_service), ) -> HTMLResponse: results = ( @@ -187,6 +189,8 @@ def search_page( status=status or None, language=language or None, framework=framework or None, + ability=ability or None, + capability=capability or None, ) if q.strip() else [] @@ -194,7 +198,7 @@ def search_page( rows = "\n".join( f"""
{escape(capability['description'])}
{escape(ability['description'])}