Files
projet_gestion_commande/backend/gestion/workers/payment_checker.go
T
2026-03-18 19:20:37 +01:00

79 lines
2.4 KiB
Go

package workers
import (
"gestion/db"
"gestion/services"
"log"
"time"
)
func StartPaymentChecker(database *db.Database, np *services.NowPaymentsClient, interval time.Duration) {
go func() {
for {
time.Sleep(interval)
checkPendingCryptoPayments(database, np)
}
}()
log.Printf("[CRON] payment checker démarré (toutes les %s)", interval)
}
// StartDynamicPaymentChecker démarre un checker qui recharge le client NowPayments à chaque tick
// (permet de prendre en compte les changements de clé API sans redémarrer)
func StartDynamicPaymentChecker(database *db.Database, clientFn func() *services.NowPaymentsClient, interval time.Duration) {
go func() {
ticker := time.NewTicker(interval)
defer ticker.Stop()
for range ticker.C {
np := clientFn()
if np == nil {
continue
}
checkPendingCryptoPayments(database, np)
}
}()
log.Printf("[CRON] payment checker dynamique démarré (toutes les %s)", interval)
}
func checkPendingCryptoPayments(database *db.Database, np *services.NowPaymentsClient) {
payments, err := database.GetPendingCryptoPayments()
if err != nil {
log.Printf("[CRON] erreur récupération paiements en attente: %v", err)
return
}
for _, payment := range payments {
status, err := np.GetPaymentStatus(payment.NowPaymentID)
if err != nil {
log.Printf("[CRON] erreur vérification paiement %d: %v", payment.ID, err)
continue
}
if status.PaymentStatus == payment.Status {
continue
}
log.Printf("[CRON] paiement %d (cmd %d): %s → %s", payment.ID, payment.CommandID, payment.Status, status.PaymentStatus)
payAmount, _ := status.PayAmount.Float64()
if err := database.UpdateCryptoPaymentStatus(payment.ID, status.PaymentStatus, payAmount); err != nil {
log.Printf("[CRON] erreur mise à jour paiement %d: %v", payment.ID, err)
continue
}
switch status.PaymentStatus {
case "finished", "confirmed":
if err := database.ActivateCryptoCommand(payment.CommandID); err != nil {
log.Printf("[CRON] erreur activation commande %d: %v", payment.CommandID, err)
} else {
log.Printf("[CRON] commande %d activée après paiement crypto", payment.CommandID)
}
case "failed", "expired":
if err := database.CancelCryptoCommand(payment.CommandID); err != nil {
log.Printf("[CRON] erreur annulation commande %d: %v", payment.CommandID, err)
} else {
log.Printf("[CRON] commande %d annulée (paiement %s)", payment.CommandID, status.PaymentStatus)
}
}
}
}