106 lines
3.0 KiB
TypeScript
106 lines
3.0 KiB
TypeScript
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<string, unknown>) => ({
|
|
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
|
|
}
|
|
}
|
|
}
|
|
});
|