This commit is contained in:
MaysWind
2025-02-16 23:35:55 +08:00
parent 85e88949c4
commit 8f55bd0df1
+42 -3
View File
@@ -253,7 +253,7 @@ func (s *TransactionService) CreateTransaction(c core.Context, transaction *mode
}
return s.UserDataDB(transaction.Uid).DoTransaction(c, func(sess *xorm.Session) error {
return s.doCreateTransaction(sess, transaction, transactionTagIndexes, tagIds, pictureIds, pictureUpdateModel)
return s.doCreateTransaction(c, sess, transaction, transactionTagIndexes, tagIds, pictureIds, pictureUpdateModel)
})
}
@@ -360,7 +360,7 @@ func (s *TransactionService) BatchCreateTransactions(c core.Context, uid int64,
transaction := transactions[i]
transactionTagIndexes := allTransactionTagIndexes[transaction.TransactionId]
transactionTagIds := allTransactionTagIds[transaction.TransactionId]
err := s.doCreateTransaction(sess, transaction, transactionTagIndexes, transactionTagIds, nil, nil)
err := s.doCreateTransaction(c, sess, transaction, transactionTagIndexes, transactionTagIds, nil, nil)
if err != nil {
transactionUnixTime := utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime)
@@ -546,6 +546,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
has, err := sess.ID(transaction.TransactionId).Where("uid=? AND deleted=?", transaction.Uid, false).Get(oldTransaction)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to get current transaction, because %s", err.Error())
return err
} else if !has {
return errs.ErrTransactionNotFound
@@ -568,6 +569,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
sourceAccount, destinationAccount, err := s.getAccountModels(sess, transaction)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to get account, because %s", err.Error())
return err
}
@@ -592,6 +594,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
oldSourceAccount, oldDestinationAccount, err := s.getOldAccountModels(sess, transaction, oldTransaction, sourceAccount, destinationAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to get old account, because %s", err.Error())
return err
}
@@ -625,6 +628,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
has, err = sess.Where("uid=? AND deleted=? AND transaction_time>=? AND transaction_time<=?", transaction.Uid, false, minTransactionTime, maxTransactionTime).OrderBy("transaction_time desc").Limit(1).Get(sameSecondLatestTransaction)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to get trasaction time, because %s", err.Error())
return err
}
@@ -706,6 +710,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
}
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to get whether other transactions exist, because %s", err.Error())
return err
} else if otherTransactionExists {
return errs.ErrCannotAddTransactionBeforeBalanceModificationTransaction
@@ -716,6 +721,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(transaction.TransactionId).Cols(updateCols...).Where("uid=? AND deleted=?", transaction.Uid, false).Update(transaction)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update transaction, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrTransactionNotFound
@@ -732,6 +738,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(relatedTransaction.TransactionId).Cols(relatedUpdateCols...).Where("uid=? AND deleted=?", relatedTransaction.Uid, false).Update(relatedTransaction)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update related transaction, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -748,6 +755,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
deletedRows, err := sess.Cols("deleted", "deleted_unix_time").Where("uid=? AND deleted=? AND transaction_id=?", transaction.Uid, false, transaction.TransactionId).In("tag_id", removeTagIds).Update(tagIndexUpdateModel)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to remove old transaction tag index, because %s", err.Error())
return err
} else if deletedRows < 1 {
return errs.ErrTransactionTagNotFound
@@ -762,6 +770,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
_, err := sess.Insert(transactionTagIndex)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to add new transaction tag index, because %s", err.Error())
return err
}
}
@@ -773,6 +782,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
_, err := sess.Where("uid=? AND deleted=? AND transaction_id=?", transaction.Uid, false, transaction.TransactionId).Update(tagIndexUpdateModel)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update transaction tag index, because %s", err.Error())
return err
}
}
@@ -787,6 +797,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
deletedRows, err := sess.Cols("deleted", "deleted_unix_time").Where("uid=? AND deleted=? AND transaction_id=?", transaction.Uid, false, transaction.TransactionId).In("picture_id", removePictureIds).Update(pictureUpdateModel)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to remove old transaction picture info, because %s", err.Error())
return err
} else if deletedRows < 1 {
return errs.ErrTransactionPictureNotFound
@@ -802,6 +813,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
_, err = sess.Cols("transaction_id", "updated_unix_time").Where("uid=? AND deleted=? AND transaction_id=?", transaction.Uid, false, models.TransactionPictureNewPictureTransactionId).In("picture_id", addPictureIds).Update(pictureUpdateModel)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update new transaction picture info, because %s", err.Error())
return err
}
}
@@ -817,6 +829,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)+(%d)", oldTransaction.RelatedAccountAmount, transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -837,6 +850,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(oldSourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)+(%d)", oldTransaction.Amount, oldAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldSourceAccount.Uid, false).Update(oldSourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -848,6 +862,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", newAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -868,6 +883,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(oldSourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)-(%d)", oldTransaction.Amount, oldAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldSourceAccount.Uid, false).Update(oldSourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -879,6 +895,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", newAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -899,6 +916,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(oldSourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)-(%d)", oldTransaction.Amount, oldSourceAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldSourceAccount.Uid, false).Update(oldSourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -910,6 +928,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", newSourceAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -930,6 +949,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(oldDestinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)+(%d)", oldTransaction.RelatedAccountAmount, oldDestinationAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", oldDestinationAccount.Uid, false).Update(oldDestinationAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -941,6 +961,7 @@ func (s *TransactionService) ModifyTransaction(c core.Context, transaction *mode
updatedRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", newDestinationAccountNewAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount)
if err != nil {
log.Errorf(c, "[transactions.ModifyTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1541,7 +1562,7 @@ func (s *TransactionService) GetTransactionIds(transactions []*models.Transactio
return transactionIds
}
func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction *models.Transaction, transactionTagIndexes []*models.TransactionTagIndex, tagIds []int64, pictureIds []int64, pictureUpdateModel *models.TransactionPictureInfo) error {
func (s *TransactionService) doCreateTransaction(c core.Context, sess *xorm.Session, transaction *models.Transaction, transactionTagIndexes []*models.TransactionTagIndex, tagIds []int64, pictureIds []int64, pictureUpdateModel *models.TransactionPictureInfo) error {
// Get and verify source and destination account
sourceAccount, destinationAccount, err := s.getAccountModels(sess, transaction)
@@ -1593,6 +1614,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
otherTransactionExists, err := sess.Cols("uid", "deleted", "account_id").Where("uid=? AND deleted=? AND account_id=?", transaction.Uid, false, sourceAccount.AccountId).Limit(1).Exist(&models.Transaction{})
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to get whether other transactions exist, because %s", err.Error())
return err
} else if otherTransactionExists {
return errs.ErrBalanceModificationTransactionCannotAddWhenNotEmpty
@@ -1610,6 +1632,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
}
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to get whether other transactions exist, because %s", err.Error())
return err
} else if otherTransactionExists {
return errs.ErrCannotAddTransactionBeforeBalanceModificationTransaction
@@ -1626,6 +1649,12 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
createdRows, err := sess.Insert(transaction)
if err != nil || createdRows < 1 { // maybe another transaction has same time
if err != nil {
log.Warnf(c, "[transactions.doCreateTransaction] cannot create trasaction, because %s, regenerate transaction time value", err.Error())
} else {
log.Warnf(c, "[transactions.doCreateTransaction] cannot create trasaction, regenerate transaction time value")
}
sameSecondLatestTransaction := &models.Transaction{}
minTransactionTime := utils.GetMinTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime))
maxTransactionTime := utils.GetMaxTransactionTimeFromUnixTime(utils.GetUnixTimeFromTransactionTime(transaction.TransactionTime))
@@ -1633,6 +1662,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
has, err := sess.Where("uid=? AND transaction_time>=? AND transaction_time<=?", transaction.Uid, minTransactionTime, maxTransactionTime).OrderBy("transaction_time desc").Limit(1).Get(sameSecondLatestTransaction)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to get trasaction time, because %s", err.Error())
return err
} else if !has {
return errs.ErrDatabaseOperationFailed
@@ -1644,6 +1674,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
createdRows, err := sess.Insert(transaction)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to add transaction again, because %s", err.Error())
return err
} else if createdRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1660,6 +1691,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
createdRows, err := sess.Insert(relatedTransaction)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to add related transaction, because %s", err.Error())
return err
} else if createdRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1677,6 +1709,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
_, err := sess.Insert(transactionTagIndex)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to add transaction tag index, because %s", err.Error())
return err
}
}
@@ -1687,6 +1720,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
_, err = sess.Cols("transaction_id", "updated_unix_time").Where("uid=? AND deleted=? AND transaction_id=?", transaction.Uid, false, models.TransactionPictureNewPictureTransactionId).In("picture_id", pictureIds).Update(pictureUpdateModel)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update transaction picture info, because %s", err.Error())
return err
}
}
@@ -1697,6 +1731,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1706,6 +1741,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1715,6 +1751,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
updatedRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1724,6 +1761,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
updatedSourceRows, err := sess.ID(sourceAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance-(%d)", transaction.Amount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", sourceAccount.Uid, false).Update(sourceAccount)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedSourceRows < 1 {
return errs.ErrDatabaseOperationFailed
@@ -1733,6 +1771,7 @@ func (s *TransactionService) doCreateTransaction(sess *xorm.Session, transaction
updatedDestinationRows, err := sess.ID(destinationAccount.AccountId).SetExpr("balance", fmt.Sprintf("balance+(%d)", transaction.RelatedAccountAmount)).Cols("updated_unix_time").Where("uid=? AND deleted=?", destinationAccount.Uid, false).Update(destinationAccount)
if err != nil {
log.Errorf(c, "[transactions.doCreateTransaction] failed to update account balance, because %s", err.Error())
return err
} else if updatedDestinationRows < 1 {
return errs.ErrDatabaseOperationFailed