-
-
Save katowulf/6479129 to your computer and use it in GitHub Desktop.
| /*************************************************** | |
| * Simple and elegant, no code complexity | |
| * Disadvantages: Requires warming all data into server memory (could take a long time for MBs of data or millions of records) | |
| * (This disadvantage should go away as we add optimizations to the core product) | |
| ***************************************************/ | |
| var fb = firebase.database.ref(); | |
| /** | |
| * @param {string} emailAddress | |
| * @return {Object} the object contains zero or more user records, the keys are the users' ids | |
| */ | |
| function findUsersMatchingEmail( emailAddress, callback ) { | |
| fb.child('user').orderByChild('emailAddress').equalTo(emailAddress).once('value', function(snap) { | |
| callback( snap.val() ); | |
| }); | |
| } |
| /*************************************************** | |
| * Useful for MBs or more of data, or lists of thousands or more records | |
| * Disadvantages: Slight code complexity due to two queries (one for key, another for record); escaping emails is annoying | |
| ***************************************************/ | |
| var fb = firebase.database.ref(); | |
| /** | |
| * Looks up a user id by email address and invokes callback with the id or null if not found | |
| * @return {Object|null} the object contains the key/value hash for one user | |
| */ | |
| function getUserIdByEmail( emailAddress, callback ) { | |
| fb.child('emails_to_ids/'+emailToKey(emailAddress)).once('value', function(snap) { | |
| callback( snap.val() ); | |
| }); | |
| } | |
| /** | |
| * Creates a new user record and also updates the index | |
| */ | |
| function createNewUser( userRecord ) { | |
| var uid = fb.child('user').push().key(); | |
| // do a multi-path write! | |
| var mergedData = {}; | |
| mergedData['users/' + uid] = userRecord; | |
| mergedData['emails_to_ids/'+emailToKey(userRecord.email)] = uid; | |
| fb.update(mergedData); | |
| return id; | |
| } | |
| /** | |
| * Firebase keys cannot have a period (.) in them, so this converts the emails to valid keys | |
| */ | |
| function emailToKey(emailAddress) { | |
| return emailAddress.replace(/[.]/g, '%20'); | |
| } |
@mikemurray Addressed comments and updated for Firebase queries. Thanks!
@jondthompson world writable/readable isn't necessary. You can make paths editable only by the owner's uid.
@al-the-x hashes are a great answer but btoa isn't necassarily available cross-platform. It just requires including a hash function of some sort or a polyfill for btoa, so still a great choice.
This is awesome, thanks!
var uid = fb.child('user').push().key();
For me it's working as a prop and not a method, so .key instead of .key()
@kristijanmatic Thanks for pointing it out. Also check out this https://developer.mozilla.org/en/docs/Web/API/WindowBase64/Base64_encoding_and_decoding
Now you can just do the following:
admin.auth().getUserByEmail(email)
.then(function(userRecord) {
// See the UserRecord reference doc for the contents of userRecord.
console.log("Successfully fetched user data:", userRecord.toJSON());
})
.catch(function(error) {
console.log("Error fetching user data:", error);
});See https://firebase.google.com/docs/auth/admin/manage-users for details.
@nderkach it works!
thanks man
Actually, the path needs to be writeable for creating a new user, as well as anyone that wants to change their email address. This means that it has to be world writeable, thus world readable.