From 35586315c0c8437035447bd3bcbd6dab3f7671c6 Mon Sep 17 00:00:00 2001
From: Aymeric Bernard <aymeric.bernard@student.ecp.fr>
Date: Tue, 10 Apr 2018 18:12:44 +0200
Subject: [PATCH] [Badge] Badge can trigger frontend refresh with user info

---
 scripts/nfc-poll-wrapper.sh |  2 +-
 server/index.js             | 62 ++++++++++++++++++++++++-------------
 server/utils.js             |  2 +-
 3 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/scripts/nfc-poll-wrapper.sh b/scripts/nfc-poll-wrapper.sh
index 384a9e7..21ef17e 100755
--- a/scripts/nfc-poll-wrapper.sh
+++ b/scripts/nfc-poll-wrapper.sh
@@ -7,8 +7,8 @@ do
   then
     echo $res
     echo "11ff11 0.2" > /dev/rgb_pipe
+    sleep 1
   else
     echo "ff1111 0.2" > /dev/rgb_pipe
   fi
-  sleep 1
 done
diff --git a/server/index.js b/server/index.js
index 7efe6a4..39c74b0 100644
--- a/server/index.js
+++ b/server/index.js
@@ -4,36 +4,45 @@ const {
   uuid, fontSize, rowHeight, port, api,
 } = require('./config');
 
-const dummyResponse = require('./dummyResponse.json');
-
 const io = require('socket.io')(port || 3000);
 const { createSignedJWT, interval } = require('./utils');
 
+const { spawn } = require('child_process');
+
+const dummyResponse = require('./dummyResponse.json');
+
 const useDummy = false;
 
+
+const doScreenApiRequest = (socket, userid = null) => {
+  const query = userid ? `?userid=${userid}` : '';
+  return fetch(`${api.url}/${api.version}/screen/${uuid}${query}`, {
+    headers: {
+      Autorization: `Bearer ${createSignedJWT()}`,
+    },
+  })
+    .then(rawRes => rawRes.json())
+    .then((res) => {
+      socket.emit('panel_data', res);
+      return res.ttl;
+    })
+    .catch(console.log);
+};
+
+
+const setChrono = (socket) => {
+  if (useDummy) {
+    return interval(() => socket.emit('panel_data', dummyResponse), 0);
+  }
+  return interval(() => doScreenApiRequest(socket), 0);
+};
+
+
 io.of('/').on('connection', (socket) => {
   socket.emit('config', { fontSize, rowHeight });
 
-  const chrono = useDummy
-    ? interval(() => {
-      socket.emit('panel_data', dummyResponse);
-      return 15000;
-    }, 0)
-    : interval(
-      () =>
-        fetch(`${api.url}/${api.version}/screen/${uuid}`, {
-          headers: {
-            Autorization: `Bearer ${createSignedJWT()}`,
-          },
-        })
-          .then(rawRes => rawRes.json())
-          .then((res) => {
-            socket.emit('panel_data', res);
-            return res.ttl;
-          })
-          .catch(console.log),
-      0,
-    );
+  const chrono = setChrono(socket);
+  chrono.start();
 
   // Respond to date message with the date
   socket.on('date', () => {
@@ -43,4 +52,13 @@ io.of('/').on('connection', (socket) => {
   socket.on('disconnect', () => {
     chrono.stop();
   });
+
+  const badgeChild = spawn('scripts/nfc-poll-wrapper-dummy.sh');
+
+  badgeChild.stdout.on('data', (data0) => {
+    const userid = data0.toString().trim();
+    console.log(`child stdout: ${userid}`);
+
+    doScreenApiRequest(socket, userid).then(ttl => chrono.restart(ttl));
+  });
 });
diff --git a/server/utils.js b/server/utils.js
index ebc1057..424c9f0 100644
--- a/server/utils.js
+++ b/server/utils.js
@@ -56,12 +56,12 @@ const interval = (fn, initialTTL, output = {}) => {
         Object.assign(output, getOutput(getTimeout(0)));
         return output;
       },
+      stop,
       restart: (ttl) => {
         stop();
         Object.assign(output, getOutput(getTimeout(ttl || initialTTL)));
         return output;
       },
-      stop,
       restartNow: () => {
         stop();
         Object.assign(output, getOutput(getTimeout(0)));
-- 
GitLab