/**
* 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}`
});
}
};