added countries support expanded for ISO 3166 standard
This commit is contained in:
@@ -6,26 +6,87 @@ use Illuminate\Http\JsonResponse;
|
||||
use Illuminate\Http\Request;
|
||||
use Illuminate\Routing\Controller;
|
||||
use Modules\Countries\Models\Country;
|
||||
use Modules\Countries\Models\CountrySubdivision;
|
||||
use Modules\Countries\Support\CountryRepository;
|
||||
|
||||
class CountriesApiController extends Controller
|
||||
{
|
||||
/**
|
||||
* List ISO 3166-1 countries for integrations and selectors.
|
||||
*/
|
||||
public function index(Request $request): JsonResponse
|
||||
{
|
||||
$activeOnly = $request->boolean('active_only', false);
|
||||
$countries = Country::query()->when($activeOnly, fn ($query) => $query->where('is_active', true))->ordered()
|
||||
->get(['alpha2', 'alpha3', 'numeric', 'name', 'official_name', 'common_name', 'display_name', 'flag_emoji', 'is_active']);
|
||||
$search = trim((string) $request->query('search', ''));
|
||||
|
||||
$countries = Country::query()
|
||||
->when($activeOnly, fn ($query) => $query->where('is_active', true))
|
||||
->when($search !== '', function ($query) use ($search): void {
|
||||
$query->where(function ($nested) use ($search): void {
|
||||
$nested->where('name', 'ilike', "%{$search}%")
|
||||
->orWhere('official_name', 'ilike', "%{$search}%")
|
||||
->orWhere('common_name', 'ilike', "%{$search}%")
|
||||
->orWhere('display_name', 'ilike', "%{$search}%")
|
||||
->orWhere('alpha2', 'ilike', "%{$search}%")
|
||||
->orWhere('alpha3', 'ilike', "%{$search}%")
|
||||
->orWhere('numeric', 'ilike', "%{$search}%")
|
||||
->orWhere('region', 'ilike', "%{$search}%")
|
||||
->orWhere('subregion', 'ilike', "%{$search}%");
|
||||
});
|
||||
})
|
||||
->ordered()
|
||||
->get(['alpha2', 'alpha3', 'numeric', 'name', 'official_name', 'common_name', 'display_name', 'flag_emoji', 'is_active', 'iso_status', 'independent', 'region', 'subregion']);
|
||||
|
||||
return response()->json(['data' => $countries]);
|
||||
}
|
||||
|
||||
/**
|
||||
* List active ISO 3166-1 countries for business selectors.
|
||||
*/
|
||||
public function active(): JsonResponse
|
||||
{
|
||||
$countries = Country::query()->active()->ordered()
|
||||
->get(['alpha2', 'alpha3', 'numeric', 'name', 'display_name', 'common_name', 'flag_emoji']);
|
||||
->get(['alpha2', 'alpha3', 'numeric', 'name', 'display_name', 'common_name', 'flag_emoji', 'region', 'subregion']);
|
||||
|
||||
return response()->json(['data' => $countries]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Show one country by alpha-2 route binding.
|
||||
*/
|
||||
public function show(Country $country): JsonResponse
|
||||
{
|
||||
return response()->json(['data' => $country->loadCount('subdivisions')]);
|
||||
}
|
||||
|
||||
/**
|
||||
* Resolve alpha-2, alpha-3 or numeric ISO 3166-1 country code.
|
||||
*/
|
||||
public function resolve(string $code, CountryRepository $countries): JsonResponse
|
||||
{
|
||||
$country = $countries->findByIsoCode($code);
|
||||
|
||||
abort_if($country === null, 404, 'Country code not found.');
|
||||
|
||||
return response()->json(['data' => $country]);
|
||||
}
|
||||
|
||||
/**
|
||||
* List ISO 3166-2 subdivisions for the supplied ISO 3166-1 alpha-2 country.
|
||||
*/
|
||||
public function subdivisions(string $alpha2, Request $request, CountryRepository $countries): JsonResponse
|
||||
{
|
||||
$activeOnly = $request->boolean('active_only', true);
|
||||
$country = $countries->findByAlpha2($alpha2);
|
||||
|
||||
abort_if($country === null, 404, 'Country not found.');
|
||||
|
||||
$subdivisions = CountrySubdivision::query()
|
||||
->where('country_id', $country->id)
|
||||
->when($activeOnly, fn ($query) => $query->where('is_active', true))
|
||||
->ordered()
|
||||
->get(['country_alpha2', 'code', 'subdivision_code', 'name', 'local_name', 'type', 'is_active', 'iso_status']);
|
||||
|
||||
return response()->json(['data' => $subdivisions]);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -57,6 +57,10 @@ class CountriesController extends Controller
|
||||
'display_name' => $request->validated('display_name'),
|
||||
'is_active' => $request->boolean('is_active'),
|
||||
'sort_order' => (int) ($request->validated('sort_order') ?? 0),
|
||||
'iso_status' => $request->validated('iso_status'),
|
||||
'independent' => $request->boolean('independent'),
|
||||
'region' => $request->validated('region'),
|
||||
'subregion' => $request->validated('subregion'),
|
||||
]);
|
||||
|
||||
return redirect()->route('countries.show', $country)->with('success', 'Country settings updated.');
|
||||
|
||||
@@ -3,20 +3,32 @@
|
||||
namespace Modules\Countries\Http\Requests;
|
||||
|
||||
use Illuminate\Foundation\Http\FormRequest;
|
||||
use Illuminate\Validation\Rule;
|
||||
use Modules\Countries\Support\Iso3166;
|
||||
|
||||
class UpdateCountryRequest extends FormRequest
|
||||
{
|
||||
/**
|
||||
* Authorize country reference-data administration.
|
||||
*/
|
||||
public function authorize(): bool
|
||||
{
|
||||
return (bool) $this->user();
|
||||
return (bool) $this->user()?->isMpbaPlatformAdmin();
|
||||
}
|
||||
|
||||
/**
|
||||
* @return array<string, mixed>
|
||||
*/
|
||||
public function rules(): array
|
||||
{
|
||||
return [
|
||||
'display_name' => ['nullable', 'string', 'max:255'],
|
||||
'is_active' => ['nullable', 'boolean'],
|
||||
'sort_order' => ['nullable', 'integer', 'min:0', 'max:999999'],
|
||||
'iso_status' => ['required', 'string', Rule::in(Iso3166::statuses())],
|
||||
'independent' => ['nullable', 'boolean'],
|
||||
'region' => ['nullable', 'string', 'max:100'],
|
||||
'subregion' => ['nullable', 'string', 'max:100'],
|
||||
];
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user