> ## 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.

# 50 Dateien von REST auf GraphQL migrieren

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="50 Dateien von REST auf GraphQL migrieren" description="Planen Sie eine REST-zu-GraphQL-Migration für 50 Dateien, teilen Sie diese in konfliktfreie Arbeitspakete auf und führen Sie sie alle gleichzeitig mit verwalteten Devins aus." prompt="Analysieren Sie unsere Codebasis auf alle Dateien, die den Legacy-REST-Client verwenden. Fassen Sie diese zu unabhängigen Arbeitspaketen zusammen, die nicht miteinander in Konflikt geraten, und starten Sie dann für jedes Paket eine parallele Devin-Sitzung, um auf den neuen GraphQL-Client zu migrieren." category="Migrations" features="Advanced, Playbooks" agent="advanced" intent="batch" />

<div className="uc-detail-wrapper">
  <Tip>Möchtest du das nicht manuell einrichten? Füge einen Link zu dieser Seite in eine Devin-Sitzung ein und bitte Devin, alles für dich einzurichten.</Tip>

  <Steps>
    <Step title="Legen Sie den Umfang der Migration mit Ask Devin fest">
      Du hast 50 Dateien, die aus `src/lib/restClient.ts` importieren und auf den neuen `graphqlClient` umgestellt werden müssen. Bevor du irgendetwas in parallele Arbeitspakete aufteilst, musst du verstehen, wie diese Dateien miteinander verbunden sind. Verwende [Ask Devin](/de/work-with-devin/ask-devin), um den Migrationsumfang zu kartieren — welche Dateien den Legacy-Client importieren, wie sie sich nach Domänen gruppieren und wo riskante Kopplungen liegen. Devin verwendet unter der Haube [DeepWiki](/de/work-with-devin/deepwiki) und semantische Suche, sodass es diese Fragen fundiert auf Grundlage deines tatsächlichen Codes beantworten kann.

      <Tip>Ask Devin setzt voraus, dass dein Repository [indiziert](/de/onboard-devin/index-repo) ist. Gehe zu [**Settings > Repositories**](https://app.devin.ai/settings/repositories?utm_source=docs\&utm_medium=use-case-gallery), um den Indizierungsstatus zu prüfen oder ein neues Repo zu indizieren.</Tip>

      Öffne [Ask Devin](https://app.devin.ai/search?utm_source=docs\&utm_medium=use-case-gallery) und frage:

      <PromptBlock agent="ada">
        ```txt Umfang der REST-zu-GraphQL-Migration bestimmen theme={null}
        Wie viele Dateien importieren aus src/lib/restClient.ts? Gruppiere sie
        nach Domäne (Benutzerverwaltung, Abrechnung, Analytics, Benachrichtigungen,
        Auth, Admin, Suche, Onboarding usw.) und markiere alle Dateien, die
        gemeinsamen Zustand verwenden oder eine enge Kopplung über Domänengrenzen hinweg haben.
        Notiere, welche Dateien bereits Testabdeckung haben.
        ```
      </PromptBlock>

      Ask Devin liefert eine Aufschlüsselung in etwa wie diese:

      ```
      50 Dateien importieren restClient in 8 Domänen:

        User Management  (7 Dateien) — isoliert, vollständige Testabdeckung
        Billing          (9 Dateien) — isoliert, 6/9 getestet
        Analytics        (5 Dateien) — isoliert, 3/5 getestet
        Auth             (6 Dateien) — gemeinsame Middleware, vollständige Testabdeckung
        Notifications    (8 Dateien) — isoliert, 5/8 getestet
        Admin            (5 Dateien) — abhängig von Auth-Middleware
        Search           (4 Dateien) — isoliert, 2/4 getestet
        Onboarding       (6 Dateien) — isoliert, 4/6 getestet

      Kopplungshinweis: Admin importiert requireAuth aus Auth. Zuerst
      Auth migrieren, dann Admin. Alle anderen Domänen sind unabhängig.
      ```

      Dies zeigt Ihnen, ob Parallelisierung sinnvoll ist. Wenn die meisten Dateien stark über Domains hinweg gekoppelt sind, ist eine sequentielle Migration sicherer. Hier sind 6 von 8 Domains vollständig unabhängig – Sie können sie parallel migrieren.
    </Step>

    <Step title="Erstellen Sie ein Migrations-Playbook">
      Jede parallele Sitzung sollte demselben Migrationsmuster folgen, damit die resultierenden PRs konsistent und leicht zu überprüfen sind. Erstelle ein [Playbook](/de/product-guides/creating-playbooks), das genau definiert, wie jede Datei migriert werden soll.

      Gehe zu [**Settings > Playbooks > Create Playbook**](https://app.devin.ai/settings/playbooks/create?utm_source=docs\&utm_medium=use-case-gallery) und definiere die Schritte:

      <PromptBlock type="playbook">
        ```txt REST to GraphQL Migration theme={null}
        For each file assigned to you:

        1. Replace `import { restClient } from 'src/lib/restClient'`
           with `import { graphqlClient } from 'src/lib/graphqlClient'`
        2. Rewrite each API call to use the corresponding GraphQL
           query or mutation defined in src/graphql/operations/
        3. Update error handling from HTTP status codes to GraphQL
           error types (see src/lib/graphqlClient.ts for the error map)
        4. Update the corresponding test file:
           - Replace REST endpoint mocks with GraphQL mocks using msw
           - Assert on the GraphQL operation name, not the URL
        5. Run `npm run typecheck && npm test -- --related` to verify
        6. Open a PR titled: "migrate: [domain] REST → GraphQL"
        ```
      </PromptBlock>

      Oder bitte Devin, das Playbook für dich zu erstellen — beschreibe dein Migrationsmuster, und es erzeugt ein vollständiges Playbook:

      <PromptBlock agent="advanced">
        ```txt Generate a REST-to-GraphQL migration playbook theme={null}
        Create a playbook for migrating files from our REST client
        (src/lib/restClient.ts) to our new GraphQL client
        (src/lib/graphqlClient.ts). Look at src/graphql/operations/ for
        the available queries and mutations. Include steps for updating
        imports, rewriting API calls, converting error handling from HTTP
        status codes to GraphQL error types, updating tests to use msw
        GraphQL mocks, and running typecheck + tests.
        ```
      </PromptBlock>

      Wenn du in deinem Orchestrierungs-Prompt auf dieses Playbook verweist, stellst du sicher, dass alle parallelen Sitzungen PRs erzeugen, die so aussehen, als wären sie vom selben Entwickler erstellt worden.
    </Step>

    <Step title="Parallele Sitzungen mit Devin starten">
      Öffne auf der [Devin-Startseite](https://app.devin.ai/?utm_source=docs\&utm_medium=use-case-gallery) eine neue Devin-Sitzung und gib ihr den Orchestrierungs-Prompt. Devin analysiert den Abhängigkeitsgraphen deiner Codebasis, erstellt unabhängige Arbeitspakete und startet eine Sitzung pro Paket – alle laufen gleichzeitig.

      <PromptBlock agent="advanced" intent="batch">
        ```txt REST-zu-GraphQL-Migration über 50 Dateien parallelisieren theme={null}
        Analysiere unsere Codebasis und finde jede Datei, die aus
        src/lib/restClient.ts importiert. Ermittle den Abhängigkeitsgraphen
        zwischen diesen Dateien, um Gruppen zu identifizieren, die
        unabhängig migriert werden können – keine zwei Gruppen sollten
        dieselbe Datei ändern oder gemeinsamen veränderlichen Zustand teilen.

        Starte für jede unabhängige Gruppe eine parallele Devin-Session mit
        dem "REST to GraphQL Migration"-Playbook. Jede Session soll:
        - Nur ihre zugewiesenen Dateien migrieren
        - Typecheck und Tests für ihren Scope ausführen
        - Einen separaten Pull Request (PR) öffnen

        Bevor du Sessions startest, zeig mir die vorgeschlagene Gruppierung,
        damit ich sie genehmigen kann. Füge die Anzahl der Dateien und die
        geschätzte Komplexität pro Gruppe hinzu.
        ```
      </PromptBlock>

      Devin zeigt dir eine Gruppierung zur Genehmigung an, bevor etwas gestartet wird:

      ```
      Proposed work packages (8 groups, 50 files total):

      Group 1 — User Management (7 files, complexity: 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

      Group 2 — Billing (9 files, complexity: 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

      Group 3 — Analytics (5 files, complexity: S)
        src/services/AnalyticsService.ts, src/pages/Dashboard.tsx,
        src/components/MetricsCard.tsx, src/hooks/useMetrics.ts,
        src/components/ChartPanel.tsx

      Group 4 — Auth (6 files, complexity: L) ⚠ migrate first
        src/services/AuthService.ts, src/middleware/requireAuth.ts,
        src/middleware/refreshToken.ts, src/pages/Login.tsx,
        src/pages/Signup.tsx, src/services/SessionService.ts

      Group 5 — Notifications (8 files, complexity: 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

      Group 6 — Admin (5 files, complexity: M) ⚠ depends on Auth
        src/pages/AdminDashboard.tsx, src/pages/AdminUsers.tsx,
        src/services/AdminService.ts, src/components/AdminSidebar.tsx,
        src/middleware/requireAdmin.ts

      Group 7 — Search (4 files, complexity: S)
        src/services/SearchService.ts, src/pages/SearchResults.tsx,
        src/components/SearchBar.tsx, src/hooks/useSearch.ts

      Group 8 — Onboarding (6 files, complexity: 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

      Dependency note: Group 6 (Admin) imports middleware from Group 4
      (Auth). Will launch Auth first, then Admin after Auth's PR merges.
      Launch remaining 6 groups in parallel immediately.

      Start 6 parallel sessions now + 2 sequential? (y/n)
      ```

      Genehmige die Gruppierung und starte alle sechs Sessions auf einmal. Auth läuft zuerst, anschließend folgt Admin, sobald Auth gemergt ist.
    </Step>

    <Step title="Ergebnisse überprüfen und zusammenführen">
      Jede Session erstellt ihren eigenen Pull Request (PR). Da die Pakete unabhängig sind, kannst du sie in beliebiger Reihenfolge prüfen und mergen — merge aber zuerst Auth, da Admin davon abhängt, und führe nach jedem Merge einen vollständigen CI-Lauf aus, um unerwartete Interaktionen zu erkennen.

      Sobald alle 8 Migrations-PRs gemergt sind, nutze eine anschließende Session, um toten Code aufzuräumen:

      <PromptBlock>
        ```txt Post-migration cleanup theme={null}
        Alle REST-zu-GraphQL-Migrations-PRs sind gemergt. Durchsuche die Codebasis nach:
        1. Verbleibenden Imports von src/lib/restClient.ts
        2. Totem Code in gemeinsamen Utilities, die nur der REST-Client verwendet hat
        3. REST-spezifischen Typen oder Interfaces, die entfernt werden können

        Räume sie auf und lösche src/lib/restClient.ts vollständig, wenn nichts
        mehr davon importiert wird.
        ```
      </PromptBlock>
    </Step>
  </Steps>
</div>
