package main import ( "bytes" "encoding/json" "fmt" "io" "net/http" "os" "strings" "time" ) func main() { identityURL := getenv("DECISIOQ_IDENTITY_URL", "https://identity.vinquery.com/connect/token") catalogURL := strings.TrimRight(getenv("DECISIOQ_DKS_URL", "https://dks.vinquery.com"), "/") decisionServiceURL := strings.TrimRight(getenv("DECISIOQ_DDE_URL", "https://dde.vinquery.com"), "/") correlationID := fmt.Sprintf("auto-fleet-001-go-%d", time.Now().Unix()) tokenBody, err := request("POST", identityURL, map[string]string{"clientId": required("DECISIOQ_CLIENT_ID"), "clientSecret": required("DECISIOQ_CLIENT_SECRET"), "audience": getenv("DECISIOQ_AUDIENCE", "vinquery:api:decisioq")}, "", "") if err != nil { panic(err) } var token struct{ JwtToken string `json:"jwtToken"` } json.Unmarshal(tokenBody, &token) if _, err = request("GET", catalogURL+"/decisioncatalog/decisions/AUTO-FLEET-001", nil, token.JwtToken, correlationID); err != nil { panic(err) } execution := map[string]any{ "decisionId": "AUTO-FLEET-001", "profileId": "balanced", "scenarioId": nil, "algorithm": "TOPSIS", "weightStrategy": "Expert", "runSensitivity": false, "requestContext": map[string]string{"correlationId": correlationID}, "options": []map[string]any{ {"optionId": "VEHICLE-001", "name": "Vehicle 001", "values": map[string]float64{"lifecycle_cost": 18000, "downtime_risk": 9, "maintenance_trend": 6, "utilization_criticality": 92, "safety_rating": 4.5}}, {"optionId": "VEHICLE-002", "name": "Vehicle 002", "values": map[string]float64{"lifecycle_cost": 14500, "downtime_risk": 3, "maintenance_trend": 2, "utilization_criticality": 76, "safety_rating": 4}}, }, } result, err := request("POST", decisionServiceURL+"/api/v1/decide", execution, token.JwtToken, correlationID) if err != nil { panic(err) } fmt.Println(string(result)) } func request(method, url string, payload any, token, correlationID string) ([]byte, error) { var body io.Reader if payload != nil { data, _ := json.Marshal(payload); body = bytes.NewReader(data) } req, _ := http.NewRequest(method, url, body) req.Header.Set("Accept", "application/json") if payload != nil { req.Header.Set("Content-Type", "application/json") } if token != "" { req.Header.Set("Authorization", "Bearer "+token) } if correlationID != "" { req.Header.Set("X-Correlation-Id", correlationID) } resp, err := (&http.Client{Timeout: 45 * time.Second}).Do(req) if err != nil { return nil, err } defer resp.Body.Close() result, _ := io.ReadAll(resp.Body) if resp.StatusCode < 200 || resp.StatusCode >= 300 { return nil, fmt.Errorf("HTTP %d: %s", resp.StatusCode, string(result)) } return result, nil } func required(name string) string { value := os.Getenv(name); if value == "" { panic("Set " + name) }; return value } func getenv(name, fallback string) string { if value := os.Getenv(name); value != "" { return value }; return fallback }