Add pubsub cloud functions
This commit is contained in:
@ -1,7 +1,3 @@
|
||||
// exports.scheduledFunction = functions.pubsub.schedule('every 10 minutes').onRun((context) => {
|
||||
// functions.logger.info("Test log")
|
||||
// })
|
||||
|
||||
// Firebase imports
|
||||
const functions = require("firebase-functions");
|
||||
const admin = require('firebase-admin');
|
||||
@ -12,6 +8,8 @@ admin.initializeApp();
|
||||
const axios = require('axios');
|
||||
const parseString = require('xml2js').parseString;
|
||||
|
||||
/* --------------------- station functions --------------------- */
|
||||
|
||||
// function to fetch station data from the Firestore database
|
||||
exports.getStationData = functions.https.onRequest((request, response) => {
|
||||
response.set('Access-Control-Allow-Origin', '*');
|
||||
@ -69,7 +67,7 @@ exports.postStationData = functions.https.onRequest((request, response) => {
|
||||
response.set('Access-Control-Allow-Origin', '*');
|
||||
response.set('Access-Control-Allow-Credentials', 'true');
|
||||
cors(request, response, () => {
|
||||
// fetch dart stations and classify as dart stations
|
||||
// fetch dart stations
|
||||
axios.get('http://api.irishrail.ie/realtime/realtime.asmx/getAllStationsXML_WithStationType?StationType=D').then(res => {
|
||||
// XML to JSON
|
||||
parseString(res.data, function(err, result) {
|
||||
@ -94,7 +92,7 @@ exports.postStationData = functions.https.onRequest((request, response) => {
|
||||
dartCodes.add(doc["StationCode"][0])
|
||||
})
|
||||
|
||||
// fetch all train stations
|
||||
// fetch all stations
|
||||
axios.get('http://api.irishrail.ie/realtime/realtime.asmx/getAllStationsXML_WithStationType?StationType=A').then(res => {
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
@ -110,6 +108,73 @@ exports.postStationData = functions.https.onRequest((request, response) => {
|
||||
})
|
||||
})
|
||||
|
||||
// scheduled version
|
||||
exports.scheduledPostStationData = functions.pubsub.schedule("every day 00:00").onRun(async (context) => {
|
||||
// helper functon to parse station JSON objects
|
||||
function parseJSON(result) {
|
||||
let jsonStr = JSON.stringify(result);
|
||||
let jsonObj = JSON.parse(jsonStr);
|
||||
let jsonData = jsonObj.ArrayOfObjStation.objStation;
|
||||
return jsonData;
|
||||
}
|
||||
|
||||
// helper function to write to the database
|
||||
function batchWriteDB(db, jsonData, dartCodes, stationTypeCode) {
|
||||
if (!jsonData) return
|
||||
var batchWrite = db.batch();
|
||||
jsonData.forEach((doc) => {
|
||||
// append if the dartCodes hashset is empty or the current station is not present, and ignoring positions of zero
|
||||
if ((dartCodes.size == 0 || !dartCodes.has(doc["StationCode"][0])) && !(doc["StationLongitude"] == 0 || doc["StationLatitude"] == 0)) {
|
||||
doc["StationType"] = [stationTypeCode]
|
||||
var docID = db.collection('stations').doc(doc["StationCode"][0])
|
||||
batchWrite.set(docID, doc);
|
||||
}
|
||||
});
|
||||
batchWrite.commit()
|
||||
}
|
||||
|
||||
// fetch dart stations
|
||||
return axios.get('http://api.irishrail.ie/realtime/realtime.asmx/getAllStationsXML_WithStationType?StationType=D').then(res => {
|
||||
// XML to JSON
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
|
||||
// batch delete all of the station collection's documents
|
||||
var db = admin.firestore();
|
||||
admin.firestore().collection('stations').get().then((snapshot) => {
|
||||
var batchDelete = db.batch();
|
||||
snapshot.forEach(doc => {
|
||||
batchDelete.delete(doc.ref);
|
||||
});
|
||||
|
||||
batchDelete.commit().then(function() {
|
||||
// store all dart codes into a hashset
|
||||
// compare these with the station call with code "all" to avoid duplicates
|
||||
let dartCodes = new Set()
|
||||
batchWriteDB(db, jsonData, dartCodes, "DART");
|
||||
|
||||
// populate the dartCodes hashset
|
||||
jsonData.forEach((doc) => {
|
||||
dartCodes.add(doc["StationCode"][0])
|
||||
})
|
||||
|
||||
// fetch all train stations
|
||||
axios.get('http://api.irishrail.ie/realtime/realtime.asmx/getAllStationsXML_WithStationType?StationType=A').then(res => {
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
batchWriteDB(db, jsonData, dartCodes, "Train")
|
||||
functions.logger.log("Successfully fetched and upload station data from Irish Rail on a schedule")
|
||||
return "Successfully fetched and upload station data from Irish Rail on a schedule"
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
/* --------------------- train functions --------------------- */
|
||||
|
||||
// function to fetch live train data from the Firestore database
|
||||
exports.getLiveTrainData = functions.https.onRequest((request, response) => {
|
||||
response.set('Access-Control-Allow-Origin', '*');
|
||||
@ -167,7 +232,7 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => {
|
||||
response.set('Access-Control-Allow-Origin', '*');
|
||||
response.set('Access-Control-Allow-Credentials', 'true');
|
||||
cors(request, response, () => {
|
||||
// fetch mainland trains and classify as trains
|
||||
// fetch mainland trains
|
||||
axios.get('https://api.irishrail.ie/realtime/realtime.asmx/getCurrentTrainsXML_WithTrainType?TrainType=M').then(res => {
|
||||
// XML to JSON
|
||||
parseString(res.data, function(err, result) {
|
||||
@ -185,13 +250,13 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => {
|
||||
// batch write all train JSON objects to the liveTrainData collection
|
||||
batchWriteDB(request, response, db, jsonData, "Train");
|
||||
|
||||
// fetch suburban trains and classify as trains
|
||||
// fetch suburban trains
|
||||
axios.get('https://api.irishrail.ie/realtime/realtime.asmx/getCurrentTrainsXML_WithTrainType?TrainType=S').then(res => {
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
batchWriteDB(request, response, db, jsonData, "Train");
|
||||
|
||||
// fetch dart trains and classify as darts
|
||||
// fetch dart trains
|
||||
axios.get('https://api.irishrail.ie/realtime/realtime.asmx/getCurrentTrainsXML_WithTrainType?TrainType=D').then(res => {
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
@ -209,6 +274,74 @@ exports.postLiveTrainData = functions.https.onRequest((request, response) => {
|
||||
})
|
||||
})
|
||||
|
||||
// scheduled version
|
||||
exports.scheduledPostLiveTrainData = functions.pubsub.schedule('every 10 minutes').onRun(async (context) => {
|
||||
// helper function to parse train JSON objects
|
||||
function parseJSON(result) {
|
||||
let jsonStr = JSON.stringify(result);
|
||||
let jsonObj = JSON.parse(jsonStr);
|
||||
let jsonData = jsonObj.ArrayOfObjTrainPositions.objTrainPositions;
|
||||
return jsonData;
|
||||
}
|
||||
|
||||
// helper function to write to the database
|
||||
function batchWriteDB(db, jsonData, trainTypeCode) {
|
||||
if (!jsonData) return
|
||||
var batchWrite = db.batch();
|
||||
jsonData.forEach((doc) => {
|
||||
// ignore trains with longitudes or latitudes equal zero
|
||||
if (!(doc["TrainLongitude"] == 0 || doc["TrainLatitude"] == 0)) {
|
||||
doc["TrainType"] = [trainTypeCode]
|
||||
var docID = db.collection('liveTrainData').doc(doc["TrainCode"][0]);
|
||||
batchWrite.set(docID, doc);
|
||||
}
|
||||
});
|
||||
batchWrite.commit()
|
||||
}
|
||||
|
||||
// fetch mainland stations
|
||||
return axios.get('https://api.irishrail.ie/realtime/realtime.asmx/getCurrentTrainsXML_WithTrainType?TrainType=M').then(res => {
|
||||
// XML to JSON
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
|
||||
// batch delete all of the liveTrainData collections's documents
|
||||
var db = admin.firestore();
|
||||
admin.firestore().collection('liveTrainData').get().then((snapshot) => {
|
||||
var batchDelete = db.batch();
|
||||
snapshot.forEach(doc => {
|
||||
batchDelete.delete(doc.ref);
|
||||
});
|
||||
|
||||
batchDelete.commit().then(function() {
|
||||
// batch write all train JSON objects to the liveTrainData collection
|
||||
batchWriteDB(db, jsonData, "Train");
|
||||
|
||||
// fetch suburban trains
|
||||
axios.get('https://api.irishrail.ie/realtime/realtime.asmx/getCurrentTrainsXML_WithTrainType?TrainType=S').then(res => {
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
batchWriteDB(db, jsonData, "Train");
|
||||
|
||||
// fetch DARTs
|
||||
axios.get('https://api.irishrail.ie/realtime/realtime.asmx/getCurrentTrainsXML_WithTrainType?TrainType=D').then(res => {
|
||||
parseString(res.data, function(err, result) {
|
||||
let jsonData = parseJSON(result)
|
||||
batchWriteDB(db, jsonData, "DART");
|
||||
functions.logger.log("Successfully fetched and uploaded live train data from Irish Rail on a schedule")
|
||||
return "Successfully fetched and uploaded live train data from Irish Rail on a schedule"
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
})
|
||||
|
||||
/* --------------------- preferences functions --------------------- */
|
||||
|
||||
// secure function to fetch a user's filter preferences from the database
|
||||
exports.getPreferences = functions.https.onCall((data, context) => {
|
||||
if (!context.auth) return "Error request is not verified"
|
||||
|
Reference in New Issue
Block a user