mirror of
https://github.com/MODSetter/SurfSense.git
synced 2026-05-01 03:46:25 +02:00
feat(back): add SearxNG connector type
This commit is contained in:
parent
402039f02f
commit
d2ffd12480
3 changed files with 73 additions and 3 deletions
|
|
@ -0,0 +1,42 @@
|
||||||
|
"""Add SearxNG connector enum value
|
||||||
|
|
||||||
|
Revision ID: 26
|
||||||
|
Revises: 25
|
||||||
|
Create Date: 2025-01-18 00:00:00.000000
|
||||||
|
|
||||||
|
"""
|
||||||
|
|
||||||
|
from collections.abc import Sequence
|
||||||
|
|
||||||
|
from alembic import op
|
||||||
|
|
||||||
|
# revision identifiers, used by Alembic.
|
||||||
|
revision: str = "26"
|
||||||
|
down_revision: str | None = "25"
|
||||||
|
branch_labels: str | Sequence[str] | None = None
|
||||||
|
depends_on: str | Sequence[str] | None = None
|
||||||
|
|
||||||
|
|
||||||
|
def upgrade() -> None:
|
||||||
|
"""Safely add SEARXNG_API to searchsourceconnectortype enum."""
|
||||||
|
op.execute(
|
||||||
|
"""
|
||||||
|
DO $$
|
||||||
|
BEGIN
|
||||||
|
IF NOT EXISTS (
|
||||||
|
SELECT 1 FROM pg_type t
|
||||||
|
JOIN pg_enum e ON t.oid = e.enumtypid
|
||||||
|
WHERE t.typname = 'searchsourceconnectortype' AND e.enumlabel = 'SEARXNG_API'
|
||||||
|
) THEN
|
||||||
|
ALTER TYPE searchsourceconnectortype ADD VALUE 'SEARXNG_API';
|
||||||
|
END IF;
|
||||||
|
END
|
||||||
|
$$;
|
||||||
|
"""
|
||||||
|
)
|
||||||
|
|
||||||
|
|
||||||
|
def downgrade() -> None:
|
||||||
|
"""Downgrade not supported for enum edits."""
|
||||||
|
pass
|
||||||
|
|
||||||
|
|
@ -55,6 +55,7 @@ class DocumentType(str, Enum):
|
||||||
class SearchSourceConnectorType(str, Enum):
|
class SearchSourceConnectorType(str, Enum):
|
||||||
SERPER_API = "SERPER_API" # NOT IMPLEMENTED YET : DON'T REMEMBER WHY : MOST PROBABLY BECAUSE WE NEED TO CRAWL THE RESULTS RETURNED BY IT
|
SERPER_API = "SERPER_API" # NOT IMPLEMENTED YET : DON'T REMEMBER WHY : MOST PROBABLY BECAUSE WE NEED TO CRAWL THE RESULTS RETURNED BY IT
|
||||||
TAVILY_API = "TAVILY_API"
|
TAVILY_API = "TAVILY_API"
|
||||||
|
SEARXNG_API = "SEARXNG_API"
|
||||||
LINKUP_API = "LINKUP_API"
|
LINKUP_API = "LINKUP_API"
|
||||||
SLACK_CONNECTOR = "SLACK_CONNECTOR"
|
SLACK_CONNECTOR = "SLACK_CONNECTOR"
|
||||||
NOTION_CONNECTOR = "NOTION_CONNECTOR"
|
NOTION_CONNECTOR = "NOTION_CONNECTOR"
|
||||||
|
|
|
||||||
|
|
@ -424,6 +424,22 @@ def validate_connector_config(
|
||||||
connector_rules = {
|
connector_rules = {
|
||||||
"SERPER_API": {"required": ["SERPER_API_KEY"], "validators": {}},
|
"SERPER_API": {"required": ["SERPER_API_KEY"], "validators": {}},
|
||||||
"TAVILY_API": {"required": ["TAVILY_API_KEY"], "validators": {}},
|
"TAVILY_API": {"required": ["TAVILY_API_KEY"], "validators": {}},
|
||||||
|
"SEARXNG_API": {
|
||||||
|
"required": ["SEARXNG_HOST"],
|
||||||
|
"optional": [
|
||||||
|
"SEARXNG_API_KEY",
|
||||||
|
"SEARXNG_ENGINES",
|
||||||
|
"SEARXNG_CATEGORIES",
|
||||||
|
"SEARXNG_LANGUAGE",
|
||||||
|
"SEARXNG_SAFESEARCH",
|
||||||
|
"SEARXNG_VERIFY_SSL",
|
||||||
|
],
|
||||||
|
"validators": {
|
||||||
|
"SEARXNG_HOST": lambda: validate_url_field(
|
||||||
|
"SEARXNG_HOST", "SearxNG"
|
||||||
|
)
|
||||||
|
},
|
||||||
|
},
|
||||||
"LINKUP_API": {"required": ["LINKUP_API_KEY"], "validators": {}},
|
"LINKUP_API": {"required": ["LINKUP_API_KEY"], "validators": {}},
|
||||||
"SLACK_CONNECTOR": {"required": ["SLACK_BOT_TOKEN"], "validators": {}},
|
"SLACK_CONNECTOR": {"required": ["SLACK_BOT_TOKEN"], "validators": {}},
|
||||||
"NOTION_CONNECTOR": {
|
"NOTION_CONNECTOR": {
|
||||||
|
|
@ -484,10 +500,21 @@ def validate_connector_config(
|
||||||
if not rules:
|
if not rules:
|
||||||
return config # Unknown connector type, pass through
|
return config # Unknown connector type, pass through
|
||||||
|
|
||||||
# Validate required keys match exactly
|
required_keys = set(rules["required"])
|
||||||
if set(config.keys()) != set(rules["required"]):
|
optional_keys = set(rules.get("optional", []))
|
||||||
|
config_keys = set(config.keys())
|
||||||
|
|
||||||
|
# Validate that no unexpected keys are present
|
||||||
|
if not config_keys.issubset(required_keys | optional_keys):
|
||||||
|
allowed_keys = list(required_keys | optional_keys)
|
||||||
raise ValueError(
|
raise ValueError(
|
||||||
f"For {connector_type_str} connector type, config must only contain these keys: {rules['required']}"
|
f"For {connector_type_str} connector type, config may only contain these keys: {allowed_keys}"
|
||||||
|
)
|
||||||
|
|
||||||
|
# Validate that all required keys are present
|
||||||
|
if not required_keys.issubset(config_keys):
|
||||||
|
raise ValueError(
|
||||||
|
f"For {connector_type_str} connector type, config must include these keys: {sorted(required_keys)}"
|
||||||
)
|
)
|
||||||
|
|
||||||
# Apply custom validators first (these check format before emptiness)
|
# Apply custom validators first (these check format before emptiness)
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue