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

# Bookings API aus OpenAPI-Spezifikation implementieren

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="Bookings API aus OpenAPI-Spezifikation implementieren"
  description="Übergebe Devin eine YAML-Spezifikation und erhalte vollständig implementierte Express-Route-Handler, Prisma-Modelle, Zod-Validierung und Supertest-Integrationstests — passend zu den bestehenden Mustern deiner Codebasis."
  prompt="Implementiere die folgenden Bookings-API-Endpunkte mit unserem bestehenden Express + Prisma-Stack. Folge den Mustern in src/api/v2/users/ für Routenstruktur, Fehlerbehandlung und Middleware. Leite Zod-Schemas aus den untenstehenden Spec-Schemas ab.

Endpoints:
- GET /api/v2/bookings (Liste mit Paginierung: Query-Parameter page, startDate, endDate)
- POST /api/v2/bookings (erstellen — 201 bei Erfolg, 409 bei Zeitfensterkonflikt)
- GET /api/v2/bookings/:id
- PATCH /api/v2/bookings/:id (partielles Update)
- DELETE /api/v2/bookings/:id (Soft-Delete)
- POST /api/v2/bookings/:id/confirm (200 bei Erfolg, 422 wenn bereits storniert)
- POST /api/v2/bookings/:id/cancel

CreateBookingInput-Schema (erforderlich: title, startTime, endTime, roomId):
- title: string, maxLength 200
- startTime: string, date-time
- endTime: string, date-time
- roomId: string, uuid
- notes: string, maxLength 1000, optional

Schreibe Integrationstests mit Supertest für jeden Endpunkt — decke Erfolgsszenarien, Validierungsfehler, Authentifizierungsfehler und Randfälle wie überlappende Zeitfenster ab. Führe alle Tests aus und überprüfe, dass jeder Endpunkt funktioniert. Wenn etwas fehlschlägt, führe Debugging durch und behebe die Fehler — iteriere weiter, bis alle Tests bestehen. Öffne keinen PR, bevor nicht alles End-to-End funktioniert."
  category="Feature-Entwicklung"
  features=""
/>

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

  <Steps>
    <Step title="(Optional) Analysieren Sie Ihre bestehenden API-Patterns">
      Wenn du dir nicht sicher bist, wie deine Express-API aufgebaut ist oder welche Patterns du als Referenz heranziehen kannst, nutze [Ask Devin](https://app.devin.ai/search?utm_source=docs\&utm_medium=use-case-gallery), um das zunächst zu analysieren:

      <PromptBlock agent="ada">
        ```txt Research our Express API patterns theme={null}
        Show me how our Express API is structured:
        1. What's the folder layout under src/api/v2/?
        2. How do route handlers, controllers, and services interact?
        3. Which middleware do we use for auth and validation?
        4. How are error responses formatted?
        5. What does our test setup look like (Supertest, test DB config)?
        ```
      </PromptBlock>

      Du kannst auch [DeepWiki](https://deepwiki.com) nutzen, um Open-Source-APIs mit ähnlichen Patterns zu erkunden – suche dort zum Beispiel nach Express- + Prisma- + Zod-Beispielen, um zu sehen, wie andere Projekte ihre Route-Handler und Validierung strukturieren.

      Du kannst eine Devin-Session direkt aus Ask Devin starten, und Devin übernimmt dabei den gesamten zuvor gewonnenen Kontext.
    </Step>

    <Step title="Verknüpfen Sie Devin mit Ihrer OpenAPI-Spezifikation">
      Beginnen Sie damit, Devin mitzuteilen, wo die Spezifikation liegt und welche Ressource implementiert werden soll. Devin liest jeden Pfad, jedes Schema und jede Fehlerdefinition in der YAML-Spezifikation und gleicht sie dann automatisch mit Ihren bestehenden Express-Routen ab, um Ihre bestehenden Konventionen einzuhalten.

      Hier ist ein Auszug aus der Art von Spezifikation, mit der Devin arbeitet — eine Standard-OpenAPI-3.0-Definition für eine Buchungsressource:

      ```yaml theme={null}
      # openapi/bookings-v2.yaml (excerpt)
      openapi: "3.0.3"
      info:
        title: Bookings API
        version: "2.0.0"
      paths:
        /api/v2/bookings:
          get:
            summary: List bookings
            parameters:
              - name: page
                in: query
                schema: { type: integer, default: 1 }
              - name: startDate
                in: query
                schema: { type: string, format: date }
              - name: endDate
                in: query
                schema: { type: string, format: date }
            responses:
              "200":
                description: Paginated list of bookings
                content:
                  application/json:
                    schema:
                      $ref: "#/components/schemas/BookingListResponse"
          post:
            summary: Create a booking
            requestBody:
              required: true
              content:
                application/json:
                  schema:
                    $ref: "#/components/schemas/CreateBookingInput"
            responses:
              "201":
                description: Booking created
              "409":
                description: Time slot conflict
        /api/v2/bookings/{id}/confirm:
          post:
            summary: Confirm a booking
            responses:
              "200":
                description: Booking confirmed
              "422":
                description: Booking already cancelled
      components:
        schemas:
          CreateBookingInput:
            type: object
            required: [title, startTime, endTime, roomId]
            properties:
              title:
                type: string
                maxLength: 200
              startTime:
                type: string
                format: date-time
              endTime:
                type: string
                format: date-time
              roomId:
                type: string
                format: uuid
      ```

      <PromptBlock>
        ```txt Implementiere die Buchungs-API anhand der OpenAPI-Spezifikation theme={null}
        Implementiere die in openapi/bookings-v2.yaml definierten Endpunkte für
        /api/v2/bookings. Die Spezifikation definiert:

        - GET /api/v2/bookings (Liste mit Paginierung + Datumsbereichsfilter)
        - POST /api/v2/bookings (Erstellen)
        - GET /api/v2/bookings/:id
        - PATCH /api/v2/bookings/:id (Teilaktualisierung)
        - DELETE /api/v2/bookings/:id (Soft Delete)
        - POST /api/v2/bookings/:id/confirm
        - POST /api/v2/bookings/:id/cancel

        Verwende unseren bestehenden Express- + Prisma-Stack. Folge den Mustern in
        src/api/v2/users/ für Routenstruktur, Fehlerbehandlung und Middleware.
        Leite Zod-Schemas aus den OpenAPI-Request-/Response-Definitionen ab.

        ## Testing & verification
        - Write integration tests with Supertest for every endpoint
        - Cover success cases, validation errors, auth failures, and
          business logic edge cases (e.g., overlapping time slots)
        - Run all tests and verify every endpoint works correctly
        - If anything fails — test failures, runtime errors, missing
          middleware — debug and fix it. Keep iterating until all tests pass.
        - Do not open a PR until everything works end-to-end
        ```
      </PromptBlock>

      If your spec isn't checked into the repo yet, paste it directly into the session or attach the YAML/JSON file when starting.
    </Step>

    <Step title="Devin orientiert sich an Ihren Express-Patterns">
      The single most impactful thing you can do is reference a well-implemented resource in your codebase. Devin studies that code and replicates the folder structure, naming conventions, middleware chain, and error handling — so the new endpoints look like they were written by the same developer.

      For example, Devin reads `src/api/v2/users/router.ts` and produces a matching bookings router:

      ```typescript theme={null}
      // src/api/v2/bookings/router.ts  (generated by Devin)
      import { Router } from "express";
      import { authenticate } from "@/middleware/auth";
      import { validate } from "@/middleware/validate";
      import { BookingsController } from "./controller";
      import {
        createBookingSchema,
        updateBookingSchema,
        listBookingsQuerySchema,
      } from "./schemas";

      const router = Router();
      const ctrl = new BookingsController();

      router.use(authenticate);

      router.get("/", validate({ query: listBookingsQuerySchema }), ctrl.list);
      router.post("/", validate({ body: createBookingSchema }), ctrl.create);
      router.get("/:id", ctrl.getById);
      router.patch("/:id", validate({ body: updateBookingSchema }), ctrl.update);
      router.delete("/:id", ctrl.softDelete);
      router.post("/:id/confirm", ctrl.confirm);
      router.post("/:id/cancel", ctrl.cancel);

      export default router;
      ```

      Devin also derives Zod schemas directly from the OpenAPI component definitions, so request validation stays in sync with the spec:

      ```typescript theme={null}
      // src/api/v2/bookings/schemas.ts  (generated by Devin)
      import { z } from "zod";

      export const createBookingSchema = z.object({
        title: z.string().max(200),
        startTime: z.string().datetime(),
        endTime: z.string().datetime(),
        roomId: z.string().uuid(),
        notes: z.string().max(1000).optional(),
      });

      export const updateBookingSchema = createBookingSchema.partial();

      export const listBookingsQuerySchema = z.object({
        page: z.coerce.number().int().positive().default(1),
        limit: z.coerce.number().int().min(1).max(100).default(20),
        startDate: z.string().date().optional(),
        endDate: z.string().date().optional(),
      });
      ```

      Stellen Sie sicher, dass Ihre [Umgebungskonfiguration](/de/onboard-devin/environment) die Konfiguration der Testdatenbank und alle erforderlichen Umgebungsvariablen enthält, damit Devin die vollständige Test-Suite lokal ausführen kann. If your API needs credentials (database URL, JWT secret, etc.), add them as [Secrets](/de/product-guides/secrets) before starting the session — or provide them during the session via chat.
    </Step>

    <Step title="Devin erstellt einen getesteten Pull Request (PR)">
      Devin reads the spec, studies your existing code, and implements each endpoint to match both the OpenAPI contract and your Express codebase conventions. Here's what a typical PR looks like:

      ```
      feat: Implement /api/v2/bookings endpoints from OpenAPI spec

      src/api/v2/bookings/
        router.ts              (Express route definitions + middleware)
        controller.ts          (request handling)
        service.ts             (business logic)
        repository.ts          (Prisma queries)
        schemas.ts             (Zod validation from spec)
      prisma/migrations/
        20260219_add_bookings/  (migration)
      src/__tests__/
        bookings.integration.ts (Supertest tests)
      ```

      Devin führt die Supertest-Suite aus, bevor Devin den Pull Request (PR) öffnet:

      ```
        /api/v2/bookings
          GET /
            passes returns paginated bookings (42ms)
            passes filters by date range (38ms)
            passes returns 401 without auth (8ms)
          POST /
            passes creates booking with valid data (61ms)
            passes returns 400 for missing required fields (12ms)
            passes returns 409 for overlapping time slot (29ms)
          PATCH /:id
            passes updates booking fields (22ms)
            passes returns 404 for non-existent booking (9ms)
          POST /:id/confirm
            passes transitions status to confirmed (18ms)
            passes returns 422 for already-cancelled booking (11ms)

        16 passing (412ms)
      ```
    </Step>

    <Step title="Arbeiten Sie alles aus, was die Spezifikation nicht abdeckt">
      Die OpenAPI-Spezifikation definiert den Vertrag, erfasst jedoch selten Geschäftsregeln, Berechtigungslogik oder Leistungsanforderungen. Verwenden Sie nachfolgende Prompts, um diese Lücken zu schließen:

      <PromptBlock>
        ```txt Fügen Sie Autorisierungsregeln hinzu theme={null}
        Nur der Ersteller der Buchung oder ein Admin sollte eine Buchung PATCH oder DELETE
        dürfen. Die Endpunkte confirm und cancel sollten außerdem die
        Rolle organizer erfordern. Verwenden Sie unsere bestehende Middleware zur Rollenprüfung aus
        src/middleware/authorize.ts.
        ```
      </PromptBlock>

      <PromptBlock>
        ```txt Fügen Sie Rate Limiting und Caching hinzu theme={null}
        Fügen Sie Rate Limiting für POST /api/v2/bookings hinzu (20 pro Benutzer und Minute).
        Cachen Sie GET /api/v2/bookings-Antworten in Redis mit einer TTL von 30 Sekunden,
        deren Cache bei jeder Schreiboperation ungültig gemacht wird.
        ```
      </PromptBlock>
    </Step>

    <Step title="Prüfen Sie den PR mit Devin Review">
      Sobald Devin den PR erstellt, kannst du [Devin Review](https://app.devin.ai/review?utm_source=docs\&utm_medium=use-case-gallery) verwenden, um die Implementierung zu überprüfen. Devin Review kann Probleme wie fehlende Fehlerbehandlung, inkonsistente Antwortformate oder Endpunkte erkennen, die nicht der Spezifikation entsprechen.

      Wenn Devin Review Probleme markiert, kannst du **Autofix** verwenden, damit Devin die markierten Probleme automatisch behebt — es öffnet eine Folgesitzung, wendet die Korrekturen an und pusht einen aktualisierten Commit, ohne dass du jede Änderung manuell beschreiben musst.
    </Step>
  </Steps>
</div>
