GOOD SHELL MAS BOY
Server: Apache/2.4.52 (Ubuntu)
System: Linux vmi1836763.contaboserver.net 5.15.0-130-generic #140-Ubuntu SMP Wed Dec 18 17:59:53 UTC 2024 x86_64
User: www-data (33)
PHP: 8.4.10
Disabled: NONE
Upload Files
File: /var/www/console.fixgini.com/app/Http/Controllers/Admin/CountryController.php
<?php

namespace App\Http\Controllers\Admin;

use App\Models\City;
use App\Models\State;
use GuzzleHttp\Client;
use App\Models\Country;
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Log;
use App\Http\Controllers\Controller;

class CountryController extends Controller
{

     public function location()
     {
          $client = new Client();

          try {
               $response = $client->post('https://www.googleapis.com/geolocation/v1/geolocate?key=AIzaSyAz2O3wS3rGltDhV9YFMSk0d1GyySIUfDk', [
                    'json' => [
                         'considerIp' => true,  // Automatically uses the request's IP
                    ],
               ]);

               $location = json_decode($response->getBody(), true);
               return $location;
          } catch (\GuzzleHttp\Exception\RequestException $e) {
               // Handle the error
               return [
                    'error' => true,
                    'message' => $e->getMessage(),
               ];
          }
     }

     public function listCountry()
     {
          $country = Country::all();
          if ($country) {
               return response()->json(['status' => 'success', 'data' => $country]);
          } else {
               return response()->json(['status' => 'error', 'data' => []]);
          }
     }

    
     public function getCountry(Request $request)
     {
          try {
               // Validate the query parameter
               $validatedData = $request->validate([
                    'country_id' => 'required',
               ]);

               // Fetch the states for the country
               $states = Country::with('states')->where('id', $validatedData['country_id'])->get();

               return response()->json(['status' => 'success', 'data' => $states], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'message' => 'Failed to retrieve location data', 'error' => $th->getMessage()], 500);
          }
     }

     public function getState(Request $request)
     {
          try {
               $validatedData = $request->validate([
                    'state_id' => 'required',
               ]);
               $cities = State::where('id', $validatedData['state_id'])->with('cities')->get();
               return response()->json(['status' => 'success', 'data' => $cities], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'message' => 'failed to retrieve location data', 'error' => $th->getMessage()], 500);
          }
     }

     public function list()
     {
          try {
               $countries = Country::with('states')->with('cities')->get();
               return response()->json(['status' => 'success', 'data' => $countries], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to list countrt'], 500);
          }
     }

     public function listStates()
     {
          try {
               $states = State::all();
               return response()->json(['status' => 'success', 'data' => $states], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to list states'], 500);
          }
     }

     public function listCities()
     {
          try {
               $cities = City::all();
               return response()->json(['status' => 'success', 'data' => $cities], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to list cities'], 500);
          }
     }

     public function save(Request $request)
     {
          try {
               $validatedData = $request->validate([
                    'name' => 'required|unique:countries,name',
                    'dial_code' => 'required',
                    'symbol' => 'required',
                    'flag_url' => 'required',
               ]);

               if ($request->hasFile('flag_url')) {
                    $uploadedFile = $request->file('flag_url')->getRealPath();
                    // Upload to Cloudinary with transformation
                    $uploadResult = cloudinary()->upload($uploadedFile, [
                         'folder' => 'countryIcons',
                         'transformation' => [
                              'width' => 36,
                              'height' => 19,
                              'crop' => 'fill', // Ensures the image fits the dimensions
                         ],
                    ]);
                    $uploadedFileUrl = $uploadResult->getSecurePath();
                    $publicId = $uploadResult->getPublicId();
               }

               $countries = Country::create([
                    'name' => $validatedData['name'],
                    'dial_code' => $validatedData['dial_code'],
                    'symbol' => $validatedData['symbol'],
                    'flag_url' => $uploadedFileUrl,
                    'flag_public_id' => $publicId,
               ]);
               return response()->json(['status' => 'success', 'message' => 'Country saved successfully', 'data' => $countries], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'message' => 'failed to save country', 'data' => $th->getMessage()], 500);
          }
     }

     public function saveState(Request $request)
     {
          try {
               $validatedData = $request->validate([
                    'name' => 'required|unique:states,name',
                    'country_id' => 'required|exists:countries,id',
               ]);
               $state = State::create([
                    'name' => $validatedData['name'],
                    'country_id' => $validatedData['country_id'],
               ]);
               return response()->json(['status' => 'success', 'data' => $state], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to save state', 'message' => $th->getMessage()], 500);
          }
     }

     public function saveCity(Request $request)
     {
          try {
               $validatedData = $request->validate([
                    'name' => 'required|unique:cities,name',
                    'state_id' => 'required|exists:states,id',
                    'country_id' => 'required|exists:countries,id',
               ]);

               $city = City::create([
                    'name' => $validatedData['name'],
                    'state_id' => $validatedData['state_id'],
                    'country_id' => $validatedData['country_id'],
               ]);
               return response()->json(['status' => 'success', 'data' => $city], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to save state', 'message' => $th->getMessage()], 500);
          }
     }

     public function updateCountry(Request $request, $id)
     {
          try {
               $validatedData = $request->validate([
                    'name' => 'sometimes',
                    'dial_code' => 'sometimes',
                    'symbol' => 'sometimes',
               ]);

               $country = Country::findOrFail($id);
               $country->update([
                    'name' => $validatedData['name'],
                    'dial_code' => $validatedData['dial_code'],
                    'symbol' => $validatedData['symbol'],
                    'flag_url' => $request->input('flag_url', $country->flag_url),
               ]);

               return response()->json(['status' => 'success', 'data' => $country], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to update country', 'message' => $th->getMessage()], 500);
          }
     }

     public function updateState(Request $request, $id)
     {
          try {
               $validatedData = $request->validate([
                    'name' => 'required|unique:states,name,' . $id,
                    'country_id' => 'required|exists:countries,id',
               ]);

               $state = State::findOrFail($id);
               $state->update([
                    'name' => $validatedData['name'],
                    'country_id' => $validatedData['country_id'],
               ]);

               return response()->json(['status' => 'success', 'data' => $state], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to update state', 'message' => $th->getMessage()], 500);
          }
     }

     public function updateCity(Request $request, $id)
     {
          try {
               $validatedData = $request->validate([
                    'name' => 'required|unique:cities,name,' . $id,
                    'state_id' => 'required|exists:states,id',
                    'country_id' => 'required|exists:countries,id',
               ]);

               $city = City::findOrFail($id);
               $city->update([
                    'name' => $validatedData['name'],
                    'state_id' => $validatedData['state_id'],
                    'country_id' => $validatedData['country_id'],
               ]);

               return response()->json(['status' => 'success', 'data' => $city], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to update city', 'message' => $th->getMessage()], 500);
          }
     }

     public function deleteCountry($id)
     {
          try {
               $country = Country::findOrFail($id);
               $country->delete();

               return response()->json(['status' => 'success', 'message' => 'Country deleted successfully'], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to delete country', 'message' => $th->getMessage()], 500);
          }
     }

     public function deleteState($id)
     {
          try {
               $state = State::findOrFail($id);
               $state->delete();

               return response()->json(['status' => 'success', 'message' => 'State deleted successfully'], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to delete state', 'message' => $th->getMessage()], 500);
          }
     }

     public function deleteCity($id)
     {
          try {
               $city = City::findOrFail($id);
               $city->delete();

               return response()->json(['status' => 'success', 'message' => 'City deleted successfully'], 200);
          } catch (\Throwable $th) {
               Log::error($th->getMessage());
               return response()->json(['status' => 'error', 'data' => 'failed to delete city', 'message' => $th->getMessage()], 500);
          }
     }
}