Skip to content

Instantly share code, notes, and snippets.

@eibrahim
Created October 18, 2016 14:12
Show Gist options
  • Star 1 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save eibrahim/8422e9f61d20fa343ec9637784e432aa to your computer and use it in GitHub Desktop.
Save eibrahim/8422e9f61d20fa343ec9637784e432aa to your computer and use it in GitHub Desktop.
emberfire auth service
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({
email
}, 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