openapi: 3.0.3 info: title: Reklamator Landing Page API version: 1.0.0 description: Product selection landing page contract for feature 002-product-list paths: /: get: summary: Landing page - list active products description: | Display a landing page showing all active products available for feedback submission. Products are sorted alphabetically by name (case-insensitive), with product_id as tiebreaker. operationId: getLandingPage tags: - Landing Page responses: '200': description: HTML page with product list or empty state message content: text/html: schema: type: string description: Server-rendered HTML page examples: with_products: summary: Multiple active products displayed value: | Select a Product

Select a Product for Feedback

no_products: summary: No active products (empty state) value: | Select a Product

Select a Product for Feedback

No products are currently accepting feedback. Please check back later.

product_without_description: summary: Product without description (no placeholder text) value: | Select a Product

Select a Product for Feedback

components: schemas: # No request/response schemas needed (HTML rendering) # Product data comes from file-based storage, not API request body # Contract Test Scenarios # These scenarios should be covered in tests/contract/test_landing_routes.py: # # 1. GET / with active products → 200 OK with product list HTML # 2. GET / with no active products → 200 OK with empty state message # 3. GET / with mixed active/archived → 200 OK showing only active # 4. GET / verifies alphabetical sorting (name, then product_id) # 5. GET / excludes products with missing submission_url_slug # 6. GET / properly escapes product names (XSS prevention) # 7. GET / displays descriptions when present # 8. GET / omits description placeholder when missing # 9. GET / accessible to anonymous users # 10. GET / accessible to authenticated users (same behavior) # Success Criteria Validation: # - SC-001: Page contains clickable links to /submit/{slug} # - SC-002: Response time <1s for up to 100 products # - SC-004: Existing /submit/{slug} routes still functional (backwards compatibility) # - SC-005: Empty state message displayed when no active products # - SC-006: HTML escaping prevents XSS (test with