Compare commits

..

2 Commits

Author SHA1 Message Date
53b5924767 Refactor parent template handling in TemplateManager
All checks were successful
farmcontrol/farmcontrol-ws/pipeline/head This commit looks good
- Updated the logic to retrieve and validate the parent template content, ensuring it is correctly fetched and checked for string type.
- Improved error logging to provide clearer messages when parent template content is missing or invalid.
2026-07-28 02:51:02 +01:00
8c445a7392 Enhance socket management and error handling in template events
- Increased the maximum HTTP buffer size for the Socket.IO server to improve data handling capabilities.
- Added error handling in `handlePreviewTemplateEvent` and `handleRenderTemplatePDFEvent` methods to log errors and return error messages through callbacks.
- Implemented a check for unknown object types in the `TemplateManager` to prevent processing errors and return appropriate error messages.
2026-07-28 01:50:24 +01:00
3 changed files with 54 additions and 19 deletions

View File

@ -23,6 +23,7 @@ export class SocketManager {
// Create Socket.IO server - CORS applies to HTTP long-polling transport
const allowedOrigins = config.server.corsOrigins || ['*'];
const io = new Server(server, {
maxHttpBufferSize: 1e8,
cors: {
origin: (origin, callback) => {
// Allow requests with no origin (e.g. same-origin, Postman, native apps)

View File

@ -306,23 +306,41 @@ export class SocketUser {
}
async handlePreviewTemplateEvent(data, callback) {
const result = await this.templateManager.renderTemplate(
data._id,
data.content,
data.testObject,
data.scale
);
callback(result);
try {
const result = await this.templateManager.renderTemplate(
data._id,
data.content,
data.testObject,
data.scale
);
if (typeof callback === 'function') {
callback(result);
}
} catch (err) {
logger.error('Preview template event error:', err);
if (typeof callback === 'function') {
callback({ error: err.message });
}
}
}
async handleRenderTemplatePDFEvent(data, callback) {
const result = await this.templateManager.renderPDF(
data._id,
data.content,
data.object,
1
);
callback(result);
try {
const result = await this.templateManager.renderPDF(
data._id,
data.content,
data.object,
1
);
if (typeof callback === 'function') {
callback(result);
}
} catch (err) {
logger.error('Render template PDF event error:', err);
if (typeof callback === 'function') {
callback({ error: err.message });
}
}
}
async handleGenerateHostOtpEvent(data, callback) {
const result = await generateHostOTP(data._id);

View File

@ -407,6 +407,9 @@ export class TemplateManager {
} else {
const objectType = documentTemplate?.objectType;
const model = getModelByName(objectType);
if (model == null) {
return { error: `Unknown object type: ${objectType}` };
}
const defaultKeys = Object.keys(model.schema.obj);
const defaultValues = {};
for (const key of defaultKeys) {
@ -424,24 +427,37 @@ export class TemplateManager {
var templateWithParentContent;
var parentTemplate = documentTemplate.parent;
if (documentTemplate.parent != undefined) {
if (typeof parentTemplate === 'string') {
parentTemplate = await getObject({
model: documentTemplateModel,
id: parentTemplate,
populate: [
{ path: 'documentSize' },
{ path: 'parent', strictPopulate: false }
],
cached: true
});
}
// Validate parent content
if (
documentTemplate.parent.content == null ||
typeof documentTemplate.parent.content !== 'string'
parentTemplate.content == null ||
typeof parentTemplate.content !== 'string'
) {
logger.error(
'Parent template content is required and must be a string.',
documentTemplate.parent.content
parentTemplate.content
);
return {
error:
'Parent template content is required and must be a string.' +
documentTemplate.parent.content
parentTemplate.content
};
}
templateWithParentContent = await ejs.render(
documentTemplate.parent.content,
parentTemplate.content,
{ content: templateContent, fc: this.fc },
defaultOptions
);