UNPKG

ngx-firebase-cms

Version:

Angular Content Management System using Google Firebase (Authentication, Storage & Firestore)

326 lines 21.8 kB
/** * @fileoverview added by tsickle * @suppress {checkTypes,extraRequire,missingOverride,missingReturn,unusedPrivateMembers,uselessCode} checked by tsc */ import * as tslib_1 from "tslib"; import { Injectable, Inject } from '@angular/core'; import { AngularFireAuth } from '@angular/fire/auth'; import { AngularFirestore } from '@angular/fire/firestore'; import { of } from 'rxjs'; import { switchMap, tap } from 'rxjs/operators'; import { Router } from '@angular/router'; import * as firebase from 'firebase/app'; import { NzMessageService } from 'ng-zorro-antd'; import * as i0 from "@angular/core"; import * as i1 from "@angular/fire/auth"; import * as i2 from "ng-zorro-antd"; import * as i3 from "@angular/router"; import * as i4 from "@angular/fire/firestore"; var AuthService = /** @class */ (function () { function AuthService(config, afAuth, message, router, afs) { var _this = this; this.config = config; this.afAuth = afAuth; this.message = message; this.router = router; this.afs = afs; this.user$ = this.afAuth.authState.pipe(tap((/** * @param {?} res * @return {?} */ function (res) { if (res) { _this.uid = res["uid"]; _this.email = res["email"]; _this.emailVerified = res["emailVerified"]; _this.lastLogin = new Date(res["metadata"]["lastSignInTime"]); } })), switchMap((/** * @param {?} user * @return {?} */ function (user) { if (user) { return _this.afs.doc("users/" + user.uid).valueChanges(); } else { return of(null); } })), tap((/** * @param {?} user * @return {?} */ function (user) { if (user) { _this.displayName = user["displayName"]; _this.profileURL = user["profileURL"]; _this.role = user["roles"]; } }))); } /** * @param {?} username * @param {?} password * @return {?} */ AuthService.prototype.login = /** * @param {?} username * @param {?} password * @return {?} */ function (username, password) { var _this = this; /** @type {?} */ var adminURL = this.config.adminURL || 'admin'; this.afAuth.auth.signInWithEmailAndPassword(username, password) .then((/** * @param {?} res * @return {?} */ function (res) { _this.router.navigate([adminURL + "/dashboard"]); })).catch((/** * @param {?} err * @return {?} */ function (err) { _this.message.error(err); })); }; /** * @param {?} username * @param {?} password * @return {?} */ AuthService.prototype.signup = /** * @param {?} username * @param {?} password * @return {?} */ function (username, password) { var _this = this; /** @type {?} */ var adminURL = this.config.adminURL || 'admin'; this.afAuth.auth.createUserWithEmailAndPassword(username, password).then((/** * @param {?} res * @return {?} */ function (res) { /** @type {?} */ var data = { uid: res['user']['uid'], email: res['user']['email'], displayName: res['user']['email'], emailVerified: false, createdTime: firebase.firestore.FieldValue.serverTimestamp(), updatedTime: firebase.firestore.FieldValue.serverTimestamp(), lastLoginTime: firebase.firestore.FieldValue.serverTimestamp(), roles: ["Contributor"] }; if (res['user']['uid']) { _this.afs.collection("users").doc(res['user']['uid']).set(data) .then((/** * @param {?} res * @return {?} */ function (res) { _this.router.navigate([adminURL + "/dashboard"]); })) .catch((/** * @param {?} err * @return {?} */ function (err) { _this.message.error(err); })); } })); }; /** * @return {?} */ AuthService.prototype.signOut = /** * @return {?} */ function () { return this.afAuth.auth.signOut(); }; /** * @private * @param {?} user * @return {?} */ AuthService.prototype.updateUserData = /** * @private * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var userRef = this.afs.doc("users/" + user.uid); /** @type {?} */ var data = { uid: user.uid, email: user.email, roles: ["Contributor"] }; return userRef.set(data, { merge: true }); }; ///// Role-based Authorization ////// ///// Role-based Authorization ////// /** * @param {?} user * @return {?} */ AuthService.prototype.canRead = ///// Role-based Authorization ////// /** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var allowed = ['Administrator', 'Editor', 'Author', 'Contributor']; return this.checkAuthorization(user, allowed); }; /** * @param {?} user * @return {?} */ AuthService.prototype.canEdit = /** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var allowed = ['Administrator', 'Editor']; return this.checkAuthorization(user, allowed); }; /** * @param {?} user * @return {?} */ AuthService.prototype.canDelete = /** * @param {?} user * @return {?} */ function (user) { /** @type {?} */ var allowed = ['Administrator']; return this.checkAuthorization(user, allowed); }; // determines if user has matching role // determines if user has matching role /** * @private * @param {?} user * @param {?} allowedRoles * @return {?} */ AuthService.prototype.checkAuthorization = // determines if user has matching role /** * @private * @param {?} user * @param {?} allowedRoles * @return {?} */ function (user, allowedRoles) { var e_1, _a; if (!user) return false; try { for (var allowedRoles_1 = tslib_1.__values(allowedRoles), allowedRoles_1_1 = allowedRoles_1.next(); !allowedRoles_1_1.done; allowedRoles_1_1 = allowedRoles_1.next()) { var role = allowedRoles_1_1.value; if (user.roles[role]) { return true; } } } catch (e_1_1) { e_1 = { error: e_1_1 }; } finally { try { if (allowedRoles_1_1 && !allowedRoles_1_1.done && (_a = allowedRoles_1.return)) _a.call(allowedRoles_1); } finally { if (e_1) throw e_1.error; } } return false; }; /** * @param {?} description * @return {?} */ AuthService.prototype.log = /** * @param {?} description * @return {?} */ function (description) { if (this.uid) { this.afs.collection('log').add({ "description": description, "uid": this.uid, "createdTime": firebase.firestore.FieldValue.serverTimestamp() }); } }; AuthService.decorators = [ { type: Injectable, args: [{ providedIn: 'root' },] } ]; /** @nocollapse */ AuthService.ctorParameters = function () { return [ { type: undefined, decorators: [{ type: Inject, args: ['env',] }] }, { type: AngularFireAuth }, { type: NzMessageService }, { type: Router }, { type: AngularFirestore } ]; }; /** @nocollapse */ AuthService.ngInjectableDef = i0.defineInjectable({ factory: function AuthService_Factory() { return new AuthService(i0.inject("env"), i0.inject(i1.AngularFireAuth), i0.inject(i2.NzMessageService), i0.inject(i3.Router), i0.inject(i4.AngularFirestore)); }, token: AuthService, providedIn: "root" }); return AuthService; }()); export { AuthService }; if (false) { /** @type {?} */ AuthService.prototype.user$; /** @type {?} */ AuthService.prototype.uid; /** @type {?} */ AuthService.prototype.displayName; /** @type {?} */ AuthService.prototype.email; /** @type {?} */ AuthService.prototype.profileURL; /** @type {?} */ AuthService.prototype.emailVerified; /** @type {?} */ AuthService.prototype.lastLogin; /** @type {?} */ AuthService.prototype.role; /** * @type {?} * @private */ AuthService.prototype.config; /** * @type {?} * @private */ AuthService.prototype.afAuth; /** * @type {?} * @private */ AuthService.prototype.message; /** * @type {?} * @private */ AuthService.prototype.router; /** * @type {?} * @private */ AuthService.prototype.afs; } //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiYXV0aC5zZXJ2aWNlLmpzIiwic291cmNlUm9vdCI6Im5nOi8vbmd4LWZpcmViYXNlLWNtcy8iLCJzb3VyY2VzIjpbImxpYi9zZXJ2aWNlL2F1dGguc2VydmljZS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiOzs7OztBQUFBLE9BQU8sRUFBRSxVQUFVLEVBQUUsTUFBTSxFQUFFLE1BQU0sZUFBZSxDQUFDO0FBQ25ELE9BQU8sRUFBRSxlQUFlLEVBQUUsTUFBTSxvQkFBb0IsQ0FBQztBQUNyRCxPQUFPLEVBQUUsZ0JBQWdCLEVBQTRCLE1BQU0seUJBQXlCLENBQUM7QUFDckYsT0FBTyxFQUFjLEVBQUUsRUFBRSxNQUFNLE1BQU0sQ0FBQztBQUN0QyxPQUFPLEVBQUUsU0FBUyxFQUFFLEdBQUcsRUFBRSxNQUFNLGdCQUFnQixDQUFDO0FBQ2hELE9BQU8sRUFBRSxNQUFNLEVBQUUsTUFBTSxpQkFBaUIsQ0FBQztBQUV6QyxPQUFPLEtBQUssUUFBUSxNQUFNLGNBQWMsQ0FBQztBQUd6QyxPQUFPLEVBQUUsZ0JBQWdCLEVBQUUsTUFBTSxlQUFlLENBQUM7Ozs7OztBQUdqRDtJQWNFLHFCQUN5QixNQUFpQixFQUNoQyxNQUF1QixFQUN2QixPQUF5QixFQUN6QixNQUFjLEVBQ2QsR0FBcUI7UUFML0IsaUJBK0JDO1FBOUJ3QixXQUFNLEdBQU4sTUFBTSxDQUFXO1FBQ2hDLFdBQU0sR0FBTixNQUFNLENBQWlCO1FBQ3ZCLFlBQU8sR0FBUCxPQUFPLENBQWtCO1FBQ3pCLFdBQU0sR0FBTixNQUFNLENBQVE7UUFDZCxRQUFHLEdBQUgsR0FBRyxDQUFrQjtRQUU3QixJQUFJLENBQUMsS0FBSyxHQUFHLElBQUksQ0FBQyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FDckMsR0FBRzs7OztRQUFDLFVBQUEsR0FBRztZQUNMLElBQUksR0FBRyxFQUFFO2dCQUNQLEtBQUksQ0FBQyxHQUFHLEdBQUcsR0FBRyxDQUFDLEtBQUssQ0FBQyxDQUFBO2dCQUNyQixLQUFJLENBQUMs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TUFBTTtnQkFITixnQkFBZ0I7OztzQkFGekI7Q0FrSkMsQUFySUQsSUFxSUM7U0FsSVksV0FBVzs7O0lBRXRCLDRCQUF3Qjs7SUFDeEIsMEJBQVk7O0lBQ1osa0NBQW9COztJQUNwQiw0QkFBYzs7SUFDZCxpQ0FBbUI7O0lBQ25CLG9DQUF3Qjs7SUFDeEIsZ0NBQWdCOztJQUNoQiwyQkFBSTs7Ozs7SUFHRiw2QkFBd0M7Ozs7O0lBQ3hDLDZCQUErQjs7Ozs7SUFDL0IsOEJBQWlDOzs7OztJQUNqQyw2QkFBc0I7Ozs7O0lBQ3RCLDBCQUE2QiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEluamVjdGFibGUsIEluamVjdCB9IGZyb20gJ0Bhbmd1bGFyL2NvcmUnO1xuaW1wb3J0IHsgQW5ndWxhckZpcmVBdXRoIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZS9hdXRoJztcbmltcG9ydCB7IEFuZ3VsYXJGaXJlc3RvcmUsIEFuZ3VsYXJGaXJlc3RvcmVEb2N1bWVudCB9IGZyb20gJ0Bhbmd1bGFyL2ZpcmUvZmlyZXN0b3JlJztcbmltcG9ydCB7IE9ic2VydmFibGUsIG9mIH0gZnJvbSAncnhqcyc7XG5pbXBvcnQgeyBzd2l0Y2hNYXAsIHRhcCB9IGZyb20gJ3J4anMvb3BlcmF0b3JzJztcbmltcG9ydCB7IFJvdXRlciB9IGZyb20gJ0Bhbmd1bGFyL3JvdXRlcic7XG5pbXBvcnQgeyBVc2VyIH0gZnJvbSAnLi4vaW50ZXJmYWNlL3VzZXInO1xuaW1wb3J0ICogYXMgZmlyZWJhc2UgZnJvbSAnZmlyZWJhc2UvYXBwJztcbmltcG9ydCB7IEZpcmViYXNlQXBwIH0gZnJvbSAnQGFuZ3VsYXIvZmlyZSc7XG5pbXBvcnQgeyBFbnZDb25maWcgfSBmcm9tICcuLi9pbnRlcmZhY2UvZW52LWNvbmZpZyc7XG5pbXBvcnQgeyBOek1lc3NhZ2VTZXJ2aWNlIH0gZnJvbSAnbmctem9ycm8tYW50ZCc7XG5pbXBvcnQgeyBMb2cgfSBmcm9tICcuLi9pbnRlcmZhY2UvbG9nJztcblxuQEluamVjdGFibGUoe1xuICBwcm92aWRlZEluOiAncm9vdCdcbn0pXG5leHBvcnQgY2xhc3MgQXV0aFNlcnZpY2Uge1xuXG4gIHVzZXIkOiBPYnNlcnZhYmxlPFVzZXI+O1xuICB1aWQ6IHN0cmluZztcbiAgZGlzcGxheU5hbWU6IHN0cmluZztcbiAgZW1haWw6IHN0cmluZztcbiAgcHJvZmlsZVVSTDogc3RyaW5nO1xuICBlbWFpbFZlcmlmaWVkIDogYm9vbGVhbjtcbiAgbGFzdExvZ2luOiBEYXRlO1xuICByb2xlXG5cbiAgY29uc3RydWN0b3IoXG4gICAgQEluamVjdCgnZW52JykgcHJpdmF0ZSBjb25maWc6IEVudkNvbmZpZyxcbiAgICBwcml2YXRlIGFmQXV0aDogQW5ndWxhckZpcmVBdXRoLFxuICAgIHByaXZhdGUgbWVzc2FnZTogTnpNZXNzYWdlU2VydmljZSxcbiAgICBwcml2YXRlIHJvdXRlcjogUm91dGVyLFxuICAgIHByaXZhdGUgYWZzOiBBbmd1bGFyRmlyZXN0b3JlXG4gICkge1xuICAgIHRoaXMudXNlciQgPSB0aGlzLmFmQXV0aC5hdXRoU3RhdGUucGlwZShcbiAgICAgIHRhcChyZXMgPT4ge1xuICAgICAgICBpZiAocmVzKSB7XG4gICAgICAgICAgdGhpcy51aWQgPSByZXNbXCJ1aWRcIl1cbiAgICAgICAgICB0aGlzLmVtYWlsID0gcmVzW1wiZW1haWxcIl1cbiAgICAgICAgICB0aGlzLmVtYWlsVmVyaWZpZWQgPSByZXNbXCJlbWFpbFZlcmlmaWVkXCJdXG4gICAgICAgICAgdGhpcy5sYXN0TG9naW4gPSBuZXcgRGF0ZShyZXNbXCJtZXRhZGF0YVwiXVtcImxhc3RTaWduSW5UaW1lXCJdKVxuICAgICAgICB9XG4gICAgICB9KSxcbiAgICAgIHN3aXRjaE1hcCh1c2VyID0+IHtcbiAgICAgICAgaWYgKHVzZXIpIHtcbiAgICAgICAgICByZXR1cm4gdGhpcy5hZnMuZG9jPFVzZXI+KGB1c2Vycy8ke3VzZXIudWlkfWApLnZhbHVlQ2hhbmdlcygpXG4gICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgcmV0dXJuIG9mKG51bGwpXG4gICAgICAgIH1cbiAgICAgIH0pLFxuICAgICAgdGFwKHVzZXIgPT4ge1xuICAgICAgICBpZiAodXNlcikge1xuICAgICAgICAgIHRoaXMuZGlzcGxheU5hbWUgPSB1c2VyW1wiZGlzcGxheU5hbWVcIl1cbiAgICAgICAgICB0aGlzLnByb2ZpbGVVUkwgPSB1c2VyW1wicHJvZmlsZVVSTFwiXVxuICAgICAgICAgIHRoaXMucm9sZSA9IHVzZXJbXCJyb2xlc1wiXVxuICAgICAgICB9XG4gICAgICB9KVxuICAgIClcbiAgfVxuXG4gIHB1YmxpYyBsb2dpbih1c2VybmFtZSwgcGFzc3dvcmQpIHtcbiAgICBsZXQgYWRtaW5VUkwgPSB0aGlzLmNvbmZpZy5hZG1pblVSTCB8fCAnYWRtaW4nXG4gICAgdGhpcy5hZkF1dGguYXV0aC5zaWduSW5XaXRoRW1haWxBbmRQYXNzd29yZCh1c2VybmFtZSwgcGFzc3dvcmQpXG4gICAgLnRoZW4ocmVzID0+IHtcbiAgICAgIHRoaXMucm91dGVyLm5hdmlnYXRlKFtgJHthZG1pblVSTH0vZGFzaGJvYXJkYF0pXG4gICAgfSkuY2F0Y2goZXJyID0+IHtcbiAgICAgIHRoaXMubWVzc2FnZS5lcnJvcihlcnIpXG4gICAgfSlcbiAgfVxuXG4gIHB1YmxpYyBzaWdudXAodXNlcm5hbWUsIHBhc3N3b3JkKSB7XG4gICAgbGV0IGFkbWluVVJMID0gdGhpcy5jb25maWcuYWRtaW5VUkwgfHwgJ2FkbWluJ1xuICAgIHRoaXMuYWZBdXRoLmF1dGguY3JlYXRlVXNlcldpdGhFbWFpbEFuZFBhc3N3b3JkKHVzZXJuYW1lLCBwYXNzd29yZCkudGhlbihyZXMgPT4ge1xuICAgICAgbGV0IGRhdGEgPSB7XG4gICAgICAgIHVpZDogcmVzWyd1c2VyJ11bJ3VpZCddLFxuICAgICAgICBlbWFpbDogcmVzWyd1c2VyJ11bJ2VtYWlsJ10sXG4gICAgICAgIGRpc3BsYXlOYW1lOiByZXNbJ3VzZXInXVsnZW1haWwnXSxcbiAgICAgICAgZW1haWxWZXJpZmllZDogZmFsc2UsXG4gICAgICAgIGNyZWF0ZWRUaW1lOiBmaXJlYmFzZS5maXJlc3RvcmUuRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgdXBkYXRlZFRpbWU6IGZpcmViYXNlLmZpcmVzdG9yZS5GaWVsZFZhbHVlLnNlcnZlclRpbWVzdGFtcCgpLFxuICAgICAgICBsYXN0TG9naW5UaW1lOiBmaXJlYmFzZS5maXJlc3RvcmUuRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKSxcbiAgICAgICAgcm9sZXM6IFtcIkNvbnRyaWJ1dG9yXCJdXG4gICAgICB9XG4gICAgICBpZiAocmVzWyd1c2VyJ11bJ3VpZCddKSB7XG4gICAgICAgIHRoaXMuYWZzLmNvbGxlY3Rpb24oXCJ1c2Vyc1wiKS5kb2MocmVzWyd1c2VyJ11bJ3VpZCddKS5zZXQoZGF0YSlcbiAgICAgICAgLnRoZW4ocmVzID0+IHtcbiAgICAgICAgICB0aGlzLnJvdXRlci5uYXZpZ2F0ZShbYCR7YWRtaW5VUkx9L2Rhc2hib2FyZGBdKVxuICAgICAgICB9KVxuICAgICAgICAuY2F0Y2goZXJyID0+IHtcbiAgICAgICAgICB0aGlzLm1lc3NhZ2UuZXJyb3IoZXJyKVxuICAgICAgICB9KVxuICAgICAgfVxuICAgIH0pXG4gIH1cblxuICBzaWduT3V0KCkge1xuICAgIHJldHVybiB0aGlzLmFmQXV0aC5hdXRoLnNpZ25PdXQoKVxuICB9XG5cbiAgcHJpdmF0ZSB1cGRhdGVVc2VyRGF0YSh1c2VyKSB7XG4gICAgY29uc3QgdXNlclJlZjogQW5ndWxhckZpcmVzdG9yZURvY3VtZW50PGFueT4gPSB0aGlzLmFmcy5kb2MoYHVzZXJzLyR7dXNlci51aWR9YCk7XG4gICAgY29uc3QgZGF0YTogVXNlciA9IHtcbiAgICAgIHVpZDogdXNlci51aWQsXG4gICAgICBlbWFpbDogdXNlci5lbWFpbCxcbiAgICAgIHJvbGVzOiBbXCJDb250cmlidXRvclwiXSBcbiAgICB9XG4gICAgcmV0dXJuIHVzZXJSZWYuc2V0KGRhdGEsIHsgbWVyZ2U6IHRydWUgfSlcbiAgfVxuXG5cbiAgLy8vLy8gUm9sZS1iYXNlZCBBdXRob3JpemF0aW9uIC8vLy8vL1xuICBjYW5SZWFkKHVzZXI6IFVzZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbGxvd2VkID0gWydBZG1pbmlzdHJhdG9yJywgJ0VkaXRvcicsICdBdXRob3InLCAnQ29udHJpYnV0b3InXVxuICAgIHJldHVybiB0aGlzLmNoZWNrQXV0aG9yaXphdGlvbih1c2VyLCBhbGxvd2VkKVxuICB9XG5cbiAgY2FuRWRpdCh1c2VyOiBVc2VyKTogYm9vbGVhbiB7XG4gICAgY29uc3QgYWxsb3dlZCA9IFsnQWRtaW5pc3RyYXRvcicsICdFZGl0b3InXVxuICAgIHJldHVybiB0aGlzLmNoZWNrQXV0aG9yaXphdGlvbih1c2VyLCBhbGxvd2VkKVxuICB9XG5cbiAgY2FuRGVsZXRlKHVzZXI6IFVzZXIpOiBib29sZWFuIHtcbiAgICBjb25zdCBhbGxvd2VkID0gWydBZG1pbmlzdHJhdG9yJ11cbiAgICByZXR1cm4gdGhpcy5jaGVja0F1dGhvcml6YXRpb24odXNlciwgYWxsb3dlZClcbiAgfVxuXG4gIC8vIGRldGVybWluZXMgaWYgdXNlciBoYXMgbWF0Y2hpbmcgcm9sZVxuICBwcml2YXRlIGNoZWNrQXV0aG9yaXphdGlvbih1c2VyOiBVc2VyLCBhbGxvd2VkUm9sZXM6IHN0cmluZ1tdKTogYm9vbGVhbiB7XG4gICAgaWYgKCF1c2VyKSByZXR1cm4gZmFsc2VcbiAgICBmb3IgKGNvbnN0IHJvbGUgb2YgYWxsb3dlZFJvbGVzKSB7XG4gICAgICBpZiAodXNlci5yb2xlc1tyb2xlXSkge1xuICAgICAgICByZXR1cm4gdHJ1ZVxuICAgICAgfVxuICAgIH1cbiAgICByZXR1cm4gZmFsc2VcbiAgfVxuXG4gIGxvZyAoZGVzY3JpcHRpb246IHN0cmluZykge1xuICAgIGlmICh0aGlzLnVpZCkge1xuICAgICAgdGhpcy5hZnMuY29sbGVjdGlvbjxMb2c+KCdsb2cnKS5hZGQoe1xuICAgICAgICBcImRlc2NyaXB0aW9uXCI6IGRlc2NyaXB0aW9uLFxuICAgICAgICBcInVpZFwiOiB0aGlzLnVpZCxcbiAgICAgICAgXCJjcmVhdGVkVGltZVwiOiBmaXJlYmFzZS5maXJlc3RvcmUuRmllbGRWYWx1ZS5zZXJ2ZXJUaW1lc3RhbXAoKVxuICAgICAgfSlcbiAgICB9XG4gIH1cbn1cbiJdfQ==