func handleTransactionWebhook(w http.ResponseWriter, r *http.Request) {
var payload struct {
Event string `json:"event"`
Data map[string]interface{} `json:"data"`
}
if err := json.NewDecoder(r.Body).Decode(&payload); err != nil {
http.Error(w, "invalid payload", http.StatusBadRequest)
return
}
if payload.Event != "transaction.applied" {
w.WriteHeader(http.StatusOK)
return
}
meta, _ := payload.Data["meta_data"].(map[string]interface{})
if meta["transaction_type"] != "savings" {
w.WriteHeader(http.StatusOK)
return
}
client := getClient()
savingsBalanceID, _ := payload.Data["destination"].(string)
savingsBalance, _, err := client.LedgerBalance.Get(savingsBalanceID)
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
balanceMeta := savingsBalance.MetaData
if scheduleSavings, _ := balanceMeta["schedule_savings"].(bool); !scheduleSavings {
w.WriteHeader(http.StatusOK)
return
}
frequency, _ := balanceMeta["savings_frequency"].(string)
if frequency == "" {
frequency = "monthly"
}
amount, _ := balanceMeta["savings_amount"].(float64)
nextScheduledDate := calculateNextScheduledDate(frequency)
_, _, err = client.Metadata.UpdateMetadata(savingsBalanceID, blnkgo.UpdateMetaDataRequest{
MetaData: map[string]interface{}{
"next_scheduled_savings": nextScheduledDate.Format(time.RFC3339),
},
})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
uniqueReference := fmt.Sprintf("sch-savings-%d", time.Now().Unix())
scheduledSavings, _, err := client.Transaction.Create(blnkgo.CreateTransactionRequest{
ParentTransaction: blnkgo.ParentTransaction{
PreciseAmount: amount * 100,
Precision: 100,
Reference: uniqueReference,
Description: "Scheduled savings deposit",
Currency: "USD",
Source: "@WorldUSD",
Destination: savingsBalanceID,
MetaData: map[string]interface{}{
"transaction_type": "savings",
},
},
ScheduledFor: &nextScheduledDate,
})
if err != nil {
http.Error(w, err.Error(), http.StatusInternalServerError)
return
}
fmt.Printf("Next scheduled deposit created for %s: %s\n", nextScheduledDate.Format(time.RFC3339), scheduledSavings.TransactionID)
w.WriteHeader(http.StatusOK)
}