This commit is contained in:
Stefan Lazic committed 2026-08-04 09:57:58 +01:00
1 parent 546613e677
commit 4785510144
82 files changed
+4903 -287

No files matched your search

@@ -13,6 +13,7 @@ import {
} from "@/services/scheduling/appointment.service";
import { awardStampForCompletedAppointment } from "@/services/loyalty/loyalty.service";
import { notifyAppointmentNoShow, notifyBookingApproved, notifyBookingCompleted } from "@/services/scheduling/booking-notifications";
import { syncAppointmentSafely } from "@/services/calendar/calendar-sync.service";
import { assertOwnAppointment, StaffPermissionDeniedError } from "../authorization";
/**
@@ -63,6 +64,9 @@ export async function confirmAppointmentAction(
return { success: false, error: friendlyTransitionMessage(result.validation.issues[0]?.code) };
}
await notifyBookingApproved(prisma, result.appointment);
// Approval is the first point a PENDING appointment becomes syncable —
// see calendar-sync.service.ts's own policy comment.
await syncAppointmentSafely(prisma, appointmentId);
return { success: true };
}
@@ -123,6 +127,7 @@ export async function markNoShowAction(
return { success: false, error: friendlyTransitionMessage(result.validation.issues[0]?.code) };
}
await notifyAppointmentNoShow(prisma, result.appointment);
await syncAppointmentSafely(prisma, appointmentId);
return { success: true };
}
@@ -138,12 +143,11 @@ export async function cancelStaffAppointmentAction(params: {
cancelledByUserId: staff.user.id,
reason: params.reason,
});
return result.success
? { success: true }
: {
success: false,
error: result.validation.issues[0]?.message ?? "Couldn't cancel this appointment.",
};
if (!result.success) {
return { success: false, error: result.validation.issues[0]?.message ?? "Couldn't cancel this appointment." };
}
await syncAppointmentSafely(prisma, params.appointmentId);
return { success: true };
}
export async function rescheduleStaffAppointmentAction(params: {
@@ -159,12 +163,15 @@ export async function rescheduleStaffAppointmentAction(params: {
staffId: params.staffId,
startAt: new Date(params.startAt),
});
return result.success
? { success: true }
: {
success: false,
error: result.validation.issues[0]?.message ?? "Couldn't reschedule this appointment.",
};
if (!result.success) {
return { success: false, error: result.validation.issues[0]?.message ?? "Couldn't reschedule this appointment." };
}
// Covers both a plain reschedule and a barber reassignment (staffId
// change) — syncAppointmentSafely itself detects and cancels a stale
// event under the previous staff member's connection when the staffId
// changed (see that function's own comment).
await syncAppointmentSafely(prisma, params.appointmentId);
return { success: true };
}
function friendlyTransitionMessage(code?: string): string {