import { Injectable } from '@angular/core'; import { HttpClient, HttpParams } from '@angular/common/http'; import { map } from 'rxjs/operators'; import { Subscription } from 'rxjs'; import { Trackable, IDeleteOptions, IGetOptions, IParameter, IPostOptions, IPutOptions, ITrackableGetOptions, LaunchpadWebConfiguration, WebConfiguration, } from '@creedinteractive/onguard-models'; import { WebConfigurationService } from '../web-configuration/web-configuration.service'; export declare interface ILaunchpadWebConfigurationService { config: LaunchpadWebConfiguration; constructor(config: LaunchpadWebConfiguration); logConfiguration(): void; } @Injectable({ providedIn: 'root', }) export class VerbsService { apiUrl: string; constructor( private httpClient: HttpClient, private webConfigurationService: WebConfigurationService, ) { if (typeof webConfigurationService?.config === 'undefined') { throw new Error('Missing configuration options'); } this.apiUrl = webConfigurationService.config.appApiUrl; } setupParameters(parameters: IParameter[] = []): HttpParams { let httpParams = new HttpParams(); parameters.forEach((parameter) => { httpParams = httpParams.set(parameter.name, parameter.value); }); return httpParams; } post(options: IPostOptions) { if (options.headers) { const postOptions = { headers: options.headers, }; this.httpClient .post(this.apiUrl + options.uri, options.body, postOptions) .subscribe(options.handlers.success, options.handlers.error); } else { this.httpClient .post(this.apiUrl + options.uri, options.body) .subscribe(options.handlers.success, options.handlers.error); } } get(options: IGetOptions): Subscription { const httpClientOptions = { params: this.setupParameters(options.parameters), }; return this.httpClient .get(this.apiUrl + options.uri, httpClientOptions) .subscribe(options.handlers.success, options.handlers.error); } trackableGet(options: ITrackableGetOptions) { const trackBy = options.trackBy; const httpClientOptions = { params: this.setupParameters(options.parameters), }; this.httpClient .get(this.apiUrl + options.uri, httpClientOptions) .pipe( map((data) => { return { trackingId: trackBy, data } as Trackable; }), ) .subscribe(options.handlers.success, options.handlers.error); } put(options: IPutOptions) { const httpClientOptions = { params: this.setupParameters(options.parameters), }; this.httpClient .put(this.apiUrl + options.uri, options.body, httpClientOptions) .subscribe(options.handlers.success, options.handlers.error); } delete(options: IDeleteOptions) { const httpClientOptions = { params: this.setupParameters(options.parameters), }; this.httpClient .delete(this.apiUrl + options.uri, httpClientOptions) .subscribe(options.handlers.success, options.handlers.error); } }