Permalink
Name already in use
A tag already exists with the provided branch name. Many Git commands accept both tag and branch names, so creating this branch may cause unexpected behavior. Are you sure you want to create this branch?
quickstart-js/functions/functions/index.js /
Go to fileThis commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Update dependencies to address lodash security warning. Fix eslint warnings (minor formatting stuff)
104 lines (97 sloc)
3.78 KB
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
| /** | |
| * Copyright 2018 Google Inc. All Rights Reserved. | |
| * | |
| * Licensed under the Apache License, Version 2.0 (the "License"); | |
| * you may not use this file except in compliance with the License. | |
| * You may obtain a copy of the License at | |
| * | |
| * http://www.apache.org/licenses/LICENSE-2.0 | |
| * | |
| * Unless required by applicable law or agreed to in writing, software | |
| * distributed under the License is distributed on an "AS IS" BASIS, | |
| * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | |
| * See the License for the specific language governing permissions and | |
| * limitations under the License. | |
| */ | |
| 'use strict'; | |
| const functions = require('firebase-functions'); | |
| const sanitizer = require('./sanitizer'); | |
| const admin = require('firebase-admin'); | |
| admin.initializeApp(); | |
| // [START allAdd] | |
| // [START addFunctionTrigger] | |
| // Adds two numbers to each other. | |
| exports.addNumbers = functions.https.onCall((data) => { | |
| // [END addFunctionTrigger] | |
| // [START readAddData] | |
| // Numbers passed from the client. | |
| const firstNumber = data.firstNumber; | |
| const secondNumber = data.secondNumber; | |
| // [END readAddData] | |
| // [START addHttpsError] | |
| // Checking that attributes are present and are numbers. | |
| if (!Number.isFinite(firstNumber) || !Number.isFinite(secondNumber)) { | |
| // Throwing an HttpsError so that the client gets the error details. | |
| throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' + | |
| 'two arguments "firstNumber" and "secondNumber" which must both be numbers.'); | |
| } | |
| // [END addHttpsError] | |
| // [START returnAddData] | |
| // returning result. | |
| return { | |
| firstNumber: firstNumber, | |
| secondNumber: secondNumber, | |
| operator: '+', | |
| operationResult: firstNumber + secondNumber, | |
| }; | |
| // [END returnAddData] | |
| }); | |
| // [END allAdd] | |
| // [START messageFunctionTrigger] | |
| // Saves a message to the Firebase Realtime Database but sanitizes the text by removing swearwords. | |
| exports.addMessage = functions.https.onCall((data, context) => { | |
| // [START_EXCLUDE] | |
| // [START readMessageData] | |
| // Message text passed from the client. | |
| const text = data.text; | |
| // [END readMessageData] | |
| // [START messageHttpsErrors] | |
| // Checking attribute. | |
| if (!(typeof text === 'string') || text.length === 0) { | |
| // Throwing an HttpsError so that the client gets the error details. | |
| throw new functions.https.HttpsError('invalid-argument', 'The function must be called with ' + | |
| 'one arguments "text" containing the message text to add.'); | |
| } | |
| // Checking that the user is authenticated. | |
| if (!context.auth) { | |
| // Throwing an HttpsError so that the client gets the error details. | |
| throw new functions.https.HttpsError('failed-precondition', 'The function must be called ' + | |
| 'while authenticated.'); | |
| } | |
| // [END messageHttpsErrors] | |
| // [START authIntegration] | |
| // Authentication / user information is automatically added to the request. | |
| const uid = context.auth.uid; | |
| const name = context.auth.token.name || null; | |
| const picture = context.auth.token.picture || null; | |
| const email = context.auth.token.email || null; | |
| // [END authIntegration] | |
| // [START returnMessageAsync] | |
| // Saving the new message to the Realtime Database. | |
| const sanitizedMessage = sanitizer.sanitizeText(text); // Sanitize the message. | |
| return admin.database().ref('/messages').push({ | |
| text: sanitizedMessage, | |
| author: { uid, name, picture, email }, | |
| }).then(() => { | |
| console.log('New Message written'); | |
| // Returning the sanitized message to the client. | |
| return { text: sanitizedMessage }; | |
| }) | |
| // [END returnMessageAsync] | |
| .catch((error) => { | |
| // Re-throwing the error as an HttpsError so that the client gets the error details. | |
| throw new functions.https.HttpsError('unknown', error.message, error); | |
| }); | |
| // [END_EXCLUDE] | |
| }); | |
| // [END messageFunctionTrigger] |