Prod test issues resolution

This commit is contained in:
Stephanos A
2026-07-11 00:16:53 +03:00
parent 68c4f69cff
commit 05b3cdf104
12 changed files with 110 additions and 45 deletions

View File

@@ -837,13 +837,16 @@ export class SeatsService {
async removeSeat(seatId: string) {
const seat = await this.prisma.seat.findUnique({ where: { id: seatId } });
if (!seat) throw new NotFoundException('Seat not found');
if (!seat.seatNumber) throw new BadRequestException('Seat already removed');
if (!seat.seatNumber || seat.seatNumber.startsWith('-')) throw new BadRequestException('Seat already removed');
// Mark as removed, then renumber all active seats in the coach
await this.prisma.seat.update({
where: { id: seatId },
data: { seatNumber: `-${seat.seatNumber}` },
});
await this.renumberCoachSeats(seat.coachId);
return { removed: true, seatId, originalSeatNumber: seat.seatNumber };
}
@@ -854,10 +857,38 @@ export class SeatsService {
throw new BadRequestException('Seat is not removed');
}
const originalNumber = seat.seatNumber.slice(1);
await this.prisma.seat.update({ where: { id: seatId }, data: { seatNumber: originalNumber } });
// Restore with a temporary placeholder number, then renumber
await this.prisma.seat.update({ where: { id: seatId }, data: { seatNumber: `__restore__${seatId}` } });
await this.renumberCoachSeats(seat.coachId);
return { restored: true, seatId, seatNumber: originalNumber };
const restored = await this.prisma.seat.findUnique({ where: { id: seatId } });
return { restored: true, seatId, seatNumber: restored?.seatNumber };
}
/**
* Renumbers all active (non-removed) seats in a coach sequentially starting from 1,
* ordered by row then col. Removed seats (prefixed with "-") keep their slot but
* are excluded from the numbering sequence so numbers remain continuous.
*/
private async renumberCoachSeats(coachId: string): Promise<void> {
const allSeats = await this.prisma.seat.findMany({
where: { coachId },
orderBy: [{ row: 'asc' }, { col: 'asc' }],
select: { id: true, seatNumber: true },
});
const activeSeats = allSeats.filter(
(s) => s.seatNumber && !s.seatNumber.startsWith('-') && !s.seatNumber.startsWith('__restore__'),
);
await Promise.all(
activeSeats.map((s, idx) =>
this.prisma.seat.update({
where: { id: s.id },
data: { seatNumber: String(idx + 1) },
}),
),
);
}
@Cron(CronExpression.EVERY_MINUTE)