Changed resuce to status to allow cancellation, enabled email notifications

This commit is contained in:
Corey Blais
2026-04-15 17:29:44 -04:00
parent ac0cc122d3
commit 5218a24bd1
3 changed files with 136 additions and 12 deletions
+37 -2
View File
@@ -41,6 +41,7 @@ import {
} from './repositories/birdRepository.js';
import { createIntegrationTokenRecord, listIntegrationTokens, revokeIntegrationToken } from './repositories/integrationTokenRepository.js';
import {
cancelRescueVerificationRequest,
claimWorkspaceInvites,
createWorkspace,
deleteWorkspaceMember,
@@ -503,10 +504,17 @@ const sendRescueStatusNotification = async ({
}: {
workspace: WorkspaceRow;
ownerEmail: string | null;
event: 'created' | 'converted' | 'status_changed';
event: 'created' | 'converted' | 'status_changed' | 'canceled';
}) => {
const statusLabel = workspace.rescue_verification_status.replace(/_/g, ' ');
const eventLabel = event === 'created' ? 'created' : event === 'converted' ? 'converted to rescue' : 'status updated';
const eventLabel =
event === 'created'
? 'created'
: event === 'converted'
? 'converted to rescue'
: event === 'canceled'
? 'canceled rescue request'
: 'status updated';
const subject = `FlockPal rescue status: ${workspace.name} ${eventLabel}`;
const escapedWorkspaceName = escapeHtml(workspace.name);
const escapedStatusLabel = escapeHtml(statusLabel);
@@ -1213,6 +1221,33 @@ app.put('/api/workspace', requireAuth, requireWriteAccess, requireWorkspaceRole(
}
});
app.post(
'/api/workspace/rescue-status/cancel',
requireAuth,
requireSessionAuth,
requireWorkspaceRole(['owner', 'assistant']),
async (req: Request, res: Response, next: NextFunction) => {
try {
const workspace = await cancelRescueVerificationRequest(req.auth!.workspace.id);
if (!workspace) {
res.status(409).json({ error: 'Only pending rescue status requests can be canceled.' });
return;
}
await sendRescueStatusNotification({
workspace,
ownerEmail: req.auth!.user.email,
event: 'canceled',
});
res.json({ workspace: normalizeWorkspace(workspace) });
} catch (error) {
next(error);
}
},
);
app.get('/api/workspace/members', requireAuth, async (req: Request, res: Response, next: NextFunction) => {
try {
const members = await listWorkspaceMembers(req.auth!.workspace.id);