X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/d048e918a6899aac404179690730d29ce26c606a..13bf073c77ca9fcf75ebd31098a9bf538e96c9c9:/src/services/common-service/common-resource-service.ts diff --git a/src/services/common-service/common-resource-service.ts b/src/services/common-service/common-resource-service.ts index 09e034f5f8..70c1df0e2b 100644 --- a/src/services/common-service/common-resource-service.ts +++ b/src/services/common-service/common-resource-service.ts @@ -5,6 +5,8 @@ import * as _ from "lodash"; import { AxiosInstance, AxiosPromise } from "axios"; import { Resource } from "src/models/resource"; +import * as uuid from "uuid/v4"; +import { ApiActions } from "~/services/api/api-actions"; export interface ListArguments { limit?: number; @@ -39,7 +41,7 @@ export enum CommonResourceServiceError { export class CommonResourceService { - static mapResponseKeys = (response: { data: any }): Promise => + static mapResponseKeys = (response: { data: any }) => CommonResourceService.mapKeys(_.camelCase)(response.data) static mapKeys = (mapFn: (key: string) => string) => @@ -60,36 +62,57 @@ export class CommonResourceService { } } - static defaultResponse(promise: AxiosPromise): Promise { + static defaultResponse(promise: AxiosPromise, actions: ApiActions, mapKeys = true): Promise { + const reqId = uuid(); + actions.progressFn(reqId, true); return promise - .then(CommonResourceService.mapResponseKeys) - .catch(({ response }) => Promise.reject(CommonResourceService.mapResponseKeys(response))); + .then(data => { + actions.progressFn(reqId, false); + return data; + }) + .then((response: { data: any }) => { + return mapKeys ? CommonResourceService.mapResponseKeys(response) : response.data; + }) + .catch(({ response }) => { + actions.progressFn(reqId, false); + const errors = CommonResourceService.mapResponseKeys(response) as Errors; + actions.errorFn(reqId, errors); + throw errors; + }); } protected serverApi: AxiosInstance; protected resourceType: string; + protected actions: ApiActions; - constructor(serverApi: AxiosInstance, resourceType: string) { + constructor(serverApi: AxiosInstance, resourceType: string, actions: ApiActions) { this.serverApi = serverApi; this.resourceType = '/' + resourceType + '/'; + this.actions = actions; } - create(data?: Partial | any) { + create(data?: Partial) { return CommonResourceService.defaultResponse( this.serverApi - .post(this.resourceType, data && CommonResourceService.mapKeys(_.snakeCase)(data))); + .post(this.resourceType, data && CommonResourceService.mapKeys(_.snakeCase)(data)), + this.actions + ); } delete(uuid: string): Promise { return CommonResourceService.defaultResponse( this.serverApi - .delete(this.resourceType + uuid)); + .delete(this.resourceType + uuid), + this.actions + ); } get(uuid: string) { return CommonResourceService.defaultResponse( this.serverApi - .get(this.resourceType + uuid)); + .get(this.resourceType + uuid), + this.actions + ); } list(args: ListArguments = {}): Promise> { @@ -103,14 +126,17 @@ export class CommonResourceService { this.serverApi .get(this.resourceType, { params: CommonResourceService.mapKeys(_.snakeCase)(params) - })); + }), + this.actions + ); } update(uuid: string, data: Partial) { return CommonResourceService.defaultResponse( this.serverApi - .put(this.resourceType + uuid, data && CommonResourceService.mapKeys(_.snakeCase)(data))); - + .put(this.resourceType + uuid, data && CommonResourceService.mapKeys(_.snakeCase)(data)), + this.actions + ); } }