diff --git a/pom.xml b/pom.xml index 73f7522fc..d017d20fd 100644 --- a/pom.xml +++ b/pom.xml @@ -5,7 +5,7 @@ org.mskcc.cbio.oncokb public-website - 3.14.10 + 3.14.11 jar OncoKB Public Website diff --git a/screenshot-test/__baseline_snapshots__/Company User Details Page-snap.png b/screenshot-test/__baseline_snapshots__/Company User Details Page-snap.png index dfb0cf93a..410f33f8c 100644 Binary files a/screenshot-test/__baseline_snapshots__/Company User Details Page-snap.png and b/screenshot-test/__baseline_snapshots__/Company User Details Page-snap.png differ diff --git a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Detail-snap.png b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Detail-snap.png index 66cc2e79b..54ff90a71 100644 Binary files a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Detail-snap.png and b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Detail-snap.png differ diff --git a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Overview-snap.png b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Overview-snap.png index 647d16160..037e99ab7 100644 Binary files a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Overview-snap.png and b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#Resource Overview-snap.png differ diff --git a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Detail-snap.png b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Detail-snap.png index 15c84b124..9f7cd131d 100644 Binary files a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Detail-snap.png and b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Detail-snap.png differ diff --git a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Overview-snap.png b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Overview-snap.png index 78e5db4ba..733da5ddc 100644 Binary files a/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Overview-snap.png and b/screenshot-test/__baseline_snapshots__/Usage Analysis Page#User Overview-snap.png differ diff --git a/screenshot-test/__baseline_snapshots__/User Details Page-snap.png b/screenshot-test/__baseline_snapshots__/User Details Page-snap.png index 0310f589c..33a252c7a 100644 Binary files a/screenshot-test/__baseline_snapshots__/User Details Page-snap.png and b/screenshot-test/__baseline_snapshots__/User Details Page-snap.png differ diff --git a/screenshot-test/data/api-usage-resources-example.json b/screenshot-test/data/api-usage-resources-example.json index e4f9851a9..402baa752 100644 --- a/screenshot-test/data/api-usage-resources-example.json +++ b/screenshot-test/data/api-usage-resources-example.json @@ -1,104 +1,166 @@ { - "month" : { - "2020-06" : { - "example@email.com" : 5.0, - "example2@email.com" : 1.0, - "example3@email.com" : 1.0, - "example4@email.com" : 3.0, - "example5@email.com" : 1.0, - "example6@email.com" : 1.0 - }, - "2020-05" : { - "example7@email.com" : 2.0, - "example5@email.com" : 1.0 - }, - "2020-12" : { - "example8@email.com" : 1.0, - "example9@email.com" : 1.0, - "example10@email.com" : 1.0, - "example11@email.com" : 2.0 - }, - "2021-01" : { - "example12@email.com" : 2.0, - "example13@email.com" : 1.0, - "example14@email.com" : 1.0, - "example15@email.com" : 1.0 - }, - "2020-10" : { - "example16@email.com" : 1.0, - "example17@email.com" : 4.0, - "example18@email.com" : 2.0, - "example19@email.com" : 1.0, - "example20@email.com" : 4.0, - "example21@email.com" : 1.0 - }, - "2020-09" : { - "example22@email.com" : 1.0, - "example23@email.com" : 3.0, - "example7@email.com" : 1.0, - "example24@email.com" : 1.0, - "example25@email.com" : 1.0, - "example26@email.com" : 8.0, - "example27@email.com" : 1.0 - }, - "2020-08" : { - "example28@email.com" : 1.0, - "example29@email.com" : 1.0, - "example12@email.com" : 3.0, - "example24@email.com" : 1.0, - "example30@email.com" : 3.0, - "example31@email.com" : 1.0 - }, - "2020-07" : { - "example22@email.com" : 1.0, - "example32@email.com" : 3.0, - "example33@email.com" : 1.0, - "example34@email.com" : 2.0, - "example35@email.com" : 1.0, - "example36@email.com" : 2.0, - "example37@email.com" : 1.0, - "example31@email.com" : 1.0, - "example38@email.com" : 1.0 - } - }, - "year" : { - "example16@email.com" : 1, - "example17@email.com" : 4, - "example2@email.com" : 1, - "example28@email.com" : 1, - "example8@email.com" : 1, - "example3@email.com" : 1, - "example13@email.com" : 1, - "example9@email.com" : 1, - "example20@email.com" : 4, - "example21@email.com" : 1, - "example4@email.com" : 3, - "example38@email.com" : 1, - "example27@email.com" : 1, - "example32@email.com" : 3, - "example@email.com" : 5, - "example33@email.com" : 1, - "example7@email.com" : 3, - "example24@email.com" : 2, - "example25@email.com" : 1, - "example15@email.com" : 1, - "example26@email.com" : 8, - "example5@email.com" : 2, - "example6@email.com" : 1, - "example22@email.com" : 2, - "example18@email.com" : 2, - "example23@email.com" : 3, - "example34@email.com" : 2, - "example14@email.com" : 1, - "example37@email.com" : 1, - "example31@email.com" : 2, - "example29@email.com" : 1, - "example12@email.com" : 5, - "example35@email.com" : 1, - "example19@email.com" : 1, - "example10@email.com" : 1, - "example11@email.com" : 2, - "example36@email.com" : 2, - "example30@email.com" : 3 - } - } \ No newline at end of file + "year": { + "2020": { "0doej@FakeCo.com": 712, "1smithj@DemoLLC.com": 1019 }, + "2019": { "0doej@FakeCo.com": 697, "1smithj@DemoLLC.com": 680 }, + "2018": { "0doej@FakeCo.com": 542, "1smithj@DemoLLC.com": 1076 }, + "2017": { "0doej@FakeCo.com": 318, "1smithj@DemoLLC.com": 714 } + }, + "month": { + "2020-02": { "0doej@FakeCo.com": 30, "1smithj@DemoLLC.com": 75 }, + "2020-03": { "0doej@FakeCo.com": 84 }, + "2020-04": { "0doej@FakeCo.com": 34, "1smithj@DemoLLC.com": 96 }, + "2020-06": { "0doej@FakeCo.com": 86, "1smithj@DemoLLC.com": 46 }, + "2020-07": { "0doej@FakeCo.com": 139, "1smithj@DemoLLC.com": 148 }, + "2020-09": { "0doej@FakeCo.com": 74, "1smithj@DemoLLC.com": 58 }, + "2020-10": { "0doej@FakeCo.com": 68, "1smithj@DemoLLC.com": 165 }, + "2020-11": { "0doej@FakeCo.com": 197, "1smithj@DemoLLC.com": 104 }, + "2019-01": { "0doej@FakeCo.com": 21 }, + "2019-02": { "0doej@FakeCo.com": 39 }, + "2019-04": { "0doej@FakeCo.com": 136, "1smithj@DemoLLC.com": 66 }, + "2019-06": { "0doej@FakeCo.com": 4, "1smithj@DemoLLC.com": 88 }, + "2019-07": { "0doej@FakeCo.com": 84 }, + "2019-09": { "0doej@FakeCo.com": 81 }, + "2019-10": { "0doej@FakeCo.com": 81, "1smithj@DemoLLC.com": 132 }, + "2019-11": { "0doej@FakeCo.com": 135 }, + "2019-12": { "0doej@FakeCo.com": 116, "1smithj@DemoLLC.com": 131 }, + "2018-01": { "0doej@FakeCo.com": 161, "1smithj@DemoLLC.com": 15 }, + "2018-05": { "0doej@FakeCo.com": 89 }, + "2018-06": { "0doej@FakeCo.com": 145, "1smithj@DemoLLC.com": 260 }, + "2018-10": { "0doej@FakeCo.com": 147, "1smithj@DemoLLC.com": 19 }, + "2017-01": { "0doej@FakeCo.com": 54, "1smithj@DemoLLC.com": 210 }, + "2017-02": { "0doej@FakeCo.com": 25 }, + "2017-05": { "0doej@FakeCo.com": 138 }, + "2017-06": { "0doej@FakeCo.com": 46, "1smithj@DemoLLC.com": 181 }, + "2017-07": { "0doej@FakeCo.com": 45, "1smithj@DemoLLC.com": 68 }, + "2017-09": { "0doej@FakeCo.com": 10, "1smithj@DemoLLC.com": 35 }, + "2020-01": { "1smithj@DemoLLC.com": 115 }, + "2020-05": { "1smithj@DemoLLC.com": 121 }, + "2020-08": { "1smithj@DemoLLC.com": 91 }, + "2019-03": { "1smithj@DemoLLC.com": 88 }, + "2019-05": { "1smithj@DemoLLC.com": 26 }, + "2019-08": { "1smithj@DemoLLC.com": 149 }, + "2018-02": { "1smithj@DemoLLC.com": 11 }, + "2018-03": { "1smithj@DemoLLC.com": 60 }, + "2018-04": { "1smithj@DemoLLC.com": 183 }, + "2018-07": { "1smithj@DemoLLC.com": 67 }, + "2018-08": { "1smithj@DemoLLC.com": 13 }, + "2018-09": { "1smithj@DemoLLC.com": 226 }, + "2018-11": { "1smithj@DemoLLC.com": 124 }, + "2018-12": { "1smithj@DemoLLC.com": 98 }, + "2017-03": { "1smithj@DemoLLC.com": 37 }, + "2017-04": { "1smithj@DemoLLC.com": 67 }, + "2017-08": { "1smithj@DemoLLC.com": 81 }, + "2017-11": { "1smithj@DemoLLC.com": 35 } + }, + "day": { + "2020-02-04": { "0doej@FakeCo.com": 30 }, + "2020-03-01": { "0doej@FakeCo.com": 26 }, + "2020-03-04": { "0doej@FakeCo.com": 33 }, + "2020-03-05": { "0doej@FakeCo.com": 25 }, + "2020-04-26": { "0doej@FakeCo.com": 34 }, + "2020-06-19": { "0doej@FakeCo.com": 86 }, + "2020-07-09": { "0doej@FakeCo.com": 64 }, + "2020-07-26": { "0doej@FakeCo.com": 75 }, + "2020-09-09": { "0doej@FakeCo.com": 74 }, + "2020-10-05": { "0doej@FakeCo.com": 10 }, + "2020-10-18": { "0doej@FakeCo.com": 6 }, + "2020-10-21": { "0doej@FakeCo.com": 52 }, + "2020-11-03": { "0doej@FakeCo.com": 73 }, + "2020-11-16": { "0doej@FakeCo.com": 91 }, + "2020-11-24": { "0doej@FakeCo.com": 33 }, + "2019-01-27": { "0doej@FakeCo.com": 21 }, + "2019-02-19": { "0doej@FakeCo.com": 39 }, + "2019-04-09": { "0doej@FakeCo.com": 71 }, + "2019-04-30": { "0doej@FakeCo.com": 65 }, + "2019-06-23": { "0doej@FakeCo.com": 4 }, + "2019-07-05": { "0doej@FakeCo.com": 84 }, + "2019-09-07": { "0doej@FakeCo.com": 56 }, + "2019-09-13": { "0doej@FakeCo.com": 25 }, + "2019-10-12": { "0doej@FakeCo.com": 81 }, + "2019-11-01": { "0doej@FakeCo.com": 1 }, + "2019-11-17": { "0doej@FakeCo.com": 72 }, + "2019-11-29": { "0doej@FakeCo.com": 62 }, + "2019-12-07": { "0doej@FakeCo.com": 23, "1smithj@DemoLLC.com": 56 }, + "2019-12-23": { "0doej@FakeCo.com": 15 }, + "2019-12-27": { "0doej@FakeCo.com": 78 }, + "2018-01-05": { "0doej@FakeCo.com": 50 }, + "2018-01-11": { "0doej@FakeCo.com": 63 }, + "2018-01-19": { "0doej@FakeCo.com": 48 }, + "2018-05-31": { "0doej@FakeCo.com": 89 }, + "2018-06-24": { "0doej@FakeCo.com": 45 }, + "2018-06-27": { "0doej@FakeCo.com": 100 }, + "2018-10-22": { "0doej@FakeCo.com": 48 }, + "2018-10-29": { "0doej@FakeCo.com": 99 }, + "2017-01-29": { "0doej@FakeCo.com": 54 }, + "2017-02-17": { "0doej@FakeCo.com": 25 }, + "2017-05-06": { "0doej@FakeCo.com": 55 }, + "2017-05-08": { "0doej@FakeCo.com": 68 }, + "2017-05-15": { "0doej@FakeCo.com": 15 }, + "2017-06-18": { "0doej@FakeCo.com": 46 }, + "2017-07-08": { "0doej@FakeCo.com": 32 }, + "2017-07-09": { "0doej@FakeCo.com": 13, "1smithj@DemoLLC.com": 68 }, + "2017-09-24": { "0doej@FakeCo.com": 10 }, + "2020-01-13": { "1smithj@DemoLLC.com": 86 }, + "2020-01-14": { "1smithj@DemoLLC.com": 29 }, + "2020-02-18": { "1smithj@DemoLLC.com": 75 }, + "2020-04-02": { "1smithj@DemoLLC.com": 96 }, + "2020-05-06": { "1smithj@DemoLLC.com": 89 }, + "2020-05-07": { "1smithj@DemoLLC.com": 32 }, + "2020-06-10": { "1smithj@DemoLLC.com": 45 }, + "2020-06-27": { "1smithj@DemoLLC.com": 1 }, + "2020-07-20": { "1smithj@DemoLLC.com": 81 }, + "2020-07-27": { "1smithj@DemoLLC.com": 67 }, + "2020-08-06": { "1smithj@DemoLLC.com": 91 }, + "2020-09-16": { "1smithj@DemoLLC.com": 58 }, + "2020-10-11": { "1smithj@DemoLLC.com": 32 }, + "2020-10-26": { "1smithj@DemoLLC.com": 80 }, + "2020-10-31": { "1smithj@DemoLLC.com": 53 }, + "2020-11-13": { "1smithj@DemoLLC.com": 17 }, + "2020-11-19": { "1smithj@DemoLLC.com": 4 }, + "2020-11-20": { "1smithj@DemoLLC.com": 83 }, + "2019-03-28": { "1smithj@DemoLLC.com": 88 }, + "2019-04-18": { "1smithj@DemoLLC.com": 66 }, + "2019-05-10": { "1smithj@DemoLLC.com": 26 }, + "2019-06-21": { "1smithj@DemoLLC.com": 88 }, + "2019-08-13": { "1smithj@DemoLLC.com": 58 }, + "2019-08-28": { "1smithj@DemoLLC.com": 91 }, + "2019-10-03": { "1smithj@DemoLLC.com": 88 }, + "2019-10-24": { "1smithj@DemoLLC.com": 44 }, + "2019-12-02": { "1smithj@DemoLLC.com": 9 }, + "2019-12-08": { "1smithj@DemoLLC.com": 1 }, + "2019-12-11": { "1smithj@DemoLLC.com": 65 }, + "2018-01-03": { "1smithj@DemoLLC.com": 15 }, + "2018-02-02": { "1smithj@DemoLLC.com": 6 }, + "2018-02-20": { "1smithj@DemoLLC.com": 5 }, + "2018-03-09": { "1smithj@DemoLLC.com": 60 }, + "2018-04-08": { "1smithj@DemoLLC.com": 35 }, + "2018-04-09": { "1smithj@DemoLLC.com": 84 }, + "2018-04-27": { "1smithj@DemoLLC.com": 64 }, + "2018-06-01": { "1smithj@DemoLLC.com": 74 }, + "2018-06-16": { "1smithj@DemoLLC.com": 79 }, + "2018-06-19": { "1smithj@DemoLLC.com": 75 }, + "2018-06-23": { "1smithj@DemoLLC.com": 32 }, + "2018-07-26": { "1smithj@DemoLLC.com": 67 }, + "2018-08-31": { "1smithj@DemoLLC.com": 13 }, + "2018-09-08": { "1smithj@DemoLLC.com": 13 }, + "2018-09-11": { "1smithj@DemoLLC.com": 41 }, + "2018-09-12": { "1smithj@DemoLLC.com": 28 }, + "2018-09-13": { "1smithj@DemoLLC.com": 83 }, + "2018-09-18": { "1smithj@DemoLLC.com": 61 }, + "2018-10-03": { "1smithj@DemoLLC.com": 19 }, + "2018-11-01": { "1smithj@DemoLLC.com": 56 }, + "2018-11-17": { "1smithj@DemoLLC.com": 68 }, + "2018-12-28": { "1smithj@DemoLLC.com": 98 }, + "2017-01-01": { "1smithj@DemoLLC.com": 37 }, + "2017-01-20": { "1smithj@DemoLLC.com": 67 }, + "2017-01-22": { "1smithj@DemoLLC.com": 61 }, + "2017-01-27": { "1smithj@DemoLLC.com": 45 }, + "2017-03-03": { "1smithj@DemoLLC.com": 37 }, + "2017-04-19": { "1smithj@DemoLLC.com": 67 }, + "2017-06-13": { "1smithj@DemoLLC.com": 88 }, + "2017-06-28": { "1smithj@DemoLLC.com": 93 }, + "2017-08-06": { "1smithj@DemoLLC.com": 81 }, + "2017-09-01": { "1smithj@DemoLLC.com": 35 }, + "2017-11-13": { "1smithj@DemoLLC.com": 35 } + } +} diff --git a/screenshot-test/data/api-usage-summary-resources.json b/screenshot-test/data/api-usage-summary-resources.json index 96d4c9939..fe2699e8b 100644 --- a/screenshot-test/data/api-usage-summary-resources.json +++ b/screenshot-test/data/api-usage-summary-resources.json @@ -1,52 +1,1279 @@ { - "month" : { - "2020-06" : { - }, - "2020-05" : { - }, - "2020-04" : { - }, - "2020-03" : { - }, - "2020-02" : { - }, - "2020-12" : { - }, - "2020-11" : { - }, - "2021-01" : { - }, - "2020-10" : { - }, - "2020-09" : { - } - }, - "year" : { - "/api/v2/screenshot/resource1/" : 100, - "/api/v2/screenshot/resource2/" : 100, - "/api/v2/screenshot/resource3/" : 100, - "/api/v2/screenshot/resource4/" : 100, - "/api/v2/screenshot/resource5/" : 1000, - "/api/v2/screenshot/resource6/" : 100, - "/api/v2/screenshot/resource7/" : 10000, - "/api/v2/screenshot/resource8/" : 100, - "/api/v2/screenshot/resource9/" : 10, - "/api/v2/screenshot/resource10/" : 1000000, - "/api/v2/screenshot/resource11/" : 1000, - "/api/v2/screenshot/resource12/" : 1000, - "/api/v2/screenshot/resource13/" : 100, - "/api/v2/screenshot/resource14/" : 100, - "/api/v2/screenshot/resource15/" : 10000, - "/api/v2/screenshot/resource16/" : 100, - "/api/v2/screenshot/resource17/" : 10000, - "/api/v2/screenshot/resource18/" : 100, - "/api/v2/screenshot/resource19/" : 100, - "/api/v2/screenshot/resource20/" : 100, - "/api/v2/screenshot/resource21/" : 100, - "/api/v2/screenshot/resource22/" : 100, - "/api/v2/screenshot/resource23/" : 100, - "/api/v2/screenshot/resource24/" : 100, - "/api/v2/screenshot/resource25/" : 100, - "/api/v2/screenshot/resource26/" : 100 + "year": { + "2020": { + "/api/v1/annotate/structuralVariants": 1924, + "/api/private/search/typeahead": 1868, + "/api/private/utils/numbers/levels/": 1713, + "/api/v1/annotate/mutations/byProteinChange": 1731, + "/api/private/utils/numbers/main/": 1081, + "/api/v1/annotate/copyNumberAlterations": 1035 + }, + "2019": { + "/api/v1/annotate/copyNumberAlterations": 1516, + "/api/private/utils/numbers/levels/": 1742, + "/api/private/search/typeahead": 1607, + "/api/private/utils/numbers/main/": 1676, + "/api/v1/annotate/mutations/byProteinChange": 1377, + "/api/v1/annotate/structuralVariants": 800 + }, + "2018": { + "/api/v1/annotate/mutations/byProteinChange": 1618, + "/api/v1/annotate/structuralVariants": 1407, + "/api/v1/annotate/copyNumberAlterations": 1262, + "/api/private/utils/numbers/main/": 1703, + "/api/private/search/typeahead": 1361, + "/api/private/utils/numbers/levels/": 1184 + }, + "2017": { + "/api/v1/annotate/structuralVariants": 1461, + "/api/v1/annotate/copyNumberAlterations": 1356, + "/api/v1/annotate/mutations/byProteinChange": 1032, + "/api/private/utils/numbers/main/": 982, + "/api/private/utils/numbers/levels/": 1450, + "/api/private/search/typeahead": 1437 + } + }, + "month": { + "2020-01": { + "/api/v1/annotate/structuralVariants": 265, + "/api/private/search/typeahead": 230, + "/api/private/utils/numbers/levels/": 21, + "/api/v1/annotate/mutations/byProteinChange": 115 + }, + "2020-02": { + "/api/v1/annotate/mutations/byProteinChange": 105, + "/api/private/utils/numbers/levels/": 185, + "/api/v1/annotate/structuralVariants": 103, + "/api/private/search/typeahead": 111, + "/api/v1/annotate/copyNumberAlterations": 15 + }, + "2020-03": { + "/api/v1/annotate/mutations/byProteinChange": 84, + "/api/v1/annotate/structuralVariants": 256, + "/api/private/utils/numbers/main/": 92, + "/api/private/search/typeahead": 134, + "/api/v1/annotate/copyNumberAlterations": 88, + "/api/private/utils/numbers/levels/": 98 + }, + "2020-04": { + "/api/private/utils/numbers/main/": 119, + "/api/private/search/typeahead": 133, + "/api/private/utils/numbers/levels/": 95, + "/api/v1/annotate/copyNumberAlterations": 254, + "/api/v1/annotate/mutations/byProteinChange": 130, + "/api/v1/annotate/structuralVariants": 253 + }, + "2020-05": { + "/api/private/search/typeahead": 247, + "/api/v1/annotate/copyNumberAlterations": 211, + "/api/private/utils/numbers/main/": 108, + "/api/v1/annotate/mutations/byProteinChange": 121, + "/api/v1/annotate/structuralVariants": 14, + "/api/private/utils/numbers/levels/": 103 + }, + "2020-06": { + "/api/private/search/typeahead": 178, + "/api/private/utils/numbers/main/": 252, + "/api/v1/annotate/copyNumberAlterations": 22, + "/api/v1/annotate/mutations/byProteinChange": 132, + "/api/v1/annotate/structuralVariants": 105, + "/api/private/utils/numbers/levels/": 62 + }, + "2020-07": { + "/api/v1/annotate/copyNumberAlterations": 220, + "/api/v1/annotate/mutations/byProteinChange": 287, + "/api/private/search/typeahead": 90, + "/api/private/utils/numbers/main/": 82 + }, + "2020-08": { + "/api/private/search/typeahead": 140, + "/api/private/utils/numbers/main/": 137, + "/api/private/utils/numbers/levels/": 88, + "/api/v1/annotate/mutations/byProteinChange": 91, + "/api/v1/annotate/structuralVariants": 148 + }, + "2020-09": { + "/api/v1/annotate/mutations/byProteinChange": 132, + "/api/v1/annotate/structuralVariants": 41, + "/api/private/search/typeahead": 253, + "/api/private/utils/numbers/levels/": 225, + "/api/private/utils/numbers/main/": 66, + "/api/v1/annotate/copyNumberAlterations": 52 + }, + "2020-10": { + "/api/v1/annotate/structuralVariants": 263, + "/api/v1/annotate/mutations/byProteinChange": 233, + "/api/private/utils/numbers/main/": 148, + "/api/private/utils/numbers/levels/": 173, + "/api/private/search/typeahead": 1, + "/api/v1/annotate/copyNumberAlterations": 116 + }, + "2020-11": { + "/api/private/utils/numbers/levels/": 493, + "/api/v1/annotate/mutations/byProteinChange": 301, + "/api/private/search/typeahead": 202, + "/api/v1/annotate/copyNumberAlterations": 29, + "/api/v1/annotate/structuralVariants": 96 + }, + "2020-12": { + "/api/v1/annotate/structuralVariants": 380, + "/api/private/utils/numbers/main/": 77, + "/api/private/utils/numbers/levels/": 170, + "/api/private/search/typeahead": 149, + "/api/v1/annotate/copyNumberAlterations": 28 + }, + "2019-01": { + "/api/v1/annotate/copyNumberAlterations": 177, + "/api/private/utils/numbers/levels/": 64, + "/api/private/search/typeahead": 152, + "/api/private/utils/numbers/main/": 255, + "/api/v1/annotate/mutations/byProteinChange": 21, + "/api/v1/annotate/structuralVariants": 51 + }, + "2019-02": { + "/api/v1/annotate/structuralVariants": 224, + "/api/private/utils/numbers/levels/": 7, + "/api/v1/annotate/mutations/byProteinChange": 39, + "/api/private/utils/numbers/main/": 110, + "/api/v1/annotate/copyNumberAlterations": 71, + "/api/private/search/typeahead": 142 + }, + "2019-03": { + "/api/private/utils/numbers/main/": 175, + "/api/v1/annotate/copyNumberAlterations": 181, + "/api/v1/annotate/structuralVariants": 125, + "/api/private/search/typeahead": 351, + "/api/private/utils/numbers/levels/": 187, + "/api/v1/annotate/mutations/byProteinChange": 88 + }, + "2019-04": { + "/api/private/search/typeahead": 194, + "/api/private/utils/numbers/levels/": 141, + "/api/private/utils/numbers/main/": 246, + "/api/v1/annotate/mutations/byProteinChange": 202, + "/api/v1/annotate/copyNumberAlterations": 27, + "/api/v1/annotate/structuralVariants": 25 + }, + "2019-05": { + "/api/private/utils/numbers/main/": 133, + "/api/private/utils/numbers/levels/": 258, + "/api/v1/annotate/copyNumberAlterations": 338, + "/api/v1/annotate/mutations/byProteinChange": 26, + "/api/private/search/typeahead": 88 + }, + "2019-06": { + "/api/v1/annotate/copyNumberAlterations": 94, + "/api/v1/annotate/mutations/byProteinChange": 92, + "/api/v1/annotate/structuralVariants": 91, + "/api/private/search/typeahead": 148, + "/api/private/utils/numbers/levels/": 98 + }, + "2019-07": { + "/api/v1/annotate/mutations/byProteinChange": 84, + "/api/private/search/typeahead": 86, + "/api/v1/annotate/copyNumberAlterations": 72, + "/api/private/utils/numbers/levels/": 191 + }, + "2019-08": { + "/api/v1/annotate/copyNumberAlterations": 133, + "/api/private/search/typeahead": 46, + "/api/private/utils/numbers/levels/": 222, + "/api/v1/annotate/structuralVariants": 47, + "/api/private/utils/numbers/main/": 273, + "/api/v1/annotate/mutations/byProteinChange": 149 + }, + "2019-09": { + "/api/v1/annotate/mutations/byProteinChange": 81, + "/api/v1/annotate/copyNumberAlterations": 17, + "/api/private/utils/numbers/levels/": 62 + }, + "2019-10": { + "/api/private/search/typeahead": 38, + "/api/private/utils/numbers/levels/": 248, + "/api/v1/annotate/mutations/byProteinChange": 213, + "/api/v1/annotate/copyNumberAlterations": 80 + }, + "2019-11": { + "/api/v1/annotate/mutations/byProteinChange": 135, + "/api/private/utils/numbers/levels/": 123, + "/api/private/search/typeahead": 359, + "/api/v1/annotate/structuralVariants": 173, + "/api/v1/annotate/copyNumberAlterations": 12, + "/api/private/utils/numbers/main/": 201 + }, + "2019-12": { + "/api/private/utils/numbers/main/": 283, + "/api/v1/annotate/mutations/byProteinChange": 247, + "/api/v1/annotate/structuralVariants": 64, + "/api/private/utils/numbers/levels/": 141, + "/api/v1/annotate/copyNumberAlterations": 314, + "/api/private/search/typeahead": 3 + }, + "2018-01": { + "/api/v1/annotate/mutations/byProteinChange": 176, + "/api/v1/annotate/structuralVariants": 251, + "/api/v1/annotate/copyNumberAlterations": 395, + "/api/private/utils/numbers/main/": 201, + "/api/private/utils/numbers/levels/": 110 + }, + "2018-02": { + "/api/v1/annotate/structuralVariants": 100, + "/api/private/search/typeahead": 226, + "/api/private/utils/numbers/main/": 201, + "/api/private/utils/numbers/levels/": 27, + "/api/v1/annotate/mutations/byProteinChange": 11 + }, + "2018-03": { + "/api/v1/annotate/structuralVariants": 58, + "/api/private/utils/numbers/levels/": 271, + "/api/private/utils/numbers/main/": 268, + "/api/private/search/typeahead": 164, + "/api/v1/annotate/mutations/byProteinChange": 60, + "/api/v1/annotate/copyNumberAlterations": 33 + }, + "2018-04": { + "/api/v1/annotate/structuralVariants": 103, + "/api/v1/annotate/copyNumberAlterations": 187, + "/api/private/utils/numbers/main/": 109, + "/api/private/utils/numbers/levels/": 69, + "/api/v1/annotate/mutations/byProteinChange": 183 + }, + "2018-05": { + "/api/v1/annotate/copyNumberAlterations": 98, + "/api/v1/annotate/structuralVariants": 16, + "/api/private/search/typeahead": 70, + "/api/v1/annotate/mutations/byProteinChange": 89, + "/api/private/utils/numbers/main/": 60, + "/api/private/utils/numbers/levels/": 64 + }, + "2018-06": { + "/api/private/utils/numbers/levels/": 169, + "/api/private/search/typeahead": 159, + "/api/v1/annotate/mutations/byProteinChange": 405, + "/api/v1/annotate/structuralVariants": 125, + "/api/private/utils/numbers/main/": 74, + "/api/v1/annotate/copyNumberAlterations": 64 + }, + "2018-07": { + "/api/private/utils/numbers/main/": 299, + "/api/v1/annotate/structuralVariants": 201, + "/api/private/search/typeahead": 99, + "/api/private/utils/numbers/levels/": 197, + "/api/v1/annotate/mutations/byProteinChange": 67 + }, + "2018-08": { + "/api/private/utils/numbers/levels/": 65, + "/api/v1/annotate/copyNumberAlterations": 42, + "/api/private/search/typeahead": 55, + "/api/private/utils/numbers/main/": 89, + "/api/v1/annotate/structuralVariants": 60, + "/api/v1/annotate/mutations/byProteinChange": 13 + }, + "2018-09": { + "/api/v1/annotate/copyNumberAlterations": 98, + "/api/private/utils/numbers/main/": 141, + "/api/v1/annotate/structuralVariants": 87, + "/api/private/search/typeahead": 124, + "/api/v1/annotate/mutations/byProteinChange": 226, + "/api/private/utils/numbers/levels/": 93 + }, + "2018-10": { + "/api/v1/annotate/structuralVariants": 232, + "/api/private/search/typeahead": 136, + "/api/private/utils/numbers/main/": 53, + "/api/v1/annotate/mutations/byProteinChange": 166, + "/api/v1/annotate/copyNumberAlterations": 139 + }, + "2018-11": { + "/api/private/utils/numbers/levels/": 95, + "/api/private/utils/numbers/main/": 95, + "/api/v1/annotate/structuralVariants": 2, + "/api/v1/annotate/copyNumberAlterations": 125, + "/api/private/search/typeahead": 159, + "/api/v1/annotate/mutations/byProteinChange": 124 + }, + "2018-12": { + "/api/private/utils/numbers/levels/": 24, + "/api/v1/annotate/copyNumberAlterations": 81, + "/api/private/search/typeahead": 169, + "/api/v1/annotate/structuralVariants": 172, + "/api/private/utils/numbers/main/": 113, + "/api/v1/annotate/mutations/byProteinChange": 98 + }, + "2017-01": { + "/api/v1/annotate/structuralVariants": 128, + "/api/v1/annotate/copyNumberAlterations": 71, + "/api/v1/annotate/mutations/byProteinChange": 264, + "/api/private/utils/numbers/levels/": 107, + "/api/private/utils/numbers/main/": 75 + }, + "2017-02": { + "/api/private/utils/numbers/main/": 98, + "/api/v1/annotate/mutations/byProteinChange": 25, + "/api/private/utils/numbers/levels/": 21, + "/api/private/search/typeahead": 333, + "/api/v1/annotate/structuralVariants": 102, + "/api/v1/annotate/copyNumberAlterations": 51 + }, + "2017-03": { + "/api/v1/annotate/structuralVariants": 187, + "/api/v1/annotate/copyNumberAlterations": 159, + "/api/private/utils/numbers/levels/": 161, + "/api/v1/annotate/mutations/byProteinChange": 37, + "/api/private/search/typeahead": 23 + }, + "2017-04": { + "/api/v1/annotate/structuralVariants": 136, + "/api/private/utils/numbers/levels/": 13, + "/api/private/search/typeahead": 109, + "/api/private/utils/numbers/main/": 39, + "/api/v1/annotate/mutations/byProteinChange": 67, + "/api/v1/annotate/copyNumberAlterations": 50 + }, + "2017-05": { + "/api/private/utils/numbers/levels/": 266, + "/api/private/search/typeahead": 75, + "/api/v1/annotate/mutations/byProteinChange": 138, + "/api/v1/annotate/copyNumberAlterations": 134, + "/api/private/utils/numbers/main/": 11, + "/api/v1/annotate/structuralVariants": 74 + }, + "2017-06": { + "/api/v1/annotate/structuralVariants": 192, + "/api/private/search/typeahead": 203, + "/api/private/utils/numbers/main/": 218, + "/api/v1/annotate/mutations/byProteinChange": 227, + "/api/v1/annotate/copyNumberAlterations": 86, + "/api/private/utils/numbers/levels/": 23 + }, + "2017-07": { + "/api/private/utils/numbers/main/": 136, + "/api/v1/annotate/mutations/byProteinChange": 113, + "/api/v1/annotate/copyNumberAlterations": 142, + "/api/private/search/typeahead": 100, + "/api/private/utils/numbers/levels/": 90, + "/api/v1/annotate/structuralVariants": 171 + }, + "2017-08": { + "/api/v1/annotate/copyNumberAlterations": 75, + "/api/private/utils/numbers/main/": 7, + "/api/private/search/typeahead": 28, + "/api/v1/annotate/structuralVariants": 222, + "/api/private/utils/numbers/levels/": 64, + "/api/v1/annotate/mutations/byProteinChange": 81 + }, + "2017-09": { + "/api/private/search/typeahead": 197, + "/api/private/utils/numbers/levels/": 215, + "/api/private/utils/numbers/main/": 86, + "/api/v1/annotate/mutations/byProteinChange": 45, + "/api/v1/annotate/copyNumberAlterations": 93, + "/api/v1/annotate/structuralVariants": 50 + }, + "2017-10": { + "/api/v1/annotate/copyNumberAlterations": 79, + "/api/private/utils/numbers/levels/": 253, + "/api/private/search/typeahead": 169, + "/api/v1/annotate/structuralVariants": 113, + "/api/private/utils/numbers/main/": 78 + }, + "2017-11": { + "/api/v1/annotate/copyNumberAlterations": 290, + "/api/private/search/typeahead": 183, + "/api/private/utils/numbers/main/": 82, + "/api/v1/annotate/structuralVariants": 10, + "/api/private/utils/numbers/levels/": 52, + "/api/v1/annotate/mutations/byProteinChange": 35 + }, + "2017-12": { + "/api/private/utils/numbers/levels/": 185, + "/api/v1/annotate/copyNumberAlterations": 126, + "/api/v1/annotate/structuralVariants": 76, + "/api/private/utils/numbers/main/": 152, + "/api/private/search/typeahead": 17 + } + }, + "day": { + "2020-01-01": { "/api/v1/annotate/structuralVariants": 127 }, + "2020-01-07": { "/api/v1/annotate/structuralVariants": 74 }, + "2020-01-21": { "/api/private/search/typeahead": 38 }, + "2020-01-24": { "/api/v1/annotate/structuralVariants": 64 }, + "2020-01-29": { "/api/private/search/typeahead": 78 }, + "2020-01-30": { "/api/private/utils/numbers/levels/": 21 }, + "2020-01-31": { "/api/private/search/typeahead": 53 }, + "2020-02-04": { + "/api/v1/annotate/mutations/byProteinChange": 30, + "/api/v1/annotate/copyNumberAlterations": 15 + }, + "2020-02-06": { "/api/private/utils/numbers/levels/": 87 }, + "2020-02-15": { "/api/v1/annotate/structuralVariants": 23 }, + "2020-02-24": { "/api/private/search/typeahead": 80 }, + "2020-03-01": { "/api/v1/annotate/mutations/byProteinChange": 26 }, + "2020-03-04": { "/api/v1/annotate/mutations/byProteinChange": 33 }, + "2020-03-05": { "/api/v1/annotate/mutations/byProteinChange": 25 }, + "2020-03-08": { "/api/v1/annotate/structuralVariants": 81 }, + "2020-03-18": { + "/api/private/utils/numbers/main/": 17, + "/api/v1/annotate/copyNumberAlterations": 3 + }, + "2020-03-25": { "/api/v1/annotate/structuralVariants": 96 }, + "2020-03-30": { "/api/private/search/typeahead": 12 }, + "2020-04-01": { "/api/private/utils/numbers/main/": 96 }, + "2020-04-05": { + "/api/private/search/typeahead": 2, + "/api/private/utils/numbers/levels/": 65 + }, + "2020-04-06": { "/api/v1/annotate/copyNumberAlterations": 57 }, + "2020-04-19": { + "/api/private/utils/numbers/levels/": 30, + "/api/v1/annotate/copyNumberAlterations": 48 + }, + "2020-04-26": { + "/api/v1/annotate/mutations/byProteinChange": 34, + "/api/v1/annotate/copyNumberAlterations": 149 + }, + "2020-05-10": { "/api/private/search/typeahead": 84 }, + "2020-05-12": { "/api/v1/annotate/copyNumberAlterations": 90 }, + "2020-05-14": { "/api/v1/annotate/copyNumberAlterations": 51 }, + "2020-05-19": { "/api/private/search/typeahead": 104 }, + "2020-05-28": { "/api/private/search/typeahead": 59 }, + "2020-06-03": { "/api/private/search/typeahead": 85 }, + "2020-06-06": { "/api/private/utils/numbers/main/": 35 }, + "2020-06-16": { "/api/private/utils/numbers/main/": 54 }, + "2020-06-17": { "/api/private/search/typeahead": 93 }, + "2020-06-19": { + "/api/v1/annotate/copyNumberAlterations": 22, + "/api/v1/annotate/mutations/byProteinChange": 86, + "/api/private/utils/numbers/main/": 76 + }, + "2020-06-23": { "/api/v1/annotate/structuralVariants": 29 }, + "2020-07-03": { "/api/v1/annotate/copyNumberAlterations": 66 }, + "2020-07-05": { "/api/v1/annotate/copyNumberAlterations": 67 }, + "2020-07-09": { "/api/v1/annotate/mutations/byProteinChange": 64 }, + "2020-07-24": { "/api/private/search/typeahead": 24 }, + "2020-07-25": { "/api/v1/annotate/copyNumberAlterations": 87 }, + "2020-07-26": { + "/api/v1/annotate/mutations/byProteinChange": 75, + "/api/private/utils/numbers/main/": 23 + }, + "2020-08-01": { "/api/private/search/typeahead": 58 }, + "2020-08-15": { "/api/private/search/typeahead": 82 }, + "2020-09-09": { + "/api/v1/annotate/mutations/byProteinChange": 74, + "/api/private/utils/numbers/main/": 66 + }, + "2020-09-14": { "/api/v1/annotate/structuralVariants": 41 }, + "2020-09-21": { "/api/private/search/typeahead": 62 }, + "2020-10-02": { "/api/v1/annotate/structuralVariants": 79 }, + "2020-10-05": { + "/api/v1/annotate/structuralVariants": 88, + "/api/v1/annotate/mutations/byProteinChange": 10, + "/api/private/search/typeahead": 1 + }, + "2020-10-14": { "/api/v1/annotate/structuralVariants": 32 }, + "2020-10-18": { "/api/v1/annotate/mutations/byProteinChange": 6 }, + "2020-10-21": { + "/api/v1/annotate/mutations/byProteinChange": 52, + "/api/private/utils/numbers/main/": 77 + }, + "2020-10-23": { "/api/private/utils/numbers/levels/": 69 }, + "2020-10-28": { + "/api/v1/annotate/structuralVariants": 64, + "/api/private/utils/numbers/levels/": 72 + }, + "2020-11-02": { + "/api/private/utils/numbers/levels/": 129, + "/api/private/search/typeahead": 6 + }, + "2020-11-03": { "/api/v1/annotate/mutations/byProteinChange": 73 }, + "2020-11-07": { + "/api/private/search/typeahead": 66, + "/api/private/utils/numbers/levels/": 74 + }, + "2020-11-12": { "/api/private/utils/numbers/levels/": 10 }, + "2020-11-16": { "/api/v1/annotate/mutations/byProteinChange": 91 }, + "2020-11-19": { + "/api/private/search/typeahead": 90, + "/api/v1/annotate/mutations/byProteinChange": 4 + }, + "2020-11-24": { + "/api/private/utils/numbers/levels/": 34, + "/api/v1/annotate/mutations/byProteinChange": 33, + "/api/private/search/typeahead": 32 + }, + "2020-11-26": { "/api/v1/annotate/copyNumberAlterations": 29 }, + "2020-11-30": { "/api/private/utils/numbers/levels/": 130 }, + "2020-12-07": { "/api/v1/annotate/structuralVariants": 52 }, + "2020-12-08": { "/api/private/utils/numbers/main/": 19 }, + "2020-12-09": { + "/api/private/utils/numbers/levels/": 105, + "/api/v1/annotate/copyNumberAlterations": 28 + }, + "2020-12-18": { + "/api/private/utils/numbers/main/": 58, + "/api/v1/annotate/structuralVariants": 44 + }, + "2020-12-19": { "/api/v1/annotate/structuralVariants": 42 }, + "2020-12-26": { "/api/v1/annotate/structuralVariants": 64 }, + "2020-12-31": { "/api/private/search/typeahead": 79 }, + "2019-01-04": { "/api/v1/annotate/copyNumberAlterations": 77 }, + "2019-01-06": { "/api/private/utils/numbers/levels/": 26 }, + "2019-01-14": { "/api/private/search/typeahead": 49 }, + "2019-01-15": { + "/api/private/search/typeahead": 10, + "/api/private/utils/numbers/main/": 161 + }, + "2019-01-17": { "/api/private/utils/numbers/main/": 94 }, + "2019-01-27": { "/api/v1/annotate/mutations/byProteinChange": 21 }, + "2019-02-08": { "/api/v1/annotate/structuralVariants": 44 }, + "2019-02-11": { "/api/v1/annotate/structuralVariants": 132 }, + "2019-02-13": { "/api/private/utils/numbers/levels/": 7 }, + "2019-02-19": { "/api/v1/annotate/mutations/byProteinChange": 39 }, + "2019-02-23": { + "/api/private/utils/numbers/main/": 48, + "/api/private/search/typeahead": 69 + }, + "2019-03-01": { "/api/private/utils/numbers/main/": 86 }, + "2019-03-03": { "/api/v1/annotate/copyNumberAlterations": 86 }, + "2019-03-09": { "/api/private/utils/numbers/main/": 30 }, + "2019-03-10": { + "/api/v1/annotate/structuralVariants": 25, + "/api/private/search/typeahead": 93 + }, + "2019-03-12": { "/api/private/utils/numbers/main/": 36 }, + "2019-03-16": { "/api/private/search/typeahead": 85 }, + "2019-03-19": { "/api/private/utils/numbers/levels/": 93 }, + "2019-03-21": { + "/api/v1/annotate/structuralVariants": 100, + "/api/private/utils/numbers/levels/": 94 + }, + "2019-03-26": { "/api/private/search/typeahead": 19 }, + "2019-03-28": { + "/api/private/utils/numbers/main/": 6, + "/api/private/search/typeahead": 7, + "/api/v1/annotate/mutations/byProteinChange": 88 + }, + "2019-03-30": { "/api/v1/annotate/copyNumberAlterations": 9 }, + "2019-04-03": { + "/api/private/search/typeahead": 20, + "/api/private/utils/numbers/levels/": 60, + "/api/private/utils/numbers/main/": 30 + }, + "2019-04-04": { "/api/private/utils/numbers/main/": 4 }, + "2019-04-06": { "/api/private/utils/numbers/levels/": 20 }, + "2019-04-09": { "/api/v1/annotate/mutations/byProteinChange": 71 }, + "2019-04-11": { "/api/private/utils/numbers/main/": 5 }, + "2019-04-19": { "/api/private/search/typeahead": 3 }, + "2019-04-30": { "/api/v1/annotate/mutations/byProteinChange": 65 }, + "2019-05-01": { "/api/private/utils/numbers/main/": 3 }, + "2019-05-02": { "/api/private/utils/numbers/levels/": 74 }, + "2019-05-19": { + "/api/private/utils/numbers/main/": 47, + "/api/v1/annotate/copyNumberAlterations": 87, + "/api/private/utils/numbers/levels/": 184 + }, + "2019-05-21": { + "/api/v1/annotate/copyNumberAlterations": 92, + "/api/private/utils/numbers/main/": 83 + }, + "2019-05-22": { "/api/v1/annotate/copyNumberAlterations": 67 }, + "2019-06-22": { "/api/v1/annotate/copyNumberAlterations": 29 }, + "2019-06-23": { "/api/v1/annotate/mutations/byProteinChange": 4 }, + "2019-07-05": { "/api/v1/annotate/mutations/byProteinChange": 84 }, + "2019-07-08": { "/api/private/search/typeahead": 10 }, + "2019-07-13": { + "/api/private/search/typeahead": 76, + "/api/v1/annotate/copyNumberAlterations": 23 + }, + "2019-07-25": { "/api/private/utils/numbers/levels/": 101 }, + "2019-08-01": { "/api/v1/annotate/copyNumberAlterations": 14 }, + "2019-08-03": { + "/api/private/search/typeahead": 46, + "/api/private/utils/numbers/main/": 82 + }, + "2019-08-20": { "/api/private/utils/numbers/levels/": 10 }, + "2019-08-22": { + "/api/v1/annotate/structuralVariants": 37, + "/api/private/utils/numbers/main/": 88 + }, + "2019-09-07": { "/api/v1/annotate/mutations/byProteinChange": 56 }, + "2019-09-13": { "/api/v1/annotate/mutations/byProteinChange": 25 }, + "2019-09-28": { "/api/v1/annotate/copyNumberAlterations": 17 }, + "2019-10-07": { "/api/private/search/typeahead": 25 }, + "2019-10-12": { + "/api/private/utils/numbers/levels/": 54, + "/api/v1/annotate/mutations/byProteinChange": 81 + }, + "2019-10-26": { "/api/v1/annotate/copyNumberAlterations": 80 }, + "2019-11-01": { "/api/v1/annotate/mutations/byProteinChange": 1 }, + "2019-11-03": { "/api/private/utils/numbers/levels/": 77 }, + "2019-11-06": { + "/api/private/search/typeahead": 26, + "/api/v1/annotate/structuralVariants": 82 + }, + "2019-11-08": { "/api/v1/annotate/structuralVariants": 47 }, + "2019-11-14": { "/api/private/utils/numbers/levels/": 46 }, + "2019-11-17": { "/api/v1/annotate/mutations/byProteinChange": 72 }, + "2019-11-18": { "/api/private/search/typeahead": 76 }, + "2019-11-27": { "/api/v1/annotate/copyNumberAlterations": 12 }, + "2019-11-29": { "/api/v1/annotate/mutations/byProteinChange": 62 }, + "2019-11-30": { "/api/private/utils/numbers/main/": 73 }, + "2019-12-01": { "/api/private/utils/numbers/main/": 7 }, + "2019-12-07": { + "/api/v1/annotate/mutations/byProteinChange": 79, + "/api/v1/annotate/structuralVariants": 13 + }, + "2019-12-08": { + "/api/private/utils/numbers/levels/": 24, + "/api/v1/annotate/copyNumberAlterations": 98, + "/api/v1/annotate/mutations/byProteinChange": 1, + "/api/private/search/typeahead": 3 + }, + "2019-12-17": { "/api/private/utils/numbers/main/": 1 }, + "2019-12-19": { + "/api/v1/annotate/structuralVariants": 27, + "/api/v1/annotate/copyNumberAlterations": 39 + }, + "2019-12-20": { "/api/private/utils/numbers/main/": 22 }, + "2019-12-23": { + "/api/private/utils/numbers/levels/": 32, + "/api/v1/annotate/mutations/byProteinChange": 15 + }, + "2019-12-25": { + "/api/private/utils/numbers/levels/": 46, + "/api/private/utils/numbers/main/": 81 + }, + "2019-12-26": { + "/api/private/utils/numbers/levels/": 39, + "/api/private/utils/numbers/main/": 35 + }, + "2019-12-27": { + "/api/v1/annotate/copyNumberAlterations": 100, + "/api/v1/annotate/mutations/byProteinChange": 78 + }, + "2018-01-05": { + "/api/v1/annotate/mutations/byProteinChange": 50, + "/api/v1/annotate/structuralVariants": 28 + }, + "2018-01-09": { + "/api/v1/annotate/structuralVariants": 62, + "/api/private/utils/numbers/levels/": 79 + }, + "2018-01-11": { + "/api/v1/annotate/mutations/byProteinChange": 63, + "/api/v1/annotate/copyNumberAlterations": 94 + }, + "2018-01-15": { "/api/private/utils/numbers/main/": 63 }, + "2018-01-16": { + "/api/private/utils/numbers/main/": 88, + "/api/private/utils/numbers/levels/": 27 + }, + "2018-01-17": { "/api/v1/annotate/structuralVariants": 79 }, + "2018-01-19": { "/api/v1/annotate/mutations/byProteinChange": 48 }, + "2018-01-21": { "/api/v1/annotate/structuralVariants": 82 }, + "2018-01-23": { "/api/v1/annotate/copyNumberAlterations": 99 }, + "2018-01-24": { "/api/v1/annotate/copyNumberAlterations": 14 }, + "2018-01-26": { "/api/private/utils/numbers/main/": 9 }, + "2018-02-02": { + "/api/v1/annotate/structuralVariants": 80, + "/api/private/utils/numbers/main/": 22, + "/api/v1/annotate/mutations/byProteinChange": 6 + }, + "2018-02-05": { "/api/private/search/typeahead": 66 }, + "2018-02-07": { "/api/v1/annotate/structuralVariants": 3 }, + "2018-02-15": { "/api/private/utils/numbers/main/": 64 }, + "2018-02-22": { + "/api/v1/annotate/structuralVariants": 17, + "/api/private/utils/numbers/levels/": 23 + }, + "2018-02-27": { "/api/private/search/typeahead": 77 }, + "2018-03-05": { + "/api/v1/annotate/structuralVariants": 42, + "/api/private/utils/numbers/levels/": 76 + }, + "2018-03-15": { + "/api/private/utils/numbers/levels/": 49, + "/api/private/search/typeahead": 92 + }, + "2018-03-17": { "/api/private/utils/numbers/levels/": 67 }, + "2018-03-19": { + "/api/private/utils/numbers/main/": 74, + "/api/v1/annotate/structuralVariants": 16 + }, + "2018-03-26": { "/api/private/search/typeahead": 47 }, + "2018-03-29": { "/api/private/utils/numbers/main/": 80 }, + "2018-04-08": { + "/api/v1/annotate/structuralVariants": 37, + "/api/v1/annotate/mutations/byProteinChange": 35 + }, + "2018-04-10": { "/api/v1/annotate/copyNumberAlterations": 37 }, + "2018-04-15": { + "/api/private/utils/numbers/main/": 10, + "/api/v1/annotate/structuralVariants": 66 + }, + "2018-04-20": { + "/api/private/utils/numbers/levels/": 67, + "/api/v1/annotate/copyNumberAlterations": 36 + }, + "2018-04-24": { "/api/v1/annotate/copyNumberAlterations": 48 }, + "2018-05-03": { "/api/v1/annotate/copyNumberAlterations": 31 }, + "2018-05-08": { "/api/v1/annotate/structuralVariants": 6 }, + "2018-05-15": { "/api/v1/annotate/structuralVariants": 10 }, + "2018-05-29": { "/api/private/search/typeahead": 44 }, + "2018-05-31": { "/api/v1/annotate/mutations/byProteinChange": 89 }, + "2018-06-05": { "/api/private/utils/numbers/levels/": 73 }, + "2018-06-12": { + "/api/private/utils/numbers/levels/": 96, + "/api/v1/annotate/structuralVariants": 71 + }, + "2018-06-20": { "/api/private/search/typeahead": 49 }, + "2018-06-24": { "/api/v1/annotate/mutations/byProteinChange": 45 }, + "2018-06-27": { "/api/v1/annotate/mutations/byProteinChange": 100 }, + "2018-07-02": { "/api/private/utils/numbers/main/": 11 }, + "2018-07-17": { "/api/v1/annotate/structuralVariants": 22 }, + "2018-07-18": { "/api/private/search/typeahead": 49 }, + "2018-07-22": { "/api/private/search/typeahead": 39 }, + "2018-07-24": { + "/api/v1/annotate/structuralVariants": 58, + "/api/private/search/typeahead": 11 + }, + "2018-07-29": { "/api/private/utils/numbers/main/": 49 }, + "2018-08-17": { + "/api/private/utils/numbers/levels/": 65, + "/api/v1/annotate/copyNumberAlterations": 10 + }, + "2018-08-21": { "/api/v1/annotate/copyNumberAlterations": 32 }, + "2018-08-29": { "/api/private/search/typeahead": 3 }, + "2018-09-01": { + "/api/v1/annotate/copyNumberAlterations": 48, + "/api/private/utils/numbers/main/": 18 + }, + "2018-09-06": { "/api/private/utils/numbers/main/": 18 }, + "2018-09-28": { "/api/private/utils/numbers/main/": 78 }, + "2018-10-01": { + "/api/v1/annotate/structuralVariants": 45, + "/api/v1/annotate/copyNumberAlterations": 71 + }, + "2018-10-05": { + "/api/private/search/typeahead": 55, + "/api/v1/annotate/structuralVariants": 67 + }, + "2018-10-17": { "/api/private/search/typeahead": 81 }, + "2018-10-20": { "/api/v1/annotate/structuralVariants": 1 }, + "2018-10-22": { + "/api/private/utils/numbers/main/": 32, + "/api/v1/annotate/mutations/byProteinChange": 48 + }, + "2018-10-29": { "/api/v1/annotate/mutations/byProteinChange": 99 }, + "2018-11-05": { "/api/private/utils/numbers/levels/": 25 }, + "2018-11-11": { "/api/private/utils/numbers/main/": 95 }, + "2018-11-13": { "/api/v1/annotate/structuralVariants": 2 }, + "2018-11-18": { "/api/v1/annotate/copyNumberAlterations": 25 }, + "2018-11-26": { "/api/private/search/typeahead": 96 }, + "2018-12-02": { + "/api/private/utils/numbers/levels/": 10, + "/api/private/search/typeahead": 87, + "/api/v1/annotate/copyNumberAlterations": 62 + }, + "2018-12-14": { "/api/v1/annotate/copyNumberAlterations": 19 }, + "2018-12-18": { "/api/private/search/typeahead": 15 }, + "2018-12-22": { "/api/private/search/typeahead": 7 }, + "2018-12-24": { "/api/v1/annotate/structuralVariants": 96 }, + "2018-12-26": { "/api/private/utils/numbers/main/": 83 }, + "2017-01-05": { + "/api/v1/annotate/structuralVariants": 10, + "/api/private/utils/numbers/levels/": 21, + "/api/private/utils/numbers/main/": 33 + }, + "2017-01-08": { "/api/v1/annotate/copyNumberAlterations": 24 }, + "2017-01-10": { "/api/v1/annotate/copyNumberAlterations": 2 }, + "2017-01-29": { "/api/v1/annotate/mutations/byProteinChange": 54 }, + "2017-01-31": { "/api/v1/annotate/copyNumberAlterations": 45 }, + "2017-02-15": { "/api/private/utils/numbers/main/": 10 }, + "2017-02-17": { "/api/v1/annotate/mutations/byProteinChange": 25 }, + "2017-02-20": { "/api/private/utils/numbers/main/": 88 }, + "2017-02-21": { + "/api/private/utils/numbers/levels/": 21, + "/api/private/search/typeahead": 147 + }, + "2017-02-22": { + "/api/private/search/typeahead": 99, + "/api/v1/annotate/structuralVariants": 102 + }, + "2017-03-07": { + "/api/v1/annotate/structuralVariants": 14, + "/api/v1/annotate/copyNumberAlterations": 12, + "/api/private/search/typeahead": 23 + }, + "2017-03-20": { + "/api/v1/annotate/copyNumberAlterations": 37, + "/api/v1/annotate/structuralVariants": 67 + }, + "2017-03-28": { + "/api/v1/annotate/structuralVariants": 2, + "/api/v1/annotate/copyNumberAlterations": 99, + "/api/private/utils/numbers/levels/": 63 + }, + "2017-04-02": { "/api/v1/annotate/structuralVariants": 5 }, + "2017-04-07": { + "/api/private/utils/numbers/levels/": 13, + "/api/v1/annotate/structuralVariants": 83 + }, + "2017-04-09": { "/api/v1/annotate/structuralVariants": 16 }, + "2017-04-11": { + "/api/private/search/typeahead": 31, + "/api/v1/annotate/structuralVariants": 32, + "/api/private/utils/numbers/main/": 39 + }, + "2017-05-01": { "/api/private/utils/numbers/levels/": 42 }, + "2017-05-02": { "/api/private/search/typeahead": 7 }, + "2017-05-06": { "/api/v1/annotate/mutations/byProteinChange": 55 }, + "2017-05-08": { "/api/v1/annotate/mutations/byProteinChange": 68 }, + "2017-05-10": { "/api/private/utils/numbers/levels/": 57 }, + "2017-05-11": { "/api/v1/annotate/copyNumberAlterations": 85 }, + "2017-05-15": { + "/api/v1/annotate/mutations/byProteinChange": 15, + "/api/private/utils/numbers/levels/": 51 + }, + "2017-05-20": { + "/api/private/utils/numbers/levels/": 21, + "/api/v1/annotate/structuralVariants": 74 + }, + "2017-05-29": { "/api/private/utils/numbers/main/": 11 }, + "2017-06-06": { "/api/v1/annotate/structuralVariants": 62 }, + "2017-06-09": { "/api/private/search/typeahead": 44 }, + "2017-06-13": { + "/api/private/utils/numbers/main/": 44, + "/api/v1/annotate/mutations/byProteinChange": 88 + }, + "2017-06-18": { + "/api/v1/annotate/mutations/byProteinChange": 46, + "/api/private/utils/numbers/main/": 94, + "/api/private/search/typeahead": 60 + }, + "2017-06-20": { "/api/v1/annotate/structuralVariants": 65 }, + "2017-06-28": { + "/api/v1/annotate/structuralVariants": 28, + "/api/v1/annotate/mutations/byProteinChange": 93 + }, + "2017-07-02": { + "/api/private/utils/numbers/main/": 36, + "/api/private/utils/numbers/levels/": 41 + }, + "2017-07-08": { "/api/v1/annotate/mutations/byProteinChange": 32 }, + "2017-07-09": { + "/api/v1/annotate/mutations/byProteinChange": 81, + "/api/private/utils/numbers/levels/": 9 + }, + "2017-07-27": { + "/api/v1/annotate/copyNumberAlterations": 113, + "/api/private/utils/numbers/levels/": 1 + }, + "2017-07-30": { "/api/private/search/typeahead": 100 }, + "2017-08-03": { "/api/v1/annotate/copyNumberAlterations": 50 }, + "2017-08-04": { "/api/private/utils/numbers/main/": 7 }, + "2017-08-05": { "/api/private/search/typeahead": 28 }, + "2017-08-08": { "/api/v1/annotate/structuralVariants": 96 }, + "2017-09-19": { + "/api/private/search/typeahead": 80, + "/api/private/utils/numbers/levels/": 19 + }, + "2017-09-23": { + "/api/private/utils/numbers/levels/": 41, + "/api/private/search/typeahead": 64 + }, + "2017-09-24": { + "/api/private/utils/numbers/main/": 75, + "/api/private/utils/numbers/levels/": 62, + "/api/v1/annotate/mutations/byProteinChange": 10 + }, + "2017-09-28": { + "/api/v1/annotate/copyNumberAlterations": 3, + "/api/v1/annotate/structuralVariants": 50, + "/api/private/utils/numbers/main/": 9 + }, + "2017-10-01": { + "/api/v1/annotate/copyNumberAlterations": 79, + "/api/private/utils/numbers/levels/": 64 + }, + "2017-10-06": { "/api/private/search/typeahead": 68 }, + "2017-10-10": { "/api/private/utils/numbers/levels/": 34 }, + "2017-10-17": { + "/api/v1/annotate/structuralVariants": 35, + "/api/private/utils/numbers/levels/": 59 + }, + "2017-10-21": { "/api/private/utils/numbers/levels/": 96 }, + "2017-11-07": { "/api/v1/annotate/copyNumberAlterations": 133 }, + "2017-11-09": { "/api/private/search/typeahead": 83 }, + "2017-11-15": { + "/api/private/utils/numbers/main/": 42, + "/api/v1/annotate/copyNumberAlterations": 63 + }, + "2017-11-29": { "/api/v1/annotate/structuralVariants": 10 }, + "2017-12-06": { "/api/private/utils/numbers/levels/": 56 }, + "2017-12-22": { + "/api/v1/annotate/copyNumberAlterations": 6, + "/api/private/utils/numbers/main/": 98 + }, + "2020-01-02": { "/api/private/search/typeahead": 61 }, + "2020-01-13": { "/api/v1/annotate/mutations/byProteinChange": 86 }, + "2020-01-14": { "/api/v1/annotate/mutations/byProteinChange": 29 }, + "2020-02-07": { "/api/private/utils/numbers/levels/": 98 }, + "2020-02-14": { "/api/private/search/typeahead": 31 }, + "2020-02-18": { "/api/v1/annotate/mutations/byProteinChange": 75 }, + "2020-02-25": { "/api/v1/annotate/structuralVariants": 80 }, + "2020-03-07": { + "/api/private/utils/numbers/main/": 73, + "/api/private/search/typeahead": 45 + }, + "2020-03-11": { "/api/private/utils/numbers/main/": 1 }, + "2020-03-17": { + "/api/private/search/typeahead": 77, + "/api/v1/annotate/copyNumberAlterations": 85 + }, + "2020-03-22": { "/api/v1/annotate/structuralVariants": 79 }, + "2020-03-26": { "/api/private/utils/numbers/levels/": 98 }, + "2020-03-27": { "/api/private/utils/numbers/main/": 1 }, + "2020-04-02": { + "/api/v1/annotate/mutations/byProteinChange": 96, + "/api/v1/annotate/structuralVariants": 49 + }, + "2020-04-12": { "/api/private/search/typeahead": 84 }, + "2020-04-13": { "/api/private/search/typeahead": 47 }, + "2020-04-15": { "/api/private/utils/numbers/main/": 23 }, + "2020-04-17": { "/api/v1/annotate/structuralVariants": 42 }, + "2020-04-23": { "/api/v1/annotate/structuralVariants": 86 }, + "2020-04-30": { "/api/v1/annotate/structuralVariants": 76 }, + "2020-05-03": { + "/api/private/utils/numbers/main/": 88, + "/api/v1/annotate/copyNumberAlterations": 25 + }, + "2020-05-06": { + "/api/v1/annotate/mutations/byProteinChange": 89, + "/api/v1/annotate/structuralVariants": 14 + }, + "2020-05-07": { + "/api/private/utils/numbers/main/": 20, + "/api/v1/annotate/mutations/byProteinChange": 32 + }, + "2020-05-13": { "/api/private/utils/numbers/levels/": 26 }, + "2020-05-18": { "/api/v1/annotate/copyNumberAlterations": 45 }, + "2020-05-30": { "/api/private/utils/numbers/levels/": 77 }, + "2020-06-10": { "/api/v1/annotate/mutations/byProteinChange": 45 }, + "2020-06-25": { + "/api/v1/annotate/structuralVariants": 76, + "/api/private/utils/numbers/levels/": 62 + }, + "2020-06-27": { "/api/v1/annotate/mutations/byProteinChange": 1 }, + "2020-06-28": { "/api/private/utils/numbers/main/": 87 }, + "2020-07-19": { "/api/private/search/typeahead": 57 }, + "2020-07-20": { "/api/v1/annotate/mutations/byProteinChange": 81 }, + "2020-07-22": { "/api/private/search/typeahead": 9 }, + "2020-07-27": { + "/api/v1/annotate/mutations/byProteinChange": 67, + "/api/private/utils/numbers/main/": 17 + }, + "2020-07-28": { "/api/private/utils/numbers/main/": 42 }, + "2020-08-02": { "/api/private/utils/numbers/main/": 37 }, + "2020-08-04": { "/api/private/utils/numbers/levels/": 88 }, + "2020-08-06": { "/api/v1/annotate/mutations/byProteinChange": 91 }, + "2020-08-13": { "/api/v1/annotate/structuralVariants": 53 }, + "2020-08-20": { "/api/v1/annotate/structuralVariants": 95 }, + "2020-08-31": { "/api/private/utils/numbers/main/": 100 }, + "2020-09-04": { "/api/private/utils/numbers/levels/": 36 }, + "2020-09-10": { "/api/v1/annotate/copyNumberAlterations": 52 }, + "2020-09-16": { "/api/v1/annotate/mutations/byProteinChange": 58 }, + "2020-09-17": { "/api/private/utils/numbers/levels/": 46 }, + "2020-09-19": { "/api/private/search/typeahead": 94 }, + "2020-09-22": { "/api/private/utils/numbers/levels/": 95 }, + "2020-09-25": { "/api/private/search/typeahead": 97 }, + "2020-09-26": { "/api/private/utils/numbers/levels/": 48 }, + "2020-10-01": { "/api/private/utils/numbers/main/": 5 }, + "2020-10-03": { "/api/private/utils/numbers/main/": 66 }, + "2020-10-11": { "/api/v1/annotate/mutations/byProteinChange": 32 }, + "2020-10-12": { "/api/private/utils/numbers/levels/": 32 }, + "2020-10-17": { "/api/v1/annotate/copyNumberAlterations": 28 }, + "2020-10-26": { "/api/v1/annotate/mutations/byProteinChange": 80 }, + "2020-10-30": { "/api/v1/annotate/copyNumberAlterations": 88 }, + "2020-10-31": { "/api/v1/annotate/mutations/byProteinChange": 53 }, + "2020-11-13": { + "/api/v1/annotate/mutations/byProteinChange": 17, + "/api/private/utils/numbers/levels/": 24 + }, + "2020-11-20": { "/api/v1/annotate/mutations/byProteinChange": 83 }, + "2020-11-22": { "/api/private/utils/numbers/levels/": 87 }, + "2020-11-23": { "/api/v1/annotate/structuralVariants": 96 }, + "2020-11-27": { "/api/private/search/typeahead": 8 }, + "2020-11-28": { "/api/private/utils/numbers/levels/": 5 }, + "2020-12-10": { "/api/private/search/typeahead": 70 }, + "2020-12-16": { "/api/v1/annotate/structuralVariants": 96 }, + "2020-12-25": { + "/api/v1/annotate/structuralVariants": 82, + "/api/private/utils/numbers/levels/": 65 + }, + "2019-01-01": { + "/api/private/utils/numbers/levels/": 38, + "/api/v1/annotate/copyNumberAlterations": 100 + }, + "2019-01-03": { "/api/v1/annotate/structuralVariants": 51 }, + "2019-01-12": { "/api/private/search/typeahead": 93 }, + "2019-02-03": { "/api/private/utils/numbers/main/": 62 }, + "2019-02-10": { "/api/v1/annotate/structuralVariants": 48 }, + "2019-02-16": { "/api/v1/annotate/copyNumberAlterations": 39 }, + "2019-02-25": { "/api/v1/annotate/copyNumberAlterations": 32 }, + "2019-02-27": { "/api/private/search/typeahead": 73 }, + "2019-03-02": { "/api/private/search/typeahead": 55 }, + "2019-03-08": { "/api/v1/annotate/copyNumberAlterations": 86 }, + "2019-03-17": { "/api/private/search/typeahead": 92 }, + "2019-03-22": { "/api/private/utils/numbers/main/": 17 }, + "2019-04-15": { "/api/v1/annotate/copyNumberAlterations": 27 }, + "2019-04-18": { + "/api/private/utils/numbers/main/": 70, + "/api/v1/annotate/mutations/byProteinChange": 66 + }, + "2019-04-21": { + "/api/v1/annotate/structuralVariants": 25, + "/api/private/utils/numbers/main/": 69, + "/api/private/search/typeahead": 91 + }, + "2019-04-22": { "/api/private/utils/numbers/main/": 68 }, + "2019-04-26": { + "/api/private/search/typeahead": 80, + "/api/private/utils/numbers/levels/": 44 + }, + "2019-04-29": { "/api/private/utils/numbers/levels/": 17 }, + "2019-05-08": { "/api/v1/annotate/copyNumberAlterations": 15 }, + "2019-05-10": { "/api/v1/annotate/mutations/byProteinChange": 26 }, + "2019-05-14": { "/api/private/search/typeahead": 88 }, + "2019-05-26": { "/api/v1/annotate/copyNumberAlterations": 77 }, + "2019-06-07": { "/api/v1/annotate/copyNumberAlterations": 39 }, + "2019-06-08": { "/api/v1/annotate/structuralVariants": 91 }, + "2019-06-17": { "/api/private/search/typeahead": 50 }, + "2019-06-18": { "/api/private/search/typeahead": 97 }, + "2019-06-21": { "/api/v1/annotate/mutations/byProteinChange": 88 }, + "2019-06-25": { "/api/private/search/typeahead": 1 }, + "2019-06-26": { + "/api/v1/annotate/copyNumberAlterations": 26, + "/api/private/utils/numbers/levels/": 98 + }, + "2019-07-07": { "/api/v1/annotate/copyNumberAlterations": 49 }, + "2019-07-14": { "/api/private/utils/numbers/levels/": 90 }, + "2019-08-06": { "/api/private/utils/numbers/levels/": 48 }, + "2019-08-08": { "/api/private/utils/numbers/levels/": 99 }, + "2019-08-11": { "/api/v1/annotate/copyNumberAlterations": 87 }, + "2019-08-13": { "/api/v1/annotate/mutations/byProteinChange": 58 }, + "2019-08-24": { "/api/private/utils/numbers/levels/": 65 }, + "2019-08-26": { "/api/private/utils/numbers/main/": 25 }, + "2019-08-28": { "/api/v1/annotate/mutations/byProteinChange": 91 }, + "2019-08-30": { + "/api/private/utils/numbers/main/": 78, + "/api/v1/annotate/structuralVariants": 10, + "/api/v1/annotate/copyNumberAlterations": 32 + }, + "2019-09-12": { "/api/private/utils/numbers/levels/": 62 }, + "2019-10-03": { + "/api/v1/annotate/mutations/byProteinChange": 88, + "/api/private/search/typeahead": 13, + "/api/private/utils/numbers/levels/": 59 + }, + "2019-10-13": { "/api/private/utils/numbers/levels/": 72 }, + "2019-10-24": { + "/api/v1/annotate/mutations/byProteinChange": 44, + "/api/private/utils/numbers/levels/": 63 + }, + "2019-11-12": { "/api/private/utils/numbers/main/": 44 }, + "2019-11-13": { "/api/private/search/typeahead": 86 }, + "2019-11-15": { "/api/private/search/typeahead": 56 }, + "2019-11-20": { + "/api/private/search/typeahead": 115, + "/api/v1/annotate/structuralVariants": 44, + "/api/private/utils/numbers/main/": 84 + }, + "2019-12-02": { + "/api/private/utils/numbers/main/": 91, + "/api/v1/annotate/mutations/byProteinChange": 9 + }, + "2019-12-03": { "/api/v1/annotate/structuralVariants": 24 }, + "2019-12-11": { "/api/v1/annotate/mutations/byProteinChange": 65 }, + "2019-12-14": { "/api/v1/annotate/copyNumberAlterations": 77 }, + "2019-12-24": { "/api/private/utils/numbers/main/": 46 }, + "2018-01-03": { "/api/v1/annotate/mutations/byProteinChange": 15 }, + "2018-01-07": { "/api/v1/annotate/copyNumberAlterations": 91 }, + "2018-01-14": { "/api/private/utils/numbers/levels/": 4 }, + "2018-01-25": { "/api/v1/annotate/copyNumberAlterations": 97 }, + "2018-01-31": { "/api/private/utils/numbers/main/": 41 }, + "2018-02-04": { "/api/private/search/typeahead": 8 }, + "2018-02-06": { "/api/private/utils/numbers/main/": 33 }, + "2018-02-09": { "/api/private/utils/numbers/main/": 82 }, + "2018-02-19": { "/api/private/utils/numbers/levels/": 4 }, + "2018-02-20": { "/api/v1/annotate/mutations/byProteinChange": 5 }, + "2018-02-24": { "/api/private/search/typeahead": 75 }, + "2018-03-09": { "/api/v1/annotate/mutations/byProteinChange": 60 }, + "2018-03-11": { "/api/private/search/typeahead": 25 }, + "2018-03-13": { "/api/private/utils/numbers/main/": 23 }, + "2018-03-23": { "/api/v1/annotate/copyNumberAlterations": 33 }, + "2018-03-24": { "/api/private/utils/numbers/main/": 91 }, + "2018-03-27": { "/api/private/utils/numbers/levels/": 79 }, + "2018-04-06": { "/api/private/utils/numbers/main/": 94 }, + "2018-04-09": { + "/api/private/utils/numbers/levels/": 2, + "/api/v1/annotate/mutations/byProteinChange": 84 + }, + "2018-04-12": { "/api/v1/annotate/copyNumberAlterations": 24 }, + "2018-04-16": { "/api/v1/annotate/copyNumberAlterations": 42 }, + "2018-04-21": { "/api/private/utils/numbers/main/": 5 }, + "2018-04-27": { "/api/v1/annotate/mutations/byProteinChange": 64 }, + "2018-05-07": { "/api/private/utils/numbers/main/": 36 }, + "2018-05-16": { "/api/private/utils/numbers/main/": 24 }, + "2018-05-17": { "/api/private/search/typeahead": 26 }, + "2018-05-22": { "/api/private/utils/numbers/levels/": 64 }, + "2018-05-27": { "/api/v1/annotate/copyNumberAlterations": 67 }, + "2018-06-01": { + "/api/v1/annotate/mutations/byProteinChange": 74, + "/api/private/search/typeahead": 73, + "/api/v1/annotate/structuralVariants": 41, + "/api/private/utils/numbers/main/": 74 + }, + "2018-06-15": { "/api/private/search/typeahead": 37 }, + "2018-06-16": { "/api/v1/annotate/mutations/byProteinChange": 79 }, + "2018-06-17": { "/api/v1/annotate/structuralVariants": 13 }, + "2018-06-19": { "/api/v1/annotate/mutations/byProteinChange": 75 }, + "2018-06-23": { "/api/v1/annotate/mutations/byProteinChange": 32 }, + "2018-06-28": { "/api/v1/annotate/copyNumberAlterations": 64 }, + "2018-07-01": { "/api/private/utils/numbers/main/": 20 }, + "2018-07-07": { "/api/v1/annotate/structuralVariants": 79 }, + "2018-07-11": { "/api/private/utils/numbers/main/": 132 }, + "2018-07-23": { "/api/private/utils/numbers/levels/": 40 }, + "2018-07-26": { + "/api/v1/annotate/mutations/byProteinChange": 67, + "/api/v1/annotate/structuralVariants": 42 + }, + "2018-07-30": { "/api/private/utils/numbers/main/": 87 }, + "2018-07-31": { "/api/private/utils/numbers/levels/": 157 }, + "2018-08-01": { "/api/private/utils/numbers/main/": 89 }, + "2018-08-07": { "/api/private/search/typeahead": 52 }, + "2018-08-25": { "/api/v1/annotate/structuralVariants": 60 }, + "2018-08-31": { "/api/v1/annotate/mutations/byProteinChange": 13 }, + "2018-09-02": { "/api/v1/annotate/structuralVariants": 87 }, + "2018-09-03": { + "/api/private/search/typeahead": 76, + "/api/v1/annotate/copyNumberAlterations": 50 + }, + "2018-09-08": { + "/api/v1/annotate/mutations/byProteinChange": 13, + "/api/private/utils/numbers/levels/": 49 + }, + "2018-09-11": { "/api/v1/annotate/mutations/byProteinChange": 41 }, + "2018-09-12": { "/api/v1/annotate/mutations/byProteinChange": 28 }, + "2018-09-13": { "/api/v1/annotate/mutations/byProteinChange": 83 }, + "2018-09-16": { "/api/private/search/typeahead": 48 }, + "2018-09-18": { "/api/v1/annotate/mutations/byProteinChange": 61 }, + "2018-09-26": { "/api/private/utils/numbers/levels/": 44 }, + "2018-09-29": { "/api/private/utils/numbers/main/": 27 }, + "2018-10-03": { "/api/v1/annotate/mutations/byProteinChange": 19 }, + "2018-10-04": { + "/api/v1/annotate/structuralVariants": 20, + "/api/private/utils/numbers/main/": 21 + }, + "2018-10-07": { "/api/v1/annotate/copyNumberAlterations": 42 }, + "2018-10-11": { "/api/v1/annotate/structuralVariants": 99 }, + "2018-10-30": { "/api/v1/annotate/copyNumberAlterations": 26 }, + "2018-11-01": { "/api/v1/annotate/mutations/byProteinChange": 56 }, + "2018-11-02": { "/api/private/utils/numbers/levels/": 70 }, + "2018-11-04": { "/api/private/search/typeahead": 6 }, + "2018-11-07": { "/api/v1/annotate/copyNumberAlterations": 100 }, + "2018-11-17": { + "/api/v1/annotate/mutations/byProteinChange": 68, + "/api/private/search/typeahead": 57 + }, + "2018-12-09": { "/api/private/utils/numbers/levels/": 14 }, + "2018-12-15": { "/api/private/utils/numbers/main/": 30 }, + "2018-12-21": { + "/api/private/search/typeahead": 60, + "/api/v1/annotate/structuralVariants": 76 + }, + "2018-12-28": { "/api/v1/annotate/mutations/byProteinChange": 98 }, + "2017-01-01": { "/api/v1/annotate/mutations/byProteinChange": 37 }, + "2017-01-20": { + "/api/v1/annotate/mutations/byProteinChange": 67, + "/api/private/utils/numbers/levels/": 86, + "/api/v1/annotate/structuralVariants": 85 + }, + "2017-01-22": { + "/api/v1/annotate/mutations/byProteinChange": 61, + "/api/private/utils/numbers/main/": 42 + }, + "2017-01-23": { "/api/v1/annotate/structuralVariants": 33 }, + "2017-01-27": { "/api/v1/annotate/mutations/byProteinChange": 45 }, + "2017-02-08": { "/api/private/search/typeahead": 87 }, + "2017-02-18": { "/api/v1/annotate/copyNumberAlterations": 51 }, + "2017-03-01": { "/api/private/utils/numbers/levels/": 98 }, + "2017-03-03": { "/api/v1/annotate/mutations/byProteinChange": 37 }, + "2017-03-14": { "/api/v1/annotate/structuralVariants": 66 }, + "2017-03-17": { "/api/v1/annotate/copyNumberAlterations": 11 }, + "2017-03-31": { "/api/v1/annotate/structuralVariants": 38 }, + "2017-04-19": { "/api/v1/annotate/mutations/byProteinChange": 67 }, + "2017-04-24": { "/api/private/search/typeahead": 78 }, + "2017-04-28": { "/api/v1/annotate/copyNumberAlterations": 50 }, + "2017-05-12": { "/api/v1/annotate/copyNumberAlterations": 49 }, + "2017-05-16": { "/api/private/search/typeahead": 68 }, + "2017-05-19": { "/api/private/utils/numbers/levels/": 95 }, + "2017-06-04": { "/api/private/search/typeahead": 83 }, + "2017-06-07": { "/api/v1/annotate/structuralVariants": 8 }, + "2017-06-11": { "/api/v1/annotate/copyNumberAlterations": 86 }, + "2017-06-14": { "/api/private/utils/numbers/main/": 80 }, + "2017-06-23": { "/api/private/utils/numbers/levels/": 23 }, + "2017-06-26": { + "/api/v1/annotate/structuralVariants": 29, + "/api/private/search/typeahead": 16 + }, + "2017-07-10": { "/api/private/utils/numbers/levels/": 39 }, + "2017-07-12": { "/api/v1/annotate/copyNumberAlterations": 22 }, + "2017-07-13": { "/api/private/utils/numbers/main/": 100 }, + "2017-07-15": { "/api/v1/annotate/structuralVariants": 78 }, + "2017-07-19": { "/api/v1/annotate/copyNumberAlterations": 7 }, + "2017-07-24": { "/api/v1/annotate/structuralVariants": 67 }, + "2017-07-25": { "/api/v1/annotate/structuralVariants": 26 }, + "2017-08-02": { + "/api/private/utils/numbers/levels/": 64, + "/api/v1/annotate/copyNumberAlterations": 20 + }, + "2017-08-06": { + "/api/v1/annotate/copyNumberAlterations": 5, + "/api/v1/annotate/mutations/byProteinChange": 81 + }, + "2017-08-20": { "/api/v1/annotate/structuralVariants": 44 }, + "2017-08-31": { "/api/v1/annotate/structuralVariants": 82 }, + "2017-09-01": { "/api/v1/annotate/mutations/byProteinChange": 35 }, + "2017-09-14": { "/api/private/utils/numbers/main/": 2 }, + "2017-09-20": { "/api/v1/annotate/copyNumberAlterations": 90 }, + "2017-09-29": { + "/api/private/search/typeahead": 53, + "/api/private/utils/numbers/levels/": 93 + }, + "2017-10-03": { "/api/v1/annotate/structuralVariants": 14 }, + "2017-10-04": { "/api/private/utils/numbers/main/": 78 }, + "2017-10-08": { "/api/private/search/typeahead": 90 }, + "2017-10-16": { "/api/v1/annotate/structuralVariants": 41 }, + "2017-10-29": { "/api/v1/annotate/structuralVariants": 23 }, + "2017-10-31": { "/api/private/search/typeahead": 11 }, + "2017-11-03": { "/api/private/search/typeahead": 68 }, + "2017-11-04": { "/api/private/utils/numbers/levels/": 52 }, + "2017-11-06": { "/api/v1/annotate/copyNumberAlterations": 35 }, + "2017-11-13": { "/api/v1/annotate/mutations/byProteinChange": 35 }, + "2017-11-14": { "/api/private/utils/numbers/main/": 40 }, + "2017-11-23": { "/api/private/search/typeahead": 32 }, + "2017-11-25": { "/api/v1/annotate/copyNumberAlterations": 59 }, + "2017-12-03": { "/api/v1/annotate/copyNumberAlterations": 63 }, + "2017-12-09": { "/api/v1/annotate/structuralVariants": 76 }, + "2017-12-13": { "/api/private/utils/numbers/levels/": 92 }, + "2017-12-19": { + "/api/private/utils/numbers/main/": 54, + "/api/private/search/typeahead": 17 + }, + "2017-12-31": { + "/api/v1/annotate/copyNumberAlterations": 57, + "/api/private/utils/numbers/levels/": 37 } - } \ No newline at end of file + } +} diff --git a/screenshot-test/data/api-usage-summary-users.json b/screenshot-test/data/api-usage-summary-users.json index fb2bc346a..859927dfd 100644 --- a/screenshot-test/data/api-usage-summary-users.json +++ b/screenshot-test/data/api-usage-summary-users.json @@ -1,101 +1,5318 @@ -[{ - "userId" : "1461", - "userEmail" : "screenshot-mock-user1461@email.com", - "endpoint" : "/api/v1/annotate/mutations/byProteinChange", - "noPrivateEndpoint" : "/api/v1/annotate/mutations/byProteinChange", - "maxUsageProportion" : 55.6, - "noPrivateMaxUsageProportion" : 100, - "totalUsage" : 2152142550, - "dayUsage" : { - "2020-12-01" : 123489012, - "2020-11-01" : 374810, - "2020-11-05" : 213, - "2020-11-06" : 51515, - "2020-11-11" : 532555, - "2020-11-21" : 65378 +[ + { + "userId": "0", + "userEmail": "0doej@FakeCo.com", + "dayUsage": { + "2020-01-01": { + "totalUsage": 48.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-01-07": { + "totalUsage": 74.0, + "totalPublicUsage": 74.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-01-21": { + "totalUsage": 38.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-01-24": { + "totalUsage": 64.0, + "totalPublicUsage": 64.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-01-29": { + "totalUsage": 78.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-01-30": { + "totalUsage": 21.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-01-31": { + "totalUsage": 53.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-02-04": { + "totalUsage": 30.0, + "totalPublicUsage": 30.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-02-06": { + "totalUsage": 87.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-02-15": { + "totalUsage": 23.0, + "totalPublicUsage": 23.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-02-24": { + "totalUsage": 80.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-03-01": { + "totalUsage": 26.0, + "totalPublicUsage": 26.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-04": { + "totalUsage": 33.0, + "totalPublicUsage": 33.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-05": { + "totalUsage": 25.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-08": { + "totalUsage": 81.0, + "totalPublicUsage": 81.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-18": { + "totalUsage": 17.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-03-25": { + "totalUsage": 96.0, + "totalPublicUsage": 96.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-30": { + "totalUsage": 12.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-01": { + "totalUsage": 96.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-05": { + "totalUsage": 67.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 97.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-06": { + "totalUsage": 57.0, + "totalPublicUsage": 57.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-04-19": { + "totalUsage": 78.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 61.5, + "publicMaxUsageProportion": 100.0 + }, + "2020-04-26": { + "totalUsage": 183.0, + "totalPublicUsage": 183.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 81.4, + "publicMaxUsageProportion": 81.4 + }, + "2020-05-10": { + "totalUsage": 84.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-05-12": { + "totalUsage": 90.0, + "totalPublicUsage": 90.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-05-14": { + "totalUsage": 51.0, + "totalPublicUsage": 51.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-05-19": { + "totalUsage": 47.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-05-28": { + "totalUsage": 59.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-03": { + "totalUsage": 85.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-06": { + "totalUsage": 35.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-16": { + "totalUsage": 54.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-17": { + "totalUsage": 93.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-19": { + "totalUsage": 108.0, + "totalPublicUsage": 108.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 79.6, + "publicMaxUsageProportion": 79.6 + }, + "2020-06-23": { + "totalUsage": 29.0, + "totalPublicUsage": 29.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-03": { + "totalUsage": 66.0, + "totalPublicUsage": 66.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-05": { + "totalUsage": 67.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-09": { + "totalUsage": 64.0, + "totalPublicUsage": 64.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-24": { + "totalUsage": 24.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-07-25": { + "totalUsage": 87.0, + "totalPublicUsage": 87.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-26": { + "totalUsage": 75.0, + "totalPublicUsage": 75.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-08-01": { + "totalUsage": 58.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-08-15": { + "totalUsage": 82.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-09": { + "totalUsage": 74.0, + "totalPublicUsage": 74.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-09-14": { + "totalUsage": 41.0, + "totalPublicUsage": 41.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-09-21": { + "totalUsage": 62.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-02": { + "totalUsage": 79.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-05": { + "totalUsage": 98.0, + "totalPublicUsage": 98.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 89.7, + "publicMaxUsageProportion": 89.7 + }, + "2020-10-14": { + "totalUsage": 32.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-18": { + "totalUsage": 6.0, + "totalPublicUsage": 6.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-21": { + "totalUsage": 129.0, + "totalPublicUsage": 52.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 59.6, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-23": { + "totalUsage": 69.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-28": { + "totalUsage": 136.0, + "totalPublicUsage": 64.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 52.9, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-02": { + "totalUsage": 129.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-03": { + "totalUsage": 73.0, + "totalPublicUsage": 73.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-07": { + "totalUsage": 66.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-12": { + "totalUsage": 10.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-16": { + "totalUsage": 91.0, + "totalPublicUsage": 91.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-19": { + "totalUsage": 90.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-24": { + "totalUsage": 99.0, + "totalPublicUsage": 33.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 34.3, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-26": { + "totalUsage": 29.0, + "totalPublicUsage": 29.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-30": { + "totalUsage": 130.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-12-07": { + "totalUsage": 52.0, + "totalPublicUsage": 52.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-12-08": { + "totalUsage": 19.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-12-09": { + "totalUsage": 10.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-12-18": { + "totalUsage": 102.0, + "totalPublicUsage": 44.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 56.8, + "publicMaxUsageProportion": 100.0 + }, + "2020-12-19": { + "totalUsage": 42.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-12-26": { + "totalUsage": 64.0, + "totalPublicUsage": 64.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-12-31": { + "totalUsage": 79.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-01-04": { + "totalUsage": 77.0, + "totalPublicUsage": 77.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-01-06": { + "totalUsage": 26.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-01-14": { + "totalUsage": 49.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-01-15": { + "totalUsage": 171.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 94.1, + "publicMaxUsageProportion": 0.0 + }, + "2019-01-17": { + "totalUsage": 94.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-01-27": { + "totalUsage": 21.0, + "totalPublicUsage": 21.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-08": { + "totalUsage": 44.0, + "totalPublicUsage": 44.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-11": { + "totalUsage": 71.0, + "totalPublicUsage": 71.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-13": { + "totalUsage": 7.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-02-19": { + "totalUsage": 39.0, + "totalPublicUsage": 39.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-23": { + "totalUsage": 48.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-01": { + "totalUsage": 86.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-03": { + "totalUsage": 86.0, + "totalPublicUsage": 86.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-03-09": { + "totalUsage": 30.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-10": { + "totalUsage": 118.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 78.8, + "publicMaxUsageProportion": 100.0 + }, + "2019-03-12": { + "totalUsage": 36.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-16": { + "totalUsage": 85.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-19": { + "totalUsage": 93.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-21": { + "totalUsage": 194.0, + "totalPublicUsage": 100.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 51.5, + "publicMaxUsageProportion": 100.0 + }, + "2019-03-26": { + "totalUsage": 19.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-28": { + "totalUsage": 6.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-30": { + "totalUsage": 9.0, + "totalPublicUsage": 9.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-04-03": { + "totalUsage": 110.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 54.5, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-04": { + "totalUsage": 4.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-06": { + "totalUsage": 20.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-09": { + "totalUsage": 71.0, + "totalPublicUsage": 71.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-04-11": { + "totalUsage": 5.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-19": { + "totalUsage": 3.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-30": { + "totalUsage": 65.0, + "totalPublicUsage": 65.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-05-01": { + "totalUsage": 3.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-05-02": { + "totalUsage": 74.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-05-19": { + "totalUsage": 318.0, + "totalPublicUsage": 87.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 57.8, + "publicMaxUsageProportion": 100.0 + }, + "2019-05-21": { + "totalUsage": 175.0, + "totalPublicUsage": 92.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 52.5, + "publicMaxUsageProportion": 100.0 + }, + "2019-05-22": { + "totalUsage": 67.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-06-22": { + "totalUsage": 29.0, + "totalPublicUsage": 29.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-06-23": { + "totalUsage": 4.0, + "totalPublicUsage": 4.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-07-05": { + "totalUsage": 84.0, + "totalPublicUsage": 84.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-07-08": { + "totalUsage": 10.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-07-13": { + "totalUsage": 99.0, + "totalPublicUsage": 23.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 76.7, + "publicMaxUsageProportion": 100.0 + }, + "2019-07-25": { + "totalUsage": 101.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-01": { + "totalUsage": 14.0, + "totalPublicUsage": 14.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-08-03": { + "totalUsage": 46.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-20": { + "totalUsage": 10.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-22": { + "totalUsage": 125.0, + "totalPublicUsage": 37.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 70.4, + "publicMaxUsageProportion": 100.0 + }, + "2019-09-07": { + "totalUsage": 56.0, + "totalPublicUsage": 56.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-09-13": { + "totalUsage": 25.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-09-28": { + "totalUsage": 17.0, + "totalPublicUsage": 17.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-10-07": { + "totalUsage": 25.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-10-12": { + "totalUsage": 135.0, + "totalPublicUsage": 81.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 60.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-10-26": { + "totalUsage": 80.0, + "totalPublicUsage": 80.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-01": { + "totalUsage": 1.0, + "totalPublicUsage": 1.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-03": { + "totalUsage": 77.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-06": { + "totalUsage": 26.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-08": { + "totalUsage": 47.0, + "totalPublicUsage": 47.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-14": { + "totalUsage": 46.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-17": { + "totalUsage": 72.0, + "totalPublicUsage": 72.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-18": { + "totalUsage": 76.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-27": { + "totalUsage": 12.0, + "totalPublicUsage": 12.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-29": { + "totalUsage": 62.0, + "totalPublicUsage": 62.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-30": { + "totalUsage": 73.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-01": { + "totalUsage": 7.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-07": { + "totalUsage": 36.0, + "totalPublicUsage": 36.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 63.8, + "publicMaxUsageProportion": 63.8 + }, + "2019-12-08": { + "totalUsage": 122.0, + "totalPublicUsage": 98.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 80.3, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-17": { + "totalUsage": 1.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-19": { + "totalUsage": 27.0, + "totalPublicUsage": 27.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-20": { + "totalUsage": 22.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-23": { + "totalUsage": 47.0, + "totalPublicUsage": 15.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 68.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-25": { + "totalUsage": 46.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-26": { + "totalUsage": 39.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-27": { + "totalUsage": 178.0, + "totalPublicUsage": 178.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 56.1, + "publicMaxUsageProportion": 56.1 + }, + "2018-01-05": { + "totalUsage": 50.0, + "totalPublicUsage": 50.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-09": { + "totalUsage": 62.0, + "totalPublicUsage": 62.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-11": { + "totalUsage": 157.0, + "totalPublicUsage": 157.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 59.8, + "publicMaxUsageProportion": 59.8 + }, + "2018-01-15": { + "totalUsage": 63.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-01-16": { + "totalUsage": 88.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-01-17": { + "totalUsage": 79.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-19": { + "totalUsage": 48.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-21": { + "totalUsage": 82.0, + "totalPublicUsage": 82.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-23": { + "totalUsage": 99.0, + "totalPublicUsage": 99.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-24": { + "totalUsage": 14.0, + "totalPublicUsage": 14.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-26": { + "totalUsage": 9.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-02": { + "totalUsage": 80.0, + "totalPublicUsage": 80.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-02-05": { + "totalUsage": 66.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-07": { + "totalUsage": 3.0, + "totalPublicUsage": 3.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-02-15": { + "totalUsage": 64.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-22": { + "totalUsage": 40.0, + "totalPublicUsage": 17.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 57.5, + "publicMaxUsageProportion": 100.0 + }, + "2018-02-27": { + "totalUsage": 77.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-05": { + "totalUsage": 118.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 64.4, + "publicMaxUsageProportion": 100.0 + }, + "2018-03-15": { + "totalUsage": 49.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-17": { + "totalUsage": 67.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-19": { + "totalUsage": 74.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-26": { + "totalUsage": 47.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-29": { + "totalUsage": 80.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-04-08": { + "totalUsage": 37.0, + "totalPublicUsage": 37.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-10": { + "totalUsage": 37.0, + "totalPublicUsage": 37.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-15": { + "totalUsage": 76.0, + "totalPublicUsage": 66.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 86.8, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-20": { + "totalUsage": 67.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-04-24": { + "totalUsage": 48.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-05-03": { + "totalUsage": 31.0, + "totalPublicUsage": 31.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-05-08": { + "totalUsage": 6.0, + "totalPublicUsage": 6.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-05-15": { + "totalUsage": 10.0, + "totalPublicUsage": 10.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-05-29": { + "totalUsage": 44.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-05-31": { + "totalUsage": 89.0, + "totalPublicUsage": 89.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-05": { + "totalUsage": 73.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-06-12": { + "totalUsage": 96.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-06-20": { + "totalUsage": 49.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-06-24": { + "totalUsage": 45.0, + "totalPublicUsage": 45.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-27": { + "totalUsage": 100.0, + "totalPublicUsage": 100.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-07-02": { + "totalUsage": 11.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-17": { + "totalUsage": 22.0, + "totalPublicUsage": 22.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-07-18": { + "totalUsage": 49.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-22": { + "totalUsage": 39.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-24": { + "totalUsage": 58.0, + "totalPublicUsage": 58.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-07-29": { + "totalUsage": 49.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-08-17": { + "totalUsage": 75.0, + "totalPublicUsage": 10.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 86.6, + "publicMaxUsageProportion": 100.0 + }, + "2018-08-21": { + "totalUsage": 32.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-08-29": { + "totalUsage": 3.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-09-01": { + "totalUsage": 66.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 72.7, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-06": { + "totalUsage": 18.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-09-28": { + "totalUsage": 78.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-10-01": { + "totalUsage": 45.0, + "totalPublicUsage": 45.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-05": { + "totalUsage": 55.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-10-17": { + "totalUsage": 81.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-10-20": { + "totalUsage": 1.0, + "totalPublicUsage": 1.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-22": { + "totalUsage": 80.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 60.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-29": { + "totalUsage": 99.0, + "totalPublicUsage": 99.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-11-05": { + "totalUsage": 25.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-11-11": { + "totalUsage": 95.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-11-13": { + "totalUsage": 2.0, + "totalPublicUsage": 2.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-11-18": { + "totalUsage": 25.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-11-26": { + "totalUsage": 96.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-12-02": { + "totalUsage": 10.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-12-14": { + "totalUsage": 19.0, + "totalPublicUsage": 19.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-12-18": { + "totalUsage": 15.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-12-22": { + "totalUsage": 7.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-12-24": { + "totalUsage": 96.0, + "totalPublicUsage": 96.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-12-26": { + "totalUsage": 83.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-01-05": { + "totalUsage": 10.0, + "totalPublicUsage": 10.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-08": { + "totalUsage": 24.0, + "totalPublicUsage": 24.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-10": { + "totalUsage": 2.0, + "totalPublicUsage": 2.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-29": { + "totalUsage": 54.0, + "totalPublicUsage": 54.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-31": { + "totalUsage": 45.0, + "totalPublicUsage": 45.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-02-15": { + "totalUsage": 10.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-02-17": { + "totalUsage": 25.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-02-20": { + "totalUsage": 88.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-02-21": { + "totalUsage": 21.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-02-22": { + "totalUsage": 118.0, + "totalPublicUsage": 19.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 83.8, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-07": { + "totalUsage": 14.0, + "totalPublicUsage": 14.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-20": { + "totalUsage": 104.0, + "totalPublicUsage": 104.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 64.4, + "publicMaxUsageProportion": 64.4 + }, + "2017-03-28": { + "totalUsage": 101.0, + "totalPublicUsage": 101.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 98.0, + "publicMaxUsageProportion": 98.0 + }, + "2017-04-02": { + "totalUsage": 5.0, + "totalPublicUsage": 5.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-04-07": { + "totalUsage": 96.0, + "totalPublicUsage": 83.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 86.4, + "publicMaxUsageProportion": 100.0 + }, + "2017-04-09": { + "totalUsage": 16.0, + "totalPublicUsage": 16.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-04-11": { + "totalUsage": 102.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 38.2, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-01": { + "totalUsage": 42.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-02": { + "totalUsage": 7.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-06": { + "totalUsage": 55.0, + "totalPublicUsage": 55.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-08": { + "totalUsage": 68.0, + "totalPublicUsage": 68.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-10": { + "totalUsage": 57.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-11": { + "totalUsage": 85.0, + "totalPublicUsage": 85.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-15": { + "totalUsage": 15.0, + "totalPublicUsage": 15.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-20": { + "totalUsage": 21.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-29": { + "totalUsage": 11.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-06-06": { + "totalUsage": 62.0, + "totalPublicUsage": 62.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-09": { + "totalUsage": 44.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-06-13": { + "totalUsage": 44.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-06-18": { + "totalUsage": 200.0, + "totalPublicUsage": 46.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 47.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-20": { + "totalUsage": 65.0, + "totalPublicUsage": 65.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-28": { + "totalUsage": 28.0, + "totalPublicUsage": 28.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-02": { + "totalUsage": 36.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-07-08": { + "totalUsage": 32.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-09": { + "totalUsage": 13.0, + "totalPublicUsage": 13.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-27": { + "totalUsage": 78.0, + "totalPublicUsage": 78.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-30": { + "totalUsage": 100.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-08-03": { + "totalUsage": 50.0, + "totalPublicUsage": 50.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-08-04": { + "totalUsage": 7.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-08-05": { + "totalUsage": 28.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-08-08": { + "totalUsage": 96.0, + "totalPublicUsage": 96.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-09-19": { + "totalUsage": 80.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-09-23": { + "totalUsage": 41.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-09-24": { + "totalUsage": 147.0, + "totalPublicUsage": 10.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 51.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-09-28": { + "totalUsage": 62.0, + "totalPublicUsage": 53.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 80.6, + "publicMaxUsageProportion": 94.3 + }, + "2017-10-01": { + "totalUsage": 143.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 55.2, + "publicMaxUsageProportion": 100.0 + }, + "2017-10-06": { + "totalUsage": 68.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-10-10": { + "totalUsage": 34.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-10-17": { + "totalUsage": 10.0, + "totalPublicUsage": 10.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-10-21": { + "totalUsage": 96.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-07": { + "totalUsage": 60.0, + "totalPublicUsage": 60.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-11-09": { + "totalUsage": 83.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-15": { + "totalUsage": 105.0, + "totalPublicUsage": 63.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 60.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-11-29": { + "totalUsage": 10.0, + "totalPublicUsage": 10.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-12-06": { + "totalUsage": 56.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-12-22": { + "totalUsage": 6.0, + "totalPublicUsage": 6.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + } + }, + "monthUsage": { + "2020-01": { + "totalUsage": 376.0, + "totalPublicUsage": 186.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 49.4, + "publicMaxUsageProportion": 100.0 + }, + "2020-02": { + "totalUsage": 220.0, + "totalPublicUsage": 53.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 39.5, + "publicMaxUsageProportion": 56.6 + }, + "2020-03": { + "totalUsage": 290.0, + "totalPublicUsage": 261.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 61.0, + "publicMaxUsageProportion": 67.8 + }, + "2020-04": { + "totalUsage": 481.0, + "totalPublicUsage": 288.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 52.8, + "publicMaxUsageProportion": 88.1 + }, + "2020-05": { + "totalUsage": 331.0, + "totalPublicUsage": 141.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 57.4, + "publicMaxUsageProportion": 100.0 + }, + "2020-06": { + "totalUsage": 404.0, + "totalPublicUsage": 137.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 44.0, + "publicMaxUsageProportion": 62.7 + }, + "2020-07": { + "totalUsage": 383.0, + "totalPublicUsage": 359.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 57.4, + "publicMaxUsageProportion": 61.2 + }, + "2020-08": { + "totalUsage": 140.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09": { + "totalUsage": 177.0, + "totalPublicUsage": 115.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 41.8, + "publicMaxUsageProportion": 64.3 + }, + "2020-10": { + "totalUsage": 549.0, + "totalPublicUsage": 331.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 47.9, + "publicMaxUsageProportion": 79.4 + }, + "2020-11": { + "totalUsage": 717.0, + "totalPublicUsage": 226.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 42.2, + "publicMaxUsageProportion": 87.1 + }, + "2020-12": { + "totalUsage": 368.0, + "totalPublicUsage": 202.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 54.8, + "publicMaxUsageProportion": 100.0 + }, + "2019-01": { + "totalUsage": 438.0, + "totalPublicUsage": 98.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 58.2, + "publicMaxUsageProportion": 78.5 + }, + "2019-02": { + "totalUsage": 209.0, + "totalPublicUsage": 154.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 55.0, + "publicMaxUsageProportion": 74.6 + }, + "2019-03": { + "totalUsage": 762.0, + "totalPublicUsage": 220.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 25.8, + "publicMaxUsageProportion": 56.8 + }, + "2019-04": { + "totalUsage": 278.0, + "totalPublicUsage": 136.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 48.9, + "publicMaxUsageProportion": 100.0 + }, + "2019-05": { + "totalUsage": 637.0, + "totalPublicUsage": 246.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 40.5, + "publicMaxUsageProportion": 100.0 + }, + "2019-06": { + "totalUsage": 33.0, + "totalPublicUsage": 33.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 87.8, + "publicMaxUsageProportion": 87.8 + }, + "2019-07": { + "totalUsage": 294.0, + "totalPublicUsage": 107.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 34.3, + "publicMaxUsageProportion": 78.5 + }, + "2019-08": { + "totalUsage": 195.0, + "totalPublicUsage": 51.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 45.1, + "publicMaxUsageProportion": 72.5 + }, + "2019-09": { + "totalUsage": 98.0, + "totalPublicUsage": 98.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 82.6, + "publicMaxUsageProportion": 82.6 + }, + "2019-10": { + "totalUsage": 240.0, + "totalPublicUsage": 161.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 33.7, + "publicMaxUsageProportion": 50.3 + }, + "2019-11": { + "totalUsage": 492.0, + "totalPublicUsage": 194.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 27.4, + "publicMaxUsageProportion": 69.5 + }, + "2019-12": { + "totalUsage": 525.0, + "totalPublicUsage": 354.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 37.7, + "publicMaxUsageProportion": 55.9 + }, + "2018-01": { + "totalUsage": 751.0, + "totalPublicUsage": 591.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 29.6, + "publicMaxUsageProportion": 37.7 + }, + "2018-02": { + "totalUsage": 330.0, + "totalPublicUsage": 100.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 43.3, + "publicMaxUsageProportion": 100.0 + }, + "2018-03": { + "totalUsage": 435.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 44.1, + "publicMaxUsageProportion": 100.0 + }, + "2018-04": { + "totalUsage": 265.0, + "totalPublicUsage": 188.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 38.8, + "publicMaxUsageProportion": 54.7 + }, + "2018-05": { + "totalUsage": 180.0, + "totalPublicUsage": 136.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 49.4, + "publicMaxUsageProportion": 65.4 + }, + "2018-06": { + "totalUsage": 363.0, + "totalPublicUsage": 145.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 46.5, + "publicMaxUsageProportion": 100.0 + }, + "2018-07": { + "totalUsage": 228.0, + "totalPublicUsage": 80.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 38.5, + "publicMaxUsageProportion": 100.0 + }, + "2018-08": { + "totalUsage": 110.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 59.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09": { + "totalUsage": 162.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 70.3, + "publicMaxUsageProportion": 100.0 + }, + "2018-10": { + "totalUsage": 361.0, + "totalPublicUsage": 193.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 40.7, + "publicMaxUsageProportion": 76.1 + }, + "2018-11": { + "totalUsage": 243.0, + "totalPublicUsage": 27.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 39.5, + "publicMaxUsageProportion": 92.5 + }, + "2018-12": { + "totalUsage": 230.0, + "totalPublicUsage": 115.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 41.7, + "publicMaxUsageProportion": 83.4 + }, + "2017-01": { + "totalUsage": 135.0, + "totalPublicUsage": 135.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 52.5, + "publicMaxUsageProportion": 52.5 + }, + "2017-02": { + "totalUsage": 262.0, + "totalPublicUsage": 44.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 37.7, + "publicMaxUsageProportion": 56.8 + }, + "2017-03": { + "totalUsage": 219.0, + "totalPublicUsage": 219.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 62.1, + "publicMaxUsageProportion": 62.1 + }, + "2017-04": { + "totalUsage": 219.0, + "totalPublicUsage": 136.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 62.1, + "publicMaxUsageProportion": 100.0 + }, + "2017-05": { + "totalUsage": 361.0, + "totalPublicUsage": 223.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 38.2, + "publicMaxUsageProportion": 61.8 + }, + "2017-06": { + "totalUsage": 443.0, + "totalPublicUsage": 201.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 34.9, + "publicMaxUsageProportion": 77.1 + }, + "2017-07": { + "totalUsage": 259.0, + "totalPublicUsage": 123.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 38.6, + "publicMaxUsageProportion": 63.4 + }, + "2017-08": { + "totalUsage": 181.0, + "totalPublicUsage": 146.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 53.0, + "publicMaxUsageProportion": 65.7 + }, + "2017-09": { + "totalUsage": 330.0, + "totalPublicUsage": 63.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 31.2, + "publicMaxUsageProportion": 79.3 + }, + "2017-10": { + "totalUsage": 351.0, + "totalPublicUsage": 89.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 55.2, + "publicMaxUsageProportion": 88.7 + }, + "2017-11": { + "totalUsage": 258.0, + "totalPublicUsage": 133.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 47.6, + "publicMaxUsageProportion": 92.4 + }, + "2017-12": { + "totalUsage": 62.0, + "totalPublicUsage": 6.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 90.3, + "publicMaxUsageProportion": 100.0 + } + }, + "yearUsage": { + "2020": { + "totalUsage": 4436.0, + "totalPublicUsage": 2299.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 25.3, + "publicMaxUsageProportion": 40.0 + }, + "2019": { + "totalUsage": 4201.0, + "totalPublicUsage": 1852.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 23.4, + "publicMaxUsageProportion": 42.7 + }, + "2018": { + "totalUsage": 3658.0, + "totalPublicUsage": 1707.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 21.1, + "publicMaxUsageProportion": 41.4 + }, + "2017": { + "totalUsage": 3080.0, + "totalPublicUsage": 1518.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 20.4, + "publicMaxUsageProportion": 41.5 + } + } }, - "monthUsage" : {} -}, { - "userId" : "1460", - "userEmail" : "screenshot-mock-user1460@email.com", - "endpoint" : "/api/v1/utils/allCuratedGenes", - "noPrivateEndpoint" : "/api/v1/utils/allCuratedGenes", - "maxUsageProportion" : 70.7, - "noPrivateMaxUsageProportion" : 30.5, - "totalUsage" : 108421, - "dayUsage" : { - "2020-12-05" : 124, - "2021-11-05" : 4, - "2021-11-09" : 41, - "2022-11-06" : 421, - "2023-11-11" : 3412414414, - "2024-11-21" : 14444 - }, - "monthUsage" : {} -}, { - "userId" : "1217", - "userEmail" : "screenshot-mock-user1217@email.com", - "endpoint" : "/api/v1/utils/allCuratedGenes", - "noPrivateEndpoint" : "/api/v1/utils/allCuratedGenes", - "maxUsageProportion" : 15.6, - "noPrivateMaxUsageProportion" : 59.5, - "totalUsage" : 1234, - "dayUsage" : { - "2019-04-01" : 1, - "2018-05-01" : 1, - "2018-11-05" : 1, - "2020-11-06" : 12, - "2020-11-11" : 14721847, - "2020-11-21" : 1 - }, - "monthUsage" : {} -}, { - "userId" : "1216", - "userEmail" : "screenshot-mock-user1216@email.com", - "endpoint" : "/api/v1/utils/allCuratedGenes", - "noPrivateEndpoint" : "/api/v1/utils/allCuratedGenes", - "maxUsageProportion" : 65.7, - "noPrivateMaxUsageProportion" : 53.6, - "totalUsage" : 431241, - "dayUsage" : {}, - "monthUsage" : {} -}, { - "userId" : "1699", - "userEmail" : "screenshot-mock-user1699@email.com", - "endpoint" : "/api/private/search/typeahead", - "noPrivateEndpoint" : "/api/v1/utils/allCuratedGenes", - "maxUsageProportion" : 55.6, - "noPrivateMaxUsageProportion" : 55.6, - "totalUsage" : 134444412, - "dayUsage" : { - "2020-12-01" : 1124321313 - }, - "monthUsage" : {} -}, { - "userId" : "1698", - "userEmail" : "screenshot-mock-user1698@email.com", - "endpoint" : "/api/private/search/typeahead", - "noPrivateEndpoint" : "/api/v1/utils/allCuratedGenes", - "maxUsageProportion" : 55.6, - "noPrivateMaxUsageProportion" : 55.6, - "totalUsage" : 132, - "dayUsage" : {}, - "monthUsage" : {} -}, { - "userId" : "1213", - "userEmail" : "screenshot-mock-user1213@email.com", - "endpoint" : "/api/private/utils/numbers/levels/", - "noPrivateEndpoint" : "", - "maxUsageProportion" : 55.6, - "noPrivateMaxUsageProportion" : 55.6, - "totalUsage" : 132, - "dayUsage" : { - "1999-05-29" : 1242141, - "2018-04-04" : 10838282, - "2019-04-04" : 10838282, - "2020-04-04" : 10838282, - "2021-04-04" : 10838282, - "2022-04-04" : 10838282 - }, - "monthUsage" : {} -}] + { + "userId": "1", + "userEmail": "1smithj@DemoLLC.com", + "dayUsage": { + "2020-01-01": { + "totalUsage": 79.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-01-02": { + "totalUsage": 61.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-01-13": { + "totalUsage": 86.0, + "totalPublicUsage": 86.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-01-14": { + "totalUsage": 29.0, + "totalPublicUsage": 29.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-02-04": { + "totalUsage": 15.0, + "totalPublicUsage": 15.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-02-07": { + "totalUsage": 98.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-02-14": { + "totalUsage": 31.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-02-18": { + "totalUsage": 75.0, + "totalPublicUsage": 75.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-02-25": { + "totalUsage": 80.0, + "totalPublicUsage": 80.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-07": { + "totalUsage": 118.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 61.8, + "publicMaxUsageProportion": 0.0 + }, + "2020-03-11": { + "totalUsage": 1.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-03-17": { + "totalUsage": 162.0, + "totalPublicUsage": 85.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 52.4, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-18": { + "totalUsage": 3.0, + "totalPublicUsage": 3.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-22": { + "totalUsage": 79.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-03-26": { + "totalUsage": 98.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-03-27": { + "totalUsage": 1.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-02": { + "totalUsage": 145.0, + "totalPublicUsage": 145.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 66.2, + "publicMaxUsageProportion": 66.2 + }, + "2020-04-12": { + "totalUsage": 84.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-13": { + "totalUsage": 47.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-15": { + "totalUsage": 23.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-04-17": { + "totalUsage": 42.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-04-23": { + "totalUsage": 86.0, + "totalPublicUsage": 86.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-04-30": { + "totalUsage": 76.0, + "totalPublicUsage": 76.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-05-03": { + "totalUsage": 113.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 77.8, + "publicMaxUsageProportion": 100.0 + }, + "2020-05-06": { + "totalUsage": 103.0, + "totalPublicUsage": 103.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 86.4, + "publicMaxUsageProportion": 86.4 + }, + "2020-05-07": { + "totalUsage": 52.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 61.5, + "publicMaxUsageProportion": 100.0 + }, + "2020-05-13": { + "totalUsage": 26.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-05-18": { + "totalUsage": 45.0, + "totalPublicUsage": 45.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-05-19": { + "totalUsage": 57.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-05-30": { + "totalUsage": 77.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-10": { + "totalUsage": 45.0, + "totalPublicUsage": 45.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-06-19": { + "totalUsage": 76.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-06-25": { + "totalUsage": 138.0, + "totalPublicUsage": 76.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 55.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-06-27": { + "totalUsage": 1.0, + "totalPublicUsage": 1.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-06-28": { + "totalUsage": 87.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-07-19": { + "totalUsage": 57.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-07-20": { + "totalUsage": 81.0, + "totalPublicUsage": 81.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-22": { + "totalUsage": 9.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-07-26": { + "totalUsage": 23.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-07-27": { + "totalUsage": 84.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 79.7, + "publicMaxUsageProportion": 100.0 + }, + "2020-07-28": { + "totalUsage": 42.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-08-02": { + "totalUsage": 37.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-08-04": { + "totalUsage": 88.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-08-06": { + "totalUsage": 91.0, + "totalPublicUsage": 91.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-08-13": { + "totalUsage": 53.0, + "totalPublicUsage": 53.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-08-20": { + "totalUsage": 95.0, + "totalPublicUsage": 95.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-08-31": { + "totalUsage": 100.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-04": { + "totalUsage": 36.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-09": { + "totalUsage": 66.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-10": { + "totalUsage": 52.0, + "totalPublicUsage": 52.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-09-16": { + "totalUsage": 58.0, + "totalPublicUsage": 58.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-09-17": { + "totalUsage": 46.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-19": { + "totalUsage": 94.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-22": { + "totalUsage": 95.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-25": { + "totalUsage": 97.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-09-26": { + "totalUsage": 48.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-01": { + "totalUsage": 5.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-03": { + "totalUsage": 66.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-05": { + "totalUsage": 1.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-11": { + "totalUsage": 32.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-12": { + "totalUsage": 32.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-10-17": { + "totalUsage": 28.0, + "totalPublicUsage": 28.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-26": { + "totalUsage": 80.0, + "totalPublicUsage": 80.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-30": { + "totalUsage": 88.0, + "totalPublicUsage": 88.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-10-31": { + "totalUsage": 53.0, + "totalPublicUsage": 53.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-02": { + "totalUsage": 6.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-07": { + "totalUsage": 74.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-13": { + "totalUsage": 41.0, + "totalPublicUsage": 17.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 58.5, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-19": { + "totalUsage": 4.0, + "totalPublicUsage": 4.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-20": { + "totalUsage": 83.0, + "totalPublicUsage": 83.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-22": { + "totalUsage": 87.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-23": { + "totalUsage": 96.0, + "totalPublicUsage": 96.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-11-27": { + "totalUsage": 8.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-11-28": { + "totalUsage": 5.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-12-09": { + "totalUsage": 123.0, + "totalPublicUsage": 28.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 77.2, + "publicMaxUsageProportion": 100.0 + }, + "2020-12-10": { + "totalUsage": 70.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2020-12-16": { + "totalUsage": 96.0, + "totalPublicUsage": 96.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-12-25": { + "totalUsage": 147.0, + "totalPublicUsage": 82.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 55.7, + "publicMaxUsageProportion": 100.0 + }, + "2019-01-01": { + "totalUsage": 138.0, + "totalPublicUsage": 100.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 72.4, + "publicMaxUsageProportion": 100.0 + }, + "2019-01-03": { + "totalUsage": 51.0, + "totalPublicUsage": 51.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-01-12": { + "totalUsage": 93.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-02-03": { + "totalUsage": 62.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-02-10": { + "totalUsage": 48.0, + "totalPublicUsage": 48.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-11": { + "totalUsage": 61.0, + "totalPublicUsage": 61.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-16": { + "totalUsage": 39.0, + "totalPublicUsage": 39.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-23": { + "totalUsage": 69.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-02-25": { + "totalUsage": 32.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-02-27": { + "totalUsage": 73.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-02": { + "totalUsage": 55.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-08": { + "totalUsage": 86.0, + "totalPublicUsage": 86.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-03-17": { + "totalUsage": 92.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-22": { + "totalUsage": 17.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-03-28": { + "totalUsage": 95.0, + "totalPublicUsage": 88.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 92.6, + "publicMaxUsageProportion": 100.0 + }, + "2019-04-15": { + "totalUsage": 27.0, + "totalPublicUsage": 27.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-04-18": { + "totalUsage": 136.0, + "totalPublicUsage": 66.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 51.4, + "publicMaxUsageProportion": 100.0 + }, + "2019-04-21": { + "totalUsage": 185.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 49.1, + "publicMaxUsageProportion": 100.0 + }, + "2019-04-22": { + "totalUsage": 68.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-26": { + "totalUsage": 124.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 64.5, + "publicMaxUsageProportion": 0.0 + }, + "2019-04-29": { + "totalUsage": 17.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-05-08": { + "totalUsage": 15.0, + "totalPublicUsage": 15.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-05-10": { + "totalUsage": 26.0, + "totalPublicUsage": 26.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-05-14": { + "totalUsage": 88.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-05-26": { + "totalUsage": 77.0, + "totalPublicUsage": 77.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-06-07": { + "totalUsage": 39.0, + "totalPublicUsage": 39.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-06-08": { + "totalUsage": 91.0, + "totalPublicUsage": 91.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-06-17": { + "totalUsage": 50.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-06-18": { + "totalUsage": 97.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-06-21": { + "totalUsage": 88.0, + "totalPublicUsage": 88.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-06-25": { + "totalUsage": 1.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-06-26": { + "totalUsage": 124.0, + "totalPublicUsage": 26.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 79.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-07-07": { + "totalUsage": 49.0, + "totalPublicUsage": 49.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-07-14": { + "totalUsage": 90.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-03": { + "totalUsage": 82.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-06": { + "totalUsage": 48.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-08": { + "totalUsage": 99.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-11": { + "totalUsage": 87.0, + "totalPublicUsage": 87.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-08-13": { + "totalUsage": 58.0, + "totalPublicUsage": 58.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-08-24": { + "totalUsage": 65.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-26": { + "totalUsage": 25.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-08-28": { + "totalUsage": 91.0, + "totalPublicUsage": 91.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-08-30": { + "totalUsage": 120.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 65.0, + "publicMaxUsageProportion": 76.1 + }, + "2019-09-12": { + "totalUsage": 62.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-10-03": { + "totalUsage": 160.0, + "totalPublicUsage": 88.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 55.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-10-13": { + "totalUsage": 72.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-10-24": { + "totalUsage": 107.0, + "totalPublicUsage": 44.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 58.8, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-06": { + "totalUsage": 82.0, + "totalPublicUsage": 82.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-11-12": { + "totalUsage": 44.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-13": { + "totalUsage": 86.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-15": { + "totalUsage": 56.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-11-20": { + "totalUsage": 243.0, + "totalPublicUsage": 44.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 47.3, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-02": { + "totalUsage": 100.0, + "totalPublicUsage": 9.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 91.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-03": { + "totalUsage": 24.0, + "totalPublicUsage": 24.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-07": { + "totalUsage": 56.0, + "totalPublicUsage": 56.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-08": { + "totalUsage": 4.0, + "totalPublicUsage": 1.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 75.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-11": { + "totalUsage": 65.0, + "totalPublicUsage": 65.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-14": { + "totalUsage": 77.0, + "totalPublicUsage": 77.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-19": { + "totalUsage": 39.0, + "totalPublicUsage": 39.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2019-12-24": { + "totalUsage": 46.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-25": { + "totalUsage": 81.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-12-26": { + "totalUsage": 35.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-01-03": { + "totalUsage": 15.0, + "totalPublicUsage": 15.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-05": { + "totalUsage": 28.0, + "totalPublicUsage": 28.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-07": { + "totalUsage": 91.0, + "totalPublicUsage": 91.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-09": { + "totalUsage": 79.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-01-14": { + "totalUsage": 4.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-01-16": { + "totalUsage": 27.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-01-25": { + "totalUsage": 97.0, + "totalPublicUsage": 97.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-01-31": { + "totalUsage": 41.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-02": { + "totalUsage": 28.0, + "totalPublicUsage": 6.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 78.5, + "publicMaxUsageProportion": 100.0 + }, + "2018-02-04": { + "totalUsage": 8.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-06": { + "totalUsage": 33.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-09": { + "totalUsage": 82.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-19": { + "totalUsage": 4.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-02-20": { + "totalUsage": 5.0, + "totalPublicUsage": 5.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-02-24": { + "totalUsage": 75.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-09": { + "totalUsage": 60.0, + "totalPublicUsage": 60.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-03-11": { + "totalUsage": 25.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-13": { + "totalUsage": 23.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-15": { + "totalUsage": 92.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-19": { + "totalUsage": 16.0, + "totalPublicUsage": 16.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-03-23": { + "totalUsage": 33.0, + "totalPublicUsage": 33.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-03-24": { + "totalUsage": 91.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-03-27": { + "totalUsage": 79.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-04-06": { + "totalUsage": 94.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-04-08": { + "totalUsage": 35.0, + "totalPublicUsage": 35.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-09": { + "totalUsage": 86.0, + "totalPublicUsage": 84.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 97.6, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-12": { + "totalUsage": 24.0, + "totalPublicUsage": 24.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-16": { + "totalUsage": 42.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-20": { + "totalUsage": 36.0, + "totalPublicUsage": 36.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-04-21": { + "totalUsage": 5.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-04-27": { + "totalUsage": 64.0, + "totalPublicUsage": 64.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-05-07": { + "totalUsage": 36.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-05-16": { + "totalUsage": 24.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-05-17": { + "totalUsage": 26.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-05-22": { + "totalUsage": 64.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-05-27": { + "totalUsage": 67.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-01": { + "totalUsage": 262.0, + "totalPublicUsage": 115.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 28.2, + "publicMaxUsageProportion": 64.3 + }, + "2018-06-12": { + "totalUsage": 71.0, + "totalPublicUsage": 71.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-15": { + "totalUsage": 37.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-06-16": { + "totalUsage": 79.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-17": { + "totalUsage": 13.0, + "totalPublicUsage": 13.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-19": { + "totalUsage": 75.0, + "totalPublicUsage": 75.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-23": { + "totalUsage": 32.0, + "totalPublicUsage": 32.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-06-28": { + "totalUsage": 64.0, + "totalPublicUsage": 64.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-07-01": { + "totalUsage": 20.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-07": { + "totalUsage": 79.0, + "totalPublicUsage": 79.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-07-11": { + "totalUsage": 132.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-23": { + "totalUsage": 40.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-24": { + "totalUsage": 11.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-26": { + "totalUsage": 109.0, + "totalPublicUsage": 109.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 61.4, + "publicMaxUsageProportion": 61.4 + }, + "2018-07-30": { + "totalUsage": 87.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-07-31": { + "totalUsage": 157.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-08-01": { + "totalUsage": 89.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-08-07": { + "totalUsage": 52.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-08-25": { + "totalUsage": 60.0, + "totalPublicUsage": 60.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-08-31": { + "totalUsage": 13.0, + "totalPublicUsage": 13.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-02": { + "totalUsage": 87.0, + "totalPublicUsage": 87.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-03": { + "totalUsage": 126.0, + "totalPublicUsage": 50.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 60.3, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-08": { + "totalUsage": 62.0, + "totalPublicUsage": 13.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 79.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-11": { + "totalUsage": 41.0, + "totalPublicUsage": 41.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-12": { + "totalUsage": 28.0, + "totalPublicUsage": 28.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-13": { + "totalUsage": 83.0, + "totalPublicUsage": 83.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-16": { + "totalUsage": 48.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-09-18": { + "totalUsage": 61.0, + "totalPublicUsage": 61.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-09-26": { + "totalUsage": 44.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-09-29": { + "totalUsage": 27.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-10-01": { + "totalUsage": 71.0, + "totalPublicUsage": 71.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-03": { + "totalUsage": 19.0, + "totalPublicUsage": 19.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-04": { + "totalUsage": 41.0, + "totalPublicUsage": 20.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 51.2, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-05": { + "totalUsage": 67.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-07": { + "totalUsage": 42.0, + "totalPublicUsage": 42.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-11": { + "totalUsage": 99.0, + "totalPublicUsage": 99.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-10-30": { + "totalUsage": 26.0, + "totalPublicUsage": 26.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-11-01": { + "totalUsage": 56.0, + "totalPublicUsage": 56.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-11-02": { + "totalUsage": 70.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-11-04": { + "totalUsage": 6.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-11-07": { + "totalUsage": 100.0, + "totalPublicUsage": 100.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2018-11-17": { + "totalUsage": 125.0, + "totalPublicUsage": 68.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 54.4, + "publicMaxUsageProportion": 100.0 + }, + "2018-12-02": { + "totalUsage": 149.0, + "totalPublicUsage": 62.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 58.3, + "publicMaxUsageProportion": 100.0 + }, + "2018-12-09": { + "totalUsage": 14.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-12-15": { + "totalUsage": 30.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2018-12-21": { + "totalUsage": 136.0, + "totalPublicUsage": 76.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 55.8, + "publicMaxUsageProportion": 100.0 + }, + "2018-12-28": { + "totalUsage": 98.0, + "totalPublicUsage": 98.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-01": { + "totalUsage": 37.0, + "totalPublicUsage": 37.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-05": { + "totalUsage": 54.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 61.1, + "publicMaxUsageProportion": 0.0 + }, + "2017-01-20": { + "totalUsage": 238.0, + "totalPublicUsage": 152.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 36.1, + "publicMaxUsageProportion": 55.9 + }, + "2017-01-22": { + "totalUsage": 103.0, + "totalPublicUsage": 61.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 59.2, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-23": { + "totalUsage": 33.0, + "totalPublicUsage": 33.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-01-27": { + "totalUsage": 45.0, + "totalPublicUsage": 45.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-02-08": { + "totalUsage": 87.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-02-18": { + "totalUsage": 51.0, + "totalPublicUsage": 51.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-02-21": { + "totalUsage": 147.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-02-22": { + "totalUsage": 83.0, + "totalPublicUsage": 83.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-01": { + "totalUsage": 98.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-03-03": { + "totalUsage": 37.0, + "totalPublicUsage": 37.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-07": { + "totalUsage": 35.0, + "totalPublicUsage": 12.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 65.7, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-14": { + "totalUsage": 66.0, + "totalPublicUsage": 66.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-17": { + "totalUsage": 11.0, + "totalPublicUsage": 11.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-03-28": { + "totalUsage": 63.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-03-31": { + "totalUsage": 38.0, + "totalPublicUsage": 38.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-04-19": { + "totalUsage": 67.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-04-24": { + "totalUsage": 78.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-04-28": { + "totalUsage": 50.0, + "totalPublicUsage": 50.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-12": { + "totalUsage": 49.0, + "totalPublicUsage": 49.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-05-15": { + "totalUsage": 51.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-16": { + "totalUsage": 68.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-19": { + "totalUsage": 95.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-05-20": { + "totalUsage": 74.0, + "totalPublicUsage": 74.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-04": { + "totalUsage": 83.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-06-07": { + "totalUsage": 8.0, + "totalPublicUsage": 8.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-11": { + "totalUsage": 86.0, + "totalPublicUsage": 86.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-13": { + "totalUsage": 88.0, + "totalPublicUsage": 88.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-14": { + "totalUsage": 80.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-06-23": { + "totalUsage": 23.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-06-26": { + "totalUsage": 45.0, + "totalPublicUsage": 29.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 64.4, + "publicMaxUsageProportion": 100.0 + }, + "2017-06-28": { + "totalUsage": 93.0, + "totalPublicUsage": 93.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-02": { + "totalUsage": 41.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-07-09": { + "totalUsage": 77.0, + "totalPublicUsage": 68.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 88.3, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-10": { + "totalUsage": 39.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-07-12": { + "totalUsage": 22.0, + "totalPublicUsage": 22.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-13": { + "totalUsage": 100.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-07-15": { + "totalUsage": 78.0, + "totalPublicUsage": 78.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-19": { + "totalUsage": 7.0, + "totalPublicUsage": 7.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-24": { + "totalUsage": 67.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-25": { + "totalUsage": 26.0, + "totalPublicUsage": 26.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-07-27": { + "totalUsage": 36.0, + "totalPublicUsage": 35.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 97.2, + "publicMaxUsageProportion": 100.0 + }, + "2017-08-02": { + "totalUsage": 84.0, + "totalPublicUsage": 20.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 76.1, + "publicMaxUsageProportion": 100.0 + }, + "2017-08-06": { + "totalUsage": 86.0, + "totalPublicUsage": 86.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 94.1, + "publicMaxUsageProportion": 94.1 + }, + "2017-08-20": { + "totalUsage": 44.0, + "totalPublicUsage": 44.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-08-31": { + "totalUsage": 82.0, + "totalPublicUsage": 82.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-09-01": { + "totalUsage": 35.0, + "totalPublicUsage": 35.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-09-14": { + "totalUsage": 2.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-09-19": { + "totalUsage": 19.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-09-20": { + "totalUsage": 90.0, + "totalPublicUsage": 90.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-09-23": { + "totalUsage": 64.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-09-29": { + "totalUsage": 146.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 63.6, + "publicMaxUsageProportion": 0.0 + }, + "2017-10-03": { + "totalUsage": 14.0, + "totalPublicUsage": 14.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-10-04": { + "totalUsage": 78.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-10-08": { + "totalUsage": 90.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-10-16": { + "totalUsage": 41.0, + "totalPublicUsage": 41.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-10-17": { + "totalUsage": 84.0, + "totalPublicUsage": 25.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 70.2, + "publicMaxUsageProportion": 100.0 + }, + "2017-10-29": { + "totalUsage": 23.0, + "totalPublicUsage": 23.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-10-31": { + "totalUsage": 11.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-03": { + "totalUsage": 68.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-04": { + "totalUsage": 52.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-06": { + "totalUsage": 35.0, + "totalPublicUsage": 35.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-11-07": { + "totalUsage": 73.0, + "totalPublicUsage": 73.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-11-13": { + "totalUsage": 35.0, + "totalPublicUsage": 35.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-11-14": { + "totalUsage": 40.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-23": { + "totalUsage": 32.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-11-25": { + "totalUsage": 59.0, + "totalPublicUsage": 59.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-12-03": { + "totalUsage": 63.0, + "totalPublicUsage": 63.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-12-09": { + "totalUsage": 76.0, + "totalPublicUsage": 76.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 100.0 + }, + "2017-12-13": { + "totalUsage": 92.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-12-19": { + "totalUsage": 71.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 76.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-12-22": { + "totalUsage": 98.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2017-12-31": { + "totalUsage": 94.0, + "totalPublicUsage": 57.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 60.6, + "publicMaxUsageProportion": 100.0 + } + }, + "monthUsage": { + "2020-01": { + "totalUsage": 255.0, + "totalPublicUsage": 194.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 45.0, + "publicMaxUsageProportion": 59.2 + }, + "2020-02": { + "totalUsage": 299.0, + "totalPublicUsage": 170.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 32.7, + "publicMaxUsageProportion": 47.0 + }, + "2020-03": { + "totalUsage": 462.0, + "totalPublicUsage": 167.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 26.4, + "publicMaxUsageProportion": 52.6 + }, + "2020-04": { + "totalUsage": 503.0, + "totalPublicUsage": 349.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 50.2, + "publicMaxUsageProportion": 72.4 + }, + "2020-05": { + "totalUsage": 473.0, + "totalPublicUsage": 205.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 25.5, + "publicMaxUsageProportion": 59.0 + }, + "2020-06": { + "totalUsage": 347.0, + "totalPublicUsage": 122.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 46.9, + "publicMaxUsageProportion": 62.2 + }, + "2020-07": { + "totalUsage": 296.0, + "totalPublicUsage": 148.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 50.0, + "publicMaxUsageProportion": 100.0 + }, + "2020-08": { + "totalUsage": 464.0, + "totalPublicUsage": 239.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 31.8, + "publicMaxUsageProportion": 61.9 + }, + "2020-09": { + "totalUsage": 592.0, + "totalPublicUsage": 110.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 38.0, + "publicMaxUsageProportion": 52.7 + }, + "2020-10": { + "totalUsage": 385.0, + "totalPublicUsage": 281.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 42.8, + "publicMaxUsageProportion": 58.7 + }, + "2020-11": { + "totalUsage": 404.0, + "totalPublicUsage": 200.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 47.0, + "publicMaxUsageProportion": 52.0 + }, + "2020-12": { + "totalUsage": 436.0, + "totalPublicUsage": 206.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 40.8, + "publicMaxUsageProportion": 86.4 + }, + "2019-01": { + "totalUsage": 282.0, + "totalPublicUsage": 151.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 35.4, + "publicMaxUsageProportion": 66.2 + }, + "2019-02": { + "totalUsage": 384.0, + "totalPublicUsage": 180.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 36.9, + "publicMaxUsageProportion": 60.5 + }, + "2019-03": { + "totalUsage": 345.0, + "totalPublicUsage": 174.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 44.6, + "publicMaxUsageProportion": 50.5 + }, + "2019-04": { + "totalUsage": 557.0, + "totalPublicUsage": 118.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 37.1, + "publicMaxUsageProportion": 55.9 + }, + "2019-05": { + "totalUsage": 206.0, + "totalPublicUsage": 118.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 44.6, + "publicMaxUsageProportion": 77.9 + }, + "2019-06": { + "totalUsage": 490.0, + "totalPublicUsage": 244.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 30.2, + "publicMaxUsageProportion": 37.2 + }, + "2019-07": { + "totalUsage": 139.0, + "totalPublicUsage": 49.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 64.7, + "publicMaxUsageProportion": 100.0 + }, + "2019-08": { + "totalUsage": 675.0, + "totalPublicUsage": 278.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 31.4, + "publicMaxUsageProportion": 53.5 + }, + "2019-09": { + "totalUsage": 62.0, + "totalPublicUsage": 0.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "", + "maxUsageProportion": 100.0, + "publicMaxUsageProportion": 0.0 + }, + "2019-10": { + "totalUsage": 339.0, + "totalPublicUsage": 132.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 57.2, + "publicMaxUsageProportion": 100.0 + }, + "2019-11": { + "totalUsage": 511.0, + "totalPublicUsage": 126.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 50.2, + "publicMaxUsageProportion": 100.0 + }, + "2019-12": { + "totalUsage": 527.0, + "totalPublicUsage": 271.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 48.0, + "publicMaxUsageProportion": 48.3 + }, + "2018-01": { + "totalUsage": 382.0, + "totalPublicUsage": 231.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 49.2, + "publicMaxUsageProportion": 81.3 + }, + "2018-02": { + "totalUsage": 235.0, + "totalPublicUsage": 11.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 58.2, + "publicMaxUsageProportion": 100.0 + }, + "2018-03": { + "totalUsage": 419.0, + "totalPublicUsage": 109.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 27.9, + "publicMaxUsageProportion": 55.0 + }, + "2018-04": { + "totalUsage": 386.0, + "totalPublicUsage": 285.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 47.4, + "publicMaxUsageProportion": 64.2 + }, + "2018-05": { + "totalUsage": 217.0, + "totalPublicUsage": 67.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 30.8, + "publicMaxUsageProportion": 100.0 + }, + "2018-06": { + "totalUsage": 633.0, + "totalPublicUsage": 449.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 41.0, + "publicMaxUsageProportion": 57.9 + }, + "2018-07": { + "totalUsage": 635.0, + "totalPublicUsage": 188.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 37.6, + "publicMaxUsageProportion": 64.3 + }, + "2018-08": { + "totalUsage": 214.0, + "totalPublicUsage": 73.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 41.5, + "publicMaxUsageProportion": 82.1 + }, + "2018-09": { + "totalUsage": 607.0, + "totalPublicUsage": 363.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 37.2, + "publicMaxUsageProportion": 62.2 + }, + "2018-10": { + "totalUsage": 365.0, + "totalPublicUsage": 344.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 50.9, + "publicMaxUsageProportion": 54.0 + }, + "2018-11": { + "totalUsage": 357.0, + "totalPublicUsage": 224.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 34.7, + "publicMaxUsageProportion": 55.3 + }, + "2018-12": { + "totalUsage": 427.0, + "totalPublicUsage": 236.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 34.4, + "publicMaxUsageProportion": 41.5 + }, + "2017-01": { + "totalUsage": 510.0, + "totalPublicUsage": 328.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 41.1, + "publicMaxUsageProportion": 64.0 + }, + "2017-02": { + "totalUsage": 368.0, + "totalPublicUsage": 134.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 63.5, + "publicMaxUsageProportion": 61.9 + }, + "2017-03": { + "totalUsage": 348.0, + "totalPublicUsage": 164.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 46.2, + "publicMaxUsageProportion": 63.4 + }, + "2017-04": { + "totalUsage": 195.0, + "totalPublicUsage": 117.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 40.0, + "publicMaxUsageProportion": 57.2 + }, + "2017-05": { + "totalUsage": 337.0, + "totalPublicUsage": 123.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 43.3, + "publicMaxUsageProportion": 60.1 + }, + "2017-06": { + "totalUsage": 506.0, + "totalPublicUsage": 304.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 35.7, + "publicMaxUsageProportion": 59.5 + }, + "2017-07": { + "totalUsage": 493.0, + "totalPublicUsage": 303.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 34.6, + "publicMaxUsageProportion": 56.4 + }, + "2017-08": { + "totalUsage": 296.0, + "totalPublicUsage": 232.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 42.5, + "publicMaxUsageProportion": 54.3 + }, + "2017-09": { + "totalUsage": 356.0, + "totalPublicUsage": 125.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 32.8, + "publicMaxUsageProportion": 72.0 + }, + "2017-10": { + "totalUsage": 341.0, + "totalPublicUsage": 103.0, + "mostUsedEndpoint": "/api/v1/annotate/structuralVariants", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 30.2, + "publicMaxUsageProportion": 100.0 + }, + "2017-11": { + "totalUsage": 394.0, + "totalPublicUsage": 202.0, + "mostUsedEndpoint": "/api/v1/annotate/copyNumberAlterations", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 42.3, + "publicMaxUsageProportion": 82.6 + }, + "2017-12": { + "totalUsage": 494.0, + "totalPublicUsage": 196.0, + "mostUsedEndpoint": "/api/private/utils/numbers/main/", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 30.7, + "publicMaxUsageProportion": 61.2 + } + }, + "yearUsage": { + "2020": { + "totalUsage": 4916.0, + "totalPublicUsage": 2391.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 21.4, + "publicMaxUsageProportion": 42.6 + }, + "2019": { + "totalUsage": 4517.0, + "totalPublicUsage": 1841.0, + "mostUsedEndpoint": "/api/private/search/typeahead", + "mostUsedPublicEndpoint": "/api/v1/annotate/copyNumberAlterations", + "maxUsageProportion": 23.6, + "publicMaxUsageProportion": 39.3 + }, + "2018": { + "totalUsage": 4877.0, + "totalPublicUsage": 2580.0, + "mostUsedEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "mostUsedPublicEndpoint": "/api/v1/annotate/mutations/byProteinChange", + "maxUsageProportion": 22.0, + "publicMaxUsageProportion": 41.7 + }, + "2017": { + "totalUsage": 4638.0, + "totalPublicUsage": 2331.0, + "mostUsedEndpoint": "/api/private/utils/numbers/levels/", + "mostUsedPublicEndpoint": "/api/v1/annotate/structuralVariants", + "maxUsageProportion": 20.3, + "publicMaxUsageProportion": 38.2 + } + } + } +] diff --git a/screenshot-test/data/api-usage-users-2021.json b/screenshot-test/data/api-usage-users-2021.json index 6a645780e..2a39c76da 100644 --- a/screenshot-test/data/api-usage-users-2021.json +++ b/screenshot-test/data/api-usage-users-2021.json @@ -1,87 +1,710 @@ { - "userFirstName" : "Mike", - "userLastName" : "Wood", - "userEmail" : "example@mail.com", - "licenseType" : "Research Use in an Academic Setting", - "jobTitle" : "SDE", - "company" : "MSKCC", - "summary" : { - "day" : { - "2021-04-01" : { - "/api/example/endpoint10" : 1.0, - "/api/example/endpoint11" : 12340.0, - "/api/example/endpoint12" : 832461.0 - }, - "2021-03-01" : { - "/api/example/endpoint10" : 1.0, - "/api/example/endpoint11" : 123490.0, - "/api/example/endpoint12" : 8324461.0 - }, - "2021-02-01" : { - "/api/example/endpoint10" : 1.0, - "/api/example/endpoint11" : 123490.0, - "/api/example/endpoint12" : 8324461.0 - }, - "2021-01-01" : { - "/api/example/endpoint10" : 1.0, - "/api/example/endpoint11" : 123490.0, - "/api/example/endpoint12" : 8324461.0 - }, - "2020-12-01" : { - "/api/example/endpoint1" : 2.0, - "/api/example/endpoint2" : 3.0, - "/api/example/endpoint3" : 2.0, - "/api/example/endpoint4" : 2.0, - "/api/example/endpoint5" : 3.0, - "/api/example/endpoint6" : 2.0, - "/api/example/endpoint7" : 1.0, - "/api/example/endpoint8" : 2.0, - "/api/example/endpoint9" : 2.0, - "/api/example/endpoint10" : 11.0, - "/api/example/endpoint11" : 12.0, - "/api/example/endpoint13" : 1.0 - }, - "2020-11-01" : { - "/api/example/endpoint10" : 1.0, - "/api/example/endpoint11" : 1234567890.0, - "/api/example/endpoint12" : 8324461.0 - } - }, - "month" : { - "2020-12" : { - "/api/example/endpoint1" : 2.0, - "/api/example/endpoint2" : 3.0, - "/api/example/endpoint3" : 2.0, - "/api/example/endpoint4" : 2.0, - "/api/example/endpoint5" : 3.0, - "/api/example/endpoint6" : 2.0, - "/api/example/endpoint7" : 1.0, - "/api/example/endpoint8" : 2.0, - "/api/example/endpoint9" : 2.0, - "/api/example/endpoint10" : 11.0, - "/api/example/endpoint11" : 12.0, - "/api/example/endpoint13" : 1.0 - }, - "2020-11" : { - "/api/example/endpoint10" : 1.0, - "/api/example/endpoint11" : 1234567890.0, - "/api/example/endpoint12" : 8324461.0 - } - }, - "year" : { - "/api/example/endpoint1" : 2, - "/api/example/endpoint3" : 2, - "/api/example/endpoint4" : 2, - "/api/example/endpoint6" : 2, - "/api/example/endpoint7" : 1, - "/api/example/endpoint9" : 2, - "/api/example/endpoint12" : 8324461, - "/api/example/endpoint2" : 3, - "/api/example/endpoint5" : 3, - "/api/example/endpoint8" : 2, - "/api/example/endpoint10" : 12, - "/api/example/endpoint11" : 1234567902, - "/api/example/endpoint13" : 1 + "summary": { + "year": { + "2020": { + "/api/v1/annotate/structuralVariants": 921, + "/api/private/search/typeahead": 1124, + "/api/private/utils/numbers/levels/": 657, + "/api/v1/annotate/mutations/byProteinChange": 712, + "/api/private/utils/numbers/main/": 356, + "/api/v1/annotate/copyNumberAlterations": 666 + }, + "2019": { + "/api/v1/annotate/copyNumberAlterations": 791, + "/api/private/utils/numbers/levels/": 987, + "/api/private/search/typeahead": 538, + "/api/private/utils/numbers/main/": 824, + "/api/v1/annotate/mutations/byProteinChange": 697, + "/api/v1/annotate/structuralVariants": 364 + }, + "2018": { + "/api/v1/annotate/mutations/byProteinChange": 542, + "/api/v1/annotate/structuralVariants": 708, + "/api/v1/annotate/copyNumberAlterations": 457, + "/api/private/utils/numbers/main/": 772, + "/api/private/search/typeahead": 628, + "/api/private/utils/numbers/levels/": 551 + }, + "2017": { + "/api/v1/annotate/structuralVariants": 569, + "/api/v1/annotate/copyNumberAlterations": 631, + "/api/v1/annotate/mutations/byProteinChange": 318, + "/api/private/utils/numbers/main/": 455, + "/api/private/utils/numbers/levels/": 507, + "/api/private/search/typeahead": 600 } + }, + "month": { + "2020-01": { + "/api/v1/annotate/structuralVariants": 186, + "/api/private/search/typeahead": 169, + "/api/private/utils/numbers/levels/": 21 + }, + "2020-02": { + "/api/v1/annotate/mutations/byProteinChange": 30, + "/api/private/utils/numbers/levels/": 87, + "/api/v1/annotate/structuralVariants": 23, + "/api/private/search/typeahead": 80 + }, + "2020-03": { + "/api/v1/annotate/mutations/byProteinChange": 84, + "/api/v1/annotate/structuralVariants": 177, + "/api/private/utils/numbers/main/": 17, + "/api/private/search/typeahead": 12 + }, + "2020-04": { + "/api/private/utils/numbers/main/": 96, + "/api/private/search/typeahead": 2, + "/api/private/utils/numbers/levels/": 95, + "/api/v1/annotate/copyNumberAlterations": 254, + "/api/v1/annotate/mutations/byProteinChange": 34 + }, + "2020-05": { + "/api/private/search/typeahead": 190, + "/api/v1/annotate/copyNumberAlterations": 141 + }, + "2020-06": { + "/api/private/search/typeahead": 178, + "/api/private/utils/numbers/main/": 89, + "/api/v1/annotate/copyNumberAlterations": 22, + "/api/v1/annotate/mutations/byProteinChange": 86, + "/api/v1/annotate/structuralVariants": 29 + }, + "2020-07": { + "/api/v1/annotate/copyNumberAlterations": 220, + "/api/v1/annotate/mutations/byProteinChange": 139, + "/api/private/search/typeahead": 24 + }, + "2020-08": { "/api/private/search/typeahead": 140 }, + "2020-09": { + "/api/v1/annotate/mutations/byProteinChange": 74, + "/api/v1/annotate/structuralVariants": 41, + "/api/private/search/typeahead": 62 + }, + "2020-10": { + "/api/v1/annotate/structuralVariants": 263, + "/api/v1/annotate/mutations/byProteinChange": 68, + "/api/private/utils/numbers/main/": 77, + "/api/private/utils/numbers/levels/": 141 + }, + "2020-11": { + "/api/private/utils/numbers/levels/": 303, + "/api/v1/annotate/mutations/byProteinChange": 197, + "/api/private/search/typeahead": 188, + "/api/v1/annotate/copyNumberAlterations": 29 + }, + "2020-12": { + "/api/v1/annotate/structuralVariants": 202, + "/api/private/utils/numbers/main/": 77, + "/api/private/utils/numbers/levels/": 10, + "/api/private/search/typeahead": 79 + }, + "2019-01": { + "/api/v1/annotate/copyNumberAlterations": 77, + "/api/private/utils/numbers/levels/": 26, + "/api/private/search/typeahead": 59, + "/api/private/utils/numbers/main/": 255, + "/api/v1/annotate/mutations/byProteinChange": 21 + }, + "2019-02": { + "/api/v1/annotate/structuralVariants": 115, + "/api/private/utils/numbers/levels/": 7, + "/api/v1/annotate/mutations/byProteinChange": 39, + "/api/private/utils/numbers/main/": 48 + }, + "2019-03": { + "/api/private/utils/numbers/main/": 158, + "/api/v1/annotate/copyNumberAlterations": 95, + "/api/v1/annotate/structuralVariants": 125, + "/api/private/search/typeahead": 197, + "/api/private/utils/numbers/levels/": 187 + }, + "2019-04": { + "/api/private/search/typeahead": 23, + "/api/private/utils/numbers/levels/": 80, + "/api/private/utils/numbers/main/": 39, + "/api/v1/annotate/mutations/byProteinChange": 136 + }, + "2019-05": { + "/api/private/utils/numbers/main/": 133, + "/api/private/utils/numbers/levels/": 258, + "/api/v1/annotate/copyNumberAlterations": 246 + }, + "2019-06": { + "/api/v1/annotate/copyNumberAlterations": 29, + "/api/v1/annotate/mutations/byProteinChange": 4 + }, + "2019-07": { + "/api/v1/annotate/mutations/byProteinChange": 84, + "/api/private/search/typeahead": 86, + "/api/v1/annotate/copyNumberAlterations": 23, + "/api/private/utils/numbers/levels/": 101 + }, + "2019-08": { + "/api/v1/annotate/copyNumberAlterations": 14, + "/api/private/search/typeahead": 46, + "/api/private/utils/numbers/levels/": 10, + "/api/v1/annotate/structuralVariants": 37, + "/api/private/utils/numbers/main/": 88 + }, + "2019-09": { + "/api/v1/annotate/mutations/byProteinChange": 81, + "/api/v1/annotate/copyNumberAlterations": 17 + }, + "2019-10": { + "/api/private/search/typeahead": 25, + "/api/private/utils/numbers/levels/": 54, + "/api/v1/annotate/mutations/byProteinChange": 81, + "/api/v1/annotate/copyNumberAlterations": 80 + }, + "2019-11": { + "/api/v1/annotate/mutations/byProteinChange": 135, + "/api/private/utils/numbers/levels/": 123, + "/api/private/search/typeahead": 102, + "/api/v1/annotate/structuralVariants": 47, + "/api/v1/annotate/copyNumberAlterations": 12, + "/api/private/utils/numbers/main/": 73 + }, + "2019-12": { + "/api/private/utils/numbers/main/": 30, + "/api/v1/annotate/mutations/byProteinChange": 116, + "/api/v1/annotate/structuralVariants": 40, + "/api/private/utils/numbers/levels/": 141, + "/api/v1/annotate/copyNumberAlterations": 198 + }, + "2018-01": { + "/api/v1/annotate/mutations/byProteinChange": 161, + "/api/v1/annotate/structuralVariants": 223, + "/api/v1/annotate/copyNumberAlterations": 207, + "/api/private/utils/numbers/main/": 160 + }, + "2018-02": { + "/api/v1/annotate/structuralVariants": 100, + "/api/private/search/typeahead": 143, + "/api/private/utils/numbers/main/": 64, + "/api/private/utils/numbers/levels/": 23 + }, + "2018-03": { + "/api/v1/annotate/structuralVariants": 42, + "/api/private/utils/numbers/levels/": 192, + "/api/private/utils/numbers/main/": 154, + "/api/private/search/typeahead": 47 + }, + "2018-04": { + "/api/v1/annotate/structuralVariants": 103, + "/api/v1/annotate/copyNumberAlterations": 85, + "/api/private/utils/numbers/main/": 10, + "/api/private/utils/numbers/levels/": 67 + }, + "2018-05": { + "/api/v1/annotate/copyNumberAlterations": 31, + "/api/v1/annotate/structuralVariants": 16, + "/api/private/search/typeahead": 44, + "/api/v1/annotate/mutations/byProteinChange": 89 + }, + "2018-06": { + "/api/private/utils/numbers/levels/": 169, + "/api/private/search/typeahead": 49, + "/api/v1/annotate/mutations/byProteinChange": 145 + }, + "2018-07": { + "/api/private/utils/numbers/main/": 60, + "/api/v1/annotate/structuralVariants": 80, + "/api/private/search/typeahead": 88 + }, + "2018-08": { + "/api/private/utils/numbers/levels/": 65, + "/api/v1/annotate/copyNumberAlterations": 42, + "/api/private/search/typeahead": 3 + }, + "2018-09": { + "/api/v1/annotate/copyNumberAlterations": 48, + "/api/private/utils/numbers/main/": 114 + }, + "2018-10": { + "/api/v1/annotate/structuralVariants": 46, + "/api/private/search/typeahead": 136, + "/api/private/utils/numbers/main/": 32, + "/api/v1/annotate/mutations/byProteinChange": 147 + }, + "2018-11": { + "/api/private/utils/numbers/levels/": 25, + "/api/private/utils/numbers/main/": 95, + "/api/v1/annotate/structuralVariants": 2, + "/api/v1/annotate/copyNumberAlterations": 25, + "/api/private/search/typeahead": 96 + }, + "2018-12": { + "/api/private/utils/numbers/levels/": 10, + "/api/v1/annotate/copyNumberAlterations": 19, + "/api/private/search/typeahead": 22, + "/api/v1/annotate/structuralVariants": 96, + "/api/private/utils/numbers/main/": 83 + }, + "2017-01": { + "/api/v1/annotate/structuralVariants": 10, + "/api/v1/annotate/copyNumberAlterations": 71, + "/api/v1/annotate/mutations/byProteinChange": 54 + }, + "2017-02": { + "/api/private/utils/numbers/main/": 98, + "/api/v1/annotate/mutations/byProteinChange": 25, + "/api/private/utils/numbers/levels/": 21, + "/api/private/search/typeahead": 99, + "/api/v1/annotate/structuralVariants": 19 + }, + "2017-03": { + "/api/v1/annotate/structuralVariants": 83, + "/api/v1/annotate/copyNumberAlterations": 136 + }, + "2017-04": { + "/api/v1/annotate/structuralVariants": 136, + "/api/private/utils/numbers/levels/": 13, + "/api/private/search/typeahead": 31, + "/api/private/utils/numbers/main/": 39 + }, + "2017-05": { + "/api/private/utils/numbers/levels/": 120, + "/api/private/search/typeahead": 7, + "/api/v1/annotate/mutations/byProteinChange": 138, + "/api/v1/annotate/copyNumberAlterations": 85, + "/api/private/utils/numbers/main/": 11 + }, + "2017-06": { + "/api/v1/annotate/structuralVariants": 155, + "/api/private/search/typeahead": 104, + "/api/private/utils/numbers/main/": 138, + "/api/v1/annotate/mutations/byProteinChange": 46 + }, + "2017-07": { + "/api/private/utils/numbers/main/": 36, + "/api/v1/annotate/mutations/byProteinChange": 45, + "/api/v1/annotate/copyNumberAlterations": 78, + "/api/private/search/typeahead": 100 + }, + "2017-08": { + "/api/v1/annotate/copyNumberAlterations": 50, + "/api/private/utils/numbers/main/": 7, + "/api/private/search/typeahead": 28, + "/api/v1/annotate/structuralVariants": 96 + }, + "2017-09": { + "/api/private/search/typeahead": 80, + "/api/private/utils/numbers/levels/": 103, + "/api/private/utils/numbers/main/": 84, + "/api/v1/annotate/mutations/byProteinChange": 10, + "/api/v1/annotate/copyNumberAlterations": 3, + "/api/v1/annotate/structuralVariants": 50 + }, + "2017-10": { + "/api/v1/annotate/copyNumberAlterations": 79, + "/api/private/utils/numbers/levels/": 194, + "/api/private/search/typeahead": 68, + "/api/v1/annotate/structuralVariants": 10 + }, + "2017-11": { + "/api/v1/annotate/copyNumberAlterations": 123, + "/api/private/search/typeahead": 83, + "/api/private/utils/numbers/main/": 42, + "/api/v1/annotate/structuralVariants": 10 + }, + "2017-12": { + "/api/private/utils/numbers/levels/": 56, + "/api/v1/annotate/copyNumberAlterations": 6 + } + }, + "day": { + "2020-01-01": { "/api/v1/annotate/structuralVariants": 48 }, + "2020-01-07": { "/api/v1/annotate/structuralVariants": 74 }, + "2020-01-21": { "/api/private/search/typeahead": 38 }, + "2020-01-24": { "/api/v1/annotate/structuralVariants": 64 }, + "2020-01-29": { "/api/private/search/typeahead": 78 }, + "2020-01-30": { "/api/private/utils/numbers/levels/": 21 }, + "2020-01-31": { "/api/private/search/typeahead": 53 }, + "2020-02-04": { "/api/v1/annotate/mutations/byProteinChange": 30 }, + "2020-02-06": { "/api/private/utils/numbers/levels/": 87 }, + "2020-02-15": { "/api/v1/annotate/structuralVariants": 23 }, + "2020-02-24": { "/api/private/search/typeahead": 80 }, + "2020-03-01": { "/api/v1/annotate/mutations/byProteinChange": 26 }, + "2020-03-04": { "/api/v1/annotate/mutations/byProteinChange": 33 }, + "2020-03-05": { "/api/v1/annotate/mutations/byProteinChange": 25 }, + "2020-03-08": { "/api/v1/annotate/structuralVariants": 81 }, + "2020-03-18": { "/api/private/utils/numbers/main/": 17 }, + "2020-03-25": { "/api/v1/annotate/structuralVariants": 96 }, + "2020-03-30": { "/api/private/search/typeahead": 12 }, + "2020-04-01": { "/api/private/utils/numbers/main/": 96 }, + "2020-04-05": { + "/api/private/search/typeahead": 2, + "/api/private/utils/numbers/levels/": 65 + }, + "2020-04-06": { "/api/v1/annotate/copyNumberAlterations": 57 }, + "2020-04-19": { + "/api/private/utils/numbers/levels/": 30, + "/api/v1/annotate/copyNumberAlterations": 48 + }, + "2020-04-26": { + "/api/v1/annotate/mutations/byProteinChange": 34, + "/api/v1/annotate/copyNumberAlterations": 149 + }, + "2020-05-10": { "/api/private/search/typeahead": 84 }, + "2020-05-12": { "/api/v1/annotate/copyNumberAlterations": 90 }, + "2020-05-14": { "/api/v1/annotate/copyNumberAlterations": 51 }, + "2020-05-19": { "/api/private/search/typeahead": 47 }, + "2020-05-28": { "/api/private/search/typeahead": 59 }, + "2020-06-03": { "/api/private/search/typeahead": 85 }, + "2020-06-06": { "/api/private/utils/numbers/main/": 35 }, + "2020-06-16": { "/api/private/utils/numbers/main/": 54 }, + "2020-06-17": { "/api/private/search/typeahead": 93 }, + "2020-06-19": { + "/api/v1/annotate/copyNumberAlterations": 22, + "/api/v1/annotate/mutations/byProteinChange": 86 + }, + "2020-06-23": { "/api/v1/annotate/structuralVariants": 29 }, + "2020-07-03": { "/api/v1/annotate/copyNumberAlterations": 66 }, + "2020-07-05": { "/api/v1/annotate/copyNumberAlterations": 67 }, + "2020-07-09": { "/api/v1/annotate/mutations/byProteinChange": 64 }, + "2020-07-24": { "/api/private/search/typeahead": 24 }, + "2020-07-25": { "/api/v1/annotate/copyNumberAlterations": 87 }, + "2020-07-26": { "/api/v1/annotate/mutations/byProteinChange": 75 }, + "2020-08-01": { "/api/private/search/typeahead": 58 }, + "2020-08-15": { "/api/private/search/typeahead": 82 }, + "2020-09-09": { "/api/v1/annotate/mutations/byProteinChange": 74 }, + "2020-09-14": { "/api/v1/annotate/structuralVariants": 41 }, + "2020-09-21": { "/api/private/search/typeahead": 62 }, + "2020-10-02": { "/api/v1/annotate/structuralVariants": 79 }, + "2020-10-05": { + "/api/v1/annotate/structuralVariants": 88, + "/api/v1/annotate/mutations/byProteinChange": 10 + }, + "2020-10-14": { "/api/v1/annotate/structuralVariants": 32 }, + "2020-10-18": { "/api/v1/annotate/mutations/byProteinChange": 6 }, + "2020-10-21": { + "/api/v1/annotate/mutations/byProteinChange": 52, + "/api/private/utils/numbers/main/": 77 + }, + "2020-10-23": { "/api/private/utils/numbers/levels/": 69 }, + "2020-10-28": { + "/api/v1/annotate/structuralVariants": 64, + "/api/private/utils/numbers/levels/": 72 + }, + "2020-11-02": { "/api/private/utils/numbers/levels/": 129 }, + "2020-11-03": { "/api/v1/annotate/mutations/byProteinChange": 73 }, + "2020-11-07": { "/api/private/search/typeahead": 66 }, + "2020-11-12": { "/api/private/utils/numbers/levels/": 10 }, + "2020-11-16": { "/api/v1/annotate/mutations/byProteinChange": 91 }, + "2020-11-19": { "/api/private/search/typeahead": 90 }, + "2020-11-24": { + "/api/private/utils/numbers/levels/": 34, + "/api/v1/annotate/mutations/byProteinChange": 33, + "/api/private/search/typeahead": 32 + }, + "2020-11-26": { "/api/v1/annotate/copyNumberAlterations": 29 }, + "2020-11-30": { "/api/private/utils/numbers/levels/": 130 }, + "2020-12-07": { "/api/v1/annotate/structuralVariants": 52 }, + "2020-12-08": { "/api/private/utils/numbers/main/": 19 }, + "2020-12-09": { "/api/private/utils/numbers/levels/": 10 }, + "2020-12-18": { + "/api/private/utils/numbers/main/": 58, + "/api/v1/annotate/structuralVariants": 44 + }, + "2020-12-19": { "/api/v1/annotate/structuralVariants": 42 }, + "2020-12-26": { "/api/v1/annotate/structuralVariants": 64 }, + "2020-12-31": { "/api/private/search/typeahead": 79 }, + "2019-01-04": { "/api/v1/annotate/copyNumberAlterations": 77 }, + "2019-01-06": { "/api/private/utils/numbers/levels/": 26 }, + "2019-01-14": { "/api/private/search/typeahead": 49 }, + "2019-01-15": { + "/api/private/search/typeahead": 10, + "/api/private/utils/numbers/main/": 161 + }, + "2019-01-17": { "/api/private/utils/numbers/main/": 94 }, + "2019-01-27": { "/api/v1/annotate/mutations/byProteinChange": 21 }, + "2019-02-08": { "/api/v1/annotate/structuralVariants": 44 }, + "2019-02-11": { "/api/v1/annotate/structuralVariants": 71 }, + "2019-02-13": { "/api/private/utils/numbers/levels/": 7 }, + "2019-02-19": { "/api/v1/annotate/mutations/byProteinChange": 39 }, + "2019-02-23": { "/api/private/utils/numbers/main/": 48 }, + "2019-03-01": { "/api/private/utils/numbers/main/": 86 }, + "2019-03-03": { "/api/v1/annotate/copyNumberAlterations": 86 }, + "2019-03-09": { "/api/private/utils/numbers/main/": 30 }, + "2019-03-10": { + "/api/v1/annotate/structuralVariants": 25, + "/api/private/search/typeahead": 93 + }, + "2019-03-12": { "/api/private/utils/numbers/main/": 36 }, + "2019-03-16": { "/api/private/search/typeahead": 85 }, + "2019-03-19": { "/api/private/utils/numbers/levels/": 93 }, + "2019-03-21": { + "/api/v1/annotate/structuralVariants": 100, + "/api/private/utils/numbers/levels/": 94 + }, + "2019-03-26": { "/api/private/search/typeahead": 19 }, + "2019-03-28": { "/api/private/utils/numbers/main/": 6 }, + "2019-03-30": { "/api/v1/annotate/copyNumberAlterations": 9 }, + "2019-04-03": { + "/api/private/search/typeahead": 20, + "/api/private/utils/numbers/levels/": 60, + "/api/private/utils/numbers/main/": 30 + }, + "2019-04-04": { "/api/private/utils/numbers/main/": 4 }, + "2019-04-06": { "/api/private/utils/numbers/levels/": 20 }, + "2019-04-09": { "/api/v1/annotate/mutations/byProteinChange": 71 }, + "2019-04-11": { "/api/private/utils/numbers/main/": 5 }, + "2019-04-19": { "/api/private/search/typeahead": 3 }, + "2019-04-30": { "/api/v1/annotate/mutations/byProteinChange": 65 }, + "2019-05-01": { "/api/private/utils/numbers/main/": 3 }, + "2019-05-02": { "/api/private/utils/numbers/levels/": 74 }, + "2019-05-19": { + "/api/private/utils/numbers/main/": 47, + "/api/v1/annotate/copyNumberAlterations": 87, + "/api/private/utils/numbers/levels/": 184 + }, + "2019-05-21": { + "/api/v1/annotate/copyNumberAlterations": 92, + "/api/private/utils/numbers/main/": 83 + }, + "2019-05-22": { "/api/v1/annotate/copyNumberAlterations": 67 }, + "2019-06-22": { "/api/v1/annotate/copyNumberAlterations": 29 }, + "2019-06-23": { "/api/v1/annotate/mutations/byProteinChange": 4 }, + "2019-07-05": { "/api/v1/annotate/mutations/byProteinChange": 84 }, + "2019-07-08": { "/api/private/search/typeahead": 10 }, + "2019-07-13": { + "/api/private/search/typeahead": 76, + "/api/v1/annotate/copyNumberAlterations": 23 + }, + "2019-07-25": { "/api/private/utils/numbers/levels/": 101 }, + "2019-08-01": { "/api/v1/annotate/copyNumberAlterations": 14 }, + "2019-08-03": { "/api/private/search/typeahead": 46 }, + "2019-08-20": { "/api/private/utils/numbers/levels/": 10 }, + "2019-08-22": { + "/api/v1/annotate/structuralVariants": 37, + "/api/private/utils/numbers/main/": 88 + }, + "2019-09-07": { "/api/v1/annotate/mutations/byProteinChange": 56 }, + "2019-09-13": { "/api/v1/annotate/mutations/byProteinChange": 25 }, + "2019-09-28": { "/api/v1/annotate/copyNumberAlterations": 17 }, + "2019-10-07": { "/api/private/search/typeahead": 25 }, + "2019-10-12": { + "/api/private/utils/numbers/levels/": 54, + "/api/v1/annotate/mutations/byProteinChange": 81 + }, + "2019-10-26": { "/api/v1/annotate/copyNumberAlterations": 80 }, + "2019-11-01": { "/api/v1/annotate/mutations/byProteinChange": 1 }, + "2019-11-03": { "/api/private/utils/numbers/levels/": 77 }, + "2019-11-06": { "/api/private/search/typeahead": 26 }, + "2019-11-08": { "/api/v1/annotate/structuralVariants": 47 }, + "2019-11-14": { "/api/private/utils/numbers/levels/": 46 }, + "2019-11-17": { "/api/v1/annotate/mutations/byProteinChange": 72 }, + "2019-11-18": { "/api/private/search/typeahead": 76 }, + "2019-11-27": { "/api/v1/annotate/copyNumberAlterations": 12 }, + "2019-11-29": { "/api/v1/annotate/mutations/byProteinChange": 62 }, + "2019-11-30": { "/api/private/utils/numbers/main/": 73 }, + "2019-12-01": { "/api/private/utils/numbers/main/": 7 }, + "2019-12-07": { + "/api/v1/annotate/mutations/byProteinChange": 23, + "/api/v1/annotate/structuralVariants": 13 + }, + "2019-12-08": { + "/api/private/utils/numbers/levels/": 24, + "/api/v1/annotate/copyNumberAlterations": 98 + }, + "2019-12-17": { "/api/private/utils/numbers/main/": 1 }, + "2019-12-19": { "/api/v1/annotate/structuralVariants": 27 }, + "2019-12-20": { "/api/private/utils/numbers/main/": 22 }, + "2019-12-23": { + "/api/private/utils/numbers/levels/": 32, + "/api/v1/annotate/mutations/byProteinChange": 15 + }, + "2019-12-25": { "/api/private/utils/numbers/levels/": 46 }, + "2019-12-26": { "/api/private/utils/numbers/levels/": 39 }, + "2019-12-27": { + "/api/v1/annotate/copyNumberAlterations": 100, + "/api/v1/annotate/mutations/byProteinChange": 78 + }, + "2018-01-05": { "/api/v1/annotate/mutations/byProteinChange": 50 }, + "2018-01-09": { "/api/v1/annotate/structuralVariants": 62 }, + "2018-01-11": { + "/api/v1/annotate/mutations/byProteinChange": 63, + "/api/v1/annotate/copyNumberAlterations": 94 + }, + "2018-01-15": { "/api/private/utils/numbers/main/": 63 }, + "2018-01-16": { "/api/private/utils/numbers/main/": 88 }, + "2018-01-17": { "/api/v1/annotate/structuralVariants": 79 }, + "2018-01-19": { "/api/v1/annotate/mutations/byProteinChange": 48 }, + "2018-01-21": { "/api/v1/annotate/structuralVariants": 82 }, + "2018-01-23": { "/api/v1/annotate/copyNumberAlterations": 99 }, + "2018-01-24": { "/api/v1/annotate/copyNumberAlterations": 14 }, + "2018-01-26": { "/api/private/utils/numbers/main/": 9 }, + "2018-02-02": { "/api/v1/annotate/structuralVariants": 80 }, + "2018-02-05": { "/api/private/search/typeahead": 66 }, + "2018-02-07": { "/api/v1/annotate/structuralVariants": 3 }, + "2018-02-15": { "/api/private/utils/numbers/main/": 64 }, + "2018-02-22": { + "/api/v1/annotate/structuralVariants": 17, + "/api/private/utils/numbers/levels/": 23 + }, + "2018-02-27": { "/api/private/search/typeahead": 77 }, + "2018-03-05": { + "/api/v1/annotate/structuralVariants": 42, + "/api/private/utils/numbers/levels/": 76 + }, + "2018-03-15": { "/api/private/utils/numbers/levels/": 49 }, + "2018-03-17": { "/api/private/utils/numbers/levels/": 67 }, + "2018-03-19": { "/api/private/utils/numbers/main/": 74 }, + "2018-03-26": { "/api/private/search/typeahead": 47 }, + "2018-03-29": { "/api/private/utils/numbers/main/": 80 }, + "2018-04-08": { "/api/v1/annotate/structuralVariants": 37 }, + "2018-04-10": { "/api/v1/annotate/copyNumberAlterations": 37 }, + "2018-04-15": { + "/api/private/utils/numbers/main/": 10, + "/api/v1/annotate/structuralVariants": 66 + }, + "2018-04-20": { "/api/private/utils/numbers/levels/": 67 }, + "2018-04-24": { "/api/v1/annotate/copyNumberAlterations": 48 }, + "2018-05-03": { "/api/v1/annotate/copyNumberAlterations": 31 }, + "2018-05-08": { "/api/v1/annotate/structuralVariants": 6 }, + "2018-05-15": { "/api/v1/annotate/structuralVariants": 10 }, + "2018-05-29": { "/api/private/search/typeahead": 44 }, + "2018-05-31": { "/api/v1/annotate/mutations/byProteinChange": 89 }, + "2018-06-05": { "/api/private/utils/numbers/levels/": 73 }, + "2018-06-12": { "/api/private/utils/numbers/levels/": 96 }, + "2018-06-20": { "/api/private/search/typeahead": 49 }, + "2018-06-24": { "/api/v1/annotate/mutations/byProteinChange": 45 }, + "2018-06-27": { "/api/v1/annotate/mutations/byProteinChange": 100 }, + "2018-07-02": { "/api/private/utils/numbers/main/": 11 }, + "2018-07-17": { "/api/v1/annotate/structuralVariants": 22 }, + "2018-07-18": { "/api/private/search/typeahead": 49 }, + "2018-07-22": { "/api/private/search/typeahead": 39 }, + "2018-07-24": { "/api/v1/annotate/structuralVariants": 58 }, + "2018-07-29": { "/api/private/utils/numbers/main/": 49 }, + "2018-08-17": { + "/api/private/utils/numbers/levels/": 65, + "/api/v1/annotate/copyNumberAlterations": 10 + }, + "2018-08-21": { "/api/v1/annotate/copyNumberAlterations": 32 }, + "2018-08-29": { "/api/private/search/typeahead": 3 }, + "2018-09-01": { + "/api/v1/annotate/copyNumberAlterations": 48, + "/api/private/utils/numbers/main/": 18 + }, + "2018-09-06": { "/api/private/utils/numbers/main/": 18 }, + "2018-09-28": { "/api/private/utils/numbers/main/": 78 }, + "2018-10-01": { "/api/v1/annotate/structuralVariants": 45 }, + "2018-10-05": { "/api/private/search/typeahead": 55 }, + "2018-10-17": { "/api/private/search/typeahead": 81 }, + "2018-10-20": { "/api/v1/annotate/structuralVariants": 1 }, + "2018-10-22": { + "/api/private/utils/numbers/main/": 32, + "/api/v1/annotate/mutations/byProteinChange": 48 + }, + "2018-10-29": { "/api/v1/annotate/mutations/byProteinChange": 99 }, + "2018-11-05": { "/api/private/utils/numbers/levels/": 25 }, + "2018-11-11": { "/api/private/utils/numbers/main/": 95 }, + "2018-11-13": { "/api/v1/annotate/structuralVariants": 2 }, + "2018-11-18": { "/api/v1/annotate/copyNumberAlterations": 25 }, + "2018-11-26": { "/api/private/search/typeahead": 96 }, + "2018-12-02": { "/api/private/utils/numbers/levels/": 10 }, + "2018-12-14": { "/api/v1/annotate/copyNumberAlterations": 19 }, + "2018-12-18": { "/api/private/search/typeahead": 15 }, + "2018-12-22": { "/api/private/search/typeahead": 7 }, + "2018-12-24": { "/api/v1/annotate/structuralVariants": 96 }, + "2018-12-26": { "/api/private/utils/numbers/main/": 83 }, + "2017-01-05": { "/api/v1/annotate/structuralVariants": 10 }, + "2017-01-08": { "/api/v1/annotate/copyNumberAlterations": 24 }, + "2017-01-10": { "/api/v1/annotate/copyNumberAlterations": 2 }, + "2017-01-29": { "/api/v1/annotate/mutations/byProteinChange": 54 }, + "2017-01-31": { "/api/v1/annotate/copyNumberAlterations": 45 }, + "2017-02-15": { "/api/private/utils/numbers/main/": 10 }, + "2017-02-17": { "/api/v1/annotate/mutations/byProteinChange": 25 }, + "2017-02-20": { "/api/private/utils/numbers/main/": 88 }, + "2017-02-21": { "/api/private/utils/numbers/levels/": 21 }, + "2017-02-22": { + "/api/private/search/typeahead": 99, + "/api/v1/annotate/structuralVariants": 19 + }, + "2017-03-07": { "/api/v1/annotate/structuralVariants": 14 }, + "2017-03-20": { + "/api/v1/annotate/copyNumberAlterations": 37, + "/api/v1/annotate/structuralVariants": 67 + }, + "2017-03-28": { + "/api/v1/annotate/structuralVariants": 2, + "/api/v1/annotate/copyNumberAlterations": 99 + }, + "2017-04-02": { "/api/v1/annotate/structuralVariants": 5 }, + "2017-04-07": { + "/api/private/utils/numbers/levels/": 13, + "/api/v1/annotate/structuralVariants": 83 + }, + "2017-04-09": { "/api/v1/annotate/structuralVariants": 16 }, + "2017-04-11": { + "/api/private/search/typeahead": 31, + "/api/v1/annotate/structuralVariants": 32, + "/api/private/utils/numbers/main/": 39 + }, + "2017-05-01": { "/api/private/utils/numbers/levels/": 42 }, + "2017-05-02": { "/api/private/search/typeahead": 7 }, + "2017-05-06": { "/api/v1/annotate/mutations/byProteinChange": 55 }, + "2017-05-08": { "/api/v1/annotate/mutations/byProteinChange": 68 }, + "2017-05-10": { "/api/private/utils/numbers/levels/": 57 }, + "2017-05-11": { "/api/v1/annotate/copyNumberAlterations": 85 }, + "2017-05-15": { "/api/v1/annotate/mutations/byProteinChange": 15 }, + "2017-05-20": { "/api/private/utils/numbers/levels/": 21 }, + "2017-05-29": { "/api/private/utils/numbers/main/": 11 }, + "2017-06-06": { "/api/v1/annotate/structuralVariants": 62 }, + "2017-06-09": { "/api/private/search/typeahead": 44 }, + "2017-06-13": { "/api/private/utils/numbers/main/": 44 }, + "2017-06-18": { + "/api/v1/annotate/mutations/byProteinChange": 46, + "/api/private/utils/numbers/main/": 94, + "/api/private/search/typeahead": 60 + }, + "2017-06-20": { "/api/v1/annotate/structuralVariants": 65 }, + "2017-06-28": { "/api/v1/annotate/structuralVariants": 28 }, + "2017-07-02": { "/api/private/utils/numbers/main/": 36 }, + "2017-07-08": { "/api/v1/annotate/mutations/byProteinChange": 32 }, + "2017-07-09": { "/api/v1/annotate/mutations/byProteinChange": 13 }, + "2017-07-27": { "/api/v1/annotate/copyNumberAlterations": 78 }, + "2017-07-30": { "/api/private/search/typeahead": 100 }, + "2017-08-03": { "/api/v1/annotate/copyNumberAlterations": 50 }, + "2017-08-04": { "/api/private/utils/numbers/main/": 7 }, + "2017-08-05": { "/api/private/search/typeahead": 28 }, + "2017-08-08": { "/api/v1/annotate/structuralVariants": 96 }, + "2017-09-19": { "/api/private/search/typeahead": 80 }, + "2017-09-23": { "/api/private/utils/numbers/levels/": 41 }, + "2017-09-24": { + "/api/private/utils/numbers/main/": 75, + "/api/private/utils/numbers/levels/": 62, + "/api/v1/annotate/mutations/byProteinChange": 10 + }, + "2017-09-28": { + "/api/v1/annotate/copyNumberAlterations": 3, + "/api/v1/annotate/structuralVariants": 50, + "/api/private/utils/numbers/main/": 9 + }, + "2017-10-01": { + "/api/v1/annotate/copyNumberAlterations": 79, + "/api/private/utils/numbers/levels/": 64 + }, + "2017-10-06": { "/api/private/search/typeahead": 68 }, + "2017-10-10": { "/api/private/utils/numbers/levels/": 34 }, + "2017-10-17": { "/api/v1/annotate/structuralVariants": 10 }, + "2017-10-21": { "/api/private/utils/numbers/levels/": 96 }, + "2017-11-07": { "/api/v1/annotate/copyNumberAlterations": 60 }, + "2017-11-09": { "/api/private/search/typeahead": 83 }, + "2017-11-15": { + "/api/private/utils/numbers/main/": 42, + "/api/v1/annotate/copyNumberAlterations": 63 + }, + "2017-11-29": { "/api/v1/annotate/structuralVariants": 10 }, + "2017-12-06": { "/api/private/utils/numbers/levels/": 56 }, + "2017-12-22": { "/api/v1/annotate/copyNumberAlterations": 6 } } - } + }, + "userFirstName": "j", + "userLastName": "0doe", + "userEmail": "0doej@FakeCo.com", + "licenseType": "Research Use in an Academic Setting", + "jobTitle": "0doe Job Title", + "company": "FakeCo" +} diff --git a/src/main/docker/smtp-server.yml b/src/main/docker/smtp-server.yml new file mode 100644 index 000000000..8e65e8fd7 --- /dev/null +++ b/src/main/docker/smtp-server.yml @@ -0,0 +1,14 @@ +version: '3' + +services: + fake-smtp-server: + image: gessnerfl/fake-smtp-server:2.2.1 + hostname: 'fake-smtp-server' + restart: always + environment: + - FAKESMTP_AUTHENTICATION_USERNAME=myuser + - FAKESMTP_AUTHENTICATION_PASSWORD=mysecretpassword + ports: + - 8025:8025 #expose smtp port + - 8082:8080 #expose web ui + - 8081:8081 #expose management api diff --git a/src/main/java/org/mskcc/cbio/oncokb/config/SecurityConfiguration.java b/src/main/java/org/mskcc/cbio/oncokb/config/SecurityConfiguration.java index 421dd6175..86ffb9569 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/config/SecurityConfiguration.java +++ b/src/main/java/org/mskcc/cbio/oncokb/config/SecurityConfiguration.java @@ -54,6 +54,7 @@ public void configure(WebSecurity web) { StrictHttpFirewall firewall = new StrictHttpFirewall(); firewall.setAllowUrlEncodedSlash(true); + firewall.setAllowUrlEncodedPercent(true); web.httpFirewall(firewall); } diff --git a/src/main/java/org/mskcc/cbio/oncokb/config/Swagger2Config.java b/src/main/java/org/mskcc/cbio/oncokb/config/Swagger2Config.java index b2b146406..3002fb8ea 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/config/Swagger2Config.java +++ b/src/main/java/org/mskcc/cbio/oncokb/config/Swagger2Config.java @@ -34,6 +34,7 @@ public Swagger2Config(ApplicationProperties applicationProperties) { @Bean public Docket swaggerSpringfoxApiDocket() { return new Docket(DocumentationType.SWAGGER_2) + .forCodeGeneration(true) .groupName("default") .select() .apis(RequestHandlerSelectors diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/CronJobController.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/CronJobController.java index 6fe3a6089..c9e25b959 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/CronJobController.java +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/CronJobController.java @@ -187,19 +187,6 @@ public void moveTokenStatsToS3() throws IOException { log.info("Finished the cronjob to move token stats to s3."); } - private void calculateUsageSummary(UsageSummary usageSummary, String key, int count, String time) { - // Deal with year summary - usageSummary.getYear().put(key, usageSummary.getYear().getOrDefault(key, Long.valueOf(0)) + count); - // Deal with month summary - if (!usageSummary.getMonth().containsKey(time)) { - usageSummary.getMonth().put(time, new JSONObject()); - } - if (!usageSummary.getMonth().get(time).containsKey(key)) { - usageSummary.getMonth().get(time).put(key, new Integer(0)); - } - usageSummary.getMonth().get(time).put(key, (Integer) usageSummary.getMonth().get(time).get(key) + (Integer) count); - } - /** * {@code GET /check-trial-accounts} : Check the status of trial accounts */ diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisController.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisController.java index 06ee5e3ef..1c9854473 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisController.java +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisController.java @@ -1,312 +1,475 @@ package org.mskcc.cbio.oncokb.web.rest; +import static org.mskcc.cbio.oncokb.config.Constants.*; + +import com.google.gson.Gson; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.time.Clock; +import java.time.Period; +import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.time.temporal.ChronoUnit; import java.util.*; +import java.util.AbstractMap.SimpleEntry; import java.util.stream.Collectors; - -import com.google.gson.Gson; - -import software.amazon.awssdk.core.ResponseInputStream; -import software.amazon.awssdk.services.s3.model.GetObjectResponse; - +import javax.validation.constraints.NotNull; +import org.json.simple.JSONObject; +import org.json.simple.parser.JSONParser; +import org.json.simple.parser.ParseException; import org.mskcc.cbio.oncokb.config.Constants; import org.mskcc.cbio.oncokb.domain.User; import org.mskcc.cbio.oncokb.domain.enumeration.FileExtension; +import org.mskcc.cbio.oncokb.service.S3Service; +import org.mskcc.cbio.oncokb.service.UserService; import org.mskcc.cbio.oncokb.service.dto.UserDTO; import org.mskcc.cbio.oncokb.service.mapper.UserMapper; import org.mskcc.cbio.oncokb.util.TimeUtil; -import org.springframework.beans.factory.annotation.Autowired; -import org.springframework.http.HttpStatus; -import org.mskcc.cbio.oncokb.service.S3Service; -import org.mskcc.cbio.oncokb.service.UserService; import org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis.UsageSummary; import org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis.UserOverviewUsage; +import org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis.UserStats; import org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis.UserUsage; -import org.json.simple.JSONObject; -import org.json.simple.parser.JSONParser; -import org.json.simple.parser.ParseException; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.http.HttpStatus; import org.springframework.http.ResponseEntity; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; - -import javax.validation.constraints.NotNull; - -import static org.mskcc.cbio.oncokb.config.Constants.*; +import software.amazon.awssdk.core.ResponseInputStream; +import software.amazon.awssdk.services.s3.model.GetObjectResponse; @Controller @RequestMapping("/api") public class UsageAnalysisController { - @Autowired - private S3Service s3Service; + @Autowired + private S3Service s3Service; - @Autowired - private UserService userService; + @Autowired + private UserService userService; - @Autowired - private UserMapper userMapper; + @Autowired + private UserMapper userMapper; - @Autowired - private Clock clock; + @Autowired + private Clock clock; - private JSONObject requestData(String file) - throws UnsupportedEncodingException, IOException, ParseException { - Optional> s3object = s3Service.getObject(Constants.ONCOKB_S3_BUCKET, file); - if (s3object.isPresent()){ - ResponseInputStream inputStream = s3object.get(); - JSONParser jsonParser = new JSONParser(); - return (JSONObject) jsonParser.parse(new InputStreamReader(inputStream, "UTF-8")); - } - return null; + private JSONObject requestData(String file) + throws UnsupportedEncodingException, IOException, ParseException { + Optional> s3object = s3Service.getObject( + Constants.ONCOKB_S3_BUCKET, + file + ); + if (s3object.isPresent()) { + ResponseInputStream inputStream = s3object.get(); + JSONParser jsonParser = new JSONParser(); + return (JSONObject) jsonParser.parse( + new InputStreamReader(inputStream, "UTF-8") + ); } + return null; + } - /** - * API to get the detail usage info for specific user - * @param userId - * @return user usage information of given user - * @throws IOException - * @throws ParseException - */ - @GetMapping("/usage/users/{userId}") - public ResponseEntity userUsageGet(@PathVariable @NotNull Long userId) - throws IOException, ParseException { - HttpStatus status = HttpStatus.OK; - - if (userId != null) { - int year = TimeUtil.getCurrentNYTime(clock).getYear(); - JSONObject yearSummary = requestData(YEAR_USERS_USAGE_SUMMARY_FILE_PREFIX + year + FileExtension.JSON_FILE.getExtension()); - Map monthSummaries = new HashMap<>(); - int monthsBack = 0; - JSONObject monthSummary; - do { - String month = TimeUtil.getCurrentNYTime(clock).minus(monthsBack, ChronoUnit.MONTHS).format(DateTimeFormatter.ofPattern("yyyy-MM")); - monthSummary = requestData(MONTH_USERS_USAGE_SUMMARY_FILE_PREFIX + month + FileExtension.JSON_FILE.getExtension()); - if (monthSummary != null) { - monthSummaries.put(month, monthSummary); - } - monthsBack++; - } while (monthsBack < 12); - - Optional user = userService.getUserById(userId); - String email = user.map(User::getEmail).orElse(null); - - if (yearSummary != null){ - UsageSummary usageSummary = new UsageSummary(); - if (yearSummary.containsKey(email)) { - JSONObject yearUsageObject = (JSONObject) yearSummary.get(email); - Gson gson = new Gson(); - usageSummary = gson.fromJson(yearUsageObject.toString(), UsageSummary.class); - if (!monthSummaries.isEmpty()) { - Map dayUsage = new HashMap<>(); - Map monthUsage = new HashMap<>(); - for (Map.Entry entry : monthSummaries.entrySet()) { - if (entry.getValue().containsKey(email)) { - JSONObject userUsageObject = (JSONObject) entry.getValue().get(email); - JSONObject dayUsageObject = (JSONObject) userUsageObject.get("day"); - dayUsageObject.forEach((day, summary) -> dayUsage.put((String) day, (JSONObject) summary)); - JSONObject monthUsageObject = (JSONObject) userUsageObject.get("month"); - monthUsage.put((String) entry.getKey(), monthUsageObject); - } - } - usageSummary.setDay(dayUsage); - usageSummary.setMonth(monthUsage); - } - } + private Map getMonthSummaries(String filePrefix) + throws UnsupportedEncodingException, IOException, ParseException { + Map monthSummaries = new HashMap<>(); - UserUsage userUsage = new UserUsage(); - userUsage.setUserFirstName(user.get().getFirstName()); - userUsage.setUserLastName(user.get().getLastName()); - userUsage.setUserEmail(email); - userUsage.setLicenseType(Objects.nonNull(userMapper.userToUserDTO(user.get()).getLicenseType()) ? userMapper.userToUserDTO(user.get()).getLicenseType().getName() : null); - userUsage.setJobTitle(userMapper.userToUserDTO(user.get()).getJobTitle()); - userUsage.setCompany(userMapper.userToUserDTO(user.get()).getCompanyName()); - userUsage.setSummary(usageSummary); - return new ResponseEntity(userUsage, status); - } + ZonedDateTime today = TimeUtil.getCurrentNYTime(clock); + ZonedDateTime startDate = today.minusYears(3).withDayOfYear(1).minusDays(1); + + long totalMonthsToGoBack = Period + .between(startDate.toLocalDate(), today.toLocalDate()) + .toTotalMonths(); + + for (long monthsBack = 0; monthsBack < totalMonthsToGoBack; monthsBack++) { + String month = today + .minus(monthsBack, ChronoUnit.MONTHS) + .format(DateTimeFormatter.ofPattern("yyyy-MM")); + + JSONObject monthSummary = requestData( + filePrefix + month + FileExtension.JSON_FILE.getExtension() + ); + + if (monthSummary != null) { + monthSummaries.put(month, monthSummary); + } + } + return monthSummaries; + } + + private Map getYearSummaries(String yearFilePrefix) + throws UnsupportedEncodingException, IOException, ParseException { + Map yearSummaries = new HashMap<>(); + + ZonedDateTime today = TimeUtil.getCurrentNYTime(clock); + + for (long yearsBack = 0; yearsBack < 4; yearsBack++) { + String year = today + .minus(yearsBack, ChronoUnit.YEARS) + .format(DateTimeFormatter.ofPattern("yyyy")); + + JSONObject yearSummary = requestData( + yearFilePrefix + year + FileExtension.JSON_FILE.getExtension() + ); + + if (yearSummary != null) { + yearSummaries.put(year, yearSummary); + } + } + return yearSummaries; + } + + public Map getUserSummaries() + throws UnsupportedEncodingException, IOException, ParseException { + Map months = getMonthSummaries( + MONTH_USERS_USAGE_SUMMARY_FILE_PREFIX + ); + Map years = getYearSummaries( + YEAR_USERS_USAGE_SUMMARY_FILE_PREFIX + ); + Map userData = new HashMap<>(); + + Set users = new HashSet<>(); + + for (Map.Entry entry : years.entrySet()) { + users.addAll(entry.getValue().keySet()); + } + + String yearKey = "year"; + String monthKey = "month"; + String dayKey = "day"; + for (String user : users) { + userData.put(user, new UsageSummary()); + } + for (Map.Entry yearEntry : years.entrySet()) { + String year = yearEntry.getKey(); + for (Object rawUserEntry : yearEntry.getValue().entrySet()) { + Map.Entry userEntry = (Map.Entry) rawUserEntry; + String user = userEntry.getKey(); + UsageSummary userMap = userData.get(user); + if (userMap == null) { + break; + } + Map> yearMap = userMap.getYear(); + Map> monthMap = userMap.getMonth(); + yearMap.put(year, (JSONObject) userEntry.getValue().get(yearKey)); + JSONObject monthJson = (JSONObject) userEntry.getValue().get(monthKey); + for (Object rawMonthEntry : monthJson.entrySet()) { + Map.Entry monthEntry = (Map.Entry) rawMonthEntry; + String month = monthEntry.getKey(); + monthMap.put(month, monthEntry.getValue()); + } + } + } + for (Map.Entry monthEntry : months.entrySet()) { + for (Object rawUserEntry : monthEntry.getValue().entrySet()) { + Map.Entry userEntry = (Map.Entry) rawUserEntry; + String user = userEntry.getKey(); + UsageSummary userMap = userData.get(user); + if (userMap == null) { + break; } + Map> dayMap = userMap.getDay(); + JSONObject dayJson = (JSONObject) userEntry.getValue().get(dayKey); + for (Object rawDayEntry : dayJson.entrySet()) { + Map.Entry dayEntry = (Map.Entry) rawDayEntry; + String day = dayEntry.getKey(); + dayMap.put(day, dayEntry.getValue()); + } + } + } + return userData; + } + + public UsageSummary getResourceSummaries() + throws IOException, ParseException { + Map months = getMonthSummaries( + MONTH_RESOURCES_USAGE_SUMMARY_FILE_PREFIX + ); + Map years = getYearSummaries( + YEAR_RESOURCES_USAGE_SUMMARY_FILE_PREFIX + ); + UsageSummary resourceData = new UsageSummary(); + String yearKey = "year"; + String monthKey = "month"; + String dayKey = "day"; - return new ResponseEntity(new UserUsage(), status); + for (Map.Entry yearEntry : years.entrySet()) { + String year = yearEntry.getKey(); + Map> yearMap = resourceData.getYear(); + Map> monthMap = resourceData.getMonth(); + yearMap.put(year, (JSONObject) yearEntry.getValue().get(yearKey)); + JSONObject monthJson = (JSONObject) yearEntry.getValue().get(monthKey); + for (Object rawMonthEntry : monthJson.entrySet()) { + Map.Entry monthEntry = (Map.Entry) rawMonthEntry; + String month = monthEntry.getKey(); + monthMap.put(month, monthEntry.getValue()); + } } + for (Map.Entry monthEntry : months.entrySet()) { + Map> dayMap = resourceData.getDay(); + JSONObject dayJson = (JSONObject) monthEntry.getValue().get(dayKey); + for (Object rawDayEntry : dayJson.entrySet()) { + Map.Entry dayEntry = (Map.Entry) rawDayEntry; + String day = dayEntry.getKey(); + dayMap.put(day, dayEntry.getValue()); + } + } + return resourceData; + } - /** - * API to get the usage summary of all users - * @param companyId - * @return a list of all users usage summary - * @throws IOException - * @throws ParseException - */ - @GetMapping("/usage/summary/users") - public ResponseEntity> userOverviewUsageGet(@RequestParam(required = false) Long companyId) - throws IOException, ParseException { - HttpStatus status = HttpStatus.OK; - - int year = TimeUtil.getCurrentNYTime(clock).getYear(); - JSONObject yearSummary = requestData(YEAR_USERS_USAGE_SUMMARY_FILE_PREFIX + year + FileExtension.JSON_FILE.getExtension()); - Map monthSummaries = new HashMap<>(); - int monthsBack = 0; - JSONObject monthSummary; - do { - String month = TimeUtil.getCurrentNYTime(clock).minus(monthsBack, ChronoUnit.MONTHS).format(DateTimeFormatter.ofPattern("yyyy-MM")); - monthSummary = requestData(MONTH_USERS_USAGE_SUMMARY_FILE_PREFIX + month + FileExtension.JSON_FILE.getExtension()); - if (monthSummary != null) { - monthSummaries.put(month, monthSummary); - } - monthsBack++; - } while (monthsBack < 12); - - List result = new ArrayList<>(); - if (yearSummary != null) { - Set emailSet = yearSummary.keySet(); - if (companyId != null) { - emailSet = emailSet.stream().filter(item -> { - Optional user = userService.getUserWithAuthoritiesByEmailIgnoreCase((String) item); - if (user.isPresent()) { - UserDTO userDTO = userMapper.userToUserDTO(user.get()); - if (userDTO.getCompany() != null) { - return Objects.equals(userDTO.getCompany().getId(), companyId); - } - } - return false; - }).collect(Collectors.toSet()); - } - for (Object item : emailSet) { - String email = (String) item; - JSONObject usageObject = (JSONObject) yearSummary.get(email); - Gson gson = new Gson(); - UsageSummary usageSummary = gson.fromJson(usageObject.toString(), UsageSummary.class); - UserOverviewUsage cur = new UserOverviewUsage(); - cur.setUserEmail(email); - Optional user = userService.getUserWithAuthoritiesByEmailIgnoreCase(email); - cur.setUserId(user.map(value -> value.getId().toString()).orElse(null)); - - String endpoint = ""; - long maxUsage = 0; - String noPrivateEndpoint = ""; - long noPrivateMaxUsage = 0; - long totalUsage = 0; - Map summary = usageSummary.getYear(); - for (String resource : summary.keySet()) { - totalUsage += summary.get(resource); - if (summary.get(resource) > maxUsage) { - endpoint = resource; - maxUsage = summary.get(resource); - } - if (resource.indexOf("/private/") == -1) { - if (summary.get(resource) > noPrivateMaxUsage) { - noPrivateEndpoint = resource; - noPrivateMaxUsage = summary.get(resource); - } - } - } - cur.setTotalUsage(totalUsage); - cur.setEndpoint(endpoint); - cur.setMaxUsageProportion((int) (1000 * ((float) maxUsage / totalUsage)) / 10f); - cur.setNoPrivateEndpoint(noPrivateEndpoint); - cur.setNoPrivateMaxUsageProportion((int) (1000 * ((float) noPrivateMaxUsage / totalUsage)) / 10f); - - Map dayUsage = new HashMap<>(); - Map monthUsage = new HashMap<>(); - if (!monthSummaries.isEmpty()) { - for (Map.Entry entry : monthSummaries.entrySet()) { - if (entry.getValue().containsKey(email)) { - JSONObject monthUsageObject = (JSONObject) entry.getValue().get(email); - long monthCount = 0; - JSONObject dayUsageObject = (JSONObject) monthUsageObject.get("day"); - for (Object dayKey : dayUsageObject.keySet()) { - String day = dayKey.toString(); - JSONObject curDayUsage = (JSONObject) dayUsageObject.get(day); - long dayCount = 0; - for (Object resource : curDayUsage.keySet()) { - dayCount += (long) curDayUsage.get(resource); - monthCount += (long) curDayUsage.get(resource); - } - dayUsage.put(day, dayCount); - } - monthUsage.put(entry.getKey(), monthCount); - } - } - } - cur.setDayUsage(dayUsage); - cur.setMonthUsage(monthUsage); + /** + * API to get the detail usage info for specific user + * @param userId + * @return user usage information of given user + * @throws IOException + * @throws ParseException + */ + @GetMapping("/usage/users/{userId}") + public ResponseEntity userUsageGet( + @PathVariable @NotNull Long userId + ) + throws IOException, ParseException { + if (userId != null) { + Map userSummaries = getUserSummaries(); + + Optional user = userService.getUserById(userId); + String email = user.map(User::getEmail).orElse(null); + + UsageSummary usageSummary = userSummaries.getOrDefault( + email, + new UsageSummary() + ); - result.add(cur); + UserUsage userUsage = new UserUsage(); + userUsage.setUserFirstName(user.get().getFirstName()); + userUsage.setUserLastName(user.get().getLastName()); + userUsage.setUserEmail(email); + userUsage.setLicenseType( + Objects.nonNull(userMapper.userToUserDTO(user.get()).getLicenseType()) + ? userMapper.userToUserDTO(user.get()).getLicenseType().getName() + : null + ); + userUsage.setJobTitle(userMapper.userToUserDTO(user.get()).getJobTitle()); + userUsage.setCompany( + userMapper.userToUserDTO(user.get()).getCompanyName() + ); + userUsage.setSummary(usageSummary); + return new ResponseEntity<>(userUsage, HttpStatus.OK); + } + + return new ResponseEntity<>(new UserUsage(), HttpStatus.OK); + } + + /** + * API to get the usage summary of all users + * @param companyId + * @return a list of all users usage summary + * @throws IOException + * @throws ParseException + */ + @GetMapping("/usage/summary/users") + public ResponseEntity> userOverviewUsageGet( + @RequestParam(required = false) Long companyId + ) + throws IOException, ParseException { + Map usageSummaries = getUserSummaries(); + List result = new ArrayList<>(); + Set emailSet = usageSummaries.keySet(); + if (companyId != null) { + emailSet = + emailSet + .stream() + .filter( + item -> { + Optional user = userService.getUserWithAuthoritiesByEmailIgnoreCase( + item + ); + if (user.isPresent()) { + UserDTO userDTO = userMapper.userToUserDTO(user.get()); + if (userDTO.getCompany() != null) { + return Objects.equals( + userDTO.getCompany().getId(), + companyId + ); + } + } + return false; } - } + ) + .collect(Collectors.toSet()); + } + for (String email : emailSet) { + UsageSummary usageSummary = usageSummaries.get(email); + UserOverviewUsage userOverviewUsage = new UserOverviewUsage(); + userOverviewUsage.setUserEmail(email); + Optional user = userService.getUserWithAuthoritiesByEmailIgnoreCase( + email + ); + userOverviewUsage.setUserId( + user.map(value -> value.getId().toString()).orElse(null) + ); - return new ResponseEntity>(result, status); + Map dayUsage = getStats(usageSummary.getDay()); + Map monthUsage = getStats(usageSummary.getMonth()); + Map yearUsage = getStats(usageSummary.getYear()); + userOverviewUsage.setDayUsage(dayUsage); + userOverviewUsage.setMonthUsage(monthUsage); + userOverviewUsage.setYearUsage(yearUsage); + + result.add(userOverviewUsage); } - /** - * API to return the usage summary of all resources - * @return Usage summary of all resources - * @throws IOException - * @throws ParseException - */ - @GetMapping("/usage/summary/resources") - public ResponseEntity resourceUsageGet() - throws IOException, ParseException { - HttpStatus status = HttpStatus.OK; - - int year = TimeUtil.getCurrentNYTime(clock).getYear(); - JSONObject jsonObject = requestData(YEAR_RESOURCES_USAGE_SUMMARY_FILE_PREFIX + year + FileExtension.JSON_FILE.getExtension()); - - Gson gson = new Gson(); - UsageSummary summary = new UsageSummary(); - if (jsonObject != null) { - summary = gson.fromJson(jsonObject.toString(), UsageSummary.class); + return new ResponseEntity<>(result, HttpStatus.OK); + } + + private Map getStats( + Map> usageObject + ) { + Map usage = new HashMap<>(); + for (Map.Entry> entry : usageObject.entrySet()) { + UserStats userStats = new UserStats(); + Map periodResourceUsage = entry.getValue(); + + long totalUsageForPeriod = periodResourceUsage + .values() + .stream() + .mapToLong(Long::longValue) + .sum(); + + long totalPublicUsageForPeriod = periodResourceUsage + .entrySet() + .stream() + .filter(x -> !x.getKey().startsWith("/api/private/")) + .mapToLong(x -> x.getValue()) + .sum(); + + Map.Entry maxResourceEntry = periodResourceUsage + .entrySet() + .stream() + .max(Map.Entry.comparingByValue()) + .orElse(new SimpleEntry("", 0L)); + + Map.Entry maxPublicResourceEntry = periodResourceUsage + .entrySet() + .stream() + .filter(x -> !x.getKey().startsWith("/api/private/")) + .max(Map.Entry.comparingByValue()) + .orElse(new SimpleEntry("", 0L)); + + String endpoint = maxResourceEntry.getKey(); + long maxUsage = maxResourceEntry.getValue(); + + String publicEndpoint = maxPublicResourceEntry.getKey(); + long publicMaxUsage = maxPublicResourceEntry.getValue(); + + userStats.setTotalUsage(totalUsageForPeriod); + userStats.setTotalPublicUsage(totalPublicUsageForPeriod); + userStats.setMostUsedEndpoint(endpoint); + userStats.setMaxUsageProportion( + (int) (1000 * ((float) maxUsage / totalUsageForPeriod)) / 10f + ); + userStats.setMostUsedPublicEndpoint(publicEndpoint); + userStats.setPublicMaxUsageProportion( + (int) (1000 * ((float) publicMaxUsage / totalPublicUsageForPeriod)) / + 10f + ); + usage.put(entry.getKey(), userStats); + } + return usage; + } + + /** + * API to return the usage summary of all resources + * @return Usage summary of all resources + * @throws IOException + * @throws ParseException + */ + @GetMapping("/usage/summary/resources") + public ResponseEntity resourceUsageGet() + throws IOException, ParseException { + UsageSummary summary = getResourceSummaries(); + return new ResponseEntity<>(summary, HttpStatus.OK); + } + + /** + * API to get the usage of a specific resource + * @param endpoint + * @return usage of a specific endpoint + * @throws UnsupportedEncodingException + * @throws IOException + * @throws ParseException + */ + @GetMapping("/usage/resources") + public ResponseEntity resourceDetailGet( + @RequestParam String endpoint + ) + throws UnsupportedEncodingException, IOException, ParseException { + Map userSummaries = getUserSummaries(); + + UsageSummary resourceDetail = new UsageSummary(); + Map> yearResourceDetail = new HashMap<>(); + Map> monthResourceDetail = new HashMap<>(); + Map> dayResourceDetail = new HashMap<>(); + resourceDetail.setYear(yearResourceDetail); + resourceDetail.setMonth(monthResourceDetail); + resourceDetail.setDay(dayResourceDetail); + + for (Map.Entry userEntry : userSummaries.entrySet()) { + String user = userEntry.getKey(); + UsageSummary userUsageSummary = userEntry.getValue(); + boolean containsEndpoint = false; + for (Map endpointUsage : userUsageSummary + .getYear() + .values()) { + if (endpointUsage.containsKey(endpoint)) { + containsEndpoint = true; + break; } - return new ResponseEntity(summary, status); + } + if (containsEndpoint) { + addUserUsage( + user, + endpoint, + yearResourceDetail, + userUsageSummary.getYear() + ); + addUserUsage( + user, + endpoint, + monthResourceDetail, + userUsageSummary.getMonth() + ); + addUserUsage( + user, + endpoint, + dayResourceDetail, + userUsageSummary.getDay() + ); + } } + return new ResponseEntity<>(resourceDetail, HttpStatus.OK); + } - /** - * API to get the usage of a specific resource - * @param endpoint - * @return usage of a specific endpoint - * @throws UnsupportedEncodingException - * @throws IOException - * @throws ParseException - */ - @GetMapping("/usage/resources") - public ResponseEntity resourceDetailGet(@RequestParam String endpoint) - throws UnsupportedEncodingException, IOException, ParseException { - HttpStatus status = HttpStatus.OK; - - int year = TimeUtil.getCurrentNYTime(clock).getYear(); - JSONObject resourceSummary = requestData(YEAR_RESOURCES_USAGE_SUMMARY_FILE_PREFIX + year + FileExtension.JSON_FILE.getExtension()); - JSONObject userSummary = requestData(YEAR_USERS_USAGE_SUMMARY_FILE_PREFIX + year + FileExtension.JSON_FILE.getExtension()); - if (resourceSummary != null && userSummary != null ){ - Gson gson = new Gson(); - UsageSummary resourceUsageSummary = gson.fromJson(resourceSummary.toString(), UsageSummary.class); - if (resourceUsageSummary.getYear().containsKey(endpoint)) { - UsageSummary resourceDetail = new UsageSummary(); - Map monthResourceDetail = new HashMap<>(); - userSummary.keySet().forEach(user -> - { - UsageSummary userUsageSummary = gson.fromJson(userSummary.get(user.toString()).toString(), UsageSummary.class); - long yearUsage = 0; - for (String month : userUsageSummary.getMonth().keySet()){ - if (userUsageSummary.getMonth().get(month).containsKey(endpoint)) { - int monthUsage = (int) Double.parseDouble(userUsageSummary.getMonth().get(month).get(endpoint).toString()); - if (!monthResourceDetail.containsKey(month)) - monthResourceDetail.put(month, new JSONObject()); - monthResourceDetail.get(month).put(user, monthUsage); - yearUsage += monthUsage; - } - } - resourceDetail.getYear().put(user.toString(), yearUsage); - }); - resourceDetail.setMonth(monthResourceDetail); - return new ResponseEntity(resourceDetail, status); - } + private void addUserUsage( + String user, + String endpoint, + Map> resourceDetail, + Map> summary + ) { + for (Map.Entry> entry : summary.entrySet()) { + String key = entry.getKey(); + Map map = entry.getValue(); + if (map.containsKey(endpoint)) { + long usage = map.get(endpoint); + if (!resourceDetail.containsKey(key)) { + resourceDetail.put(key, new HashMap<>()); } - return new ResponseEntity<>(new UsageSummary(), status); + resourceDetail.get(key).put(user, usage); + } } + } } diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/ResourceModel.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/ResourceModel.java deleted file mode 100644 index ddd5ab9b3..000000000 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/ResourceModel.java +++ /dev/null @@ -1,20 +0,0 @@ -package org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis; - -public class ResourceModel { - - String method; - String endpoint; - - public ResourceModel(String s){ - this.method = s.split(" ")[0]; - this.endpoint = s.split(" ")[1].replaceAll("\\%20", ""); - } - - public String getMethod(){ - return method; - } - - public String getEndpoint(){ - return endpoint; - } -} diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UsageSummary.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UsageSummary.java index c82202fe4..a35f8cb21 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UsageSummary.java +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UsageSummary.java @@ -1,42 +1,36 @@ package org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis; -import org.json.simple.JSONObject; - -import java.util.Map; import java.util.HashMap; - -/** - * Created by Yifu Yao on 2020-10-28 - */ +import java.util.Map; public class UsageSummary { - private Map day = new HashMap<>(); - private Map month = new HashMap<>(); - private Map year = new HashMap<>(); + private Map> day = new HashMap<>(); - public Map getDay() { - return day; - } + private Map> month = new HashMap<>(); - public void setDay(Map day) { - this.day = day; - } + private Map> year = new HashMap<>(); - public Map getMonth() { - return month; - } + public Map> getDay() { + return day; + } - public void setMonth(Map month) { - this.month = month; - } + public void setDay(Map> day) { + this.day = day; + } - public Map getYear() { - return year; - } + public Map> getMonth() { + return month; + } - public void setYear(Map year) { - this.year = year; - } + public void setMonth(Map> month) { + this.month = month; + } + public Map> getYear() { + return year; + } + public void setYear(Map> year) { + this.year = year; + } } diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserOverviewUsage.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserOverviewUsage.java index 3696b48a4..21d7eb782 100644 --- a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserOverviewUsage.java +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserOverviewUsage.java @@ -2,91 +2,50 @@ import java.util.Map; -/** - * Created by Yifu Yao on 2020-11-2 - */ - public class UserOverviewUsage { - private String userId; - private String userEmail; - private String endpoint; - private String noPrivateEndpoint; - private float maxUsageProportion; - private float noPrivateMaxUsageProportion; - private long totalUsage; - private Map dayUsage; - private Map monthUsage; - - public String getEndpoint() { - return endpoint; - } - - public void setEndpoint(String endpoint) { - this.endpoint = endpoint; - } - - public String getUserEmail() { - return userEmail; - } - - public void setUserEmail(String userEmail) { - this.userEmail = userEmail; - } - - public float getMaxUsageProportion() { - return maxUsageProportion; - } - - public void setMaxUsageProportion(float maxUsageProportion) { - this.maxUsageProportion = maxUsageProportion; - } - - public long getTotalUsage() { - return totalUsage; - } - - public void setTotalUsage(long totalUsage) { - this.totalUsage = totalUsage; - } - - public String getUserId() { - return userId; - } - - public void setUserId(String userId) { - this.userId = userId; - } - - public String getNoPrivateEndpoint() { - return noPrivateEndpoint; - } - - public void setNoPrivateEndpoint(String noPrivateEndpoint) { - this.noPrivateEndpoint = noPrivateEndpoint; - } - - public float getNoPrivateMaxUsageProportion() { - return noPrivateMaxUsageProportion; - } - - public void setNoPrivateMaxUsageProportion(float noPrivateMaxUsageProportion) { - this.noPrivateMaxUsageProportion = noPrivateMaxUsageProportion; - } - - public Map getDayUsage() { - return dayUsage; - } - - public void setDayUsage(Map dayUsage) { - this.dayUsage = dayUsage; - } - - public Map getMonthUsage() { - return monthUsage; - } - - public void setMonthUsage(Map monthUsage) { - this.monthUsage = monthUsage; - } + private String userId; + private String userEmail; + private Map dayUsage; + private Map monthUsage; + private Map yearUsage; + + public String getUserId() { + return userId; + } + + public void setUserId(String userId) { + this.userId = userId; + } + + public String getUserEmail() { + return userEmail; + } + + public void setUserEmail(String userEmail) { + this.userEmail = userEmail; + } + + public Map getDayUsage() { + return dayUsage; + } + + public void setDayUsage(Map dayUsage) { + this.dayUsage = dayUsage; + } + + public Map getMonthUsage() { + return monthUsage; + } + + public void setMonthUsage(Map monthUsage) { + this.monthUsage = monthUsage; + } + + public Map getYearUsage() { + return yearUsage; + } + + public void setYearUsage(Map yearUsage) { + this.yearUsage = yearUsage; + } } - diff --git a/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserStats.java b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserStats.java new file mode 100644 index 000000000..28b98af3f --- /dev/null +++ b/src/main/java/org/mskcc/cbio/oncokb/web/rest/vm/usageAnalysis/UserStats.java @@ -0,0 +1,58 @@ +package org.mskcc.cbio.oncokb.web.rest.vm.usageAnalysis; + +public class UserStats { + private String mostUsedEndpoint; + private String mostUsedPublicEndpoint; + private float maxUsageProportion; + private float publicMaxUsageProportion; + private long totalUsage; + private long totalPublicUsage; + + public String getMostUsedEndpoint() { + return mostUsedEndpoint; + } + + public void setMostUsedEndpoint(String mostUsedEndpoint) { + this.mostUsedEndpoint = mostUsedEndpoint; + } + + public String getMostUsedPublicEndpoint() { + return mostUsedPublicEndpoint; + } + + public void setMostUsedPublicEndpoint(String mostUsedPublicEndpoint) { + this.mostUsedPublicEndpoint = mostUsedPublicEndpoint; + } + + public float getMaxUsageProportion() { + return maxUsageProportion; + } + + public void setMaxUsageProportion(float maxUsageProportion) { + this.maxUsageProportion = maxUsageProportion; + } + + public float getPublicMaxUsageProportion() { + return publicMaxUsageProportion; + } + + public void setPublicMaxUsageProportion(float publicMaxUsageProportion) { + this.publicMaxUsageProportion = publicMaxUsageProportion; + } + + public long getTotalUsage() { + return totalUsage; + } + + public void setTotalUsage(long totalUsage) { + this.totalUsage = totalUsage; + } + + public long getTotalPublicUsage() { + return totalPublicUsage; + } + + public void setTotalPublicUsage(long totalPublicUsage) { + this.totalPublicUsage = totalPublicUsage; + } +} diff --git a/src/main/resources/config/application-dev.yml b/src/main/resources/config/application-dev.yml index ad95c28ee..5dc73fe11 100644 --- a/src/main/resources/config/application-dev.yml +++ b/src/main/resources/config/application-dev.yml @@ -55,16 +55,16 @@ spring: # Remove 'faker' if you do not want the sample data to be loaded automatically contexts: dev, faker mail: - host: smtp.gmail.com - username: - password: - port: 587 + host: localhost + username: myuser + password: mysecretpassword + port: 8025 protocol: smtp - tls: true + tls: false properties.mail.smtp: auth: true - starttls.enable: true - ssl.trust: smtp.gmail.com + starttls.enable: false + ssl.trust: messages: cache-duration: PT1S # 1 second, see the ISO 8601 standard thymeleaf: diff --git a/src/main/webapp/app/components/oncokbTable/HeaderConstants.tsx b/src/main/webapp/app/components/oncokbTable/HeaderConstants.tsx index 40b7f2bc6..1b96388c8 100644 --- a/src/main/webapp/app/components/oncokbTable/HeaderConstants.tsx +++ b/src/main/webapp/app/components/oncokbTable/HeaderConstants.tsx @@ -1,17 +1,17 @@ import React from 'react'; -import { ToggleValue } from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; +import { ToggleValue } from 'app/pages/usageAnalysisPage/usage-analysis-utils'; export const emailHeader = 'Email'; export const usageHeader = 'Usage'; export const resourceHeader = 'Resource'; export const endpointHeader = 'Most frequently used endpoint'; -export const noPrivateEndpointHeader = +export const publicEndpointHeader = 'Most frequently used endpoint (only public)'; export const timeHeader = 'Time'; export const operationHeader = 'Details'; export const filterDependentTimeHeader = (timeTypeToggleValue: ToggleValue) => { - return timeTypeToggleValue === ToggleValue.RESULTS_IN_TOTAL + return timeTypeToggleValue === ToggleValue.RESULTS_BY_YEAR ? 'Duration' : 'Time'; }; diff --git a/src/main/webapp/app/config/constants.tsx b/src/main/webapp/app/config/constants.tsx index 3fe51d79c..9bf39edae 100644 --- a/src/main/webapp/app/config/constants.tsx +++ b/src/main/webapp/app/config/constants.tsx @@ -54,6 +54,7 @@ export const YEAR_END_SUMMARY_DATE_FORMAT = 'YYYY'; export const YEAR_END_SUMMARY_TITLE_DATE_FORMAT = 'YYYY'; export const TABLE_MONTH_FORMAT = 'YYYY-MM'; export const TABLE_DAY_FORMAT = 'YYYY-MM-DD'; +export const TABLE_YEAR_FORMAT = 'YYYY'; export const ONCOKB_NEWS_GROUP_SUBSCRIPTION_LINK = 'http://groups.google.com/group/oncokb-news/boxsubscribe'; @@ -103,9 +104,8 @@ export const NOTIFICATION_TIMEOUT_MILLISECONDS = 5000; export const SHORTEN_TEXT_FROM_LIST_THRESHOLD = 5; export const TOKEN_ABOUT_2_EXPIRE_NOTICE_IN_DAYS = 14; export const USAGE_TOP_USERS_LIMIT = 10000; -export const USAGE_ALL_TIME_KEY = 'All'; -export const USAGE_ALL_TIME_VALUE = 'Year To Date'; -export const USAGE_DETAIL_TIME_KEY = 'Detail'; +export const USAGE_YEAR_DETAIL_TIME_KEY = 'Year Detail'; +export const USAGE_MONTH_DETAIL_TIME_KEY = 'Month Detail'; export const USAGE_DAY_DETAIL_TIME_KEY = 'Day Detail'; export const LONG_TEXT_CUTOFF = 200; diff --git a/src/main/webapp/app/pages/companyPage/CompanyPage.tsx b/src/main/webapp/app/pages/companyPage/CompanyPage.tsx index 902026ba3..72e93313e 100644 --- a/src/main/webapp/app/pages/companyPage/CompanyPage.tsx +++ b/src/main/webapp/app/pages/companyPage/CompanyPage.tsx @@ -10,7 +10,6 @@ import { LicenseModel, LicenseStatus, PAGE_ROUTE, - PAGE_TITLE, REDIRECT_TIMEOUT_MILLISECONDS, } from 'app/config/constants'; import { Alert, Button, Col, Row } from 'react-bootstrap'; @@ -23,6 +22,7 @@ import { CompanyAdditionalInfoDTO, TerminationEmailDTO, CompanyTermination, + UserStats, } from 'app/shared/api/generated/API'; import client from 'app/shared/api/clientInstance'; import { action, computed, observable } from 'mobx'; @@ -61,14 +61,13 @@ import { UsageToggleGroup } from 'app/pages/usageAnalysisPage/UsageToggleGroup'; import OncoKBTable from 'app/components/oncokbTable/OncoKBTable'; import { getUsageTableColumnDefinition, - ToggleValue, UsageTableColumnKey, } from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; import autobind from 'autobind-decorator'; import { emailHeader, endpointHeader, - noPrivateEndpointHeader, + publicEndpointHeader, usageHeader, } from 'app/components/oncokbTable/HeaderConstants'; import UsageText from 'app/shared/texts/UsageText'; @@ -81,6 +80,7 @@ import CompanyAdditionalInfo, { createDefaultAdditionalInfo, } from './CompanyAdditionalInfo'; import FormInputField from 'app/shared/input/FormInputField'; +import { ToggleValue } from '../usageAnalysisPage/usage-analysis-utils'; interface MatchParams { id: string; @@ -616,6 +616,7 @@ export default class CompanyPage extends React.Component { } render() { + const currentYearStr = new Date().getFullYear().toString(); return ( @@ -1000,7 +1001,13 @@ export default class CompanyPage extends React.Component { Company Data Usage
- ; + monthUsage: Record; + yearUsage: Record; + } + > data={this.users.result} columns={[ { @@ -1008,46 +1015,74 @@ export default class CompanyPage extends React.Component { Header: emailHeader, accessor: 'userEmail', minWidth: 200, - onFilter: (data: UserOverviewUsage, keyword) => + onFilter: (data, keyword) => filterByKeyword(data.userEmail, keyword), }, - { - id: 'totalUsage', - Header: usageHeader, - minWidth: 100, - accessor: 'totalUsage', - Cell(props: { original: UserOverviewUsage }) { - return ( - - ); - }, - }, this.resourcesTypeToggleValue === ToggleValue.ALL_RESOURCES ? { - id: 'endpoint', + id: 'totalUsage', + Header: usageHeader, + minWidth: 100, + Cell(props: { + original: UserOverviewUsage; + }) { + return ( + + ); + }, + } + : { + id: 'totalUsage', + Header: usageHeader, + minWidth: 100, + Cell(props: { + original: UserOverviewUsage; + }) { + return ( + + ); + }, + }, + this.resourcesTypeToggleValue === + ToggleValue.ALL_RESOURCES + ? { + id: 'mostUsedEndpoint', Header: endpointHeader, minWidth: 200, - accessor: 'endpoint', - onFilter: ( - data: UserOverviewUsage, - keyword - ) => - filterByKeyword(data.endpoint, keyword), + onFilter: (data, keyword) => + filterByKeyword( + data.yearUsage[currentYearStr] + ?.mostUsedEndpoint, + keyword + ), + accessor: x => + x.yearUsage[currentYearStr] + ?.mostUsedEndpoint, } : { - id: 'noPrivateEndpoint', - Header: noPrivateEndpointHeader, + id: 'mostUsedPublicEndpoint', + Header: publicEndpointHeader, minWidth: 200, - accessor: 'noPrivateEndpoint', - onFilter: ( - data: UserOverviewUsage, - keyword - ) => + accessor: x => + x.yearUsage[currentYearStr] + ?.mostUsedPublicEndpoint, + onFilter: (data, keyword) => filterByKeyword( - data.noPrivateEndpoint, + data.yearUsage[currentYearStr] + ?.mostUsedPublicEndpoint, keyword ), }, diff --git a/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsPage.tsx b/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsPage.tsx index 04622fd65..8e1400908 100644 --- a/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsPage.tsx +++ b/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsPage.tsx @@ -5,15 +5,14 @@ import { inject, observer } from 'mobx-react'; import { RouterStore } from 'mobx-react-router'; import React from 'react'; import { match } from 'react-router-dom'; -import { ToggleValue, UsageRecord } from './UsageAnalysisPage'; import Client from 'app/shared/api/clientInstance'; -import { - USAGE_DETAIL_TIME_KEY, - USAGE_ALL_TIME_KEY, - USAGE_ALL_TIME_VALUE, -} from 'app/config/constants'; import ResourceUsageDetailsTable from './ResourceUsageDetailsTable'; import { decodeResourceUsageDetailPageURL } from 'app/shared/utils/Utils'; +import { + TimeGroupedUsageRecords, + mapUsageSummaryToTimeGroupedUsageRecords, + ToggleValue, +} from './usage-analysis-utils'; @inject('routing') @observer @@ -27,40 +26,21 @@ export default class ResourceUsageDetailsPage extends React.Component<{ this.props.match.params['endpoint'] ); - readonly resourceDetail = remoteData>({ + readonly resourceDetail = remoteData({ await: () => [], invoke: async () => { this.resource = await Client.resourceDetailGetUsingGET({ endpoint: this.endpoint, }); - const result = new Map(); - const yearSummary = this.resource.year; - const yearUsage: UsageRecord[] = []; - Object.keys(yearSummary).forEach(resourceEntry => { - yearUsage.push({ - resource: resourceEntry, - usage: yearSummary[resourceEntry], - time: USAGE_ALL_TIME_VALUE, - }); - }); - result.set(USAGE_ALL_TIME_KEY, yearUsage); - - const monthSummary = this.resource.month; - const detailUsage: UsageRecord[] = []; - Object.keys(monthSummary).forEach(month => { - const monthUsage = monthSummary[month]; - Object.keys(monthUsage).forEach(resourceEntry => { - detailUsage.push({ - resource: resourceEntry, - usage: monthUsage[resourceEntry], - time: month, - }); - }); - }); - result.set(USAGE_DETAIL_TIME_KEY, detailUsage); - return Promise.resolve(result); + return Promise.resolve( + mapUsageSummaryToTimeGroupedUsageRecords(this.resource, 'email') + ); + }, + default: { + 'Day Detail': [], + 'Year Detail': [], + 'Month Detail': [], }, - default: new Map(), }); constructor(props: Readonly<{ routing: RouterStore; match: match }>) { diff --git a/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsTable.tsx b/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsTable.tsx index d1f50fad8..ce66a5963 100644 --- a/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsTable.tsx +++ b/src/main/webapp/app/pages/usageAnalysisPage/ResourceUsageDetailsTable.tsx @@ -7,14 +7,12 @@ import React from 'react'; import { Row } from 'react-bootstrap'; import { getUsageTableColumnDefinition, - ToggleValue, - UsageRecord, UsageTableColumnKey, } from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; import { - USAGE_DETAIL_TIME_KEY, - USAGE_ALL_TIME_KEY, + USAGE_MONTH_DETAIL_TIME_KEY, PAGE_ROUTE, + USAGE_YEAR_DETAIL_TIME_KEY, } from 'app/config/constants'; import { UsageToggleGroup } from './UsageToggleGroup'; import { @@ -23,9 +21,14 @@ import { } from 'app/components/oncokbTable/HeaderConstants'; import UsageText from 'app/shared/texts/UsageText'; import { Link } from 'react-router-dom'; +import { + UsageRecord, + TimeGroupedUsageRecords, + ToggleValue, +} from './usage-analysis-utils'; type IResourceUsageDetailsTable = { - data: Map; + data: TimeGroupedUsageRecords; loadedData: boolean; defaultTimeType: ToggleValue; }; @@ -48,25 +51,25 @@ export default class ResourceUsageDetailsTable extends React.Component< <> - filterByKeyword(row.resource, keyword), + filterByKeyword(row.userEmail, keyword), Cell(props: { original: UsageRecord }) { return props.original.userId ? ( - {props.original.resource} + {props.original.userEmail} ) : ( -
{props.original.resource}
+
{props.original.userEmail}
); }, }, @@ -102,7 +105,7 @@ export default class ResourceUsageDetailsTable extends React.Component< >({ + readonly usageDetail = remoteData({ await: () => [], - invoke: async () => { - const resource = await client.resourceUsageGetUsingGET({}); - const result = new Map(); - const yearSummary = resource.year; - const yearUsage: UsageRecord[] = []; - Object.keys(yearSummary).forEach(resourceEntry => { - yearUsage.push({ - resource: resourceEntry, - usage: yearSummary[resourceEntry], - time: '', - }); - }); - result.set(USAGE_ALL_TIME_KEY, yearUsage); - this.dropdownList.push(USAGE_ALL_TIME_KEY); - - const monthSummary = resource.month; - Object.keys(monthSummary).forEach(month => { - const monthUsage = monthSummary[month]; - const usageArray: UsageRecord[] = []; - Object.keys(monthUsage).forEach(resourceEntry => { - usageArray.push({ - resource: resourceEntry, - usage: monthUsage[resourceEntry], - time: month, - }); - }); - result.set(month, usageArray); - this.dropdownList.push(month); - }); - - return Promise.resolve(result); + async invoke() { + return await client.resourceUsageGetUsingGET({}); + }, + default: { + day: {}, + month: {}, + year: {}, }, - default: new Map(), }); @autobind @@ -216,20 +166,6 @@ export default class UsageAnalysisPage extends React.Component<{ this.usageType = usageType; } - @computed get calculateResourcesTabData(): UsageRecord[] { - if ( - this.resourceTabResourcesTypeToggleValue === ToggleValue.ALL_RESOURCES - ) { - return this.usageDetail.result.get(this.dropdownValue) || []; - } else { - return (this.usageDetail.result.get(this.dropdownValue) || []).filter( - function (usage) { - return !usage.resource.includes('/private/'); - } - ); - } - } - render() { return ( <> @@ -250,112 +186,11 @@ export default class UsageAnalysisPage extends React.Component<{
- - filterByKeyword(row.resource, keyword), - Cell(props: { original: UsageRecord }) { - return props.original.resource ? ( - - {props.original.resource} - - ) : ( -
{props.original.resource}
- ); - }, - }, - { - ...getUsageTableColumnDefinition(UsageTableColumnKey.USAGE), - Cell(props: { original: UsageRecord }) { - return ; - }, - }, - { - ...getUsageTableColumnDefinition( - UsageTableColumnKey.OPERATION - ), - sortable: false, - className: 'd-flex justify-content-center', - Cell(props: { original: UsageRecord }) { - return ( - - - - ); - }, - }, - ]} - loading={!this.usageDetail.isComplete} - defaultSorted={[ - { - id: UsageTableColumnKey.USAGE, - desc: true, - }, - ]} - showPagination={true} - minRows={1} - filters={() => { - const monthDropdown: any = []; - if (this.usageDetail.isComplete) { - this.dropdownList - .sort() - .reverse() - .forEach(key => { - monthDropdown.push( - - {key} - - ); - }); - } - return this.usageDetail.isComplete ? ( - - (this.dropdownValue = evt)} - > - {monthDropdown} - - - - ) : ( - - ); - }} +
diff --git a/src/main/webapp/app/pages/usageAnalysisPage/UsageAnalysisTable.tsx b/src/main/webapp/app/pages/usageAnalysisPage/UsageAnalysisTable.tsx index f52644ef3..8c28ab060 100644 --- a/src/main/webapp/app/pages/usageAnalysisPage/UsageAnalysisTable.tsx +++ b/src/main/webapp/app/pages/usageAnalysisPage/UsageAnalysisTable.tsx @@ -1,4 +1,6 @@ -import OncoKBTable from 'app/components/oncokbTable/OncoKBTable'; +import OncoKBTable, { + SearchColumn, +} from 'app/components/oncokbTable/OncoKBTable'; import { filterByKeyword } from 'app/shared/utils/Utils'; import autobind from 'autobind-decorator'; import { action, computed, observable } from 'mobx'; @@ -7,8 +9,6 @@ import React from 'react'; import { Row } from 'react-bootstrap'; import { getUsageTableColumnDefinition, - ToggleValue, - UsageRecord, UsageTableColumnKey, } from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; import { UsageToggleGroup } from './UsageToggleGroup'; @@ -17,26 +17,25 @@ import { emailHeader, endpointHeader, filterDependentTimeHeader, - noPrivateEndpointHeader, - usageHeader, } from 'app/components/oncokbTable/HeaderConstants'; -import { UserOverviewUsage } from 'app/shared/api/generated/API'; import UsageText from 'app/shared/texts/UsageText'; -import { - PAGE_ROUTE, - TABLE_DAY_FORMAT, - TABLE_MONTH_FORMAT, -} from 'app/config/constants'; -import moment from 'moment'; +import { PAGE_ROUTE } from 'app/config/constants'; import { Link } from 'react-router-dom'; import { SortingRule } from 'react-table'; +import { + UsageSummaryWithUsageTypes, + UserOverviewUsageWithUsageTypes, + mapUserOrResourceUsageToUsageRecords, + UsageRecord, + ToggleValue, +} from './usage-analysis-utils'; type IUserUsageDetailsTable = { - data: UserOverviewUsage[]; loadedData: boolean; defaultResourcesType: ToggleValue; defaultTimeType: ToggleValue; defaultPageSize?: number; + data: UsageSummaryWithUsageTypes | UserOverviewUsageWithUsageTypes[]; }; @observer @@ -71,65 +70,27 @@ export default class UsageAnalysisTable extends React.Component< } @computed get calculateDateGroupedData(): UsageRecord[] { - let data: UsageRecord[] = []; - if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_MONTH) { - this.props.data.forEach((userOverviewUsage: UserOverviewUsage) => { - Object.keys(userOverviewUsage.monthUsage).forEach(month => - data.push({ - resource: userOverviewUsage.userEmail, - usage: userOverviewUsage.monthUsage[month], - time: month, - userId: userOverviewUsage.userId, - }) - ); - }); - } else if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_DAY) { - this.props.data.forEach((userOverviewUsage: UserOverviewUsage) => { - Object.keys(userOverviewUsage.dayUsage).forEach(day => - data.push({ - resource: userOverviewUsage.userEmail, - usage: userOverviewUsage.dayUsage[day], - time: day, - userId: userOverviewUsage.userId, - }) - ); - }); - } - - if (this.filterToggled && data.length > 0) { - let tableFormat: string; - if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_MONTH) { - tableFormat = TABLE_MONTH_FORMAT; - } else if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_DAY) { - tableFormat = TABLE_DAY_FORMAT; - } - data = data.filter(resource => { - const fromTime = moment(this.fromDate).format(tableFormat); - const toTime = moment(this.toDate).format(tableFormat); - return resource.time >= fromTime && resource.time <= toTime; - }); - } - - if (this.resourcesTypeToggleValue === ToggleValue.ALL_RESOURCES) { - return data; - } else if (this.resourcesTypeToggleValue === ToggleValue.PUBLIC_RESOURCES) { - return data.filter(function (usage) { - return !usage.resource.includes('/private/'); - }); - } else { - return []; - } + return mapUserOrResourceUsageToUsageRecords( + this.props.data, + this.timeTypeToggleValue, + this.filterToggled, + this.fromDate, + this.toDate, + this.resourcesTypeToggleValue === ToggleValue.ALL_RESOURCES + ); } - @computed get getAllTimeColumns() { - return [ - { + @computed get dateGroupedColumns() { + const columns = []; + const isResources = Array.isArray(this.props.data); + + if (isResources) { + columns.push({ id: 'userEmail', Header: emailHeader, - accessor: 'userEmail', - onFilter: (row: UserOverviewUsage, keyword: string) => + onFilter: (row: UsageRecord, keyword: string) => filterByKeyword(row.userEmail, keyword), - Cell(props: { original: UserOverviewUsage }) { + Cell(props: { original: UsageRecord }) { return props.original.userId ? ( {props.original.userEmail}
); }, + }); + } + columns.push({ + ...getUsageTableColumnDefinition(UsageTableColumnKey.USAGE), + Cell(props: { original: UsageRecord }) { + return ; }, - { - id: 'totalUsage', - Header: usageHeader, - accessor: 'totalUsage', - Cell(props: { original: UserOverviewUsage }) { - return ; - }, + }); + columns.push({ + id: 'endpoint', + Header: endpointHeader, + minWidth: 200, + onFilter: (row: UsageRecord, keyword: string) => + filterByKeyword(row.resource, keyword), + Cell(props: { original: UsageRecord }) { + return props.original.resource ? ( +
+ + {props.original.resource} + {' '} + {isResources && <>({props.original.maxUsageProportion}%)} +
+ ) : ( +
N/A
+ ); }, - this.resourcesTypeToggleValue === ToggleValue.ALL_RESOURCES - ? { - id: 'endpoint', - Header: endpointHeader, - minWidth: 200, - accessor: (row: UserOverviewUsage) => - `${row.endpoint} (${row.maxUsageProportion}%)`, - onFilter: (row: UserOverviewUsage, keyword: string) => - filterByKeyword(row.endpoint, keyword), - Cell(props: { original: UserOverviewUsage }) { - return props.original.endpoint ? ( -
- - {props.original.endpoint} - {' '} - ({props.original.maxUsageProportion}%) -
- ) : ( -
N/A
- ); - }, - } - : { - id: 'noPrivateEndpoint', - Header: noPrivateEndpointHeader, - minWidth: 200, - accessor: (row: UserOverviewUsage) => - `${row.endpoint} (${row.noPrivateMaxUsageProportion}%)`, - onFilter: (row: UserOverviewUsage, keyword: string) => - filterByKeyword(row.noPrivateEndpoint, keyword), - Cell(props: { original: UserOverviewUsage }) { - return props.original.endpoint ? ( -
- - {props.original.endpoint} - {' '} - ({props.original.maxUsageProportion}%) -
- ) : ( -
N/A
- ); - }, - }, - { + }); + columns.push({ + ...getUsageTableColumnDefinition(UsageTableColumnKey.TIME), + Header: filterDependentTimeHeader(this.timeTypeToggleValue), + onFilter: (row: UsageRecord, keyword: string) => + filterByKeyword(row.time, keyword), + }); + if (isResources) { + columns.push({ ...getUsageTableColumnDefinition(UsageTableColumnKey.OPERATION), sortable: false, className: 'd-flex justify-content-center', - Cell(props: { original: UserOverviewUsage }) { + Cell(props: { original: UsageRecord }) { return props.original.userId ? ( ); }, - }, - ]; + }); + } + return columns; } - readonly dateGroupedColumns = [ - { - id: 'userEmail', - Header: emailHeader, - accessor: 'resource', - onFilter: (row: UsageRecord, keyword: string) => - filterByKeyword(row.resource, keyword), - Cell(props: { original: UsageRecord }) { - return props.original.userId ? ( - - {props.original.resource} - - ) : ( -
{props.original.resource}
- ); - }, - }, - { - ...getUsageTableColumnDefinition(UsageTableColumnKey.USAGE), - Cell(props: { original: UsageRecord }) { - return ; - }, - }, - { - ...getUsageTableColumnDefinition(UsageTableColumnKey.TIME), - Header: filterDependentTimeHeader(this.timeTypeToggleValue), - onFilter: (row: UsageRecord, keyword: string) => - filterByKeyword(row.time, keyword), - }, - { - ...getUsageTableColumnDefinition(UsageTableColumnKey.OPERATION), - sortable: false, - className: 'd-flex justify-content-center', - Cell(props: { original: UsageRecord }) { - return props.original.userId ? ( - - - - ) : ( - - ); - }, - }, - ]; - @computed get resetDefaultSort(): SortingRule[] { const sortingRules: SortingRule[] = []; if (this.filterToggled) { @@ -282,7 +173,7 @@ export default class UsageAnalysisTable extends React.Component< }); } - if (this.timeTypeToggleValue === ToggleValue.RESULTS_IN_TOTAL) { + if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_YEAR) { sortingRules.push({ id: 'totalUsage', desc: true, @@ -328,7 +219,7 @@ export default class UsageAnalysisTable extends React.Component< - key={this.timeTypeToggleValue} - data={this.props.data} - columns={this.getAllTimeColumns} - loading={!this.props.loadedData} - defaultSorted={this.resetDefaultSort} - showPagination={true} - minRows={1} - defaultPageSize={this.props.defaultPageSize} - filters={this.filters} - /> - ); - } else { - return ( - - key={this.timeTypeToggleValue} - data={this.calculateDateGroupedData} - columns={this.dateGroupedColumns} - loading={!this.props.loadedData} - defaultSorted={this.resetDefaultSort} - showPagination={true} - minRows={1} - defaultPageSize={this.props.defaultPageSize} - filters={this.filters} - /> - ); - } + return ( + + key={this.timeTypeToggleValue} + data={this.calculateDateGroupedData} + columns={this.dateGroupedColumns} + loading={!this.props.loadedData} + defaultSorted={this.resetDefaultSort} + showPagination={true} + minRows={1} + defaultPageSize={this.props.defaultPageSize} + filters={this.filters} + /> + ); } render() { diff --git a/src/main/webapp/app/pages/usageAnalysisPage/UsageToggleGroup.tsx b/src/main/webapp/app/pages/usageAnalysisPage/UsageToggleGroup.tsx index dbd6da521..96f163cdb 100644 --- a/src/main/webapp/app/pages/usageAnalysisPage/UsageToggleGroup.tsx +++ b/src/main/webapp/app/pages/usageAnalysisPage/UsageToggleGroup.tsx @@ -1,7 +1,7 @@ import { observer } from 'mobx-react'; import React from 'react'; import { ToggleButton, ToggleButtonGroup } from 'react-bootstrap'; -import { ToggleValue } from './UsageAnalysisPage'; +import { ToggleValue } from './usage-analysis-utils'; type IUsageToggleGroupProps = { defaultValue: ToggleValue; diff --git a/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsPage.tsx b/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsPage.tsx index 0b36f6bf2..244161067 100644 --- a/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsPage.tsx +++ b/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsPage.tsx @@ -10,17 +10,17 @@ import { Col, Row } from 'react-bootstrap'; import UserUsageDetailsTable from './UserUsageDetailsTable'; import { InfoRow } from '../AccountPage'; import { - USAGE_DETAIL_TIME_KEY, - USAGE_ALL_TIME_KEY, - USAGE_ALL_TIME_VALUE, + USAGE_MONTH_DETAIL_TIME_KEY, + USAGE_YEAR_DETAIL_TIME_KEY, USAGE_DAY_DETAIL_TIME_KEY, } from 'app/config/constants'; import { remoteData } from 'cbioportal-frontend-commons'; +import { notifyError } from 'app/shared/utils/NotificationUtils'; import { - ToggleValue, UsageRecord, -} from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; -import { notifyError } from 'app/shared/utils/NotificationUtils'; + TimeGroupedUsageRecords, + ToggleValue, +} from './usage-analysis-utils'; @inject('routing') @observer @@ -36,37 +36,48 @@ export default class UserUsageDetailsPage extends React.Component<{ super(props); } - readonly usageDetail = remoteData>({ + readonly usageDetail = remoteData({ await: () => [], invoke: async () => { - const result = new Map(); + const result: TimeGroupedUsageRecords = { + [USAGE_YEAR_DETAIL_TIME_KEY]: [], + [USAGE_MONTH_DETAIL_TIME_KEY]: [], + [USAGE_DAY_DETAIL_TIME_KEY]: [], + }; try { this.user = await client.userUsageGetUsingGET({ userId: this.userId }); if (this.user.summary !== null) { const yearSummary = this.user.summary.year; - const yearUsage: UsageRecord[] = []; - Object.keys(yearSummary).forEach(resourceEntry => { - yearUsage.push({ - resource: resourceEntry, - usage: yearSummary[resourceEntry], - time: USAGE_ALL_TIME_VALUE, + const yearDetailSummary: UsageRecord[] = []; + Object.keys(yearSummary).forEach(year => { + const yearUsage = yearSummary[year]; + Object.keys(yearUsage).forEach(resourceEntry => { + yearDetailSummary.push({ + userEmail: this.user.userEmail, + usage: yearUsage[resourceEntry], + time: year, + resource: resourceEntry, + maxUsageProportion: 0, + }); }); }); - result.set(USAGE_ALL_TIME_KEY, yearUsage); + result[USAGE_YEAR_DETAIL_TIME_KEY] = yearDetailSummary; const monthSummary = this.user.summary.month; - const detailSummary: UsageRecord[] = []; + const monthDetailSummary: UsageRecord[] = []; Object.keys(monthSummary).forEach(month => { const monthUsage = monthSummary[month]; Object.keys(monthUsage).forEach(resourceEntry => { - detailSummary.push({ - resource: resourceEntry, + monthDetailSummary.push({ + userEmail: this.user.userEmail, usage: monthUsage[resourceEntry], time: month, + resource: resourceEntry, + maxUsageProportion: 0, }); }); }); - result.set(USAGE_DETAIL_TIME_KEY, detailSummary); + result[USAGE_MONTH_DETAIL_TIME_KEY] = monthDetailSummary; const daySummary = this.user.summary.day; const dayDetailSummary: UsageRecord[] = []; @@ -74,20 +85,26 @@ export default class UserUsageDetailsPage extends React.Component<{ const dayUsage = daySummary[day]; Object.keys(dayUsage).forEach(resourceEntry => { dayDetailSummary.push({ - resource: resourceEntry, + userEmail: this.user.userEmail, usage: dayUsage[resourceEntry], time: day, + resource: resourceEntry, + maxUsageProportion: 0, }); }); }); - result.set(USAGE_DAY_DETAIL_TIME_KEY, dayDetailSummary); + result[USAGE_DAY_DETAIL_TIME_KEY] = dayDetailSummary; } } catch (error) { notifyError(error, 'Failed to load user data usage with error: '); } return Promise.resolve(result); }, - default: new Map(), + default: { + [USAGE_YEAR_DETAIL_TIME_KEY]: [], + [USAGE_MONTH_DETAIL_TIME_KEY]: [], + [USAGE_DAY_DETAIL_TIME_KEY]: [], + }, }); render() { diff --git a/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsTable.tsx b/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsTable.tsx index 56ea352a1..181b7da3f 100644 --- a/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsTable.tsx +++ b/src/main/webapp/app/pages/usageAnalysisPage/UserUsageDetailsTable.tsx @@ -7,17 +7,16 @@ import React from 'react'; import { Row } from 'react-bootstrap'; import { getUsageTableColumnDefinition, - ToggleValue, - UsageRecord, UsageTableColumnKey, } from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; import { PAGE_ROUTE, TABLE_DAY_FORMAT, TABLE_MONTH_FORMAT, - USAGE_ALL_TIME_KEY, USAGE_DAY_DETAIL_TIME_KEY, - USAGE_DETAIL_TIME_KEY, + USAGE_MONTH_DETAIL_TIME_KEY, + USAGE_YEAR_DETAIL_TIME_KEY, + TABLE_YEAR_FORMAT, } from 'app/config/constants'; import { UsageToggleGroup } from './UsageToggleGroup'; import { UsageAnalysisCalendarButton } from 'app/components/calendarButton/UsageAnalysisCalendarButton'; @@ -28,9 +27,15 @@ import { } from 'app/components/oncokbTable/HeaderConstants'; import UsageText from 'app/shared/texts/UsageText'; import { Link } from 'react-router-dom'; +import { + TimeGroupedUsageRecords, + UsageRecord, + isPrivateResource, + ToggleValue, +} from './usage-analysis-utils'; type IUserUsageDetailsTable = { - data: Map; + data: TimeGroupedUsageRecords; loadedData: boolean; defaultResourcesType: ToggleValue; defaultTimeType: ToggleValue; @@ -63,23 +68,21 @@ export default class UserUsageDetailsTable extends React.Component< } @computed get calculateData(): UsageRecord[] { - let data = this.props.data.get( - this.timeTypeToggleValue === ToggleValue.RESULTS_IN_TOTAL - ? USAGE_ALL_TIME_KEY + let data = this.props.data[ + this.timeTypeToggleValue === ToggleValue.RESULTS_BY_YEAR + ? USAGE_YEAR_DETAIL_TIME_KEY : this.timeTypeToggleValue === ToggleValue.RESULTS_BY_MONTH - ? USAGE_DETAIL_TIME_KEY + ? USAGE_MONTH_DETAIL_TIME_KEY : USAGE_DAY_DETAIL_TIME_KEY - ); - if ( - this.filterToggled && - data && - this.timeTypeToggleValue !== ToggleValue.RESULTS_IN_TOTAL - ) { + ]; + if (this.filterToggled && data) { let tableFormat: string; if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_MONTH) { tableFormat = TABLE_MONTH_FORMAT; } else if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_DAY) { tableFormat = TABLE_DAY_FORMAT; + } else if (this.timeTypeToggleValue === ToggleValue.RESULTS_BY_YEAR) { + tableFormat = TABLE_YEAR_FORMAT; } data = data.filter(resource => { const fromTime = moment(this.fromDate).format(tableFormat); @@ -91,7 +94,7 @@ export default class UserUsageDetailsTable extends React.Component< return data || []; } else if (this.resourcesTypeToggleValue === ToggleValue.PUBLIC_RESOURCES) { return (data || []).filter(function (usage) { - return !usage.resource.includes('/private/'); + return !isPrivateResource(usage.resource); }); } else if (this.resourcesTypeToggleValue === ToggleValue.CUMULATIVE_USAGE) { if (data) { @@ -102,9 +105,11 @@ export default class UserUsageDetailsTable extends React.Component< data.forEach(resource => { if (!cumulativeData.has(resource.time)) { cumulativeData.set(resource.time, { - resource: 'ALL', + userEmail: 'ALL', usage: 0, time: resource.time, + resource: resource.resource, + maxUsageProportion: 0, }); } const resourceTimeRange = cumulativeData.get(resource.time); @@ -187,7 +192,7 @@ export default class UserUsageDetailsTable extends React.Component< { + const isPrivateResourceTests: [string, boolean][] = [ + ['/api/private/something', true], + ['/api/something', false], + ['/api/something/private', false], + ]; + + test.each(isPrivateResourceTests)( + 'For "%s" isPrivateResource should return %s', + (resource, expected) => { + const actual = isPrivateResource(resource); + expect(actual).toEqual(expected); + } + ); + + const mapUserOrResourceUsageToUsageRecordsTests: [ + Parameters, + ReturnType + ][] = [ + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_YEAR, + true, + '2019-01-01', + '2019-12-31', + true, + ], + [], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_YEAR, + false, + '2019-01-01', + '2019-12-31', + true, + ], + [ + { + maxUsageProportion: 25.3, + resource: '/api/private/search/typeahead', + time: '2020', + usage: 4436, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_YEAR, + true, + '2020-01-01', + '2020-12-31', + true, + ], + [ + { + maxUsageProportion: 25.3, + resource: '/api/private/search/typeahead', + time: '2020', + usage: 4436, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_YEAR, + true, + '2020-01-01', + '2020-12-31', + false, + ], + [ + { + maxUsageProportion: 40, + resource: '/api/v1/annotate/structuralVariants', + time: '2020', + usage: 2299, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_MONTH, + true, + '2020-01-01', + '2020-12-31', + true, + ], + [ + { + maxUsageProportion: 49.4, + resource: '/api/private/search/typeahead', + time: '2020-01', + usage: 376, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_MONTH, + true, + '2020-01-01', + '2020-12-31', + false, + ], + [ + { + maxUsageProportion: 100, + resource: '/api/v1/annotate/structuralVariants', + time: '2020-01', + usage: 186, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_DAY, + true, + '2020-01-01', + '2020-12-31', + true, + ], + [ + { + maxUsageProportion: 100, + resource: '/api/private/search/typeahead', + time: '2020-01-01', + usage: 48, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + [ + [ + userOverviewUsageWithUsageTypes, + ToggleValue.RESULTS_BY_DAY, + true, + '2020-01-01', + '2020-12-31', + false, + ], + [ + { + maxUsageProportion: 100, + resource: '/api/v1/annotate/structuralVariants', + time: '2020-01-01', + usage: 48, + userEmail: '0doej@FakeCo.com', + userId: '0', + }, + ], + ], + ]; + + test.each(mapUserOrResourceUsageToUsageRecordsTests)( + 'For "%s" mapUserOrResourceUsageToUsageRecords should return %s', + ( + [ + incomingData, + timeTypeToggleValue, + filterToggled, + fromDate, + toDate, + isAllUsage, + ], + expected + ) => { + const actual = mapUserOrResourceUsageToUsageRecords( + incomingData, + timeTypeToggleValue, + filterToggled, + fromDate, + toDate, + isAllUsage + ); + expect(actual).toEqual(expected); + } + ); + + const mapUsageSummaryToTimeGroupedUsageRecordsTests: [ + Parameters, + ReturnType + ][] = [ + [ + [usageSummaryWithUsageTypesEmail, 'email'], + { + 'Day Detail': [ + { + maxUsageProportion: 0, + resource: '', + time: '2020-02-04', + usage: 30, + userEmail: '0doej@FakeCo.com', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '', + time: '2020-03-01', + usage: 26, + userEmail: '0doej@FakeCo.com', + userId: undefined, + }, + ], + 'Month Detail': [ + { + maxUsageProportion: 0, + resource: '', + time: '2020-02', + usage: 30, + userEmail: '0doej@FakeCo.com', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '', + time: '2020-02', + usage: 75, + userEmail: '1smithj@DemoLLC.com', + userId: undefined, + }, + ], + 'Year Detail': [ + { + maxUsageProportion: 0, + resource: '', + time: '2020', + usage: 712, + userEmail: '0doej@FakeCo.com', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '', + time: '2020', + usage: 1019, + userEmail: '1smithj@DemoLLC.com', + userId: undefined, + }, + ], + }, + ], + [ + [usageSummaryWithUsageTypesResource, 'resource'], + { + 'Day Detail': [ + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/structuralVariants', + time: '2020-01-01', + usage: 127, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/structuralVariants', + time: '2020-01-07', + usage: 74, + userEmail: '', + userId: undefined, + }, + ], + 'Month Detail': [ + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/structuralVariants', + time: '2020-01', + usage: 265, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/private/search/typeahead', + time: '2020-01', + usage: 230, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/private/utils/numbers/levels/', + time: '2020-01', + usage: 21, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/mutations/byProteinChange', + time: '2020-01', + usage: 115, + userEmail: '', + userId: undefined, + }, + ], + 'Year Detail': [ + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/structuralVariants', + time: '2020', + usage: 1924, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/private/search/typeahead', + time: '2020', + usage: 1868, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/private/utils/numbers/levels/', + time: '2020', + usage: 1713, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/mutations/byProteinChange', + time: '2020', + usage: 1731, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/private/utils/numbers/main/', + time: '2020', + usage: 1081, + userEmail: '', + userId: undefined, + }, + { + maxUsageProportion: 0, + resource: '/api/v1/annotate/copyNumberAlterations', + time: '2020', + usage: 1035, + userEmail: '', + userId: undefined, + }, + ], + }, + ], + ]; + + test.each(mapUsageSummaryToTimeGroupedUsageRecordsTests)( + 'For "%s" mapUsageSummaryToTimeGroupedUsageRecords should return %s', + ([usageSummary, keyType], expected) => { + const actual = mapUsageSummaryToTimeGroupedUsageRecords( + usageSummary, + keyType + ); + expect(actual).toEqual(expected); + } + ); +}); diff --git a/src/main/webapp/app/pages/usageAnalysisPage/usage-analysis-utils.ts b/src/main/webapp/app/pages/usageAnalysisPage/usage-analysis-utils.ts new file mode 100644 index 000000000..218b5a350 --- /dev/null +++ b/src/main/webapp/app/pages/usageAnalysisPage/usage-analysis-utils.ts @@ -0,0 +1,206 @@ +import { + UserStats, + UsageSummary, + UserOverviewUsage, +} from 'app/shared/api/generated/API'; +import { + TABLE_MONTH_FORMAT, + TABLE_DAY_FORMAT, + TABLE_YEAR_FORMAT, + USAGE_YEAR_DETAIL_TIME_KEY, + USAGE_MONTH_DETAIL_TIME_KEY, + USAGE_DAY_DETAIL_TIME_KEY, +} from 'app/config/constants'; +import moment from 'moment'; + +export enum ToggleValue { + ALL_RESOURCES = 'All Resources', + PUBLIC_RESOURCES = 'Only Public Resources', + CUMULATIVE_USAGE = 'Cumulative Usage', + RESULTS_BY_YEAR = 'By Year', + RESULTS_BY_MONTH = 'By Month', + RESULTS_BY_DAY = 'By Day', +} + +export type TimeGroupedUsageRecords = { + [USAGE_YEAR_DETAIL_TIME_KEY]: UsageRecord[]; + [USAGE_MONTH_DETAIL_TIME_KEY]: UsageRecord[]; + [USAGE_DAY_DETAIL_TIME_KEY]: UsageRecord[]; +}; + +export type UsageRecord = { + resource: string; + userEmail: string; + maxUsageProportion: number; + usage: number; + time: string; + userId?: string; +}; + +export type UserOverviewUsageWithUsageTypes = UserOverviewUsage & { + yearUsage: Record; + monthUsage: Record; + dayUsage: Record; +}; + +export type UsageSummaryWithUsageTypes = UsageSummary & { + year: Record>; + month: Record>; + day: Record>; +}; + +export function isPrivateResource(resource: string) { + return resource.startsWith('/api/private/'); +} + +function checkIfUserUsage( + incomingData: UsageSummaryWithUsageTypes | UserOverviewUsageWithUsageTypes[] +): incomingData is UserOverviewUsageWithUsageTypes[] { + return Array.isArray(incomingData); +} + +function createResourceTableRecord( + time: string, + usageSummary: Record, + keyType: 'resource' | 'email', + isAllUsage: boolean +): UsageRecord[] { + return Object.entries(usageSummary) + .filter(([key]) => isAllUsage || !isPrivateResource(key)) + .map( + ([key, usage]): UsageRecord => { + return { + userId: undefined, + userEmail: keyType === 'email' ? key : '', + usage, + time, + resource: keyType === 'resource' ? key : '', + maxUsageProportion: 0, + }; + } + ); +} + +function createUserTableRecord( + userId: string | undefined, + userEmail: string, + usage: Record, + isAllUsage: boolean +): UsageRecord[] { + return Object.entries(usage).map( + ([time, userStats]): UsageRecord => { + return { + userId, + userEmail, + usage: isAllUsage ? userStats.totalUsage : userStats.totalPublicUsage, + time, + resource: isAllUsage + ? userStats.mostUsedEndpoint + : userStats.mostUsedPublicEndpoint, + maxUsageProportion: isAllUsage + ? userStats.maxUsageProportion + : userStats.publicMaxUsageProportion, + }; + } + ); +} + +export function mapUserOrResourceUsageToUsageRecords( + incomingData: UsageSummaryWithUsageTypes | UserOverviewUsageWithUsageTypes[], + timeTypeToggleValue: ToggleValue, + filterToggled: boolean, + fromDate: string | undefined, + toDate: string | undefined, + isAllUsage: boolean +) { + let data: UsageRecord[]; + const isByYear = timeTypeToggleValue === ToggleValue.RESULTS_BY_YEAR; + const isByMonth = timeTypeToggleValue === ToggleValue.RESULTS_BY_MONTH; + const isByDay = timeTypeToggleValue === ToggleValue.RESULTS_BY_DAY; + + if (isByYear && checkIfUserUsage(incomingData)) { + data = incomingData.flatMap(({ userId, userEmail, yearUsage }) => { + return createUserTableRecord(userId, userEmail, yearUsage, isAllUsage); + }); + } else if (isByMonth && checkIfUserUsage(incomingData)) { + data = incomingData.flatMap(({ userId, userEmail, monthUsage }) => { + return createUserTableRecord(userId, userEmail, monthUsage, isAllUsage); + }); + } else if (isByDay && checkIfUserUsage(incomingData)) { + data = incomingData.flatMap(({ userId, userEmail, dayUsage }) => { + return createUserTableRecord(userId, userEmail, dayUsage, isAllUsage); + }); + } else if (isByYear && !checkIfUserUsage(incomingData)) { + data = Object.entries(incomingData.year).flatMap(([time, usageSummary]) => { + return createResourceTableRecord( + time, + usageSummary, + 'resource', + isAllUsage + ); + }); + } else if (isByMonth && !checkIfUserUsage(incomingData)) { + data = Object.entries(incomingData.month).flatMap( + ([time, usageSummary]) => { + return createResourceTableRecord( + time, + usageSummary, + 'resource', + isAllUsage + ); + } + ); + } else if (isByDay && !checkIfUserUsage(incomingData)) { + data = Object.entries(incomingData.day).flatMap(([time, usageSummary]) => { + return createResourceTableRecord( + time, + usageSummary, + 'resource', + isAllUsage + ); + }); + } else { + data = []; + } + + if (filterToggled && data.length > 0) { + let tableFormat: string; + if (timeTypeToggleValue === ToggleValue.RESULTS_BY_MONTH) { + tableFormat = TABLE_MONTH_FORMAT; + } else if (timeTypeToggleValue === ToggleValue.RESULTS_BY_DAY) { + tableFormat = TABLE_DAY_FORMAT; + } else { + tableFormat = TABLE_YEAR_FORMAT; + } + data = data.filter(resource => { + const fromTime = moment(fromDate).format(tableFormat); + const toTime = moment(toDate).format(tableFormat); + return resource.time >= fromTime && resource.time <= toTime; + }); + } + + return data; +} + +export function mapUsageSummaryToTimeGroupedUsageRecords( + usageSummary: UsageSummaryWithUsageTypes, + keyType: Parameters[2] +): TimeGroupedUsageRecords { + return { + [USAGE_YEAR_DETAIL_TIME_KEY]: Object.entries( + usageSummary.year + ).flatMap(([time, usage]) => + createResourceTableRecord(time, usage, keyType, true) + ), + [USAGE_MONTH_DETAIL_TIME_KEY]: Object.entries( + usageSummary.month + ).flatMap(([time, usage]) => + createResourceTableRecord(time, usage, keyType, true) + ), + [USAGE_DAY_DETAIL_TIME_KEY]: Object.entries( + usageSummary.day + ).flatMap(([time, usage]) => + createResourceTableRecord(time, usage, keyType, true) + ), + }; +} diff --git a/src/main/webapp/app/pages/userPage/UserPage.tsx b/src/main/webapp/app/pages/userPage/UserPage.tsx index 809058634..2b7ff888d 100644 --- a/src/main/webapp/app/pages/userPage/UserPage.tsx +++ b/src/main/webapp/app/pages/userPage/UserPage.tsx @@ -20,13 +20,8 @@ import { LicenseType, NOT_CHANGEABLE_AUTHORITIES, PAGE_ROUTE, - PAGE_TITLE, REDIRECT_TIMEOUT_MILLISECONDS, THRESHOLD_TRIAL_TOKEN_VALID_DEFAULT, - USAGE_ALL_TIME_KEY, - USAGE_ALL_TIME_VALUE, - USAGE_DAY_DETAIL_TIME_KEY, - USAGE_DETAIL_TIME_KEY, USER_AUTHORITIES, } from 'app/config/constants'; import { @@ -42,6 +37,7 @@ import { UserMailsDTO, UserUsage, UserCompany, + UsageSummary, } from 'app/shared/api/generated/API'; import client from 'app/shared/api/clientInstance'; import { DefaultTooltip, remoteData } from 'cbioportal-frontend-commons'; @@ -76,11 +72,6 @@ import { } from 'app/shared/utils/FormValidationUtils'; import AuthenticationStore from 'app/store/AuthenticationStore'; import ButtonWithTooltip from 'app/shared/button/ButtonWithTooltip'; -import { - ToggleValue, - UsageRecord, -} from 'app/pages/usageAnalysisPage/UsageAnalysisPage'; -import UserUsageDetailsTable from 'app/pages/usageAnalysisPage/UserUsageDetailsTable'; import { DateSelector } from 'app/components/dateSelector/DateSelector'; import { KeyInputGroups } from 'app/pages/userPage/KeyInputGroups'; import { Label } from 'reactstrap'; @@ -90,6 +81,8 @@ import { } from 'app/shared/utils/UrlUtils'; import { sortBy } from 'app/shared/utils/LodashUtils'; import { Helmet } from 'react-helmet-async'; +import { ToggleValue } from '../usageAnalysisPage/usage-analysis-utils'; +import UsageAnalysisTable from '../usageAnalysisPage/UsageAnalysisTable'; export enum AccountStatus { ACTIVATED = 'Activated', @@ -179,56 +172,19 @@ export default class UserPage extends React.Component { this.reactions.forEach(disposer => disposer()); } - readonly usageDetail = remoteData>({ + readonly usageDetail = remoteData({ await: () => [], invoke: async () => { this.userUsage = await client.userUsageGetUsingGET({ userId: this.user.id, }); - const result = new Map(); - if (this.userUsage.summary !== null) { - const yearSummary = this.userUsage.summary.year; - const yearUsage: UsageRecord[] = []; - Object.keys(yearSummary).forEach(resourceEntry => { - yearUsage.push({ - resource: resourceEntry, - usage: yearSummary[resourceEntry], - time: USAGE_ALL_TIME_VALUE, - }); - }); - result.set(USAGE_ALL_TIME_KEY, yearUsage); - - const monthSummary = this.userUsage.summary.month; - const detailSummary: UsageRecord[] = []; - Object.keys(monthSummary).forEach(month => { - const monthUsage = monthSummary[month]; - Object.keys(monthUsage).forEach(resourceEntry => { - detailSummary.push({ - resource: resourceEntry, - usage: monthUsage[resourceEntry], - time: month, - }); - }); - }); - result.set(USAGE_DETAIL_TIME_KEY, detailSummary); - - const daySummary = this.userUsage.summary.day; - const dayDetailSummary: UsageRecord[] = []; - Object.keys(daySummary).forEach(day => { - const dayUsage = daySummary[day]; - Object.keys(dayUsage).forEach(resourceEntry => { - dayDetailSummary.push({ - resource: resourceEntry, - usage: dayUsage[resourceEntry], - time: day, - }); - }); - }); - result.set(USAGE_DAY_DETAIL_TIME_KEY, dayDetailSummary); - } - return Promise.resolve(result); + return this.userUsage.summary; + }, + default: { + day: {}, + month: {}, + year: {}, }, - default: new Map(), }); readonly usersUserMails = remoteData({ @@ -1084,12 +1040,13 @@ export default class UserPage extends React.Component {
Data usage
- diff --git a/src/main/webapp/app/shared/api/generated/API-docs.json b/src/main/webapp/app/shared/api/generated/API-docs.json index 7f09a105b..467c36dd1 100644 --- a/src/main/webapp/app/shared/api/generated/API-docs.json +++ b/src/main/webapp/app/shared/api/generated/API-docs.json @@ -3382,13 +3382,6 @@ }, "title": "Contact" }, - "JSONObject": { - "type": "object", - "title": "JSONObject", - "additionalProperties": { - "type": "object" - } - }, "KeyAndPasswordVM": { "type": "object", "properties": { @@ -3620,6 +3613,14 @@ }, "title": "ManagedUserVM" }, + "MapOfstringAndlong": { + "type": "object", + "title": "MapOfstringAndlong", + "additionalProperties": { + "type": "integer", + "format": "int64" + } + }, "PasswordChangeDTO": { "type": "object", "properties": { @@ -3717,7 +3718,8 @@ "additionalProperties": { "type": "object", "additionalProperties": { - "type": "object" + "type": "integer", + "format": "int64" } } }, @@ -3726,15 +3728,19 @@ "additionalProperties": { "type": "object", "additionalProperties": { - "type": "object" + "type": "integer", + "format": "int64" } } }, "year": { "type": "object", "additionalProperties": { - "type": "integer", - "format": "int64" + "type": "object", + "additionalProperties": { + "type": "integer", + "format": "int64" + } } } }, @@ -4040,43 +4046,57 @@ "dayUsage": { "type": "object", "additionalProperties": { - "type": "integer", - "format": "int64" + "$ref": "#/definitions/UserStats" + } + }, + "monthUsage": { + "type": "object", + "additionalProperties": { + "$ref": "#/definitions/UserStats" } }, - "endpoint": { + "userEmail": { "type": "string" }, - "maxUsageProportion": { - "type": "number", - "format": "float" + "userId": { + "type": "string" }, - "monthUsage": { + "yearUsage": { "type": "object", "additionalProperties": { - "type": "integer", - "format": "int64" + "$ref": "#/definitions/UserStats" } + } + }, + "title": "UserOverviewUsage" + }, + "UserStats": { + "type": "object", + "properties": { + "maxUsageProportion": { + "type": "number", + "format": "float" }, - "noPrivateEndpoint": { + "mostUsedEndpoint": { "type": "string" }, - "noPrivateMaxUsageProportion": { + "mostUsedPublicEndpoint": { + "type": "string" + }, + "publicMaxUsageProportion": { "type": "number", "format": "float" }, - "totalUsage": { + "totalPublicUsage": { "type": "integer", "format": "int64" }, - "userEmail": { - "type": "string" - }, - "userId": { - "type": "string" + "totalUsage": { + "type": "integer", + "format": "int64" } }, - "title": "UserOverviewUsage" + "title": "UserStats" }, "UserUsage": { "type": "object", diff --git a/src/main/webapp/app/shared/api/generated/API.ts b/src/main/webapp/app/shared/api/generated/API.ts index 51e9c76f5..053824e58 100644 --- a/src/main/webapp/app/shared/api/generated/API.ts +++ b/src/main/webapp/app/shared/api/generated/API.ts @@ -113,7 +113,6 @@ export type Contact = { 'phone': string }; -export type JSONObject = {}; export type KeyAndPasswordVM = { 'key': string @@ -206,6 +205,7 @@ export type ManagedUserVM = { 'tokenValidDays': number }; +export type MapOfstringAndlong = {}; export type PasswordChangeDTO = { 'currentPassword': string @@ -381,21 +381,27 @@ export type UserMailsDTO = { export type UserOverviewUsage = { 'dayUsage': {} - 'endpoint': string + 'monthUsage': {} - 'maxUsageProportion': number + 'userEmail': string - 'monthUsage': {} + 'userId': string - 'noPrivateEndpoint': string + 'yearUsage': {} - 'noPrivateMaxUsageProportion': number +}; +export type UserStats = { + 'maxUsageProportion': number - 'totalUsage': number + 'mostUsedEndpoint': string - 'userEmail': string + 'mostUsedPublicEndpoint': string - 'userId': string + 'publicMaxUsageProportion': number + + 'totalPublicUsage': number + + 'totalUsage': number }; export type UserUsage = { diff --git a/src/main/webapp/app/shared/texts/UsageText.tsx b/src/main/webapp/app/shared/texts/UsageText.tsx index 578e246a8..3cb7a0cd4 100644 --- a/src/main/webapp/app/shared/texts/UsageText.tsx +++ b/src/main/webapp/app/shared/texts/UsageText.tsx @@ -1,9 +1,9 @@ import React from 'react'; -function getUsageTextClassName(usage: number) { - if (usage >= 1000000000) { +function getUsageTextClassName(usage: number | undefined) { + if (usage !== undefined && usage >= 1000000000) { return 'text-danger'; - } else if (usage >= 1000000) { + } else if (usage !== undefined && usage >= 1000000) { return 'text-warning'; } else { return ''; @@ -11,11 +11,11 @@ function getUsageTextClassName(usage: number) { } const UsageText: React.FunctionComponent<{ - usage: number; + usage: number | undefined; }> = ({ usage }) => { return ( - {usage.toLocaleString()} + {usage?.toLocaleString() ?? 'N/A'} ); }; diff --git a/src/test/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisControllerIT.java b/src/test/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisControllerIT.java index 24ac4c7cd..cdf1d4f37 100644 --- a/src/test/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisControllerIT.java +++ b/src/test/java/org/mskcc/cbio/oncokb/web/rest/UsageAnalysisControllerIT.java @@ -20,6 +20,7 @@ import java.time.ZonedDateTime; import java.time.format.DateTimeFormatter; import java.util.*; +import java.util.AbstractMap.SimpleEntry; import java.util.Map.Entry; import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; @@ -27,7 +28,6 @@ import org.mockito.Mock; import org.mockito.Mockito; import org.mockito.MockitoAnnotations; -import org.mockito.Spy; import org.mskcc.cbio.oncokb.config.Constants; import org.mskcc.cbio.oncokb.domain.User; import org.mskcc.cbio.oncokb.domain.enumeration.FileExtension; @@ -465,43 +465,15 @@ private void safeSetNestedValueInFilesObject( obj.addProperty(lastKey, value); } - /** - * Set an empty object to the value found in the files JSON object based on the JSON path created by the - * keys. If an object is missing in the JSON path then it's created. - * @param value The value that is going to be added to value located in the JSON path. - * @param firstKey First key in the files object. - * @param index Array index of the array the {@code firstKey} parameter points to. - * @param keys The remaining JSON path keys. - */ - private void safeSetNestedEmptyObjectInFilesObject( - String firstKey, - String... keys - ) { - KeyValuePair pair = safeFetchJsonObjectFromFilesObject( - firstKey, - keys - ); - String lastKey = pair.key; - JsonObject obj = pair.value; - if (!obj.has(lastKey)) { - obj.add(lastKey, new JsonObject()); - } - } - private void addUsers(String[] userNames) throws Exception { LocalDate today = TimeUtil.getCurrentNYTime(this.clock).toLocalDate(); int currentYear = today.getYear(); int userId = -1; for (String userName : userNames) { - int totalUsage = 0; userId++; // force ordering to consistent since we are doing strict checks on // asserts for json userName = userId + userName; - HashMap userResourceUsage = new HashMap<>(); - for (String oncokbEndpoint : sampleOncokbEndpoints) { - userResourceUsage.put(oncokbEndpoint, 0); - } int companyIndex = userId % fakeCompanies.length; String companyName = fakeCompanies[companyIndex]; @@ -520,9 +492,12 @@ private void addUsers(String[] userNames) throws Exception { "/api/usage/summary/users?companyId=" + companyDTO.getId(), }; - for (int yearIndex = 0; yearIndex < 4; yearIndex++) { + for (int yearIndex = 0; yearIndex < 6; yearIndex++) { + boolean yearShouldBeRecorded = false; + Map yearUserResourceUsage = createUserResourceUsageMap(); + int yearTotalUsage = 0; + int yearTotalPublicUsage = 0; int year = currentYear - yearIndex; - Boolean isThisYear = yearIndex == 0; DateTimeFormatter dayFormatter = DateTimeFormatter.ofPattern( "yyyy-MM-dd" @@ -534,6 +509,10 @@ private void addUsers(String[] userNames) throws Exception { String yearKey = String.valueOf(year); for (int month = 1; month <= 12; month++) { + boolean monthShouldBeRecorded = false; + Map monthUserResourceUsage = createUserResourceUsageMap(); + int monthTotalUsage = 0; + int monthTotalPublicUsage = 0; YearMonth yearMonth = YearMonth.of(year, month); String monthKey = yearMonth.format(monthFormatter); LocalDate start = yearMonth.atDay(1).atStartOfDay().toLocalDate(); @@ -547,12 +526,16 @@ private void addUsers(String[] userNames) throws Exception { !date.isAfter(end) && !date.isAfter(today); date = date.plusDays(1) ) { + boolean dayShouldBeRecorded = false; + Map dayUserResourceUsage = createUserResourceUsageMap(); + int dayTotalUsage = 0; + int dayTotalPublicUsage = 0; int j = 0; String dayKey = date.format(dayFormatter); while (random.nextInt() % 5 == 0 && j < 5) { j++; String oncokbEndpoint = getNextOncokbEndpoint(); - int value = random.nextInt(100); + int value = random.nextInt(100) + 1; updateResourceYearFile( value, @@ -584,33 +567,29 @@ private void addUsers(String[] userNames) throws Exception { dayKey ); - boolean isAfterOrEqualToPast12Months = date.isAfter( - today.minusMonths(11).withDayOfMonth(1).minusDays(1) + boolean isAfterOrEqualToPast3FullYears = date.isAfter( + today.minusYears(3).withDayOfYear(1).minusDays(1) ); boolean isBeforeOrEqualToToday = date.isBefore( today.plusMonths(1).withDayOfMonth(1) ); - // update expected response for monthly resource summary - if (isThisYear) { + if (isAfterOrEqualToPast3FullYears && isBeforeOrEqualToToday) { updateResourceSummaryExpectedResponse( value, oncokbEndpoint, - monthKey + yearKey, + monthKey, + dayKey ); - } - - // update expected response for user usage endpoint - if (isThisYear) { safeAddNestedValueInFilesObject( value, usageUserEndpoint, "summary", "year", + yearKey, oncokbEndpoint ); - } - if (isAfterOrEqualToPast12Months && isBeforeOrEqualToToday) { safeAddNestedValueInFilesObject( value, usageUserEndpoint, @@ -627,86 +606,97 @@ private void addUsers(String[] userNames) throws Exception { dayKey, oncokbEndpoint ); - } - - if (isThisYear) { updateSpecificEndpointUserUsageExpectedResponse( value, user, oncokbEndpoint, - monthKey + yearKey, + monthKey, + dayKey ); - } - - // update user endpoint usage endpoint - if (isAfterOrEqualToPast12Months && isBeforeOrEqualToToday) { - for (String usageSummaryEndpoint : userUsageSummaryEndpoints) { - safeAddNestedValueInFilesObject( - value, - usageSummaryEndpoint, - userId, - "dayUsage", - dayKey - ); - - safeAddNestedValueInFilesObject( - value, - usageSummaryEndpoint, - userId, - "monthUsage", - monthKey - ); - } - } - if (isThisYear) { - userResourceUsage.put( + // track for user endpoint usage endpoint + dayUserResourceUsage.put( + oncokbEndpoint, + dayUserResourceUsage.get(oncokbEndpoint) + value + ); + monthUserResourceUsage.put( + oncokbEndpoint, + monthUserResourceUsage.get(oncokbEndpoint) + value + ); + yearUserResourceUsage.put( oncokbEndpoint, - userResourceUsage.get(oncokbEndpoint) + value + yearUserResourceUsage.get(oncokbEndpoint) + value ); - for (String usageSummaryEndpoint : userUsageSummaryEndpoints) { - safeAddNestedValueInFilesObject( - value, - usageSummaryEndpoint, - userId, - "totalUsage" - ); + if (!oncokbEndpoint.startsWith("/api/private/")) { + dayTotalPublicUsage += value; + monthTotalPublicUsage += value; + yearTotalPublicUsage += value; } - totalUsage += value; + dayTotalUsage += value; + monthTotalUsage += value; + yearTotalUsage += value; + dayShouldBeRecorded = true; + monthShouldBeRecorded = true; + yearShouldBeRecorded = true; } } + if (dayShouldBeRecorded) { + updateUserSummaryUsageExpectedResponse( + "dayUsage", + dayKey, + user, + dayTotalUsage, + dayTotalPublicUsage, + userUsageSummaryEndpoints, + dayUserResourceUsage + ); + } + } + if (monthShouldBeRecorded) { + updateUserSummaryUsageExpectedResponse( + "monthUsage", + monthKey, + user, + monthTotalUsage, + monthTotalPublicUsage, + userUsageSummaryEndpoints, + monthUserResourceUsage + ); } } + if (yearShouldBeRecorded) { + updateUserSummaryUsageExpectedResponse( + "yearUsage", + yearKey, + user, + yearTotalUsage, + yearTotalPublicUsage, + userUsageSummaryEndpoints, + yearUserResourceUsage + ); + } } - Entry maxResourceEntry = userResourceUsage - .entrySet() - .stream() - .max(Map.Entry.comparingByValue()) - .orElseThrow(Exception::new); - Entry maxNoPrivateResourceEntry = userResourceUsage - .entrySet() - .stream() - .filter(x -> !x.getKey().startsWith("/api/private/")) - .max(Map.Entry.comparingByValue()) - .orElseThrow(Exception::new); - - updateUserSummaryUsageExpectedResponse( - user, - totalUsage, - userUsageSummaryEndpoints, - maxResourceEntry, - maxNoPrivateResourceEntry - ); updateUserUsageExpectedResponse(user, userDto, usageUserEndpoint); } } + private HashMap createUserResourceUsageMap() { + HashMap userResourceUsage = new HashMap<>(); + for (String oncokbEndpoint : sampleOncokbEndpoints) { + userResourceUsage.put(oncokbEndpoint, 0); + } + return userResourceUsage; + } + private void updateSpecificEndpointUserUsageExpectedResponse( int value, User user, String oncokbEndpoint, - String monthKey + String yearKey, + String monthKey, + String dayKey ) { String usageResourcesEndpoint = "/api/usage/resources?endpoint=" + oncokbEndpoint; @@ -714,6 +704,7 @@ private void updateSpecificEndpointUserUsageExpectedResponse( value, usageResourcesEndpoint, "year", + yearKey, user.getEmail() ); safeAddNestedValueInFilesObject( @@ -723,16 +714,40 @@ private void updateSpecificEndpointUserUsageExpectedResponse( monthKey, user.getEmail() ); - safeSetNestedEmptyObjectInFilesObject(usageResourcesEndpoint, "day"); + safeAddNestedValueInFilesObject( + value, + usageResourcesEndpoint, + "day", + dayKey, + user.getEmail() + ); } private void updateUserSummaryUsageExpectedResponse( + String timePeriodKey, + String timePeriodValue, User user, int totalUsage, + int totalPublicUsage, String[] userUsageSummaryEndpoints, - Entry maxResourceEntry, - Entry maxNoPrivateResourceEntry - ) { + Map userResourceUsage + ) + throws Exception { + Entry maxResourceEntry = userResourceUsage + .entrySet() + .stream() + .filter(x -> x.getValue() > 0) + .max(Map.Entry.comparingByValue()) + .orElse(new SimpleEntry("", 0)); + + Entry maxPublicResourceEntry = userResourceUsage + .entrySet() + .stream() + .filter( + x -> !x.getKey().startsWith("/api/private/") && x.getValue() > 0 + ) + .max(Map.Entry.comparingByValue()) + .orElse(new SimpleEntry("", 0)); int userId = user.getId().intValue(); for (String usageSummaryUrl : userUsageSummaryEndpoints) { safeSetNestedValueInFilesObject( @@ -747,33 +762,58 @@ private void updateUserSummaryUsageExpectedResponse( userId, "userEmail" ); + safeSetNestedValueInFilesObject( + totalUsage, + usageSummaryUrl, + userId, + timePeriodKey, + timePeriodValue, + "totalUsage" + ); + safeSetNestedValueInFilesObject( + totalPublicUsage, + usageSummaryUrl, + userId, + timePeriodKey, + timePeriodValue, + "totalPublicUsage" + ); safeSetNestedValueInFilesObject( maxResourceEntry.getKey(), usageSummaryUrl, userId, - "endpoint" + timePeriodKey, + timePeriodValue, + "mostUsedEndpoint" ); safeSetNestedValueInFilesObject( - maxNoPrivateResourceEntry.getKey(), + maxPublicResourceEntry.getKey(), usageSummaryUrl, userId, - "noPrivateEndpoint" + timePeriodKey, + timePeriodValue, + "mostUsedPublicEndpoint" ); safeSetNestedValueInFilesObject( (int) (1000 * ((float) maxResourceEntry.getValue() / totalUsage)) / 10f, usageSummaryUrl, userId, + timePeriodKey, + timePeriodValue, "maxUsageProportion" ); safeSetNestedValueInFilesObject( (int) ( - 1000 * ((float) maxNoPrivateResourceEntry.getValue() / totalUsage) + 1000 * + ((float) maxPublicResourceEntry.getValue() / totalPublicUsage) ) / 10f, usageSummaryUrl, userId, - "noPrivateMaxUsageProportion" + timePeriodKey, + timePeriodValue, + "publicMaxUsageProportion" ); } } @@ -818,13 +858,16 @@ private void updateUserUsageExpectedResponse( private void updateResourceSummaryExpectedResponse( int value, String oncokbEndpoint, - String monthKey + String yearKey, + String monthKey, + String dayKey ) { String usageSummaryResources = "/api/usage/summary/resources"; safeAddNestedValueInFilesObject( value, usageSummaryResources, "year", + yearKey, oncokbEndpoint ); safeAddNestedValueInFilesObject( @@ -834,8 +877,13 @@ private void updateResourceSummaryExpectedResponse( monthKey, oncokbEndpoint ); - - safeSetNestedEmptyObjectInFilesObject(usageSummaryResources, "day"); + safeAddNestedValueInFilesObject( + value, + usageSummaryResources, + "day", + dayKey, + oncokbEndpoint + ); } private void updateResourceYearFile(