From a02e635bc7a3e2cabbcde4b6d49d85fb32c39a8d Mon Sep 17 00:00:00 2001 From: TurtIeSocks <58572875+TurtIeSocks@users.noreply.github.com> Date: Wed, 18 May 2022 18:39:49 -0400 Subject: [PATCH 1/2] available api - Adds an available api for checking and updating what's currently in memory or the database --- .gitignore | 1 + server/src/routes/api/v1/available.js | 117 ++++++++++++++++++++++++++ 2 files changed, 118 insertions(+) create mode 100644 server/src/routes/api/v1/available.js diff --git a/.gitignore b/.gitignore index 05d724b9e..e5652d1ab 100644 --- a/.gitignore +++ b/.gitignore @@ -32,6 +32,7 @@ server/src/strategies/* server/src/routes/api/v1/* !server/src/routes/api/v1/users.js !server/src/routes/api/v1/sessions.js +!server/src/routes/api/v1/available.js # custom model server/src/models/Custom.js diff --git a/server/src/routes/api/v1/available.js b/server/src/routes/api/v1/available.js new file mode 100644 index 000000000..21f15acff --- /dev/null +++ b/server/src/routes/api/v1/available.js @@ -0,0 +1,117 @@ +/* eslint-disable no-console */ +const path = require('path') +const router = require('express').Router() +const { api } = require('../../../services/config') +const { Db, Event } = require('../../../services/initialization') + +const queryObj = { + pokemon: { model: 'Pokemon', category: 'pokemon' }, + quests: { model: 'Pokestop', category: 'pokestops' }, + raids: { model: 'Gym', category: 'gyms' }, + nests: { model: 'Nest', category: 'nests' }, +} + +const resolveCategory = (category) => { + switch (category) { + case 'gym': + case 'gyms': + case 'raid': + case 'raids': return 'raids' + case 'pokestop': + case 'pokestops': + case 'quest': + case 'quests': return 'quests' + case 'pokemon': + case 'pokemons': return 'pokemon' + default: return 'all' + } +} + +const getAll = async (compare) => { + const available = compare + ? await Promise.all([ + Db.getAvailable('Pokemon'), + Db.getAvailable('Pokestop'), + Db.getAvailable('Gym'), + Db.getAvailable('Nest'), + ]) + : [ + Event.available.pokemon, + Event.available.pokestops, + Event.available.gyms, + Event.available.nests, + ] + return Object.fromEntries(Object.keys(queryObj).map((key, i) => [key, available[i]])) +} + +router.get('/:category', async (req, res) => { + const { model, category } = queryObj[resolveCategory(req.params.category)] || {} + const { current, equal } = req.query + try { + if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) { + if (model && category) { + const available = current !== undefined + ? await Db.getAvailable(model) + : Event.available[category] + available.sort((a, b) => a.localeCompare(b)) + + if (equal !== undefined) { + const compare = current !== undefined + ? Event.available[category] + : await Db.getAvailable(model) + compare.sort((a, b) => a.localeCompare(b)) + res.status(200).json(available.every((item, i) => item === compare[i])) + } else { + res.status(200).json(available) + } + } else { + const available = await getAll(current) + Object.values(available).forEach(c => c.sort((a, b) => a.localeCompare(b))) + + if (equal !== undefined) { + const compare = await getAll(!current) + Object.values(compare).forEach(c => c.sort((a, b) => a.localeCompare(b))) + + res.status(200).json(Object.keys(available).every(cat => ( + available[cat].every((item, j) => item === compare[cat][j]) + ))) + } else { + res.status(200).json(available) + } + } + } else { + throw new Error('Incorrect or missing API secret') + } + console.log(`[API] api/v1/${path.parse(__filename).name}`) + } catch (e) { + console.error(`[API Error] api/v1/${path.parse(__filename).name}`, e) + res.status(500).json({ status: 'ServerError', reason: e.message }) + } +}) + +router.put('/:category', async (req, res) => { + const { model, category } = queryObj[resolveCategory(req.params.category)] || {} + try { + if (api.reactMapSecret && req.headers['react-map-secret'] === api.reactMapSecret) { + if (model && category) { + await Event.setAvailable(category, model, Db) + } else { + await Promise.all([ + Event.setAvailable('pokemon', 'Pokemon', Db), + Event.setAvailable('pokestops', 'Pokestop', Db), + Event.setAvailable('gyms', 'Gym', Db), + Event.setAvailable('nests', 'Nest', Db), + ]) + } + res.status(200).json({ status: `updated availabled for ${category || 'all'}` }) + } else { + throw new Error('Incorrect or missing API secret') + } + console.log(`[API] api/v1/${path.parse(__filename).name} - updated availabled for ${category || 'all'}`) + } catch (e) { + console.error(`[API] api/v1/${path.parse(__filename).name}`, e) + res.status(500).json({ status: 'ServerError', reason: e.message }) + } +}) + +module.exports = router From ac8e51ed3a4c13dde2f4d7a2a9faa1672f276aba Mon Sep 17 00:00:00 2001 From: TurtIeSocks <58572875+TurtIeSocks@users.noreply.github.com> Date: Thu, 19 May 2022 17:33:41 -0400 Subject: [PATCH 2/2] Update available.js --- server/src/routes/api/v1/available.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/server/src/routes/api/v1/available.js b/server/src/routes/api/v1/available.js index 21f15acff..4fa62adfc 100644 --- a/server/src/routes/api/v1/available.js +++ b/server/src/routes/api/v1/available.js @@ -44,7 +44,7 @@ const getAll = async (compare) => { return Object.fromEntries(Object.keys(queryObj).map((key, i) => [key, available[i]])) } -router.get('/:category', async (req, res) => { +router.get(['/', '/:category'], async (req, res) => { const { model, category } = queryObj[resolveCategory(req.params.category)] || {} const { current, equal } = req.query try {