Changing how sessions are started and handled to fix issues with multiple reservation requests

This commit is contained in:
Collin Duncan 2023-02-20 11:08:56 +01:00
parent 26953c6c13
commit fa99ad7941
No known key found for this signature in database
2 changed files with 39 additions and 27 deletions

View file

@ -35,10 +35,7 @@ export class Runner {
BrowserLaunchArgumentOptions & BrowserLaunchArgumentOptions &
BrowserConnectOptions BrowserConnectOptions
) { ) {
const defaultArgs = [ const defaultArgs = ['--disable-setuid-sandbox', '--no-sandbox']
'--disable-setuid-sandbox',
'--no-sandbox',
]
this.options = { args: defaultArgs, ...options } this.options = { args: defaultArgs, ...options }
} }
@ -62,20 +59,46 @@ export class Runner {
} }
public async run(reservation: Reservation) { public async run(reservation: Reservation) {
l.getStore()?.debug('Launching browser')
try { try {
if (!this.browser) { if (!this.browser) {
l.getStore()?.debug('Launching browser')
this.browser = await puppeteer.launch(this.options) this.browser = await puppeteer.launch(this.options)
} }
} catch (error) { } catch (error) {
throw new PuppeteerBrowserLaunchError(error as Error) throw new PuppeteerBrowserLaunchError(error as Error)
} }
await this.startSession(reservation)
await this.makeReservation(reservation)
}
private async checkSession(username: string): Promise<SessionAction> {
if (
this.page
?.url()
.startsWith('https://squashcity.baanreserveren.nl/reservations')
) {
l.getStore()?.info('Already logged in', { username })
return this.session?.username !== username
? SessionAction.Logout
: SessionAction.NoAction
}
return SessionAction.Login
}
private async startSession(reservation: Reservation) {
if (!this.page) {
try { try {
this.page = await this.browser?.newPage() this.page = await this.browser?.newPage()
} catch (error) { } catch (error) {
throw new PuppeteerNewPageError(error as Error) throw new PuppeteerNewPageError(error as Error)
} }
}
this.page
?.goto('https://squashcity.baanreserveren.nl/reservations')
.catch((e: Error) => {
throw new RunnerNewSessionError(e)
})
const sessionAction = await this.checkSession(reservation.user.username) const sessionAction = await this.checkSession(reservation.user.username)
switch (sessionAction) { switch (sessionAction) {
@ -92,26 +115,10 @@ export class Runner {
default: default:
break break
} }
await this.makeReservation(reservation)
}
private async checkSession(username: string): Promise<SessionAction> {
if (this.page?.url().startsWith('https://squashcity.baanreserveren.nl/')) {
l.getStore()?.info('Already logged in', { username })
return this.session?.username !== username
? SessionAction.Logout
: SessionAction.NoAction
}
return SessionAction.Login
} }
private async login(username: string, password: string) { private async login(username: string, password: string) {
l.getStore()?.debug('Logging in', { username }) l.getStore()?.debug('Logging in', { username })
await this.page
?.goto('https://squashcity.baanreserveren.nl/')
.catch((e: Error) => {
throw new RunnerLoginNavigationError(e)
})
await this.page await this.page
?.waitForSelector('input[name=username]') ?.waitForSelector('input[name=username]')
.then((i) => i?.type(username)) .then((i) => i?.type(username))
@ -137,7 +144,7 @@ export class Runner {
await this.page await this.page
?.goto('https://squashcity.baanreserveren.nl/auth/logout') ?.goto('https://squashcity.baanreserveren.nl/auth/logout')
.catch((e: Error) => { .catch((e: Error) => {
throw new RunnerLoginPasswordInputError(e) throw new RunnerLogoutError(e)
}) })
} }
@ -268,6 +275,8 @@ export class PuppeteerError extends RunnerError {}
export class PuppeteerBrowserLaunchError extends PuppeteerError {} export class PuppeteerBrowserLaunchError extends PuppeteerError {}
export class PuppeteerNewPageError extends PuppeteerError {} export class PuppeteerNewPageError extends PuppeteerError {}
export class RunnerNewSessionError extends RunnerError {}
export class RunnerLogoutError extends RunnerError {} export class RunnerLogoutError extends RunnerError {}
export class RunnerLoginNavigationError extends RunnerError {} export class RunnerLoginNavigationError extends RunnerError {}

View file

@ -32,7 +32,10 @@ describe('Reservation', () => {
test.each([ test.each([
{ reservationDate: dayjs().add(7, 'days'), expected: true }, { reservationDate: dayjs().add(7, 'days'), expected: true },
{ reservationDate: dayjs().add(1, 'days'), expected: true }, { reservationDate: dayjs().add(1, 'days'), expected: true },
{ reservationDate: dayjs().add(8, 'days').add(5, 'minutes'), expected: false }, {
reservationDate: dayjs().add(8, 'days').add(5, 'minutes'),
expected: false,
},
])( ])(
'will properly mark reservation availability according to date', 'will properly mark reservation availability according to date',
({ reservationDate, expected }) => { ({ reservationDate, expected }) => {