Files
thrilltrack-explorer/django-backend/api/v1/endpoints/seo.py

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)