improved rescue workflow
This commit is contained in:
+39
-20
@@ -468,13 +468,11 @@ const normalizeWorkspace = (row: WorkspaceRow) => ({
|
||||
|
||||
const normalizeAdminRescueWorkspace = (
|
||||
row: WorkspaceRow & {
|
||||
owner_email: string | null;
|
||||
bird_count: number;
|
||||
member_count: number;
|
||||
},
|
||||
) => ({
|
||||
workspace: normalizeWorkspace(row),
|
||||
ownerEmail: row.owner_email,
|
||||
birdCount: Number(row.bird_count ?? 0),
|
||||
memberCount: Number(row.member_count ?? 0),
|
||||
});
|
||||
@@ -1267,10 +1265,12 @@ const sendRescueStatusNotification = async ({
|
||||
workspace,
|
||||
ownerEmail,
|
||||
event,
|
||||
note,
|
||||
}: {
|
||||
workspace: WorkspaceRow;
|
||||
ownerEmail: string | null;
|
||||
event: 'created' | 'converted' | 'status_changed' | 'canceled';
|
||||
note?: string | null;
|
||||
}) => {
|
||||
const statusLabel = workspace.rescue_verification_status.replace(/_/g, ' ');
|
||||
const eventLabel =
|
||||
@@ -1294,6 +1294,11 @@ const sendRescueStatusNotification = async ({
|
||||
`Billing email: ${workspace.billing_email ?? 'not set'}`,
|
||||
`Flock ID: ${workspace.id}`,
|
||||
];
|
||||
const escapedNote = note ? escapeHtml(note) : null;
|
||||
|
||||
if (note) {
|
||||
lines.push(`Note: ${note}`);
|
||||
}
|
||||
|
||||
if (!mailTransport) {
|
||||
console.log(`Rescue status notification for ${rescueStatusNotificationEmail}:\n${lines.join('\n')}`);
|
||||
@@ -1314,6 +1319,7 @@ const sendRescueStatusNotification = async ({
|
||||
<li><strong>Billing email:</strong> ${escapedBillingEmail}</li>
|
||||
<li><strong>Flock ID:</strong> ${workspace.id}</li>
|
||||
</ul>
|
||||
${escapedNote ? `<p><strong>Note:</strong> ${escapedNote}</p>` : ''}
|
||||
`,
|
||||
});
|
||||
|
||||
@@ -1368,6 +1374,17 @@ const sendRescueOnboardingWebhook = async ({
|
||||
}
|
||||
};
|
||||
|
||||
const trySendRescueOnboardingWebhook = async (payload: Parameters<typeof sendRescueOnboardingWebhook>[0]) => {
|
||||
try {
|
||||
await sendRescueOnboardingWebhook(payload);
|
||||
return null;
|
||||
} catch (error) {
|
||||
const errorMessage = error instanceof Error ? error.message : 'Unknown rescue onboarding webhook error.';
|
||||
console.error(`Rescue onboarding webhook failed for workspace ${payload.workspaceId}:`, error);
|
||||
return `The rescue onboarding webhook failed and this rescue requires manual review. ${errorMessage}`;
|
||||
}
|
||||
};
|
||||
|
||||
const issueMagicLinkInvite = async ({
|
||||
email,
|
||||
name,
|
||||
@@ -2553,15 +2570,6 @@ app.post('/api/workspaces', requireAuth, requireSessionAuth, async (req: Request
|
||||
res.status(400).json({ error: 'Rescue onboarding details are required.' });
|
||||
return;
|
||||
}
|
||||
|
||||
await sendRescueOnboardingWebhook({
|
||||
action: 'created',
|
||||
workspaceId,
|
||||
flockName: parsed.data.name,
|
||||
ownerEmail: req.auth!.user.email,
|
||||
requestedByUserId: req.auth!.user.id,
|
||||
rescueOnboarding: parsed.data.rescueOnboarding,
|
||||
});
|
||||
}
|
||||
|
||||
const workspace = await createWorkspace({
|
||||
@@ -2575,10 +2583,20 @@ app.post('/api/workspaces', requireAuth, requireSessionAuth, async (req: Request
|
||||
});
|
||||
|
||||
if (workspace?.workspace_type === 'rescue') {
|
||||
const onboardingWebhookError = await trySendRescueOnboardingWebhook({
|
||||
action: 'created',
|
||||
workspaceId: workspace.id,
|
||||
flockName: workspace.name,
|
||||
ownerEmail: req.auth!.user.email,
|
||||
requestedByUserId: req.auth!.user.id,
|
||||
rescueOnboarding: parsed.data.rescueOnboarding!,
|
||||
});
|
||||
|
||||
await sendRescueStatusNotification({
|
||||
workspace,
|
||||
ownerEmail: req.auth!.user.email,
|
||||
event: 'created',
|
||||
note: onboardingWebhookError,
|
||||
});
|
||||
}
|
||||
|
||||
@@ -2626,15 +2644,6 @@ app.put('/api/workspace', requireAuth, requireSessionAuth, requireWorkspaceRole(
|
||||
res.status(400).json({ error: 'Rescue onboarding details are required.' });
|
||||
return;
|
||||
}
|
||||
|
||||
await sendRescueOnboardingWebhook({
|
||||
action: 'converted',
|
||||
workspaceId: currentWorkspace.id,
|
||||
flockName: parsed.data.name,
|
||||
ownerEmail: req.auth!.user.email,
|
||||
requestedByUserId: req.auth!.user.id,
|
||||
rescueOnboarding: parsed.data.rescueOnboarding,
|
||||
});
|
||||
}
|
||||
|
||||
const workspace = await updateWorkspace({
|
||||
@@ -2647,10 +2656,20 @@ app.put('/api/workspace', requireAuth, requireSessionAuth, requireWorkspaceRole(
|
||||
});
|
||||
|
||||
if (workspace?.workspace_type === 'rescue' && isConvertingToRescue) {
|
||||
const onboardingWebhookError = await trySendRescueOnboardingWebhook({
|
||||
action: 'converted',
|
||||
workspaceId: workspace.id,
|
||||
flockName: workspace.name,
|
||||
ownerEmail: req.auth!.user.email,
|
||||
requestedByUserId: req.auth!.user.id,
|
||||
rescueOnboarding: parsed.data.rescueOnboarding!,
|
||||
});
|
||||
|
||||
await sendRescueStatusNotification({
|
||||
workspace,
|
||||
ownerEmail: req.auth!.user.email,
|
||||
event: 'converted',
|
||||
note: onboardingWebhookError,
|
||||
});
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user