X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/00ddf216e1a5046a858b1c8b49f0e967404474ca..0429d37860f633725ecff6bd923e196a61121881:/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 70c1df0e2b..bc24f22796 100644 --- a/src/services/common-service/common-resource-service.ts +++ b/src/services/common-service/common-resource-service.ts @@ -2,141 +2,41 @@ // // SPDX-License-Identifier: AGPL-3.0 -import * as _ from "lodash"; -import { AxiosInstance, AxiosPromise } from "axios"; +import { AxiosInstance } 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; - offset?: number; - filters?: string; - order?: string; - select?: string[]; - distinct?: boolean; - count?: string; -} - -export interface ListResults { - kind: string; - offset: number; - limit: number; - items: T[]; - itemsAvailable: number; -} - -export interface Errors { - errors: string[]; - errorToken: string; -} +import { CommonService } from "~/services/common-service/common-service"; export enum CommonResourceServiceError { - UNIQUE_VIOLATION = 'UniqueViolation', + UNIQUE_NAME_VIOLATION = 'UniqueNameViolation', OWNERSHIP_CYCLE = 'OwnershipCycle', MODIFYING_CONTAINER_REQUEST_FINAL_STATE = 'ModifyingContainerRequestFinalState', + NAME_HAS_ALREADY_BEEN_TAKEN = 'NameHasAlreadyBeenTaken', UNKNOWN = 'Unknown', NONE = 'None' } -export class CommonResourceService { - - static mapResponseKeys = (response: { data: any }) => - CommonResourceService.mapKeys(_.camelCase)(response.data) - - static mapKeys = (mapFn: (key: string) => string) => - (value: any): any => { - switch (true) { - case _.isPlainObject(value): - return Object - .keys(value) - .map(key => [key, mapFn(key)]) - .reduce((newValue, [key, newKey]) => ({ - ...newValue, - [newKey]: CommonResourceService.mapKeys(mapFn)(value[key]) - }), {}); - case _.isArray(value): - return value.map(CommonResourceService.mapKeys(mapFn)); - default: - return value; - } - } - - static defaultResponse(promise: AxiosPromise, actions: ApiActions, mapKeys = true): Promise { - const reqId = uuid(); - actions.progressFn(reqId, true); - return promise - .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, actions: ApiActions) { - this.serverApi = serverApi; - this.resourceType = '/' + resourceType + '/'; - this.actions = actions; +export class CommonResourceService extends CommonService { + constructor(serverApi: AxiosInstance, resourceType: string, actions: ApiActions, readOnlyFields: string[] = []) { + super(serverApi, resourceType, actions, readOnlyFields.concat([ + 'uuid', + 'etag', + 'kind' + ])); } create(data?: Partial) { - return CommonResourceService.defaultResponse( - this.serverApi - .post(this.resourceType, data && CommonResourceService.mapKeys(_.snakeCase)(data)), - this.actions - ); - } - - delete(uuid: string): Promise { - return CommonResourceService.defaultResponse( - this.serverApi - .delete(this.resourceType + uuid), - this.actions - ); - } - - get(uuid: string) { - return CommonResourceService.defaultResponse( - this.serverApi - .get(this.resourceType + uuid), - this.actions - ); - } - - list(args: ListArguments = {}): Promise> { - const { filters, order, ...other } = args; - const params = { - ...other, - filters: filters ? `[${filters}]` : undefined, - order: order ? order : undefined - }; - return CommonResourceService.defaultResponse( - this.serverApi - .get(this.resourceType, { - params: CommonResourceService.mapKeys(_.snakeCase)(params) - }), - this.actions - ); + if (data !== undefined) { + this.readOnlyFields.forEach( field => delete data[field] ); + } + return super.create(data); } update(uuid: string, data: Partial) { - return CommonResourceService.defaultResponse( - this.serverApi - .put(this.resourceType + uuid, data && CommonResourceService.mapKeys(_.snakeCase)(data)), - this.actions - ); + if (data !== undefined) { + this.readOnlyFields.forEach( field => delete data[field] ); + } + return super.update(uuid, data); } } @@ -145,11 +45,13 @@ export const getCommonResourceServiceError = (errorResponse: any) => { const error = errorResponse.errors.join(''); switch (true) { case /UniqueViolation/.test(error): - return CommonResourceServiceError.UNIQUE_VIOLATION; + return CommonResourceServiceError.UNIQUE_NAME_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; + case /Name has already been taken/.test(error): + return CommonResourceServiceError.NAME_HAS_ALREADY_BEEN_TAKEN; default: return CommonResourceServiceError.UNKNOWN; }