New public shifts system
This commit is contained in:
@@ -30,16 +30,30 @@ class EmailTemplateService {
|
||||
}
|
||||
}
|
||||
|
||||
renderTemplate(template, variables) {
|
||||
let rendered = template;
|
||||
processTemplate(template, variables) {
|
||||
if (!template) return '';
|
||||
|
||||
// Replace all {{VARIABLE}} with actual values
|
||||
Object.entries(variables).forEach(([key, value]) => {
|
||||
const regex = new RegExp(`{{${key}}}`, 'g');
|
||||
rendered = rendered.replace(regex, value || '');
|
||||
let processed = template;
|
||||
|
||||
// Handle conditional blocks {{#if VARIABLE}}...{{/if}}
|
||||
processed = processed.replace(/\{\{#if\s+(\w+)\}\}([\s\S]*?)\{\{\/if\}\}/g, (match, varName, content) => {
|
||||
const value = variables[varName];
|
||||
// Check if value exists and is not empty string
|
||||
if (value !== undefined && value !== null && value !== '') {
|
||||
// Recursively process the content inside the conditional block
|
||||
return this.processTemplate(content, variables);
|
||||
}
|
||||
return '';
|
||||
});
|
||||
|
||||
return rendered;
|
||||
// Replace variables {{VARIABLE}}
|
||||
processed = processed.replace(/\{\{(\w+)\}\}/g, (match, varName) => {
|
||||
const value = variables[varName];
|
||||
// Return the value or empty string if undefined
|
||||
return value !== undefined && value !== null ? String(value) : '';
|
||||
});
|
||||
|
||||
return processed;
|
||||
}
|
||||
|
||||
async render(templateName, variables) {
|
||||
@@ -50,9 +64,10 @@ class EmailTemplateService {
|
||||
this.loadTemplate(templateName, 'txt')
|
||||
]);
|
||||
|
||||
// Use processTemplate which handles conditionals properly
|
||||
return {
|
||||
html: this.renderTemplate(htmlTemplate, variables),
|
||||
text: this.renderTemplate(textTemplate, variables)
|
||||
html: this.processTemplate(htmlTemplate, variables),
|
||||
text: this.processTemplate(textTemplate, variables)
|
||||
};
|
||||
} catch (error) {
|
||||
logger.error('Failed to render email template:', error);
|
||||
|
||||
@@ -102,10 +102,44 @@ class NocoDBService {
|
||||
}
|
||||
|
||||
// Create record
|
||||
async create(tableId, data) {
|
||||
const url = this.getTableUrl(tableId);
|
||||
const response = await this.client.post(url, data);
|
||||
return response.data;
|
||||
async create(sheetId, data) {
|
||||
try {
|
||||
// Explicitly remove any ID field to prevent NocoDB conflicts
|
||||
const cleanData = { ...data };
|
||||
|
||||
// Remove all possible ID field variations
|
||||
delete cleanData.ID;
|
||||
delete cleanData.id;
|
||||
delete cleanData.Id;
|
||||
delete cleanData.iD;
|
||||
|
||||
// Remove any undefined values to prevent issues
|
||||
Object.keys(cleanData).forEach(key => {
|
||||
if (cleanData[key] === undefined) {
|
||||
delete cleanData[key];
|
||||
}
|
||||
});
|
||||
|
||||
logger.info(`Creating record in sheet ${sheetId}`);
|
||||
logger.info(`Data being sent to NocoDB:`, JSON.stringify(cleanData, null, 2));
|
||||
|
||||
const url = this.getTableUrl(sheetId);
|
||||
const response = await this.client.post(url, cleanData);
|
||||
|
||||
logger.info(`Create response status: ${response.status}`);
|
||||
logger.info(`Create response:`, JSON.stringify(response.data, null, 2));
|
||||
|
||||
return response.data;
|
||||
} catch (error) {
|
||||
logger.error('Error creating record:', error);
|
||||
logger.error('Error response data:', JSON.stringify(error.response?.data, null, 2));
|
||||
logger.error('Error response status:', error.response?.status);
|
||||
logger.error('Error response headers:', JSON.stringify(error.response?.headers, null, 2));
|
||||
logger.error('Request URL:', error.config?.url);
|
||||
logger.error('Request method:', error.config?.method);
|
||||
logger.error('Request data:', JSON.stringify(error.config?.data, null, 2));
|
||||
throw error;
|
||||
}
|
||||
}
|
||||
|
||||
// Update record
|
||||
|
||||
Reference in New Issue
Block a user