UNPKG

medicaid

Version:

Software Development Kit (SDK) to interact with the data.gov Medicaid API

193 lines (180 loc) 7.64 kB
import {getItems, postItem} from './httpMethods.js'; async function getDatastoreImport(distributionId){ const distributionColumns = await getItems(`datastore/imports/${distributionId}`); if (distributionColumns === undefined){ throw new Error("An error occurred in retrieving the distribution information. Please check the provided Id.") } return distributionColumns; } //datastore: query async function postDatastoreQueryDistributionId(distributionId, queryParams = {columnName: "", columnValue: "", operator: "=", limit: 0}){ let headers = {'Content-Type': 'application/json'} if (queryParams.limit > 10000){queryParams.limit = 10000} let requestBody = { "conditions": [ { "resource": "t", "property": queryParams.columnName, "value": queryParams.columnValue, "operator": queryParams.operator } ], "limit": queryParams.limit } let response = await postItem(`datastore/query/${distributionId}`, requestBody, headers); if (response === undefined){ throw new Error("An error occurred in the distribution post query.") } return response["results"]; } async function postDatastoreQueryDatasetId(datasetId, queryParams = {columnName: "", columnValue: "", operator: "=", limit: 0}){ let headers = {'Content-Type': 'application/json'} if (queryParams.limit > 10000){queryParams.limit = 10000} let requestBody = { "conditions": [ { "resource": "t", "property": queryParams.columnName, "value": queryParams.columnValue, "operator": queryParams.operator } ], "limit": queryParams.limit } let response = await postItem(`datastore/query/${datasetId}/0`, requestBody, headers); if (response === undefined){ throw new Error("An error occurred in the dataset post query. ") } return response["results"]; } async function getDatastoreQueryDistributionId(distributionId, limit = null, offset = 0){ if (limit !== null) { return await datastoreQueryWithLimit(distributionId, limit, offset) } return await datastoreQueryNoLimit(distributionId, offset); } async function getDatastoreQueryDatasetId(datasetId, limit = null, offset = 0) { if (limit !== null) { return await datastoreQueryWithLimit(`${datasetId}/0`, limit, offset) } return await datastoreQueryNoLimit(`${datasetId}/0`, offset); } async function datastoreQueryWithLimit(schemaId, limit, offset) { //executes get request for datastore queries given a limit const fetchPromises = []; if (limit === 0) { return []; // Return an empty array if the limit is 0 } const maxLimit = 10000; for (let currentOffset = offset; limit > 0; currentOffset += maxLimit) { const currentLimit = Math.min(limit, maxLimit); fetchPromises.push(getItems(`datastore/query/${schemaId}?limit=${currentLimit}&offset=${currentOffset}`)); limit -= currentLimit; } const responses = await Promise.all(fetchPromises); const result = responses.flatMap(response => response["results"]); if (result === undefined){ throw new Error("The datastore could not be queried.") } return result; } async function datastoreQueryNoLimit(schemaId, offset){ //executes get request for datastore query, getting all possible elements let condition = true let allData = []; let responses = []; while (condition){ const promises = []; for (let i = 0; i < 3; i++) { promises.push(getItems(`datastore/query/${schemaId}?limit=10000&offset=${offset}`)); offset += 10000; } responses = await Promise.all(promises); allData.push(...responses.flatMap(response => response["results"])) if (responses.some(response => response["results"].length !== 10000)){ condition = false; } } return allData; } async function getAllDataFromDistribution(distributionId){ return await getDatastoreQueryDistributionId(distributionId); } async function getAllDataFromDataset(datasetId) { return await getDatastoreQueryDatasetId(datasetId); } async function getDownloadByDistributionId(distributionId, downloadParams = {convertBlob: true, filename: "filename.ext", textContent: "Download File"}){ const response = await getItems(`datastore/query/${distributionId}/download?format=csv`, {blobFlag: true, cacheFlag: true, baseUrl: 'https://data.medicaid.gov/api/1/'}); if (downloadParams.convertBlob){ return createDownloadLink(response, downloadParams.filename, downloadParams.textContent); } return response; } async function getDownloadByDatasetId(datasetId, downloadParams = {convertBlob: true, filename: "filename.ext", textContent: "Download File"}){ const response = await getItems(`datastore/query/${datasetId}/0/download?format=csv`, {blobFlag: true, cacheFlag: true, baseUrl: 'https://data.medicaid.gov/api/1/'}); if (downloadParams.convertBlob){ return createDownloadLink(response, downloadParams.filename, downloadParams.textContent); } return response; } async function postDatastoreQueryDownload(distributionId, queryParams = {columnName: "", columnValue: "", operator: "=", limit: 0}, downloadParams = {convertBlob: true, filename: "filename.ext", textContent: "Download File"}){ let headers = {'Content-Type': 'text/csv'} if (queryParams.limit > 10000){queryParams.limit = 10000} let requestBody = { "conditions": [ { "resource": "t", "property": queryParams.columnName, "value": queryParams.columnValue, "operator": queryParams.operator } ], "limit": queryParams.limit, "resources": [ { "id": `${distributionId}`, "alias": "t" } ], "format": "csv" } let response = await postItem('datastore/query/download', requestBody, headers, {blobFlag: true, cacheFlag: true, baseUrl: 'https://data.medicaid.gov/api/1/'}); if (response === undefined){ throw new Error("An error occurred in the distribution post query.") } if (downloadParams.convertBlob){ return createDownloadLink(response, downloadParams.filename, downloadParams.textContent); } return response; } function createDownloadLink(blob, filename, textContent) { try { const url = URL.createObjectURL(blob); const link = document.createElement('a'); link.href = url; link.download = filename; link.textContent = textContent; const cleanupLink = () => { URL.revokeObjectURL(url); link.remove(); }; link.addEventListener('click', () => { setTimeout(cleanupLink, 1000); }); return link; } catch (error) { console.log('The downloadable link could not be created.'); } } export{ getDatastoreImport, postDatastoreQueryDownload, postDatastoreQueryDistributionId, postDatastoreQueryDatasetId, getDatastoreQueryDistributionId, getDatastoreQueryDatasetId, getAllDataFromDataset, getAllDataFromDistribution, getDownloadByDistributionId, getDownloadByDatasetId }