From 82f5e1019ca3ffcb03591f5166d9d581277f6928 Mon Sep 17 00:00:00 2001 From: Jake Meyer Date: Sat, 17 Nov 2018 12:08:52 -0600 Subject: [PATCH] Add capsules update script --- package.json | 3 +- scripts/capsules.js | 102 ++++++++++++++++++++++++++++++++++++++++++++ 2 files changed, 104 insertions(+), 1 deletion(-) create mode 100644 scripts/capsules.js diff --git a/package.json b/package.json index 19c2a15c..c0e6a7c6 100644 --- a/package.json +++ b/package.json @@ -14,7 +14,8 @@ "upcoming": "node scripts/upcoming.js", "launchpad": "node scripts/launchpad.js", "landpad": "node scripts/landpad.js", - "cores": "node scripts/cores.js" + "cores": "node scripts/cores.js", + "capsules": "node scripts/capsules.js" }, "repository": { "type": "git", diff --git a/scripts/capsules.js b/scripts/capsules.js new file mode 100644 index 00000000..3333815e --- /dev/null +++ b/scripts/capsules.js @@ -0,0 +1,102 @@ +#!/usr/bin/env node + +/** + * This script updates capsule missions and landing counts + */ + +const MongoClient = require('mongodb'); + +// Created so we can use async await with requests, and +// to use async sleep function inside the IIFE +async function asyncForEach(array, callback) { + for (let index = 0; index < array.length; index += 1) { + // Allow await for nested async functions + // eslint-disable-next-line no-await-in-loop + await callback(array[index], index, array); + } +} + +(async () => { + let client; + try { + client = await MongoClient.connect(process.env.MONGO_URL, { useNewUrlParser: true }); + } catch (err) { + console.log(err.stack); + process.exit(1); + } + + const col = client.db('spacex-api').collection('capsule'); + const launch = client.db('spacex-api').collection('launch'); + + const capsules = []; + const data = await col.find({}).sort({ capsule_serial: 1 }).toArray(); + data.forEach(capsule => { + capsules.push(capsule.capsule_serial); + }); + + + const start = async () => { + await asyncForEach(capsules, async capsule => { + const landings = await launch.countDocuments({ + upcoming: false, + 'rocket.second_stage.payloads': { + $elemMatch: { + cap_serial: capsule, + flight_time_sec: { $exists: true }, + }, + }, + launch_success: true, + }); + + const missions = []; + const launch_results = await launch.find({ + upcoming: false, + 'rocket.second_stage.payloads': { + $elemMatch: { + cap_serial: capsule, + }, + }, + }).project({ + _id: 0, + flight_number: 1, + mission_name: 1, + }).sort({ + flight_number: 1, + }).toArray(); + + launch_results.forEach(i => { + const mission = { + name: i.mission_name, + flight: i.flight_number, + }; + missions.push(mission); + }); + + let reuse_count; + if (missions.length - 1 < 0) { + reuse_count = 0; + } else { + reuse_count = missions.length - 1; + } + + console.log(capsule); + console.log(missions); + console.log(`Reuse Count: ${reuse_count}`); + console.log(`Landings: ${landings}`); + + await col.updateOne({ capsule_serial: capsule }, { + $set: { + reuse_count, + landings, + missions, + }, + }); + }); + }; + + await start(); + + if (client) { + client.close(); + } +})();