Actionable notifications

This commit is contained in:
estevez-dev 2020-05-24 18:10:18 +03:00
parent 783752ed65
commit 550aa45643
3 changed files with 196 additions and 82 deletions

View File

@ -151,6 +151,10 @@ exports.pushNotifyV2 = functions.https.onRequest(async (req, res) => {
return handleRequest(req, res, worker.createPayload);
});
exports.pushNotifyV3 = functions.https.onRequest(async (req, res) => {
return handleRequest(req, res, worker.createPayloadV3);
});
async function handleRequest(req, res, payloadHandler) {
if (debug()) console.log('Received payload', req.body);
var today = getToday();
@ -168,7 +172,7 @@ async function handleRequest(req, res, payloadHandler) {
payload['token'] = token;
var ref = db.collection('rateLimitsV2').doc(today).collection('tokens').doc(token);
var ref = db.collection(workerResult.collectionName).doc(today).collection('tokens').doc(token);
var docExists = false;
var docData = {

View File

@ -4,55 +4,55 @@
"lockfileVersion": 1,
"dependencies": {
"@firebase/app-types": {
"version": "0.6.0",
"resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.0.tgz",
"integrity": "sha512-ld6rzjXk/SUauHiQZJkeuSJpxIZ5wdnWuF5fWBFQNPaxsaJ9kyYg9GqEvwZ1z2e6JP5cU9gwRBlfW1WkGtGDYA=="
"version": "0.6.1",
"resolved": "https://registry.npmjs.org/@firebase/app-types/-/app-types-0.6.1.tgz",
"integrity": "sha512-L/ZnJRAq7F++utfuoTKX4CLBG5YR7tFO3PLzG1/oXXKEezJ0kRL3CMRoueBEmTCzVb/6SIs2Qlaw++uDgi5Xyg=="
},
"@firebase/auth-interop-types": {
"version": "0.1.4",
"resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.4.tgz",
"integrity": "sha512-CLKNS84KGAv5lRnHTQZFWoR11Ti7gIPFirDDXWek/fSU+TdYdnxJFR5XSD4OuGyzUYQ3Dq7aVj5teiRdyBl9hA=="
"version": "0.1.5",
"resolved": "https://registry.npmjs.org/@firebase/auth-interop-types/-/auth-interop-types-0.1.5.tgz",
"integrity": "sha512-88h74TMQ6wXChPA6h9Q3E1Jg6TkTHep2+k63OWg3s0ozyGVMeY+TTOti7PFPzq5RhszQPQOoCi59es4MaRvgCw=="
},
"@firebase/component": {
"version": "0.1.11",
"resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.11.tgz",
"integrity": "sha512-HZ0fwtv8/b3KV4NUOqlcIr03+CpBKW0F1Jo6/HJ39AutS6XXbM2jtpXOd1wMq9lbhBHgEwt1sMPNKoPR1bFflQ==",
"version": "0.1.12",
"resolved": "https://registry.npmjs.org/@firebase/component/-/component-0.1.12.tgz",
"integrity": "sha512-03w800MxR/EW1m7N0Q46WNcngwdDIHDWpFPHTdbZEI6U/HuLks5RJQlBxWqb1P73nYPkN8YP3U8gTdqrDpqY3Q==",
"requires": {
"@firebase/util": "0.2.46",
"@firebase/util": "0.2.47",
"tslib": "1.11.1"
}
},
"@firebase/database": {
"version": "0.6.2",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.2.tgz",
"integrity": "sha512-0D0WOqYlNg3NMi0hJPx18tun6FMfr31d1dZB0Lai0K5jScBhPr2h4Fy7yp5lyOklwDSAoBYxmpX4nzHuDheL9Q==",
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/@firebase/database/-/database-0.6.3.tgz",
"integrity": "sha512-gHoCISHQVLoq+rGu+PorYxMkhsjhXov3ocBxz/0uVdznNhrbKkAZaEKF+dIAsUPDlwSYeZuwWuik7xcV3DtRaw==",
"requires": {
"@firebase/auth-interop-types": "0.1.4",
"@firebase/component": "0.1.11",
"@firebase/database-types": "0.5.0",
"@firebase/logger": "0.2.3",
"@firebase/util": "0.2.46",
"@firebase/auth-interop-types": "0.1.5",
"@firebase/component": "0.1.12",
"@firebase/database-types": "0.5.1",
"@firebase/logger": "0.2.4",
"@firebase/util": "0.2.47",
"faye-websocket": "0.11.3",
"tslib": "1.11.1"
}
},
"@firebase/database-types": {
"version": "0.5.0",
"resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.0.tgz",
"integrity": "sha512-6/W3frFznYOALtw2nrWVPK2ytgdl89CzTqVBHCCGf22wT6uKU63iDBo+Nw+7olFGpD15O0zwYalFIcMZ27tkew==",
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@firebase/database-types/-/database-types-0.5.1.tgz",
"integrity": "sha512-onQxom1ZBYBJ648w/VNRzUewovEDAH7lvnrrpCd69ukkyrMk6rGEO/PQ9BcNEbhlNtukpsqRS0oNOFlHs0FaSA==",
"requires": {
"@firebase/app-types": "0.6.0"
"@firebase/app-types": "0.6.1"
}
},
"@firebase/logger": {
"version": "0.2.3",
"resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.3.tgz",
"integrity": "sha512-PrYcr1bWF+QpVnFxvNSZYBAzgL1WJFWIOvoLAfvRoXiinwqh1jbePN6lXbX7c8THaNUelEYIUOzDPdJ4IZ5+Sw=="
"version": "0.2.4",
"resolved": "https://registry.npmjs.org/@firebase/logger/-/logger-0.2.4.tgz",
"integrity": "sha512-akHkOU7izYB1okp/B5sxClGjjw6KvZdSHyjNM5pKd67Zg5W6PsbkI/GFNv21+y6LkUkJwDRbdeDgJoYXWT3mMA=="
},
"@firebase/util": {
"version": "0.2.46",
"resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.46.tgz",
"integrity": "sha512-rKzQRc7YAbve+MECliis5ac6lRB1AZgOyZdoAbXaEtmGWUwnlM99uNhCekA963CaBkzlHwQG2inLf3WGW7nLFA==",
"version": "0.2.47",
"resolved": "https://registry.npmjs.org/@firebase/util/-/util-0.2.47.tgz",
"integrity": "sha512-RjcIvcfswyxYhf0OMXod+qeI/933wl9FGLIszf0/O1yMZ/s8moXcse7xnOpMjmQPRLB9vHzCMoxW5X90kKg/bQ==",
"requires": {
"tslib": "1.11.1"
}
@ -137,30 +137,35 @@
"stream-events": "^1.0.1",
"through2": "^3.0.0",
"xdg-basedir": "^4.0.0"
},
"dependencies": {
"gaxios": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz",
"integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==",
"optional": true,
"requires": {
"abort-controller": "^3.0.0",
"extend": "^3.0.2",
"https-proxy-agent": "^5.0.0",
"is-stream": "^2.0.0",
"node-fetch": "^2.3.0"
}
}
}
},
"@grpc/grpc-js": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.3.tgz",
"integrity": "sha512-JKV3f5Bv2TZxK6eJSB9EarsZrnLxrvcFNwI9goq0YRXa3S6NNoCSnI3cG3lkXVIJ03Wng1WXe76kc2JQtRe7AQ==",
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/@grpc/grpc-js/-/grpc-js-1.0.4.tgz",
"integrity": "sha512-Qawt6HUrEmljQMPWnLnIXpcjelmtIAydi3M9awiG02WWJ1CmIvFEx4IOC1EsWUWUlabOGksRbpfvoIeZKFTNXw==",
"optional": true,
"requires": {
"google-auth-library": "^6.0.0",
"semver": "^6.2.0"
},
"dependencies": {
"google-auth-library": {
"version": "6.0.0",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-6.0.0.tgz",
"integrity": "sha512-uLydy1t6SHN/EvYUJrtN3GCHFrnJ0c8HJjOxXiGjoTuYHIoCUT3jVxnzmjHwVnSdkfE9Akasm2rM6qG1COTXfQ==",
"optional": true,
"requires": {
"arrify": "^2.0.0",
"base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11",
"fast-text-encoding": "^1.0.0",
"gaxios": "^3.0.0",
"gcp-metadata": "^4.0.0",
"gtoken": "^5.0.0",
"jws": "^4.0.0",
"lru-cache": "^5.0.0"
}
}
}
},
"@grpc/proto-loader": {
@ -308,14 +313,14 @@
"integrity": "sha512-4kPlzbljFcsttWEq6aBW0OZe6BDajAmyvr2xknBG92tejQnvdGtT9+kXSZ580DqpxY9qG2xeQVF9Dq0ymUTo5Q=="
},
"@types/node": {
"version": "8.10.60",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.60.tgz",
"integrity": "sha512-YjPbypHFuiOV0bTgeF07HpEEqhmHaZqYNSdCKeBJa+yFoQ/7BC+FpJcwmi34xUIIRVFktnUyP1dPU8U0612GOg=="
"version": "8.10.61",
"resolved": "https://registry.npmjs.org/@types/node/-/node-8.10.61.tgz",
"integrity": "sha512-l+zSbvT8TPRaCxL1l9cwHCb0tSqGAGcjPJFItGGYat5oCTiq1uQQKYg5m7AF1mgnEBzFXGLJ2LRmNjtreRX76Q=="
},
"@types/qs": {
"version": "6.9.2",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.2.tgz",
"integrity": "sha512-a9bDi4Z3zCZf4Lv1X/vwnvbbDYSNz59h3i3KdyuYYN+YrLjSeJD0dnphdULDfySvUv6Exy/O0K6wX/kQpnPQ+A=="
"version": "6.9.3",
"resolved": "https://registry.npmjs.org/@types/qs/-/qs-6.9.3.tgz",
"integrity": "sha512-7s9EQWupR1fTc2pSMtXRQ9w9gLOcrJn+h7HOXw4evxyvVqMi4f+q7d2tnFe3ng3SNHjtK+0EzGMGFUQX4/AQRA=="
},
"@types/range-parser": {
"version": "1.2.3",
@ -323,9 +328,9 @@
"integrity": "sha512-ewFXqrQHlFsgc09MK5jP5iR7vumV/BYayNC6PgJO2LPe8vrnNFyjQjSppfEngITi0qvfKtzFvgKymGheFM9UOA=="
},
"@types/serve-static": {
"version": "1.13.3",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.3.tgz",
"integrity": "sha512-oprSwp094zOglVrXdlo/4bAHtKTAxX6VT8FOZlBKrmyLbNvE1zxZyJ6yikMVtHIvwP45+ZQGJn+FdXGKTozq0g==",
"version": "1.13.4",
"resolved": "https://registry.npmjs.org/@types/serve-static/-/serve-static-1.13.4.tgz",
"integrity": "sha512-jTDt0o/YbpNwZbQmE/+2e+lfjJEJJR0I3OFaKQKPWkASkCoW3i6fsUnqudSMcNAfbtmADGu8f4MV4q+GqULmug==",
"requires": {
"@types/express-serve-static-core": "*",
"@types/mime": "*"
@ -947,6 +952,75 @@
"integrity": "sha1-GwqzvVU7Kg1jmdKcDj6gslIHgyc=",
"optional": true
},
"gaxios": {
"version": "3.0.3",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-3.0.3.tgz",
"integrity": "sha512-PkzQludeIFhd535/yucALT/Wxyj/y2zLyrMwPcJmnLHDugmV49NvAi/vb+VUq/eWztATZCNcb8ue+ywPG+oLuw==",
"optional": true,
"requires": {
"abort-controller": "^3.0.0",
"extend": "^3.0.2",
"https-proxy-agent": "^5.0.0",
"is-stream": "^2.0.0",
"node-fetch": "^2.3.0"
}
},
"gcp-metadata": {
"version": "4.1.0",
"resolved": "https://registry.npmjs.org/gcp-metadata/-/gcp-metadata-4.1.0.tgz",
"integrity": "sha512-r57SV28+olVsflPlKyVig3Muo/VDlcsObMtvDGOEtEJXj+DDE8bEl0coIkXh//hbkSDTvo+f5lbihZOndYXQQQ==",
"optional": true,
"requires": {
"gaxios": "^3.0.0",
"json-bigint": "^0.3.0"
}
},
"gcs-resumable-upload": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz",
"integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==",
"optional": true,
"requires": {
"abort-controller": "^3.0.0",
"configstore": "^5.0.0",
"gaxios": "^2.0.0",
"google-auth-library": "^5.0.0",
"pumpify": "^2.0.0",
"stream-events": "^1.0.4"
},
"dependencies": {
"gaxios": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz",
"integrity": "sha512-US8UMj8C5pRnao3Zykc4AAVr+cffoNKRTg9Rsf2GiuZCW69vgJj38VK2PzlPuQU73FZ/nTk9/Av6/JGcE1N9vA==",
"optional": true,
"requires": {
"abort-controller": "^3.0.0",
"extend": "^3.0.2",
"https-proxy-agent": "^5.0.0",
"is-stream": "^2.0.0",
"node-fetch": "^2.3.0"
}
}
}
},
"google-auth-library": {
"version": "5.10.1",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz",
"integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==",
"optional": true,
"requires": {
"arrify": "^2.0.0",
"base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11",
"fast-text-encoding": "^1.0.0",
"gaxios": "^2.1.0",
"gcp-metadata": "^3.4.0",
"gtoken": "^4.1.0",
"jws": "^4.0.0",
"lru-cache": "^5.0.0"
},
"dependencies": {
"gaxios": {
"version": "2.3.4",
"resolved": "https://registry.npmjs.org/gaxios/-/gaxios-2.3.4.tgz",
@ -970,35 +1044,33 @@
"json-bigint": "^0.3.0"
}
},
"gcs-resumable-upload": {
"version": "2.3.3",
"resolved": "https://registry.npmjs.org/gcs-resumable-upload/-/gcs-resumable-upload-2.3.3.tgz",
"integrity": "sha512-sf896I5CC/1AxeaGfSFg3vKMjUq/r+A3bscmVzZm10CElyRanN0XwPu/MxeIO4LSP+9uF6yKzXvNsaTsMXUG6Q==",
"google-p12-pem": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz",
"integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==",
"optional": true,
"requires": {
"abort-controller": "^3.0.0",
"configstore": "^5.0.0",
"gaxios": "^2.0.0",
"google-auth-library": "^5.0.0",
"pumpify": "^2.0.0",
"stream-events": "^1.0.4"
"node-forge": "^0.9.0"
}
},
"google-auth-library": {
"version": "5.10.1",
"resolved": "https://registry.npmjs.org/google-auth-library/-/google-auth-library-5.10.1.tgz",
"integrity": "sha512-rOlaok5vlpV9rSiUu5EpR0vVpc+PhN62oF4RyX/6++DG1VsaulAFEMlDYBLjJDDPI6OcNOCGAKy9UVB/3NIDXg==",
"gtoken": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz",
"integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==",
"optional": true,
"requires": {
"arrify": "^2.0.0",
"base64-js": "^1.3.0",
"ecdsa-sig-formatter": "^1.0.11",
"fast-text-encoding": "^1.0.0",
"gaxios": "^2.1.0",
"gcp-metadata": "^3.4.0",
"gtoken": "^4.1.0",
"google-p12-pem": "^2.0.0",
"jws": "^4.0.0",
"lru-cache": "^5.0.0"
"mime": "^2.2.0"
}
},
"node-forge": {
"version": "0.9.1",
"resolved": "https://registry.npmjs.org/node-forge/-/node-forge-0.9.1.tgz",
"integrity": "sha512-G6RlQt5Sb4GMBzXvhfkeFmbqR6MzhtnT7VTHuLadjkii3rdYHNdw0m8zA4BTxVIh68FicCQ2NSUANpsqkr9jvQ==",
"optional": true
}
}
},
"google-gax": {
@ -1025,9 +1097,9 @@
}
},
"google-p12-pem": {
"version": "2.0.4",
"resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-2.0.4.tgz",
"integrity": "sha512-S4blHBQWZRnEW44OcR7TL9WR+QCqByRvhNDZ/uuQfpxywfupikf/miba8js1jZi6ZOGv5slgSuoshCWh6EMDzg==",
"version": "3.0.1",
"resolved": "https://registry.npmjs.org/google-p12-pem/-/google-p12-pem-3.0.1.tgz",
"integrity": "sha512-VlQgtozgNVVVcYTXS36eQz4PXPt9gIPqLOhHN0QiV6W6h4qSCNVKPtKC5INtJsaHHF2r7+nOIa26MJeJMTaZEQ==",
"optional": true,
"requires": {
"node-forge": "^0.9.0"
@ -1048,13 +1120,13 @@
"optional": true
},
"gtoken": {
"version": "4.1.4",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-4.1.4.tgz",
"integrity": "sha512-VxirzD0SWoFUo5p8RDP8Jt2AGyOmyYcT/pOUgDKJCK+iSw0TMqwrVfY37RXTNmoKwrzmDHSk0GMT9FsgVmnVSA==",
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/gtoken/-/gtoken-5.0.1.tgz",
"integrity": "sha512-33w4FNDkUcyIOq/TqyC+drnKdI4PdXmWp9lZzssyEQKuvu9ZFN3KttaSnDKo52U3E51oujVGop93mKxmqO8HHg==",
"optional": true,
"requires": {
"gaxios": "^2.1.0",
"google-p12-pem": "^2.0.0",
"gaxios": "^3.0.0",
"google-p12-pem": "^3.0.0",
"jws": "^4.0.0",
"mime": "^2.2.0"
}
@ -1140,9 +1212,9 @@
}
},
"http-parser-js": {
"version": "0.4.10",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.4.10.tgz",
"integrity": "sha1-ksnBN0w1CF912zWexWzCV8u5P6Q="
"version": "0.5.2",
"resolved": "https://registry.npmjs.org/http-parser-js/-/http-parser-js-0.5.2.tgz",
"integrity": "sha512-opCO9ASqg5Wy2FNo7A0sxy71yGbbkJJXLdgMK04Tcypw9jr2MgWbyubb0+WdmDmGnFflO7fRbqbaihh/ENDlRQ=="
},
"http-proxy-agent": {
"version": "4.0.1",
@ -1638,9 +1710,9 @@
},
"dependencies": {
"@types/node": {
"version": "13.13.6",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.6.tgz",
"integrity": "sha512-zqRj8ugfROCjXCNbmPBe2mmQ0fJWP9lQaN519hwunOgpHgVykme4G6FW95++dyNFDvJUk4rtExkVkL0eciu5NA==",
"version": "13.13.9",
"resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.9.tgz",
"integrity": "sha512-EPZBIGed5gNnfWCiwEIwTE2Jdg4813odnG8iNPMQGrqVxrI+wL68SPtPeCX+ZxGBaA6pKAVc6jaKgP/Q0QzfdQ==",
"optional": true
}
}
@ -2027,11 +2099,11 @@
"optional": true
},
"websocket-driver": {
"version": "0.7.3",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.3.tgz",
"integrity": "sha512-bpxWlvbbB459Mlipc5GBzzZwhoZgGEZLuqPaR0INBGnPAY1vdBX6hPnoFXiw+3yWxDuHyQjO2oXTMyS8A5haFg==",
"version": "0.7.4",
"resolved": "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz",
"integrity": "sha512-b17KeDIQVjvb0ssuSDF2cYXSg2iztliJ4B9WdsuB6J952qCPKmnVq4DyW5motImXHDC1cBT/1UezrJVsKw5zjg==",
"requires": {
"http-parser-js": ">=0.4.0 <0.4.11",
"http-parser-js": ">=0.5.1",
"safe-buffer": ">=5.1.0",
"websocket-extensions": ">=0.1.1"
}

View File

@ -36,6 +36,44 @@ module.exports = {
}
}
return { updateRateLimits: updateRateLimits, payload: payload };
return { updateRateLimits: updateRateLimits, payload: payload, collectionName: 'rateLimitsV2' };
},
createPayloadV3: function createPayload(req) {
// Payload according to
// https://firebase.google.com/docs/reference/admin/node/TokenMessage
var payload = {
data: {},
};
var updateRateLimits = true;
if (req.body.message) {
payload.data.body = req.body.message;
}
if (req.body.title) {
payload.data.title = req.body.title;
}
// https://firebase.google.com/docs/reference/admin/node/admin.messaging.AndroidNotification
if (req.body.data) {
if (req.body.data.image) {
payload.data.imageUrl = req.body.data.image;
}
for (const key of ['color', 'channelId', 'image', 'tag']) {
if (req.body.data[key]) {
payload.data[key] = String(req.body.data[key])
}
}
if (req.body.data['actions'] && req.body.data['actions'].length > 0) {
for (var i = 1; i <= req.body.data['actions'].length; i++) {
var action = req.body.data['actions'][i-1];
payload.data['action' + i] = String(action.title);
payload.data['action' + i + '_data'] = JSON.stringify(action);
}
}
}
return {updateRateLimits: updateRateLimits, payload: payload, collectionName: 'rateLimitsV3'};
}
}