feat(transaction): #80 calculate balances
Some checks failed
Build Docker Image / Build-Docker-Image (push) Failing after 4m54s

This commit is contained in:
2025-05-16 22:26:41 +02:00
parent 3dc9f8ec6f
commit eb461aa7fb
4 changed files with 121 additions and 611 deletions

View File

@@ -76,7 +76,18 @@ func (s TransactionImpl) Add(user *types.User, transactionInput types.Transactio
UPDATE account
SET current_balance = current_balance + ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.AccountId, user.Id)
err = db.TransformAndLogDbError("transaction UpdateAccount", r, err)
err = db.TransformAndLogDbError("transaction Update", r, err)
if err != nil {
return nil, err
}
}
if transaction.TreasureChestId != nil {
r, err = s.db.Exec(`
UPDATE treasure_chest
SET current_balance = current_balance + ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.TreasureChestId, user.Id)
err = db.TransformAndLogDbError("transaction Update", r, err)
if err != nil {
return nil, err
}
@@ -111,7 +122,17 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput)
UPDATE account
SET current_balance = current_balance - ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.AccountId, user.Id)
err = db.TransformAndLogDbError("transaction UpdateAccount", r, err)
err = db.TransformAndLogDbError("transaction Update", r, err)
if err != nil {
return nil, err
}
}
if transaction.TreasureChestId != nil {
r, err := s.db.Exec(`
UPDATE treasure_chest
SET current_balance = current_balance - ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.TreasureChestId, user.Id)
err = db.TransformAndLogDbError("transaction Update", r, err)
if err != nil {
return nil, err
}
@@ -127,7 +148,17 @@ func (s TransactionImpl) Update(user *types.User, input types.TransactionInput)
UPDATE account
SET current_balance = current_balance + ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.AccountId, user.Id)
err = db.TransformAndLogDbError("transaction UpdateAccount", r, err)
err = db.TransformAndLogDbError("transaction Update", r, err)
if err != nil {
return nil, err
}
}
if transaction.TreasureChestId != nil {
r, err := s.db.Exec(`
UPDATE treasure_chest
SET current_balance = current_balance + ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.TreasureChestId, user.Id)
err = db.TransformAndLogDbError("transaction Update", r, err)
if err != nil {
return nil, err
}
@@ -211,7 +242,16 @@ func (s TransactionImpl) Delete(user *types.User, id string) error {
WHERE id = (SELECT account_id FROM "transaction" WHERE id = ? AND user_id = ?)
`, uuid, user.Id, uuid, user.Id)
err = db.TransformAndLogDbError("transaction Delete", r, err)
if err != nil {
if err != nil && err != db.ErrNotFound {
return err
}
r, err = s.db.Exec(`
UPDATE treasure_chest
SET current_balance = current_balance - (SELECT value FROM "transaction" WHERE id = ? AND user_id = ?)
WHERE id = (SELECT treasure_chest_id FROM "transaction" WHERE id = ? AND user_id = ?)
`, uuid, user.Id, uuid, user.Id)
err = db.TransformAndLogDbError("transaction Delete", r, err)
if err != nil && err != db.ErrNotFound {
return err
}
@@ -230,7 +270,14 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error {
return ErrUnauthorized
}
r, err := s.db.Exec(`
tx, err := s.db.Beginx()
err = db.TransformAndLogDbError("transaction RecalculateBalances", nil, err)
if err != nil {
return err
}
defer tx.Rollback()
r, err := tx.Exec(`
UPDATE account
SET current_balance = 0
WHERE user_id = ?`, user.Id)
@@ -239,7 +286,7 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error {
return err
}
r, err = s.db.Exec(`
r, err = tx.Exec(`
UPDATE treasure_chest
SET current_balance = 0
WHERE user_id = ?`, user.Id)
@@ -248,7 +295,10 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error {
return err
}
rows, err := s.db.Queryx(`SELECT account_id, treasure_chest_id, value FROM "transaction" WHERE user_id = ?`, user.Id)
rows, err := tx.Queryx(`
SELECT *
FROM "transaction"
WHERE user_id = ?`, user.Id)
err = db.TransformAndLogDbError("transaction RecalculateBalances", nil, err)
if err != nil && err != db.ErrNotFound {
return err
@@ -268,8 +318,22 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error {
return err
}
updateErrors(transaction)
r, err = tx.Exec(`
UPDATE "transaction"
SET error = ?
WHERE user_id = ?
AND id = ?`, transaction.Error, user.Id, transaction.Id)
err = db.TransformAndLogDbError("transaction RecalculateBalances", r, err)
if err != nil {
return err
}
if transaction.Error != nil {
log.Info("err: %s", *transaction.Error)
}
if transaction.AccountId != nil {
r, err = s.db.Exec(`
r, err = tx.Exec(`
UPDATE account
SET current_balance = current_balance + ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.AccountId, user.Id)
@@ -279,7 +343,7 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error {
}
}
if transaction.TreasureChestId != nil {
r, err = s.db.Exec(`
r, err = tx.Exec(`
UPDATE treasure_chest
SET current_balance = current_balance + ?
WHERE id = ? AND user_id = ?`, transaction.Value, transaction.TreasureChestId, user.Id)
@@ -290,6 +354,8 @@ func (s TransactionImpl) RecalculateBalances(user *types.User) error {
}
}
tx.Commit()
return nil
}
@@ -404,20 +470,34 @@ func (s TransactionImpl) validateAndEnrichTransaction(oldTransaction *types.Tran
UpdatedAt: updatedAt,
UpdatedBy: &updatedBy,
}
error := getErrors(transaction)
if error != "" {
transaction.Error = &error
}
updateErrors(&transaction)
return &transaction, nil
}
func getErrors(transaction types.Transaction) string {
func updateErrors(transaction *types.Transaction) {
error := ""
if transaction.Value < 0 {
// panic("unimplemented")
if transaction.AccountId == nil {
error = "no account specified"
} else if transaction.TreasureChestId == nil {
error = "no treasure chest specified"
}
} else if transaction.Value > 0 {
// panic("unimplemented")
if transaction.AccountId == nil && transaction.TreasureChestId == nil {
error = "either an account or a treasure chest needs to be specified"
} else if transaction.AccountId != nil && transaction.TreasureChestId != nil {
error = "positive amounts can only be applied to either an account or a treasure chest"
}
} else {
return "\"value\" needs to be positive or negative"
error = "\"value\" needs to be specified"
}
if error == "" {
transaction.Error = nil
} else {
transaction.Error = &error
}
return ""
}