// @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;