flexbiz-server
Version:
Flexible Server
10 lines (9 loc) • 4.31 kB
JavaScript
const emailService=require("../../libs/email"),_=require("lodash");function sendEmailPromise($options$$){return new Promise(($resolve$$,$reject$$)=>{emailService.sendHtml($options$$,function($error$$){if($error$$){const $err$$=Error($error$$.message||$error$$.error||String($error$$));$err$$.originalError=$error$$;return $reject$$($err$$)}$resolve$$()})})}
async function emailHandler($flowState_id_app_sendPromises$$,$app_info_node_nodeData$$,$payload_sendPromise$$,$abortSignal$$){const $nodeInstanceId$$=`${$flowState_id_app_sendPromises$$.instanceId}-${$app_info_node_nodeData$$.id}`;Logger.info(`[${$nodeInstanceId$$}] Starting email node.`);var $receivers_validReceivers$$=[];$payload_sendPromise$$&&($receivers_validReceivers$$=_.isArray($payload_sendPromise$$)?[...$payload_sendPromise$$]:[$payload_sendPromise$$]);$app_info_node_nodeData$$=$app_info_node_nodeData$$.data||
{};$app_info_node_nodeData$$.to&&$app_info_node_nodeData$$.subject&&$app_info_node_nodeData$$.message&&$receivers_validReceivers$$.push({to:$app_info_node_nodeData$$.to,subject:$app_info_node_nodeData$$.subject,message:$app_info_node_nodeData$$.message,source:"node_config"});$receivers_validReceivers$$=$receivers_validReceivers$$.filter($r$$=>$r$$&&$r$$.to&&$r$$.subject&&$r$$.message);if($receivers_validReceivers$$.length===0)return Logger.warn(`[${$nodeInstanceId$$}] No valid receivers found in payload or node configuration. Skipping email send.`),
{status:"no_receivers",successful:[],failed:[]};if($abortSignal$$.aborted)throw Logger.info(`[${$nodeInstanceId$$}] Email node aborted before sending.`),new DOMException("Aborted before sending emails","AbortError");$app_info_node_nodeData$$=null;if($flowState_id_app_sendPromises$$=$flowState_id_app_sendPromises$$.flowDefinition.id_app)try{Logger.info(`[${$nodeInstanceId$$}] Fetching app info for ID: ${$flowState_id_app_sendPromises$$}`),($app_info_node_nodeData$$=await global.getModel("app").findOne({_id:$flowState_id_app_sendPromises$$}).lean())||
Logger.warn(`[${$nodeInstanceId$$}] App info not found for ID: ${$flowState_id_app_sendPromises$$}`)}catch($dbError$$){throw Logger.error(`[${$nodeInstanceId$$}] Failed to fetch app info:`,$dbError$$),Error(`Failed to fetch app info: ${$dbError$$.message}`);}else Logger.warn(`[${$nodeInstanceId$$}] Flow ID not found in flowState, cannot fetch app info.`);$flowState_id_app_sendPromises$$=[];const $results$$={successful:[],failed:[]};for(const $receiver$$ of $receivers_validReceivers$$){if($abortSignal$$.aborted){Logger.info(`[${$nodeInstanceId$$}] Email sending aborted during loop.`);
$receivers_validReceivers$$.slice($flowState_id_app_sendPromises$$.length).forEach($r$$=>$results$$.failed.push({receiver:$r$$,error:"Aborted"}));break}const {to:$to$$,subject:$subject$$,message:$message$$}=$receiver$$;$payload_sendPromise$$=sendEmailPromise({to:{address:$to$$},subject:$subject$$,html:$message$$,app_info:$app_info_node_nodeData$$}).then(()=>({status:"fulfilled",value:$receiver$$})).catch($error$$=>({status:"rejected",reason:$error$$,receiver:$receiver$$}));$flowState_id_app_sendPromises$$.push($payload_sendPromise$$)}Logger.info(`[${$nodeInstanceId$$}] Waiting for ${$flowState_id_app_sendPromises$$.length} email attempts to settle...`);
(await Promise.allSettled($flowState_id_app_sendPromises$$)).forEach($failedReceiver_result$$=>{if($failedReceiver_result$$.status==="fulfilled")$results$$.successful.push($failedReceiver_result$$.value.value);else{const $originalReason$$=$failedReceiver_result$$.reason?.reason||$failedReceiver_result$$.reason||Error("Unknown rejection reason");$failedReceiver_result$$=$failedReceiver_result$$.reason?.receiver||{to:"unknown",subject:"unknown"};Logger.error(`[${$nodeInstanceId$$}] Failed to send email to ${$failedReceiver_result$$.to}:`,
$originalReason$$.message||$originalReason$$);$results$$.failed.push({receiver:$failedReceiver_result$$,error:$originalReason$$.message||String($originalReason$$)})}});if($abortSignal$$.aborted)throw Logger.info(`[${$nodeInstanceId$$}] Email sending was aborted.`),new DOMException("Email sending process aborted","AbortError");Logger.info(`[${$nodeInstanceId$$}] Email sending finished. Successful: ${$results$$.successful.length}, Failed: ${$results$$.failed.length}`);return $results$$}
module.exports=emailHandler;