diff options
| author | schneefux <schneefux+commit@schneefux.xyz> | 2017-10-30 20:46:07 +0100 |
|---|---|---|
| committer | schneefux <schneefux+commit@schneefux.xyz> | 2017-10-30 20:46:07 +0100 |
| commit | 192284771736075720085d364963cb38ffc384b3 (patch) | |
| tree | 28c3366dc9c04e18e16f53ad0acff2f1a54c6e90 | |
| parent | 6a75460785e25b79b3a46d7025fdd93971b2a0db (diff) | |
| download | processor-192284771736075720085d364963cb38ffc384b3.tar.gz processor-192284771736075720085d364963cb38ffc384b3.zip | |
generate UUIDs if API IDs aren't validrelease/2.20.0
| -rw-r--r-- | package-lock.json | 2 | ||||
| -rw-r--r-- | package.json | 1 | ||||
| -rw-r--r-- | worker.js | 19 |
3 files changed, 21 insertions, 1 deletions
diff --git a/package-lock.json b/package-lock.json index 500938a..4f88036 100644 --- a/package-lock.json +++ b/package-lock.json @@ -703,7 +703,7 @@ "string_decoder": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.0.3.tgz", - "integrity": "sha512-4AH6Z5fzNNBcH+6XDMfA/BTt87skxqJlO0lAh3Dker5zThcAxG6mKz+iGu308UKoPPQ8Dcqx/4JhujzltRa+hQ==", + "integrity": "sha1-D8Z9fBQYJd6UKC3VNr7GubzoYKs=", "requires": { "safe-buffer": "5.1.1" } diff --git a/package.json b/package.json index 710815d..d6fc8cb 100644 --- a/package.json +++ b/package.json @@ -7,6 +7,7 @@ "amqplib": "^0.5.1", "mysql2": "^1.4.2", "sequelize": "^4.10.2", + "uuid": "^3.1.0", "winston": "^2.3.1", "winston-loggly-bulk": "^2.0.1" }, @@ -10,6 +10,7 @@ const amqp = require("amqplib"), Promise = require("bluebird"), + uuidV4 = require("uuid/v4"), winston = require("winston"), loggly = require("winston-loggly-bulk"), Seq = require("sequelize"), @@ -88,6 +89,19 @@ function flatten(obj) { return snakeCaseKeys(o); } +// check for a valid UUID v4 or generate one +const uuidV4Regex = /^[0-9a-fA-F]{8}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{4}\-[0-9a-fA-F]{12}$/i; +function uuidfy(id) { + if (uuidV4Regex.test(id)) { + return id; + } + + const uuid = uuidV4(); + logger.error("found invalid UUID, generated a new one", { id, uuid }); + console.trace(); + return uuid; +} + amqp.connect(RABBITMQ_URI).then(async (rabbit) => { global.process.on("SIGINT", () => { rabbit.close(); @@ -333,6 +347,7 @@ amqp.connect(RABBITMQ_URI).then(async (rabbit) => { // flatten a deep clone, the original object is needed // so it can be moved into the failed queue let player = flatten(JSON.parse(JSON.stringify(msg.content))); + player.api_id = uuidfy(player.api_id); player.created_at = new Date(Date.parse(player.created_at)); player.last_match_created_date = player.created_at; player.last_update = seq.fn("NOW"); // TODO set msg.timestamp in bridge and parse here @@ -352,11 +367,13 @@ amqp.connect(RABBITMQ_URI).then(async (rabbit) => { // data from `/matches` match_objects.forEach((msg) => { let match = JSON.parse(JSON.stringify(msg.content)); // deep clone + match.id = uuidfy(match.id); match.createdAt = new Date(Date.parse(match.createdAt)); // flatten jsonapi nested response into our db structure-like shape // also, push missing fields match.rosters = match.rosters.map((roster) => { + roster.id = uuidfy(roster.id); roster.matchApiId = match.id; // TODO backwards compatibility, all objects have shardId since May 10th roster.attributes.shardId = roster.attributes.shardId || match.attributes.shardId; @@ -368,6 +385,7 @@ amqp.connect(RABBITMQ_URI).then(async (rabbit) => { roster.attributes.stats.winner = false; roster.participants = roster.participants.map((participant) => { + participant.id = uuidfy(participant.id); // ! attributes added here need to be added via `calculate_participant_stats` too participant.attributes.shardId = participant.attributes.shardId || roster.attributes.shardId; participant.rosterApiId = roster.id; @@ -451,6 +469,7 @@ amqp.connect(RABBITMQ_URI).then(async (rabbit) => { return flatten(roster); }); match.assets = match.assets.map((asset) => { + asset.id = uuidfy(asset.id); asset.matchApiId = match.id; asset.attributes.shardId = asset.attributes.shardId || match.attributes.shardId; return flatten(asset); |
