From 7eebe4632cdc05e1d46874c9443056779946e672 Mon Sep 17 00:00:00 2001 From: Polianin Nikita Date: Fri, 28 Jun 2024 21:32:10 +0300 Subject: [PATCH] feat: add withCredentials that doesn't send cookie if not needed --- src/api/RequestBuilder.ts | 16 +++++++++++--- src/api/api.service.ts | 44 ++++++++++++++++++++++--------------- src/api/v1/setup.service.ts | 24 ++++++++++++++++++-- 3 files changed, 61 insertions(+), 23 deletions(-) diff --git a/src/api/RequestBuilder.ts b/src/api/RequestBuilder.ts index a279bf2..c6b62ca 100644 --- a/src/api/RequestBuilder.ts +++ b/src/api/RequestBuilder.ts @@ -10,6 +10,7 @@ export interface RequestData { httpHeaders: HttpHeaders; data: any; silenceMode: boolean; + withCredentials: boolean; } export class RequestBuilder { @@ -18,6 +19,7 @@ export class RequestBuilder { private httpHeaders: HttpHeaders = new HttpHeaders(); private data: any = null; private silenceMode: boolean = false; + private withCredentials: boolean = false; private readonly object: any; constructor(obj: any) { @@ -46,18 +48,24 @@ export class RequestBuilder { return this; } - public setSilenceMode(silence: boolean): RequestBuilder { + public setSilenceMode(silence: boolean = true): RequestBuilder { this.silenceMode = silence; return this; } + public setWithCredentials(credentials: boolean = true): RequestBuilder { + this.withCredentials = credentials; + return this; + } + public build(): Type { (this.object as SetRequestBuilderAfterBuild).setRequestBuilder({ endpoint: this.endpoint, queryParams: this.queryParams, httpHeaders: this.httpHeaders, data: this.data, - silenceMode: this.silenceMode + silenceMode: this.silenceMode, + withCredentials: this.withCredentials }); return this.object as Type; } @@ -88,7 +96,8 @@ export class RequestBuilder { queryParams: null, httpHeaders: new HttpHeaders(), data: null, - silenceMode: false + silenceMode: false, + withCredentials: false } } @@ -98,5 +107,6 @@ export class RequestBuilder { this.httpHeaders = new HttpHeaders(); this.data = null; this.silenceMode = false; + this.withCredentials = false; } } diff --git a/src/api/api.service.ts b/src/api/api.service.ts index a8047a9..a53c3d9 100644 --- a/src/api/api.service.ts +++ b/src/api/api.service.ts @@ -38,7 +38,7 @@ export default abstract class ApiService implements SetRequestBuilderAfterBuild constructor(private http: HttpClient, private notify: OpenNotifyService, private router: Router) { } - private urlApi = environment.apiUrl; + private apiUrl = environment.apiUrl; protected abstract basePath: string; protected abstract version: AvailableVersion; private request: RequestData = RequestBuilder.getStandardRequestData(); @@ -66,28 +66,36 @@ export default abstract class ApiService implements SetRequestBuilderAfterBuild } private static combineUrls(...parts: string[]): string { - let test = parts.map(part => part.replace(/(^\/+|\/+$)/g, '')).join('/'); - console.log(test); - return test; + return parts.map(part => part.replace(/(^\/+|\/+$)/g, '')).join('/'); + } + + protected get combinedUrl() { + return ApiService.addQuery(ApiService.combineUrls(this.apiUrl, AvailableVersion[this.version], this.basePath, this.request.endpoint), this.request.queryParams) } private makeHttpRequest(method: 'get' | 'post' | 'delete' | 'put'): Observable { - const doneEndpoint = ApiService.addQuery(ApiService.combineUrls(this.urlApi, AvailableVersion[this.version], this.basePath, this.request.endpoint), this.request.queryParams); + const doneEndpoint = this.combinedUrl; - return this.http.request(method, doneEndpoint, { - withCredentials: true, - headers: this.request.httpHeaders, - body: this.request.data - }).pipe( - tap(_ => this.request = RequestBuilder.getStandardRequestData()), - retryWithInterval(), - catchError(error => { - if (!this.request.silenceMode) - this.handleError(error); + return this.tokenRefreshService.getTokenRefreshing$().pipe( + filter(refreshing => !refreshing), + take(1), + switchMap(_ => { + return this.http.request(method, doneEndpoint, { + withCredentials: this.request.withCredentials, + headers: this.request.httpHeaders, + body: this.request.data + }).pipe( + tap(_ => this.request = RequestBuilder.getStandardRequestData()), + retryWithInterval(), + catchError(error => { + if (!this.request.silenceMode) + this.handleError(error); - this.request = RequestBuilder.getStandardRequestData(); - throw error; - }) + this.request = RequestBuilder.getStandardRequestData(); + throw error; + }) + ); + }) ); } diff --git a/src/api/v1/setup.service.ts b/src/api/v1/setup.service.ts index 8cfc3ca..f581c7e 100644 --- a/src/api/v1/setup.service.ts +++ b/src/api/v1/setup.service.ts @@ -25,6 +25,7 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetPsql') .setData(data) + .setWithCredentials() .build() .post(); } @@ -33,6 +34,7 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetMysql') .setData(data) + .setWithCredentials() .build() .post(); } @@ -41,6 +43,7 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetSqlite') .setQueryParams({path: path}) + .setWithCredentials() .build() .get(); } @@ -49,18 +52,24 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetRedis') .setData(data) + .setWithCredentials() .build() .post(); } public setMemcached() { - return this.post('SetMemcached'); + return this.createRequestBuilder() + .setEndpoint('SetMemcached') + .setWithCredentials() + .build() + .post(); } public createAdmin(data: CreateUserRequest) { return this.createRequestBuilder() .setEndpoint('CreateAdmin') .setData(data) + .setWithCredentials() .build() .post(); } @@ -69,6 +78,7 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetLogging') .setData(data) + .setWithCredentials() .build() .post(); } @@ -77,6 +87,7 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetEmail') .setData(data) + .setWithCredentials() .build() .post(); } @@ -87,11 +98,20 @@ export default class SetupService extends ApiService { return this.createRequestBuilder() .setEndpoint('SetSchedule') .setData(data) + .setWithCredentials() .build() .post(); } public submit() { - return this.post('Submit'); + return this.createRequestBuilder() + .setEndpoint('Submit') + .setWithCredentials() + .build() + .post(); + } + + public isConfigured() { + return this.get('IsConfigured'); } }