warn('No graph contracts configured.'); return self::SUCCESS; } $tenant = $this->option('tenant'); $failures = 0; foreach ($contracts as $type => $contract) { $resource = $contract['resource'] ?? null; $select = $contract['allowed_select'] ?? []; $expand = $contract['allowed_expand'] ?? []; if (! $resource) { $this->error("[$type] missing resource path"); $failures++; continue; } $query = array_filter([ '$top' => 1, '$select' => $select, '$expand' => $expand, ]); $response = $graph->request('GET', $resource, [ 'query' => $query, 'tenant' => $tenant, ]); if ($response->failed()) { $code = $response->meta['error_code'] ?? $response->status; $message = $response->meta['error_message'] ?? ($response->errors[0]['message'] ?? $response->errors[0] ?? 'unknown'); $this->error("[$type] drift or capability issue ({$code}): {$message}"); $failures++; continue; } if (! empty($response->warnings)) { $this->warn("[$type] completed with warnings: ".implode('; ', $response->warnings)); } else { $this->info("[$type] OK"); } } return $failures > 0 ? self::FAILURE : self::SUCCESS; } }