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