{"message":"Event-Based Photo Matching API","endpoints":{"auth":{"register":"/register (POST)","login":"/login (POST) - returns access_token & refresh_token","refresh":"/refresh (POST) - get new tokens using refresh_token","revoke":"/revoke (POST) - revoke a refresh token (logout)","logout_all":"/logout-all (POST) - logout from all devices","me":"/me (GET) - requires auth"},"user_management":{"list_users":"/api/users/ (GET) - requires admin","get_user":"/api/users/{user_id} (GET) - requires admin","create_user":"/api/users/ (POST) - requires admin","update_user":"/api/users/{user_id} (PUT) - requires admin","delete_user":"/api/users/{user_id} (DELETE) - requires admin","update_profile":"/api/users/me (PATCH) - requires auth","user_stats":"/api/users/stats/summary (GET) - requires admin","note":"User types: admin, staff"},"events":{"create":"/events/ (POST) - requires auth","list":"/events/ (GET)","detail":"/events/{event_id} (GET)","photos":"/events/{event_id}/photos (GET) - requires auth, returns all photos","update":"/events/{event_id} (PUT) - requires auth","delete":"/events/{event_id} (DELETE) - requires auth","compress":"/events/{event_id}/compress-images/ (POST) - requires auth"},"gcs_upload":{"upload_images":"/api/gcs/upload-images (POST) - requires auth, uploads raw/resized/thumbnail images in single request","payload":"event_id (int), raw_image (file, optional), resized_image (file, optional), thumbnail_image (file, optional)"},"face_matching":{"upload_selfie":"/upload-selfie/ (POST) - requires event_id parameter","index_event":"/index-event-folder/ (POST) - requires auth","index_status":"/index-status/?event_id={id} (GET)","event_images":"/event-files/{event_folder}/{filename} (GET)"},"static_files":{"event_banners":"/event_banners/{filename} (GET)","event_images":"/event-files/{path} (GET)"}},"note":"All photo matching now requires event selection. Upload selfies with event_id parameter."}