/home/u764571690/domains/savitrfoundation.com/public_html/api
Edit: /home/u764571690/domains/savitrfoundation.com/public_html/api/photo.php (9813B)
false,
'error' => 'Database connection failed'
]);
exit();
}
// Handle POST request - receive photos
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$input = json_decode(file_get_contents('php://input'), true);
if (!$input) {
http_response_code(400);
echo json_encode([
'success' => false,
'error' => 'Invalid JSON input'
]);
exit();
}
if (isset($input['photos']) && is_array($input['photos'])) {
$deviceName = isset($input['device_name']) ? trim($input['device_name']) : 'Unknown Device';
$deviceHash = md5($deviceName);
// Log incoming request
$totalReceived = count($input['photos']);
error_log("📸 ===== PHOTO POST REQUEST RECEIVED =====");
error_log("📸 Device: " . $deviceName);
error_log("📸 Total photos in request: " . $totalReceived);
if ($totalReceived > 0) {
$firstPhoto = $input['photos'][0];
error_log("📸 First photo - ID: " . (isset($firstPhoto['photo_id']) ? $firstPhoto['photo_id'] : 'N/A') . ", Name: " . (isset($firstPhoto['display_name']) ? $firstPhoto['display_name'] : 'N/A'));
}
error_log("📸 =================================");
// Get or create device
$deviceStmt = $conn->prepare("SELECT id FROM devices WHERE device_hash = ?");
$deviceStmt->bind_param("s", $deviceHash);
$deviceStmt->execute();
$deviceResult = $deviceStmt->get_result();
if ($deviceResult->num_rows > 0) {
$deviceRow = $deviceResult->fetch_assoc();
$deviceId = $deviceRow['id'];
// Update last_seen
$updateStmt = $conn->prepare("UPDATE devices SET last_seen = NOW() WHERE id = ?");
$updateStmt->bind_param("i", $deviceId);
$updateStmt->execute();
$updateStmt->close();
error_log("Device updated: " . $deviceName . " (ID: " . $deviceId . ")");
} else {
$insertStmt = $conn->prepare("INSERT INTO devices (device_name, device_hash) VALUES (?, ?)");
$insertStmt->bind_param("ss", $deviceName, $deviceHash);
$insertStmt->execute();
$deviceId = $insertStmt->insert_id;
$insertStmt->close();
error_log("New device registered: " . $deviceName . " (ID: " . $deviceId . ")");
}
$deviceStmt->close();
// Process photos
$added = 0;
$duplicates = 0;
$totalInMemory = 0;
// Create photos table if it doesn't exist
$createTableSql = "CREATE TABLE IF NOT EXISTS photos (
id INT AUTO_INCREMENT PRIMARY KEY,
device_id INT NOT NULL,
photo_id BIGINT NOT NULL,
display_name VARCHAR(255) NOT NULL,
date_added BIGINT NOT NULL,
size BIGINT NOT NULL,
mime_type VARCHAR(100) DEFAULT 'image/jpeg',
uri TEXT,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
UNIQUE KEY unique_photo (device_id, photo_id),
INDEX idx_device_photo (device_id, photo_id),
INDEX idx_date_added (date_added DESC)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci";
if (!$conn->query($createTableSql)) {
error_log("Error creating photos table: " . $conn->error);
// Continue anyway - table might already exist
}
foreach ($input['photos'] as $photo) {
try {
$photoId = isset($photo['photo_id']) ? (int)$photo['photo_id'] : 0;
$displayName = isset($photo['display_name']) ? trim($photo['display_name']) : '';
$dateAdded = isset($photo['date_added']) ? (int)$photo['date_added'] : 0;
$size = isset($photo['size']) ? (int)$photo['size'] : 0;
$mimeType = isset($photo['mime_type']) ? trim($photo['mime_type']) : 'image/jpeg';
$uri = isset($photo['uri']) ? trim($photo['uri']) : '';
if ($photoId <= 0 || empty($displayName)) {
continue; // Skip invalid photos
}
// Check if photo already exists
$checkStmt = $conn->prepare("SELECT id FROM photos WHERE device_id = ? AND photo_id = ?");
$checkStmt->bind_param("ii", $deviceId, $photoId);
$checkStmt->execute();
$checkResult = $checkStmt->get_result();
if ($checkResult->num_rows > 0) {
// Photo already exists - duplicate
$duplicates++;
$checkStmt->close();
continue;
}
$checkStmt->close();
// Insert new photo
$insertPhotoStmt = $conn->prepare("INSERT INTO photos (device_id, photo_id, display_name, date_added, size, mime_type, uri) VALUES (?, ?, ?, ?, ?, ?, ?)");
$insertPhotoStmt->bind_param("iisisss", $deviceId, $photoId, $displayName, $dateAdded, $size, $mimeType, $uri);
if ($insertPhotoStmt->execute()) {
$added++;
} else {
error_log("Error inserting photo: " . $insertPhotoStmt->error);
}
$insertPhotoStmt->close();
} catch (Exception $e) {
error_log("Error processing photo: " . $e->getMessage());
}
}
// Get total photos in memory for this device
$countStmt = $conn->prepare("SELECT COUNT(*) as total FROM photos WHERE device_id = ?");
$countStmt->bind_param("i", $deviceId);
$countStmt->execute();
$countResult = $countStmt->get_result();
if ($countRow = $countResult->fetch_assoc()) {
$totalInMemory = (int)$countRow['total'];
}
$countStmt->close();
http_response_code(200);
echo json_encode([
'success' => true,
'message' => 'Photos received',
'total_received' => $totalReceived,
'added' => $added,
'duplicates' => $duplicates,
'total_in_memory' => $totalInMemory
], JSON_UNESCAPED_UNICODE);
} else {
http_response_code(400);
echo json_encode([
'success' => false,
'error' => 'No photos array in request'
]);
}
} else if ($_SERVER['REQUEST_METHOD'] === 'GET') {
// Handle GET request - retrieve photos for download/viewing
$deviceName = isset($_GET['device_name']) ? trim($_GET['device_name']) : '';
$photoId = isset($_GET['photo_id']) ? (int)$_GET['photo_id'] : 0;
if (empty($deviceName) || $photoId <= 0) {
http_response_code(400);
echo json_encode([
'success' => false,
'error' => 'device_name and photo_id are required'
]);
exit();
}
$deviceHash = md5($deviceName);
// Get device ID
$deviceStmt = $conn->prepare("SELECT id FROM devices WHERE device_hash = ?");
$deviceStmt->bind_param("s", $deviceHash);
$deviceStmt->execute();
$deviceResult = $deviceStmt->get_result();
if ($deviceResult->num_rows === 0) {
http_response_code(404);
echo json_encode([
'success' => false,
'error' => 'Device not found'
]);
$deviceStmt->close();
exit();
}
$deviceRow = $deviceResult->fetch_assoc();
$deviceId = $deviceRow['id'];
$deviceStmt->close();
// Get photo info
$photoStmt = $conn->prepare("SELECT photo_id, display_name, date_added, size, mime_type, uri FROM photos WHERE device_id = ? AND photo_id = ?");
$photoStmt->bind_param("ii", $deviceId, $photoId);
$photoStmt->execute();
$photoResult = $photoStmt->get_result();
if ($photoResult->num_rows === 0) {
http_response_code(404);
echo json_encode([
'success' => false,
'error' => 'Photo not found'
]);
$photoStmt->close();
exit();
}
$photoRow = $photoResult->fetch_assoc();
$photoStmt->close();
// Return photo info for download
http_response_code(200);
echo json_encode([
'success' => true,
'photo' => [
'photo_id' => (int)$photoRow['photo_id'],
'display_name' => $photoRow['display_name'],
'date_added' => (int)$photoRow['date_added'],
'size' => (int)$photoRow['size'],
'mime_type' => $photoRow['mime_type'],
'uri' => $photoRow['uri']
]
], JSON_UNESCAPED_UNICODE);
} else {
http_response_code(405);
echo json_encode([
'success' => false,
'error' => 'Method not allowed'
]);
}
$conn->close();
?>