From 6de1dbf9077bbf2fb363c557e710a5db7deceb0e Mon Sep 17 00:00:00 2001 From: Guy Korland Date: Mon, 1 Sep 2025 23:36:50 +0300 Subject: [PATCH] remove landing page --- api/routes/auth.py | 41 +---- app/public/css/landing.css | 331 ----------------------------------- app/templates/landing.j2 | 209 ---------------------- tests/e2e/README.md | 2 +- tests/e2e/pages/home_page.py | 2 +- 5 files changed, 8 insertions(+), 577 deletions(-) delete mode 100644 app/public/css/landing.css delete mode 100644 app/templates/landing.j2 diff --git a/api/routes/auth.py b/api/routes/auth.py index 26ec3741..1abb3597 100644 --- a/api/routes/auth.py +++ b/api/routes/auth.py @@ -48,24 +48,6 @@ def _get_provider_client(request: Request, provider: str): raise HTTPException(status_code=500, detail=f"OAuth provider {provider} not configured") return client -@auth_router.get("/chat", name="auth.chat", response_class=HTMLResponse) -async def chat(request: Request) -> HTMLResponse: - """Explicit chat route (renders main chat UI).""" - user_info, is_authenticated = await validate_user(request) - - if not is_authenticated or not user_info: - is_authenticated = False - user_info = None - - return templates.TemplateResponse( - "chat.j2", - { - "request": request, - "is_authenticated": is_authenticated, - "user_info": user_info, - }, - ) - def _build_callback_url(request: Request, path: str) -> str: """Build absolute callback URL, honoring OAUTH_BASE_URL if provided.""" base_override = os.getenv("OAUTH_BASE_URL") @@ -79,23 +61,12 @@ def _build_callback_url(request: Request, path: str) -> str: async def home(request: Request) -> HTMLResponse: """Handle the home page, rendering the landing page for unauthenticated users and the chat page for authenticated users.""" user_info, is_authenticated_flag = await validate_user(request) - - if is_authenticated_flag or user_info: - return templates.TemplateResponse( - "chat.j2", - { - "request": request, - "is_authenticated": True, - "user_info": user_info - } - ) - return templates.TemplateResponse( - "landing.j2", + "chat.j2", { - "request": request, - "is_authenticated": False, - "user_info": None + "request": request, + "is_authenticated": is_authenticated_flag, + "user_info": user_info } ) @@ -166,7 +137,7 @@ async def google_authorized(request: Request) -> RedirectResponse: # Call the registered handler (await if async) await handler('google', user_data, api_token) - redirect = RedirectResponse(url="/chat", status_code=302) + redirect = RedirectResponse(url="/", status_code=302) redirect.set_cookie( key="api_token", value=api_token, @@ -254,7 +225,7 @@ async def github_authorized(request: Request) -> RedirectResponse: # Call the registered handler (await if async) await handler('github', user_data, api_token) - redirect = RedirectResponse(url="/chat", status_code=302) + redirect = RedirectResponse(url="/", status_code=302) redirect.set_cookie( key="api_token", value=api_token, diff --git a/app/public/css/landing.css b/app/public/css/landing.css deleted file mode 100644 index 08acab18..00000000 --- a/app/public/css/landing.css +++ /dev/null @@ -1,331 +0,0 @@ -.landing-container { - max-width: 1200px; - margin: 3rem auto; - display: grid; - grid-template-columns: 1fr 500px; - gap: 2.5rem; - align-items: center; - padding: 0 1rem; -} - -/* Site header */ -.site-header { - width: 100%; - background: transparent; - border-bottom: solid 1px var(--falkor-border-secondary); -} - -.site-header-inner { - padding: 1rem; - display: inline-flex; - align-items: center; - gap: 0.4rem; - color: var(--text-primary); - text-decoration: none; - font-weight: 700; - padding-left: 0.25rem; -} - -.site-header-inner img { - height: 40px; - width: auto; - display: block; -} -.site-title { - font-size: 0.95rem; - display: none; -} - -.hero-left { - padding: 1rem 0; -} - -.hero-title { - font-family: 'Inter', system-ui, -apple-system, 'Segoe UI', Roboto, 'Helvetica Neue', Arial; - font-weight: 800; - font-size: 4rem; - line-height: 1.02; - margin: 0 0 1rem 0; - color: var(--text-primary); -} - -.hero-sub { - color: var(--text-secondary); - font-size: 1.05rem; - max-width: 44rem; - margin-bottom: 1.5rem; -} - -.hero-ctas { - display: flex; - gap: 1rem; - align-items: center; -} - -.btn-pill { - display: inline-block; - padding: 0.9rem 1.25rem; - border-radius: 999px; - background: var(--falkor-primary); - color: #fff; - text-decoration: none; - box-shadow: 0 8px 20px rgba(91, 107, 192, 0.14); - transition: transform 140ms ease, box-shadow 140ms ease, filter 140ms ease; - cursor: pointer; -} - -.btn-ghost { - display: inline-block; - padding: 0.9rem 1.25rem; - border-radius: 999px; - background: transparent; - color: var(--text-primary); - text-decoration: none; - border: 1px solid var(--falkor-border-tertiary); - box-shadow: 0 6px 14px rgba(11, 18, 32, 0.06); - transition: background 0.12s ease, border-color 0.12s ease, box-shadow 0.12s ease; -} - -.btn-ghost:hover { - background: rgba(255, 255, 255, 0.02); - border-color: var(--border-color); - box-shadow: 0 10px 24px rgba(11, 18, 32, 0.08); -} - -.btn-ghost:focus { - outline: none; - box-shadow: 0 0 0 3px rgba(91, 107, 192, 0.08); -} - -.btn-pill:hover { - transform: translateY(-4px); - box-shadow: 0 18px 36px rgba(91, 107, 192, 0.18); -} - -.btn-pill:active { - transform: translateY(-1px) scale(0.997); -} - -.btn-pill:focus { - outline: none; - box-shadow: 0 0 0 4px rgba(59,130,246,0.12); -} - -.demo-card { - background: var(--bg-tertiary); - border-radius: 12px; - box-shadow: 0 16px 30px rgba(11, 18, 32, 0.06); - padding: 1rem; - border: 1px solid var(--border-color); -} - -/* Use a neutral themed surface for the inner area so it adapts to light/dark */ -.demo-inner { - border-radius: 8px; - padding: 1rem; - border: 1px solid var(--falkor-border-tertiary); - border: none; -} - -.demo-label { - font-size: 0.9rem; - color: var(--text-secondary); - margin-bottom: 0.5rem; -} - -.demo-sql-header { - display: flex; - justify-content: space-between; - align-items: center; - margin-top: 1rem; -} - -.demo-success { - display: flex; - align-items: center; - gap: 0.5rem; - color: #10B981; - font-size: 0.9rem; - font-weight: 600; -} - -.demo-success svg { - flex-shrink: 0; -} - -/* Use the theme's secondary surface for the white/black boxes so text contrast is correct in both themes */ -.demo-question { - background: var(--falkor-secondary); - border-radius: 6px; - padding: 0.75rem 1rem; - border: 1px solid var(--falkor-border-tertiary); - color: var(--text-primary); - height: 120px; - white-space: pre-wrap; - font-family: monospace; - font-size: 0.95rem; - overflow: auto; - line-height: 1.3; -} - -.demo-sql { - background: var(--falkor-secondary); - border-radius: 6px; - padding: 0.75rem 1rem; - border: 1px solid var(--falkor-border-tertiary); - color: var(--text-primary); - margin-top: 0.5rem; - font-size: 0.9rem; - overflow: auto; - height: 200px; - line-height: 1.25; -} - -/* SQL token colors for demo code */ -.demo-sql .sql-keyword { color: #7c3aed; font-weight: 700; } -.demo-sql .sql-string { color: #059669; } -.demo-sql .sql-func { color: #2563eb; } -.demo-sql .sql-number { color: #b45309; } - -.demo-sql { white-space: pre-wrap; font-family: monospace; } - -.demo-sql.typing { - position: relative; -} - -.demo-sql.typing::after { - content: ''; - display: inline-block; - width: 10px; - height: 1.1em; - background: var(--falkor-primary); - margin-left: 6px; - vertical-align: bottom; - animation: blink-caret 1s steps(1) infinite; -} - -@keyframes blink-caret { - 0%, 50% { - opacity: 1; - } - - 51%, 100% { - opacity: 0; - } -} - -.demo-cta { - margin-top: 1rem; - text-align: center; -} - -.demo-cta .btn-full { - display: inline-block; - width: 100%; - padding: 0.75rem; - border-radius: 8px; - background: #e7f1ff; - color: var(--falkor-primary); - text-decoration: none; - border: none; -} - -.demo-cta .btn-full:hover { - transform: translateY(-3px); - box-shadow: 0 14px 30px rgba(11,18,32,0.12); - background: #d9ecff; -} - -.demo-cta .btn-full:active { - transform: translateY(-1px) scale(0.998); -} - -.demo-cta .btn-full:focus { - outline: none; - box-shadow: 0 0 0 4px rgba(59,130,246,0.08); -} - -@media (max-width: 900px) { - .landing-container { - grid-template-columns: 1fr; - gap: 1.25rem; - } - - .hero-title { - font-size: 2.4rem; - } -} - -/* Feature boxes row */ -.features-row { - display: flex; - gap: 1rem; - margin-top: 4.5rem; - align-items: stretch; - justify-content: center; -} - -.feature-card { - width: 280px; - background: var(--bg-tertiary); - border-radius: 6px; - padding: 0.9rem 1rem; - border: 1px solid var(--falkor-border-tertiary); - box-shadow: 0 8px 20px rgba(11, 18, 32, 0.04); - text-align: center; - transition: transform 180ms ease, box-shadow 180ms ease, border-color 180ms ease; - border: none; -} - -.feature-card:hover { - transform: translateY(-6px); - box-shadow: 0 20px 40px rgba(11, 18, 32, 0.18); - border: solid 1px var(--falkor-border-secondary); -} - -.feature-card .feature-icon { - width: 36px; - height: 36px; - display: inline-flex; - align-items: center; - justify-content: center; - border-radius: 999px; - background: rgba(59,130,246,0.06); - margin: 0 auto 0.6rem auto; -} - -.feature-card:hover .feature-icon { - background: rgba(59,130,246,0.12); -} - -.feature-title { - font-size: 0.9rem; - margin: 0 0 0.35rem 0; - color: var(--text-primary); - font-weight: 700; -} - -.feature-desc { - font-size: 0.82rem; - color: var(--text-secondary); - margin: 0; - line-height: 1.3; -} - -.feature-highlight { - border: 1px solid rgba(59,130,246,0.15); -} - -@media (max-width: 900px) { - .features-row { - flex-direction: column; - gap: 0.75rem; - margin-top: 2rem; - align-items: center; - } - - .feature-card { - width: 100%; - max-width: 520px; - } -} diff --git a/app/templates/landing.j2 b/app/templates/landing.j2 deleted file mode 100644 index fe3cd10d..00000000 --- a/app/templates/landing.j2 +++ /dev/null @@ -1,209 +0,0 @@ -{% extends "base.j2" %} - -{% block title %}QueryWeaver — Natural language to SQL{% endblock %} - -{% block extra_css %} - -{% endblock %} - -{% block content %} - - - -
- - -
-

Transform Plain
English into Powerful
SQL.

-

The intelligent AI solution that connects your business questions to data across multiple - databases. Ask a question in plain English and get runnable SQL and visual results.

- - -
- - -
- - -
-
- -

Knowledge Graph Power

-

Goes beyond simple column matching to understand complex business logic and relationships in - your data.

-
- -
- -

Multi-Database Joins

-

Ask a single question and get answers from disparate sources like PostgreSQL and Salesforce - in one go.

-
- -
- -

Proactive Guidance

-

Get intelligent suggestions to clarify ambiguity and optimize your queries before you even - run them.

-
-
- -{% endblock %} diff --git a/tests/e2e/README.md b/tests/e2e/README.md index d93ecfca..fd04fb26 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -18,7 +18,7 @@ The E2E test suite covers: tests/e2e/ ├── pages/ # Page Object Model classes │ ├── base_page.py # Base page with common functionality -│ └── home_page.py # Home/chat page interactions +│ └── home_page.py # Home/ page interactions ├── fixtures/ # Test data and utilities │ └── test_data.py # Sample data generators ├── test_basic_functionality.py # Core app functionality tests diff --git a/tests/e2e/pages/home_page.py b/tests/e2e/pages/home_page.py index 8b71ab48..83476346 100644 --- a/tests/e2e/pages/home_page.py +++ b/tests/e2e/pages/home_page.py @@ -18,7 +18,7 @@ class HomePage(BasePage): def navigate_to_home(self): """Navigate to the home page.""" - self.navigate_to("/chat") + self.navigate_to("/") self.wait_for_page_load() def is_authenticated(self):