From 2892395c8b9b1bd21644ad924b98cb4380d2e465 Mon Sep 17 00:00:00 2001 From: evgeniywas Date: Thu, 22 Jun 2023 19:57:50 +0100 Subject: [PATCH] RC-4: create authService --- src/app/services/authService.js | 137 ++++++++++++++++++++++++++++++++ src/app/services/index.js | 18 +++++ 2 files changed, 155 insertions(+) create mode 100644 src/app/services/authService.js create mode 100644 src/app/services/index.js diff --git a/src/app/services/authService.js b/src/app/services/authService.js new file mode 100644 index 0000000..3e673ce --- /dev/null +++ b/src/app/services/authService.js @@ -0,0 +1,137 @@ +import FuseUtils from '@fuse/utils/FuseUtils'; +import _ from '@lodash'; +import * as firebaseAuth from 'firebase/auth'; +import * as firebaseDb from 'firebase/database'; + +export default class AuthService extends FuseUtils.EventEmitter { + #auth; + + #db; + + init(authInstance, dbInstance) { + this.#auth = authInstance; + this.#db = dbInstance; + } + + createUser = ({ displayName, email, password }) => { + return new Promise((resolve, reject) => { + firebaseAuth + .createUserWithEmailAndPassword(this.#auth, email, password) + .then((userCredential) => firebaseAuth.updateProfile(userCredential.user, { displayName })) + .then(() => { + const userRef = firebaseDb.ref(this.#db, `users/${this.#auth.currentUser.uid}`); + const value = { role: 'user', data: { displayName, email } }; + + return firebaseDb.set(userRef, value); + }) + .then(() => { + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + }; + + signInWithEmailAndPassword = ({ email, password, remember }) => { + const persistence = remember + ? firebaseAuth.browserLocalPersistence + : firebaseAuth.browserSessionPersistence; + + return new Promise((resolve, reject) => { + firebaseAuth + .setPersistence(this.#auth, persistence) + .then(() => firebaseAuth.signInWithEmailAndPassword(this.#auth, email, password)) + .then((userCredential) => { + resolve(userCredential.user); + const { user } = userCredential; + this.emit('onLogin', { + role: 'user', + data: { displayName: user.displayName, photoURL: user.photoURL, email: user.email }, + }); + }) + .catch((error) => { + reject(error); + }); + }); + }; + + updateUserData = (user) => { + return new Promise((resolve, reject) => { + if (_.isEmpty(user)) { + reject(Error('User data is empty')); + } + + const userRef = firebaseDb.ref(this.#db, `users/${this.#auth.currentUser.uid}`); + const value = { data: { ...user } }; + + firebaseDb + .set(userRef, value) + .then(() => { + if (user.email) { + return firebaseAuth.updateEmail(this.#auth, user.email); + } + + return null; + }) + .then(() => { + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + }; + + logout = () => { + this.#auth + .signOut() + .then(() => { + this.emit('onLogout', 'Logged out'); + }) + .catch((error) => { + console.warn('Logout error: ', error); + }); + }; + + getUserData = (userId) => { + return new Promise((resolve, reject) => { + const userRef = firebaseDb.ref(this.#db, `users/${userId}`); + firebaseDb.onValue( + userRef, + (snapshot) => { + const user = snapshot.val(); + resolve(user); + }, + (error) => { + reject(error); + } + ); + }); + }; + + sendPasswordResetEmail = (email) => { + return new Promise((resolve, reject) => { + if (email) { + reject(Error('Email is empty')); + } + + firebaseAuth + .sendPasswordResetEmail(this.#auth, email) + .then(() => { + resolve(); + }) + .catch((error) => { + reject(error); + }); + }); + }; + + onAuthStateChanged = (callback) => { + if (!this.#auth) { + return; + } + + this.#auth.onAuthStateChanged(callback); + }; +} diff --git a/src/app/services/index.js b/src/app/services/index.js new file mode 100644 index 0000000..085d6b3 --- /dev/null +++ b/src/app/services/index.js @@ -0,0 +1,18 @@ +import AuthService from './authService'; +import FirebaseService from './firebaseService'; +// TODO: change to firebase secrets or to use firebase functions +const firebaseConfig = { + apiKey: 'AIzaSyBqMGmOF0-DkYDpnsmZwpf5S8w5cL3fBb8', + authDomain: 'rental-calculator-13a9e.firebaseapp.com', + databaseURL: 'https://rental-calculator-13a9e-default-rtdb.firebaseio.com', + projectId: 'rental-calculator-13a9e', + storageBucket: 'rental-calculator-13a9e.appspot.com', + messagingSenderId: '479612883365', + appId: '1:479612883365:web:fde2d2632ce4c42ce5184c', + measurementId: 'G-JW7J8ZQ9FJ', +}; + +const firebase = new FirebaseService(firebaseConfig); +const authService = new AuthService(); + +export { authService, firebase };