11import { inject , Injectable , linkedSignal , signal } from '@angular/core' ;
2- import { LOCAL_STORAGE } from '~core/providers/local-storage' ;
32import { HttpClient } from '@angular/common/http' ;
4- import type { Observable } from 'rxjs' ;
5- import { map } from 'rxjs' ;
3+ import { map , type Observable } from 'rxjs' ;
4+ import { LOCAL_STORAGE } from '~core/providers/local-storage' ;
5+ import { LanguageService } from '~core/services/language.service' ;
6+ import { clearCache } from '~core/interceptors/caching.interceptor' ;
7+ import { getEndpoints } from '~core/constants/endpoints.constants' ;
68import type { LoginRequest } from '~features/authentication/types/login-request.type' ;
79import type { LoginResponse } from '~features/authentication/types/login-response.type' ;
810import type {
@@ -13,11 +15,9 @@ import type {
1315 RegisterResponse ,
1416 RegisterResponseData ,
1517} from '~features/authentication/types/register-response.type' ;
16- import { LanguageService } from '~core/services/language.service' ;
17- import type { User } from '~features/authentication/types/user.type' ;
18- import { clearCache } from '~core/interceptors/caching.interceptor' ;
19- import { getEndpoints } from '~core/constants/endpoints.constants' ;
2018import type { RegisterFormValue } from '~features/authentication/pages/register/register-form.types' ;
19+ import type { User } from '~features/authentication/types/user.type' ;
20+ import type { AuthTokens } from '~features/authentication/types/authentication.types' ;
2121
2222export const ACCESS_TOKEN_KEY = 'access-token' ;
2323export const REFRESH_TOKEN_KEY = 'refresh-token' ;
@@ -27,14 +27,11 @@ export const REFRESH_TOKEN_KEY = 'refresh-token';
2727} )
2828export class AuthenticationService {
2929 private readonly endpoints = getEndpoints ( ) ;
30- private readonly storageService = inject ( LOCAL_STORAGE ) ;
3130 private readonly httpClient = inject ( HttpClient ) ;
31+ private readonly storageService = inject ( LOCAL_STORAGE ) ;
3232 private readonly languageService = inject ( LanguageService ) ;
3333
34- private readonly authTokens = signal < {
35- accessToken ?: string | undefined ;
36- refreshToken ?: string | undefined ;
37- } > ( {
34+ private readonly authTokens = signal < AuthTokens > ( {
3835 accessToken : this . storageService ?. getItem ( ACCESS_TOKEN_KEY ) ?? undefined ,
3936 refreshToken : this . storageService ?. getItem ( REFRESH_TOKEN_KEY ) ?? undefined ,
4037 } ) ;
@@ -50,79 +47,72 @@ export class AuthenticationService {
5047 } ) ;
5148
5249 register ( registerRequest : RegisterFormValue ) : Observable < RegisterResponseData > {
53- return this . httpClient
54- . post < RegisterResponse > (
55- this . endpoints . auth . v1 . authentication ,
56- {
57- email : registerRequest . email . toLowerCase ( ) ,
58- password : registerRequest . password ,
59- name : registerRequest . name ,
60- favouritePokemonId : registerRequest . favouritePokemonId ,
61- terms : registerRequest . terms ,
62- } ,
63- {
64- headers : {
65- 'Accept-Language' : this . languageService . convertLocaleToAcceptLanguage ( ) ,
66- } ,
50+ const payload = {
51+ ...registerRequest ,
52+ email : registerRequest . email . toLowerCase ( ) ,
53+ } ;
54+
55+ return this . handleAuthResponse (
56+ this . httpClient . post < RegisterResponse > ( this . endpoints . auth . v1 . authentication , payload , {
57+ headers : {
58+ 'Accept-Language' : this . languageService . convertLocaleToAcceptLanguage ( ) ,
6759 } ,
68- )
69- . pipe (
70- map ( ( response : RegisterResponse ) => {
71- const { data } = response ;
72- this . saveTokens ( data ) ;
73- return data ;
74- } ) ,
75- ) ;
60+ } ) ,
61+ ) ;
7662 }
7763
7864 logIn ( loginRequest : LoginRequest ) : Observable < User > {
79- return this . httpClient
80- . post < LoginResponse > ( this . endpoints . auth . v1 . login , {
81- email : loginRequest . email . toLowerCase ( ) ,
82- password : loginRequest . password ,
83- } )
84- . pipe (
85- map ( ( response : LoginResponse ) => {
86- const { data } = response ;
87- this . saveTokens ( data ) ;
88- return data . user ;
89- } ) ,
90- ) ;
65+ const payload = {
66+ email : loginRequest . email . toLowerCase ( ) ,
67+ password : loginRequest . password ,
68+ } ;
69+
70+ return this . handleAuthResponse (
71+ this . httpClient . post < LoginResponse > ( this . endpoints . auth . v1 . login , payload ) ,
72+ ) . pipe ( map ( ( data ) => data . user ) ) ;
9173 }
9274
9375 refreshToken ( ) : Observable < RefreshTokenResponseData > {
94- return this . httpClient
95- . post < RefreshTokenResponse > ( this . endpoints . auth . v1 . refreshToken , {
96- refreshToken : this . storageService ?. getItem ( REFRESH_TOKEN_KEY ) ,
97- } )
98- . pipe (
99- map ( ( response : RefreshTokenResponse ) => {
100- const { data } = response ;
101- this . saveTokens ( data ) ;
102- return data ;
103- } ) ,
104- ) ;
76+ const refreshToken = this . storageService ?. getItem ( REFRESH_TOKEN_KEY ) ;
77+
78+ return this . handleAuthResponse (
79+ this . httpClient . post < RefreshTokenResponse > ( this . endpoints . auth . v1 . refreshToken , {
80+ refreshToken,
81+ } ) ,
82+ ) ;
10583 }
10684
10785 logOut ( ) {
10886 clearCache ( ) ;
10987 this . removeTokens ( ) ;
11088 }
11189
112- private saveTokens ( data : { accessToken : string ; refreshToken ?: string } ) {
113- this . storageService ?. setItem ( ACCESS_TOKEN_KEY , data . accessToken ) ;
114- if ( data . refreshToken ) {
115- this . storageService ?. setItem ( REFRESH_TOKEN_KEY , data . refreshToken ) ;
116- }
117- this . authTokens . set ( {
118- accessToken : data . accessToken ,
119- refreshToken : data . refreshToken ,
120- } ) ;
90+ private handleAuthResponse < T extends { data : { accessToken : string ; refreshToken ?: string } } > (
91+ request$ : Observable < T > ,
92+ ) : Observable < T [ 'data' ] > {
93+ return request$ . pipe (
94+ map ( ( response ) => {
95+ this . saveTokens ( response . data ) ;
96+ return response . data ;
97+ } ) ,
98+ ) ;
99+ }
100+
101+ private saveTokens ( {
102+ accessToken,
103+ refreshToken,
104+ } : {
105+ accessToken : string ;
106+ refreshToken ?: string ;
107+ } ) : void {
108+ this . storageService ?. setItem ( ACCESS_TOKEN_KEY , accessToken ) ;
109+ this . storageService ?. setItem ( REFRESH_TOKEN_KEY , refreshToken ?? '' ) ;
110+ this . authTokens . set ( { accessToken, refreshToken } ) ;
121111 }
122112
123- private removeTokens ( ) {
113+ private removeTokens ( ) : void {
124114 this . storageService ?. removeItem ( ACCESS_TOKEN_KEY ) ;
125115 this . storageService ?. removeItem ( REFRESH_TOKEN_KEY ) ;
126- this . authTokens . set ( { } ) ;
116+ this . authTokens . set ( { accessToken : undefined , refreshToken : undefined } ) ;
127117 }
128118}
0 commit comments