X-Git-Url: https://git.arvados.org/arvados-workbench2.git/blobdiff_plain/f5c0cb11102a006cda59711f29458b7569b9a21f..4c394b5b01622c72318fc194682077aa304417fa:/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 7b36b71c..0c99e7d4 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; @@ -32,13 +34,14 @@ export interface Errors { export enum CommonResourceServiceError { UNIQUE_VIOLATION = 'UniqueViolation', OWNERSHIP_CYCLE = 'OwnershipCycle', + MODIFYING_CONTAINER_REQUEST_FINAL_STATE = 'ModifyingContainerRequestFinalState', UNKNOWN = 'Unknown', NONE = 'None' } 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) => @@ -59,36 +62,55 @@ export class CommonResourceService { } } - static defaultResponse(promise: AxiosPromise): Promise { + static defaultResponse(promise: AxiosPromise, actions: ApiActions): Promise { + const reqId = uuid(); + actions.progressFn(reqId, true); return promise + .then(data => { + actions.progressFn(reqId, false); + return data; + }) .then(CommonResourceService.mapResponseKeys) - .catch(({ response }) => Promise.reject(CommonResourceService.mapResponseKeys(response))); + .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> { @@ -102,14 +124,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 + ); } } @@ -121,6 +146,8 @@ export const getCommonResourceServiceError = (errorResponse: any) => { return CommonResourceServiceError.UNIQUE_VIOLATION; case /ownership cycle/.test(error): return CommonResourceServiceError.OWNERSHIP_CYCLE; + case /Mounts cannot be modified in state 'Final'/.test(error): + return CommonResourceServiceError.MODIFYING_CONTAINER_REQUEST_FINAL_STATE; default: return CommonResourceServiceError.UNKNOWN; }