//
// SPDX-License-Identifier: AGPL-3.0
-import * as _ from "lodash";
-import { AxiosInstance, AxiosPromise } from "axios";
-import * as uuid from "uuid/v4";
-import { ApiActions } from "~/services/api/api-actions";
-import * as QueryString from "query-string";
+import { camelCase, isPlainObject, isArray, snakeCase } from "lodash";
+import { AxiosInstance, AxiosPromise, AxiosRequestConfig } from "axios";
+import uuid from "uuid/v4";
+import { ApiActions } from "services/api/api-actions";
+import QueryString from "query-string";
+import { Session } from "models/session";
interface Errors {
status: number;
constructor(serverApi: AxiosInstance, resourceType: string, actions: ApiActions, readOnlyFields: string[] = []) {
this.serverApi = serverApi;
- this.resourceType = '/' + resourceType;
+ this.resourceType = resourceType;
this.actions = actions;
this.readOnlyFields = readOnlyFields;
}
static mapResponseKeys = (response: { data: any }) =>
- CommonService.mapKeys(_.camelCase)(response.data)
+ CommonService.mapKeys(camelCase)(response.data)
static mapKeys = (mapFn: (key: string) => string) =>
(value: any): any => {
switch (true) {
- case _.isPlainObject(value):
+ case isPlainObject(value):
return Object
.keys(value)
.map(key => [key, mapFn(key)])
...newValue,
[newKey]: (key === 'items') ? CommonService.mapKeys(mapFn)(value[key]) : value[key]
}), {});
- case _.isArray(value):
+ case isArray(value):
return value.map(CommonService.mapKeys(mapFn));
default:
return value;
}
}
+ protected validateUuid(uuid: string) {
+ if (uuid === "") {
+ throw new Error('UUID cannot be empty string');
+ }
+ }
+
static defaultResponse<R>(promise: AxiosPromise<R>, actions: ApiActions, mapKeys = true, showErrors = true): Promise<R> {
const reqId = uuid();
actions.progressFn(reqId, true);
create(data?: Partial<T>, showErrors?: boolean) {
return CommonService.defaultResponse(
this.serverApi
- .post<T>(this.resourceType, data && CommonService.mapKeys(_.snakeCase)(data)),
+ .post<T>(`/${this.resourceType}`, data && CommonService.mapKeys(snakeCase)(data)),
this.actions,
true, // mapKeys
showErrors
}
delete(uuid: string): Promise<T> {
+ this.validateUuid(uuid);
return CommonService.defaultResponse(
this.serverApi
- .delete(this.resourceType + '/' + uuid),
+ .delete(`/${this.resourceType}/${uuid}`),
this.actions
);
}
- get(uuid: string, showErrors?: boolean) {
+ get(uuid: string, showErrors?: boolean, select?: string[], session?: Session) {
+ this.validateUuid(uuid);
+
+ const cfg: AxiosRequestConfig = {};
+ if (session) {
+ cfg.baseURL = session.baseUrl;
+ cfg.headers = { 'Authorization': 'Bearer ' + session.token };
+ }
+
return CommonService.defaultResponse(
this.serverApi
- .get<T>(this.resourceType + '/' + uuid),
+ .get<T>(`/${this.resourceType}/${uuid}`, session ? cfg : undefined),
this.actions,
true, // mapKeys
showErrors
);
}
- list(args: ListArguments = {}): Promise<ListResults<T>> {
- const { filters, order, ...other } = args;
+ list(args: ListArguments = {}, showErrors?: boolean): Promise<ListResults<T>> {
+ const { filters, select, ...other } = args;
const params = {
- ...CommonService.mapKeys(_.snakeCase)(other),
+ ...CommonService.mapKeys(snakeCase)(other),
filters: filters ? `[${filters}]` : undefined,
- order: order ? order : undefined
+ select: select
+ ? `[${select.map(snakeCase).map(s => `"${s}"`).join(', ')}]`
+ : undefined
};
if (QueryString.stringify(params).length <= 1500) {
return CommonService.defaultResponse(
- this.serverApi.get(this.resourceType, { params }),
- this.actions
+ this.serverApi.get(`/${this.resourceType}`, { params }),
+ this.actions,
+ showErrors
);
} else {
// Using the POST special case to avoid URI length 414 errors.
const formData = new FormData();
formData.append("_method", "GET");
- Object.keys(params).map(key => {
+ Object.keys(params).forEach(key => {
if (params[key] !== undefined) {
formData.append(key, params[key]);
}
});
return CommonService.defaultResponse(
- this.serverApi.post(this.resourceType, formData, {
+ this.serverApi.post(`/${this.resourceType}`, formData, {
params: {
_method: 'GET'
}
}),
- this.actions
+ this.actions,
+ showErrors
);
}
}
update(uuid: string, data: Partial<T>) {
+ this.validateUuid(uuid);
return CommonService.defaultResponse(
this.serverApi
- .put<T>(this.resourceType + '/' + uuid, data && CommonService.mapKeys(_.snakeCase)(data)),
+ .put<T>(`/${this.resourceType}/${uuid}`, data && CommonService.mapKeys(snakeCase)(data)),
this.actions
);
}