Source: Router/configRoute/controller.js

/**
 * Configuration File Controller
 * 
 * Handles HTTP request/response logic for configuration file management.
 * Controllers manage request validation, response formatting, and error handling.
 * Business logic is delegated to the service layer.
 * 
 * @module ConfigController
 */

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

import { configService } from './service.js';
import { errorLogger } from '../../utils/requestLogger.js';

/**
 * Upload and validate a new configuration file
 * 
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @param {Function} next - Express next middleware function
 */
export const uploadConfig = async (req, res, next) => {
    try {
        const { app } = req.params;
        
        // Set UID for upload processing
        req.query.UID = req.params.UID;
        
        const result = await configService.uploadAndValidateConfig(req, app);
        
        if (!result.success) {
            return res.status(400).json(result);
        }
        
        res.json(result);
        
    } catch (error) {
        errorLogger(error);
        res.status(500).json({
            success: false,
            message: `Server error: ${error.message}`
        });
    }
};

/**
 * Download a specific configuration file
 * 
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 * @param {Function} next - Express next middleware function
 */
export const downloadConfig = async (req, res, next) => {
    try {
        const { app, UID } = req.params;
        
        const result = await configService.getConfigFile(app, UID);
        
        if (!result.success) {
            return res.status(404).json(result);
        }
        
        // Set headers for file download
        res.set('Content-Type', 'application/octet-stream');
        res.set('Content-Disposition', `attachment; filename="${UID}.yaml"`);
        
        // Pipe the file stream to response
        result.stream.pipe(res);
        
    } catch (error) {
        errorLogger(error);
        res.status(500).json({
            success: false,
            message: `Server error: ${error.message}`
        });
    }
};

/**
 * List all configuration files for an application
 * 
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const listConfigs = async (req, res) => {
    try {
        const { app } = req.params;
        
        const result = await configService.getConfigList(app);
        
        if (!result.success) {
            return res.status(404).json(result);
        }
        
        res.json(result);
        
    } catch (error) {
        errorLogger(error);
        res.status(500).json({
            success: false,
            message: `Server error: ${error.message}`
        });
    }
};

/**
 * Delete a configuration file
 * 
 * @param {Object} req - Express request object
 * @param {Object} res - Express response object
 */
export const deleteConfig = async (req, res) => {
    try {
        const { app, UID } = req.params;
        
        const result = await configService.deleteConfigFile(app, UID);


        if (!result.success) {
            return res.status(500).json(result);
        }
        
        res.json(result);
        
    } catch (error) {
        errorLogger(error);
        res.status(500).json({
            success: false,
            message: `Failed to delete configuration file: ${error.message}`
        });
    }
};