src/interceptors/remove-links-interceptor.ts   A
last analyzed

Complexity

Total Complexity 16
Complexity/F 5.33

Size

Lines of Code 61
Function Count 3

Duplication

Duplicated Lines 0
Ratio 0 %

Importance

Changes 0
Metric Value
wmc 16
eloc 34
mnd 13
bc 13
fnc 3
dl 0
loc 61
rs 10
bpm 4.3333
cpm 5.3333
noi 0
c 0
b 0
f 0

3 Functions

Rating   Name   Duplication   Size   Complexity  
A RemoveLinksInterceptor.errorHandler 0 6 1
C RemoveLinksInterceptor.responseHandler 0 23 9
B RemoveLinksInterceptor.removeLinks 0 18 6
1
import { AxiosResponse } from 'axios';
2
import { ResponseInterceptorInterface } from './response-interceptor';
3
import { BEditaClientResponse, JsonApiResourceObject } from '../bedita-api-client';
4
5
6
/**
7
 * Remove links attribute from JSON API response.
8
 */
9
export default class RemoveLinksInterceptor implements ResponseInterceptorInterface  {
10
11
    /**
12
     * Remove links from JSON API response.
13
     *
14
     * @param response The response.
15
     */
16
    public responseHandler(response: AxiosResponse): Promise<BEditaClientResponse<any> | AxiosResponse<any>> {
17
        if (!response.data) {
18
            return Promise.resolve(response);
19
        }
20
21
        delete response.data?.links;
22
        delete response.data?.meta?.schema;
23
        if (!response.data?.data || (!Array.isArray(response.data.data) && response.data.data.constructor !== Object)) {
24
            return Promise.resolve(response);
25
        }
26
27
        response.data.data = this.removeLinks(response.data.data);
28
        if (response.data?.included) {
29
            response.data.included = this.removeLinks(response.data.included);
30
        }
31
32
        return Promise.resolve(response);
33
    }
34
35
    /**
36
     * Remove links from JSON API resource object.
37
     *
38
     * @param data The resource object.
39
     */
40
    protected removeLinks(data: JsonApiResourceObject|JsonApiResourceObject[]): JsonApiResourceObject|JsonApiResourceObject[] {
41
        if (Array.isArray(data)) {
42
            return data.map((d) => this.removeLinks(d)) as JsonApiResourceObject[];
43
        }
44
45
        delete data?.links;
46
47
        Object.keys(data?.relationships || []).forEach((rel) => {
48
            delete data?.relationships[rel]?.links;
49
        });
50
51
        return data;
52
    }
53
54
    /**
55
     * @inheritdoc
56
     */
57
    public errorHandler(error: any): Promise<any> {
58
        return Promise.reject(error);
59
    }
60
}
61