// SPDX-License-Identifier: AGPL-3.0
import { AxiosInstance } from "axios";
-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',
}
export class CommonResourceService<T extends Resource> extends CommonService<T> {
- constructor(serverApi: AxiosInstance, resourceType: string, actions: ApiActions) {
- super(serverApi, resourceType, actions);
+ constructor(serverApi: AxiosInstance, resourceType: string, actions: ApiActions, readOnlyFields: string[] = []) {
+ super(serverApi, resourceType, actions, readOnlyFields.concat([
+ 'uuid',
+ 'etag',
+ 'kind'
+ ]));
+ }
+
+ create(data?: Partial<T>, showErrors?: boolean) {
+ let payload: any;
+ if (data !== undefined) {
+ this.readOnlyFields.forEach( field => delete data[field] );
+ payload = {
+ [this.resourceType.slice(0, -1)]: CommonService.mapKeys(snakeCase)(data),
+ };
+ }
+ return super.create(payload, showErrors);
+ }
+
+ update(uuid: string, data: Partial<T>, showErrors?: boolean, select?: string[]) {
+ let payload: any;
+ if (data !== undefined) {
+ this.readOnlyFields.forEach( field => delete data[field] );
+ payload = {
+ [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, showErrors);
}
}
export const getCommonResourceServiceError = (errorResponse: any) => {
- if ('errors' in errorResponse && 'errorToken' in errorResponse) {
+ if ('errors' in errorResponse) {
const error = errorResponse.errors.join('');
switch (true) {
case /UniqueViolation/.test(error):