feat: initialize CalBook project with comprehensive scheduling, admin, and deployment infrastructure
This commit is contained in:
89
lib/services/delivery-issues.ts
Normal file
89
lib/services/delivery-issues.ts
Normal file
@@ -0,0 +1,89 @@
|
||||
import type { DeliveryChannel } from "@prisma/client";
|
||||
import { prisma } from "@/lib/prisma";
|
||||
|
||||
type DeliveryIssueInput = {
|
||||
channel: DeliveryChannel;
|
||||
operation: string;
|
||||
target: string;
|
||||
error: unknown;
|
||||
attemptIncrement?: number;
|
||||
};
|
||||
|
||||
type ResolveDeliveryIssueInput = {
|
||||
channel: DeliveryChannel;
|
||||
operation: string;
|
||||
target: string;
|
||||
};
|
||||
|
||||
function toErrorMessage(error: unknown) {
|
||||
if (error instanceof Error) {
|
||||
return error.message.slice(0, 4000);
|
||||
}
|
||||
return String(error).slice(0, 4000);
|
||||
}
|
||||
|
||||
export async function reportDeliveryFailure(input: DeliveryIssueInput) {
|
||||
const message = toErrorMessage(input.error);
|
||||
const increment = Math.max(1, input.attemptIncrement ?? 1);
|
||||
|
||||
try {
|
||||
const existing = await prisma.deliveryIssue.findFirst({
|
||||
where: {
|
||||
channel: input.channel,
|
||||
operation: input.operation,
|
||||
target: input.target,
|
||||
resolvedAt: null
|
||||
},
|
||||
orderBy: {
|
||||
lastSeenAt: "desc"
|
||||
},
|
||||
select: { id: true, attemptCount: true }
|
||||
});
|
||||
|
||||
if (existing) {
|
||||
await prisma.deliveryIssue.update({
|
||||
where: { id: existing.id },
|
||||
data: {
|
||||
lastError: message,
|
||||
attemptCount: existing.attemptCount + increment,
|
||||
lastSeenAt: new Date()
|
||||
}
|
||||
});
|
||||
return;
|
||||
}
|
||||
|
||||
await prisma.deliveryIssue.create({
|
||||
data: {
|
||||
channel: input.channel,
|
||||
operation: input.operation,
|
||||
target: input.target,
|
||||
lastError: message,
|
||||
attemptCount: increment,
|
||||
firstSeenAt: new Date(),
|
||||
lastSeenAt: new Date()
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error("[calbook] DeliveryIssue speichern fehlgeschlagen", error);
|
||||
}
|
||||
}
|
||||
|
||||
export async function resolveDeliveryIssues(input: ResolveDeliveryIssueInput) {
|
||||
try {
|
||||
await prisma.deliveryIssue.updateMany({
|
||||
where: {
|
||||
channel: input.channel,
|
||||
operation: input.operation,
|
||||
target: input.target,
|
||||
resolvedAt: null
|
||||
},
|
||||
data: {
|
||||
resolvedAt: new Date()
|
||||
}
|
||||
});
|
||||
} catch (error) {
|
||||
// eslint-disable-next-line no-console
|
||||
console.error("[calbook] DeliveryIssue resolve fehlgeschlagen", error);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user