From 6238cdd6db725a68252246f6aef16f72969d4f76 Mon Sep 17 00:00:00 2001 From: James Ketrenos Date: Sat, 9 Apr 2022 16:59:20 -0700 Subject: [PATCH] Group and Location fetching hooked into Groups / Locations Signed-off-by: James Ketrenos --- client/src/Group.js | 44 ++++++++++++++++++++++++++------ client/src/Location.js | 6 ++++- server/app.js | 2 ++ server/routes/groups.js | 51 +++++++++++++++++++++++--------------- server/routes/locations.js | 1 + 5 files changed, 76 insertions(+), 28 deletions(-) diff --git a/client/src/Group.js b/client/src/Group.js index 5fcc014..6184c9e 100644 --- a/client/src/Group.js +++ b/client/src/Group.js @@ -11,9 +11,10 @@ import { base } from "./Common.js"; import { Location } from "./Location.js"; function Group() { - const { csrfToken, user, setUser } = useContext(GlobalContext); + const { csrfToken, user } = useContext(GlobalContext); const groupId = useParams().group; - const [ group, setGroup ] = useState(null); + const [ group, setGroup ] = useState(undefined); + const [ events, setEvents ] = useState(null); const [ error, setError ] = useState(null); const [ locations, setLocations ] = useState([]); @@ -46,7 +47,6 @@ function Group() { effect(); }, [user, setGroup, groupId, csrfToken]); - useEffect(() => { if (!user || !groupId || !csrfToken) { return; @@ -71,7 +71,36 @@ function Group() { if (!data) { return; } - setGroup(data); + setEvents(data); + }; + effect(); + }, [user, setEvents, groupId, csrfToken]); + + useEffect(() => { + if (!user || !groupId || !csrfToken) { + return; + } + + const effect = async () => { + const res = await window.fetch( + `${base}/api/v1/groups/${groupId}`, { + method: 'GET', + cache: 'no-cache', + credentials: 'same-origin', + headers: { + 'Content-Type': 'application/json', + 'CSRF-Token': csrfToken + } + }); + const data = await res.json(); + if (res.status >= 400) { + setError(data.message ? data.message : res.statusText); + return; + } + if (!data) { + return; + } + setGroup(data[0]); }; effect(); }, [user, setGroup, groupId, csrfToken]); @@ -79,11 +108,12 @@ function Group() { return ( { error &&
{error}
} - { !error && <> -
Group: {groupId}
+ { !error && group && <> +
{group.name}
Locations
{ locations.map(location => ) } diff --git a/client/src/Location.js b/client/src/Location.js index 0432871..3664307 100644 --- a/client/src/Location.js +++ b/client/src/Location.js @@ -104,6 +104,7 @@ function Location(props) { { typeof location[field] === 'string' && !location[field].match(/^http.*/) && location[field] } + { typeof location[field] === 'number' && location[field]} } ); @@ -133,7 +134,10 @@ function Location(props) { return ( { error &&
{error}
} { !error && <> diff --git a/server/app.js b/server/app.js index b0caf83..b0b4534 100755 --- a/server/app.js +++ b/server/app.js @@ -39,6 +39,8 @@ app.use(session({ })); const csrfDebug = (req) => { + return; + // eslint-disable-next-line no-unreachable console.log('CSRF debug: ', { method: req.method, path: req.path, diff --git a/server/routes/groups.js b/server/routes/groups.js index 35f71d3..684f0cd 100755 --- a/server/routes/groups.js +++ b/server/routes/groups.js @@ -1,20 +1,35 @@ const express = require('express'), router = express.Router(); -router.get('/', async (req, res/*, next*/) => { - return res.status(200).send( - [ { - id: 1, - ownerId: 1, - name: 'Beer Tuesday', - group: 'beer-tuesday', - nextEvent: Date.now() + 86400 * 14 * 1000 /* 2 weeks from now */ - } ] - ); +const originalGroups = [ { + id: 1, + ownerId: 1, + name: 'Beer Tuesday', + group: 'beer-tuesday', + nextEvent: Date.now() + 86400 * 14 * 1000 /* 2 weeks from now */ +} ]; + +router.get('/:group?', async (req, res/*, next*/) => { + const { group } = req.params; + if (!group) { + return res.status(200).send(originalGroups); + } + const found = originalGroups.find((item) => { + if (typeof group === 'number') { + return item.id === group; + } + if (typeof group === 'string') { + return item.group === group; + } + return false; + }); + if (!found) { + return res.status(404).send({ message: `Unable to find ${group}.`}); + } + return res.status(200).send([ found ]); }); - -router.get('/:groupId/events', async (req, res/*, next*/) => { +router.get('/:group/events', async (req, res/*, next*/) => { return res.status(200).send( [{ id: 1, @@ -24,17 +39,13 @@ router.get('/:groupId/events', async (req, res/*, next*/) => { ); }); -router.post('/:groupId', async (req, res) => { - const { groupId } = req.params; - if (!groupId) { +router.post('/:group', async (req, res) => { + const { group } = req.params; + if (!group) { return res.status(400).send({ message: `Invalid group.`}); } - const group = { - id: groupId - }; - - return res.status(200).send({ id: group.id }); + return res.status(200).send({ id: group }); }); diff --git a/server/routes/locations.js b/server/routes/locations.js index f2c438b..ec1841b 100644 --- a/server/routes/locations.js +++ b/server/routes/locations.js @@ -5,6 +5,7 @@ const express = require('express'); const router = express.Router(); const originalLocations = require('../location-data.js'); +originalLocations.forEach((item, index) => item.id = index + 1); router.put('/', (req, res) => { const location = req.body;