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