Source: Router/languageFile.js

// @ts-check
/**
 * @import {ExpressRequestAuthorized, ExpressResponse} from '../types.js'
 */

/**
 * Language File Router
 *
 * Manages language JSON file uploads, retrieval, and deletion
 * via the configured S3/MinIO object store.
 *
 * @swagger
 * tags:
 *   - name: Language Files
 *     description: Language JSON file management
 *
 * @swagger
 * components:
 *   schemas:
 *     LanguageFileUploadResponse:
 *       type: object
 *       properties:
 *         success:
 *           type: boolean
 *         message:
 *           type: string
 *         name:
 *           type: string
 *           description: Original file name
 *         url:
 *           type: string
 *           description: Primary file URL
 *         urls:
 *           type: array
 *           items:
 *             type: string
 *         fileNames:
 *           type: array
 *           items:
 *             type: string
 *         prefix:
 *           type: string
 */

import express from 'express';
import { checkAdmin } from '../utils/authChecks.js';
import { requestUpdateLogger } from '../utils/requestLogger.js';
import * as languageFileController from './languageFile/controller.js';

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

/**
 * @swagger
 * /api/languages:
 *   get:
 *     summary: List all available language files
 *     description: Returns a list of all language JSON files stored across all applications in the object store. Available to all authenticated users.
 *     tags:
 *       - Language Files
 *     security: []
 *     responses:
 *       200:
 *         description: List of language files
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 result:
 *                   type: array
 *                   items:
 *                     type: object
 *                     properties:
 *                       name:
 *                         type: string
 *                         description: Object key in the bucket (e.g. app/languages/en.json)
 *                       size:
 *                         type: number
 *                         description: File size in bytes
 *                       lastModified:
 *                         type: string
 *                         format: date-time
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.get('/', languageFileController.listLanguageFilesController);

/**
 * @swagger
 * /api/languages/{app}:
 *   get:
 *     summary: List language files for a specific application
 *     description: Returns all language JSON files stored under the given application identifier. Available to all authenticated users.
 *     tags:
 *       - Language Files
 *     security: []
 *     parameters:
 *       - in: path
 *         name: app
 *         required: true
 *         schema:
 *           type: string
 *         description: Application identifier
 *     responses:
 *       200:
 *         description: List of language files for the application
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *                 result:
 *                   type: array
 *                   items:
 *                     type: object
 *                     properties:
 *                       name:
 *                         type: string
 *                         description: Object key in the bucket (e.g. app/languages/en.json)
 *                       size:
 *                         type: number
 *                         description: File size in bytes
 *                       lastModified:
 *                         type: string
 *                         format: date-time
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.get(`/:app(${process.env.apiApps})`, languageFileController.listLanguageFilesByAppController);

/**
 * @swagger
 * /api/languages/{api}:
 *   post:
 *     summary: Upload a language JSON file
 *     description: Uploads a JSON language file to the object store for the specified application.
 *     tags:
 *       - Language Files
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: api
 *         required: true
 *         schema:
 *           type: string
 *         description: Application identifier
 *     requestBody:
 *       required: true
 *       content:
 *         multipart/form-data:
 *           schema:
 *             type: object
 *             properties:
 *               file:
 *                 type: string
 *                 format: binary
 *                 description: JSON language file
 *     responses:
 *       200:
 *         description: File uploaded successfully
 *         content:
 *           application/json:
 *             schema:
 *               $ref: '#/components/schemas/LanguageFileUploadResponse'
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.post(`/:api(${process.env.apiApps})`, requestUpdateLogger, checkAdmin, languageFileController.uploadLanguageFileController);

/**
 * @swagger
 * /api/languages/{app}/{filename}:
 *   get:
 *     summary: Download a language file
 *     description: Streams the requested language JSON file from the object store. Available to all authenticated users.
 *     tags:
 *       - Language Files
 *     security: []
 *     parameters:
 *       - in: path
 *         name: app
 *         required: true
 *         schema:
 *           type: string
 *         description: Application identifier
 *       - in: path
 *         name: filename
 *         required: true
 *         schema:
 *           type: string
 *         description: Language file name
 *     responses:
 *       200:
 *         description: File stream
 *         content:
 *           application/octet-stream:
 *             schema:
 *               type: string
 *               format: binary
 *       410:
 *         description: File not available
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.get(`/:app(${process.env.apiApps})/:filename`, languageFileController.getLanguageFileController);

/**
 * @swagger
 * /api/languages/{app}/{filename}:
 *   delete:
 *     summary: Delete a language file
 *     description: Removes the specified language file from the object store.
 *     tags:
 *       - Language Files
 *     security:
 *       - bearerAuth: []
 *     parameters:
 *       - in: path
 *         name: app
 *         required: true
 *         schema:
 *           type: string
 *         description: Application identifier
 *       - in: path
 *         name: filename
 *         required: true
 *         schema:
 *           type: string
 *         description: Language file name
 *     responses:
 *       200:
 *         description: File deleted successfully
 *         content:
 *           application/json:
 *             schema:
 *               type: object
 *               properties:
 *                 success:
 *                   type: boolean
 *       500:
 *         description: Server error
 */
// @ts-ignore
api.delete('/:app/:filename', requestUpdateLogger, checkAdmin, languageFileController.deleteLanguageFileController);

export default api;