Pour tout problème contactez-nous par mail : support@froggit.fr | La FAQ :grey_question: | Rejoignez-nous sur le Chat :speech_balloon:

Skip to content
Snippets Groups Projects
index.jsx 13.4 KiB
Newer Older
  • Learn to ignore specific revisions
  • Philippe Coicadan's avatar
    Philippe Coicadan committed
    import { fetchUtils } from 'react-admin';
    import { stringify } from 'query-string';
    import {idFromURL, backEndURL} from '../utils'
    
    
    
    
    const apiUrl = backEndURL();
    
    const httpClient = (url, options = {}) => {
        options.credentials = 'include';
    
        if (sessionStorage.getItem('arolios_auth') ) {
            if (!options.headers) {
                options.headers = new Headers({ Accept: 'application/json' });
            }
            const { token } = JSON.parse(sessionStorage.getItem('arolios_auth'));
            options.headers.set('Authorization', `Bearer ${token}`);
        }
    
        return fetchUtils.fetchJson(url, options);
    };
    
     
    
    const CustomDataProvider = { 
        getList: (resource, params) => {
            const { page, perPage } = params.pagination || {};
            const { field, order } = params.sort || {};
            const filter = params.filter || {};
            const {prefix, suffix ,context, properties, i18n } = params.meta || {};
    
            const lang = localStorage.getItem ("arolios_requested_language") || sessionStorage.getItem ("arolios_default_language");
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
            let query ='';
            let querySep = '?';
            if (i18n !== false) {
                query += `${querySep}lang=${lang}`;
                querySep = '&';    
            }
            if (page >0 && perPage >0) {
                const offset=  (page-1)*perPage;
                //const limit =perPage-1;
                query += `${querySep}o=${offset}&l=${perPage}`;
                querySep = '&';    
            }
            if (field) {
    
                //eliminate field translation 
                const field_arr1 = field.split('.');
                const field_arr2 = field_arr1.map ( (item) => ( item.startsWith ('_t')) ? item.substring(2) :  item);
                const true_field = field_arr2.join('.');
                query +=`${querySep}s=${true_field}`;
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
                querySep = '&';
            }
            if (order) {
                query +=`${querySep}d=${order}`;
                querySep = '&';
            }
            if (Object.entries(filter).length > 0) {
                query +=`${querySep}f=${JSON.stringify(filter)}`;
                querySep = '&';
            }
            
            
            let url = `${apiUrl}/`;
           
            if (prefix) {
                url += `${prefix}/`
            } 
    
            url += `${resource}`;
            if (suffix) {
                url += `/${suffix}`;
    
            }
            if (context) {
                query += `${querySep}c=${context}`;
            }
            if (properties) {
                query += `${querySep}p=${properties}`;
            }
            
            if (query.length >0) {
                url += `${query}`;
            }
    
            if (resource === 'apps') {
                return httpClient(url).then(({ headers, json }) => ({
                    data: json["elements"].map(record => ( {id:record.name, ...record})),
                    total: json["total"],
                    
                }));
            } else if (resource === 'users') {
                return httpClient(url).then(({ headers, json }) => ({
                    data: json["elements"].map(record => ( {id:record.identifier, ...record})),
                    total: json["total"],
                    
                }));
            } else if (resource === 'languages') {
                return httpClient(url).then(({ headers, json }) => ({
                    data: json["elements"].map(record => ( {id:record.code, ...record})),
                    total: json["total"],
                    
                }));
            } else if (suffix === 'properties') {  //list properties
                return httpClient(url).then(({ headers, json }) => ({
    
                    data: json["elements"].map(record => ( {id:record.id_name, ...record})),
                    total: json["total"],
                    
                }));
            } else if (suffix === 'values') {  //list enum values
                return httpClient(url).then(({ headers, json }) => ({
    
                    data: json["elements"].map(record => ( {id:record.name, ...record})),
                    total: json["total"],
                    
                }));
            } else {
                return httpClient(url).then(({ headers, json }) => ({
    
                    data: json["elements"].map(record => ( {id:idFromURL(record.url), ...record})),
                    total: json["total"],
    
                }));
            }
            
        },
    
        getOne: (resource, params) => {
    
     
    
            const lang = localStorage.getItem ("arolios_requested_language") || sessionStorage.getItem ("arolios_default_language");
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
            let query = `?lang=${lang}`;
            const querySep = '&';
            const {prefix, suffix ,context } = params.meta || {};
            if (prefix === 'settings') {
    
                const modelLang = localStorage.getItem("arolios_requested_language") || sessionStorage.getItem ("arolios_default_language");
                return Promise.resolve({data: { id: params.id, requested_language: modelLang}});
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
            }
            let url = `${apiUrl}/`;
    
            if (prefix) {
                url += `${prefix}/`
            }
            url += `${resource}`;
            if (suffix) {
                url += `/${suffix}`;
    
            }
    
            url += `/${params.id}`;
            if (context) {
                query += `${querySep}c=${context}`;
            }
            
            if (query.length >0) {
                url += `${query}`;
            }
    
            if (resource === 'apps') {
                return httpClient(url).then(({ json }) => ({
                    data: { id: json['name'], ...json} 
                })
    
                );
            } else  if (resource === 'users') {
                return httpClient(url).then(({ json }) => ({
                    data: { id: json['identifier'], ...json} 
                })
    
                );
            } else {
                return httpClient(url).then(({ json }) => ({
                    data: json
                })
    
                );
            }
    
        },
    
        getMany: (resource, params) => {
            const {prefix, getmany_context } = params.meta || {};
            if (getmany_context === "values") {
                // query of enumeration value
                const ids = params.ids;
                return Promise.resolve ({ data: [ { id:ids[0] }]});
            } else if (getmany_context === "languages" ) {
                // query of language
                const ids = params.ids;
                const query = { code: ids[0] };
                const url = `${apiUrl}/${resource}?f=${JSON.stringify(query)}`;
    
                return httpClient(url).then(({ headers, json }) => ({
                    data: json["elements"].map(record => ( {id:record.code, ...record})),
                    total: json["total"],
                
                }));
            } else if (getmany_context === "appassocs" ) {
                // query of app assocations (apps, domains)
                const ids = params.ids;
                const instid =ids[0] ;
                if (resource === 'apps' || resource === 'domains') {
                    return Promise.resolve ( { data: [ { id: instid }]});
    
                } else if (resource === 'users') {
                    const ids = params.ids;
                    const instid = ids[0];
                    // variant of getOne
    
                    const url = `${apiUrl}/${resource}/${instid}`;
    
                    return httpClient(url).then(({ json }) => ({
                        data: [ { id: json['identifier'], ...json} ],
                        total: 1
                    }));
    
                } else    { // no case implemented
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
    
                    let url = `${apiUrl}/`;
                    if (prefix) {
                        url += `${prefix}/`
                    }
                    url += `${resource}/${instid}`;
                    return httpClient(url).then(({ headers, json }) => ({
    
                        data: json.map(record => ( {id:idFromURL(record.url), ...record})),
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
                        total: 1,
                    }));
                }
    
            } else if (getmany_context === "references" ) {
                const ids = params.ids;
                const instid =ids[0] ;
                // variant of getOne
    
                const lang = localStorage.getItem ("arolios_requested_language") || sessionStorage.getItem ("arolios_default_language");
    
                let query = `?lang=${lang}`;
                const querySep = '&';
                const {prefix, suffix ,context } = params.meta || {};
                
                let url = `${apiUrl}/`;
    
                // suffix of the list query is the resource
    
                if (suffix) {
                    url += `${suffix}`;
                }
        
                url += `/${instid}`;
                if (context) {
                    query += `${querySep}c=${context}`;
                }
                
                if (query.length >0) {
                    url += `${query}`;
                }
        
                
                return httpClient(url).then(({ json }) => ({
                        data: [ json ],
                        total: 1
                    }));
                 
            } else  { // no case implemented
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
                const query = {
                    filter: JSON.stringify({ ids: params.ids }),
                };
                const url = `${apiUrl}/${resource}?${stringify(query)}`;
                return httpClient(url).then(({ json }) => ({ data: json }));
            }
        },
    
        getManyReference: (resource, params) => {  // no case implemented
            const { page, perPage } = params.pagination;
            const { field, order } = params.sort;
            const query = {
                sort: JSON.stringify([field, order]),
                range: JSON.stringify([(page - 1) * perPage, page * perPage - 1]),
                filter: JSON.stringify({
                    ...params.filter,
                    [params.target]: params.id,
                }),
            };
            const url = `${apiUrl}/${resource}?${stringify(query)}`;
    
            return httpClient(url).then(({ headers, json }) => ({
                data: json,
                total: parseInt(headers.get('content-range').split('/').pop(), 10),
            }));
        },
    
        create: (resource, params) =>
    
            {
                const {prefix, suffix ,context } = params.meta || {};
                let url = `${apiUrl}/`;
                if (prefix) {
                    url += `${prefix}/`
                }
                url += `${resource}`;
                if (suffix) {
                    url += `/${suffix}`;
                }
    
        
                return httpClient(url, {
                    method: 'POST',
                    body: JSON.stringify(params.data)
                })
                    .then(({ json }) => ({
    
                        data: (json) ? { ...params.data, id: idFromURL(json.url) } : { ...params.data, id: 0 }
    
                    }))
                    ;
          //  }
            },
    
        update: (resource, params) =>
            {
    
                let query = '';
                let querySep = '?';
        
                const {prefix, suffix ,context } = params.meta || {};
                if (prefix === 'settings') {
    
                    localStorage.setItem("arolios_requested_language",  params.data.requested_language);          
    
                    const url = `${apiUrl}/domains?lang=${params.data.requested_language}`
    
                    httpClient(url).then(({ headers, json }) => {
                        if (json["total"] === 1) {
                            sessionStorage.setItem('arolios_model_default_domain', JSON.stringify({ name: json["elements"][0]['name'], _tname: json["elements"][0]['_tname'] }));
                        } else {
                            sessionStorage.removeItem('arolios_model_default_domain');
                        };
                        
                    });
                            
    
    Philippe Coicadan's avatar
    Philippe Coicadan committed
                    return Promise.resolve({data: params.data});
                }
                let url = `${apiUrl}/`;
                if (prefix) {
                    url += `${prefix}/`
                }
                url += `${resource}`;
                if (suffix) {
                    url += `/${suffix}`;
                }
    
                url += `/${params.id}`;
                if (context) {
                    query += `${querySep}c=${context}`;
                }
                
                if (query.length >0) {
                    url += `${query}`;
                }
    
        
                return httpClient(url, {
                        method: 'PATCH',
                        body: JSON.stringify(Object.keys(params.data)
                            .filter((key) => (key !== 'id'))
                            .reduce ( (obj, key) => { return Object.assign(obj, { [key]: params.data[key]});
                                                    }, {}) 
                                            ), }
                        )
                        .then(({ json }) => ({
    
                            data: (json) ? { ...params.data, id: idFromURL(json.url) } : params.data
        
                        }))
                ;
                
            },
    
        updateMany: (resource, params) => { //no case implemented
            const query = {
                filter: JSON.stringify({ id: params.ids}),
            };
            return httpClient(`${apiUrl}/${resource}?${stringify(query)}`, {
                method: 'PUT',
                body: JSON.stringify(params.data),
            }).then(({ json }) => ({ data: json }));
        },
    
        delete: (resource, params) =>
            {
    
        
                const {prefix, suffix , instance } = params.meta || {};
                let url = `${apiUrl}/`;
    
                if (prefix) {
                    url += `${prefix}/`
                }
                url += `${resource}`;
                if (suffix) {
                    url += `/${suffix}`;
                }
    
                if (instance !== false) {
                    url += `/${params.id}`;
                }
        
                return httpClient(url, {
                        method: 'DELETE', }
                        )
                        .then(({json}) => ({ data: json }) );
                
            },
    
        deleteMany: (resource, params) => { // no case implemented
            const query = {
                filter: JSON.stringify({ id: params.ids}),
            };
            return httpClient(`${apiUrl}/${resource}?${stringify(query)}`, {
                method: 'DELETE',
                body: JSON.stringify(params.data),
            }).then(({ json }) => ({ data: json }));
        },
    
    
       
    } ;
    
    export default CustomDataProvider;