Add pubsub cloud functions
This commit is contained in:
4
.github/workflows/integrate.yml
vendored
4
.github/workflows/integrate.yml
vendored
@ -21,5 +21,9 @@ jobs:
|
||||
- name: Run Vue.js unit tests
|
||||
run: npm run test:unit
|
||||
|
||||
- name: Run Firebase integration tests
|
||||
run: npm run test
|
||||
working-directory: ./functions
|
||||
|
||||
- name: Build environment
|
||||
run: npm run build
|
BIN
dist/assets/314858_hidden_eye_icon-5431635a.png
vendored
Normal file
BIN
dist/assets/314858_hidden_eye_icon-5431635a.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 7.6 KiB |
1
dist/assets/315220_eye_icon-30328a0f.js
vendored
Normal file
1
dist/assets/315220_eye_icon-30328a0f.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
const s="/assets/314858_hidden_eye_icon-5431635a.png",_="/assets/315220_eye_icon-8d95e9db.png";export{s as _,_ as a};
|
BIN
dist/assets/315220_eye_icon-8d95e9db.png
vendored
Normal file
BIN
dist/assets/315220_eye_icon-8d95e9db.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 9.5 KiB |
1
dist/assets/404Page-3090e8b5.js
vendored
Normal file
1
dist/assets/404Page-3090e8b5.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{N as a}from"./Navbar-fcee2b9c.js";import{_ as o,r as n,o as t,c as r,a as s,F as c,b as _}from"./index-9a3ecfe5.js";const p={name:"404Page",components:{Navbar:a}},m=_("h1",null,"404 - You've been derailed :(",-1);function l(d,f,i,u,N,b){const e=n("Navbar");return t(),r(c,null,[s(e),m],64)}const g=o(p,[["render",l]]);export{g as default};
|
1
dist/assets/AccountPage-a368ab8c.css
vendored
Normal file
1
dist/assets/AccountPage-a368ab8c.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
h1[data-v-b1085315]{color:#000;text-align:center}h3[data-v-b1085315]{font-size:18px;padding-top:20px}#passReset[data-v-b1085315]{font-size:17px;text-decoration:underline;color:#39d3fa}#passReset[data-v-b1085315]:hover{color:#3993fa;cursor:pointer}#accountDiv[data-v-b1085315]{position:absolute;right:0px;left:0px;bottom:0px;background-color:#fff;height:100%;display:flex;align-items:flex-start;justify-content:center}#accountDiv div[data-v-b1085315]{position:inherit;padding:15px;background-color:#fff;width:45%;height:80%;top:14%;text-align:left;box-shadow:0 0 4px 4px #b6b6b6}#emailUpdate[data-v-b1085315],#passUpdate[data-v-b1085315]{position:relative;left:10px;width:26%}input[data-v-b1085315]{border:none;border-bottom:1px solid #000000;background:transparent;outline:none}#delAcc[data-v-b1085315]{position:absolute;bottom:10px;left:10px}#delPref[data-v-b1085315]{position:absolute;bottom:10px;left:160px}
|
1
dist/assets/AccountPage-edc2add1.js
vendored
Normal file
1
dist/assets/AccountPage-edc2add1.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/InsightsPage-37912657.js
vendored
1
dist/assets/InsightsPage-37912657.js
vendored
@ -1 +0,0 @@
|
||||
import{s as n}from"./store-6f7621d4.js";import{N as u}from"./Navbar-6b07ba01.js";import{_ as p,r as _,o as e,c as a,a as g,b as s,t,d as o,F as l,e as m,p as T,f as b}from"./index-93b9eb88.js";const y={name:"InsightsPage",data(){return{insights:{},latestTrain:{},earliestTrain:{},rawData:{},orderedTrains:[],store:n}},components:{Navbar:u},created(){this.insights=n.insights,this.latestTrain=n.latestTrain,this.earliestTrain=n.earliestTrain,this.rawData=n.rawData,this.orderedTrains=n.orderedTrains}},h=i=>(T("data-v-b6ad733a"),i=i(),b(),i),f=h(()=>s("h1",null,"Insights",-1)),v={key:0},N={key:0},I={key:1},k=h(()=>s("h1",null,"Leaderboard",-1)),C={key:0},D={key:1};function S(i,w,x,L,d,P){const c=_("Navbar");return e(),a(l,null,[g(c),f,this.insights?(e(),a("div",v,[s("p",null,"Total number of trains: "+t(this.insights.totalNumTrains),1),s("p",null,"Number of actively running trains: "+t(this.insights.numRunningTrains),1),s("p",null,"Percentage late: "+t(this.insights.percentageLate)+"%",1),s("p",null,"Percentage early or ontime: "+t(this.insights.percentageNotLate)+"%",1),this.latestTrain.TrainCode?(e(),a("p",N,"Latest train: "+t(this.latestTrain.TrainCode[0])+", "+t(this.insights.latestTime)+" mins late",1)):o("",!0),this.earliestTrain.TrainCode?(e(),a("p",I,"Earliest train: "+t(this.earliestTrain.TrainCode[0])+", "+t(this.insights.earliestTime*-1)+" mins early",1)):o("",!0),s("p",null,"Mainland: "+t(this.insights.numMainland),1),s("p",null,"Suburban: "+t(this.insights.numSuburban),1),s("p",null,"Darts: "+t(this.insights.numDart),1)])):o("",!0),k,(e(!0),a(l,null,m(d.orderedTrains,r=>(e(),a("div",null,[s("h2",null,t(this.rawData[r.jsonIndex].TrainCode[0]),1),r.time>0?(e(),a("p",C,t(r.time)+" mins late",1)):(e(),a("p",D,t(r.time*-1)+" mins early",1))]))),256))],64)}const E=p(y,[["render",S],["__scopeId","data-v-b6ad733a"]]);export{E as default};
|
1
dist/assets/InsightsPage-9ac0e67d.css
vendored
Normal file
1
dist/assets/InsightsPage-9ac0e67d.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
div[data-v-37c13361],div[data-v-e35fddf5]{width:70%}.card-text[data-v-7860af3e],.card-stats[data-v-7860af3e]{font-size:17px}.piechart[data-v-7860af3e]{display:flex;justify-content:center;padding-bottom:0;margin-bottom:0;height:53%}#barChart[data-v-7860af3e]{position:relative;padding:10px;width:100%;top:20px;height:40%}th[data-v-7860af3e]{padding:15px;text-align:center;font-size:19px}#leaderboardTitleDiv p[data-v-7860af3e]{font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif;text-align:center;font-size:50px;padding-top:10px}table[data-v-7860af3e]{border-spacing:1;border-collapse:collapse;background:white;border-radius:6px;overflow:hidden;max-width:1400px;width:100%;margin:0 auto;position:relative;font-size:19px}*[data-v-7860af3e]{position:relative}td[data-v-7860af3e],th[data-v-7860af3e]{padding-left:8px}thead tr[data-v-7860af3e]{height:60px;background:#ffed86;font-size:16px}tbody tr[data-v-7860af3e]{height:48px;border-bottom:1px solid #e3f1d5}tbody tr[data-v-7860af3e]:last-child{border:0;border-bottom:2px solid #d5e0f1}td[data-v-7860af3e],th[data-v-7860af3e]{text-align:left}td.l[data-v-7860af3e],th.l[data-v-7860af3e]{text-align:right}@media screen and (max-width: 820px){table[data-v-7860af3e],table tr[data-v-7860af3e],td[data-v-7860af3e],th[data-v-7860af3e],*[data-v-7860af3e]{display:block}thead[data-v-7860af3e]{display:none}tbody tr[data-v-7860af3e]{height:auto;padding:8px 0}tbody tr td[data-v-7860af3e]{padding-left:45%;margin-bottom:12px}tbody tr td[data-v-7860af3e]:last-child{margin-bottom:0}tbody tr td[data-v-7860af3e]:before{position:absolute;font-weight:700;width:40%;left:10px;top:0}tbody tr td[data-v-7860af3e]:nth-child(1):before{content:"Code"}tbody tr td[data-v-7860af3e]:nth-child(2):before{content:"Time"}tbody tr td[data-v-7860af3e]:nth-child(3):before{content:"Type"}tbody tr td[data-v-7860af3e]:nth-child(4):before{content:"Origin"}tbody tr td[data-v-7860af3e]:nth-child(5):before{content:"Destination"}}
|
1
dist/assets/InsightsPage-9f2265bd.css
vendored
1
dist/assets/InsightsPage-9f2265bd.css
vendored
@ -1 +0,0 @@
|
||||
body[data-v-b6ad733a]{background-color:#2c6666}
|
18
dist/assets/InsightsPage-ba74d16b.js
vendored
Normal file
18
dist/assets/InsightsPage-ba74d16b.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/LoginPage-1a8e9e77.css
vendored
Normal file
1
dist/assets/LoginPage-1a8e9e77.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
#background[data-v-b3c98f88]{margin:0;padding:0;width:100%;height:100%;position:absolute;background-color:#e0e0e0;font-family:sans-serif}.loginbox[data-v-b3c98f88]{height:420px;width:320px;background:#000;color:#fff;top:50%;left:50%;position:absolute;transform:translate(-50%,-50%);box-sizing:border-box;padding:70px 30px}#imgDiv[data-v-b3c98f88]{height:10%;width:10%;right:40px;bottom:150px;position:absolute}#eyeImg[data-v-b3c98f88]{height:80%;width:100%}#eyeImg[data-v-b3c98f88]:hover{transform:scale(1.1)}h1[data-v-b3c98f88]{margin:0;padding:0 0 20px;font-size:22px;text-align:center}.loginbox p[data-v-b3c98f88]{margin:0;padding:0;font-weight:700}.loginbox input[data-v-b3c98f88]{width:100%;margin-bottom:20px}.loginbox input[type=email][data-v-b3c98f88],input[type=password][data-v-b3c98f88],input[type=text][data-v-b3c98f88]{border:none;border-bottom:1px solid #fff;background:transparent;outline:none;height:40px;color:#fff;font-size:16px}.loginbox input[type=submit][data-v-b3c98f88]:hover{cursor:pointer;background:#66a3ff;color:#000}.loginbox a[data-v-b3c98f88]{text-decoration:none;font-size:12px;line-height:20px;color:#a9a9a9;display:flex}.loginbox a[data-v-b3c98f88]:hover{color:#ffc107}.loginbox input[type=submit][data-v-b3c98f88]{border:none;outline:none;height:40px;background:#0052cc;font-size:18px;border-radius:20px}.avatar[data-v-b3c98f88]{width:100px;height:100px;border-radius:50%;position:absolute;top:-50px;left:calc(50% - 50px)}
|
1
dist/assets/LoginPage-8a330df8.js
vendored
Normal file
1
dist/assets/LoginPage-8a330df8.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{_ as c,g as u,$ as _,n as f,r as p,o as a,c as n,a as h,b as e,q as d,v as m,w as v,F as P,e as k,h as y,p as b,j as E}from"./index-9a3ecfe5.js";import{t as T}from"./style-1561178c.js";import{N as C}from"./Navbar-fcee2b9c.js";import{_ as x,a as I}from"./315220_eye_icon-30328a0f.js";const B=u(),N={name:"LoginPage",data(){return{email:"",password:"",toastMessage:"",toastBackground:"",forgotPassword:!1,showPassword:!1,toast:()=>{T(this.toastMessage,{hideProgressBar:!0,timeout:4e3,toastBackgroundColor:this.toastBackground})}}},components:{Navbar:C},methods:{showToast(i,s){this.toastMessage=i,this.toastBackground=s,this.toast()},login(){const i=u(k);if(!this.email||!this.password){this.showToast("Missing credentials","red");return}_(i,this.email,this.password).then(()=>{this.showToast("Logged in successfully","green"),this.$router.push({path:"/"})}).catch(s=>{s.message.includes("email")?this.showToast("Invalid email","red"):s.message.includes("user")?this.showToast("Could not find this user","red"):this.showToast(s.message,"red")})},resetPasswordEmail(){if(!this.email){this.showToast("Missing credentials","red");return}f(B,this.email).then(()=>{this.showToast("Reset password email sent","green"),this.email=""}).catch(i=>{i.message.includes("email")?this.showToast("Invalid email","red"):i.message.includes("user")?this.showToast("Could not find this user","red"):this.showToast(i.message,"red")})}}},l=i=>(b("data-v-b3c98f88"),i=i(),E(),i),V={id:"background"},L={class:"loginbox"},M=l(()=>e("img",{src:"https://cdn.discordapp.com/attachments/1017419092447207436/1063092138029625394/pixil-frame-0.png",class:"avatar"},null,-1)),A={key:0},F=l(()=>e("h1",null,"Login",-1)),S=l(()=>e("p",null,"Email Address",-1)),U=l(()=>e("p",null,"Password",-1)),D={id:"imgDiv"},R={key:1},H=l(()=>e("h1",null,"Forgot Password",-1)),j=l(()=>e("p",null,"Email Address",-1));function q(i,s,G,W,o,r){const w=p("Navbar"),g=p("router-link");return a(),n(P,null,[h(w),e("div",V,[e("div",L,[M,o.forgotPassword?(a(),n("div",R,[H,j,d(e("input",{type:"email","onUpdate:modelValue":s[7]||(s[7]=t=>o.email=t),"aria-describedby":"emailHelp",placeholder:"Enter email"},null,512),[[m,o.email]]),e("input",{onClick:s[8]||(s[8]=(...t)=>r.resetPasswordEmail&&r.resetPasswordEmail(...t)),type:"submit",name:"",value:"Send Reset Email"}),e("a",{onClick:s[9]||(s[9]=t=>{o.forgotPassword=!o.forgotPassword,this.email=""})},"Go back")])):(a(),n("div",A,[F,S,d(e("input",{type:"email","onUpdate:modelValue":s[0]||(s[0]=t=>o.email=t),"aria-describedby":"emailHelp",placeholder:"Enter email"},null,512),[[m,o.email]]),U,e("div",D,[o.showPassword?(a(),n("img",{key:0,id:"eyeImg",src:x,onClick:s[1]||(s[1]=t=>this.showPassword=!this.showPassword),alt:"show"})):(a(),n("img",{key:1,id:"eyeImg",src:I,onClick:s[2]||(s[2]=t=>this.showPassword=!this.showPassword)}))]),o.showPassword?d((a(),n("input",{key:0,type:"text","onUpdate:modelValue":s[3]||(s[3]=t=>o.password=t),placeholder:"Enter password"},null,512)),[[m,o.password]]):d((a(),n("input",{key:1,type:"password","onUpdate:modelValue":s[4]||(s[4]=t=>o.password=t),placeholder:"Enter password"},null,512)),[[m,o.password]]),e("input",{onClick:s[5]||(s[5]=(...t)=>r.login&&r.login(...t)),type:"submit",name:"",value:"Login"}),e("a",{onClick:s[6]||(s[6]=t=>{o.forgotPassword=!o.forgotPassword,this.email=""})},"Forgot password?"),e("a",null,[h(g,{to:"/signup"},{default:v(()=>[y("Don't have an account?")]),_:1})])]))])])],64)}const Q=c(N,[["render",q],["__scopeId","data-v-b3c98f88"]]);export{Q as default};
|
1
dist/assets/LoginPage-a53ab66f.js
vendored
1
dist/assets/LoginPage-a53ab66f.js
vendored
@ -1 +0,0 @@
|
||||
import{_ as g,h,l as v,r as d,o as w,c as f,a as p,b as o,m as c,v as u,w as b,F as x,i as k,k as N,p as y,f as E}from"./index-93b9eb88.js";import{N as I}from"./Navbar-6b07ba01.js";const L={name:"LoginPage",data(){return{email:"",password:""}},components:{Navbar:I},methods:{login(){const s=h(k);v(s,this.email,this.password).then(e=>{e.user,this.$router.push({path:"/secure"})}).catch(e=>{const l=e.code,r=e.message;console.log(l),console.log(r)})}}},n=s=>(y("data-v-67d86943"),s=s(),E(),s),P={id:"background"},V={class:"loginbox"},C=n(()=>o("img",{src:"https://cdn.discordapp.com/attachments/1017419092447207436/1063092138029625394/pixil-frame-0.png",class:"avatar"},null,-1)),A=n(()=>o("h1",null,"Login",-1)),B=n(()=>o("p",null,"Email Address",-1)),S=n(()=>o("p",null,"Password",-1));function D(s,e,l,r,a,i){const _=d("Navbar"),m=d("router-link");return w(),f(x,null,[p(_),o("div",P,[o("div",V,[C,A,B,c(o("input",{type:"email","onUpdate:modelValue":e[0]||(e[0]=t=>a.email=t),"aria-describedby":"emailHelp",placeholder:"Enter email"},null,512),[[u,a.email]]),S,c(o("input",{type:"password","onUpdate:modelValue":e[1]||(e[1]=t=>a.password=t),placeholder:"Enter password"},null,512),[[u,a.password]]),o("input",{onClick:e[2]||(e[2]=(...t)=>i.login&&i.login(...t)),type:"submit",name:"",value:"Login"}),o("a",null,[p(m,{to:"/signup"},{default:b(()=>[N("Don't have an account?")]),_:1})])])])],64)}const T=g(L,[["render",D],["__scopeId","data-v-67d86943"]]);export{T as default};
|
1
dist/assets/LoginPage-d42bd1fa.css
vendored
1
dist/assets/LoginPage-d42bd1fa.css
vendored
@ -1 +0,0 @@
|
||||
#background[data-v-67d86943]{margin:0;padding:0;width:100%;height:100%;position:absolute;background-color:#e0e0e0;font-family:sans-serif}.loginbox[data-v-67d86943]{height:420px;width:320px;background:#000;color:#fff;top:50%;left:50%;position:absolute;transform:translate(-50%,-50%);box-sizing:border-box;padding:70px 30px}h1[data-v-67d86943]{margin:0;padding:0 0 20px;font-size:22px;text-align:center}.loginbox p[data-v-67d86943]{margin:0;padding:0;font-weight:700}.loginbox input[data-v-67d86943]{width:100%;margin-bottom:20px}.loginbox input[type=email][data-v-67d86943],input[type=password][data-v-67d86943]{border:none;border-bottom:1px solid #fff;background:transparent;outline:none;height:40px;color:#fff;font-size:16px}.loginbox input[type=submit][data-v-67d86943]:hover{cursor:pointer;background:#66a3ff;color:#000}.loginbox a[data-v-67d86943]{text-decoration:none;font-size:12px;line-height:20px;color:#a9a9a9}.loginbox a[data-v-67d86943]:hover{color:#ffc107}.loginbox input[type=submit][data-v-67d86943]{border:none;outline:none;height:40px;background:#0052cc;font-size:18px;border-radius:20px}.avatar[data-v-67d86943]{width:100px;height:100px;border-radius:50%;position:absolute;top:-50px;left:calc(50% - 50px)}
|
1
dist/assets/MapPage-26750926.css
vendored
1
dist/assets/MapPage-26750926.css
vendored
@ -1 +0,0 @@
|
||||
#sidebarHeader[data-v-34a2bae4]{position:relative;top:0%;height:15%;width:100%;overflow:hidden}#sidebarDiv[data-v-34a2bae4]{position:absolute;height:80%;width:100%;color:#fff}#headerImage[data-v-34a2bae4]{height:80%;width:auto;overflow:hidden;position:relative;top:10px}#xButton[data-v-34a2bae4]{font-size:80%;font-family:Georgia;color:#fff;position:absolute;top:10px;right:10px}#xButton[data-v-34a2bae4]:hover{color:red}.overlay-content[data-v-8f7d73f5]{width:1%}.trainMapIcon[data-v-8f7d73f5]{width:28px;height:32px}#sidebar[data-v-8f7d73f5]{position:absolute;height:85%;width:20%;left:2%;top:12%;z-index:2;text-align:center;animation:gradient-8f7d73f5 15s ease infinite;background:linear-gradient(45deg,#000000,#111111,#222222,#333333,#444444,#555555);background-size:400%,400%;box-shadow:0 0 4px 2px #333;overflow:hidden;font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif}.slideLeft-enter-active[data-v-8f7d73f5],.slideLeft-leave-active[data-v-8f7d73f5]{transition:opacity .5s;transition:all .8s}.slideLeft-enter-from[data-v-8f7d73f5],.slideLeft-leave-to[data-v-8f7d73f5]{opacity:0;transform:translate(-100px)}@keyframes gradient-8f7d73f5{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}#publicMessageTicker[data-v-8f7d73f5]{z-index:3;position:absolute;bottom:0px;width:100%;background-color:#ffff7d;color:#000;font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif;text-align:bottom;font-size:17px}
|
7
dist/assets/MapPage-66b44c57.js
vendored
7
dist/assets/MapPage-66b44c57.js
vendored
File diff suppressed because one or more lines are too long
1
dist/assets/MapPage-8a77fcaf.css
vendored
Normal file
1
dist/assets/MapPage-8a77fcaf.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
#sidebarHeader[data-v-ba9cd2b3]{position:relative;top:0%;height:15%;width:100%;overflow:hidden}#sidebarDiv[data-v-ba9cd2b3]{position:absolute;height:80%;width:100%;color:#000}.headerImage[data-v-ba9cd2b3]{height:100%;width:40px;padding-top:10px}.imageDiv[data-v-ba9cd2b3]{display:flex;justify-content:center}#xButton[data-v-ba9cd2b3]{font-size:80%;font-family:Georgia;color:#000;position:absolute;top:10px;right:10px}#xButton[data-v-ba9cd2b3]:hover{color:red}#sidebarHeader[data-v-8a09d5be]{position:relative;top:0%;height:15%;width:100%;overflow:hidden}#sidebarDiv[data-v-8a09d5be]{position:absolute;height:80%;width:100%;color:#000}#headerImage[data-v-8a09d5be]{height:80%;width:auto;overflow:hidden;position:relative;top:10px}#xButton[data-v-8a09d5be]{font-size:80%;font-family:Georgia;color:#000;position:absolute;top:10px;right:10px}#xButton[data-v-8a09d5be]:hover{color:red}#mapCover[data-v-33827e44]{height:100%;width:100%;display:flex;justify-content:center}.overlay-content[data-v-33827e44]{width:1%}.trainMapIcon[data-v-33827e44]{width:28px;height:32px}.trainMapIcon[data-v-33827e44]:hover{transform:scale(1.2);cursor:pointer}.stationMapIcon[data-v-33827e44]{width:14px;height:17px}.stationMapIcon[data-v-33827e44]:hover{width:16px;height:19px;cursor:pointer}#dropdownMenuButton1[data-v-33827e44]{box-shadow:0 0 5px 2px #6e757dbe}#dropMenu[data-v-33827e44]{font-size:14.6px}#searchContainer[data-v-33827e44]{position:absolute;top:11%;background-color:#fff;width:190px;height:40px;z-index:3;display:flex;justify-content:center;align-items:center;color:#000;box-shadow:0 0 5px 2px #6e757dbe;border-radius:6%}#searchBar[data-v-33827e44]{text-align:center;font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif;border:none;border-bottom:1px solid black;z-index:3}#preferenceDropdown[data-v-33827e44]{position:absolute;z-index:3;right:1%;top:11%}#prefHeader[data-v-33827e44]{font-size:18px;font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif;text-align:center;position:relative}#sidebar[data-v-33827e44]{position:absolute;height:80%;width:20%;left:2%;top:14%;z-index:2;text-align:center;animation:gradient-33827e44 15s ease infinite;background:linear-gradient(45deg,#ffffff,#fef3f3,#ffffff,#f2f2f2);background-size:100%,100%;box-shadow:0 0 4px 2px #ccc;overflow:hidden;font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif}#savePref[data-v-33827e44]{left:2%;top:2px;width:95%;position:relative}.slideLeft-enter-active[data-v-33827e44],.slideLeft-leave-active[data-v-33827e44]{transition:opacity .5s;transition:all .8s}.slideLeft-enter-from[data-v-33827e44],.slideLeft-leave-to[data-v-33827e44]{opacity:0;transform:translate(-100px)}@keyframes gradient-33827e44{0%{background-position:0% 50%}50%{background-position:100% 50%}to{background-position:0% 50%}}#publicMessageTicker[data-v-33827e44]{z-index:3;position:fixed;bottom:0px;width:100%;background-color:#ffff7d;color:#000;font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif;text-align:bottom;font-size:16px}@media screen and (max-width: 850px){#sidebar[data-v-33827e44]{height:75%;width:90%;left:5%;top:18%}#mapCover[data-v-33827e44]{height:100%;width:100%;display:flex;justify-content:left;z-index:3}#searchBar[data-v-33827e44]{width:100px}#searchContainer[data-v-33827e44]{position:absolute;top:11%;left:10px;background-color:#fff;width:120px;height:40px;z-index:3;display:flex;justify-content:center;align-items:center;color:#000;box-shadow:0 0 5px 2px #6e757dbe;border-radius:6%}}
|
7
dist/assets/MapPage-bc88e829.js
vendored
Normal file
7
dist/assets/MapPage-bc88e829.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/Navbar-0f051f5e.css
vendored
Normal file
1
dist/assets/Navbar-0f051f5e.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
.router-link-active[data-v-9f58d794]{color:#000;font-weight:600;cursor:pointer}a[data-v-9f58d794]{text-decoration:none;color:#000;font-weight:100}
|
1
dist/assets/Navbar-6b07ba01.js
vendored
1
dist/assets/Navbar-6b07ba01.js
vendored
@ -1 +0,0 @@
|
||||
import{_ as p,h as l,i as u,j as f,s as k,r as v,o as n,c as i,b as c,a as t,w as s,k as o,d as _,p as b,f as m}from"./index-93b9eb88.js";const L={name:"Navbar",data(){return{isLoggedIn:!1}},created(){const a=l(u);f(a,d=>{d?this.isLoggedIn=!0:this.isLoggedIn=!1})},methods:{logout(){k(l(u)).then(()=>{this.$router.push("/")})}}},h=a=>(b("data-v-90353ff1"),a=a(),m(),a),I={class:"navbar navbar-light bg-light"},x={class:"container-fluid"},N=h(()=>c("img",{src:"https://cdn.discordapp.com/attachments/1017419092447207436/1063092138029625394/pixil-frame-0.png",alt:"mascot",width:"55",height:"40",class:"d-inline-block align-text-middle"},null,-1)),y=h(()=>c("b",null,"Irish Rail Tracker",-1)),C={class:"navbarLink"},S={class:"navbarLink"},w={key:0,class:"navbarLink"},V={key:1,class:"navbarLink"},B={key:2,class:"navbarLink"},A={key:3,class:"navbarLink"};function T(a,d,j,E,r,g){const e=v("router-link");return n(),i("nav",I,[c("div",x,[t(e,{to:"/",class:"navbar-brand"},{default:s(()=>[N,y]),_:1}),c("a",C,[t(e,{to:"/"},{default:s(()=>[o("Home")]),_:1})]),c("a",S,[t(e,{to:"/insights"},{default:s(()=>[o("Insights")]),_:1})]),r.isLoggedIn?(n(),i("a",w,[t(e,{to:"/secure"},{default:s(()=>[o("Secure")]),_:1})])):_("",!0),r.isLoggedIn?(n(),i("a",V,[t(e,{onClick:g.logout,to:"/"},{default:s(()=>[o("Logout")]),_:1},8,["onClick"])])):_("",!0),r.isLoggedIn?_("",!0):(n(),i("a",B,[t(e,{to:"/login"},{default:s(()=>[o("Login")]),_:1})])),r.isLoggedIn?_("",!0):(n(),i("a",A,[t(e,{to:"/signup"},{default:s(()=>[o("Sign Up")]),_:1})]))])])}const O=p(L,[["render",T],["__scopeId","data-v-90353ff1"]]);export{O as N};
|
1
dist/assets/Navbar-f25ac83d.css
vendored
1
dist/assets/Navbar-f25ac83d.css
vendored
@ -1 +0,0 @@
|
||||
.navbarLink[data-v-90353ff1]{font-family:Franklin Gothic Medium,Arial Narrow,Arial,sans-serif;font-size:150%}
|
1
dist/assets/Navbar-fcee2b9c.js
vendored
Normal file
1
dist/assets/Navbar-fcee2b9c.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{d as b,_ as f,g as h,e as u,f as m,s as S,r as k,o as i,c as l,b as e,a,w as o,h as n,i as r,p as I,j as y}from"./index-9a3ecfe5.js";const p=b({insights:{},orderedTrains:[],selectedTrain:{},selectedStation:{},rawData:{},displaySelectedTrain:!1,displayedSelectedStation:!1,loggedIn:!1,isWaitingForLoginStatus:!0,setInsights(t){this.insights=t},setRawData(t){this.rawData=t},setOrderedTrains(t){t.sort((c,_)=>c.time-_.time),this.orderedTrains=t},setSelectedTrain(t){this.selectedTrain=t},setSelectedStation(t){this.selectedStation=t},setDisplaySelectedTrain(t){this.displaySelectedTrain=t},setDisplaySelectedStation(t){this.displaySelectedStation=t},setLoginStatus(t){this.loggedIn=t}});const L={name:"Navbar",data(){return{isLoggedIn:!1}},created(){const t=h(u);m(t,c=>{c?this.isLoggedIn=!0:this.isLoggedIn=!1,p.setLoginStatus(this.isLoggedIn),p.isWaitingForLoginStatus=!1})},methods:{logout(){S(h(u)).then(()=>{this.$router.push("/")})}}},g=t=>(I("data-v-9f58d794"),t=t(),y(),t),x={style:{"z-index":"4"},class:"navbar navbar-expand-sm navbar-light bg-light"},T={class:"container-fluid"},w=g(()=>e("img",{src:"https://cdn.discordapp.com/attachments/1017419092447207436/1063092138029625394/pixil-frame-0.png",alt:"mascot",width:"55",height:"40",class:"d-inline-block align-text-middle"},null,-1)),C=g(()=>e("b",null,"Irish Rail Tracker",-1)),N=g(()=>e("button",{class:"navbar-toggler",type:"button","data-bs-toggle":"collapse","data-bs-target":"#navbarSupportedContent","aria-controls":"navbarSupportedContent","aria-expanded":"false","aria-label":"Toggle navigation"},[e("span",{class:"navbar-toggler-icon"})],-1)),D={class:"collapse navbar-collapse",id:"navbarSupportedContent"},V={class:"navbar-nav me-auto mb-2 mb-lg-0"},A={class:"nav-item"},B={class:"nav-link"},F={class:"nav-item"},O={class:"nav-link"},R={class:"nav-item"},W={key:0,class:"nav-link"},j={key:1,class:"nav-link"},z={class:"nav-item"},E={key:0,id:"logout",class:"nav-link"},H={key:1,class:"nav-link"};function U(t,c,_,q,d,v){const s=k("router-link");return i(),l("nav",x,[e("div",T,[a(s,{tag:"a",style:{"text-decoration":"none",color:"black","font-weight":"100"},to:"/",class:"navbar-brand"},{default:o(()=>[w,C]),_:1}),N,e("div",D,[e("ul",V,[e("li",A,[e("a",B,[a(s,{to:"/"},{default:o(()=>[n("Home")]),_:1})])]),e("li",F,[e("a",O,[a(s,{to:"/insights"},{default:o(()=>[n("Insights")]),_:1})])]),e("li",R,[d.isLoggedIn?r("",!0):(i(),l("a",W,[a(s,{to:"/login"},{default:o(()=>[n("Login")]),_:1})])),d.isLoggedIn?(i(),l("a",j,[a(s,{to:"/account"},{default:o(()=>[n("Account Settings")]),_:1})])):r("",!0)]),e("li",z,[d.isLoggedIn?(i(),l("a",E,[a(s,{style:{"text-decoration":"none",color:"black","font-weight":"100"},onClick:v.logout,to:"/",class:"navlink"},{default:o(()=>[n("Logout")]),_:1},8,["onClick"])])):r("",!0),d.isLoggedIn?r("",!0):(i(),l("a",H,[a(s,{to:"/signup"},{default:o(()=>[n("Sign Up")]),_:1})]))])])])])])}const J=f(L,[["render",U],["__scopeId","data-v-9f58d794"]]);export{J as N,p as s};
|
1
dist/assets/SecurePage-156dc9e7.js
vendored
1
dist/assets/SecurePage-156dc9e7.js
vendored
@ -1 +0,0 @@
|
||||
import{N as c}from"./Navbar-6b07ba01.js";import{_ as s,r,o as l,c as u,a as i,F as p,i as m,b as _}from"./index-93b9eb88.js";import{g as f,c as d,h}from"./index.esm2017-da4ff3a2.js";const g={name:"SecurePage",components:{Navbar:c},created(){const o=f(m);let e=window.location.hostname;(e==="127.0.0.1"||e==="localhost")&&d(o,e,5001),h(o,"securefunction")().then(t=>{console.log(t)})}},F=_("h1",null,"Secure",-1);function N(o,e,n,t,b,v){const a=r("Navbar");return l(),u(p,null,[i(a),F],64)}const S=s(g,[["render",N]]);export{S as default};
|
1
dist/assets/SignUpPage-51a5895d.css
vendored
1
dist/assets/SignUpPage-51a5895d.css
vendored
@ -1 +0,0 @@
|
||||
#background[data-v-925f3a88]{margin:0;padding:0;width:100%;height:100%;position:absolute;background-color:#e0e0e0;font-family:sans-serif}.loginbox[data-v-925f3a88]{height:420px;width:320px;background:#000;color:#fff;top:50%;left:50%;position:absolute;transform:translate(-50%,-50%);box-sizing:border-box;padding:70px 30px}h1[data-v-925f3a88]{margin:0;padding:0 0 20px;font-size:22px;text-align:center}.loginbox p[data-v-925f3a88]{margin:0;padding:0;font-weight:700}.loginbox input[data-v-925f3a88]{width:100%;margin-bottom:20px}.loginbox input[type=email][data-v-925f3a88],input[type=password][data-v-925f3a88]{border:none;border-bottom:1px solid #fff;background:transparent;outline:none;height:40px;color:#fff;font-size:16px}.loginbox input[type=submit][data-v-925f3a88]:hover{cursor:pointer;background:#66a3ff;color:#000}.loginbox a[data-v-925f3a88]{text-decoration:none;font-size:12px;line-height:20px;color:#a9a9a9}.loginbox a[data-v-925f3a88]:hover{color:#ffc107}.loginbox input[type=submit][data-v-925f3a88]{border:none;outline:none;height:40px;background:#0052cc;font-size:18px;border-radius:20px}.avatar[data-v-925f3a88]{width:100px;height:100px;border-radius:50%;position:absolute;top:-50px;left:calc(50% - 50px)}
|
1
dist/assets/SignUpPage-52535c8d.js
vendored
Normal file
1
dist/assets/SignUpPage-52535c8d.js
vendored
Normal file
@ -0,0 +1 @@
|
||||
import{_ as g,g as w,a3 as _,r as h,o as i,c as r,a as u,b as e,q as d,v as l,w as v,F as f,e as y,h as k,p as P,j as b}from"./index-9a3ecfe5.js";import{t as x}from"./style-1561178c.js";import{N as S}from"./Navbar-fcee2b9c.js";import{_ as T,a as B}from"./315220_eye_icon-30328a0f.js";const U={name:"SignupPage",data(){return{email:"",password:"",toastMessage:"",toastBackground:"",showPassword:!1,toast:()=>{x(this.toastMessage,{hideProgressBar:!0,timeout:4e3,toastBackgroundColor:this.toastBackground})}}},components:{Navbar:S},methods:{showToast(t,s){this.toastMessage=t,this.toastBackground=s,this.toast()},signup(){if(!this.email||!this.password){this.showToast("Missing credentials","red");return}if(this.password.length<6){this.showToast("Password must be 6 or more characters","red");return}const t=w(y);_(t,this.email,this.password).then(()=>{this.showToast("Signed up successfully","green"),this.$router.push({path:"/"})}).catch(s=>{s.message.includes("already")?this.showToast("Email already in use","red"):s.message.includes("email")?this.showToast("Invalid email","red"):this.showToast(s.message,"red")})}}},n=t=>(P("data-v-0ac92d6f"),t=t(),b(),t),E={id:"background"},I={class:"loginbox"},N=n(()=>e("img",{src:"https://cdn.discordapp.com/attachments/1017419092447207436/1063092138029625394/pixil-frame-0.png",class:"avatar"},null,-1)),C=n(()=>e("h1",null,"Sign Up",-1)),V=n(()=>e("p",null,"Email Address",-1)),M=n(()=>e("p",null,"Password (6+ characters)",-1)),A={id:"imgDiv"};function D(t,s,F,j,a,p){const c=h("Navbar"),m=h("router-link");return i(),r(f,null,[u(c),e("div",E,[e("div",I,[N,C,V,d(e("input",{type:"email","onUpdate:modelValue":s[0]||(s[0]=o=>a.email=o),"aria-describedby":"emailHelp",placeholder:"Enter email"},null,512),[[l,a.email]]),M,e("div",A,[a.showPassword?(i(),r("img",{key:0,id:"eyeImg",src:T,onClick:s[1]||(s[1]=o=>this.showPassword=!this.showPassword),alt:"show"})):(i(),r("img",{key:1,id:"eyeImg",src:B,onClick:s[2]||(s[2]=o=>this.showPassword=!this.showPassword)}))]),a.showPassword?d((i(),r("input",{key:0,type:"text","onUpdate:modelValue":s[3]||(s[3]=o=>a.password=o),placeholder:"Enter password"},null,512)),[[l,a.password]]):d((i(),r("input",{key:1,type:"password","onUpdate:modelValue":s[4]||(s[4]=o=>a.password=o),placeholder:"Enter password"},null,512)),[[l,a.password]]),e("input",{onClick:s[5]||(s[5]=(...o)=>p.signup&&p.signup(...o)),type:"submit",name:"",value:"Sign Up"}),e("a",null,[u(m,{to:"/login"},{default:v(()=>[k("Already have an account?")]),_:1})])])])],64)}const G=g(U,[["render",D],["__scopeId","data-v-0ac92d6f"]]);export{G as default};
|
1
dist/assets/SignUpPage-839a656f.css
vendored
Normal file
1
dist/assets/SignUpPage-839a656f.css
vendored
Normal file
@ -0,0 +1 @@
|
||||
#background[data-v-0ac92d6f]{margin:0;padding:0;width:100%;height:100%;position:absolute;background-color:#e0e0e0;font-family:sans-serif}.loginbox[data-v-0ac92d6f]{height:420px;width:320px;background:#000;color:#fff;top:50%;left:50%;position:absolute;transform:translate(-50%,-50%);box-sizing:border-box;padding:70px 30px}#imgDiv[data-v-0ac92d6f]{height:10%;width:10%;right:40px;bottom:150px;position:absolute}#eyeImg[data-v-0ac92d6f]{height:80%;width:100%}#eyeImg[data-v-0ac92d6f]:hover{transform:scale(1.1)}h1[data-v-0ac92d6f]{margin:0;padding:0 0 20px;font-size:22px;text-align:center}.loginbox p[data-v-0ac92d6f]{margin:0;padding:0;font-weight:700}.loginbox input[data-v-0ac92d6f]{width:100%;margin-bottom:20px}.loginbox input[type=email][data-v-0ac92d6f],input[type=password][data-v-0ac92d6f],input[type=text][data-v-0ac92d6f]{border:none;border-bottom:1px solid #fff;background:transparent;outline:none;height:40px;color:#fff;font-size:16px}.loginbox input[type=submit][data-v-0ac92d6f]:hover{cursor:pointer;background:#66a3ff;color:#000}.loginbox a[data-v-0ac92d6f]{text-decoration:none;font-size:12px;line-height:20px;color:#a9a9a9}.loginbox a[data-v-0ac92d6f]:hover{color:#ffc107}.loginbox input[type=submit][data-v-0ac92d6f]{border:none;outline:none;height:40px;background:#0052cc;font-size:18px;border-radius:20px}.avatar[data-v-0ac92d6f]{width:100px;height:100px;border-radius:50%;position:absolute;top:-50px;left:calc(50% - 50px)}
|
1
dist/assets/SignUpPage-f56cbda8.js
vendored
1
dist/assets/SignUpPage-f56cbda8.js
vendored
@ -1 +0,0 @@
|
||||
import{_ as g,h,H as v,r as i,o as f,c as w,a as d,b as s,m as c,v as u,w as b,F as x,i as S,k,p as y,f as N}from"./index-93b9eb88.js";import{N as U}from"./Navbar-6b07ba01.js";const E={name:"SignupPage",data(){return{email:"",password:""}},components:{Navbar:U},methods:{signup(){const a=h(S);v(a,this.email,this.password).then(e=>{e.user,this.$router.push({path:"/secure"})}).catch(e=>{const r=e.code,l=e.message;console.log(r),console.log(l)})}}},n=a=>(y("data-v-925f3a88"),a=a(),N(),a),P={id:"background"},V={class:"loginbox"},A=n(()=>s("img",{src:"https://cdn.discordapp.com/attachments/1017419092447207436/1063092138029625394/pixil-frame-0.png",class:"avatar"},null,-1)),C=n(()=>s("h1",null,"Sign Up",-1)),I=n(()=>s("p",null,"Email Address",-1)),B=n(()=>s("p",null,"Password",-1));function F(a,e,r,l,t,p){const _=i("Navbar"),m=i("router-link");return f(),w(x,null,[d(_),s("div",P,[s("div",V,[A,C,I,c(s("input",{type:"email","onUpdate:modelValue":e[0]||(e[0]=o=>t.email=o),"aria-describedby":"emailHelp",placeholder:"Enter email"},null,512),[[u,t.email]]),B,c(s("input",{type:"password","onUpdate:modelValue":e[1]||(e[1]=o=>t.password=o),placeholder:"Enter password"},null,512),[[u,t.password]]),s("input",{onClick:e[2]||(e[2]=(...o)=>p.signup&&p.signup(...o)),type:"submit",name:"",value:"Sign Up"}),s("a",null,[d(m,{to:"/login"},{default:b(()=>[k("Already have an account?")]),_:1})])])])],64)}const T=g(E,[["render",F],["__scopeId","data-v-925f3a88"]]);export{T as default};
|
File diff suppressed because one or more lines are too long
@ -1,4 +1,4 @@
|
||||
import{y,C as I,z as N,A as D,B as g,D as C,E as O,G as _}from"./index-93b9eb88.js";/**
|
||||
import{x as y,C as I,y as N,z as D,A as g,B as C,D as O,G as _}from"./index-9a3ecfe5.js";/**
|
||||
* @license
|
||||
* Copyright 2017 Google LLC
|
||||
*
|
BIN
dist/assets/station-b60bd48f.png
vendored
Normal file
BIN
dist/assets/station-b60bd48f.png
vendored
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.2 KiB |
1
dist/assets/store-6f7621d4.js
vendored
1
dist/assets/store-6f7621d4.js
vendored
@ -1 +0,0 @@
|
||||
import{g as e}from"./index-93b9eb88.js";const r=e({insights:{},latestTrain:{},earliestTrain:{},orderedTrains:[],selectedDataMap:{},rawData:{},display:!1,setInsights(t){this.insights=t},setLatestTrain(t){this.latestTrain=t},setEarliestTrain(t){this.earliestTrain=t},setRawData(t){this.rawData=t},setOrderedTrains(t){t.sort((s,a)=>s.time-a.time),this.orderedTrains=t},setSelectedDataMap(t){this.selectedDataMap=t},setDisplay(t){this.display=t}});export{r as s};
|
1
dist/assets/style-1561178c.js
vendored
Normal file
1
dist/assets/style-1561178c.js
vendored
Normal file
File diff suppressed because one or more lines are too long
1
dist/assets/style-4629487b.css
vendored
Normal file
1
dist/assets/style-4629487b.css
vendored
Normal file
File diff suppressed because one or more lines are too long
6
dist/index.html
vendored
6
dist/index.html
vendored
@ -5,11 +5,11 @@
|
||||
<link rel="icon" href="/assets/train-solid-e7249eb7.svg">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Irish Rail Tracker</title>
|
||||
<script type="module" crossorigin src="/assets/index-93b9eb88.js"></script>
|
||||
<script type="module" crossorigin src="/assets/index-9a3ecfe5.js"></script>
|
||||
<link rel="stylesheet" href="/assets/index-a5eb0783.css">
|
||||
</head>
|
||||
<body>
|
||||
<div id="app"></div>
|
||||
<script type="module" src="/src/main.js"></script>
|
||||
|
||||
</body>
|
||||
</html>
|
||||
</html>
|
||||
|
@ -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