import * as UrlTemplate from 'url-template'; import * as QueryString from 'query-string'; import { axiosBackend } from 'utilities/requestUtils'; import Accession from 'model/accession/Accession'; import AccessionDetails from 'model/accession/AccessionDetails'; import AccessionFilter from 'model/accession/AccessionFilter'; import AccessionMapInfo from 'model/accession/AccessionMapInfo'; import FilteredPage, { IPageRequest } from 'model/FilteredPage'; import {AccessionRef} from 'model/accession/AccessionRef'; import AccessionAuditLog from 'model/accession/AccessionAuditLog'; import AccessionSuggestionPage from 'model/accession/AccessionSuggestionPage'; const URL_GET_BY_DOI = `/api/v1/acn/{doi}`; // UrlTemplate doesn't like the / in DOI const URL_GET_BY_UUID = UrlTemplate.parse(`/api/v1/acn/{uuid}`); const URL_GEO_JSON = `/api/v1/acn/geoJson`; const URL_UUID_FROM_IDS = `/api/v1/acn/id`; const URL_LIST_BY_UUID = `/api/v1/acn/for-uuid`; const URL_GET_ACCESSION_AUDIT_LOG_BY_DOI = `/api/v1/acn/auditlog/{doi}`; // UrlTemplate doesn't like the / in DOI const URL_GET_ACCESSION_AUDIT_LOG_BY_UUID = UrlTemplate.parse(`/api/v1/acn/auditlog/{uuid}`); const URL_GET_DETAILS_BY_DOI = `/api/v1/acn/details/{doi}`; // UrlTemplate doesn't like the / in DOI const URL_GET_DETAILS_BY_UUID = UrlTemplate.parse(`/api/v1/acn/details/{uuid}`); const URL_TO_UUID = `/api/v1/acn/toUUID`; const URL_LIST = `/api/v1/acn/list`; const URL_LIST_SUGGESTIONS = `/api/v1/acn/list-suggestions`; const URL_LIST_OVERVIEW = `/api/v1/acn/overview`; const URL_MAPINFO = `/api/v1/acn/mapinfo`; /* * Defined in Swagger as 'accession' */ class AccessionService { /** * getByDoi at /api/v1/acn/10.{dummy}/**} * * @param authToken Authorization token */ public static getByDoi(doi: string, xhrConfig?): Promise { const apiUrl = URL_GET_BY_DOI.replace(/{doi}/, doi); // console.log(`Fetching from ${apiUrl}`); const content = { /* No content in request body */ }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'GET', ...content, }).then(({ data }) => data as Accession); } /** * getByUuid at /api/v1/acn/{uuid} * * @param authToken Authorization token * @param uuid UUID */ public static getByUuid(uuid: string, xhrConfig?): Promise { const apiUrl = URL_GET_BY_UUID.expand({ uuid }); // console.log(`Fetching from ${apiUrl}`); const content = { /* No content in request body */ }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'GET', ...content, }).then(({ data }) => data as Accession); } /** * geoJson at /api/v1/acn/explore/geoJson * * @param filter filter * @param limit limit */ public static geoJson(filter: AccessionFilter, limit?: number, xhrConfig?): Promise { const qs = QueryString.stringify({ limit: limit || undefined, }, {}); const apiUrl = URL_GEO_JSON + (qs ? `?${qs}` : ''); // console.log(`Fetching from ${apiUrl}`); const content = { data: filter }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', ...content, }).then(({ data }) => data as any); } /** * uuidFromIds at /api/v1/acn/id * * @param ids ids */ public static uuidFromIds(ids: number[], xhrConfig?): Promise { const apiUrl = URL_UUID_FROM_IDS; // console.log(`Fetching from ${apiUrl}`); const content = { data: ids }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', ...content, }).then(({ data }) => data as string[]); } /** * getAccessionAuditLogByDoi at /api/v1/acn/auditlog/{doi} * * @param doi doi */ public static getAccessionAuditLogByDoi(doi: string, xhrConfig?): Promise { const apiUrl = URL_GET_ACCESSION_AUDIT_LOG_BY_DOI.replace(/{doi}/, doi); // console.log(`Fetching from ${apiUrl}`); const content = { /* No content in request body */ }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'GET', ...content, }).then(({ data }) => data as AccessionAuditLog); } /** * getAccessionAuditLogByUUID at /api/v1/acn/auditlog/{uuid} * * @param uuid uuid */ public static getAccessionAuditLogByUUID(uuid: string, xhrConfig?): Promise { const apiUrl = URL_GET_ACCESSION_AUDIT_LOG_BY_UUID.expand({uuid}); // console.log(`Fetching from ${apiUrl}`); const content = { /* No content in request body */ }; return axiosBackend({ ...xhrConfig, url: apiUrl, method: 'GET', ...content, }).then(({ data }) => data as AccessionAuditLog); } /** * getByDoi at /api/v1/acn/10.{dummy}/**} * * @param authToken Authorization token */ public static getDetailsByDoi(doi: string, xhrConfig?): Promise { const apiUrl = URL_GET_DETAILS_BY_DOI.replace(/{doi}/, doi); // console.log(`Fetching from ${apiUrl}`); const content = { /* No content in request body */ }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'GET', ...content, }).then(({ data }) => data as AccessionDetails); } /** * getByUuid at /api/v1/acn/{uuid} * * @param authToken Authorization token * @param uuid UUID */ public static getDetailsByUuid(uuid: string, xhrConfig?): Promise { const apiUrl = URL_GET_DETAILS_BY_UUID.expand({ uuid }); // console.log(`Fetching from ${apiUrl}`); const content = { /* No content in request body */ }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'GET', ...content, }).then(({ data }) => data as AccessionDetails); } public static toUUID(identifiers: AccessionRef[], xhrConfig?) { const apiUrl = URL_TO_UUID; const content = { data: identifiers }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', ...content, }).then(({ data }) => data as Map); } /** * list at /api/v1/acn/list * * @param authToken Authorization token * @param filter filter * @param d d * @param f f * @param l l * @param p p * @param s s */ public static list(filter: string | AccessionFilter, page: IPageRequest, xhrConfig?): Promise> { const qs = QueryString.stringify({ f: typeof filter === 'string' ? filter : undefined, p: page.page || undefined, l: page.size || 100, d: page && page.direction ? page.direction : Accession.DEFAULT_SORT.direction, s: page.properties || Accession.DEFAULT_SORT.property, }, {}); const apiUrl = URL_LIST + (qs ? `?${qs}` : ''); // console.log(`Fetching from ${apiUrl}`); const content = { data: typeof filter === 'string' ? null : { ...filter } }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', ...content, }).then(({ data }) => data as FilteredPage); } /** * listSuggestions at /api/v1/acn/list-suggestions * * @param filter filter * @param f f * @param page undefined * @param xhrConfig additional xhr config */ public static listSuggestions(filter: string | AccessionFilter, page: IPageRequest, xhrConfig?): Promise { const qs = QueryString.stringify({ f: typeof filter === 'string' ? filter : undefined, p: page.page || undefined, l: page.size || 100, d: page && page.direction ? page.direction : Accession.DEFAULT_SORT.direction, s: page.properties || Accession.DEFAULT_SORT.property, }, {}); const apiUrl = URL_LIST_SUGGESTIONS + (qs ? `?${qs}` : ''); // console.log(`Fetching from ${apiUrl}`); const content = { data: typeof filter === 'string' ? null : { ...filter } }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', ...content, }).then(({ data }) => data as AccessionSuggestionPage); } public static listAllByUuid(UUIDs: string[], xhrConfig?): Promise { const apiUrl = URL_LIST_BY_UUID; // console.log(`Fetching from ${apiUrl}`); const content = { data: UUIDs } || {}; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', ...content, }).then(({ data }) => data as Accession[]); } public static listOverview(filter: string | AccessionFilter, xhrConfig?) { const qs = QueryString.stringify({ f: typeof filter === 'string' ? filter : undefined, }, {}); const apiUrl = URL_LIST_OVERVIEW + (qs ? `?${qs}` : ''); const content = { data: typeof filter === 'string' ? null : { ...filter } }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', headers: {'Content-Type': 'application/json'}, ...content, }).then(({ data }) => data); } /** * get map information * * @param authToken Authorization token * @param filter filter or AccessionFilter */ public static mapInfo(filter: string | AccessionFilter, xhrConfig?): Promise { const qs = QueryString.stringify({ f: typeof filter === 'string' ? filter : undefined, }, {}); const apiUrl = URL_MAPINFO + (qs ? `?${qs}` : ''); const content = { data: typeof filter === 'string' ? null : { ...filter } }; return axiosBackend.request({ ...xhrConfig, url: apiUrl, method: 'POST', headers: {'Content-Type': 'application/json'}, ...content, }).then(({ data }) => data); } } export default AccessionService;