Phase 2 Task 31. Single flag now controls whether the public-facing
self-serve flow is exposed.
- New public endpoint GET /api/v1/config/public returns
{self_serve_enabled, oauth_providers}. oauth_providers includes
"google" if GOOGLE_CLIENT_ID is set and "microsoft" if MS_CLIENT_ID
is set. No auth required; consumed once by the frontend at load.
- POST /auth/register: when SELF_SERVE_ENABLED=true the platform
invite-code requirement is bypassed even with REQUIRE_INVITE_CODE=true.
invite_code stays in the schema for backward compat and still applies
when supplied. With the flag off, the gate behaves exactly as before.
- Adds backend/app/schemas/config.py with PublicConfigResponse and
registers the new router in the public/unauthenticated section.
- Adds 3 integration tests in tests/test_config_public.py covering the
flag round-trip, the regression case (flag off keeps the 400), and
the new behavior (flag on bypasses the gate, creates user + Pro trial).
Co-Authored-By: Claude Opus 4.7 <noreply@anthropic.com>
41 lines
1.3 KiB
Python
41 lines
1.3 KiB
Python
"""Public runtime configuration endpoint.
|
|
|
|
GET /api/v1/config/public
|
|
Returns the small set of runtime flags the frontend needs at app load
|
|
to decide whether to render the self-serve signup flow and which OAuth
|
|
buttons to show. No authentication required.
|
|
|
|
The response model lives in `app.schemas.config` so it can be reused by
|
|
frontend codegen and other call sites if needed.
|
|
"""
|
|
|
|
from __future__ import annotations
|
|
|
|
from fastapi import APIRouter
|
|
|
|
from app.core.config import settings
|
|
from app.schemas.config import PublicConfigResponse
|
|
|
|
router = APIRouter(prefix="/config", tags=["config"])
|
|
|
|
|
|
@router.get("/public", response_model=PublicConfigResponse)
|
|
async def get_public_config() -> PublicConfigResponse:
|
|
"""Return public-safe runtime config.
|
|
|
|
`oauth_providers` reflects which OAuth client IDs are configured server
|
|
side; the frontend uses it to render only buttons that will actually
|
|
succeed. `self_serve_enabled` is the master switch for the new public
|
|
self-serve signup flow.
|
|
"""
|
|
providers: list[str] = []
|
|
if settings.GOOGLE_CLIENT_ID:
|
|
providers.append("google")
|
|
if settings.MS_CLIENT_ID:
|
|
providers.append("microsoft")
|
|
|
|
return PublicConfigResponse(
|
|
self_serve_enabled=settings.SELF_SERVE_ENABLED,
|
|
oauth_providers=providers,
|
|
)
|