import { json } from '@sveltejs/kit'; import type { RequestHandler } from './$types'; const id = { name: 'id', in: 'path', required: true, schema: { type: 'string' } }; const usageId = { name: 'usageId', in: 'path', required: true, schema: { type: 'string' } }; const idempotency = { name: 'Idempotency-Key', in: 'header', required: true, schema: { type: 'string' } }; const ok = { '200': { description: 'Erfolgreich' } }; const jsonBody = (schema: Record) => ({ required: true, content: { 'application/json': { schema } } }); export const GET: RequestHandler = () => json({ openapi: '3.1.0', info: { title: 'Sendewerk API', version: '1.0.0', description: 'Versionierte API für technische Redaktionszugänge. Schreibzugriffe benötigen einen Idempotency-Key.' }, servers: [{ url: '/api/v1' }], security: [{ bearerAuth: [] }], components: { securitySchemes: { bearerAuth: { type: 'http', scheme: 'bearer', bearerFormat: 'Sendewerk technical token' } }, schemas: { PieceWrite: { type: 'object', properties: { title: { type: 'string' }, summary: { type: 'string' }, status: { enum: ['inbox', 'preparing', 'ready'] }, durationSeconds: { type: 'integer', minimum: 0 } } }, ShowWrite: { type: 'object', required: ['title'], properties: { title: { type: 'string' }, startsAtUtc: { type: ['string', 'null'], format: 'date-time' }, templateId: { type: ['string', 'null'] } } } } }, paths: { '/pieces': { get: { summary: 'Pieces lesen', responses: ok }, post: { summary: 'Piece anlegen', parameters: [idempotency], requestBody: jsonBody({ $ref: '#/components/schemas/PieceWrite' }), responses: { '201': { description: 'Angelegt' } } } }, '/pieces/{id}': { get: { summary: 'Piece lesen', parameters: [id], responses: ok }, patch: { summary: 'Piece ändern', parameters: [id], requestBody: jsonBody({ allOf: [ { $ref: '#/components/schemas/PieceWrite' }, { type: 'object', required: ['revision'] } ] }), responses: ok } }, '/shows': { get: { summary: 'Streams lesen', responses: ok }, post: { summary: 'Stream anlegen', parameters: [idempotency], requestBody: jsonBody({ $ref: '#/components/schemas/ShowWrite' }), responses: { '201': { description: 'Angelegt' } } } }, '/shows/{id}': { get: { summary: 'Stream lesen', parameters: [id], responses: ok } }, '/shows/{id}/usages': { post: { summary: 'Piece einplanen', parameters: [id, idempotency], requestBody: jsonBody({ type: 'object', required: ['revision', 'pieceId'] }), responses: { '201': { description: 'Eingeplant' } } } }, '/shows/{id}/usages/{usageId}': { patch: { summary: 'Einplanung sortieren', parameters: [id, usageId, idempotency], requestBody: jsonBody({ type: 'object', required: ['revision', 'position'] }), responses: ok } } } });