X-Git-Url: https://git.arvados.org/arvados.git/blobdiff_plain/c390816e1df89c27662ef3fe79da10b66410edaa..ce4b1330e232f9f29b6f0bf361f3fd6913d9ae6e:/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 83af1e13ac..907f0081fd 100644 --- a/src/services/common-service/common-resource-service.ts +++ b/src/services/common-service/common-resource-service.ts @@ -3,16 +3,18 @@ // SPDX-License-Identifier: AGPL-3.0 import { AxiosInstance } from "axios"; -import * as _ from "lodash"; -import { Resource } from "src/models/resource"; -import { ApiActions } from "~/services/api/api-actions"; -import { CommonService } from "~/services/common-service/common-service"; +import { snakeCase } from "lodash"; +import { Resource } from "models/resource"; +import { ApiActions } from "services/api/api-actions"; +import { CommonService } from "services/common-service/common-service"; export enum CommonResourceServiceError { UNIQUE_NAME_VIOLATION = 'UniqueNameViolation', OWNERSHIP_CYCLE = 'OwnershipCycle', MODIFYING_CONTAINER_REQUEST_FINAL_STATE = 'ModifyingContainerRequestFinalState', NAME_HAS_ALREADY_BEEN_TAKEN = 'NameHasAlreadyBeenTaken', + PERMISSION_ERROR_FORBIDDEN = 'PermissionErrorForbidden', + SOURCE_DESTINATION_CANNOT_BE_SAME = 'SourceDestinationCannotBeSame', UNKNOWN = 'Unknown', NONE = 'None' } @@ -22,35 +24,44 @@ export class CommonResourceService extends CommonService super(serverApi, resourceType, actions, readOnlyFields.concat([ 'uuid', 'etag', - 'kind' + 'kind', + 'canWrite', + 'canManage', + 'createdAt', + 'modifiedAt', + 'modifiedByClientUuid', + 'modifiedByUserUuid' ])); } - create(data?: Partial) { + create(data?: Partial, showErrors?: boolean) { let payload: any; if (data !== undefined) { - this.readOnlyFields.forEach( field => delete data[field] ); + this.readOnlyFields.forEach(field => delete data[field]); payload = { - [this.resourceType.slice(0, -1)]: CommonService.mapKeys(_.snakeCase)(data), + [this.resourceType.slice(0, -1)]: CommonService.mapKeys(snakeCase)(data), }; } - return super.create(payload); + return super.create(payload, showErrors); } - update(uuid: string, data: Partial) { + update(uuid: string, data: Partial, showErrors?: boolean, select?: string[]) { let payload: any; if (data !== undefined) { - this.readOnlyFields.forEach( field => delete data[field] ); + this.readOnlyFields.forEach(field => delete data[field]); payload = { - [this.resourceType.slice(0, -1)]: CommonService.mapKeys(_.snakeCase)(data), + [this.resourceType.slice(0, -1)]: CommonService.mapKeys(snakeCase)(data), + }; + if (select !== undefined && select.length > 0) { + payload.select = ['uuid', ...select.map(field => snakeCase(field))]; }; } - return super.update(uuid, payload); + return super.update(uuid, payload, showErrors); } } export const getCommonResourceServiceError = (errorResponse: any) => { - if ('errors' in errorResponse && 'errorToken' in errorResponse) { + if (errorResponse && 'errors' in errorResponse) { const error = errorResponse.errors.join(''); switch (true) { case /UniqueViolation/.test(error): @@ -61,11 +72,13 @@ export const getCommonResourceServiceError = (errorResponse: any) => { return CommonResourceServiceError.MODIFYING_CONTAINER_REQUEST_FINAL_STATE; case /Name has already been taken/.test(error): return CommonResourceServiceError.NAME_HAS_ALREADY_BEEN_TAKEN; + case /403 Forbidden/.test(error): + return CommonResourceServiceError.PERMISSION_ERROR_FORBIDDEN; + case new RegExp(CommonResourceServiceError.SOURCE_DESTINATION_CANNOT_BE_SAME).test(error): + return CommonResourceServiceError.SOURCE_DESTINATION_CANNOT_BE_SAME; default: return CommonResourceServiceError.UNKNOWN; } } return CommonResourceServiceError.NONE; }; - -