diff --git a/firebase-debug.log b/firebase-debug.log new file mode 100644 index 0000000..e483a51 --- /dev/null +++ b/firebase-debug.log @@ -0,0 +1,108 @@ +[debug] [2021-04-14T15:02:44.296Z] ---------------------------------------------------------------------- +[debug] [2021-04-14T15:02:44.297Z] Command: C:\Program Files\nodejs\node.exe C:\Users\ayush\AppData\Roaming\npm\node_modules\firebase-tools\lib\bin\firebase.js deploy --only functions +[debug] [2021-04-14T15:02:44.298Z] CLI Version: 9.10.0 +[debug] [2021-04-14T15:02:44.298Z] Platform: win32 +[debug] [2021-04-14T15:02:44.298Z] Node Version: v12.19.0 +[debug] [2021-04-14T15:02:44.299Z] Time: Wed Apr 14 2021 11:02:44 GMT-0400 (Eastern Daylight Time) +[debug] [2021-04-14T15:02:44.299Z] ---------------------------------------------------------------------- +[debug] +[debug] [2021-04-14T15:02:44.304Z] > command requires scopes: ["email","openid","https://www.googleapis.com/auth/cloudplatformprojects.readonly","https://www.googleapis.com/auth/firebase","https://www.googleapis.com/auth/cloud-platform"] +[debug] [2021-04-14T15:02:44.305Z] > authorizing via signed-in user (ayushyamitabh@gmail.com) +[debug] [2021-04-14T15:02:44.305Z] [iam] checking project vaxandme for permissions ["cloudfunctions.functions.create","cloudfunctions.functions.delete","cloudfunctions.functions.get","cloudfunctions.functions.list","cloudfunctions.functions.update","cloudfunctions.operations.get","firebase.projects.get"] +[debug] [2021-04-14T15:02:44.306Z] >>> HTTP REQUEST POST https://cloudresourcemanager.googleapis.com/v1/projects/vaxandme:testIamPermissions + {"permissions":["cloudfunctions.functions.create","cloudfunctions.functions.delete","cloudfunctions.functions.get","cloudfunctions.functions.list","cloudfunctions.functions.update","cloudfunctions.operations.get","firebase.projects.get"]} +[debug] [2021-04-14T15:02:44.519Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:43 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","server-timing":"gfet4t7; dur=145","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[debug] [2021-04-14T15:02:44.520Z] >>> HTTP REQUEST POST https://iam.googleapis.com/v1/projects/vaxandme/serviceAccounts/vaxandme@appspot.gserviceaccount.com:testIamPermissions + {"permissions":["iam.serviceAccounts.actAs"]} +[debug] [2021-04-14T15:02:44.740Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:43 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[info] +[info] === Deploying to 'vaxandme'... +[info] +[info] i deploying functions +[info] Running command: npm --prefix "$RESOURCE_DIR" run lint +[info] Running command: npm --prefix "$RESOURCE_DIR" run build +[info] + functions: Finished running predeploy script. +[info] i functions: ensuring required API cloudfunctions.googleapis.com is enabled... +[info] i functions: ensuring required API cloudbuild.googleapis.com is enabled... +[debug] [2021-04-14T15:02:56.281Z] >>> HTTP REQUEST GET https://serviceusage.googleapis.com/v1/projects/vaxandme/services/cloudfunctions.googleapis.com + +[debug] [2021-04-14T15:02:56.281Z] >>> HTTP REQUEST GET https://serviceusage.googleapis.com/v1/projects/vaxandme/services/runtimeconfig.googleapis.com + +[debug] [2021-04-14T15:02:56.281Z] >>> HTTP REQUEST GET https://serviceusage.googleapis.com/v1/projects/vaxandme/services/cloudbuild.googleapis.com + +[debug] [2021-04-14T15:02:56.702Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:55 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[debug] [2021-04-14T15:02:56.702Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:55 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[info] + functions: required API cloudbuild.googleapis.com is enabled +[debug] [2021-04-14T15:02:56.728Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:55 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[info] + functions: required API cloudfunctions.googleapis.com is enabled +[debug] [2021-04-14T15:02:56.729Z] >>> HTTP REQUEST GET https://firebase.googleapis.com/v1beta1/projects/vaxandme/adminSdkConfig + +[debug] [2021-04-14T15:02:56.994Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:55 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[info] i functions: preparing functions directory for uploading... +[debug] [2021-04-14T15:02:56.995Z] >>> HTTP REQUEST GET https://runtimeconfig.googleapis.com/v1beta1/projects/vaxandme/configs + +[debug] [2021-04-14T15:02:57.329Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:56 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[info] i functions: packaged functions (48.93 KB) for uploading +[debug] [2021-04-14T15:02:57.499Z] > [functions] package.json contents: { + "name": "functions", + "scripts": { + "lint": "eslint --ext .js,.ts .", + "build": "tsc", + "serve": "npm run build && firebase emulators:start --only functions", + "shell": "npm run build && firebase functions:shell", + "start": "npm run shell", + "deploy": "firebase deploy --only functions", + "logs": "firebase functions:log" + }, + "engines": { + "node": "12" + }, + "main": "lib/index.js", + "dependencies": { + "firebase-admin": "^9.2.0", + "firebase-functions": "^3.11.0" + }, + "devDependencies": { + "@typescript-eslint/eslint-plugin": "^3.9.1", + "@typescript-eslint/parser": "^3.8.0", + "eslint": "^7.6.0", + "eslint-config-google": "^0.14.0", + "eslint-plugin-import": "^2.22.0", + "firebase-functions-test": "^0.2.0", + "typescript": "^3.8.0" + }, + "private": true +} +[debug] [2021-04-14T15:02:57.500Z] >>> HTTP REQUEST GET https://cloudfunctions.googleapis.com/v1/projects/vaxandme/locations/-/functions + +[debug] [2021-04-14T15:02:59.025Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:58 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[debug] [2021-04-14T15:02:59.026Z] >>> HTTP REQUEST POST https://cloudfunctions.googleapis.com/v1/projects/vaxandme/locations/us-central1/functions:generateUploadUrl + +[debug] [2021-04-14T15:02:59.617Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:58 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[debug] [2021-04-14T15:02:59.617Z] >>> HTTP REQUEST PUT https://storage.googleapis.com/gcf-upload-us-central1-a3e8d99e-f910-4259-8532-3499c31a2b18/d09fdf34-2465-4273-a031-cf401455649d.zip?GoogleAccessId=service-614738281692@gcf-admin-robot.iam.gserviceaccount.com&Expires=1618414378&Signature=IgSMxAXuyn%2B5KFFWn5ocmdXb0kCD7pCpVkJ7DlBGrYzozBNE0%2FbsTPs1kloWKXBbZXTVIQEp6K9kmxDzV74pYgG7kIfxlDXvyOKoz61Tac7JiCOiWtOoyN8KJRQFC2J4D4jqvL4Mp%2BaA3ndFWD50OWiB%2F6O%2FdpVPbTAI7SqJsrzxyV92MYA02R7n2AWvvpYOsZsGivU0WI70ZI3aQLdqzVFgV9WaV6Vk9zRtwCWHQNLwQ7nTw3ixhIpU%2BFtDcYe67DB8AeHNWnI71sR4ksdT5kV1sjpgf2pc45l%2BKATPoIgOHLPCgDfM6Io64xEUzBG0TK3eLXiEi00bGHwfbd8N4g%3D%3D + +[debug] [2021-04-14T15:02:59.802Z] <<< HTTP RESPONSE 200 {"x-guploader-uploadid":"ABg5-UxK4At3xlowXTiYdn0rHwGayMkbEeI59N2pKrCSFzbO56f8rqSbXtYm41zJGuBNBWb4pla8OkpyH-0-LQqlzdmCGPHMFQ","etag":"\"d549deb979878a67ee673172d8034ae6\"","x-goog-generation":"1618412578780488","x-goog-metageneration":"1","x-goog-hash":"crc32c=Q6RTyA==, md5=1UneuXmHimfuZzFy2ANK5g==","x-goog-stored-content-length":"50100","x-goog-stored-content-encoding":"identity","vary":"Origin","content-length":"0","date":"Wed, 14 Apr 2021 15:02:58 GMT","server":"UploadServer","content-type":"text/html; charset=UTF-8","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\""} +[info] + functions: functions folder uploaded successfully +[info] i functions: updating Node.js 12 function saveResult(us-central1)... +[debug] [2021-04-14T15:02:59.805Z] >>> HTTP REQUEST PATCH https://cloudfunctions.googleapis.com/v1/projects/vaxandme/locations/us-central1/functions/saveResult {"updateMask":"sourceUploadUrl,name,labels,runtime,environmentVariables,httpsTrigger"} + {"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-a3e8d99e-f910-4259-8532-3499c31a2b18/d09fdf34-2465-4273-a031-cf401455649d.zip?GoogleAccessId=service-614738281692@gcf-admin-robot.iam.gserviceaccount.com&Expires=1618414378&Signature=IgSMxAXuyn%2B5KFFWn5ocmdXb0kCD7pCpVkJ7DlBGrYzozBNE0%2FbsTPs1kloWKXBbZXTVIQEp6K9kmxDzV74pYgG7kIfxlDXvyOKoz61Tac7JiCOiWtOoyN8KJRQFC2J4D4jqvL4Mp%2BaA3ndFWD50OWiB%2F6O%2FdpVPbTAI7SqJsrzxyV92MYA02R7n2AWvvpYOsZsGivU0WI70ZI3aQLdqzVFgV9WaV6Vk9zRtwCWHQNLwQ7nTw3ixhIpU%2BFtDcYe67DB8AeHNWnI71sR4ksdT5kV1sjpgf2pc45l%2BKATPoIgOHLPCgDfM6Io64xEUzBG0TK3eLXiEi00bGHwfbd8N4g%3D%3D","name":"projects/vaxandme/locations/us-central1/functions/saveResult","labels":{"deployment-tool":"cli-firebase","deployment-callable":"true"},"httpsTrigger":{},"runtime":"nodejs12","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"vaxandme\",\"storageBucket\":\"vaxandme.appspot.com\",\"locationId\":\"us-central\"}"}} +[debug] [2021-04-14T15:03:00.310Z] <<< HTTP RESPONSE 200 {"content-type":"application/json; charset=UTF-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","date":"Wed, 14 Apr 2021 15:02:59 GMT","server":"ESF","cache-control":"private","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[debug] [2021-04-14T15:03:00.312Z] > refreshing access token with scopes: [] +[debug] [2021-04-14T15:03:00.312Z] >>> HTTP REQUEST POST https://www.googleapis.com/oauth2/v3/token + +[debug] [2021-04-14T15:03:00.406Z] <<< HTTP RESPONSE 200 {"date":"Wed, 14 Apr 2021 15:02:59 GMT","cache-control":"no-cache, no-store, max-age=0, must-revalidate","pragma":"no-cache","expires":"Mon, 01 Jan 1990 00:00:00 GMT","content-type":"application/json; charset=utf-8","vary":"X-Origin, Referer, Origin,Accept-Encoding","server":"scaffolding on HTTPServer2","x-xss-protection":"0","x-frame-options":"SAMEORIGIN","x-content-type-options":"nosniff","alt-svc":"h3-29=\":443\"; ma=2592000,h3-T051=\":443\"; ma=2592000,h3-Q050=\":443\"; ma=2592000,h3-Q046=\":443\"; ma=2592000,h3-Q043=\":443\"; ma=2592000,quic=\":443\"; ma=2592000; v=\"46,43\"","accept-ranges":"none","transfer-encoding":"chunked"} +[debug] [2021-04-14T15:03:00.414Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw [none] +[debug] [2021-04-14T15:03:00.609Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw 200 +[debug] [2021-04-14T15:03:00.609Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw {"name":"operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/vaxandme/locations/us-central1/functions/saveResult","type":"UPDATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/vaxandme/locations/us-central1/functions/saveResult","httpsTrigger":{},"status":"ACTIVE","entryPoint":"saveResult","timeout":"60s","availableMemoryMb":256,"serviceAccountEmail":"vaxandme@appspot.gserviceaccount.com","updateTime":"2021-04-14T05:16:08.489Z","versionId":"2","labels":{"deployment-tool":"cli-firebase","deployment-callable":"true"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-a3e8d99e-f910-4259-8532-3499c31a2b18/d09fdf34-2465-4273-a031-cf401455649d.zip?GoogleAccessId=service-614738281692@gcf-admin-robot.iam.gserviceaccount.com&Expires=1618414378&Signature=IgSMxAXuyn%2B5KFFWn5ocmdXb0kCD7pCpVkJ7DlBGrYzozBNE0%2FbsTPs1kloWKXBbZXTVIQEp6K9kmxDzV74pYgG7kIfxlDXvyOKoz61Tac7JiCOiWtOoyN8KJRQFC2J4D4jqvL4Mp%2BaA3ndFWD50OWiB%2F6O%2FdpVPbTAI7SqJsrzxyV92MYA02R7n2AWvvpYOsZsGivU0WI70ZI3aQLdqzVFgV9WaV6Vk9zRtwCWHQNLwQ7nTw3ixhIpU%2BFtDcYe67DB8AeHNWnI71sR4ksdT5kV1sjpgf2pc45l%2BKATPoIgOHLPCgDfM6Io64xEUzBG0TK3eLXiEi00bGHwfbd8N4g%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"vaxandme\",\"storageBucket\":\"vaxandme.appspot.com\",\"locationId\":\"us-central\"}"},"runtime":"nodejs12","ingressSettings":"ALLOW_ALL","buildId":"a35fdaab-c6e7-4ac2-b168-c8f2648884dd"},"versionId":"3","updateTime":"2021-04-14T15:02:59Z"}} +[debug] [2021-04-14T15:03:01.116Z] [update-projects/vaxandme/locations/us-central1/functions/saveResult] Retrying task index 0 +[debug] [2021-04-14T15:03:01.116Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw [none] +[debug] [2021-04-14T15:03:01.298Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw 200 +[debug] [2021-04-14T15:03:01.298Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw {"name":"operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/vaxandme/locations/us-central1/functions/saveResult","type":"UPDATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/vaxandme/locations/us-central1/functions/saveResult","httpsTrigger":{},"status":"ACTIVE","entryPoint":"saveResult","timeout":"60s","availableMemoryMb":256,"serviceAccountEmail":"vaxandme@appspot.gserviceaccount.com","updateTime":"2021-04-14T05:16:08.489Z","versionId":"2","labels":{"deployment-tool":"cli-firebase","deployment-callable":"true"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-a3e8d99e-f910-4259-8532-3499c31a2b18/d09fdf34-2465-4273-a031-cf401455649d.zip?GoogleAccessId=service-614738281692@gcf-admin-robot.iam.gserviceaccount.com&Expires=1618414378&Signature=IgSMxAXuyn%2B5KFFWn5ocmdXb0kCD7pCpVkJ7DlBGrYzozBNE0%2FbsTPs1kloWKXBbZXTVIQEp6K9kmxDzV74pYgG7kIfxlDXvyOKoz61Tac7JiCOiWtOoyN8KJRQFC2J4D4jqvL4Mp%2BaA3ndFWD50OWiB%2F6O%2FdpVPbTAI7SqJsrzxyV92MYA02R7n2AWvvpYOsZsGivU0WI70ZI3aQLdqzVFgV9WaV6Vk9zRtwCWHQNLwQ7nTw3ixhIpU%2BFtDcYe67DB8AeHNWnI71sR4ksdT5kV1sjpgf2pc45l%2BKATPoIgOHLPCgDfM6Io64xEUzBG0TK3eLXiEi00bGHwfbd8N4g%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"vaxandme\",\"storageBucket\":\"vaxandme.appspot.com\",\"locationId\":\"us-central\"}"},"runtime":"nodejs12","ingressSettings":"ALLOW_ALL","buildId":"a35fdaab-c6e7-4ac2-b168-c8f2648884dd"},"versionId":"3","updateTime":"2021-04-14T15:02:59Z"}} +[debug] [2021-04-14T15:03:02.307Z] [update-projects/vaxandme/locations/us-central1/functions/saveResult] Retrying task index 0 +[debug] [2021-04-14T15:03:02.307Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw [none] +[debug] [2021-04-14T15:03:02.607Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw 200 +[debug] [2021-04-14T15:03:02.608Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw {"name":"operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/vaxandme/locations/us-central1/functions/saveResult","type":"UPDATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/vaxandme/locations/us-central1/functions/saveResult","httpsTrigger":{},"status":"ACTIVE","entryPoint":"saveResult","timeout":"60s","availableMemoryMb":256,"serviceAccountEmail":"vaxandme@appspot.gserviceaccount.com","updateTime":"2021-04-14T05:16:08.489Z","versionId":"2","labels":{"deployment-tool":"cli-firebase","deployment-callable":"true"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-a3e8d99e-f910-4259-8532-3499c31a2b18/d09fdf34-2465-4273-a031-cf401455649d.zip?GoogleAccessId=service-614738281692@gcf-admin-robot.iam.gserviceaccount.com&Expires=1618414378&Signature=IgSMxAXuyn%2B5KFFWn5ocmdXb0kCD7pCpVkJ7DlBGrYzozBNE0%2FbsTPs1kloWKXBbZXTVIQEp6K9kmxDzV74pYgG7kIfxlDXvyOKoz61Tac7JiCOiWtOoyN8KJRQFC2J4D4jqvL4Mp%2BaA3ndFWD50OWiB%2F6O%2FdpVPbTAI7SqJsrzxyV92MYA02R7n2AWvvpYOsZsGivU0WI70ZI3aQLdqzVFgV9WaV6Vk9zRtwCWHQNLwQ7nTw3ixhIpU%2BFtDcYe67DB8AeHNWnI71sR4ksdT5kV1sjpgf2pc45l%2BKATPoIgOHLPCgDfM6Io64xEUzBG0TK3eLXiEi00bGHwfbd8N4g%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"vaxandme\",\"storageBucket\":\"vaxandme.appspot.com\",\"locationId\":\"us-central\"}"},"runtime":"nodejs12","ingressSettings":"ALLOW_ALL","buildId":"a35fdaab-c6e7-4ac2-b168-c8f2648884dd"},"versionId":"3","updateTime":"2021-04-14T15:02:59Z"}} +[debug] [2021-04-14T15:03:04.617Z] [update-projects/vaxandme/locations/us-central1/functions/saveResult] Retrying task index 0 +[debug] [2021-04-14T15:03:04.617Z] >>> [apiv2][query] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw [none] +[debug] [2021-04-14T15:03:04.803Z] <<< [apiv2][status] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw 200 +[debug] [2021-04-14T15:03:04.803Z] <<< [apiv2][body] GET https://cloudfunctions.googleapis.com/v1/operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw {"name":"operations/dmF4YW5kbWUvdXMtY2VudHJhbDEvc2F2ZVJlc3VsdC9mNlM4ejJPRXZ4bw","metadata":{"@type":"type.googleapis.com/google.cloud.functions.v1.OperationMetadataV1","target":"projects/vaxandme/locations/us-central1/functions/saveResult","type":"UPDATE_FUNCTION","request":{"@type":"type.googleapis.com/google.cloud.functions.v1.CloudFunction","name":"projects/vaxandme/locations/us-central1/functions/saveResult","httpsTrigger":{},"status":"ACTIVE","entryPoint":"saveResult","timeout":"60s","availableMemoryMb":256,"serviceAccountEmail":"vaxandme@appspot.gserviceaccount.com","updateTime":"2021-04-14T05:16:08.489Z","versionId":"2","labels":{"deployment-tool":"cli-firebase","deployment-callable":"true"},"sourceUploadUrl":"https://storage.googleapis.com/gcf-upload-us-central1-a3e8d99e-f910-4259-8532-3499c31a2b18/d09fdf34-2465-4273-a031-cf401455649d.zip?GoogleAccessId=service-614738281692@gcf-admin-robot.iam.gserviceaccount.com&Expires=1618414378&Signature=IgSMxAXuyn%2B5KFFWn5ocmdXb0kCD7pCpVkJ7DlBGrYzozBNE0%2FbsTPs1kloWKXBbZXTVIQEp6K9kmxDzV74pYgG7kIfxlDXvyOKoz61Tac7JiCOiWtOoyN8KJRQFC2J4D4jqvL4Mp%2BaA3ndFWD50OWiB%2F6O%2FdpVPbTAI7SqJsrzxyV92MYA02R7n2AWvvpYOsZsGivU0WI70ZI3aQLdqzVFgV9WaV6Vk9zRtwCWHQNLwQ7nTw3ixhIpU%2BFtDcYe67DB8AeHNWnI71sR4ksdT5kV1sjpgf2pc45l%2BKATPoIgOHLPCgDfM6Io64xEUzBG0TK3eLXiEi00bGHwfbd8N4g%3D%3D","environmentVariables":{"FIREBASE_CONFIG":"{\"projectId\":\"vaxandme\",\"storageBucket\":\"vaxandme.appspot.com\",\"locationId\":\"us-central\"}"},"runtime":"nodejs12","ingressSettings":"ALLOW_ALL","buildId":"a35fdaab-c6e7-4ac2-b168-c8f2648884dd"},"versionId":"3","updateTime":"2021-04-14T15:02:59Z","buildId":"ba9f100c-ace5-49f6-9373-ed33e15f4330"}} diff --git a/functions/lib/index.js b/functions/lib/index.js index 1f7a991..8311fa5 100644 --- a/functions/lib/index.js +++ b/functions/lib/index.js @@ -25,14 +25,81 @@ const serializeGaId = (_gaid) => { } return ""; }; -exports.saveResult = functions.https.onCall((data, context) => { +exports.saveResult = functions.https.onCall(async (data, context) => { if (!!data && !!context) { const { gid } = data; const docId = serializeGaId(gid); - // eslint-disable-next-line @typescript-eslint/no-explicit-any const docData = Object.assign({}, data); delete docData.gid; - admin.firestore().collection("results").doc(docId).set(docData); + const existingData = await admin + .firestore() + .collection("results") + .doc(docId) + .get() + .then((doc) => doc.data()); + delete docData.age; + delete docData.name; + delete docData.dose; + if (existingData !== undefined && existingData !== docData) { + // DATA EXISTS FOR USER + // BUT DIFF DATA SENT FOR UPDATE + await admin.firestore().collection("results").doc(docId).set(docData); + const updateDoc = {}; + Object.keys(docData).forEach((symptom) => { + // IF WAS TRUE, NOW FALSE = -1 + // IF WAS TRUE, NOW TRUE = 0 + // IF WAS FALSE, NOW TRUE = +1 + // IF WAS FALSE, NOW FALSE = 0 + let incrementValue = 0; + if (existingData[symptom] === true && docData[symptom] === false) { + incrementValue = -1; + } + else if (existingData[symptom] === false && + docData[symptom] === true) { + incrementValue = 1; + } + if (data.dose) { + updateDoc[`${data.dose}.${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(incrementValue); + } + else { + updateDoc[`${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(incrementValue); + } + }); + admin + .firestore() + .collection("stats") + .doc(data.name) + .update(updateDoc); + } + else if (existingData === undefined) { + // DATA DOESN'T EXIST FOR USER + // SAVE USER DATA + await admin.firestore().collection("results").doc(docId).set(docData); + // INCREMENT TOTAL RESPONSE COUNT + const updateDoc = { + count: admin.firestore.FieldValue.increment(1), + }; + // INCREMENT VALUES FOR EACH SYMPTOM + Object.keys(docData).forEach((symptom) => { + if (docData[symptom] === true) { + if (data.dose) { + updateDoc[`${data.dose}.${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(1); + } + else { + updateDoc[`${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(1); + } + } + }); + admin + .firestore() + .collection("stats") + .doc(data.name) + .update(updateDoc); + } } }); exports.getPastResult = functions.https.onCall(async (data, context) => { diff --git a/functions/lib/index.js.map b/functions/lib/index.js.map index 2ca2ade..d2d0b69 100644 --- a/functions/lib/index.js.map +++ b/functions/lib/index.js.map @@ -1 +1 @@ -{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;AAAA,gDAAgD;AAChD,wCAAwC;AACxC,wDAAwD;AAExD,MAAM,MAAM,GAAG;IACb,IAAI,EAAE,cAAc,CAAC,IAAI;IACzB,SAAS,EAAE,cAAc,CAAC,UAAU;IACpC,YAAY,EAAE,cAAc,CAAC,cAAc;IAC3C,UAAU,EAAE,cAAc,CAAC,WAAW;IACtC,WAAW,EAAE,cAAc,CAAC,YAAY;IACxC,QAAQ,EAAE,cAAc,CAAC,SAAS;IAClC,OAAO,EAAE,cAAc,CAAC,QAAQ;IAChC,QAAQ,EAAE,cAAc,CAAC,SAAS;IAClC,uBAAuB,EAAE,cAAc,CAAC,2BAA2B;IACnE,iBAAiB,EAAE,cAAc,CAAC,oBAAoB;CACvD,CAAC;AAEF,KAAK,CAAC,aAAa,CAAC;IAClB,UAAU,EAAE,KAAK,CAAC,UAAU,CAAC,IAAI,CAAC,MAAM,CAAC;CAC1C,CAAC,CAAC;AAaH,MAAM,aAAa,GAAG,CAAC,KAAa,EAAU,EAAE;IAC9C,IAAI,KAAK,EAAE;QACT,OAAO,KAAK,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;KACnC;IACD,OAAO,EAAE,CAAC;AACZ,CAAC,CAAC;AAEW,QAAA,UAAU,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAC5C,CAAC,IAA2B,EAAE,OAAO,EAAE,EAAE;IACvC,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;QACvB,MAAM,EAAC,GAAG,EAAC,GAAG,IAAI,CAAC;QACnB,MAAM,KAAK,GAAW,aAAa,CAAC,GAAG,CAAC,CAAC;QACzC,8DAA8D;QAC9D,MAAM,OAAO,GAAS,MAAM,CAAC,MAAM,CAAC,EAAE,EAAE,IAAI,CAAC,CAAC;QAC9C,OAAO,OAAO,CAAC,GAAG,CAAC;QACnB,KAAK,CAAC,SAAS,EAAE,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC;KACjE;AACH,CAAC,CACJ,CAAC;AAEW,QAAA,aAAa,GAAG,SAAS,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,EAAE,IAAI,EAAE,OAAO,EAAE,EAAE;IAC1E,IAAI,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,OAAO,EAAE;QACvB,MAAM,EAAC,GAAG,EAAC,GAAG,IAAI,CAAC;QACnB,OAAO,MAAM,KAAK;aACb,SAAS,EAAE;aACX,UAAU,CAAC,SAAS,CAAC;aACrB,GAAG,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC;aACvB,GAAG,EAAE;aACL,IAAI,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,EAAE,CAAC,CAAC;KAChC;IACD,OAAO,SAAS,CAAC;AACnB,CAAC,CAAC,CAAC"} \ No newline at end of file +{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"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"} \ No newline at end of file diff --git a/functions/src/index.ts b/functions/src/index.ts index 38055be..2285146 100644 --- a/functions/src/index.ts +++ b/functions/src/index.ts @@ -38,17 +38,80 @@ const serializeGaId = (_gaid: string): string => { }; export const saveResult = functions.https.onCall( - (data: SaveResultRequestData, context) => { + async (data: SaveResultRequestData, context) => { if (!!data && !!context) { const {gid} = data; const docId: string = serializeGaId(gid); - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const docData : any = Object.assign({}, data); + const docData: Record = + Object.assign({}, data); delete docData.gid; - admin.firestore().collection("results").doc(docId).set(docData); + const existingData = await admin + .firestore() + .collection("results") + .doc(docId) + .get() + .then((doc) => doc.data()); + delete docData.age; + delete docData.name; + delete docData.dose; + if (existingData !== undefined && existingData !== docData) { + // DATA EXISTS FOR USER + // BUT DIFF DATA SENT FOR UPDATE + await admin.firestore().collection("results").doc(docId).set(docData); + const updateDoc : Record = {}; + Object.keys(docData).forEach((symptom : string) => { + // IF WAS TRUE, NOW FALSE = -1 + // IF WAS TRUE, NOW TRUE = 0 + // IF WAS FALSE, NOW TRUE = +1 + // IF WAS FALSE, NOW FALSE = 0 + let incrementValue = 0; + if (existingData[symptom] === true && docData[symptom] === false) { + incrementValue = -1; + } else if (existingData[symptom] === false && + docData[symptom] === true) { + incrementValue = 1; + } + if (data.dose) { + updateDoc[`${data.dose}.${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(incrementValue); + } else { + updateDoc[`${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(incrementValue); + } + }); + admin + .firestore() + .collection("stats") + .doc(data.name) + .update(updateDoc); + } else if (existingData === undefined) { + // DATA DOESN'T EXIST FOR USER + // SAVE USER DATA + await admin.firestore().collection("results").doc(docId).set(docData); + // INCREMENT TOTAL RESPONSE COUNT + const updateDoc : Record = { + count: admin.firestore.FieldValue.increment(1), + }; + // INCREMENT VALUES FOR EACH SYMPTOM + Object.keys(docData).forEach((symptom : string) => { + if (docData[symptom] === true) { + if (data.dose) { + updateDoc[`${data.dose}.${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(1); + } else { + updateDoc[`${data.age}.${symptom}`] = + admin.firestore.FieldValue.increment(1); + } + } + }); + admin + .firestore() + .collection("stats") + .doc(data.name) + .update(updateDoc); + } } - } -); + }); export const getPastResult = functions.https.onCall(async (data, context) => { if (!!data && !!context) { diff --git a/functions/ui-debug.log b/functions/ui-debug.log index 99c0376..2f9d04d 100644 --- a/functions/ui-debug.log +++ b/functions/ui-debug.log @@ -1 +1 @@ -Web / API server started at http://localhost:4001 +Web / API server started at http://localhost:4000 diff --git a/website/public/styles/extralarge.css b/website/public/styles/extralarge.css index 129144a..718ed37 100644 --- a/website/public/styles/extralarge.css +++ b/website/public/styles/extralarge.css @@ -1,3 +1,7 @@ .input-popup.expanded { height: 40vh; } + +.loading-bar-container { + max-width: 25%; +} diff --git a/website/public/styles/extrasmall.css b/website/public/styles/extrasmall.css index c12ad0c..204a8b8 100644 --- a/website/public/styles/extrasmall.css +++ b/website/public/styles/extrasmall.css @@ -242,9 +242,9 @@ a { display: flex; flex-direction: column; animation: 0.5s ease-out 0s 1 slideUp; - animation-delay: 1s; + animation-delay: 0.5s; animation-fill-mode: forwards; - transform: translateY(300%); + transform: translateY(200%); } .input-popup * { color: var(--color-primary); @@ -312,6 +312,29 @@ a { background-color: #55c16c; } +@keyframes loading { + 0% { + width: 0%; + } + 100% { + width: 100%; + } +} +.loading-bar-container { + min-height: 2rem; + background-color: var(--color-secondary-light); + border-radius: 1rem; + margin-top: 1rem; +} +.loading-bar { + position: relative; + width: 1rem; + min-height: 2rem; + background-color: #25d255; + border-radius: 1rem; + animation: 2s ease-out 0s infinite loading; +} + @media (hover: hover) and (pointer: fine) { .answer:hover, .answer.unselected:hover { diff --git a/website/public/styles/large.css b/website/public/styles/large.css index 692e33c..fe78b89 100644 --- a/website/public/styles/large.css +++ b/website/public/styles/large.css @@ -24,3 +24,7 @@ footer { .input-popup.expanded { height: 50vh; } + +.loading-bar-container { + max-width: 35%; +} diff --git a/website/public/styles/medium.css b/website/public/styles/medium.css index a816806..0fa022c 100644 --- a/website/public/styles/medium.css +++ b/website/public/styles/medium.css @@ -86,3 +86,7 @@ footer > div:last-of-type { .input-popup.expanded { height: 55vh; } + +.loading-bar-container { + max-width: 50%; +} diff --git a/website/public/styles/smallmedium.css b/website/public/styles/smallmedium.css index 3edc919..55d97f9 100644 --- a/website/public/styles/smallmedium.css +++ b/website/public/styles/smallmedium.css @@ -1,5 +1,5 @@ .input-popup { - height: 10rem; + height: 11rem; } .input-popup.expanded { diff --git a/website/src/index.js b/website/src/index.js index 4ccd4da..8dc13cc 100644 --- a/website/src/index.js +++ b/website/src/index.js @@ -227,9 +227,11 @@ class App extends React.Component { gid: "", showInputPopup: false, answers: {}, + loading: true, }; } componentDidMount() { + console.log(VAX_RESULTS); const params = window.location.pathname .toUpperCase() .split("/") @@ -262,26 +264,42 @@ class App extends React.Component { } } + if (!window.localStorage.getItem("hasExistingAnswer")) { + this.setState({ loading: false }); + } + if (window.gtag) { window.gtag("get", "G-7VZCY223NG", "client_id", (client_id) => { - this.setState({ gid: client_id }); - getPastResult({ gid: client_id }).then((v) => { - const { data } = v; - if (!!data) { - const { name, age, dose } = data; - this.setState({ name, age, dose, showInputPopup: true }); - delete data.name; - delete data.age; - delete data.dose; - this.setState({ answers: data }); - const inputPopupSubmit = document.querySelector( - ".input-popup-submit" - ); - inputPopupSubmit.classList.add("submitted"); - inputPopupSubmit.innerHTML = "UPDATE ANSWER"; - } - }).catch(err => console.error('ERROR Getting Past Answer', err)); + if (!!client_id) { + this.setState({ gid: client_id }); + getPastResult({ gid: client_id }) + .then((v) => { + const { data } = v; + if (!!data) { + const { name, age, dose } = data; + this.setState({ name, age, dose, showInputPopup: true }); + delete data.name; + delete data.age; + delete data.dose; + this.setState({ answers: data, loading: false }); + const inputPopupSubmit = document.querySelector( + ".input-popup-submit" + ); + inputPopupSubmit.classList.add("submitted"); + inputPopupSubmit.innerHTML = "UPDATE ANSWER"; + window.localStorage.setItem("hasExistingAnswer", true); + } else { + this.setState({ loading: false }); + } + }) + .catch((err) => { + console.error("ERROR Getting Past Answer", err); + this.setState({ loading: false }); + }); + } }); + } else { + this.setState({ loading: false }); } } shouldShowAgeGroup = () => { @@ -378,19 +396,21 @@ class App extends React.Component { age, gid, }); - saveResult(submitAnswers).then(() => { - const inputPopupSubmit = document.querySelector(".input-popup-submit"); - if (!inputPopupSubmit.classList.contains("submitted")) { - inputPopupSubmit.classList.add("submitted"); - } - inputPopupSubmit.innerHTML = "THANK YOU!"; - setTimeout(() => { - inputPopupSubmit.innerHTML = "UPDATE ANSWER"; - }, 1500); - }).catch(err => console.error('ERROR Saving Answer', err));; + saveResult(submitAnswers) + .then(() => { + const inputPopupSubmit = document.querySelector(".input-popup-submit"); + if (!inputPopupSubmit.classList.contains("submitted")) { + inputPopupSubmit.classList.add("submitted"); + } + inputPopupSubmit.innerHTML = "THANK YOU!"; + setTimeout(() => { + inputPopupSubmit.innerHTML = "UPDATE ANSWER"; + }, 1500); + }) + .catch((err) => console.error("ERROR Saving Answer", err)); }; render() { - const { name, dose, age, showInputPopup, answers } = this.state; + const { name, dose, age, showInputPopup, answers, loading } = this.state; let result = {}; let resultAtSite = {}; if (this.shouldShowResults()) { @@ -422,34 +442,45 @@ class App extends React.Component {
-
-

- Select Vaccine -

-
- {Object.values(VAX_NAMES).map((v) => ( - - ))} + {loading ? ( +
+

+ Checking for existing answers... +

+
+
+
-
- + ) : null} + {!loading ? ( +
+

+ Select Vaccine +

+
+ {Object.values(VAX_NAMES).map((v) => ( + + ))} +
+
+ ) : null} {name && (name === VAX_NAMES.PB || name === VAX_NAMES.MD) ? (