Skip to content

presentation.routers.api.v1.routes.derivations

src.presentation.routers.api.v1.routes.derivations

Derive runtime configurations from route metadata registry.

This module generates runtime configurations (auth dependencies, rate limit rules) from the declarative Route Metadata Registry. This ensures consistency between the registry and actual application behavior.

Two-Tier Rate Limit Configuration

This module implements Tier 2 - Policy Implementation.

Tier 1 (registry.py): Assigns policies to endpoints Example: "Login endpoint uses AUTH_LOGIN policy"

Tier 2 (this file): Defines what each policy means Example: "AUTH_LOGIN = 5 attempts/min per IP"

To Modify Rate Limits

Scenario 1: Change rate limit for ONE specific endpoint Where: registry.py What: Change the rate_limit_policy field Example: Make login more generous rate_limit_policy=RateLimitPolicy.API_READ

Scenario 2: Change rate limit for ALL endpoints using a policy Where: This file (derivations.py) What: Update RateLimitRule in _create_rate_limit_rule() Example: Increase all AUTH_LOGIN endpoints from 5 to 10 RateLimitPolicy.AUTH_LOGIN: RateLimitRule(max_tokens=10, ...)

Functions:

Name Description
build_rate_limit_rules

Generate rate limit rules dict from registry

_create_rate_limit_rule

Map RateLimitPolicy enum to RateLimitRule (Tier 2)

Reference
  • src/presentation/routers/api/v1/routes/registry.py (Tier 1: policy assignment)
  • src/infrastructure/rate_limit/config.py (public API for rules)

Classes

Functions

build_rate_limit_rules

build_rate_limit_rules(
    registry: list[RouteMetadata],
) -> dict[str, RateLimitRule]

Build rate limit rules dict from route registry.

Generates the RATE_LIMIT_RULES dict by iterating registry and mapping RateLimitPolicy enums to RateLimitRule objects. Endpoint keys use the format "{METHOD} {PATH}" (e.g., "POST /api/v1/sessions").

Parameters:

Name Type Description Default
registry list[RouteMetadata]

List of route metadata entries from ROUTE_REGISTRY.

required

Returns:

Type Description
dict[str, RateLimitRule]

Dict mapping endpoint strings to RateLimitRule objects.

Example

from src.presentation.routers.api.v1.routes.registry import ROUTE_REGISTRY rules = build_rate_limit_rules(ROUTE_REGISTRY) login_rule = rules["POST /api/v1/sessions"] login_rule.max_tokens 5

Source code in src/presentation/routers/api/v1/routes/derivations.py
def build_rate_limit_rules(
    registry: list[RouteMetadata],
) -> dict[str, RateLimitRule]:
    """Build rate limit rules dict from route registry.

    Generates the RATE_LIMIT_RULES dict by iterating registry and mapping
    RateLimitPolicy enums to RateLimitRule objects. Endpoint keys use
    the format "{METHOD} {PATH}" (e.g., "POST /api/v1/sessions").

    Args:
        registry: List of route metadata entries from ROUTE_REGISTRY.

    Returns:
        Dict mapping endpoint strings to RateLimitRule objects.

    Example:
        >>> from src.presentation.routers.api.v1.routes.registry import ROUTE_REGISTRY
        >>> rules = build_rate_limit_rules(ROUTE_REGISTRY)
        >>> login_rule = rules["POST /api/v1/sessions"]
        >>> login_rule.max_tokens
        5
    """
    rules: dict[str, RateLimitRule] = {}

    for entry in registry:
        # Build endpoint key: "{METHOD} /api/v1{PATH}"
        # Note: Router adds /api/v1 prefix, so we must include it here
        endpoint = f"{entry.method.value} {settings.api_v1_prefix}{entry.path}"

        # Map RateLimitPolicy to RateLimitRule
        rule = _create_rate_limit_rule(entry.rate_limit_policy)
        rules[endpoint] = rule

    return rules