mirror of
https://github.com/pacnpal/thrilltrack-explorer.git
synced 2025-12-21 05:31:12 -05:00
156 lines
3.9 KiB
Python
156 lines
3.9 KiB
Python
"""
|
|
SEO Meta Tag API Endpoints
|
|
|
|
Provides meta tag data for frontend pages to enable dynamic SEO,
|
|
OpenGraph social sharing, and structured data.
|
|
"""
|
|
|
|
from ninja import Router
|
|
from django.shortcuts import get_object_or_404
|
|
from django.http import JsonResponse
|
|
|
|
from apps.entities.models import Park, Ride, Company, RideModel
|
|
from apps.core.utils.seo import SEOTags
|
|
|
|
router = Router(tags=['SEO'])
|
|
|
|
|
|
@router.get('/meta/home')
|
|
def get_home_meta(request):
|
|
"""
|
|
Get SEO meta tags for the home page.
|
|
|
|
Returns:
|
|
Dictionary of meta tags including OpenGraph, Twitter Cards, and structured data
|
|
"""
|
|
return SEOTags.for_home()
|
|
|
|
|
|
@router.get('/meta/park/{park_slug}')
|
|
def get_park_meta(request, park_slug: str):
|
|
"""
|
|
Get SEO meta tags for a park page.
|
|
|
|
Args:
|
|
park_slug: URL slug of the park
|
|
|
|
Returns:
|
|
Dictionary of meta tags including OpenGraph, Twitter Cards, and canonical URL
|
|
"""
|
|
park = get_object_or_404(
|
|
Park.objects.select_related('locality', 'country'),
|
|
slug=park_slug,
|
|
is_active=True
|
|
)
|
|
return SEOTags.for_park(park)
|
|
|
|
|
|
@router.get('/meta/ride/{park_slug}/{ride_slug}')
|
|
def get_ride_meta(request, park_slug: str, ride_slug: str):
|
|
"""
|
|
Get SEO meta tags for a ride page.
|
|
|
|
Args:
|
|
park_slug: URL slug of the park
|
|
ride_slug: URL slug of the ride
|
|
|
|
Returns:
|
|
Dictionary of meta tags including OpenGraph, Twitter Cards, and canonical URL
|
|
"""
|
|
ride = get_object_or_404(
|
|
Ride.objects.select_related(
|
|
'park',
|
|
'ride_type',
|
|
'manufacturer'
|
|
),
|
|
slug=ride_slug,
|
|
park__slug=park_slug,
|
|
is_active=True
|
|
)
|
|
return SEOTags.for_ride(ride)
|
|
|
|
|
|
@router.get('/meta/company/{company_slug}')
|
|
def get_company_meta(request, company_slug: str):
|
|
"""
|
|
Get SEO meta tags for a company/manufacturer page.
|
|
|
|
Args:
|
|
company_slug: URL slug of the company
|
|
|
|
Returns:
|
|
Dictionary of meta tags including OpenGraph, Twitter Cards, and canonical URL
|
|
"""
|
|
company = get_object_or_404(
|
|
Company.objects.prefetch_related('company_types'),
|
|
slug=company_slug,
|
|
is_active=True
|
|
)
|
|
return SEOTags.for_company(company)
|
|
|
|
|
|
@router.get('/meta/ride-model/{model_slug}')
|
|
def get_ride_model_meta(request, model_slug: str):
|
|
"""
|
|
Get SEO meta tags for a ride model page.
|
|
|
|
Args:
|
|
model_slug: URL slug of the ride model
|
|
|
|
Returns:
|
|
Dictionary of meta tags including OpenGraph, Twitter Cards, and canonical URL
|
|
"""
|
|
model = get_object_or_404(
|
|
RideModel.objects.select_related(
|
|
'manufacturer',
|
|
'ride_type'
|
|
),
|
|
slug=model_slug,
|
|
is_active=True
|
|
)
|
|
return SEOTags.for_ride_model(model)
|
|
|
|
|
|
@router.get('/structured-data/park/{park_slug}')
|
|
def get_park_structured_data(request, park_slug: str):
|
|
"""
|
|
Get JSON-LD structured data for a park page.
|
|
|
|
Args:
|
|
park_slug: URL slug of the park
|
|
|
|
Returns:
|
|
JSON-LD structured data for search engines
|
|
"""
|
|
park = get_object_or_404(
|
|
Park.objects.select_related('locality', 'country'),
|
|
slug=park_slug,
|
|
is_active=True
|
|
)
|
|
return SEOTags.structured_data_for_park(park)
|
|
|
|
|
|
@router.get('/structured-data/ride/{park_slug}/{ride_slug}')
|
|
def get_ride_structured_data(request, park_slug: str, ride_slug: str):
|
|
"""
|
|
Get JSON-LD structured data for a ride page.
|
|
|
|
Args:
|
|
park_slug: URL slug of the park
|
|
ride_slug: URL slug of the ride
|
|
|
|
Returns:
|
|
JSON-LD structured data for search engines
|
|
"""
|
|
ride = get_object_or_404(
|
|
Ride.objects.select_related(
|
|
'park',
|
|
'ride_type',
|
|
'manufacturer'
|
|
),
|
|
slug=ride_slug,
|
|
park__slug=park_slug,
|
|
is_active=True
|
|
)
|
|
return SEOTags.structured_data_for_ride(ride)
|