thryve-mcp-server 0.0.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Overview.csv +351 -0
- package/README.md +229 -0
- package/dist/category-mappings.d.ts +34 -0
- package/dist/category-mappings.d.ts.map +1 -0
- package/dist/category-mappings.js +146 -0
- package/dist/category-mappings.js.map +1 -0
- package/dist/data-enrichment.d.ts +19 -0
- package/dist/data-enrichment.d.ts.map +1 -0
- package/dist/data-enrichment.js +105 -0
- package/dist/data-enrichment.js.map +1 -0
- package/dist/data-types-generated.d.ts +70 -0
- package/dist/data-types-generated.d.ts.map +1 -0
- package/dist/data-types-generated.js +2597 -0
- package/dist/data-types-generated.js.map +1 -0
- package/dist/data-types.d.ts +53 -0
- package/dist/data-types.d.ts.map +1 -0
- package/dist/data-types.js +138 -0
- package/dist/data-types.js.map +1 -0
- package/dist/debug-logger.d.ts +17 -0
- package/dist/debug-logger.d.ts.map +1 -0
- package/dist/debug-logger.js +35 -0
- package/dist/debug-logger.js.map +1 -0
- package/dist/debug-middleware.d.ts +12 -0
- package/dist/debug-middleware.d.ts.map +1 -0
- package/dist/debug-middleware.js +36 -0
- package/dist/debug-middleware.js.map +1 -0
- package/dist/helpers.d.ts +19 -0
- package/dist/helpers.d.ts.map +1 -0
- package/dist/helpers.js +166 -0
- package/dist/helpers.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +754 -0
- package/dist/index.js.map +1 -0
- package/dist/schemas.d.ts +557 -0
- package/dist/schemas.d.ts.map +1 -0
- package/dist/schemas.js +338 -0
- package/dist/schemas.js.map +1 -0
- package/dist/tool-loader.d.ts +34 -0
- package/dist/tool-loader.d.ts.map +1 -0
- package/dist/tool-loader.js +108 -0
- package/dist/tool-loader.js.map +1 -0
- package/dist/tool-registry.d.ts +44 -0
- package/dist/tool-registry.d.ts.map +1 -0
- package/dist/tool-registry.js +54 -0
- package/dist/tool-registry.js.map +1 -0
- package/dist/tools/baseCategoryHandler.d.ts +28 -0
- package/dist/tools/baseCategoryHandler.d.ts.map +1 -0
- package/dist/tools/baseCategoryHandler.js +184 -0
- package/dist/tools/baseCategoryHandler.js.map +1 -0
- package/dist/tools/categories/getActivity.d.ts +10 -0
- package/dist/tools/categories/getActivity.d.ts.map +1 -0
- package/dist/tools/categories/getActivity.js +5 -0
- package/dist/tools/categories/getActivity.js.map +1 -0
- package/dist/tools/categories/getAudioAndHearing.d.ts +10 -0
- package/dist/tools/categories/getAudioAndHearing.d.ts.map +1 -0
- package/dist/tools/categories/getAudioAndHearing.js +5 -0
- package/dist/tools/categories/getAudioAndHearing.js.map +1 -0
- package/dist/tools/categories/getBloodGlucose.d.ts +10 -0
- package/dist/tools/categories/getBloodGlucose.d.ts.map +1 -0
- package/dist/tools/categories/getBloodGlucose.js +5 -0
- package/dist/tools/categories/getBloodGlucose.js.map +1 -0
- package/dist/tools/categories/getBodyComposition.d.ts +10 -0
- package/dist/tools/categories/getBodyComposition.d.ts.map +1 -0
- package/dist/tools/categories/getBodyComposition.js +5 -0
- package/dist/tools/categories/getBodyComposition.js.map +1 -0
- package/dist/tools/categories/getCardiovascular.d.ts +10 -0
- package/dist/tools/categories/getCardiovascular.d.ts.map +1 -0
- package/dist/tools/categories/getCardiovascular.js +5 -0
- package/dist/tools/categories/getCardiovascular.js.map +1 -0
- package/dist/tools/categories/getHeartRate.d.ts +10 -0
- package/dist/tools/categories/getHeartRate.d.ts.map +1 -0
- package/dist/tools/categories/getHeartRate.js +5 -0
- package/dist/tools/categories/getHeartRate.js.map +1 -0
- package/dist/tools/categories/getLocation.d.ts +10 -0
- package/dist/tools/categories/getLocation.d.ts.map +1 -0
- package/dist/tools/categories/getLocation.js +5 -0
- package/dist/tools/categories/getLocation.js.map +1 -0
- package/dist/tools/categories/getMicrobiome.d.ts +10 -0
- package/dist/tools/categories/getMicrobiome.d.ts.map +1 -0
- package/dist/tools/categories/getMicrobiome.js +5 -0
- package/dist/tools/categories/getMicrobiome.js.map +1 -0
- package/dist/tools/categories/getMovementAnalysis.d.ts +10 -0
- package/dist/tools/categories/getMovementAnalysis.d.ts.map +1 -0
- package/dist/tools/categories/getMovementAnalysis.js +5 -0
- package/dist/tools/categories/getMovementAnalysis.js.map +1 -0
- package/dist/tools/categories/getNutrition.d.ts +10 -0
- package/dist/tools/categories/getNutrition.d.ts.map +1 -0
- package/dist/tools/categories/getNutrition.js +5 -0
- package/dist/tools/categories/getNutrition.js.map +1 -0
- package/dist/tools/categories/getRespiratory.d.ts +10 -0
- package/dist/tools/categories/getRespiratory.d.ts.map +1 -0
- package/dist/tools/categories/getRespiratory.js +5 -0
- package/dist/tools/categories/getRespiratory.js.map +1 -0
- package/dist/tools/categories/getSleep.d.ts +10 -0
- package/dist/tools/categories/getSleep.d.ts.map +1 -0
- package/dist/tools/categories/getSleep.js +5 -0
- package/dist/tools/categories/getSleep.js.map +1 -0
- package/dist/tools/categories/getStressAndHRV.d.ts +10 -0
- package/dist/tools/categories/getStressAndHRV.d.ts.map +1 -0
- package/dist/tools/categories/getStressAndHRV.js +5 -0
- package/dist/tools/categories/getStressAndHRV.js.map +1 -0
- package/dist/tools/categories/getWellness.d.ts +10 -0
- package/dist/tools/categories/getWellness.d.ts.map +1 -0
- package/dist/tools/categories/getWellness.js +5 -0
- package/dist/tools/categories/getWellness.js.map +1 -0
- package/dist/tools/categories/getWomensHealth.d.ts +10 -0
- package/dist/tools/categories/getWomensHealth.d.ts.map +1 -0
- package/dist/tools/categories/getWomensHealth.js +5 -0
- package/dist/tools/categories/getWomensHealth.js.map +1 -0
- package/dist/tools/categories/getWorkouts.d.ts +10 -0
- package/dist/tools/categories/getWorkouts.d.ts.map +1 -0
- package/dist/tools/categories/getWorkouts.js +5 -0
- package/dist/tools/categories/getWorkouts.js.map +1 -0
- package/dist/tools/categoryTools.d.ts +100 -0
- package/dist/tools/categoryTools.d.ts.map +1 -0
- package/dist/tools/categoryTools.js +66 -0
- package/dist/tools/categoryTools.js.map +1 -0
- package/dist/tools/get.d.ts +39 -0
- package/dist/tools/get.d.ts.map +1 -0
- package/dist/tools/get.js +118 -0
- package/dist/tools/get.js.map +1 -0
- package/dist/tools/getAvailableDataTypes.d.ts +101 -0
- package/dist/tools/getAvailableDataTypes.d.ts.map +1 -0
- package/dist/tools/getAvailableDataTypes.js +120 -0
- package/dist/tools/getAvailableDataTypes.js.map +1 -0
- package/dist/tools/getConnectionWidgetUrl.d.ts +12 -0
- package/dist/tools/getConnectionWidgetUrl.d.ts.map +1 -0
- package/dist/tools/getConnectionWidgetUrl.js +26 -0
- package/dist/tools/getConnectionWidgetUrl.js.map +1 -0
- package/dist/tools/getDailyData.d.ts +30 -0
- package/dist/tools/getDailyData.d.ts.map +1 -0
- package/dist/tools/getDailyData.js +114 -0
- package/dist/tools/getDailyData.js.map +1 -0
- package/dist/tools/getEpochData.d.ts +30 -0
- package/dist/tools/getEpochData.d.ts.map +1 -0
- package/dist/tools/getEpochData.js +111 -0
- package/dist/tools/getEpochData.js.map +1 -0
- package/dist/tools/getHealthDataByCategory.d.ts +38 -0
- package/dist/tools/getHealthDataByCategory.d.ts.map +1 -0
- package/dist/tools/getHealthDataByCategory.js +231 -0
- package/dist/tools/getHealthDataByCategory.js.map +1 -0
- package/dist/tools/getUserInformation.d.ts +8 -0
- package/dist/tools/getUserInformation.d.ts.map +1 -0
- package/dist/tools/getUserInformation.js +24 -0
- package/dist/tools/getUserInformation.js.map +1 -0
- package/dist/tools/index.d.ts +7 -0
- package/dist/tools/index.d.ts.map +1 -0
- package/dist/tools/index.js +12 -0
- package/dist/tools/index.js.map +1 -0
- package/dist/tools/legacy.d.ts +37 -0
- package/dist/tools/legacy.d.ts.map +1 -0
- package/dist/tools/legacy.js +105 -0
- package/dist/tools/legacy.js.map +1 -0
- package/dist/tools/listConnectedSources.d.ts +11 -0
- package/dist/tools/listConnectedSources.d.ts.map +1 -0
- package/dist/tools/listConnectedSources.js +29 -0
- package/dist/tools/listConnectedSources.js.map +1 -0
- package/dist/tools/listDevices.d.ts +11 -0
- package/dist/tools/listDevices.d.ts.map +1 -0
- package/dist/tools/listDevices.js +29 -0
- package/dist/tools/listDevices.js.map +1 -0
- package/dist/tools/search-filters.d.ts +42 -0
- package/dist/tools/search-filters.d.ts.map +1 -0
- package/dist/tools/search-filters.js +210 -0
- package/dist/tools/search-filters.js.map +1 -0
- package/dist/tools/search-keyword.d.ts +32 -0
- package/dist/tools/search-keyword.d.ts.map +1 -0
- package/dist/tools/search-keyword.js +122 -0
- package/dist/tools/search-keyword.js.map +1 -0
- package/dist/tools/search-tools.d.ts +8 -0
- package/dist/tools/search-tools.d.ts.map +1 -0
- package/dist/tools/search-tools.js +273 -0
- package/dist/tools/search-tools.js.map +1 -0
- package/dist/types.d.ts +37 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/package.json +30 -0
- package/parse-csv.py +152 -0
- package/src/category-mappings.ts +181 -0
- package/src/data-enrichment.ts +125 -0
- package/src/data-types-generated.ts +2652 -0
- package/src/helpers.ts +198 -0
- package/src/index.ts +859 -0
- package/src/schemas.ts +372 -0
- package/src/tools/baseCategoryHandler.ts +243 -0
- package/src/tools/categoryTools.ts +101 -0
- package/src/tools/get.ts +147 -0
- package/src/tools/getAvailableDataTypes.ts +148 -0
- package/src/tools/index.ts +32 -0
- package/src/tools/listConnectedSources.ts +45 -0
- package/src/tools/listDevices.ts +45 -0
- package/src/tools/search-filters.ts +253 -0
- package/src/tools/search-keyword.ts +162 -0
- package/src/types.ts +44 -0
- package/tsconfig.json +20 -0
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Request } from "express";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { GetDailyDataSchema } from "../schemas.js";
|
|
4
|
+
import type { HealthDataRecord } from "../types.js";
|
|
5
|
+
export declare function getDailyData(req: Request, args: z.infer<typeof GetDailyDataSchema>): Promise<{
|
|
6
|
+
results: {};
|
|
7
|
+
metadata: {
|
|
8
|
+
categories: ("Activity" | "Sleep" | "Workouts" | "Movement Analysis" | "Heart Rate" | "Stress & HRV" | "Blood Glucose" | "Respiratory" | "Body Composition" | "Womens Health" | "Nutrition" | "Cardiovascular" | "Wellness" | "Audio & Hearing" | "Microbiome" | "Location")[];
|
|
9
|
+
timeRange: {
|
|
10
|
+
start: string;
|
|
11
|
+
end: string;
|
|
12
|
+
};
|
|
13
|
+
totalRecords: number;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
} | {
|
|
17
|
+
results: Record<string, HealthDataRecord[]>;
|
|
18
|
+
metadata: {
|
|
19
|
+
categories: ("Activity" | "Sleep" | "Workouts" | "Movement Analysis" | "Heart Rate" | "Stress & HRV" | "Blood Glucose" | "Respiratory" | "Body Composition" | "Womens Health" | "Nutrition" | "Cardiovascular" | "Wellness" | "Audio & Hearing" | "Microbiome" | "Location")[];
|
|
20
|
+
timeRange: {
|
|
21
|
+
start: string;
|
|
22
|
+
end: string;
|
|
23
|
+
};
|
|
24
|
+
totalRecords: number;
|
|
25
|
+
dataTypesFound: string[];
|
|
26
|
+
dataSources: number[] | undefined;
|
|
27
|
+
limitApplied: number | undefined;
|
|
28
|
+
};
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=getDailyData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDailyData.d.ts","sourceRoot":"","sources":["../../src/tools/getDailyData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAUpD,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;GA0FxF"}
|
|
@@ -0,0 +1,114 @@
|
|
|
1
|
+
import { extractThryveHeaders, buildUrlEncodedBody, getDefaultTimestampRange, THRYVE_API_BASE_URL, } from "../helpers.js";
|
|
2
|
+
import { getDataTypeIdsForCategories, CATEGORY_MAPPINGS } from "../category-mappings.js";
|
|
3
|
+
import { flattenThryveResponse, enrichWithDataTypes } from "../data-enrichment.js";
|
|
4
|
+
export async function getDailyData(req, args) {
|
|
5
|
+
const { headers, authToken } = extractThryveHeaders(req);
|
|
6
|
+
// Apply default timestamp range if not provided and extract dates
|
|
7
|
+
const defaults = getDefaultTimestampRange();
|
|
8
|
+
const startTimestamp = args.startTimestamp || defaults.startTimestamp;
|
|
9
|
+
const endTimestamp = args.endTimestamp || defaults.endTimestamp;
|
|
10
|
+
// Extract dates from timestamps for daily API
|
|
11
|
+
const startDay = startTimestamp.split('T')[0];
|
|
12
|
+
const endDay = endTimestamp.split('T')[0];
|
|
13
|
+
// Get data type IDs for requested categories
|
|
14
|
+
const dataTypeIds = getDataTypeIdsForCategories(args.categories);
|
|
15
|
+
if (dataTypeIds.length === 0) {
|
|
16
|
+
return {
|
|
17
|
+
results: {},
|
|
18
|
+
metadata: {
|
|
19
|
+
categories: args.categories,
|
|
20
|
+
timeRange: { start: startTimestamp, end: endTimestamp },
|
|
21
|
+
totalRecords: 0,
|
|
22
|
+
message: "No data types found for requested categories",
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Convert dataSources array to comma-separated string if provided
|
|
27
|
+
const dataSourcesParam = args.dataSources?.join(',');
|
|
28
|
+
const body = buildUrlEncodedBody({
|
|
29
|
+
authenticationToken: authToken,
|
|
30
|
+
startDay,
|
|
31
|
+
endDay,
|
|
32
|
+
dataSources: dataSourcesParam,
|
|
33
|
+
displayTypeName: "true",
|
|
34
|
+
});
|
|
35
|
+
const response = await fetch(`${THRYVE_API_BASE_URL}/v5/dailyDynamicValues`, {
|
|
36
|
+
method: "POST",
|
|
37
|
+
headers,
|
|
38
|
+
body,
|
|
39
|
+
});
|
|
40
|
+
if (!response.ok) {
|
|
41
|
+
throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
|
|
42
|
+
}
|
|
43
|
+
const data = await response.json();
|
|
44
|
+
// Flatten and enrich data
|
|
45
|
+
const flattenedData = flattenThryveResponse(data);
|
|
46
|
+
enrichWithDataTypes(flattenedData);
|
|
47
|
+
// Filter by requested data type IDs
|
|
48
|
+
const dataTypeIdSet = new Set(dataTypeIds);
|
|
49
|
+
const filteredData = flattenedData.filter((record) => {
|
|
50
|
+
const typeId = record.dataType || record.dailyDynamicValueType;
|
|
51
|
+
return typeId && dataTypeIdSet.has(typeId);
|
|
52
|
+
});
|
|
53
|
+
// Apply limit if specified
|
|
54
|
+
const limitedData = args.limit ? filteredData.slice(0, args.limit) : filteredData;
|
|
55
|
+
// Group results by category
|
|
56
|
+
const groupedResults = groupByCategory(limitedData, args.categories);
|
|
57
|
+
// Build metadata
|
|
58
|
+
const dataTypesFound = new Set();
|
|
59
|
+
limitedData.forEach((record) => {
|
|
60
|
+
const typeName = record.dailyDynamicValueTypeName;
|
|
61
|
+
if (typeName)
|
|
62
|
+
dataTypesFound.add(typeName);
|
|
63
|
+
});
|
|
64
|
+
const metadata = {
|
|
65
|
+
categories: args.categories,
|
|
66
|
+
timeRange: {
|
|
67
|
+
start: startTimestamp,
|
|
68
|
+
end: endTimestamp,
|
|
69
|
+
},
|
|
70
|
+
totalRecords: limitedData.length,
|
|
71
|
+
dataTypesFound: Array.from(dataTypesFound).sort(),
|
|
72
|
+
dataSources: args.dataSources,
|
|
73
|
+
limitApplied: args.limit,
|
|
74
|
+
};
|
|
75
|
+
return {
|
|
76
|
+
results: groupedResults,
|
|
77
|
+
metadata,
|
|
78
|
+
};
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Group records by requested categories
|
|
82
|
+
*/
|
|
83
|
+
function groupByCategory(records, requestedCategories) {
|
|
84
|
+
const grouped = {};
|
|
85
|
+
// Initialize structure for requested categories
|
|
86
|
+
for (const category of requestedCategories) {
|
|
87
|
+
grouped[category] = [];
|
|
88
|
+
}
|
|
89
|
+
// Get category data type IDs for matching
|
|
90
|
+
const categoryDataTypes = new Map();
|
|
91
|
+
for (const category of requestedCategories) {
|
|
92
|
+
const mapping = CATEGORY_MAPPINGS[category];
|
|
93
|
+
if (mapping) {
|
|
94
|
+
for (const dataTypeId of mapping.dataTypeIds) {
|
|
95
|
+
if (!categoryDataTypes.has(dataTypeId)) {
|
|
96
|
+
categoryDataTypes.set(dataTypeId, []);
|
|
97
|
+
}
|
|
98
|
+
categoryDataTypes.get(dataTypeId).push(category);
|
|
99
|
+
}
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
// Group records
|
|
103
|
+
for (const record of records) {
|
|
104
|
+
const typeId = record.dataType || record.dailyDynamicValueType;
|
|
105
|
+
if (typeId && categoryDataTypes.has(typeId)) {
|
|
106
|
+
const categories = categoryDataTypes.get(typeId);
|
|
107
|
+
for (const category of categories) {
|
|
108
|
+
grouped[category].push(record);
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
}
|
|
112
|
+
return grouped;
|
|
113
|
+
}
|
|
114
|
+
//# sourceMappingURL=getDailyData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getDailyData.js","sourceRoot":"","sources":["../../src/tools/getDailyData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,30 @@
|
|
|
1
|
+
import type { Request } from "express";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { GetEpochDataSchema } from "../schemas.js";
|
|
4
|
+
import type { HealthDataRecord } from "../types.js";
|
|
5
|
+
export declare function getEpochData(req: Request, args: z.infer<typeof GetEpochDataSchema>): Promise<{
|
|
6
|
+
results: {};
|
|
7
|
+
metadata: {
|
|
8
|
+
categories: ("Activity" | "Sleep" | "Workouts" | "Movement Analysis" | "Heart Rate" | "Stress & HRV" | "Blood Glucose" | "Respiratory" | "Body Composition" | "Womens Health" | "Nutrition" | "Cardiovascular" | "Wellness" | "Audio & Hearing" | "Microbiome" | "Location")[];
|
|
9
|
+
timeRange: {
|
|
10
|
+
start: string;
|
|
11
|
+
end: string;
|
|
12
|
+
};
|
|
13
|
+
totalRecords: number;
|
|
14
|
+
message: string;
|
|
15
|
+
};
|
|
16
|
+
} | {
|
|
17
|
+
results: Record<string, HealthDataRecord[]>;
|
|
18
|
+
metadata: {
|
|
19
|
+
categories: ("Activity" | "Sleep" | "Workouts" | "Movement Analysis" | "Heart Rate" | "Stress & HRV" | "Blood Glucose" | "Respiratory" | "Body Composition" | "Womens Health" | "Nutrition" | "Cardiovascular" | "Wellness" | "Audio & Hearing" | "Microbiome" | "Location")[];
|
|
20
|
+
timeRange: {
|
|
21
|
+
start: string;
|
|
22
|
+
end: string;
|
|
23
|
+
};
|
|
24
|
+
totalRecords: number;
|
|
25
|
+
dataTypesFound: string[];
|
|
26
|
+
dataSources: number[] | undefined;
|
|
27
|
+
limitApplied: number | undefined;
|
|
28
|
+
};
|
|
29
|
+
}>;
|
|
30
|
+
//# sourceMappingURL=getEpochData.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEpochData.d.ts","sourceRoot":"","sources":["../../src/tools/getEpochData.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,kBAAkB,EAAE,MAAM,eAAe,CAAC;AACxD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAUpD,wBAAsB,YAAY,CAAC,GAAG,EAAE,OAAO,EAAE,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,kBAAkB,CAAC;;;;;;;;;;;;;;;;;;;;;;;;GAsFxF"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { extractThryveHeaders, buildUrlEncodedBody, getDefaultTimestampRange, THRYVE_API_BASE_URL, } from "../helpers.js";
|
|
2
|
+
import { getDataTypeIdsForCategories, CATEGORY_MAPPINGS } from "../category-mappings.js";
|
|
3
|
+
import { flattenThryveResponse, enrichWithDataTypes } from "../data-enrichment.js";
|
|
4
|
+
export async function getEpochData(req, args) {
|
|
5
|
+
const { headers, authToken } = extractThryveHeaders(req);
|
|
6
|
+
// Apply default timestamp range if not provided
|
|
7
|
+
const defaults = getDefaultTimestampRange();
|
|
8
|
+
const startTimestamp = args.startTimestamp || defaults.startTimestamp;
|
|
9
|
+
const endTimestamp = args.endTimestamp || defaults.endTimestamp;
|
|
10
|
+
// Get data type IDs for requested categories
|
|
11
|
+
const dataTypeIds = getDataTypeIdsForCategories(args.categories);
|
|
12
|
+
if (dataTypeIds.length === 0) {
|
|
13
|
+
return {
|
|
14
|
+
results: {},
|
|
15
|
+
metadata: {
|
|
16
|
+
categories: args.categories,
|
|
17
|
+
timeRange: { start: startTimestamp, end: endTimestamp },
|
|
18
|
+
totalRecords: 0,
|
|
19
|
+
message: "No data types found for requested categories",
|
|
20
|
+
},
|
|
21
|
+
};
|
|
22
|
+
}
|
|
23
|
+
// Convert dataSources array to comma-separated string if provided
|
|
24
|
+
const dataSourcesParam = args.dataSources?.join(',');
|
|
25
|
+
const body = buildUrlEncodedBody({
|
|
26
|
+
authenticationToken: authToken,
|
|
27
|
+
startTimestamp,
|
|
28
|
+
endTimestamp,
|
|
29
|
+
dataSources: dataSourcesParam,
|
|
30
|
+
displayTypeName: "true",
|
|
31
|
+
});
|
|
32
|
+
const response = await fetch(`${THRYVE_API_BASE_URL}/v5/dynamicEpochValues`, {
|
|
33
|
+
method: "POST",
|
|
34
|
+
headers,
|
|
35
|
+
body,
|
|
36
|
+
});
|
|
37
|
+
if (!response.ok) {
|
|
38
|
+
throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
|
|
39
|
+
}
|
|
40
|
+
const data = await response.json();
|
|
41
|
+
// Flatten and enrich data
|
|
42
|
+
const flattenedData = flattenThryveResponse(data);
|
|
43
|
+
enrichWithDataTypes(flattenedData);
|
|
44
|
+
// Filter by requested data type IDs
|
|
45
|
+
const dataTypeIdSet = new Set(dataTypeIds);
|
|
46
|
+
const filteredData = flattenedData.filter((record) => {
|
|
47
|
+
const typeId = record.dataType || record.dynamicEpochValueType || record.dynamicValueType;
|
|
48
|
+
return typeId && dataTypeIdSet.has(typeId);
|
|
49
|
+
});
|
|
50
|
+
// Apply limit if specified
|
|
51
|
+
const limitedData = args.limit ? filteredData.slice(0, args.limit) : filteredData;
|
|
52
|
+
// Group results by category
|
|
53
|
+
const groupedResults = groupByCategory(limitedData, args.categories);
|
|
54
|
+
// Build metadata
|
|
55
|
+
const dataTypesFound = new Set();
|
|
56
|
+
limitedData.forEach((record) => {
|
|
57
|
+
const typeName = record.dynamicValueTypeName || record.dynamicEpochValueTypeName;
|
|
58
|
+
if (typeName)
|
|
59
|
+
dataTypesFound.add(typeName);
|
|
60
|
+
});
|
|
61
|
+
const metadata = {
|
|
62
|
+
categories: args.categories,
|
|
63
|
+
timeRange: {
|
|
64
|
+
start: startTimestamp,
|
|
65
|
+
end: endTimestamp,
|
|
66
|
+
},
|
|
67
|
+
totalRecords: limitedData.length,
|
|
68
|
+
dataTypesFound: Array.from(dataTypesFound).sort(),
|
|
69
|
+
dataSources: args.dataSources,
|
|
70
|
+
limitApplied: args.limit,
|
|
71
|
+
};
|
|
72
|
+
return {
|
|
73
|
+
results: groupedResults,
|
|
74
|
+
metadata,
|
|
75
|
+
};
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Group records by requested categories
|
|
79
|
+
*/
|
|
80
|
+
function groupByCategory(records, requestedCategories) {
|
|
81
|
+
const grouped = {};
|
|
82
|
+
// Initialize structure for requested categories
|
|
83
|
+
for (const category of requestedCategories) {
|
|
84
|
+
grouped[category] = [];
|
|
85
|
+
}
|
|
86
|
+
// Get category data type IDs for matching
|
|
87
|
+
const categoryDataTypes = new Map();
|
|
88
|
+
for (const category of requestedCategories) {
|
|
89
|
+
const mapping = CATEGORY_MAPPINGS[category];
|
|
90
|
+
if (mapping) {
|
|
91
|
+
for (const dataTypeId of mapping.dataTypeIds) {
|
|
92
|
+
if (!categoryDataTypes.has(dataTypeId)) {
|
|
93
|
+
categoryDataTypes.set(dataTypeId, []);
|
|
94
|
+
}
|
|
95
|
+
categoryDataTypes.get(dataTypeId).push(category);
|
|
96
|
+
}
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
// Group records
|
|
100
|
+
for (const record of records) {
|
|
101
|
+
const typeId = record.dataType || record.dynamicEpochValueType || record.dynamicValueType;
|
|
102
|
+
if (typeId && categoryDataTypes.has(typeId)) {
|
|
103
|
+
const categories = categoryDataTypes.get(typeId);
|
|
104
|
+
for (const category of categories) {
|
|
105
|
+
grouped[category].push(record);
|
|
106
|
+
}
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
return grouped;
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=getEpochData.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getEpochData.js","sourceRoot":"","sources":["../../src/tools/getEpochData.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
import type { Request } from "express";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { GetHealthDataByCategorySchema } from "../schemas.js";
|
|
4
|
+
import type { HealthDataRecord } from "../types.js";
|
|
5
|
+
interface GroupedResults {
|
|
6
|
+
[category: string]: {
|
|
7
|
+
daily?: HealthDataRecord[];
|
|
8
|
+
intraday?: HealthDataRecord[];
|
|
9
|
+
};
|
|
10
|
+
}
|
|
11
|
+
export declare function getHealthDataByCategory(req: Request, args: z.infer<typeof GetHealthDataByCategorySchema>): Promise<{
|
|
12
|
+
results: {};
|
|
13
|
+
metadata: {
|
|
14
|
+
categories: any;
|
|
15
|
+
timeRange: {
|
|
16
|
+
start: any;
|
|
17
|
+
end: any;
|
|
18
|
+
};
|
|
19
|
+
totalRecords: number;
|
|
20
|
+
message: string;
|
|
21
|
+
};
|
|
22
|
+
} | {
|
|
23
|
+
results: GroupedResults;
|
|
24
|
+
metadata: {
|
|
25
|
+
categories: any;
|
|
26
|
+
timeRange: {
|
|
27
|
+
start: any;
|
|
28
|
+
end: any;
|
|
29
|
+
};
|
|
30
|
+
granularity: any;
|
|
31
|
+
totalRecords: number;
|
|
32
|
+
dataTypesFound: string[];
|
|
33
|
+
dataSources: any;
|
|
34
|
+
limitApplied: any;
|
|
35
|
+
};
|
|
36
|
+
}>;
|
|
37
|
+
export {};
|
|
38
|
+
//# sourceMappingURL=getHealthDataByCategory.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getHealthDataByCategory.d.ts","sourceRoot":"","sources":["../../src/tools/getHealthDataByCategory.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,eAAe,CAAC;AACnE,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAWpD,UAAU,cAAc;IACtB,CAAC,QAAQ,EAAE,MAAM,GAAG;QAClB,KAAK,CAAC,EAAE,gBAAgB,EAAE,CAAC;QAC3B,QAAQ,CAAC,EAAE,gBAAgB,EAAE,CAAC;KAC/B,CAAC;CACH;AAED,wBAAsB,uBAAuB,CAC3C,GAAG,EAAE,OAAO,EACZ,IAAI,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,6BAA6B,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;GA8JpD"}
|
|
@@ -0,0 +1,231 @@
|
|
|
1
|
+
import { extractThryveHeaders, buildUrlEncodedBody, getDefaultTimestampRange, THRYVE_API_BASE_URL, generateRecordId, } from "../helpers.js";
|
|
2
|
+
import { getDataTypeIdsForCategories, CATEGORY_MAPPINGS } from "../category-mappings.js";
|
|
3
|
+
import { getDataTypeById } from "../data-types-generated.js";
|
|
4
|
+
export async function getHealthDataByCategory(req, args) {
|
|
5
|
+
const { headers, authToken } = extractThryveHeaders(req);
|
|
6
|
+
// Apply default timestamp range if not provided
|
|
7
|
+
const defaults = getDefaultTimestampRange();
|
|
8
|
+
const startTimestamp = args.startTimestamp || defaults.startTimestamp;
|
|
9
|
+
const endTimestamp = args.endTimestamp || defaults.endTimestamp;
|
|
10
|
+
// Extract dates for daily data API
|
|
11
|
+
const startDay = startTimestamp.split("T")[0];
|
|
12
|
+
const endDay = endTimestamp.split("T")[0];
|
|
13
|
+
// Get data type IDs for requested categories
|
|
14
|
+
const dataTypeIds = getDataTypeIdsForCategories(args.categories);
|
|
15
|
+
if (dataTypeIds.length === 0) {
|
|
16
|
+
return {
|
|
17
|
+
results: {},
|
|
18
|
+
metadata: {
|
|
19
|
+
categories: args.categories,
|
|
20
|
+
timeRange: { start: startTimestamp, end: endTimestamp },
|
|
21
|
+
totalRecords: 0,
|
|
22
|
+
message: "No data types found for requested categories",
|
|
23
|
+
},
|
|
24
|
+
};
|
|
25
|
+
}
|
|
26
|
+
// Determine which APIs to call based on granularity
|
|
27
|
+
const fetchDaily = args.granularity === "daily" || args.granularity === "both";
|
|
28
|
+
const fetchIntraday = args.granularity === "intraday" || args.granularity === "both";
|
|
29
|
+
const requests = [];
|
|
30
|
+
// Fetch daily data
|
|
31
|
+
if (fetchDaily) {
|
|
32
|
+
const dailyBody = buildUrlEncodedBody({
|
|
33
|
+
authenticationToken: authToken,
|
|
34
|
+
startDay,
|
|
35
|
+
endDay,
|
|
36
|
+
dataSources: args.dataSources?.join(","),
|
|
37
|
+
displayTypeName: "true",
|
|
38
|
+
});
|
|
39
|
+
requests.push(fetch(`${THRYVE_API_BASE_URL}/v5/dailyDynamicValues`, {
|
|
40
|
+
method: "POST",
|
|
41
|
+
headers,
|
|
42
|
+
body: dailyBody,
|
|
43
|
+
}));
|
|
44
|
+
}
|
|
45
|
+
// Fetch intraday/epoch data
|
|
46
|
+
if (fetchIntraday) {
|
|
47
|
+
const epochBody = buildUrlEncodedBody({
|
|
48
|
+
authenticationToken: authToken,
|
|
49
|
+
startTimestamp,
|
|
50
|
+
endTimestamp,
|
|
51
|
+
dataSources: args.dataSources?.join(","),
|
|
52
|
+
displayTypeName: "true",
|
|
53
|
+
});
|
|
54
|
+
requests.push(fetch(`${THRYVE_API_BASE_URL}/v5/dynamicEpochValues`, {
|
|
55
|
+
method: "POST",
|
|
56
|
+
headers,
|
|
57
|
+
body: epochBody,
|
|
58
|
+
}));
|
|
59
|
+
}
|
|
60
|
+
// Execute requests in parallel
|
|
61
|
+
const responses = await Promise.all(requests);
|
|
62
|
+
// Check for errors
|
|
63
|
+
for (const response of responses) {
|
|
64
|
+
if (!response.ok) {
|
|
65
|
+
throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
// Parse responses
|
|
69
|
+
const data = await Promise.all(responses.map((r) => r.json()));
|
|
70
|
+
let dailyData = [];
|
|
71
|
+
let epochData = [];
|
|
72
|
+
if (fetchDaily && !fetchIntraday) {
|
|
73
|
+
dailyData = Array.isArray(data[0]) ? data[0] : [];
|
|
74
|
+
}
|
|
75
|
+
else if (!fetchDaily && fetchIntraday) {
|
|
76
|
+
epochData = Array.isArray(data[0]) ? data[0] : [];
|
|
77
|
+
}
|
|
78
|
+
else {
|
|
79
|
+
dailyData = Array.isArray(data[0]) ? data[0] : [];
|
|
80
|
+
epochData = Array.isArray(data[1]) ? data[1] : [];
|
|
81
|
+
}
|
|
82
|
+
// Flatten and enrich data structures
|
|
83
|
+
const flattenedDaily = flattenThryveResponse(dailyData);
|
|
84
|
+
const flattenedEpoch = flattenThryveResponse(epochData);
|
|
85
|
+
// Enrich with data type metadata
|
|
86
|
+
enrichWithDataTypes(flattenedDaily);
|
|
87
|
+
enrichWithDataTypes(flattenedEpoch);
|
|
88
|
+
// Filter by requested data type IDs
|
|
89
|
+
const dataTypeIdSet = new Set(dataTypeIds);
|
|
90
|
+
const filteredDaily = flattenedDaily.filter((record) => {
|
|
91
|
+
const typeId = record.dataType || record.dailyDynamicValueType;
|
|
92
|
+
return typeId && dataTypeIdSet.has(typeId);
|
|
93
|
+
});
|
|
94
|
+
const filteredEpoch = flattenedEpoch.filter((record) => {
|
|
95
|
+
const typeId = record.dataType || record.dynamicEpochValueType || record.dynamicValueType;
|
|
96
|
+
return typeId && dataTypeIdSet.has(typeId);
|
|
97
|
+
});
|
|
98
|
+
// Apply limit if specified
|
|
99
|
+
let limitedDaily = filteredDaily;
|
|
100
|
+
let limitedEpoch = filteredEpoch;
|
|
101
|
+
if (args.limit) {
|
|
102
|
+
const limitPerCategory = Math.ceil(args.limit / args.categories.length);
|
|
103
|
+
limitedDaily = filteredDaily.slice(0, limitPerCategory);
|
|
104
|
+
limitedEpoch = filteredEpoch.slice(0, limitPerCategory);
|
|
105
|
+
}
|
|
106
|
+
// Group results by category
|
|
107
|
+
const groupedResults = groupByCategory(limitedDaily, limitedEpoch, args.categories);
|
|
108
|
+
// Build metadata
|
|
109
|
+
const dataTypesFound = new Set();
|
|
110
|
+
[...limitedDaily, ...limitedEpoch].forEach((record) => {
|
|
111
|
+
const typeName = record.dailyDynamicValueTypeName || record.dynamicValueTypeName || record.dynamicEpochValueTypeName;
|
|
112
|
+
if (typeName)
|
|
113
|
+
dataTypesFound.add(typeName);
|
|
114
|
+
});
|
|
115
|
+
const metadata = {
|
|
116
|
+
categories: args.categories,
|
|
117
|
+
timeRange: {
|
|
118
|
+
start: startTimestamp,
|
|
119
|
+
end: endTimestamp,
|
|
120
|
+
},
|
|
121
|
+
granularity: args.granularity,
|
|
122
|
+
totalRecords: limitedDaily.length + limitedEpoch.length,
|
|
123
|
+
dataTypesFound: Array.from(dataTypesFound).sort(),
|
|
124
|
+
dataSources: args.dataSources,
|
|
125
|
+
limitApplied: args.limit,
|
|
126
|
+
};
|
|
127
|
+
return {
|
|
128
|
+
results: groupedResults,
|
|
129
|
+
metadata,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
/**
|
|
133
|
+
* Flatten Thryve API response structure
|
|
134
|
+
*/
|
|
135
|
+
function flattenThryveResponse(data) {
|
|
136
|
+
const records = [];
|
|
137
|
+
if (!Array.isArray(data)) {
|
|
138
|
+
return records;
|
|
139
|
+
}
|
|
140
|
+
for (const item of data) {
|
|
141
|
+
if (item.dataSources && Array.isArray(item.dataSources)) {
|
|
142
|
+
for (const dataSource of item.dataSources) {
|
|
143
|
+
if (dataSource.data && Array.isArray(dataSource.data)) {
|
|
144
|
+
for (const record of dataSource.data) {
|
|
145
|
+
records.push({
|
|
146
|
+
...record,
|
|
147
|
+
dataSource: dataSource.dataSource,
|
|
148
|
+
dataSourceName: dataSource.dataSourceName,
|
|
149
|
+
_recordId: generateRecordId({ ...record, dataSource: dataSource.dataSource }),
|
|
150
|
+
});
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
}
|
|
156
|
+
return records;
|
|
157
|
+
}
|
|
158
|
+
/**
|
|
159
|
+
* Enrich records with data type metadata
|
|
160
|
+
*/
|
|
161
|
+
function enrichWithDataTypes(records) {
|
|
162
|
+
for (const record of records) {
|
|
163
|
+
const typeId = record.dailyDynamicValueType || record.dynamicValueType || record.dynamicEpochValueType;
|
|
164
|
+
if (typeId) {
|
|
165
|
+
const dataType = getDataTypeById(typeId);
|
|
166
|
+
if (dataType) {
|
|
167
|
+
if (record.dailyDynamicValueType) {
|
|
168
|
+
record.dailyDynamicValueTypeName = dataType.name;
|
|
169
|
+
}
|
|
170
|
+
else if (record.dynamicValueType || record.dynamicEpochValueType) {
|
|
171
|
+
record.dynamicValueTypeName = dataType.name;
|
|
172
|
+
record.dynamicEpochValueTypeName = dataType.name;
|
|
173
|
+
}
|
|
174
|
+
record.category = dataType.category;
|
|
175
|
+
record.unit = dataType.unit;
|
|
176
|
+
record.dataType = typeId;
|
|
177
|
+
}
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
}
|
|
181
|
+
/**
|
|
182
|
+
* Group records by requested categories
|
|
183
|
+
*/
|
|
184
|
+
function groupByCategory(dailyRecords, epochRecords, requestedCategories) {
|
|
185
|
+
const grouped = {};
|
|
186
|
+
// Initialize structure for requested categories
|
|
187
|
+
for (const category of requestedCategories) {
|
|
188
|
+
grouped[category] = {};
|
|
189
|
+
}
|
|
190
|
+
// Get category data type IDs for matching
|
|
191
|
+
const categoryDataTypes = new Map();
|
|
192
|
+
for (const category of requestedCategories) {
|
|
193
|
+
const mapping = CATEGORY_MAPPINGS[category];
|
|
194
|
+
if (mapping) {
|
|
195
|
+
for (const dataTypeId of mapping.dataTypeIds) {
|
|
196
|
+
if (!categoryDataTypes.has(dataTypeId)) {
|
|
197
|
+
categoryDataTypes.set(dataTypeId, []);
|
|
198
|
+
}
|
|
199
|
+
categoryDataTypes.get(dataTypeId).push(category);
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
}
|
|
203
|
+
// Group daily records
|
|
204
|
+
for (const record of dailyRecords) {
|
|
205
|
+
const typeId = record.dataType || record.dailyDynamicValueType;
|
|
206
|
+
if (typeId && categoryDataTypes.has(typeId)) {
|
|
207
|
+
const categories = categoryDataTypes.get(typeId);
|
|
208
|
+
for (const category of categories) {
|
|
209
|
+
if (!grouped[category].daily) {
|
|
210
|
+
grouped[category].daily = [];
|
|
211
|
+
}
|
|
212
|
+
grouped[category].daily.push(record);
|
|
213
|
+
}
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
// Group epoch records
|
|
217
|
+
for (const record of epochRecords) {
|
|
218
|
+
const typeId = record.dataType || record.dynamicEpochValueType || record.dynamicValueType;
|
|
219
|
+
if (typeId && categoryDataTypes.has(typeId)) {
|
|
220
|
+
const categories = categoryDataTypes.get(typeId);
|
|
221
|
+
for (const category of categories) {
|
|
222
|
+
if (!grouped[category].intraday) {
|
|
223
|
+
grouped[category].intraday = [];
|
|
224
|
+
}
|
|
225
|
+
grouped[category].intraday.push(record);
|
|
226
|
+
}
|
|
227
|
+
}
|
|
228
|
+
}
|
|
229
|
+
return grouped;
|
|
230
|
+
}
|
|
231
|
+
//# sourceMappingURL=getHealthDataByCategory.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getHealthDataByCategory.js","sourceRoot":"","sources":["../../src/tools/getHealthDataByCategory.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import type { Request } from "express";
|
|
2
|
+
import type { z } from "zod";
|
|
3
|
+
import type { GetUserInformationSchema } from "../schemas.js";
|
|
4
|
+
export declare function getUserInformation(req: Request, _args: z.infer<typeof GetUserInformationSchema>): Promise<{
|
|
5
|
+
connectedSources: any;
|
|
6
|
+
devices: any;
|
|
7
|
+
}>;
|
|
8
|
+
//# sourceMappingURL=getUserInformation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getUserInformation.d.ts","sourceRoot":"","sources":["../../src/tools/getUserInformation.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AACvC,OAAO,KAAK,EAAE,CAAC,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,eAAe,CAAC;AAO9D,wBAAsB,kBAAkB,CAAC,GAAG,EAAE,OAAO,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,CAAC,OAAO,wBAAwB,CAAC;;;GA0BrG"}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { extractThryveHeaders, buildUrlEncodedBody, THRYVE_API_BASE_URL, } from "../helpers.js";
|
|
2
|
+
export async function getUserInformation(req, _args) {
|
|
3
|
+
const { headers, authToken } = extractThryveHeaders(req);
|
|
4
|
+
const body = buildUrlEncodedBody({ authenticationToken: authToken });
|
|
5
|
+
const response = await fetch(`${THRYVE_API_BASE_URL}/v5/userInformation`, {
|
|
6
|
+
method: "POST",
|
|
7
|
+
headers,
|
|
8
|
+
body,
|
|
9
|
+
});
|
|
10
|
+
if (!response.ok) {
|
|
11
|
+
throw new Error(`Thryve API error: ${response.status} ${response.statusText}`);
|
|
12
|
+
}
|
|
13
|
+
const data = await response.json();
|
|
14
|
+
// Filter out sensitive personal information - only return connected sources
|
|
15
|
+
if (Array.isArray(data) && data.length > 0) {
|
|
16
|
+
const userData = data[0];
|
|
17
|
+
return {
|
|
18
|
+
connectedSources: userData.connectedSources || [],
|
|
19
|
+
devices: userData.devices || [],
|
|
20
|
+
};
|
|
21
|
+
}
|
|
22
|
+
return { connectedSources: [], devices: [] };
|
|
23
|
+
}
|
|
24
|
+
//# sourceMappingURL=getUserInformation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"getUserInformation.js","sourceRoot":"","sources":["../../src/tools/getUserInformation.ts"],"names":[],"mappings":"AAGA,OAAO,EACL,oBAAoB,EACpB,mBAAmB,EACnB,mBAAmB,GACpB,MAAM,eAAe,CAAC;AAEvB,MAAM,CAAC,KAAK,UAAU,kBAAkB,CAAC,GAAY,EAAE,KAA+C;IACpG,MAAM,EAAE,OAAO,EAAE,SAAS,EAAE,GAAG,oBAAoB,CAAC,GAAG,CAAC,CAAC;IACzD,MAAM,IAAI,GAAG,mBAAmB,CAAC,EAAE,mBAAmB,EAAE,SAAS,EAAE,CAAC,CAAC;IAErE,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,GAAG,mBAAmB,qBAAqB,EAAE;QACxE,MAAM,EAAE,MAAM;QACd,OAAO;QACP,IAAI;KACL,CAAC,CAAC;IAEH,IAAI,CAAC,QAAQ,CAAC,EAAE,EAAE,CAAC;QACjB,MAAM,IAAI,KAAK,CAAC,qBAAqB,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAAC,CAAC;IACjF,CAAC;IAED,MAAM,IAAI,GAAG,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAC;IAEnC,4EAA4E;IAC5E,IAAI,KAAK,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC3C,MAAM,QAAQ,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;QACzB,OAAO;YACL,gBAAgB,EAAE,QAAQ,CAAC,gBAAgB,IAAI,EAAE;YACjD,OAAO,EAAE,QAAQ,CAAC,OAAO,IAAI,EAAE;SAChC,CAAC;IACJ,CAAC;IAED,OAAO,EAAE,gBAAgB,EAAE,EAAE,EAAE,OAAO,EAAE,EAAE,EAAE,CAAC;AAC/C,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export { getActivity, getHeartRate, getSleep, getWorkouts, getStressAndHRV, getRespiratory, getBloodGlucose, getBodyComposition, getWomensHealth, getNutrition, getCardiovascular, getWellness, getAudioAndHearing, getMicrobiome, getLocation, getMovementAnalysis, } from "./categoryTools.js";
|
|
2
|
+
export { searchKeyword } from "./search-keyword.js";
|
|
3
|
+
export { searchFilters } from "./search-filters.js";
|
|
4
|
+
export { listConnectedSources } from "./listConnectedSources.js";
|
|
5
|
+
export { listDevices } from "./listDevices.js";
|
|
6
|
+
export { getAvailableDataTypes } from "./getAvailableDataTypes.js";
|
|
7
|
+
//# sourceMappingURL=index.d.ts.map
|