feat: implement health statistics tracking (Phase 2.7 Task 2)

- Add HealthStatistics model with 10 stat types
- Implement HealthStatisticsRepository
- Create 6 health stats API endpoints
- Add trend analysis with summary calculations
- Follow medication repository pattern

Status: 60% complete, needs compilation fixes
This commit is contained in:
goose 2026-03-07 16:24:18 -03:00
parent d673415bc6
commit b59be78e4a
18 changed files with 2420 additions and 7 deletions

264
solaria-test.sh Normal file
View file

@ -0,0 +1,264 @@
#!/bin/bash
API_URL="http://localhost:8001"
USER_EMAIL="med-test-${RANDOM}@example.com"
USER_NAME="medtest${RANDOM}"
echo "=========================================="
echo "Phase 2.7 MVP - Comprehensive API Test"
echo "Running on Solaria server"
echo "=========================================="
echo ""
# Test 1: Health Check
echo "🔍 Test 1: Health Check"
echo "Endpoint: GET /health"
HEALTH=$(curl -s -w "\nHTTP_CODE:%{http_code}" ${API_URL}/health)
HTTP_CODE=$(echo "$HEALTH" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$HEALTH" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
# Test 2: Register User
echo "🔍 Test 2: Register New User"
echo "Endpoint: POST /api/auth/register"
REGISTER=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST ${API_URL}/api/auth/register \
-H "Content-Type: application/json" \
-d '{"email":"'${USER_EMAIL}'","username":"'${USER_NAME}'","password":"SecurePass123!","first_name":"Test","last_name":"User"}')
HTTP_CODE=$(echo "$REGISTER" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$REGISTER" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "201" ]; then
echo "✅ PASS"
USER_ID=$(echo "$BODY" | grep -o '"id":"[^"]*' | cut -d'"' -f4)
echo "User ID: $USER_ID"
else
echo "❌ FAIL"
fi
echo ""
# Test 3: Login
echo "🔍 Test 3: Login"
echo "Endpoint: POST /api/auth/login"
LOGIN=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST ${API_URL}/api/auth/login \
-H "Content-Type: application/json" \
-d '{"email":"'${USER_EMAIL}'","password":"SecurePass123!"}')
HTTP_CODE=$(echo "$LOGIN" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$LOGIN" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
TOKEN=$(echo "$BODY" | grep -o '"access_token":"[^"]*' | cut -d'"' -f4)
echo "Token obtained: ${TOKEN:0:20}..."
else
echo "❌ FAIL"
exit 1
fi
echo ""
# Test 4: Create Medication
echo "🔍 Test 4: Create Medication"
echo "Endpoint: POST /api/medications"
CREATE_MED=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST ${API_URL}/api/medications \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"profile_id":null,"name":"Lisinopril","dosage":"10mg","frequency":"once_daily","instructions":"Take with breakfast","start_date":"2026-03-01"}')
HTTP_CODE=$(echo "$CREATE_MED" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$CREATE_MED" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "201" ]; then
echo "✅ PASS"
MED_ID=$(echo "$BODY" | grep -o '"id":"[^"]*' | head -1 | cut -d'"' -f4)
echo "Medication ID: $MED_ID"
else
echo "❌ FAIL"
fi
echo ""
# Test 5: List Medications
echo "🔍 Test 5: List Medications"
echo "Endpoint: GET /api/medications"
LIST_MEDS=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/medications \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$LIST_MEDS" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$LIST_MEDS" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
MED_COUNT=$(echo "$BODY" | grep -o '"medication_id"' | wc -l)
echo "Medications found: $MED_COUNT"
else
echo "❌ FAIL"
fi
echo ""
# Test 6: Get Specific Medication
echo "🔍 Test 6: Get Specific Medication"
echo "Endpoint: GET /api/medications/$MED_ID"
GET_MED=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/medications/$MED_ID \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$GET_MED" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$GET_MED" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
# Test 7: Update Medication
echo "🔍 Test 7: Update Medication"
echo "Endpoint: PUT /api/medications/$MED_ID"
UPDATE_MED=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X PUT ${API_URL}/api/medications/$MED_ID \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"dosage":"20mg","instructions":"Take with breakfast and dinner"}')
HTTP_CODE=$(echo "$UPDATE_MED" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$UPDATE_MED" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
UPDATED_DOSAGE=$(echo "$BODY" | grep -o '"dosage":"[^"]*' | cut -d'"' -f4)
echo "Updated dosage: $UPDATED_DOSAGE"
else
echo "❌ FAIL"
fi
echo ""
# Test 8: Log Dose
echo "🔍 Test 8: Log Dose"
echo "Endpoint: POST /api/medications/$MED_ID/log"
LOG_DOSE=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST ${API_URL}/api/medications/$MED_ID/log \
-H "Content-Type: application/json" \
-H "Authorization: Bearer $TOKEN" \
-d '{"taken":true,"scheduled_time":"2026-03-07T08:00:00Z","notes":"Taken with breakfast"}')
HTTP_CODE=$(echo "$LOG_DOSE" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$LOG_DOSE" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "201" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
# Test 9: Get Adherence
echo "🔍 Test 9: Get Adherence"
echo "Endpoint: GET /api/medications/$MED_ID/adherence"
ADHERENCE=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/medications/$MED_ID/adherence \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$ADHERENCE" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$ADHERENCE" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
ADH_PCT=$(echo "$BODY" | grep -o '"adherence_percentage":[0-9.]*' | cut -d: -f2)
echo "Adherence: $ADH_PCT%"
else
echo "❌ FAIL"
fi
echo ""
# Test 10: Unauthorized Access
echo "🔍 Test 10: Unauthorized Access (No Token)"
echo "Endpoint: GET /api/medications"
UNAUTH=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/medications)
HTTP_CODE=$(echo "$UNAUTH" | grep "HTTP_CODE" | cut -d: -f2)
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "401" ]; then
echo "✅ PASS - Correctly blocked unauthorized access"
else
echo "❌ FAIL - Should return 401"
fi
echo ""
# Test 11: Get Profile
echo "🔍 Test 11: Get User Profile"
echo "Endpoint: GET /api/users/me"
PROFILE=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/users/me \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$PROFILE" | grep "HTTP_CODE" | cut -d: -f2)
BODY=$(echo "$PROFILE" | sed '/HTTP_CODE/d')
echo "Response: $BODY"
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
# Test 12: Delete Medication
echo "🔍 Test 12: Delete Medication"
echo "Endpoint: POST /api/medications/$MED_ID/delete"
DELETE_MED=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST ${API_URL}/api/medications/$MED_ID/delete \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$DELETE_MED" | grep "HTTP_CODE" | cut -d: -f2)
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "204" ] || [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS - Medication deleted"
else
echo "❌ FAIL"
fi
echo ""
# Test 13: List Shares
echo "🔍 Test 13: List Shares"
echo "Endpoint: GET /api/shares"
SHARES=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/shares \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$SHARES" | grep "HTTP_CODE" | cut -d: -f2)
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
# Test 14: Get Sessions
echo "🔍 Test 14: Get Sessions"
echo "Endpoint: GET /api/sessions"
SESSIONS=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X GET ${API_URL}/api/sessions \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$SESSIONS" | grep "HTTP_CODE" | cut -d: -f2)
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
# Test 15: Logout
echo "🔍 Test 15: Logout"
echo "Endpoint: POST /api/auth/logout"
LOGOUT=$(curl -s -w "\nHTTP_CODE:%{http_code}" -X POST ${API_URL}/api/auth/logout \
-H "Authorization: Bearer $TOKEN")
HTTP_CODE=$(echo "$LOGOUT" | grep "HTTP_CODE" | cut -d: -f2)
echo "HTTP Status: $HTTP_CODE"
if [ "$HTTP_CODE" = "204" ] || [ "$HTTP_CODE" = "200" ]; then
echo "✅ PASS"
else
echo "❌ FAIL"
fi
echo ""
echo "=========================================="
echo "All Tests Complete!"
echo "=========================================="