72 lines
2.3 KiB
PHP
72 lines
2.3 KiB
PHP
<?php
|
|
|
|
namespace App\Http\Controllers;
|
|
|
|
use Illuminate\Http\Request;
|
|
use Illuminate\Http\JsonResponse;
|
|
use Illuminate\Support\Facades\DB;
|
|
|
|
/**
|
|
* Place Controller
|
|
* Replaces: ride/places/add.php, ride/places_syria/*.php
|
|
*/
|
|
class PlaceController extends Controller
|
|
{
|
|
/** GET /v2/places/search?q=XXX&lat=XX&lng=XX */
|
|
public function search(Request $request): JsonResponse
|
|
{
|
|
$q = $request->input('q', '');
|
|
$lat = $request->input('lat');
|
|
$lng = $request->input('lng');
|
|
$limit = min((int) $request->input('limit', 20), 50);
|
|
|
|
$query = DB::connection('primary')->table('palces11');
|
|
|
|
if (!empty($q)) {
|
|
// Fulltext search (palces11 has FULLTEXT index)
|
|
$query->whereRaw(
|
|
"MATCH(name, name_ar, name_en, address, category) AGAINST(? IN BOOLEAN MODE)",
|
|
[$q . '*']
|
|
);
|
|
}
|
|
|
|
// If coordinates provided, sort by distance
|
|
if ($lat && $lng) {
|
|
$query->selectRaw("*,
|
|
ST_Distance_Sphere(
|
|
POINT(CAST(longitude AS DECIMAL(10,7)), CAST(latitude AS DECIMAL(10,7))),
|
|
POINT(?, ?)
|
|
) AS distance_meters", [(float)$lng, (float)$lat])
|
|
->orderBy('distance_meters');
|
|
}
|
|
|
|
$places = $query->limit($limit)->get();
|
|
|
|
return response()->json(['status' => 'success', 'data' => $places]);
|
|
}
|
|
|
|
/** POST /v2/places */
|
|
public function store(Request $request): JsonResponse
|
|
{
|
|
$request->validate([
|
|
'latitude' => 'required|numeric',
|
|
'longitude' => 'required|numeric',
|
|
'name' => 'required|string|max:180',
|
|
'category' => 'required|string|max:55',
|
|
]);
|
|
|
|
DB::connection('primary')->table('palces11')->insert([
|
|
'latitude' => $request->input('latitude'),
|
|
'longitude' => $request->input('longitude'),
|
|
'name' => $request->input('name'),
|
|
'name_ar' => $request->input('name_ar'),
|
|
'name_en' => $request->input('name_en'),
|
|
'address' => $request->input('address'),
|
|
'category' => $request->input('category'),
|
|
'created_at' => now(),
|
|
]);
|
|
|
|
return response()->json(['status' => 'success'], 201);
|
|
}
|
|
}
|