date('Y-m-d H:i:s'), 'api_version' => '1.0', ]; return $this->successResponse($data, 'Mobile connected'); } /** * GET /api/mobile/bootstrap * * Returns active zones, device validation rules, and checkin tolerance for app startup. * * @return ResponseInterface */ public function bootstrap(): ResponseInterface { $zoneModel = new ZoneModel(); $activeZones = $zoneModel->findAllActive(); $zonesData = []; foreach ($activeZones as $zone) { $zonesData[] = [ 'zone_code' => $zone->zone_code, 'zone_name' => $zone->zone_name, 'latitude' => (float) $zone->latitude, 'longitude' => (float) $zone->longitude, 'radius_meters' => (int) $zone->radius_meters, ]; } $data = [ 'server_timestamp' => gmdate('Y-m-d\TH:i:s\Z'), // ISO 8601 UTC — for device_time_offset = server_time - device_time 'server_timezone' => 'Asia/Jakarta', // WIB — for display / jadwal sekolah 'active_zones' => $zonesData, 'device_validation_rules' => [ 'require_device_code' => true, 'require_api_key' => true, ], 'checkin_tolerance_minutes' => $this->checkinToleranceMinutes, ]; return $this->successResponse($data, 'Bootstrap data'); } }