feat(transaction): #80 calculate balances
Some checks failed
Build Docker Image / Build-Docker-Image (push) Failing after 4m54s
Some checks failed
Build Docker Image / Build-Docker-Image (push) Failing after 4m54s
This commit is contained in:
@@ -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 ""
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user