import BaseEntityClientInterface from '../../interfaces/BaseEntityClientInterface'; import TransformerInterface from '../../interfaces/TransformerInterface'; import BaseRequest from '../../../Request/BaseRequest/entity/BaseRequest'; import HTTPRequest from '../../../Request/entity/HTTPRequest'; import BaseEntityServiceInterface from './BaseEntityServiceInterface'; import RequestPromise from '../../DTO/RequestPromise'; export default abstract class BaseEntityService implements BaseEntityServiceInterface { protected client: BaseEntityClientInterface; protected transformer: TransformerInterface; constructor(client: BaseEntityClientInterface, transformer: TransformerInterface) { this.client = client; this.transformer = transformer; } protected adaptPagination(responseFromAPI: any): object { const { data: dataToAdapt, ...paginationInfo } = responseFromAPI; return { paginationInfo, data: dataToAdapt.map(each => this.transformer.transformToEntity(each)), }; } get(request: BaseRequest): RequestPromise { const httpRequest = new HTTPRequest(); httpRequest.queryString = request.getQueryString(); const requestPromise = this.client.getData(httpRequest); return new RequestPromise( requestPromise.requestId, new Promise((resolve, reject) => { requestPromise.promise.then((response: any) => { try { resolve( this.adaptPagination(response.data), ); } catch (e) { reject(e); } }) }), ); } getById(id: string): RequestPromise { const httpRequest = new HTTPRequest(); httpRequest.data = { id }; const requestPromise = this.client.getById(httpRequest); return new RequestPromise( requestPromise.requestId, new Promise((resolve, reject) => { requestPromise.promise.then((response: any) => { try { resolve( this.transformer.transformToEntity(response.data.data), ); } catch (e) { reject(e); } }) }), ); } create(instance: T): RequestPromise { const httpRequest = new HTTPRequest(); httpRequest.data = this.transformer.transformToPayload(instance); return this.client.create(httpRequest); } update(instance: T): RequestPromise { const httpRequest = new HTTPRequest(); httpRequest.data = this.transformer.transformToPayload(instance); return this.client.update(httpRequest); } disable(id: string): RequestPromise { const httpRequest = new HTTPRequest(); httpRequest.data = { id }; return this.client.disable(httpRequest); } cancel(requestId: string) { this.client.cancel(requestId); } }