connect_error) { // http_response_code(500); // echo json_encode(['status' => 'fail', 'message' => 'DB 연결 실패']); // exit; // } // mysqli_set_charset($conn, 'utf8mb4'); // // === 파라미터 === // $ids = $_POST['ids'] ?? []; // if (!is_array($ids) || empty($ids)) { // http_response_code(400); // echo json_encode(['status' => 'fail', 'message' => '삭제할 ID가 없습니다.']); // exit; // } // // === S3 클라이언트 === // $bucket = 'baron-software-test'; // 삭제는 test 버킷에서만 // $s3 = new S3Client([ // 'version' => 'latest', // 'region' => 'auto', // 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com', // 'credentials' => [ // 'key' => '11d7027f505658acb3aeb40c3955a206', // 'secret' => '65a78f6c582e0bdfccc2f431fc7b7be2ba11f999f0a8a87142011eac8b84761f', // ] // ]); // $success = []; // $failed = []; // foreach ($ids as $id) { // $id = (int)$id; // $res = $conn->query("SELECT * FROM deploy_files WHERE id={$id} AND deleted=0"); // $file = $res->fetch_assoc(); // if (!$file) { // $failed[] = ['id' => $id, 'error' => '파일 없음']; // continue; // } // // ❌ 릴리즈된 경우 삭제 금지 // if (!empty($file['release_date'])) { // $failed[] = ['error' => '이미 릴리즈된 파일은 삭제할 수 없습니다.']; // continue; // } // $objectKey = $file['filepath']; // try { // // 1) S3 객체 삭제 // $s3->deleteObject([ // 'Bucket' => $bucket, // 'Key' => $objectKey, // ]); // // 2) DB 플래그 업데이트 // $conn->query("UPDATE deploy_files SET deleted=1 WHERE id={$id}"); // // 3) ✅ 최신 내부 버전 갱신 // $productCode = $conn->real_escape_string($file['product_code']); // // 삭제 후 남아있는 최신 버전 조회 // $verRes = $conn->prepare(" // SELECT sw_version // FROM deploy_files // WHERE product_code=? AND deleted=0 // ORDER BY // CAST(SUBSTRING_INDEX(sw_version, '.', 1) AS UNSIGNED) DESC, // CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(sw_version, '.', 2), '.', -1) AS UNSIGNED) DESC, // CAST(SUBSTRING_INDEX(sw_version, '.', -1) AS UNSIGNED) DESC // LIMIT 1 // "); // $verRes->bind_param("s", $productCode); // $verRes->execute(); // $newLatest = $verRes->get_result()->fetch_assoc()['sw_version'] ?? null; // if ($newLatest) { // // 남아있는 최신 버전으로 업데이트 // $conn->query(" // UPDATE deploy_versions_test // SET family_version='{$newLatest}', updated_at=NOW() // WHERE product_code='{$productCode}' // "); // } else { // // 남은 버전이 없으면 초기화 // $conn->query(" // UPDATE deploy_versions_test // SET family_version='0.0.0', updated_at=NOW() // WHERE product_code='{$productCode}' // "); // } // $success[] = $id; // ✅ id 로 반환 // } catch (AwsException $e) { // $failed[] = ['id' => $id, 'error' => $e->getAwsErrorMessage()]; // } // } // echo json_encode([ // 'status' => empty($failed) ? 'ok' : 'partial', // 'deleted' => $success, // 'failed' => $failed, // ]); ?> connect_error) { http_response_code(500); echo json_encode(['status' => 'fail', 'message' => 'DB 연결 실패']); exit; } mysqli_set_charset($conn, 'utf8mb4'); // === 파라미터 === $productCode = $_POST['product_code'] ?? ''; $swVersion = $_POST['sw_version'] ?? ''; if (!$productCode || !$swVersion) { http_response_code(400); echo json_encode(['status' => 'fail', 'message' => '삭제할 대상이 없습니다.']); exit; } // === S3 클라이언트 === $bucket = 'baron-software-test'; // 삭제는 test 버킷에서만 $s3 = new S3Client([ 'version' => 'latest', 'region' => 'auto', 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com', 'credentials' => [ 'key' => '11d7027f505658acb3aeb40c3955a206', 'secret' => '65a78f6c582e0bdfccc2f431fc7b7be2ba11f999f0a8a87142011eac8b84761f', ] ]); $success = []; $failed = []; // === 버전 단위 전체 파일 조회 === $res = $conn->query(" SELECT * FROM deploy_files WHERE product_code='{$conn->real_escape_string($productCode)}' AND sw_version='{$conn->real_escape_string($swVersion)}' AND deleted=0 "); $files = $res->fetch_all(MYSQLI_ASSOC); if (!$files) { echo json_encode(['status'=>'fail','message'=>'해당 버전의 파일이 없습니다.']); exit; } // === 삭제 처리 루프 === foreach ($files as $file) { // ❌ 릴리즈된 경우 → 전체 삭제 불가 처리 if (!empty($file['release_date'])) { echo json_encode([ 'status' => 'fail', 'message' => '이미 릴리즈된 파일은 삭제할 수 없습니다.' ]); exit; } } // ✅ 릴리즈 안 된 경우만 여기 도달 → 전체 삭제 진행 foreach ($files as $file) { try { // 1) S3 객체 삭제 $s3->deleteObject([ 'Bucket' => $bucket, 'Key' => $file['filepath'], ]); // 2) DB 플래그 업데이트 $conn->query("UPDATE deploy_files SET deleted=1 WHERE id={$file['id']}"); $success[] = $file['filename']; } catch (AwsException $e) { echo json_encode([ 'status' => 'fail', 'message' => '파일 삭제 중 오류: '.$e->getAwsErrorMessage() ]); exit; } } // === 최신 내부 버전 갱신 === $verRes = $conn->query(" SELECT sw_version FROM deploy_files WHERE product_code='{$conn->real_escape_string($productCode)}' AND deleted=0 ORDER BY CAST(SUBSTRING_INDEX(sw_version, '.', 1) AS UNSIGNED) DESC, CAST(SUBSTRING_INDEX(SUBSTRING_INDEX(sw_version, '.', 2), '.', -1) AS UNSIGNED) DESC, CAST(SUBSTRING_INDEX(sw_version, '.', -1) AS UNSIGNED) DESC LIMIT 1 "); $newLatest = $verRes->fetch_assoc()['sw_version'] ?? '0.0.0'; $conn->query(" UPDATE deploy_versions_test SET family_version='{$newLatest}', updated_at=NOW() WHERE product_code='{$conn->real_escape_string($productCode)}' "); echo json_encode([ 'status' => empty($failed) ? 'ok' : 'fail', 'deleted' => $success, 'failed' => $failed, 'new_latest' => $newLatest ?? '0.0.0', 'message' => empty($failed) ? '삭제 완료' : '삭제 실패: 이미 릴리즈된 파일이 있습니다.' ]);