""" API views for S3 image management """ import json from rest_framework import status from rest_framework.decorators import api_view, permission_classes from rest_framework.permissions import IsAuthenticated from rest_framework.response import Response from django.views.decorators.csrf import csrf_exempt from ..services.s3_service import S3Service import logging logger = logging.getLogger(__name__) @api_view(['POST']) @permission_classes([IsAuthenticated]) @csrf_exempt def upload_checkin_image(request): """ Upload checkin image to S3 POST /api/upload-checkin-image/ { "event_code": "FC岐阜", "team_code": "3432", "cp_number": 10, "image": } """ try: # Validate required fields event_code = request.data.get('event_code') team_code = request.data.get('team_code') image_file = request.FILES.get('image') cp_number = request.data.get('cp_number') if not all([event_code, team_code, image_file]): return Response({ 'error': 'event_code, team_code, and image are required' }, status=status.HTTP_400_BAD_REQUEST) # Initialize S3 service s3_service = S3Service() # Upload image s3_url = s3_service.upload_checkin_image( image_file=image_file, event_code=event_code, team_code=team_code, cp_number=cp_number ) return Response({ 'success': True, 'image_url': s3_url, 'message': 'Image uploaded successfully' }, status=status.HTTP_201_CREATED) except Exception as e: logger.error(f"Error uploading checkin image: {e}") return Response({ 'error': str(e) }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @api_view(['POST']) @permission_classes([IsAuthenticated]) @csrf_exempt def upload_standard_image(request): """ Upload standard image (goal, start, etc.) to S3 POST /api/upload-standard-image/ { "event_code": "FC岐阜", "image_type": "goal", # goal, start, checkpoint, etc. "image": } """ try: # Validate required fields event_code = request.data.get('event_code') image_type = request.data.get('image_type') image_file = request.FILES.get('image') if not all([event_code, image_type, image_file]): return Response({ 'error': 'event_code, image_type, and image are required' }, status=status.HTTP_400_BAD_REQUEST) # Validate image_type valid_types = ['goal', 'start', 'checkpoint', 'finish'] if image_type not in valid_types: return Response({ 'error': f'image_type must be one of: {valid_types}' }, status=status.HTTP_400_BAD_REQUEST) # Initialize S3 service s3_service = S3Service() # Upload standard image s3_url = s3_service.upload_standard_image( image_file=image_file, event_code=event_code, image_type=image_type ) return Response({ 'success': True, 'image_url': s3_url, 'message': 'Standard image uploaded successfully' }, status=status.HTTP_201_CREATED) except Exception as e: logger.error(f"Error uploading standard image: {e}") return Response({ 'error': str(e) }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @api_view(['GET']) def get_standard_image(request): """ Get standard image URL GET /api/get-standard-image/?event_code=FC岐阜&image_type=goal """ try: event_code = request.GET.get('event_code') image_type = request.GET.get('image_type') if not all([event_code, image_type]): return Response({ 'error': 'event_code and image_type are required' }, status=status.HTTP_400_BAD_REQUEST) # Initialize S3 service s3_service = S3Service() # Get standard image URL image_url = s3_service.get_standard_image_url(event_code, image_type) if image_url: return Response({ 'success': True, 'image_url': image_url }, status=status.HTTP_200_OK) else: return Response({ 'success': False, 'message': 'Standard image not found', 'image_url': None }, status=status.HTTP_404_NOT_FOUND) except Exception as e: logger.error(f"Error getting standard image: {e}") return Response({ 'error': str(e) }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @api_view(['GET']) def list_event_images(request): """ List all images for an event GET /api/list-event-images/?event_code=FC岐阜&limit=50 """ try: event_code = request.GET.get('event_code') limit = int(request.GET.get('limit', 100)) if not event_code: return Response({ 'error': 'event_code is required' }, status=status.HTTP_400_BAD_REQUEST) # Initialize S3 service s3_service = S3Service() # List event images image_urls = s3_service.list_event_images(event_code, limit) return Response({ 'success': True, 'event_code': event_code, 'image_count': len(image_urls), 'images': image_urls }, status=status.HTTP_200_OK) except Exception as e: logger.error(f"Error listing event images: {e}") return Response({ 'error': str(e) }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) @api_view(['DELETE']) @permission_classes([IsAuthenticated]) @csrf_exempt def delete_image(request): """ Delete image from S3 DELETE /api/delete-image/ { "image_url": "https://sumasenrogaining.s3.us-west-2.amazonaws.com/FC岐阜/3432/image.jpg" } """ try: image_url = request.data.get('image_url') if not image_url: return Response({ 'error': 'image_url is required' }, status=status.HTTP_400_BAD_REQUEST) # Initialize S3 service s3_service = S3Service() # Delete image success = s3_service.delete_image(image_url) if success: return Response({ 'success': True, 'message': 'Image deleted successfully' }, status=status.HTTP_200_OK) else: return Response({ 'success': False, 'message': 'Failed to delete image' }, status=status.HTTP_500_INTERNAL_SERVER_ERROR) except Exception as e: logger.error(f"Error deleting image: {e}") return Response({ 'error': str(e) }, status=status.HTTP_500_INTERNAL_SERVER_ERROR)