2022-09-30 05:01:07 +00:00

205 lines
5.2 KiB
TypeScript

import { Injectable } from '@angular/core';
import { HttpClient } from '@angular/common/http';
import { catchError, Observable, of, switchMap, throwError } from 'rxjs';
import { AuthUtils } from 'app/core/auth/auth.utils';
import { WebSessionStorageService } from 'app/core/web-storage/services/web-session-storage.service';
import { IdentityService } from 'app/modules/polyglot/identity/services/identity.service';
import { MemberService } from 'app/modules/polyglot/member/services/member.service';
import { MemberInfo } from 'app/shared/models/member-info';
@Injectable()
export class AuthService {
private _authenticated: boolean = false;
/**
* Constructor
*/
constructor(
private _httpClient: HttpClient,
private _identityService: IdentityService,
private _memberService: MemberService,
private __webSessionStorageService: WebSessionStorageService
) {}
// -----------------------------------------------------------------------------------------------------
// @ Accessors
// -----------------------------------------------------------------------------------------------------
/**
* Setter & getter for access token
*/
get accessToken(): string {
return localStorage.getItem('accessToken') ?? '';
}
set accessToken(token: string) {
localStorage.setItem('accessToken', token);
}
set memberInfo(memberInfo: MemberInfo) {
const info = JSON.stringify(memberInfo);
localStorage.setItem('memberInfo', info);
}
get memberInfo(): MemberInfo {
const info = localStorage.getItem('memberInfo') ?? '';
let result = {} as MemberInfo;
if (info !== '') {
result = JSON.parse(info) as MemberInfo;
}
return result;
}
// -----------------------------------------------------------------------------------------------------
// @ Public methods
// -----------------------------------------------------------------------------------------------------
/**
* Forgot password
*
* @param email
*/
forgotPassword(email: string): Observable<any> {
return this._httpClient.post('api/auth/forgot-password', email);
}
/**
* Reset password
*
* @param password
*/
resetPassword(password: string): Observable<any> {
return this._httpClient.post('api/auth/reset-password', password);
}
/**
* Sign in
*
* @param credentials
*/
signIn(credentials: { username: string; password: string }): Promise<any> {
return new Promise<void>((resolve, reject) => {
// Throw error, if the user is already logged in
if (this._authenticated) {
return reject('User is already logged in.');
}
this._identityService
.signinWithoutSecurityCode(credentials.username, credentials.password)
.then((res) => {
this.__webSessionStorageService.set(
'accessToken',
res.getAccessToken()
);
this.memberInfo = {
username: credentials.username,
} as MemberInfo;
// Store the access token in the local storage
this.accessToken = res.getAccessToken();
// Set the authenticated flag to true
this._authenticated = true;
resolve();
})
.catch((e) => {
reject(e);
});
});
}
/**
* Sign in using the access token
*/
signInUsingToken(): Observable<any> {
// Renew token
return this._httpClient
.post('api/auth/refresh-access-token', {
accessToken: this.accessToken,
})
.pipe(
catchError(() =>
// Return false
of(false)
),
switchMap((response: any) => {
// Store the access token in the local storage
this.accessToken = response.accessToken;
// Set the authenticated flag to true
this._authenticated = true;
// Return true
return of(true);
})
);
}
/**
* Sign out
*/
signOut(): Observable<any> {
// Remove the access token from the local storage
localStorage.removeItem('accessToken');
localStorage.removeItem('memberInfo');
// Set the authenticated flag to false
this._authenticated = false;
// Return the observable
return of(true);
}
/**
* Sign up
*
* @param user
*/
signUp(user: {
name: string;
email: string;
password: string;
company: string;
}): Observable<any> {
return this._httpClient.post('api/auth/sign-up', user);
}
/**
* Unlock session
*
* @param credentials
*/
unlockSession(credentials: {
email: string;
password: string;
}): Observable<any> {
return this._httpClient.post('api/auth/unlock-session', credentials);
}
/**
* Check the authentication status
*/
check(): Observable<boolean> {
// Check if the user is logged in
if (this._authenticated) {
return of(true);
}
// Check the access token availability
if (!this.accessToken) {
return of(false);
}
// Check the access token expire date
if (AuthUtils.isTokenExpired(this.accessToken)) {
return of(false);
}
// If the access token exists and it didn't expire, sign in using it
// return this.signInUsingToken();
return of(true);
}
}