All files / src/apps/concepts api.ts

15.38% Statements 2/13
0% Branches 0/25
0% Functions 0/9
15.38% Lines 2/13

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124        1x         1x                                                                                                                                                                                                                                    
import { authenticatedInstance } from "../../api";
import { BaseConcept, Mapping } from "./types";
import { buildPartialSearchQuery } from "../../utils";
 
const optionallyIncludeList = (key: string, value: string[]) =>
  // https://stackoverflow.com/a/40560953/6448384
  value.length > 0 && { [key]: value.join(",") };
 
// timestamp here is to disable caching. response occasionally excluded headers when caching was turned on
const api = {
  retrievePublicSources: (page: number = 1, limit: number = 10, q = "") =>
    authenticatedInstance.get("/sources/", {
      params: {
        page,
        limit,
        q: buildPartialSearchQuery(q),
        verbose: true,
        timestamp: new Date().getTime()
      }
    }),
  concepts: {
    create: (sourceUrl: string, data: BaseConcept) =>
      authenticatedInstance.post(`${sourceUrl}concepts/`, data),
    retrieve: (retrieveParams: {
      conceptsUrl?: string;
      page?: number;
      limit?: number;
      q?: string;
      sortDirection?: string;
      sortBy?: string;
      dataTypeFilters?: string[];
      classFilters?: string[];
      sourceFilters?: string[];
      includeRetired?: boolean;
      includeAdded?: boolean;
    }) => {
      const {
        conceptsUrl = "#",
        page = 1,
        limit = 10,
        q = "",
        sortDirection = "sortDesc",
        sortBy = "_score",
        dataTypeFilters = [] as string[],
        classFilters = [] as string[],
        sourceFilters = [] as string[],
        includeRetired = false,
        includeAdded = false
      } = retrieveParams;
      return authenticatedInstance.get(conceptsUrl, {
        params: {
          page,
          limit,
          q: buildPartialSearchQuery(q),
          [sortDirection]: sortBy,
          ...optionallyIncludeList("datatype", dataTypeFilters),
          ...optionallyIncludeList("conceptClass", classFilters),
          ...optionallyIncludeList("source", sourceFilters),
          timestamp: new Date().getTime(),
          includeRetired,
          includeAdded
        }
      });
    },
    retrieveActive: (retrieveActiveParams: {
      conceptsUrl?: string;
      page?: number;
      limit?: number;
      q?: string;
      sortDirection?: string;
      sortBy?: string;
      dataTypeFilters?: string[];
      classFilters?: string[];
      sourceFilters?: string[];
      includeRetired?: boolean;
    }) => {
      const {
        conceptsUrl = "#",
        page = 1,
        limit = 10,
        q = "",
        sortDirection = "sortDesc",
        sortBy = "_score",
        dataTypeFilters = [] as string[],
        classFilters = [] as string[],
        sourceFilters = [] as string[]
      } = retrieveActiveParams;
      return authenticatedInstance.get(conceptsUrl, {
        params: {
          page,
          limit,
          q: buildPartialSearchQuery(q),
          [sortDirection]: sortBy,
          ...optionallyIncludeList("datatype", dataTypeFilters),
          ...optionallyIncludeList("conceptClass", classFilters),
          ...optionallyIncludeList("source", sourceFilters),
          timestamp: new Date().getTime()
        }
      });
    }
  },
  concept: {
    retrieve: (conceptUrl: string) =>
      authenticatedInstance.get(conceptUrl, {
        params: {
          verbose: true,
          includeMappings: true
        }
      }),
    update: (conceptUrl: string, data: BaseConcept) =>
      authenticatedInstance.put(conceptUrl, data)
  },
  mappings: {
    create: (sourceUrl: string, data: Mapping) =>
      authenticatedInstance.post(`${sourceUrl}mappings/`, data)
  },
  mapping: {
    update: (mappingUrl: string, data: Mapping) =>
      authenticatedInstance.put(mappingUrl, data)
  }
};
 
export default api;