diff --git a/app/api/queue/__init__.py b/app/api/queue/__init__.py index fba278a..3a4711f 100644 --- a/app/api/queue/__init__.py +++ b/app/api/queue/__init__.py @@ -9,8 +9,7 @@ from .routes.create import router as create_router from .routes.delete import router as delete_router -from .routes.import_linkedin import router as import_linkedin_router - +from .csv import linkedin as linkedin_import_router from .routes.alter import router as alter_router from .routes.rename_column import router as rename_router @@ -20,6 +19,10 @@ router.include_router(get_router) router.include_router(create_router) router.include_router(delete_router) -router.include_router(import_linkedin_router) +router.include_router(linkedin_import_router.router) + +# Register Apollo CSV import route +from .csv import apollo as apollo_import_router +router.include_router(apollo_import_router.router) router.include_router(alter_router) router.include_router(rename_router) \ No newline at end of file diff --git a/app/api/queue/csv/README.md b/app/api/queue/csv/README.md new file mode 100644 index 0000000..8d5e213 --- /dev/null +++ b/app/api/queue/csv/README.md @@ -0,0 +1 @@ +# Placeholder for csv import routes diff --git a/app/api/queue/csv/__init__.py b/app/api/queue/csv/__init__.py new file mode 100644 index 0000000..a2f93a5 --- /dev/null +++ b/app/api/queue/csv/__init__.py @@ -0,0 +1 @@ +# Makes this directory a Python package diff --git a/app/api/queue/csv/apollo.py b/app/api/queue/csv/apollo.py new file mode 100644 index 0000000..65c7349 --- /dev/null +++ b/app/api/queue/csv/apollo.py @@ -0,0 +1,29 @@ +import os +import csv +import time +from fastapi import APIRouter, HTTPException +from app.utils.make_meta import make_meta +from app.utils.db import get_db_connection_direct + +router = APIRouter() + +@router.post("/queue/csv/apollo") +def import_apollo_csv() -> dict: + """POST /queue/csv/apollo: Import data from apollo.csv into the queue table (template).""" + csv_path = os.path.join(os.path.dirname(__file__), "../csv/apollo/seed.csv") + if not os.path.exists(csv_path): + raise HTTPException(status_code=404, detail="seed.csv not found") + try: + conn = get_db_connection_direct() + cursor = conn.cursor() + # TODO: Implement CSV parsing and DB insertion logic for Apollo format + # Example placeholder for batch import logic: + # with open(csv_path, newline='', encoding='utf-8') as csvfile: + # reader = csv.DictReader(csvfile) + # for row in reader: + # pass # Process each row + conn.commit() + conn.close() + return {"meta": make_meta("success", "Apollo CSV import template executed"), "imported": 0} + except Exception as e: + raise HTTPException(status_code=500, detail=str(e)) diff --git a/app/api/queue/routes/import_linkedin.py b/app/api/queue/csv/linkedin.py similarity index 96% rename from app/api/queue/routes/import_linkedin.py rename to app/api/queue/csv/linkedin.py index 84365c0..77759ed 100644 --- a/app/api/queue/routes/import_linkedin.py +++ b/app/api/queue/csv/linkedin.py @@ -7,9 +7,9 @@ router = APIRouter() -@router.post("/queue/import/linkedin") +@router.post("/queue/csv/linkedin") def import_linkedin_csv() -> dict: - """POST /queue/import/linkedin: Import data from linkedin.csv into the queue table, robust for large files.""" + """POST /queue/csv/linkedin: Import data from linkedin.csv into the queue table, robust for large files.""" csv_path = os.path.join(os.path.dirname(__file__), "../csv/linkedin/linkedin.csv") if not os.path.exists(csv_path): raise HTTPException(status_code=404, detail="linkedin.csv not found") diff --git a/tests/test_prompt.py b/tests/test_prompt.py deleted file mode 100644 index 6fe6b49..0000000 --- a/tests/test_prompt.py +++ /dev/null @@ -1,70 +0,0 @@ -import os -import pytest -def test_llm_real_api(): - api_key = os.getenv("GEMINI_API_KEY") - if not api_key: - pytest.skip("GEMINI_API_KEY not set; skipping real LLM API test.") - from google import genai - client = genai.Client(api_key=api_key) - try: - response = client.models.generate_content( - model="models/gemini-flash-latest", - contents="Say hello from Gemini!" - ) - completion = getattr(response, "text", None) - assert completion is not None and "hello" in completion.lower() - except Exception as e: - pytest.fail(f"LLM real API call failed: {e}") -import sys -import os -sys.path.insert(0, os.path.abspath(os.path.join(os.path.dirname(__file__), "../"))) -import pytest -from fastapi.testclient import TestClient -from app.main import app - -client = TestClient(app) - - - - -def test_llm_get_endpoint(): - api_key = os.getenv("PYTHON_KEY", "test") - response = client.get("/prompt", headers={"X-API-Key": api_key}) - assert response.status_code == 200 - data = response.json() - assert "meta" in data - assert data["meta"]["severity"] == "success" - assert "LLM" in data["meta"]["title"] - assert "records" in data["meta"]["title"] - assert "data" in data - assert "data" in data["data"] - assert isinstance(data["data"]["data"], list) - - -def test_llm_post_endpoint(monkeypatch): - # Mock google-genai SDK to avoid real API call - class MockGenAIResponse: - text = "Test completion" - - class MockGenAIModel: - def generate_content(self, model, contents): - return MockGenAIResponse() - - class MockGenAIClient: - models = MockGenAIModel() - - monkeypatch.setattr("google.genai.Client", lambda *args, **kwargs: MockGenAIClient()) - - api_key = os.getenv("PYTHON_KEY", "test") - payload = {"prompt": "Test prompt"} - response = client.post("/prompt", json=payload, headers={"X-API-Key": api_key}) - assert response.status_code == 200 - data = response.json() - assert "meta" in data - assert data["meta"]["severity"] == "success" - assert "completion received" in data["meta"]["title"] - assert data["data"]["prompt"] == "Test prompt" - assert data["data"]["completion"] == "Test completion" - assert "data" in data - assert data["data"]["prompt"] == "Test prompt" - assert data["data"]["completion"] == "Test completion"