> ## Documentation Index
> Fetch the complete documentation index at: https://docs.devin.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# Migrare 50 file da REST a GraphQL

export const UseCaseHero = ({title, description, prompt, category, features, devinUrl, agent, intent, playbookId, type}) => {
  const encodedPrompt = encodeURIComponent(prompt || '');
  const tag = 'docs-use-case-gallery';
  const utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=hero-cta';
  const agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  const devinHref = type === 'schedule' ? 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + (prompt ? '&prompt=' + encodedPrompt : '') : type === 'review' ? 'https://app.devin.ai/review?' + utm : agent === 'ada' ? 'https://app.devin.ai/search?' + utm + '&noSubmit=true' + (prompt ? '&prompt=' + encodedPrompt : '') : devinUrl ? devinUrl.includes('?') ? devinUrl + '&' + utm + agentParams : devinUrl + '?' + utm + agentParams : prompt ? 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encodedPrompt : 'https://app.devin.ai/?' + utm + agentParams;
  const buttonLabel = type === 'schedule' ? 'Schedule in Devin ↗' : type === 'review' ? 'Set Up Devin Review ↗' : agent === 'advanced' ? 'Try in Devin ↗' : agent === 'dana' ? 'Try in Dana ↗' : agent === 'ada' ? 'Try in Ask Devin ↗' : 'Try in Devin ↗';
  const featureList = features ? features.split(',').map(f => f.trim()) : [];
  return <div className="uc-hero">
      <div className="uc-hero-inner">
        <div className="uc-hero-left">
          <h1 className="uc-hero-title">{title}</h1>
          <p className="uc-hero-desc">{description}</p>
          <div>
            <a href={devinHref} target="_blank" rel="noopener noreferrer" className="try-in-devin-btn">
              {buttonLabel}
            </a>
          </div>
        </div>
        <div className="uc-hero-meta">
          <div className="uc-meta-item">
            <span className="uc-meta-label">Author</span>
            <span className="uc-meta-value">Cognition</span>
          </div>
          <div className="uc-meta-item">
            <span className="uc-meta-label">Category</span>
            <span className="uc-meta-value">{category}</span>
          </div>
          {featureList.length > 0 && <div className="uc-meta-item">
              <span className="uc-meta-label">Features</span>
              <span className="uc-meta-value">{featureList.join(', ')}</span>
            </div>}
        </div>
      </div>
    </div>;
};

export const PromptBlock = ({children, type, agent, intent, playbookId}) => {
  var utm = 'utm_source=docs&utm_medium=use-case-gallery&utm_campaign=prompt-block';
  var tag = 'docs-use-case-gallery';
  var agentParams = (agent ? '&agent=' + agent : '') + (intent ? '&intent=' + intent : '') + (playbookId ? '&playbookId=' + playbookId : '');
  var label = type === 'schedule' ? 'Schedule in Devin' : type === 'playbook' ? 'Create Playbook' : type === 'knowledge' ? 'Add to Knowledge' : agent === 'advanced' ? 'Try in Devin' : agent === 'dana' ? 'Try in Dana' : agent === 'ada' ? 'Try in Ask Devin' : 'Try in Devin';
  var buildUrl = function (text) {
    var encoded = encodeURIComponent(text);
    if (type === 'schedule') return 'https://app.devin.ai/settings/schedules/create?' + utm + agentParams + '&prompt=' + encoded;
    if (type === 'playbook') return 'https://app.devin.ai/settings/playbooks/create?' + utm + '&body=' + encoded;
    if (type === 'knowledge') return 'https://app.devin.ai/knowledge?' + utm + '&body=' + encoded;
    if (agent === 'ada') return 'https://app.devin.ai/search?' + utm + '&noSubmit=true&prompt=' + encoded;
    return 'https://app.devin.ai/?tags=' + tag + '&' + utm + agentParams + '&prompt=' + encoded;
  };
  const ref = React.useRef(null);
  const [href, setHref] = React.useState('#');
  React.useEffect(() => {
    if (!ref.current) return;
    var codeEl = ref.current.querySelector('pre code');
    if (codeEl) {
      var text = codeEl.textContent.trim();
      if (text) setHref(buildUrl(text));
    }
    var header = ref.current.querySelector('[data-component-part="code-block-header"]');
    if (header && !header.querySelector('.prompt-block-devin-link')) {
      var link = document.createElement('a');
      link.href = href;
      link.target = '_blank';
      link.rel = 'noopener noreferrer';
      link.className = 'prompt-block-devin-link';
      link.style.cssText = 'display:inline-flex;align-items:center;gap:6px;text-decoration:none;color:#fff;font-size:11px;font-weight:500;padding:4px 10px;border-radius:6px;white-space:nowrap;background:#317CFF;transition:background 0.2s;margin-left:8px;';
      link.innerHTML = '<svg xmlns="http://www.w3.org/2000/svg" width="12" height="12" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round"><path d="M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6"/><polyline points="15 3 21 3 21 9"/><line x1="10" y1="14" x2="21" y2="3"/></svg> ' + label;
      link.onmouseenter = function () {
        link.style.background = '#2968D9';
      };
      link.onmouseleave = function () {
        link.style.background = '#317CFF';
      };
      header.appendChild(link);
    }
    var existingLink = ref.current.querySelector('.prompt-block-devin-link');
    if (existingLink && href !== '#') existingLink.href = href;
  });
  return <div className="prompt-block" ref={ref}>{children}</div>;
};

<UseCaseHero title="Migra 50 file da REST a GraphQL" description="Definisci l'ambito di una migrazione di 50 file da REST a GraphQL, suddividila in pacchetti di lavoro indipendenti e senza conflitti ed eseguili tutti in una volta con Devin gestiti." prompt="Analizza la nostra base di codice per individuare tutti i file che utilizzano il client REST legacy. Raggruppali in pacchetti di lavoro indipendenti che non vadano in conflitto tra loro, quindi avvia una sessione Devin parallela per ciascun pacchetto per migrare al nuovo client GraphQL." category="Migrations" features="Advanced, Playbooks" agent="advanced" intent="batch" />

<div className="uc-detail-wrapper">
  <Tip>Non vuoi configurarlo manualmente? Incolla un collegamento a questa pagina in una sessione di Devin e chiedigli di configurare tutto per te.</Tip>

  <Steps>
    <Step title="Definisci l’ambito della migrazione con Ask Devin">
      Hai 50 file che importano da `src/lib/restClient.ts` e devi migrare al nuovo `graphqlClient`. Prima di suddividere il lavoro in attività parallele, devi capire come sono collegati questi file. Usa [Ask Devin](/it/work-with-devin/ask-devin) per mappare il perimetro della migrazione — quali file importano il client legacy, come si raggruppano per dominio e dove si trovano gli accoppiamenti rischiosi. Devin utilizza [DeepWiki](/it/work-with-devin/deepwiki) e la ricerca semantica in background, quindi può rispondere a queste domande basandosi sul tuo codice reale.

      <Tip>Ask Devin richiede che il tuo repository sia [indicizzato](/it/onboard-devin/index-repo). Vai su [**Settings > Repositories**](https://app.devin.ai/settings/repositories?utm_source=docs\&utm_medium=use-case-gallery) per controllare lo stato di indicizzazione o indicizzare un nuovo repository.</Tip>

      Apri [Ask Devin](https://app.devin.ai/search?utm_source=docs\&utm_medium=use-case-gallery) e chiedi:

      <PromptBlock agent="ada">
        ```txt Definisci l'ambito della migrazione da REST a GraphQL theme={null}
        Quanti file importano da src/lib/restClient.ts? Raggruppali per
        dominio (user management, billing, analytics, notifications, auth,
        admin, search, onboarding, ecc.) ed evidenzia tutti i file che
        condividono stato o hanno un forte accoppiamento tra domini.
        Indica quali file hanno copertura di test esistente.
        ```
      </PromptBlock>

      Ask Devin restituisce un'analisi dettagliata come questa:

      ```
      50 files import restClient across 8 domains:

        User Management  (7 files) — isolated, full test coverage
        Billing          (9 files) — isolated, 6/9 tested
        Analytics        (5 files) — isolated, 3/5 tested
        Auth             (6 files) — shared middleware, full test coverage
        Notifications    (8 files) — isolated, 5/8 tested
        Admin            (5 files) — depends on Auth middleware
        Search           (4 files) — isolated, 2/4 tested
        Onboarding       (6 files) — isolated, 4/6 tested

      Coupling note: Admin imports requireAuth from Auth. Migrate
      Auth first, then Admin. All other domains are independent.
      ```

      Questo ti dice se la parallelizzazione ha senso. Se la maggior parte dei file è fortemente accoppiata tra domini, una migrazione sequenziale è più sicura. Qui, 6 domini su 8 sono completamente indipendenti — puoi runnarli in parallelo.
    </Step>

    <Step title="Crea un playbook per la migrazione">
      Ogni sessione parallela dovrebbe seguire lo stesso pattern di migrazione in modo che le PR risultanti siano coerenti e facili da revisionare. Crea un [playbook](/it/product-guides/creating-playbooks) che definisca esattamente come deve essere migrato ciascun file.

      Vai su [**Settings > Playbooks > Create Playbook**](https://app.devin.ai/settings/playbooks/create?utm_source=docs\&utm_medium=use-case-gallery) e definisci i passaggi:

      <PromptBlock type="playbook">
        ```txt Migrazione da REST a GraphQL theme={null}
        Per ogni file assegnato a te:

        1. Sostituisci `import { restClient } from 'src/lib/restClient'`
           con `import { graphqlClient } from 'src/lib/graphqlClient'`
        2. Riscrivi ogni chiamata API in modo che usi la corrispondente
           query o mutation GraphQL definita in src/graphql/operations/
        3. Aggiorna la gestione degli errori dai codici di stato HTTP
           ai tipi di errore GraphQL (vedi src/lib/graphqlClient.ts per la mappa degli errori)
        4. Aggiorna il file di test corrispondente:
           - Sostituisci i mock degli endpoint REST con mock GraphQL usando msw
           - Verifica il nome dell'operazione GraphQL, non l'URL
        5. Esegui `npm run typecheck && npm test -- --related` per verificare
        6. Apri una PR con titolo: "migrate: [domain] REST → GraphQL"
        ```
      </PromptBlock>

      Oppure chiedi a Devin di generare il playbook per te — descrivi il tuo pattern di migrazione e produrrà un playbook completo:

      <PromptBlock agent="advanced">
        ```txt Genera un playbook di migrazione da REST a GraphQL theme={null}
        Crea un playbook per migrare i file dal nostro client REST
        (src/lib/restClient.ts) al nostro nuovo client GraphQL
        (src/lib/graphqlClient.ts). Consulta src/graphql/operations/ per
        le query e le mutation disponibili. Includi passaggi per aggiornare
        gli import, riscrivere le chiamate API, convertire la gestione
        degli errori dai codici di stato HTTP ai tipi di errore GraphQL,
        aggiornare i test per usare i mock GraphQL di msw ed eseguire
        typecheck + test.
        ```
      </PromptBlock>

      Fare riferimento a questo playbook nel tuo prompt di orchestrazione garantisce che tutte le sessioni parallele producano PR che sembrino provenire dallo stesso sviluppatore.
    </Step>

    <Step title="Avvia sessioni parallele con Devin">
      Apri una nuova sessione di Devin dalla [home page di Devin](https://app.devin.ai/?utm_source=docs\&utm_medium=use-case-gallery) e inserisci il prompt di orchestrazione. Devin analizza il grafo delle dipendenze della tua base di codice, crea pacchetti di lavoro indipendenti e avvia una sessione per ciascun pacchetto — tutte in esecuzione contemporaneamente.

      <PromptBlock agent="advanced" intent="batch">
        ```txt Parallelizza la migrazione da REST a GraphQL su 50 file theme={null}
        Analizza la nostra codebase e trova tutti i file che importano da
        src/lib/restClient.ts. Mappa il grafo delle dipendenze tra questi
        file per identificare gruppi che possono essere migrati in modo indipendente —
        nessuna coppia di gruppi dovrebbe modificare lo stesso file o condividere stato mutabile.

        Per ciascun gruppo indipendente, avvia una sessione di Devin in parallelo usando
        il playbook "REST to GraphQL Migration". Ogni sessione deve:
        - Migrare solo i file assegnati
        - Eseguire il typecheck e i test per il proprio ambito
        - Aprire una PR separata

        Prima di avviare le sessioni, mostrami il raggruppamento proposto così che io possa
        approvarlo. Includi il numero di file e la complessità stimata per ciascun gruppo.
        ```
      </PromptBlock>

      Devin presenta una proposta di raggruppamento per la tua approvazione prima di avviare qualunque cosa:

      ```
      Pacchetti di lavoro proposti (8 gruppi, 50 file in totale):

      Gruppo 1 — Gestione utenti (7 file, complessità: M)
        src/services/UserService.ts, src/pages/Profile.tsx,
        src/pages/Settings.tsx, src/hooks/useCurrentUser.ts,
        src/pages/UserDirectory.tsx, src/services/AvatarService.ts,
        src/components/UserCard.tsx

      Gruppo 2 — Fatturazione (9 file, complessità: L)
        src/services/BillingService.ts, src/services/InvoiceService.ts,
        src/services/SubscriptionService.ts, src/pages/Checkout.tsx,
        src/pages/PlanSelector.tsx, src/pages/InvoiceHistory.tsx,
        src/components/PaymentForm.tsx, src/hooks/useSubscription.ts,
        src/components/PricingTable.tsx

      Gruppo 3 — Analytics (5 file, complessità: S)
        src/services/AnalyticsService.ts, src/pages/Dashboard.tsx,
        src/components/MetricsCard.tsx, src/hooks/useMetrics.ts,
        src/components/ChartPanel.tsx

      Gruppo 4 — Auth (6 file, complessità: L) ⚠ da migrare per primo
        src/services/AuthService.ts, src/middleware/requireAuth.ts,
        src/middleware/refreshToken.ts, src/pages/Login.tsx,
        src/pages/Signup.tsx, src/services/SessionService.ts

      Gruppo 5 — Notifiche (8 file, complessità: M)
        src/services/NotificationService.ts, src/services/EmailService.ts,
        src/services/PushService.ts, src/pages/NotificationPreferences.tsx,
        src/components/NotificationBell.tsx, src/hooks/useNotifications.ts,
        src/components/NotificationToast.tsx, src/services/WebhookService.ts

      Gruppo 6 — Admin (5 file, complessità: M) ⚠ dipende da Auth
        src/pages/AdminDashboard.tsx, src/pages/AdminUsers.tsx,
        src/services/AdminService.ts, src/components/AdminSidebar.tsx,
        src/middleware/requireAdmin.ts

      Gruppo 7 — Ricerca (4 file, complessità: S)
        src/services/SearchService.ts, src/pages/SearchResults.tsx,
        src/components/SearchBar.tsx, src/hooks/useSearch.ts

      Gruppo 8 — Onboarding (6 file, complessità: M)
        src/services/OnboardingService.ts, src/pages/Welcome.tsx,
        src/pages/SetupWizard.tsx, src/components/ProgressTracker.tsx,
        src/hooks/useOnboardingState.ts, src/services/ChecklistService.ts

      Nota sulle dipendenze: il Gruppo 6 (Admin) importa middleware dal Gruppo 4
      (Auth). Auth verrà avviato per primo, poi Admin dopo che la PR di Auth viene integrata.
      Avvio immediato dei restanti 6 gruppi in parallelo.

      Avviare 6 sessioni parallele ora + 2 sequenziali? (y/n)
      ```

      Approva il raggruppamento e avvia subito le sei sessioni. Auth parte per primo, poi Admin segue dopo il merge di Auth.
    </Step>

    <Step title="Rivedi e unisci i risultati">
      Ogni sessione apre la propria PR. Poiché i pacchetti sono indipendenti, puoi esaminarle ed eseguire il merge in qualsiasi ordine — ma esegui prima il merge di Auth, perché Admin ne dipende, ed esegui la CI completa dopo ogni merge per intercettare eventuali interazioni impreviste.

      Una volta che tutte e 8 le PR di migrazione sono state unite, usa una sessione di follow-up per ripulire il codice inutilizzato:

      <PromptBlock>
        ```txt Pulizia post-migrazione theme={null}
        Tutte le PR di migrazione da REST a GraphQL sono state unite. Analizza la codebase alla ricerca di:
        1. Eventuali import residui di src/lib/restClient.ts
        2. Codice morto nelle utility condivise utilizzate solo dal client REST
        3. Tipi o interfacce specifici di REST che possono essere rimossi

        Ripulisci questi elementi ed elimina completamente src/lib/restClient.ts
        se non viene più importato da nessuna parte.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
