Skip to content

Commit fde9cd8

Browse files
committed
chore(app): refactor AuthenticationService to improve request handling
1 parent 58620c0 commit fde9cd8

2 files changed

Lines changed: 62 additions & 68 deletions

File tree

Lines changed: 58 additions & 68 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,10 @@
11
import { inject, Injectable, linkedSignal, signal } from '@angular/core';
2-
import { LOCAL_STORAGE } from '~core/providers/local-storage';
32
import { 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';
68
import type { LoginRequest } from '~features/authentication/types/login-request.type';
79
import type { LoginResponse } from '~features/authentication/types/login-response.type';
810
import 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';
2018
import 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

2222
export const ACCESS_TOKEN_KEY = 'access-token';
2323
export const REFRESH_TOKEN_KEY = 'refresh-token';
@@ -27,14 +27,11 @@ export const REFRESH_TOKEN_KEY = 'refresh-token';
2727
})
2828
export 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
}
Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export type AuthTokens = {
2+
accessToken?: string | undefined;
3+
refreshToken?: string | undefined;
4+
};

0 commit comments

Comments
 (0)