connect_error) { // http_response_code(500); // echo json_encode(['message' => 'DB 연결 실패']); // exit; // } // mysqli_set_charset($conn, 'utf8mb4'); // // === 파라미터 === // $file_id = $_POST['id'] ?? 0; // $releaser = $_POST['releaser'] ?? '관리자'; // if (!$file_id) { // http_response_code(400); // echo json_encode(['message' => '필수값 누락']); // exit; // } // // === 파일 정보 가져오기 === // $res = $conn->query("SELECT * FROM deploy_files WHERE id=".(int)$file_id); // $file = $res->fetch_assoc(); // if (!$file) { // http_response_code(404); // echo json_encode(['message' => '파일 정보 없음']); // exit; // } // $sourceBucket = 'baron-software-test'; // $targetBucket = 'baron-software-release'; // $objectKey = $file['filepath']; // // === S3 클라이언트 생성 === // // Test 버킷 (Read/Delete) // $testS3 = new S3Client([ // 'version' => 'latest', // 'region' => 'auto', // 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com', // 'credentials' => [ // 'key' => '9ade5915f7abd402db60a87f3b3b6d76', // ✅ write key // 'secret' => 'a1a1cfd59f739977f98fb73f214894e39dbac9a39b1f6208020aa2e1303ea54c', // ] // ]); // // Release 버킷 (Write) // $releaseS3 = new S3Client([ // 'version' => 'latest', // 'region' => 'auto', // 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com', // 'credentials' => [ // 'key' => '4d0b8feaf0e12873a3d95bd3aa0b787c', // 'secret' => 'dc72a027e5263590f0bc89fc0b5a1e6c846cc4f036642430681364c4a9056ca4', // ] // ]); // try { // // 1. 원본 객체 다운로드 // $object = $testS3->getObject([ // 'Bucket' => $sourceBucket, // 'Key' => $objectKey, // ]); // // 2. Release 버킷에 업로드 // $releaseS3->putObject([ // 'Bucket' => $targetBucket, // 'Key' => $objectKey, // 'Body' => $object['Body'], // ]); // // 3. Test 버킷에서 원본 삭제 // $testS3->deleteObject([ // 'Bucket' => $sourceBucket, // 'Key' => $objectKey, // ]); // // 4. DB 업데이트 // $stmt = $conn->prepare("UPDATE deploy_files SET release_date=NOW(), releaser=? WHERE id=?"); // $stmt->bind_param("si", $releaser, $file_id); // $stmt->execute(); // echo json_encode([ // 'status' => 'ok', // 'message' => '릴리즈 확정 완료', // 'targetKey' => $objectKey, // ]); // } catch (AwsException $e) { // http_response_code(500); // echo json_encode([ // 'status' => 'fail', // 'message' => '릴리즈 실패: '.$e->getAwsErrorMessage(), // 'error' => $e->getMessage() // ]); // } ?> connect_error) { http_response_code(500); echo json_encode(['message' => 'DB 연결 실패']); exit; } mysqli_set_charset($conn, 'utf8mb4'); // === 파라미터 === $product_code = $_POST['product_code'] ?? ''; $sw_version = $_POST['sw_version'] ?? ''; // 릴리즈 처리 → releaser를 세션에서 가져옴 $releaser = $_POST['releaser'] ?? '알 수 없음'; // JS에서 넘겨준 userName $loginId = $_POST['loginId'] ?? ''; // JS에서 넘겨준 loginId if (!$product_code || !$sw_version) { http_response_code(400); echo json_encode(['message' => '필수값 누락']); exit; } // === 대상 파일 목록 조회 === $sql = "SELECT * FROM deploy_files WHERE product_code=? AND sw_version=? AND deleted=0"; $stmt = $conn->prepare($sql); $stmt->bind_param("ss", $product_code, $sw_version); $stmt->execute(); $res = $stmt->get_result(); $files = []; while ($row = $res->fetch_assoc()) { $files[] = $row; } $stmt->close(); if (empty($files)) { http_response_code(404); echo json_encode(['message' => '해당 버전에 대한 파일이 없습니다.']); exit; } // ✅ 테스트 완료 여부 체크 if (empty($files[0]['test_done_date'])) { echo json_encode(['status'=>'fail','message'=>'테스트 완료 후 릴리즈 가능합니다.']); exit; } // === 버킷 설정 === $sourceBucket = 'baron-software-test'; $targetBucket = 'baron-software-release'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'auto', 'endpoint' => 'https://81fa2d48964d31dd0da9558f9ce601d1.r2.cloudflarestorage.com', 'credentials' => [ // ❗ source(read/write) + target(write) 권한이 모두 있는 키 'key' => '11d7027f505658acb3aeb40c3955a206', 'secret' => '65a78f6c582e0bdfccc2f431fc7b7be2ba11f999f0a8a87142011eac8b84761f', ] ]); $success = []; $failed = []; foreach ($files as $file) { $objectKey = $file['filepath']; try { // 1. CopyObject (테스트 → 릴리즈) $s3->copyObject([ 'Bucket' => $targetBucket, 'Key' => $objectKey, 'CopySource' => $sourceBucket . '/' . $objectKey, ]); // 2. 원본 삭제 (테스트 버킷) $s3->deleteObject([ 'Bucket' => $sourceBucket, 'Key' => $objectKey, ]); $success[] = $objectKey; } catch (AwsException $e) { $failed[] = $objectKey; } } if (!empty($failed)) { // ❌ 하나라도 실패 → 전체 실패 처리 echo json_encode([ 'status' => 'fail', 'message' => '릴리즈 실패: 일부 파일 이동 오류', 'failed' => $failed ]); exit; } // ✅ 여기까지 오면 전체 이동 성공 // 1) deploy_files 업데이트 $stmt = $conn->prepare(" UPDATE deploy_files SET release_date = NOW(), releaser = ? WHERE product_code=? AND sw_version=? AND deleted=0 "); $stmt->bind_param("sss", $releaser, $product_code, $sw_version); $stmt->execute(); $stmt->close(); // 2) deploy_versions.family_version 갱신 $stmt2 = $conn->prepare(" INSERT INTO deploy_versions (product_code, family_version, updated_at) VALUES (?, ?, NOW()) ON DUPLICATE KEY UPDATE family_version = VALUES(family_version), updated_at = NOW() "); $stmt2->bind_param("ss", $product_code, $sw_version); $stmt2->execute(); $stmt2->close(); // 최종 응답 echo json_encode([ 'status' => 'ok', 'message' => '릴리즈 확정 완료', 'moved' => $success, 'release_date' => date('Y-m-d H:i:s'), 'releaser' => $releaser ]);