You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

60 lines
1.8 KiB
TypeScript

import { Injectable } from '@angular/core';
import { BehaviorSubject, Observable } from 'rxjs';
import { User } from '../models/user.model';
import { ApiService } from 'src/app/api/api.service';
import { catchError, tap } from 'rxjs/operators';
const JWT_LOCALSTORE_KEY = 'jwt';
const USER_LOCALSTORE_KEY = 'user';
@Injectable({
providedIn: 'root'
})
export class AuthService {
currentUser$: BehaviorSubject<User> = new BehaviorSubject<User>(null);
constructor( private api: ApiService ) {
this.initToken();
}
initToken() {
const token = localStorage.getItem(JWT_LOCALSTORE_KEY);
const user = <User> JSON.parse(localStorage.getItem(USER_LOCALSTORE_KEY));
if (token && user) {
this.setTokenAndUser(token, user);
}
}
setTokenAndUser(token: string, user: User) {
localStorage.setItem(JWT_LOCALSTORE_KEY, token);
localStorage.setItem(USER_LOCALSTORE_KEY, JSON.stringify(user));
this.api.setAuthToken(token);
this.currentUser$.next(user);
}
async login(email: string, password: string): Promise<any> {
return this.api.post('/users/auth/login',
{email: email, password: password})
.then((res) => {
this.setTokenAndUser(res.token, res.user);
return res;
})
.catch((e) => { throw e; });
// return user !== undefined;
}
logout(): boolean {
this.setTokenAndUser(null, null);
return true;
}
register(user: User, password: string): Promise<any> {
return this.api.post('/users/auth/',
{email: user.email, password: password})
.then((res) => {
this.setTokenAndUser(res.token, res.user);
return res;
})
.catch((e) => { throw e; });
}
}