Source: Router/botLanguage.js

/**
 * Bot Language Router
 *
 * Liefert und pflegt die Labels der Bot-UIs. Die Ablage ist pro **Bot-Repo**
 * (z. B. `basic-bots`) und nicht pro Bot — mehrere Bots rendern dieselben
 * geteilten UI-Komponenten, also ist ein Text einmal zu pflegen. Zwei Ebenen:
 * geteilt (`botLanguages/<repo>/<lang>.json`) und Organisation
 * (`botLanguages/<UIDroot>/<repo>/<lang>.json`). Der Point of Truth liegt im
 * Bot-Repo und kommt über `template.translations`; die geteilte Ebene wird
 * daraus beim Registrieren eines Bots ergänzt.
 *
 * Bewusst **nicht** unter `/languages`: dort greift in `http-server.js` eine
 * Portal-Route vor dem Router-Mount, die pro Organisation nicht unterscheiden
 * kann.
 *
 * @module BotLanguageRouter
 */

// @ts-check
import express from 'express';
import { checkAdmin } from '../utils/authChecks.js';
import { requestUpdateLogger } from '../utils/requestLogger.js';
import * as botLanguageController from './botLanguage/controller.js';

/** @type {express.Router} */
const api = express.Router({ caseSensitive: true });

/**
 * @swagger
 * /api/botLanguages:
 *   get:
 *     summary: Bot-Labels aller Bot-Repos der eigenen Organisation
 *     description: >
 *       Liefert die dünne Überschicht (geteilte und Orga-Ebene, Orga gewinnt)
 *       für alle Bot-Repos, die für die Organisation der Session Übersetzungen
 *       haben. Wird einmal beim Start der Host-App geladen und im Context
 *       gehalten.
 *     tags:
 *       - Bot Languages
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: query
 *         name: lang
 *         schema:
 *           type: string
 *           example: de
 *         description: Sprachcode (ISO). Default `de`.
 *     responses:
 *       200:
 *         description: Repo-Name → Labels
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 lang:
 *                   type: string
 *                 result:
 *                   type: object
 *                   additionalProperties:
 *                     type: object
 *                     additionalProperties:
 *                       type: string
 *       400:
 *         description: Keine Organisation in der Session
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.get('/', botLanguageController.listRepoLanguageSlicesController);

/**
 * @swagger
 * /api/botLanguages/{repo}:
 *   get:
 *     summary: Bot-Labels eines Bot-Repos mit getrennten Ebenen
 *     description: >
 *       Liefert geteilte und Orga-Ebene einzeln sowie zusammengeführt. Grundlage
 *       für den Übersetzungs-Editor.
 *     tags:
 *       - Bot Languages
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: repo
 *         required: true
 *         schema:
 *           type: string
 *         description: Repo-Name (z. B. basic-bots)
 *       - in: query
 *         name: lang
 *         schema:
 *           type: string
 *           example: de
 *     responses:
 *       200:
 *         description: Ebenen und zusammengeführte Labels
 *       400:
 *         description: Ungültiger Repo-Name
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.get('/:repo', botLanguageController.getRepoLanguageController);

/**
 * @swagger
 * /api/botLanguages/{repo}/{UIDroot}/{lang}:
 *   put:
 *     summary: Orga-Ebene eines Bot-Repos schreiben
 *     description: >
 *       Upsert der übergebenen Labels, `remove` löscht Keys (Rücksetzen auf die
 *       geteilte Ebene). Nur fehlende Keys ergänzen ist Aufgabe der
 *       Registrierung, nicht dieses Endpunkts.
 *     tags:
 *       - Bot Languages
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: repo
 *         required: true
 *         schema:
 *           type: string
 *       - in: path
 *         name: UIDroot
 *         required: true
 *         schema:
 *           type: string
 *       - in: path
 *         name: lang
 *         required: true
 *         schema:
 *           type: string
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               labels:
 *                 type: object
 *                 additionalProperties:
 *                   type: string
 *               remove:
 *                 type: array
 *                 items:
 *                   type: string
 *     responses:
 *       200:
 *         description: Geschriebene Labels
 *       400:
 *         description: Ungültige Eingabe
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.put('/:repo/:UIDroot/:lang', requestUpdateLogger, checkAdmin, botLanguageController.putRepoLanguageController);

/**
 * @swagger
 * /api/botLanguages/{repo}/{lang}:
 *   put:
 *     summary: Geteilte Ebene eines Bot-Repos schreiben
 *     description: >
 *       Upsert der übergebenen Labels für alle Organisationen, `remove` löscht
 *       Keys (Rücksetzen auf den Point of Truth des Bot-Repos).
 *     tags:
 *       - Bot Languages
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: repo
 *         required: true
 *         schema:
 *           type: string
 *       - in: path
 *         name: lang
 *         required: true
 *         schema:
 *           type: string
 *     requestBody:
 *       required: true
 *       content:
 *         application/json:
 *           schema:
 *             type: object
 *             properties:
 *               labels:
 *                 type: object
 *                 additionalProperties:
 *                   type: string
 *               remove:
 *                 type: array
 *                 items:
 *                   type: string
 *     responses:
 *       200:
 *         description: Geschriebene Labels
 *       400:
 *         description: Ungültige Eingabe
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.put('/:repo/:lang', requestUpdateLogger, checkAdmin, botLanguageController.putRepoLanguageController);

export default api;