import fs from 'fs' import express from 'express' import bhttp from 'bhttp' import excel from '../../excel' // Create the router const swisstennis = express.Router() // Use this variable for the session const session = bhttp.session() function fileDate(date) { return `${ date.getFullYear()*10000 + (date.getMonth()+1)*100 + date.getDate() }${ date.getHours()*10000 + date.getMinutes()*100 + date.getSeconds() }` } /* * Define the Routes */ // Login swisstennis.post('/login', async (req, res) => { const { username, password } = req.body // return, if username or password are missing if (!username || !password) { res.status(400).json({ success: false, msg: 'Parameters username and password are required' }) return } // assemble the login data const loginData = { Lang: 'D', id: username, pwd: password, Tournament: '' } try { const myTournamentsPage = await session.get('https://comp.swisstennis.ch/advantage/servlet/MyTournamentList?Lang=D') const loginPage = await session.post('https://comp.swisstennis.ch/advantage/servlet/Login', loginData) const strLoginPage = loginPage.body.toString() if (strLoginPage.includes('Zugriff verweigert')) { res.status(400).json({ success: false, msg: 'Access denied!' }) return } } catch (error) { res.status(400).json({ success: false, msg: error }) return } res.json({ success: true, msg: 'Logged in successfully.' }) }) swisstennis.get('/tournaments', async (req, res) => { const tournaments = {} try { let match const myTournamentsPage = await session.get('https://comp.swisstennis.ch/advantage/servlet/MyTournamentList?Lang=D') const strMyTournamentsPage = myTournamentsPage.body.toString() if (strMyTournamentsPage.includes('Login-Zone')) { res.status(400).json({ success: false, message: 'Not logged in.' }) return } const tournamentRegexp = /([^<]+)<\/a>/gm do { match = tournamentRegexp.exec(strMyTournamentsPage) if (match) { tournaments[match[1]] = match[2] } } while (match) } catch (error) { res.status(400).json({ success: false, msg: error.toString() }) return } res.json({ success: true, tournaments }) }) swisstennis.get('/draws/:tournament', async (req, res) => { const { tournament } = req.params if (!tournament) { res.json({ success: false, msg: 'No tournament given.' }) return } try { let match const draws = {} const tournamentPage = await session.get(`https://comp.swisstennis.ch/advantage/servlet/ProtectedDisplayTournament?Lang=D&tournament=Id${tournament}`) const strTournamentPage = tournamentPage.body.toString() if (strTournamentPage.includes('Login-Zone')) { res.status(400).json({ success: false, message: 'Not logged in.' }) return } const drawRegexp = /([^<]+)<\/a>/gm do { match = drawRegexp.exec(strTournamentPage) if (match) { draws[match[1]] = match[2] } } while (match) res.json({ success: true, draws }) } catch (error) { res.status(400).json({ success: false, msg: error.toString() }) return } }) swisstennis.get('/download/playerlist/:tournament', async (req, res) => { const { tournament } = req.params if (!tournament) { res.json({ success: false, msg: 'No tournament given.' }) return } try { const playerListFile = fs.createWriteStream(`swisstennis_files/PlayerList-${fileDate(new Date())}.xls`) const playerList = await session.get(`https://comp.swisstennis.ch/advantage/servlet/PlayerList.xls?tournament=Id${tournament}&lang=D`, {stream: true}) playerList.pipe(playerListFile) res.json({ success: true, msg: 'Download successful.' }) } catch (error) { res.status(400).json({ success: false, msg: error.toString() }) return } }) swisstennis.get('/download/calendar/:tournament', async (req, res) => { const { tournament } = req.params if (!tournament) { res.json({ success: false, msg: 'No tournament given.' }) return } try { const calendarFile = fs.createWriteStream(`swisstennis_files/Calendar-${fileDate(new Date())}.xls`) const calendar = await session.get(`https://comp.swisstennis.ch/advantage/servlet/Calendar.xls?Lang=D&tournament=Id${tournament}&Type=Match&Inp_DateRangeFilter.fromDate=04.06.2018&Inp_DateRangeFilter.toDate=16.09.2018`, {stream: true}) calendar.pipe(calendarFile) res.json({ success: true, msg: 'Download successful.' }) } catch (error) { res.status(400).json({ success: false, msg: error.toString() }) return } }) swisstennis.get('/download/draw/:draw', async (req, res) => { const { draw } = req.params if (!draw) { res.json({ success: false, msg: 'No draw given.' }) return } try { const drawFile = fs.createWriteStream(`swisstennis_files/DisplayDraw${draw}-${fileDate(new Date())}.xls`) const drawDisplay = await session.get(`https://comp.swisstennis.ch/advantage/servlet/DisplayDraw.xls?eventId=${draw}&lang=D`, {stream: true}) drawDisplay.pipe(drawFile) res.json({ success: true, msg: 'Download successful.' }) } catch (error) { res.status(400).json({ success: false, msg: error.toString() }) return } }) function generatePlayerList (file) { return new Promise((resolve, reject) => { console.log('About to read the player list.') Excel.readWorkbook(file).then(worksheets => { console.log('got worksheets', worksheets) const worksheet = worksheets.Players if (worksheet[4].length !== 32 & worksheet[3][0] !== 'Konkurrenz' & worksheet[3][31] !== 'bezahlt') { reject(Error(`Wrong file structure. Length: ${worksheet[4].length} (expected 32), Column A name: ${worksheet[3][0]} (expected Konkurrenz)`)) } const headers = worksheet.slice(3, 1) const allPlayers = worksheet.slice(4, worksheet.length).map(playerData => new Player.Player(playerData)) resolve({ headers, allPlayers }) }).catch(error => { reject(Error(`Error reading workbook ${error.toString()}`)) }) }) } export default swisstennis