package main import ( "context" "encoding/json" "fmt" "log" "os" "time" "api-service/internal/config" services "api-service/internal/services/satusehat" "github.com/joho/godotenv" ) func main() { fmt.Println("SatuSehat Specific Requests - Organization & Patient by NIK") fmt.Println("==========================================================") // Load environment variables from .env file err := godotenv.Load("../.env") if err != nil { log.Printf("Warning: Could not load .env file: %v", err) } // Set debug logging os.Setenv("LOG_LEVEL", "debug") // Load configuration from environment variables cfg := config.LoadConfig() // Create SatuSehat service service := services.NewSatuSehatServiceFromConfig(cfg) ctx, cancel := context.WithTimeout(context.Background(), 60*time.Second) defer cancel() // Test 1: Get Organization by ID (using OrgID from config) fmt.Println("\n1. Get Organization by ID:") orgID := cfg.SatuSehat.OrgID fmt.Printf(" Using OrgID: %s\n", orgID) orgEndpoint := fmt.Sprintf("/Organization/%s", orgID) orgResult, err := service.GetRawResponse(ctx, orgEndpoint) if err != nil { log.Printf("Error getting organization: %v", err) } else { fmt.Printf(" Status Code: %d\n", orgResult.StatusCode) fmt.Printf(" Success: %v\n", orgResult.Success) fmt.Printf(" Message: %s\n", orgResult.Message) if orgResult.Data != nil { fmt.Printf(" Data Type: %T\n", orgResult.Data) // Convert data to JSON for better readability if jsonData, err := json.MarshalIndent(orgResult.Data, " ", " "); err == nil { fmt.Printf(" Organization Data: \n%s\n", string(jsonData)) } else { fmt.Printf(" Data (raw): %+v\n", orgResult.Data) } } if orgResult.Error != nil { fmt.Printf(" Error Code: %s\n", orgResult.Error.Code) fmt.Printf(" Error Details: %s\n", orgResult.Error.Details) } } // Test 2: Get Patient by specific NIK fmt.Println("\n2. Get Patient by Specific NIK:") specificNIK := "3512162601960002" fmt.Printf(" Using NIK: %s\n", specificNIK) patientResult, err := service.GetPatientByNIK(ctx, specificNIK) if err != nil { log.Printf("Error getting patient: %v", err) } else { fmt.Printf(" Status Code: %d\n", patientResult.StatusCode) fmt.Printf(" Success: %v\n", patientResult.Success) fmt.Printf(" Message: %s\n", patientResult.Message) if patientResult.Data != nil { fmt.Printf(" Data Type: %T\n", patientResult.Data) // Convert data to JSON for better readability if jsonData, err := json.MarshalIndent(patientResult.Data, " ", " "); err == nil { fmt.Printf(" Patient Data: \n%s\n", string(jsonData)) // Extract and display specific patient information displayPatientDetails(patientResult.Data) } else { fmt.Printf(" Data (raw): %+v\n", patientResult.Data) } } if patientResult.Error != nil { fmt.Printf(" Error Code: %s\n", patientResult.Error.Code) fmt.Printf(" Error Details: %s\n", patientResult.Error.Details) } } // Test 3: Health check to verify token status fmt.Println("\n3. Service Health Check:") isValid := service.IsTokenValid() fmt.Printf(" Token Valid: %v\n", isValid) if !isValid { fmt.Println(" Refreshing token...") err = service.RefreshToken(ctx) if err != nil { log.Printf("Error refreshing token: %v", err) } else { fmt.Println(" Token refreshed successfully") fmt.Printf(" Token Valid After Refresh: %v\n", service.IsTokenValid()) } } fmt.Println("\nSpecific requests test completed!") } // displayPatientDetails extracts and displays specific patient information from FHIR response func displayPatientDetails(data interface{}) { fmt.Println("\n --- Patient Details ---") // Convert to map for easier access if dataMap, ok := data.(map[string]interface{}); ok { // Check if it's a Bundle if resourceType, exists := dataMap["resourceType"]; exists && resourceType == "Bundle" { if entries, exists := dataMap["entry"]; exists { if entryList, ok := entries.([]interface{}); ok && len(entryList) > 0 { if firstEntry, ok := entryList[0].(map[string]interface{}); ok { if resource, exists := firstEntry["resource"]; exists { if patient, ok := resource.(map[string]interface{}); ok { // Display basic patient info fmt.Printf(" Patient ID: %v\n", patient["id"]) // Display name if names, exists := patient["name"].([]interface{}); exists && len(names) > 0 { if name, ok := names[0].(map[string]interface{}); ok { fmt.Printf(" Name: %v\n", name["text"]) } } // Display identifiers if identifiers, exists := patient["identifier"].([]interface{}); exists { fmt.Println(" Identifiers:") for _, ident := range identifiers { if identifier, ok := ident.(map[string]interface{}); ok { system := identifier["system"] value := identifier["value"] fmt.Printf(" - %s: %v\n", system, value) } } } // Display status fmt.Printf(" Active: %v\n", patient["active"]) // Display meta information if meta, exists := patient["meta"].(map[string]interface{}); exists { fmt.Printf(" Last Updated: %v\n", meta["lastUpdated"]) if profiles, exists := meta["profile"].([]interface{}); exists { fmt.Printf(" FHIR Profile: %v\n", profiles[0]) } } } } } } } } } fmt.Println(" -----------------------") }