From 630d68fa0ca74365d0983521be7ce85cd381446c Mon Sep 17 00:00:00 2001 From: Collin Duncan <3679940+cgduncan7@users.noreply.github.com> Date: Fri, 23 Feb 2024 07:26:29 -0600 Subject: [PATCH] Adding error handling for baanreserveren to take a screenshot on error --- src/runner/baanreserveren/service.ts | 83 ++++++++++++++++++---------- 1 file changed, 54 insertions(+), 29 deletions(-) diff --git a/src/runner/baanreserveren/service.ts b/src/runner/baanreserveren/service.ts index 57351c1..95c1dd5 100644 --- a/src/runner/baanreserveren/service.ts +++ b/src/runner/baanreserveren/service.ts @@ -8,6 +8,7 @@ import dayjs from '../../common/dayjs' import { LoggerService } from '../../logger/service.logger' import { Reservation } from '../../reservations/entity' import { EmptyPage } from '../pages/empty' +import path from 'path' const BAAN_RESERVEREN_ROOT_URL = 'https://squashcity.baanreserveren.nl' @@ -81,6 +82,13 @@ export class BaanReserverenService { ) } + private async handleError() { + await this.page.screenshot({ + type: 'png', + path: path.resolve('.', `${Date.now()}_error-screenshot.png`), + }).catch((reason: any) => this.loggerService.warn('Failed to take screenshot', { reason })) + } + private async checkSession(username: string) { this.loggerService.debug('Checking session', { username, @@ -465,43 +473,60 @@ export class BaanReserverenService { } public async performReservation(reservation: Reservation) { - await this.init(reservation) - await this.navigateToDay(reservation.dateRangeStart) - await this.selectAvailableTime(reservation) - await this.selectOwner(reservation.ownerId) - await this.selectOpponent(reservation.opponentId, reservation.opponentName) - await this.confirmReservation() + try { + await this.init(reservation) + await this.navigateToDay(reservation.dateRangeStart) + await this.selectAvailableTime(reservation) + await this.selectOwner(reservation.ownerId) + await this.selectOpponent( + reservation.opponentId, + reservation.opponentName, + ) + await this.confirmReservation() + } catch (error: unknown) { + await this.handleError() + throw error + } } public async addReservationToWaitList(reservation: Reservation) { - await this.init(reservation) - await this.navigateToWaitingList() - const previousWaitingListIds = await this.recordWaitingListEntries() - await this.openWaitingListDialog() - await this.inputWaitingListDetails(reservation) - await this.confirmWaitingListDetails() - await this.navigateToWaitingList() - const currentWaitingListIds = await this.recordWaitingListEntries() - const waitingListId = this.findNewWaitingListEntryId( - previousWaitingListIds, - currentWaitingListIds, - ) - - if (waitingListId == null) { - throw new WaitingListSubmissionError( - 'Failed to find new waiting list entry', + try { + await this.init(reservation) + await this.navigateToWaitingList() + const previousWaitingListIds = await this.recordWaitingListEntries() + await this.openWaitingListDialog() + await this.inputWaitingListDetails(reservation) + await this.confirmWaitingListDetails() + await this.navigateToWaitingList() + const currentWaitingListIds = await this.recordWaitingListEntries() + const waitingListId = this.findNewWaitingListEntryId( + previousWaitingListIds, + currentWaitingListIds, ) - } - return waitingListId + if (waitingListId == null) { + throw new WaitingListSubmissionError( + 'Failed to find new waiting list entry', + ) + } + + return waitingListId + } catch (error: unknown) { + await this.handleError() + throw error + } } public async removeReservationFromWaitList(reservation: Reservation) { - if (!reservation.waitListed || !reservation.waitingListId) return - - await this.init(reservation) - await this.navigateToWaitingList() - await this.deleteWaitingListEntryRowById(reservation.waitingListId) + try { + if (!reservation.waitListed || !reservation.waitingListId) return + await this.init(reservation) + await this.navigateToWaitingList() + await this.deleteWaitingListEntryRowById(reservation.waitingListId) + } catch (error: unknown) { + await this.handleError() + throw error + } } }