Implemented a way to easily respond render/json.
This commit is contained in:
parent
355c0ab670
commit
76d9ad836d
26
api/api.js
26
api/api.js
|
@ -1,26 +0,0 @@
|
||||||
import { Router } from 'express'
|
|
||||||
import playerApi from './players.js'
|
|
||||||
import mapApi from './maps.js'
|
|
||||||
import finishesApi from './finishes.js'
|
|
||||||
import graphApi from './graph.js'
|
|
||||||
|
|
||||||
const api = Router()
|
|
||||||
|
|
||||||
api.get(
|
|
||||||
'/',
|
|
||||||
(req, res) => res.json({
|
|
||||||
success: true,
|
|
||||||
response: "You connected to DDStats API! :D"
|
|
||||||
})
|
|
||||||
)
|
|
||||||
|
|
||||||
api.use('/players', playerApi)
|
|
||||||
api.use('/maps', mapApi)
|
|
||||||
api.use('/finishes', finishesApi)
|
|
||||||
api.use('/graph', graphApi)
|
|
||||||
|
|
||||||
/**
|
|
||||||
* This module is the entrypoint for the API.
|
|
||||||
* @module api/api
|
|
||||||
*/
|
|
||||||
export default api
|
|
|
@ -1,59 +0,0 @@
|
||||||
import { Router } from 'express'
|
|
||||||
import { sqlite } from '../libs/database/init.js'
|
|
||||||
import wrapper from '../libs/database/wrapper.js'
|
|
||||||
|
|
||||||
const finishApi = Router()
|
|
||||||
|
|
||||||
/* TODO: precalculate this */
|
|
||||||
finishApi.get(
|
|
||||||
'/count',
|
|
||||||
(req, res) => {
|
|
||||||
const finishes = sqlite.prepare(`SELECT COUNT(*) as count FROM race`).get()
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: finishes.count,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
finishApi.get(
|
|
||||||
'/finishedMaps/:player',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if player exists */
|
|
||||||
if(!wrapper.playerExists(req.params.player)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No such player!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const finishes = wrapper.finishedMaps(req.params.player)
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: finishes,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
finishApi.get(
|
|
||||||
'/unfinishedMaps/:player',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if player exists */
|
|
||||||
if(!wrapper.playerExists(req.params.player)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No such player!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const finishes = wrapper.unfinishedMaps(req.params.player)
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: finishes,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
|
|
||||||
export default finishApi
|
|
66
api/graph.js
66
api/graph.js
|
@ -1,66 +0,0 @@
|
||||||
import { Router } from 'express'
|
|
||||||
import { sqlite } from '../libs/database/init.js'
|
|
||||||
|
|
||||||
const graphApi = Router()
|
|
||||||
|
|
||||||
graphApi.get(
|
|
||||||
'/points',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if a query was provided */
|
|
||||||
if (!req.query.q) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No query ('host/path?q=query') provided!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
let player = req.query.q
|
|
||||||
|
|
||||||
const finishes = sqlite.prepare(
|
|
||||||
`
|
|
||||||
SELECT DISTINCT(a.map), a.date, b.points
|
|
||||||
FROM race AS a
|
|
||||||
INNER JOIN maps AS b
|
|
||||||
ON a.map = b.map
|
|
||||||
WHERE a.player = ?
|
|
||||||
GROUP BY a.map
|
|
||||||
ORDER BY a.date;
|
|
||||||
`)
|
|
||||||
let currentPoints = 0
|
|
||||||
let array = []
|
|
||||||
|
|
||||||
for (const finish of finishes.iterate(player)) {
|
|
||||||
currentPoints += finish.points
|
|
||||||
array.push({ t: new Date(finish.date), y: currentPoints })
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: array,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
graphApi.get(
|
|
||||||
'/map',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if a query was provided */
|
|
||||||
if (!req.query.q) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No query ('host/path?q=query') provided!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const finishes = sqlite.prepare(`SELECT * FROM graphRecordCache WHERE map = ? ORDER BY date`)
|
|
||||||
|
|
||||||
let array = []
|
|
||||||
for (const record of finishes.iterate(req.query.q))
|
|
||||||
array.push({ t: new Date(record.date), y: record.time, player: record.player})
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: array,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
export default graphApi
|
|
115
api/maps.js
115
api/maps.js
|
@ -1,115 +0,0 @@
|
||||||
import { Router } from 'express'
|
|
||||||
import { sqlite } from '../libs/database/init.js'
|
|
||||||
import wrapper, { map } from '../libs/database/wrapper.js'
|
|
||||||
|
|
||||||
const mapApi = Router()
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/count',
|
|
||||||
(req, res) => {
|
|
||||||
const totalMaps = sqlite.prepare(`SELECT COUNT(*) as count FROM maps`).get()
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: totalMaps.count,
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/get/:map',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if map exists */
|
|
||||||
if(!wrapper.mapExists(req.params.map)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No such map!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: map(req.params.map)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/getAll',
|
|
||||||
(req, res) => {
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: wrapper.allMaps()
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/category/:category',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if category exists */
|
|
||||||
if (!wrapper.categoryExists(req.params.category)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "Invalid category name!",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: wrapper.mapCategory(req.params.category)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/leaderboard/race/:map',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if map exists */
|
|
||||||
if (!wrapper.mapExists(req.params.map)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No such map!",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: wrapper.leaderboardRace(req.params.map, 1, 20)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/leaderboard/teamrace/:map',
|
|
||||||
(req, res) => {
|
|
||||||
/* Check if map exists */
|
|
||||||
if (!wrapper.mapExists(req.params.map)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No such map!",
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: wrapper.leaderboardTeamrace(req.params.map, 1, 20)
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
mapApi.get(
|
|
||||||
'/search',
|
|
||||||
async (req, res) => {
|
|
||||||
/* Check if a query was provided */
|
|
||||||
if (!req.query.q) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No query ('host/path?q=query') provided!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
/* TODO: Use the searcher function */
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
export default mapApi
|
|
|
@ -1,57 +0,0 @@
|
||||||
import { Router } from 'express'
|
|
||||||
import wrapper from '../libs/database/wrapper.js'
|
|
||||||
|
|
||||||
const playerApi = Router()
|
|
||||||
|
|
||||||
playerApi.get(
|
|
||||||
'/get/:player',
|
|
||||||
async (req, res) => {
|
|
||||||
/* Check if player exists */
|
|
||||||
if(!wrapper.playerExists(req.params.player)) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No such player!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
const data = wrapper.player(req.params.player)
|
|
||||||
|
|
||||||
return res.json({
|
|
||||||
success: true,
|
|
||||||
response: data
|
|
||||||
})
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
playerApi.get(
|
|
||||||
'/search',
|
|
||||||
async (req, res) => {
|
|
||||||
if (!req.query.q) {
|
|
||||||
return res.json({
|
|
||||||
success: false,
|
|
||||||
response: "No query ('?q=query') provided!"
|
|
||||||
})
|
|
||||||
}
|
|
||||||
|
|
||||||
searcher(
|
|
||||||
'points',
|
|
||||||
'player',
|
|
||||||
`%${req.query.q}%`,
|
|
||||||
req.query.sort ?? undefined,
|
|
||||||
req.query.order === "asc",
|
|
||||||
"all",
|
|
||||||
req.query.page
|
|
||||||
).then(
|
|
||||||
player => res.json({
|
|
||||||
success: true,
|
|
||||||
response: player
|
|
||||||
})
|
|
||||||
).catch(
|
|
||||||
error => res.json({
|
|
||||||
success: false,
|
|
||||||
response: error
|
|
||||||
})
|
|
||||||
)
|
|
||||||
}
|
|
||||||
)
|
|
||||||
|
|
||||||
export default playerApi
|
|
3
index.js
3
index.js
|
@ -10,7 +10,6 @@ import njk from 'nunjucks'
|
||||||
|
|
||||||
import initLog from './libs/utils/log.js'
|
import initLog from './libs/utils/log.js'
|
||||||
import routes from './routes/routes.js'
|
import routes from './routes/routes.js'
|
||||||
import api from './api/api.js'
|
|
||||||
|
|
||||||
import { generateDB } from './libs/database/generate.js'
|
import { generateDB } from './libs/database/generate.js'
|
||||||
import { dbInit } from './libs/database/init.js'
|
import { dbInit } from './libs/database/init.js'
|
||||||
|
@ -40,7 +39,7 @@ njk.configure(
|
||||||
)
|
)
|
||||||
|
|
||||||
Server.use('/', routes)
|
Server.use('/', routes)
|
||||||
Server.use('/api', api)
|
Server.use('/api', routes)
|
||||||
Server.use('/assets', express.static('static'))
|
Server.use('/assets', express.static('static'))
|
||||||
|
|
||||||
Server.listen(process.env.PORT ?? 12345, () => log(`Server started and listening on port ${process.env.PORT}.`))
|
Server.listen(process.env.PORT ?? 12345, () => log(`Server started and listening on port ${process.env.PORT}.`))
|
||||||
|
|
10
libs/routex.js
Normal file
10
libs/routex.js
Normal file
|
@ -0,0 +1,10 @@
|
||||||
|
export default function routex(req, res) {
|
||||||
|
if (req.baseUrl === "/api")
|
||||||
|
return function(_, data, _2) {
|
||||||
|
res.json(data)
|
||||||
|
}
|
||||||
|
|
||||||
|
return function(template, data, options) {
|
||||||
|
res.render(template, { data, options })
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,10 +1,13 @@
|
||||||
import { Router } from 'express'
|
import { Router } from 'express'
|
||||||
|
import routex from '../libs/routex.js'
|
||||||
|
|
||||||
const routes = Router()
|
const routes = Router()
|
||||||
|
|
||||||
routes.get(
|
routes.get(
|
||||||
'/',
|
'/',
|
||||||
(req, res) => res.render('pages/landing.njk', {currentSection: "maps"})
|
(req, res) => {
|
||||||
|
routex(req, res)('pages/landing.njk', null, { currentSection: null })
|
||||||
|
}
|
||||||
)
|
)
|
||||||
|
|
||||||
export default routes
|
export default routes
|
|
@ -1,7 +1,7 @@
|
||||||
<nav>
|
<nav>
|
||||||
<div class="logo"></div>
|
<div class="logo"></div>
|
||||||
|
|
||||||
<a href="/maps" class="{{ "current" if currentSection == "maps" }}">Maps</a>
|
<a href="/maps" class="{{ "current" if options.currentSection == "maps" }}">Maps</a>
|
||||||
<a href="/leaderboards" class="{{ "current" if currentSection == "leaderboards" }}">Leaderboards</a>
|
<a href="/leaderboards" class="{{ "current" if options.currentSection == "leaderboards" }}">Leaderboards</a>
|
||||||
<a href="/tournaments" class="{{ "current" if currentSection == "tournaments" }}">Tournaments</a>
|
<a href="/tournaments" class="{{ "current" if options.currentSection == "tournaments" }}">Tournaments</a>
|
||||||
</nav>
|
</nav>
|
Loading…
Reference in New Issue
Block a user