]> git.cworth.org Git - empires-server/commitdiff
empathy: Better separation of concerns between routes and game class
authorCarl Worth <cworth@cworth.org>
Tue, 9 Jun 2020 15:03:58 +0000 (08:03 -0700)
committerCarl Worth <cworth@cworth.org>
Tue, 9 Jun 2020 15:03:58 +0000 (08:03 -0700)
In this commit we make the route handlers much simpler: Their job is
to parse data from the received request and provide a response to the
client, (such as an appropriate status code), but otherwise, the meat
of the functionality is provided by methods on the Empathy class).

This separation should lead to more maintainable code as the
implementations on both sides are smaller and more focused on a single
job.

empathy.js

index 6fc926ff83b56991e22dde9ad4ad5635852601d1..7a75b71ecdd12a071945cdb89c0a8530cf38ce94 100644 (file)
@@ -9,6 +9,32 @@ class Empathy extends Game {
     };
     this.next_prompt_id = 1;
   }
+
+  add_prompt(items, prompt_string) {
+    const prompt = new Prompt(this.next_prompt_id, items, prompt_string);
+    this.next_prompt_id++;
+
+    this.state.prompts.push(prompt);
+
+    this.broadcast_event_object('prompt', prompt);
+
+    return prompt;
+  }
+
+  /* Returns true if vote toggled, false for player or prompt not found */
+  toggle_vote(prompt_id, session_id) {
+    const player = this.players_by_session[session_id];
+
+    const prompt = this.state.prompts.find(p => p.id === prompt_id);
+    if (! prompt || ! player)
+      return false;
+
+    prompt.toggle_vote(player.name);
+
+    this.broadcast_event_object('prompt', prompt);
+
+    return true;
+  }
 }
 
 Empathy.router = express.Router();
@@ -33,32 +59,17 @@ class Prompt {
 router.post('/prompts', (request, response) => {
   const game = request.game;
 
-  const prompt = new Prompt(game.next_prompt_id,
-                            request.body.items,
-                            request.body.prompt);
-  game.next_prompt_id++;
-
-  game.state.prompts.push(prompt);
-
-  game.broadcast_event_object('prompt', prompt);
+  game.add_prompt(request.body.items, request.body.prompt);
 });
 
 router.post('/vote/:prompt_id([0-9]+)', (request, response) => {
-  const prompt_id = parseInt(request.params.prompt_id, 10);
   const game = request.game;
-  const player = game.players_by_session[request.session.id];
+  const prompt_id = parseInt(request.params.prompt_id, 10);
 
-  prompt = game.state.prompts.find(p => p.id === prompt_id);
-  if (! prompt || ! player) {
+  if (game.toggle_vote(prompt_id, request.session.id))
+    response.sendStatus(200);
+  else
     response.sendStatus(404);
-    return;
-  }
-
-  prompt.toggle_vote(player.name);
-
-  game.broadcast_event_object('prompt', prompt);
-
-  response.sendStatus(200);
 });
 
 Empathy.meta = {