simple role management

This commit is contained in:
2020-04-25 14:53:35 +02:00
committed by smuddy
parent 732353f5bd
commit e17b8acc9c
29 changed files with 219 additions and 31 deletions

View File

@@ -0,0 +1,8 @@
import {RoleDirective} from './role.directive';
describe('RoleDirective', () => {
it('should create an instance', () => {
const directive = new RoleDirective();
expect(directive).toBeTruthy();
});
});

View File

@@ -0,0 +1,55 @@
import {Directive, ElementRef, Input, OnInit, TemplateRef, ViewContainerRef} from '@angular/core';
import {roles} from './roles';
import {UserService} from './user.service';
import {User} from './user';
@Directive({
selector: '[appRole]'
})
export class RoleDirective implements OnInit {
@Input() appRole: roles[] = [];
private currentUser: User;
private loggedIn: boolean;
constructor(
private element: ElementRef,
private templateRef: TemplateRef<any>,
private viewContainer: ViewContainerRef,
private userService: UserService
) {
}
public ngOnInit(): void {
this.userService.user$.subscribe(user => {
this.currentUser = user;
this.updateView();
});
this.userService.loggedIn$().subscribe(_ => {
this.loggedIn = !!_;
this.updateView();
});
this.updateView();
}
private updateView() {
if (this.loggedIn && this.checkPermission()) {
this.viewContainer.createEmbeddedView(this.templateRef);
} else {
this.viewContainer.clear();
}
}
private checkPermission() {
if (this.currentUser && this.currentUser.role) {
if (this.currentUser.role === 'admin') return true;
for (const role of this.appRole) {
if (this.currentUser.role === role) return true;
}
}
return false;
}
}

View File

@@ -0,0 +1,13 @@
import {NgModule} from '@angular/core';
import {CommonModule} from '@angular/common';
import {RoleDirective} from './role.directive';
@NgModule({
declarations: [RoleDirective],
exports: [RoleDirective],
imports: [
CommonModule
]
})
export class RoleModule {
}

View File

@@ -0,0 +1,2 @@
export type roles = 'none' | 'admin' | 'user' | 'leader' | 'presenter';
export const ROLE_TYPES: roles[] = ['none', 'admin', 'user', 'leader', 'presenter'];

View File

@@ -0,0 +1,12 @@
import {TestBed} from '@angular/core/testing';
import {UserService} from './user.service';
describe('UserService', () => {
beforeEach(() => TestBed.configureTestingModule({}));
it('should be created', () => {
const service: UserService = TestBed.get(UserService);
expect(service).toBeTruthy();
});
});

View File

@@ -0,0 +1,48 @@
import {Injectable} from '@angular/core';
import {AngularFireAuth} from '@angular/fire/auth';
import {BehaviorSubject, Observable} from 'rxjs';
import {filter, switchMap} from 'rxjs/operators';
import {User} from './user';
import {DbService} from '../db.service';
@Injectable({
providedIn: 'root'
})
export class UserService {
constructor(private afAuth: AngularFireAuth, private db: DbService) {
this.afAuth.authState.pipe(
filter(_ => !!_),
switchMap(auth => this.db.doc$<User>('users/' + auth.uid)),
).subscribe(_ => this._user$.next(_));
}
private _user$ = new BehaviorSubject<User>(null);
public get user$(): Observable<User> {
return this._user$.pipe(filter(_ => !!_));
}
public loggedIn$ = () => this.afAuth.authState;
public list$ = (): Observable<User[]> => this.db.col$('users');
public getUserbyId$(userId: string): Observable<User> {
return this.db.doc$<User>('users/' + userId);
}
public async update$(uid: string, data: Partial<User>): Promise<void> {
await this.db.doc<User>('users/' + uid).update(data);
}
public async login(user: string, password: string): Promise<any> {
await this.afAuth.auth.signInWithEmailAndPassword(user, password);
}
public async logout(): Promise<any> {
await this.afAuth.auth.signOut();
}
public async changePassword(email: string): Promise<any> {
await this.afAuth.auth.sendPasswordResetEmail(email);
}
}

View File

@@ -0,0 +1,8 @@
import {ChordMode} from '../../widget-modules/components/song-text/song-text.component';
export interface User {
id: string;
name: string;
role: 'admin';
chordMode: ChordMode
}