Files
bodyshop/firebase/functions/index.js
2020-02-19 13:46:14 -08:00

82 lines
2.3 KiB
JavaScript

const functions = require("firebase-functions");
const admin = require("firebase-admin");
admin.initializeApp(functions.config().firebase);
//TODO Move this to an environment parameter.
const GRAPHQL_ENDPOINT = functions.config().auth.graphql_endpoint;
const HASURA_SECRET_ADMIN_KEY = functions.config().auth.hasura_secret_admin_key;
const UPSERT_USER = `
mutation upsert_user($authEmail: String!, $authToken: String!) {
insert_users(
objects: [
{
email:$authEmail,
authid:$authToken
}
],
on_conflict: {
constraint: users_pkey,
update_columns: [authid]
}
) {
returning {
authid
}
}
}
`;
// On sign up.
exports.processSignUp = functions.auth.user().onCreate(user => {
console.log(user);
// Check if user meets role criteria:
// Your custom logic here: to decide what roles and other `x-hasura-*` should the user get
let customClaims;
if (user.email && user.email.indexOf("@thinkimex.com") !== -1) {
customClaims = {
"https://hasura.io/jwt/claims": {
"x-hasura-default-role": "admin",
"x-hasura-allowed-roles": ["user", "admin"],
"x-hasura-user-id": user.uid
}
};
} else {
customClaims = {
"https://hasura.io/jwt/claims": {
"x-hasura-default-role": "user",
"x-hasura-allowed-roles": ["user"],
"x-hasura-user-id": user.uid
}
};
}
//Removed for now - outbound connections are not free on firebase.
// fetch(GRAPHQL_ENDPOINT, {
// method: "POST",
// headers: {
// "Content-Type": "application/json",
// Accept: "application/json",
// "x-hasura-admin-secret": HASURA_SECRET_ADMIN_KEY
// },
// body: JSON.stringify({
// query: UPSERT_USER,
// variables: { authEmail: user.email, authToken: user.uid }
// })
// });
// Set custom user claims on this newly created user.
return admin
.auth()
.setCustomUserClaims(user.uid, customClaims)
.then(() => {
// Update real-time database to notify client to force refresh.
const metadataRef = admin.database().ref("metadata/" + user.uid);
// Set the refresh time to the current UTC timestamp.
// This will be captured on the client to force a token refresh.
return metadataRef.set({ refreshTime: new Date().getTime() });
})
.catch(error => {
console.log(error);
});
});