Adding proxy to find members
This commit is contained in:
parent
4bb532b281
commit
1abaa934b0
4 changed files with 137 additions and 0 deletions
|
|
@ -9,6 +9,7 @@ import { EmailModule } from './email/module'
|
||||||
import { LoggerMiddleware } from './logger/middleware'
|
import { LoggerMiddleware } from './logger/middleware'
|
||||||
import { LoggerModule } from './logger/module'
|
import { LoggerModule } from './logger/module'
|
||||||
import { DatabaseLoggerService } from './logger/service.database_logger'
|
import { DatabaseLoggerService } from './logger/service.database_logger'
|
||||||
|
import { MembersModule } from './members/module'
|
||||||
import { NtfyModule } from './ntfy/module'
|
import { NtfyModule } from './ntfy/module'
|
||||||
import { RecurringReservationsModule } from './recurringReservations/module'
|
import { RecurringReservationsModule } from './recurringReservations/module'
|
||||||
import { ReservationsModule } from './reservations/module'
|
import { ReservationsModule } from './reservations/module'
|
||||||
|
|
@ -55,6 +56,7 @@ import { WaitingListModule } from './waitingList/module'
|
||||||
RunnerModule,
|
RunnerModule,
|
||||||
LoggerModule,
|
LoggerModule,
|
||||||
EmailModule,
|
EmailModule,
|
||||||
|
MembersModule,
|
||||||
WaitingListModule,
|
WaitingListModule,
|
||||||
NtfyModule,
|
NtfyModule,
|
||||||
],
|
],
|
||||||
|
|
|
||||||
17
src/members/controller.ts
Normal file
17
src/members/controller.ts
Normal file
|
|
@ -0,0 +1,17 @@
|
||||||
|
import { Controller, Get, Inject, Query } from '@nestjs/common'
|
||||||
|
|
||||||
|
import { MembersService } from './service'
|
||||||
|
|
||||||
|
@Controller('members')
|
||||||
|
export class MembersController {
|
||||||
|
constructor(
|
||||||
|
@Inject(MembersService)
|
||||||
|
private readonly membersService: MembersService,
|
||||||
|
) {}
|
||||||
|
|
||||||
|
@Get()
|
||||||
|
async getMembers(@Query('name') name?: string) {
|
||||||
|
if (name == null || name.length == 0) return []
|
||||||
|
return await this.membersService.findMembers(name)
|
||||||
|
}
|
||||||
|
}
|
||||||
13
src/members/module.ts
Normal file
13
src/members/module.ts
Normal file
|
|
@ -0,0 +1,13 @@
|
||||||
|
import { Module } from '@nestjs/common'
|
||||||
|
import { ConfigModule } from '@nestjs/config'
|
||||||
|
|
||||||
|
import { LoggerModule } from '../logger/module'
|
||||||
|
import { MembersController } from './controller'
|
||||||
|
import { MembersService } from './service'
|
||||||
|
|
||||||
|
@Module({
|
||||||
|
imports: [LoggerModule, ConfigModule],
|
||||||
|
providers: [MembersService],
|
||||||
|
controllers: [MembersController],
|
||||||
|
})
|
||||||
|
export class MembersModule {}
|
||||||
105
src/members/service.ts
Normal file
105
src/members/service.ts
Normal file
|
|
@ -0,0 +1,105 @@
|
||||||
|
import { Inject, Injectable } from '@nestjs/common'
|
||||||
|
import { ConfigService } from '@nestjs/config'
|
||||||
|
import { Axios } from 'axios'
|
||||||
|
import { stringify } from 'querystring'
|
||||||
|
|
||||||
|
import { LoggerService } from '../logger/service.logger'
|
||||||
|
|
||||||
|
export class Member {
|
||||||
|
id: string
|
||||||
|
name: string
|
||||||
|
|
||||||
|
constructor(id: number, name: string) {
|
||||||
|
this.id = `${id}`
|
||||||
|
this.name = name
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
interface MembersResponse {
|
||||||
|
members: [number, string][]
|
||||||
|
count: number
|
||||||
|
max: number
|
||||||
|
total: number
|
||||||
|
queries: unknown[]
|
||||||
|
}
|
||||||
|
|
||||||
|
@Injectable()
|
||||||
|
export class MembersService {
|
||||||
|
private readonly membersClient: Axios
|
||||||
|
private sessionCookie: string
|
||||||
|
constructor(
|
||||||
|
@Inject(LoggerService)
|
||||||
|
private readonly loggerService: LoggerService,
|
||||||
|
|
||||||
|
@Inject(ConfigService)
|
||||||
|
private readonly configService: ConfigService,
|
||||||
|
) {
|
||||||
|
this.sessionCookie = this.generateSessionCookie()
|
||||||
|
this.membersClient = new Axios({
|
||||||
|
baseURL: 'https://squashcity.baanreserveren.nl/',
|
||||||
|
headers: {
|
||||||
|
Accept: 'application/json',
|
||||||
|
Cookie: this.sessionCookie,
|
||||||
|
},
|
||||||
|
})
|
||||||
|
}
|
||||||
|
|
||||||
|
private generateSessionCookie(): string {
|
||||||
|
const length = 26
|
||||||
|
const acceptedChars = 'abcdefghijklmnopqrstuvwxyz0123456789'
|
||||||
|
let sessionCookie = `PHPSESSID=`
|
||||||
|
for (let i = 0; i < length; i++) {
|
||||||
|
sessionCookie +=
|
||||||
|
acceptedChars[Math.floor(Math.random() * acceptedChars.length)]
|
||||||
|
}
|
||||||
|
return sessionCookie
|
||||||
|
}
|
||||||
|
|
||||||
|
private sanitizeName(name: string): string {
|
||||||
|
const memberIdRegex = /\(P[0-9]+\)/
|
||||||
|
return name.replace(memberIdRegex, '').trim()
|
||||||
|
}
|
||||||
|
|
||||||
|
private async login(): Promise<void> {
|
||||||
|
const username = this.configService.getOrThrow<string>(
|
||||||
|
'BAANRESERVEREN_USERNAME',
|
||||||
|
)
|
||||||
|
const password = this.configService.getOrThrow<string>(
|
||||||
|
'BAANRESERVEREN_PASSWORD',
|
||||||
|
)
|
||||||
|
|
||||||
|
await this.membersClient.post(
|
||||||
|
'/auth/login',
|
||||||
|
stringify({ username, password }),
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/x-www-form-urlencoded',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
async findMembers(query: string, redirected = false): Promise<Member[]> {
|
||||||
|
this.loggerService.debug('Finding members', { query })
|
||||||
|
const response = await this.membersClient.get<string>(
|
||||||
|
'/members/find/ajax',
|
||||||
|
{
|
||||||
|
headers: {
|
||||||
|
Accept: 'text/html',
|
||||||
|
},
|
||||||
|
params: { query },
|
||||||
|
maxRedirects: 0,
|
||||||
|
},
|
||||||
|
)
|
||||||
|
if (!redirected && response.status >= 300 && response.status < 400) {
|
||||||
|
this.loggerService.log('Not logged in, logging in and re-requesting')
|
||||||
|
await this.login()
|
||||||
|
return await this.findMembers(query, true)
|
||||||
|
}
|
||||||
|
const jsonData: MembersResponse = JSON.parse(response.data)
|
||||||
|
this.loggerService.debug('Found members', { ...jsonData })
|
||||||
|
return jsonData.members.map(
|
||||||
|
([id, name]) => new Member(id, this.sanitizeName(name)),
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
Loading…
Add table
Reference in a new issue