]> git.cworth.org Git - lmno-server/blob - server.js
Add simple testing for the entire API
[lmno-server] / server.js
1 const express = require("express")
2 const body_parser = require("body-parser");
3
4 const app = express();
5
6 class Game {
7   constructor() {
8     this._players = [];
9     this.next_player_id = 1;
10   }
11
12   add_player(name, character) {
13     this._players.push({id: this.next_player_id,
14                        name: name,
15                        character: character,
16                        captures: [],
17                       })
18     this.next_player_id++;
19   }
20
21   remove_player(id) {
22     const index = this._players.findIndex(player => player.id === id);
23     this._players.splice(index, 1);
24   }
25
26   remove_all_players() {
27     this._players = [];
28     this.next_player_id = 1;
29   }
30
31   capture(captor_id, captee_id) {
32     /* TODO: Fix to fail on already-captured players (or to move the
33      * captured player from an old captor to a new—need to clarify in
34      * the API specification which we want here. */
35     let captor = this._players.find(player => player.id === captor_id);
36     captor.captures.push(captee_id);
37   }
38
39   liberate(captee_id) {
40     let captor = this._players.find(player => player.captures.includes(captee_id));
41     captor.captures.splice(captor.captures.indexOf(captee_id), 1);
42   }
43
44   restart() {
45     for (const player of this._players) {
46       player.captures = [];
47     }
48   }
49
50   get characters() {
51     return this._players.map(player => player.character);
52   }
53
54   get empires() {
55     return this._players.map(player => ({id: player.id, captures: player.captures}));
56   }
57
58   get players() {
59     return this._players.map(player => ({id: player.id, name: player.name }));
60   }
61 }
62
63 game = new Game();
64
65 app.use(body_parser.urlencoded({ extended: false }));
66 app.use(body_parser.json());
67
68 app.get('/', (request, response) => {
69   response.send('Hello World!');
70 });
71
72 app.post('/register', (request, response) => {
73   game.add_player(request.body.name, request.body.character);
74   response.send();
75 });
76
77 app.post('/deregister/:id', (request, response) => {
78   game.remove_player(parseInt(request.params.id));
79   response.send();
80 });
81
82 app.post('/reset', (request, response) => {
83   game.remove_all_players();
84   response.send();
85 });
86
87 app.post('/capture/:captor/:captee', (request, response) => {
88   game.capture(parseInt(request.params.captor), parseInt(request.params.captee));
89   response.send();
90 });
91
92 app.post('/liberate/:id', (request, response) => {
93   game.liberate(parseInt(request.params.id));
94   response.send();
95 });
96
97 app.post('/restart', (request, response) => {
98   game.restart(parseInt(request.params.id));
99     response.send();
100 });
101
102 app.get('/characters', (request, response) => {
103   response.send(game.characters);
104 });
105
106 app.get('/empires', (request, response) => {
107   response.send(game.empires);
108 });
109
110 app.get('/players', (request, response) => {
111   response.send(game.players);
112 });
113
114 app.listen(3000, function () {
115   console.log('Example app listening on port 3000!');
116 });