deviceModel = new DeviceModel(); } /** * Authenticate device by device_code and api_key * * @param string $deviceCode Device code * @param string $apiKey API key * @return array|null Returns device data if authenticated, null otherwise */ public function authenticate(string $deviceCode, string $apiKey): ?array { // Find active device by device_code $device = $this->deviceModel->findActiveByDeviceCode($deviceCode); if (!$device) { return null; } // For development: compare plain api_key // In production, should use password_verify() with hashed api_key if ($device->api_key !== $apiKey) { return null; } // Update last_seen_at $this->touchLastSeen($device->id); return [ 'device_id' => $device->id, 'device_code' => $device->device_code, 'device_name' => $device->device_name, 'latitude' => $device->latitude !== null ? (float) $device->latitude : null, 'longitude' => $device->longitude !== null ? (float) $device->longitude : null, 'radius_meters' => $device->radius_meters !== null ? (int) $device->radius_meters : null, ]; } /** * Update last_seen_at timestamp for device * * @param int $deviceId Device ID * @return void */ public function touchLastSeen(int $deviceId): void { $this->deviceModel->updateLastSeen($deviceId); } }