diff --git a/app.js b/app.js index c7e6bba..0a5af08 100644 --- a/app.js +++ b/app.js @@ -61,47 +61,58 @@ app.use('/graphql', graphqlHTTP({ })); app.listen(config.port || 4000); +console.log(`Running a GraphQL API server at localhost:${config.port || 4000}/graphql`); // CHECK LOOP (async function () { await loop(); for await (const time of setInterval(config.checkperiod * 1000)) { - //console.log("Checking for spaces..."); await loop(); } })(); async function loop() { + console.log(new Date(), "Checking for spaces..."); + let changecount = 0; for (const space of spaces) { //console.log(`Checking ${space.id}...`); - let o = await checkSpace(space); + let response = await checkSpace(space); //console.log(`Space ${space.id} is ${o ? "open" : "closed"}`); - if (typeof o === "undefined") { continue; } - if (o !== cache.get(space.id)) { - cache.set(space.id, o); + if (typeof response.open === "undefined") { + console.error(`The space ${space.id} might not be reachable. Please check the endpoint.`); + continue; + } + if (JSON.stringify(response) != JSON.stringify(cache.get(space.id))) { + cache.set(space.id, response); let update = await prisma.space.upsert({ where: { id: space.id }, - update: { open: o }, - create: { id: space.id, open: o, name: space.name } + update: { open: response.open, lastChange: response.lastchange }, + create: { id: space.id, open: response.open, lastChange: response.lastchange, name: space.name } }); + changecount++; } } + console.log(new Date(), "Check complete, updated", changecount, "spaces."); } // HELPER FUNCTIONS async function checkSpace(space) { let response, data, open; + let lastchange = null; try { response = await fetch(space.endpoint); data = await response.json(); } catch (e) { console.error(`The space ${space.id} might not be reachable. Please check the endpoint. Error: ${e}`); } if (!space.path) { - try { open = data.state.open; } + try { + open = data.state.open; + lastchange = new Date(data.state.lastchange*1000); + } catch { console.error(`The space ${space.id} is not using the SpaceAPI standard. Please specify a path.`); } } else { try { open = (jp.query(data, space.path) == (space.expected ? space.expected : true)); } catch { console.error(`The space ${space.id} has an invalid JSONPath to the target value. Please use https://jsonpath.com/ to evaluate the path.`); } } - return open; + return { open, lastchange }; } \ No newline at end of file