-
Notifications
You must be signed in to change notification settings - Fork 2
/
Copy pathCityProviderController.php
65 lines (54 loc) · 1.99 KB
/
CityProviderController.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
declare(strict_types=1);
namespace App\Http\Controllers\Api;
use App\Http\Controllers\Controller;
use App\Http\Requests\CityProviderRequest;
use App\Http\Resources\CityResource;
use App\Http\Resources\CountryResource;
use App\Http\Resources\ProviderResource;
use App\Models\City;
use App\Models\Country;
use App\Models\Provider;
use App\Services\CityProviderService;
use App\Services\DataImporterService;
use Illuminate\Database\Eloquent\Builder;
use Illuminate\Http\JsonResponse;
class CityProviderController extends Controller
{
public function index(): JsonResponse
{
$cities = CityResource::collection(
City::with("cityAlternativeNames", "cityProviders", "country")
->has("cityProviders")
->whereHas("cityProviders", fn($query): Builder => $query->whereNotNull("latitude")->whereNotNull("longitude"))
->get()
->sortBy("name")
->sortByDesc(fn(City $city): int => $city->cityProviders->count()),
);
$providers = ProviderResource::collection(Provider::all());
$countries = Country::whereHas("cities.cityProviders")
->with(["cities.cityAlternativeNames", "cities.cityProviders"])
->get()
->sortBy("name");
$countries = CountryResource::collection($countries);
return response()->json([
"cities" => $cities,
"providers" => $providers,
"countries" => $countries,
]);
}
public function update(CityProviderService $service, CityProviderRequest $request, City $city): JsonResponse
{
$service->updateProvider($request->providerNames, $city);
return response()->json([
"message" => __("City providers updated successfully."),
]);
}
public function runImporters(DataImporterService $service): JsonResponse
{
$service->run();
return response()->json([
"message" => __("Importers started."),
]);
}
}