15, 'headers' => array( 'x-rapidapi-host' => env('BULUT_RAPIDAPI_HOST'), 'x-rapidapi-key' => env('BULUT_RAPIDAPI_KEY'), ), )); } /** * ADIM 1: Otel adına göre ara → hotel_id al * GET /bulut/search?name=Grand Yavuz Hotel Istanbul */ public function search(Request $request) { $name = $request->query('name', ''); if (!$name) { return response()->json(array('status' => false, 'message' => 'name parametresi gerekli'), 422); } try { $response = $this->client()->get( 'https://' . env('BULUT_RAPIDAPI_HOST') . '/locations/auto-complete', array('query' => array('text' => $name, 'languagecode' => 'en-us')) ); $data = json_decode($response->getBody()->getContents(), true); return response()->json(array('status' => true, 'raw' => $data)); } catch (Exception $e) { Log::error('search error: ' . $e->getMessage()); return response()->json(array('status' => false, 'message' => $e->getMessage()), 500); } } /** * ADIM 2: Otel detayları * GET /bulut/hotel-data?hotel_id=1234567&checkin=2026-06-01&checkout=2026-06-02 */ public function hotelData(Request $request) { $hotelId = $request->query('hotel_id'); $checkin = $request->query('checkin'); $checkout = $request->query('checkout'); if (!$hotelId) { return response()->json(array('status' => false, 'message' => 'hotel_id gerekli'), 422); } try { $response = $this->client()->get( 'https://' . env('BULUT_RAPIDAPI_HOST') . '/properties/detail', array('query' => array( 'hotel_id' => $hotelId, 'arrival_date' => $checkin, 'departure_date' => $checkout, 'languagecode' => 'en-us', 'currency_code' => 'USD', )) ); $data = json_decode($response->getBody()->getContents(), true); return response()->json(array('status' => true, 'data' => $data)); } catch (Exception $e) { Log::error('hotelData error: ' . $e->getMessage()); return response()->json(array('status' => false, 'message' => $e->getMessage()), 500); } } public function hotelPhotos(Request $request) { $hotelIds = $request->query('hotel_ids'); $hotelName = $request->query('hotel_name', 'hotel'); $propertyId = $request->query('property_id', $hotelIds); if (!$hotelIds) { return response()->json(array( 'status' => false, 'message' => 'hotel_ids gerekli' ), 422); } try { $response = $this->client()->get( 'https://' . env('BULUT_RAPIDAPI_HOST') . '/properties/get-hotel-photos', array( 'query' => array( 'hotel_ids' => $hotelIds, 'languagecode' => 'en-us', ) ) ); $data = json_decode($response->getBody()->getContents(), true); $savedImages = $this->saveHotelPhotosFromResponse($data, $hotelName, $propertyId); Log::info('BULUT RAW RESPONSE KEYS', array( 'main_keys' => array_keys($data), 'data_keys' => isset($data['data']) && is_array($data['data']) ? array_keys($data['data']) : array(), )); return response()->json(array( 'status' => true, 'message' => 'Otel görselleri başarıyla indirildi ve gruplandı.', 'debug' => array( 'main_keys' => array_keys($data), 'data_keys' => isset($data['data']) && is_array($data['data']) ? array_keys($data['data']) : array(), 'data_data_keys' => isset($data['data']['data']) && is_array($data['data']['data']) ? array_keys($data['data']['data']) : array(), ), 'saved_images' => $savedImages )); } catch (Exception $e) { Log::error('hotelPhotos error: ' . $e->getMessage()); return response()->json(array( 'status' => false, 'message' => $e->getMessage() ), 500); } } private function saveHotelPhotosFromResponse(array $responseData, string $hotelName, $propertyId) { $result = array(); $urlPrefix = 'https://cf.bstatic.com'; if (isset($responseData['url_prefix'])) { $urlPrefix = $responseData['url_prefix']; } if (isset($responseData['data']['url_prefix'])) { $urlPrefix = $responseData['data']['url_prefix']; } $hotels = $this->extractHotelsFromPhotoResponse($responseData); Log::info('BULUT PHOTO HOTELS EXTRACTED', array( 'hotel_count' => count($hotels), 'hotel_keys' => array_keys($hotels), 'url_prefix' => $urlPrefix )); $uploadRootPath = rtrim(Config::get('app.fileSystemDriver'), '/'); $propertyBasePath = $uploadRootPath . '/property-photos/' . $propertyId; if (!File::exists($propertyBasePath)) { File::makeDirectory($propertyBasePath, 0777, true); } foreach ($hotels as $hotelId => $photos) { $hotelFolderName = Str::slug($hotelName) . '-' . $hotelId; $basePath = $propertyBasePath . '/bulut/' . $hotelFolderName; if (!File::exists($basePath)) { File::makeDirectory($basePath, 0777, true); } $result[$hotelId] = array( 'hotel_name' => $hotelName, 'property_id' => $propertyId, 'folder' => '/property-photos/' . $propertyId . '/bulut/' . $hotelFolderName, 'physical_path' => $basePath, 'groups' => array() ); foreach ($photos as $photo) { $photoId = isset($photo[2]) ? $photo[2] : uniqid(); $tags = isset($photo[3]) ? $photo[3] : array(); $imagePath = isset($photo[4]) ? $photo[4] : null; if (!$imagePath) { continue; } $groupName = $this->detectPhotoGroup($tags); $groupPath = $basePath . '/' . $groupName; if (!File::exists($groupPath)) { File::makeDirectory($groupPath, 0777, true); } $imageUrl = $urlPrefix . $imagePath; $fileName = $photoId . '.jpg'; $savePath = $groupPath . '/' . $fileName; try { $this->downloadImage($imageUrl, $savePath); $relativePath = '/property-photos/' . $propertyId . '/bulut/' . $hotelFolderName . '/' . $groupName . '/' . $fileName; if (!isset($result[$hotelId]['groups'][$groupName])) { $result[$hotelId]['groups'][$groupName] = array(); } $result[$hotelId]['groups'][$groupName][] = array( 'photo_id' => $photoId, 'file_name' => $fileName, 'photo_path' => '/property-photos/' . $propertyId . '/bulut/' . $hotelFolderName . '/' . $groupName . '/', 'relative_path' => $relativePath, 'physical_path' => $savePath, 'source_url' => $imageUrl, 'tags' => $tags ); } catch (Exception $e) { Log::error('BULUT IMAGE DOWNLOAD ERROR: ' . $e->getMessage(), array( 'image_url' => $imageUrl, 'save_path' => $savePath )); } } } return $result; } private function detectPhotoGroup(array $tags) { $tagNames = array(); foreach ($tags as $tag) { if (isset($tag['tag'])) { $tagNames[] = strtolower($tag['tag']); } } $tagText = implode(' ', $tagNames); if ( strpos($tagText, 'room') !== false || strpos($tagText, 'bedroom') !== false || strpos($tagText, 'bed') !== false || strpos($tagText, 'living room') !== false ) { return 'rooms'; } if ( strpos($tagText, 'bathroom') !== false || strpos($tagText, 'shower') !== false || strpos($tagText, 'toilet') !== false ) { return 'bathroom'; } if ( strpos($tagText, 'breakfast') !== false || strpos($tagText, 'buffet') !== false ) { return 'breakfast'; } if ( strpos($tagText, 'restaurant') !== false || strpos($tagText, 'food') !== false || strpos($tagText, 'drinks') !== false || strpos($tagText, 'lunch') !== false || strpos($tagText, 'dinner') !== false ) { return 'restaurant'; } if ( strpos($tagText, 'lobby') !== false || strpos($tagText, 'reception') !== false || strpos($tagText, 'lounge') !== false || strpos($tagText, 'seating area') !== false ) { return 'lobby'; } if ( strpos($tagText, 'spa') !== false || strpos($tagText, 'wellness') !== false || strpos($tagText, 'public bath') !== false ) { return 'spa'; } if ( strpos($tagText, 'balcony') !== false || strpos($tagText, 'terrace') !== false || strpos($tagText, 'garden') !== false || strpos($tagText, 'sea view') !== false || strpos($tagText, 'city view') !== false ) { return 'view-and-outdoor'; } if ( strpos($tagText, 'property building') !== false || strpos($tagText, 'property') !== false ) { return 'property'; } return 'other'; } private function downloadImage(string $imageUrl, string $savePath) { $client = new Client(array( 'timeout' => 30, 'verify' => false, 'headers' => array( 'User-Agent' => 'Mozilla/5.0' ) )); $response = $client->get($imageUrl); if ($response->getStatusCode() !== 200) { throw new Exception('Image download failed: ' . $imageUrl); } File::put($savePath, $response->getBody()->getContents()); return true; } private function extractHotelsFromPhotoResponse(array $responseData) { if (isset($responseData['data']) && is_array($responseData['data'])) { foreach ($responseData['data'] as $key => $value) { if (is_numeric($key) && is_array($value)) { return $responseData['data']; } } } if (isset($responseData['data']['data']) && is_array($responseData['data']['data'])) { return $responseData['data']['data']; } if (isset($responseData['data']['data']['data']) && is_array($responseData['data']['data']['data'])) { return $responseData['data']['data']['data']; } return array(); } }