New public shifts system

This commit is contained in:
2025-08-22 14:45:40 -06:00
parent d96d76d104
commit a8edcf8592
24 changed files with 2236 additions and 65 deletions

View File

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

View File

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