From 1b9bc10f0b1cac51861208bcdd5ec43e83b9f40d Mon Sep 17 00:00:00 2001
From: schneefux
Date: Tue, 4 Apr 2017 17:08:58 +0200
Subject: use db connection in update API
---
index.html | 104 +++++++++++++++++++++++++++++------------------------------
package.json | 1 -
server.js | 49 ++++++++++++++++++++--------
3 files changed, 87 insertions(+), 67 deletions(-)
diff --git a/index.html b/index.html
index 1a5afe7..e542138 100644
--- a/index.html
+++ b/index.html
@@ -4,10 +4,19 @@
Vainsocial backend status
-
+
+
+
+
+
+
@@ -23,66 +32,55 @@
// http fallback
client = webstomp.over(SockJS("http://localhost:15674/stomp"));
}
- // connect
- client.connect("web", "web", () => {
- $("#updates").append(
- $("")
- .text("connected to socket")
- .css("color", "purple")
- );
- }, (err) => {
+
+ let notif = (text, color) => {
$("#updates").append(
$("")
- .text("error connecting to socket: " + JSON.stringify(err))
- .css("color", "red")
+ .text(text)
+ .css("color", color)
);
- });
+ };
- $("#update-form").submit((e) => {
- let name = $("input:first").val();
+ // connect
+ client.connect("web", "web", () => notif("connected to socket", "purple"),
+ (err) => notif("error connecting to socket: " + JSON.stringify(err), "red"));
+
+ let subscribe = (name) => {
// subscribe
client.subscribe("/topic/player." + name, (msg) => {
- $("#updates").append(
- $("")
- .text(msg.body)
- .css("color", "grey")
- );
-
- if (msg.body == "search_fail") {
- $("#updates").append(
- $("")
- .text(name + ": not found")
- .css("color", "red")
- );
+ notif(msg.body, "grey");
+ switch (msg.body) {
+ case "search_fail":
+ notif(name + ": not found", "red"); break;
+ case "search_success":
+ notif(name + ": found", "green"); break;
+ case "matches_update":
+ notif(name + ": new match(es) available", "orange"); break;
+ case "stats_update":
+ notif(name + ": player profile stats updated", "orange"); break;
}
- if (msg.body == "search_success") {
- $("#updates").append(
- $("")
- .text(name + ": found")
- .css("color", "green")
- );
- }
- if (msg.body == "matches_update") {
- $("#updates").append(
- $("")
- .text(name + ": new match(es) available")
- .css("color", "orange")
- );
- }
- if (msg.body == "stats_update") {
- $("#updates").append(
- $("")
- .text(name + ": player profile stats updated")
- .css("color", "orange")
- );
- }
-
msg.ack();
}, {"ack": "client"});
+ }
- // POST
- $.post("/api/player/" + name + "/search");
+ $("#update-form").submit((e) => {
+ e.preventDefault();
+ let ign = $("#update-name").val(),
+ force = $("#update-force").is(":checked");
+
+ subscribe(ign);
+ if (force) {
+ $.post("/api/player/" + ign + "/search");
+ } else {
+ $.post("/api/player/" + ign + "/update");
+ }
+ });
+ $("#update-random-form").submit((e) => {
e.preventDefault();
+ $.post("/api/player").done((resp) => {
+ notif(resp.name + ": random user", "green");
+ subscribe(resp.name);
+ });
});
diff --git a/package.json b/package.json
index 599b0e8..ba590fe 100644
--- a/package.json
+++ b/package.json
@@ -5,7 +5,6 @@
"main": "server.js",
"dependencies": {
"amqplib": "^0.5.1",
- "body-parser": "^1.17.1",
"express": "^4.15.2",
"http": "^0.0.0",
"mysql": "^2.13.0",
diff --git a/server.js b/server.js
index 4a0ec4c..b58ee5b 100644
--- a/server.js
+++ b/server.js
@@ -2,19 +2,19 @@
/* jshint esnext: true */
var amqp = require("amqplib"),
+ Seq = require("sequelize"),
request = require("request-promise"),
express = require("express"),
- bodyparser = require("body-parser"),
http = require("http"),
sleep = require("sleep-promise");
var MADGLORY_TOKEN = process.env.MADGLORY_TOKEN,
+ DATABASE_URI = process.env.DATABASE_URI,
RABBITMQ_URI = process.env.RABBITMQ_URI || "amqp://localhost",
REGIONS = ["na", "eu", "sg", "sa", "ea"];
if (MADGLORY_TOKEN == undefined) throw "Need an API token";
-var rabbit,
- ch,
+var rabbit, ch, seq,
app = express(),
server = http.Server(app);
@@ -22,24 +22,25 @@ var rabbit,
(async () => {
while (true) {
try {
+ seq = new Seq(DATABASE_URI, { logging: () => {} });
rabbit = await amqp.connect(RABBITMQ_URI);
ch = await rabbit.createChannel();
await ch.assertQueue("grab", {durable: true});
await ch.assertQueue("process", {durable: true});
- return;
+ break;
} catch (err) {
console.error(err);
await sleep(5000);
}
}
+ model = require("../orm/model")(seq, Seq);
})();
server.listen(8880);
app.use(express.static("assets"));
-app.use(bodyparser.json());
// request a grab job
-function updatePlayer(name, region, last_match_created_date, id) {
+function requestUpdate(name, region, last_match_created_date, id) {
last_match_created_date = last_match_created_date || new Date(value=0);
// add 1s, because createdAt-start <= x <= createdAt-end
@@ -106,7 +107,7 @@ async function searchPlayer(name) {
// request grab jobs
await Promise.all(players.data.map((p) =>
- updatePlayer(p.attributes.name, p.attributes.shardId, undefined, p.id)));
+ requestUpdate(p.attributes.name, p.attributes.shardId, undefined, p.id)));
found = true;
}));
@@ -119,20 +120,42 @@ async function searchPlayer(name) {
new Buffer("search_fail"));
}
+// update a player based on db record
+function updatePlayer(player) {
+ player.last_update = new Date();
+ // set last_update and request an update job
+ return Promise.all([
+ player.save(),
+ requestUpdate(player.name, player.shard_id,
+ player.last_match_created_date, player.api_id)
+ ]);
+}
+
/* routes */
-// first time user
+// force an update
app.post("/api/player/:name/search", (req, res) => {
searchPlayer(req.params.name); // do not await, just fire
res.sendStatus(204); // notifications will follow
});
-// known user
-app.put("/api/player/:name/update", (req, res) => {
- // PUT JSON in the body
- updatePlayer(req.params.name, req.body.region,
- req.body.last_match_created_date, req.body.id)
+// update a known user
+app.post("/api/player/:name/update", async (req, res) => {
+ let player = await model.Player.findOne({ where: { name: req.params.name } });
+ if (player == undefined) {
+ console.log("player not found in db, searching instead", req.params.name);
+ await searchPlayer(req.params.name);
+ return;
+ }
+ console.log("player in db, updating", req.params.name);
+ await updatePlayer(player);
res.sendStatus(204);
});
+// update a random user
+app.post("/api/player", async (req, res) => {
+ let player = await model.Player.findOne({ order: [ Seq.fn("RAND") ] });
+ await updatePlayer(player);
+ res.json(player);
+});
/* internal monitoring */
app.get("/", (req, res) => {
--
cgit v1.3.1