Created
October 18, 2016 14:12
-
-
Save eibrahim/8422e9f61d20fa343ec9637784e432aa to your computer and use it in GitHub Desktop.
emberfire auth service
This file contains hidden or 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
import Ember from 'ember'; | |
export | |
default Ember.Service.extend({ | |
session: Ember.inject.service(), | |
store: Ember.inject.service(), | |
firebase: Ember.inject.service(), | |
firebaseApp: Ember.inject.service(), | |
currentUser:function(){ | |
var providerData = this.get('session.currentUser.providerData.firstObject'); | |
if(!providerData) { | |
return { | |
email: this.get('session.currentUser.email'), | |
user: this.get('session.currentUser.user'), | |
}; | |
} | |
var currentUser = { | |
email: providerData.email, | |
photoURL: providerData.photoURL, | |
displayName: providerData.displayName || providerData.email, | |
user: this.get('session.currentUser.user'), | |
}; | |
return currentUser; | |
}.property('session.currentUser.providerData[]','session.currentUser','session.currentUser.user'), | |
createUserIfDoesNotExist(provider,uid,email,providerData){ | |
return new Ember.RSVP.Promise((resolve, reject) => { | |
this.get('store').find('user', uid).then((user)=>{ | |
//update user if needed | |
if(providerData && providerData.currentUser){ | |
let userData = providerData.currentUser; | |
if(providerData.currentUser.providerData && providerData.currentUser.providerData[0]) | |
userData = providerData.currentUser.providerData[0]; | |
if(user.get('email') !== userData.email && userData.email) { | |
user.set('email', userData.email); | |
} | |
if(user.get('displayName') !== userData.displayName) { | |
user.set('displayName', userData.displayName); | |
} | |
if(user.get('photoURL') !== userData.photoURL) { | |
user.set('photoURL', userData.photoURL); | |
} | |
user.save().finally(()=>{ | |
resolve(user); | |
}); | |
} | |
else{ | |
resolve(user); | |
} | |
}).catch(()=>{ | |
//create user record | |
let user = this.get('store').createRecord('user', { | |
id: uid, | |
email: email, | |
provider: provider, | |
createdOn: new Date().getTime() | |
}); | |
if(providerData && providerData.currentUser){ | |
user.set('email', providerData.currentUser.email); | |
user.set('displayName', providerData.currentUser.displayName); | |
user.set('photoURL', providerData.currentUser.photoURL); | |
} | |
let notebook = this.get('store').createRecord('notebook', {user:user, title: "My first notebook"}); | |
user.save().then(() => { | |
notebook.save(); | |
resolve(user); | |
}).catch(error => { | |
console.error(error); | |
reject("Failed to create account."); | |
}); | |
}); | |
return; | |
}); | |
}, | |
setUser: function() { | |
let uid = this.get('session.uid'); | |
return this.get('store').find('user', uid).then(user => { | |
return this.set('session.currentUser.user', user); | |
}).catch((e) => { | |
console.log(e); | |
throw e; | |
}); | |
}, | |
signUp: function(provider, email, password) { | |
return new Ember.RSVP.Promise((resolve, reject) => { | |
this.get('firebaseApp').auth().createUserWithEmailAndPassword(email, password). | |
then((data) => { | |
this.createUserIfDoesNotExist(provider, data.uid, email).then(resolve).catch(reject); | |
}).catch(reject); | |
}).catch(error => { | |
if (error.message) { | |
throw error.message; | |
} | |
throw 'Enter a valid email and password and try again.'; | |
}); | |
}, | |
signIn: function(provider, email, password) { | |
return new Ember.RSVP.Promise((resolve, reject) => { | |
this.get("session").open("firebase", { | |
provider: provider, | |
email: email, | |
password: password | |
}).then(data => { | |
let providerData; | |
if(provider === 'google'){ | |
email = data.currentUser.email; | |
providerData = data; | |
} | |
return this.createUserIfDoesNotExist(provider,data.uid, email, providerData).then(()=>{ | |
return this.setUser().then(resolve).catch(reject); | |
}).catch(reject); | |
}).catch(reject); | |
}).catch(error => { | |
if (error.message) { | |
throw error.message; | |
} | |
throw 'Enter a valid email and password and try again.'; | |
}); | |
}, | |
signOut: function() { | |
let store = this.get('store'); | |
store.unloadAll(); | |
//let user = this.get('currentUser.user'); | |
//store.unloadRecord(user); | |
this.get("session").close(); | |
}, | |
forgotPassword: function(email) { | |
return new Ember.RSVP.Promise((resolve, reject) => { | |
this.get('firebase').resetPassword({ | |
}, response => { | |
if (response) { | |
return reject(response); | |
} | |
resolve(); | |
}); | |
}).catch(error => { | |
if (error.message) { | |
throw error.message; | |
} | |
throw 'Error: Enter a valid email and try again'; | |
}); | |
}, | |
resetPassword: function(email, oldPassword, newPassword) { | |
return new Ember.RSVP.Promise((resolve, reject) => { | |
this.get('firebase').changePassword({ | |
email, oldPassword, newPassword | |
}, response => { | |
if (response) { | |
return reject(response); | |
} | |
resolve(); | |
}); | |
}).catch(error => { | |
if (error.message) { | |
throw error.message; | |
} | |
throw 'Error: Enter a valid email and password and try again'; | |
}); | |
} | |
}); |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment