""" URL configuration for ThrillWiki API v1. This module provides unified API routing following RESTful conventions and DRF Router patterns for automatic URL generation. """ from django.urls import path, include from rest_framework.routers import DefaultRouter from drf_spectacular.views import ( SpectacularAPIView, SpectacularSwaggerView, SpectacularRedocView, ) from .viewsets import ( ParkViewSet, RideViewSet, ParkReadOnlyViewSet, RideReadOnlyViewSet, LoginAPIView, SignupAPIView, LogoutAPIView, CurrentUserAPIView, PasswordResetAPIView, PasswordChangeAPIView, SocialProvidersAPIView, AuthStatusAPIView, HealthCheckAPIView, PerformanceMetricsAPIView, SimpleHealthAPIView, # History viewsets ParkHistoryViewSet, RideHistoryViewSet, UnifiedHistoryViewSet, # New comprehensive viewsets ParkAreaViewSet, ParkLocationViewSet, CompanyViewSet, RideModelViewSet, RollerCoasterStatsViewSet, RideLocationViewSet, RideReviewViewSet, UserProfileViewSet, TopListViewSet, TopListItemViewSet, # Trending system views TrendingAPIView, NewContentAPIView, ) # Import ranking viewsets from .viewsets_rankings import RideRankingViewSet, TriggerRankingCalculationView # Create the main API router router = DefaultRouter() # Register ViewSets with descriptive prefixes # Core models router.register(r"parks", ParkViewSet, basename="park") # Note: rides registered below with list-only actions to enforce nested-only detail access # Park-related models router.register(r"park-areas", ParkAreaViewSet, basename="park-area") router.register(r"park-locations", ParkLocationViewSet, basename="park-location") # Company models router.register(r"companies", CompanyViewSet, basename="company") # Ride-related models router.register(r"ride-models", RideModelViewSet, basename="ride-model") router.register( r"roller-coaster-stats", RollerCoasterStatsViewSet, basename="roller-coaster-stats" ) router.register(r"ride-locations", RideLocationViewSet, basename="ride-location") router.register(r"ride-reviews", RideReviewViewSet, basename="ride-review") # User-related models router.register(r"user-profiles", UserProfileViewSet, basename="user-profile") router.register(r"top-lists", TopListViewSet, basename="top-list") router.register(r"top-list-items", TopListItemViewSet, basename="top-list-item") # Register read-only endpoints for reference data router.register(r"ref/parks", ParkReadOnlyViewSet, basename="park-ref") router.register(r"ref/rides", RideReadOnlyViewSet, basename="ride-ref") # Register ranking endpoints router.register(r"rankings", RideRankingViewSet, basename="ranking") app_name = "api_v1" urlpatterns = [ # API Documentation endpoints path("schema/", SpectacularAPIView.as_view(), name="schema"), path( "docs/", SpectacularSwaggerView.as_view(url_name="api_v1:schema"), name="swagger-ui", ), path( "redoc/", SpectacularRedocView.as_view(url_name="api_v1:schema"), name="redoc" ), # Authentication endpoints path("auth/login/", LoginAPIView.as_view(), name="login"), path("auth/signup/", SignupAPIView.as_view(), name="signup"), path("auth/logout/", LogoutAPIView.as_view(), name="logout"), path("auth/user/", CurrentUserAPIView.as_view(), name="current-user"), path("auth/password/reset/", PasswordResetAPIView.as_view(), name="password-reset"), path( "auth/password/change/", PasswordChangeAPIView.as_view(), name="password-change" ), path("auth/providers/", SocialProvidersAPIView.as_view(), name="social-providers"), path("auth/status/", AuthStatusAPIView.as_view(), name="auth-status"), # Health check endpoints path("health/", HealthCheckAPIView.as_view(), name="health-check"), path("health/simple/", SimpleHealthAPIView.as_view(), name="simple-health"), path( "health/performance/", PerformanceMetricsAPIView.as_view(), name="performance-metrics", ), # History endpoints path( "history/timeline/", UnifiedHistoryViewSet.as_view({"get": "list"}), name="unified-history-timeline", ), path( "parks//history/", ParkHistoryViewSet.as_view({"get": "list"}), name="park-history-list", ), path( "parks//history/detail/", ParkHistoryViewSet.as_view({"get": "retrieve"}), name="park-history-detail", ), path( "parks//rides//history/", RideHistoryViewSet.as_view({"get": "list"}), name="ride-history-list", ), path( "parks//rides//history/detail/", RideHistoryViewSet.as_view({"get": "retrieve"}), name="ride-history-detail", ), # Nested park-scoped ride endpoints path( "parks//rides/", RideViewSet.as_view({"get": "list", "post": "create"}), name="park-rides-list", ), path( "parks//rides//", RideViewSet.as_view( { "get": "retrieve", "put": "update", "patch": "partial_update", "delete": "destroy", } ), name="park-rides-detail", ), # Trending system endpoints path("trending/content/", TrendingAPIView.as_view(), name="trending"), path("trending/new/", NewContentAPIView.as_view(), name="new-content"), # Ranking system endpoints path( "rankings/calculate/", TriggerRankingCalculationView.as_view(), name="trigger-ranking-calculation", ), # Global rides list endpoint (detail access only via nested park routes) path( "rides/", RideViewSet.as_view({"get": "list"}), name="ride-list", ), # Include all router-generated URLs path("", include(router.urls)), ]