27 lines
1.1 KiB
JavaScript
27 lines
1.1 KiB
JavaScript
const PRIORITIES = new Set(['LOW', 'NORMAL', 'HIGH', 'CRITICAL']);
|
|
|
|
export function createTicket({ id, summary, priority = 'NORMAL', requestedAt }) {
|
|
if (!id || !summary?.trim() || !requestedAt || !PRIORITIES.has(priority)) {
|
|
throw new Error('invalid ticket input');
|
|
}
|
|
return { id, summary: summary.trim(), priority, requestedAt, status: 'OPEN', assignee: null, resolvedAt: null };
|
|
}
|
|
|
|
export function assignTicket(ticket, assignee) {
|
|
if (!assignee?.trim() || !['OPEN', 'ASSIGNED'].includes(ticket.status)) {
|
|
throw new Error('ticket cannot be assigned');
|
|
}
|
|
return { ...ticket, assignee: assignee.trim(), status: 'ASSIGNED' };
|
|
}
|
|
|
|
export function resolveTicket(ticket, resolvedAt) {
|
|
if (ticket.status !== 'ASSIGNED' || !resolvedAt) throw new Error('ticket cannot be resolved');
|
|
return { ...ticket, status: 'RESOLVED', resolvedAt };
|
|
}
|
|
|
|
export function isSlaBreached(ticket, now) {
|
|
const targetHours = ticket.priority === 'CRITICAL' ? 1 : ticket.priority === 'HIGH' ? 4 : 24;
|
|
const elapsed = new Date(now).getTime() - new Date(ticket.requestedAt).getTime();
|
|
return ticket.status !== 'RESOLVED' && elapsed > targetHours * 60 * 60 * 1000;
|
|
}
|