diff --git a/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php b/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php index 5fa0e7e..4129293 100644 --- a/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php +++ b/app/Http/Controllers/Api/V1/DropOff/DropOffPointController.php @@ -16,7 +16,7 @@ class DropOffPointController extends ApiController $data = $request->validate([ 'lat' => ['required', 'numeric', 'between:-90,90'], 'lng' => ['required', 'numeric', 'between:-180,180'], - 'radius_km' => ['nullable', 'numeric', 'min:0.1', 'max:50'], + 'radius_km' => ['nullable', 'numeric', 'min:0.1', 'max:25000'], 'limit' => ['nullable', 'integer', 'min:1', 'max:50'], ]); diff --git a/bootstrap/app.php b/bootstrap/app.php index 1c651cf..d6e8e13 100644 --- a/bootstrap/app.php +++ b/bootstrap/app.php @@ -52,6 +52,7 @@ return Application::configure(basePath: dirname(__DIR__)) $exceptions->render(function (ValidationException $e, Request $request) { if ($request->is('api/*') || $request->expectsJson()) { + \Illuminate\Support\Facades\Log::error('API Validation Failed: ' . json_encode($e->errors())); return ApiResponse::error( 'Validation failed', $e->errors(), diff --git a/database/seeders/DatabaseSeeder.php b/database/seeders/DatabaseSeeder.php index e614422..a4a117f 100644 --- a/database/seeders/DatabaseSeeder.php +++ b/database/seeders/DatabaseSeeder.php @@ -11,8 +11,8 @@ class DatabaseSeeder extends Seeder $this->call([ RoleSeeder::class, SamplePsgcSeeder::class, - DevelopmentSeeder::class, QuezonCitySeeder::class, + SuperAdminSeeder::class, ]); } } diff --git a/database/seeders/SampleDropOffPointsSeeder.php b/database/seeders/SampleDropOffPointsSeeder.php index 397c902..76bfbff 100644 --- a/database/seeders/SampleDropOffPointsSeeder.php +++ b/database/seeders/SampleDropOffPointsSeeder.php @@ -43,9 +43,16 @@ class SampleDropOffPointsSeeder extends Seeder ]; foreach ($dops as $d) { + $tenantId = null; + if ($d['barangay']) { + $tenant = \App\Models\Tenant::where('city_municipality_id', $d['barangay']->city_municipality_id)->first(); + $tenantId = $tenant?->id; + } + DropOffPoint::updateOrCreate( ['code' => $d['code']], [ + 'tenant_id' => $tenantId, 'name' => $d['name'], 'barangay_id' => $d['barangay']?->id, 'coordinates' => new Point($d['lat'], $d['lng'], 4326), diff --git a/resources/views/admin/lgus.blade.php b/resources/views/admin/lgus.blade.php index 1d9293e..178a7ac 100644 --- a/resources/views/admin/lgus.blade.php +++ b/resources/views/admin/lgus.blade.php @@ -334,6 +334,38 @@ }); } + async function loadProvinces(regionCode) { + provinceSelect.innerHTML = ''; + citySelect.innerHTML = ''; + provinceSelect.disabled = true; + citySelect.disabled = true; + cityIdInput.value = ''; + + if (!regionCode) return; + + const provRes = await window.Verde.apiFetch(`/api/v1/geo/provinces?region=${regionCode}`); + if (provRes.ok) { + provinceSelect.innerHTML = '' + + provRes.body.data.map(p => ``).join(''); + provinceSelect.disabled = false; + } + } + + async function loadCities(provCode) { + citySelect.innerHTML = ''; + citySelect.disabled = true; + cityIdInput.value = ''; + + if (!provCode) return; + + const cityRes = await window.Verde.apiFetch(`/api/v1/geo/cities?province=${provCode}`); + if (cityRes.ok) { + citySelect.innerHTML = '' + + cityRes.body.data.map(c => ``).join(''); + citySelect.disabled = false; + } + } + // Load PSGC Geographics Dropdowns async function loadGeoDropdowns() { const res = await window.Verde.apiFetch('/api/v1/geo/regions'); @@ -342,39 +374,8 @@ regionSelect.innerHTML = '' + res.body.data.map(r => ``).join(''); - regionSelect.addEventListener('change', async () => { - provinceSelect.innerHTML = ''; - citySelect.innerHTML = ''; - provinceSelect.disabled = true; - citySelect.disabled = true; - cityIdInput.value = ''; - - const regionCode = regionSelect.value; - if (!regionCode) return; - - const provRes = await window.Verde.apiFetch(`/api/v1/geo/provinces?region=${regionCode}`); - if (provRes.ok) { - provinceSelect.innerHTML = '' + - provRes.body.data.map(p => ``).join(''); - provinceSelect.disabled = false; - } - }); - - provinceSelect.addEventListener('change', async () => { - citySelect.innerHTML = ''; - citySelect.disabled = true; - cityIdInput.value = ''; - - const provCode = provinceSelect.value; - if (!provCode) return; - - const cityRes = await window.Verde.apiFetch(`/api/v1/geo/cities?province=${provCode}`); - if (cityRes.ok) { - citySelect.innerHTML = '' + - cityRes.body.data.map(c => ``).join(''); - citySelect.disabled = false; - } - }); + regionSelect.addEventListener('change', () => loadProvinces(regionSelect.value)); + provinceSelect.addEventListener('change', () => loadCities(provinceSelect.value)); citySelect.addEventListener('change', () => { const opt = citySelect.options[citySelect.selectedIndex]; @@ -615,19 +616,15 @@ if (reg) { regionSelect.value = reg.psgc_code; - regionSelect.dispatchEvent(new Event('change')); + await loadProvinces(reg.psgc_code); - setTimeout(async () => { - if (prov) { - provinceSelect.value = prov.psgc_code; - provinceSelect.dispatchEvent(new Event('change')); - - setTimeout(() => { - citySelect.value = city.psgc_code; - cityIdInput.value = city.id; - }, 300); - } - }, 300); + if (prov) { + provinceSelect.value = prov.psgc_code; + await loadCities(prov.psgc_code); + + citySelect.value = city.psgc_code; + cityIdInput.value = city.id; + } } } @@ -731,6 +728,11 @@ payload.city_municipality_id = parseInt(cityIdInput.value, 10); + if (editingTenantUuid) { + delete payload.admin_email; + delete payload.admin_password; + } + const method = editingTenantUuid ? 'PATCH' : 'POST'; const url = editingTenantUuid ? `/api/v1/super-admin/tenants/${editingTenantUuid}` diff --git a/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php b/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php index c3c166e..bee62cd 100644 --- a/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php +++ b/tests/Feature/Api/V1/SuperAdmin/SuperAdminTenantTest.php @@ -187,4 +187,11 @@ class SuperAdminTenantTest extends TestCase 'id' => $tenant->id, ]); } + + public function test_per_page_validation(): void + { + Sanctum::actingAs($this->superAdmin); + $response = $this->getJson('/api/v1/super-admin/tenants?per_page=100'); + $response->assertStatus(200); + } }