mirror of
https://github.com/pacnpal/thrillwiki_django_no_react.git
synced 2025-12-20 07:11:08 -05:00
- Added EntitySuggestionManager.vue to manage entity suggestions and authentication. - Created EntitySuggestionModal.vue for displaying suggestions and adding new entities. - Integrated AuthManager for user authentication within the suggestion modal. - Enhanced signal handling in start-servers.sh for graceful shutdown of servers. - Improved server startup script to ensure proper cleanup and responsiveness to termination signals. - Added documentation for signal handling fixes and usage instructions.
185 lines
5.9 KiB
Python
185 lines
5.9 KiB
Python
"""
|
|
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/<str:park_slug>/history/",
|
|
ParkHistoryViewSet.as_view({"get": "list"}),
|
|
name="park-history-list",
|
|
),
|
|
path(
|
|
"parks/<str:park_slug>/history/detail/",
|
|
ParkHistoryViewSet.as_view({"get": "retrieve"}),
|
|
name="park-history-detail",
|
|
),
|
|
path(
|
|
"parks/<str:park_slug>/rides/<str:ride_slug>/history/",
|
|
RideHistoryViewSet.as_view({"get": "list"}),
|
|
name="ride-history-list",
|
|
),
|
|
path(
|
|
"parks/<str:park_slug>/rides/<str:ride_slug>/history/detail/",
|
|
RideHistoryViewSet.as_view({"get": "retrieve"}),
|
|
name="ride-history-detail",
|
|
),
|
|
# Nested park-scoped ride endpoints
|
|
path(
|
|
"parks/<str:park_slug>/rides/",
|
|
RideViewSet.as_view({"get": "list", "post": "create"}),
|
|
name="park-rides-list",
|
|
),
|
|
path(
|
|
"parks/<str:park_slug>/rides/<str:ride_slug>/",
|
|
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)),
|
|
]
|