farmstar-survey-backend/internal/hooks/transaction.go

94 lines
2.8 KiB
Go

package hooks
import (
"database/sql"
"fmt"
"github.com/grassrootseconomics/farmstar-survey-backend/internal/worker"
"github.com/pocketbase/dbx"
"github.com/pocketbase/pocketbase/core"
)
func (r *HooksContainer) bootstrapTransactionHook() {
r.pb.OnModelAfterCreate("transactions").Add(func(e *core.ModelEvent) error {
transactionRecord, err := r.pb.Dao().FindRecordById("transactions", e.Model.GetId())
if err != nil {
return err
}
quantity := uint(transactionRecord.GetInt("evergrow_quantity"))
initiatorRecord, err := r.pb.Dao().FindRecordById("users", transactionRecord.GetString("initiator"))
if err != nil {
return err
}
counterpartyRecord, err := r.pb.Dao().FindRecordById("users", transactionRecord.GetString("counterparty"))
if err != nil {
return err
}
inverseTransactionRecord, err := r.pb.Dao().FindFirstRecordByFilter(
"transactions",
"completed = {:completed} && evergrow_quantity = {:quantity} && initiator = {:initiator} && counterparty = {:counterparty} && tx_date = {:tx_date}",
dbx.Params{
"completed": false,
"quantity": transactionRecord.GetInt("evergrow_quantity"),
"initiator": counterpartyRecord.GetId(),
"counterparty": initiatorRecord.GetId(),
"tx_date": transactionRecord.GetDateTime("tx_date"),
},
)
if err != nil && err != sql.ErrNoRows {
return err
}
if inverseTransactionRecord != nil {
if isFarmer(initiatorRecord.GetString("participant_type")) {
if err := r.worker.QueueRewardsTask(initiatorRecord.GetString("phone"), 65_000_000*quantity); err != nil {
return err
}
}
if isFarmer(counterpartyRecord.GetString("participant_type")) {
if err := r.worker.QueueRewardsTask(counterpartyRecord.GetString("phone"), 65_000_000*quantity); err != nil {
return err
}
}
transactionRecord.Set("completed", true)
if err := r.pb.Dao().SaveRecord(transactionRecord); err != nil {
return err
}
inverseTransactionRecord.Set("completed", true)
if err := r.pb.Dao().SaveRecord(inverseTransactionRecord); err != nil {
return err
}
}
if err := r.worker.QueueSMSTask(initiatorRecord.GetString("phone"), worker.PurchaseComplete, ""); err != nil {
return err
}
msg := fmt.Sprintf(
"New purchase survey completed:\n\ninitiator: %s\ncounterparty: %s\nquantity: %d\ndate: %s\nfeedback: %s",
fmt.Sprintf("%s (%s)", initiatorRecord.GetString("name"), initiatorRecord.GetString("participant_type")),
fmt.Sprintf("%s (%s)", counterpartyRecord.GetString("name"), counterpartyRecord.GetString("participant_type")),
transactionRecord.GetInt("evergrow_quantity"),
transactionRecord.GetDateTime("tx_date").String(),
transactionRecord.GetString("feedback"),
)
if err := r.worker.QueueTgTask(msg); err != nil {
return err
}
return nil
})
}
func isFarmer(value string) bool {
return value == "farmer"
}