transaction tag index supports soft delete

This commit is contained in:
MaysWind
2021-01-18 00:26:51 +08:00
parent 1d37352099
commit a7c77cf68e
4 changed files with 34 additions and 9 deletions
+7 -4
View File
@@ -2,10 +2,13 @@ package models
// TransactionTagIndex represents transaction and transaction tag relation stored in database
type TransactionTagIndex struct {
Uid int64 `xorm:"PK INDEX(IDX_transaction_tag_index_uid_tag_id_transaction_time) INDEX(IDX_transaction_tag_index_uid_transaction_id)"`
TagId int64 `xorm:"PK INDEX(IDX_transaction_tag_index_uid_tag_id_transaction_time)"`
TransactionId int64 `xorm:"PK INDEX(IDX_transaction_tag_index_uid_transaction_id)"`
TransactionTime int64 `xorm:"INDEX(IDX_transaction_tag_index_uid_tag_id_transaction_time) NOT NULL"`
TagIndexId int64 `xorm:"PK"`
Uid int64 `xorm:"INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_id) INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_time) INDEX(IDX_transaction_tag_index_uid_deleted_transaction_id)"`
Deleted bool `xorm:"INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_id) INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_time) INDEX(IDX_transaction_tag_index_uid_deleted_transaction_id) NOT NULL"`
TagId int64 `xorm:"INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_id) INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_time)"`
TransactionId int64 `xorm:"INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_id) INDEX(IDX_transaction_tag_index_uid_deleted_transaction_id)"`
TransactionTime int64 `xorm:"INDEX(IDX_transaction_tag_index_uid_deleted_tag_id_transaction_time) NOT NULL"`
CreatedUnixTime int64
UpdatedUnixTime int64
DeletedUnixTime int64
}
+3 -3
View File
@@ -90,7 +90,7 @@ func (s *TransactionTagService) GetAllTagIdsOfAllTransactions(uid int64) (map[in
}
var tagIndexs []*models.TransactionTagIndex
err := s.UserDataDB(uid).Where("uid=?", uid).Find(&tagIndexs)
err := s.UserDataDB(uid).Where("uid=? AND deleted=?", uid, false).Find(&tagIndexs)
allTransactionTagIds := s.getGroupedTransactionTagIds(tagIndexs)
@@ -104,7 +104,7 @@ func (s *TransactionTagService) GetAllTagIdsOfTransactions(uid int64, transactio
}
var tagIndexs []*models.TransactionTagIndex
err := s.UserDataDB(uid).Where("uid=?", uid).In("transaction_id", transactionIds).Find(&tagIndexs)
err := s.UserDataDB(uid).Where("uid=? AND deleted=?", uid, false).In("transaction_id", transactionIds).Find(&tagIndexs)
allTransactionTagIds := s.getGroupedTransactionTagIds(tagIndexs)
@@ -232,7 +232,7 @@ func (s *TransactionTagService) DeleteTag(uid int64, tagId int64) error {
}
return s.UserDataDB(uid).DoTransaction(func(sess *xorm.Session) error {
exists, err := sess.Cols("uid", "tag_id").Where("uid=? AND tag_id=?", uid, tagId).Limit(1).Exist(&models.TransactionTagIndex{})
exists, err := sess.Cols("uid", "tag_id").Where("uid=? AND deleted=? AND tag_id=?", uid, false, tagId).Limit(1).Exist(&models.TransactionTagIndex{})
if err != nil {
return err
+23 -2
View File
@@ -259,7 +259,9 @@ func (s *TransactionService) CreateTransaction(transaction *models.Transaction,
for i := 0; i < len(tagIds); i++ {
transactionTagIndexs[i] = &models.TransactionTagIndex{
TagIndexId: s.GenerateUuid(uuid.UUID_TYPE_TAG_INDEX),
Uid: transaction.Uid,
Deleted: false,
TagId: tagIds[i],
TransactionId: transaction.TransactionId,
CreatedUnixTime: now,
@@ -452,7 +454,9 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction,
for i := 0; i < len(addTagIds); i++ {
transactionTagIndexs[i] = &models.TransactionTagIndex{
TagIndexId: s.GenerateUuid(uuid.UUID_TYPE_TAG_INDEX),
Uid: transaction.Uid,
Deleted: false,
TagId: addTagIds[i],
TransactionId: transaction.TransactionId,
CreatedUnixTime: now,
@@ -605,7 +609,12 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction,
// Update transaction tag index
if len(removeTagIds) > 0 {
deletedRows, err := sess.Where("uid=?", transaction.Uid).In("tag_id", removeTagIds).Delete(&models.TransactionTagIndex{})
tagIndexUpdateModel := &models.TransactionTagIndex{
Deleted: true,
DeletedUnixTime: now,
}
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 {
return err
@@ -792,6 +801,11 @@ func (s *TransactionService) DeleteTransaction(uid int64, transactionId int64) e
DeletedUnixTime: now,
}
tagIndexUpdateModel := &models.TransactionTagIndex{
Deleted: true,
DeletedUnixTime: now,
}
return s.UserDataDB(uid).DoTransaction(func(sess *xorm.Session) error {
// Get and verify current transaction
oldTransaction := &models.Transaction{}
@@ -833,6 +847,13 @@ func (s *TransactionService) DeleteTransaction(uid int64, transactionId int64) e
}
}
// Update transaction tag index
_, err = sess.Cols("deleted", "deleted_unix_time").Where("uid=? AND deleted=? AND transaction_id=?", uid, false, oldTransaction.TransactionId).Update(tagIndexUpdateModel)
if err != nil {
return err
}
// Update account table
if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
sourceAccount.UpdatedUnixTime = time.Now().Unix()
@@ -1134,7 +1155,7 @@ func (s *TransactionService) isCategoryValid(sess *xorm.Session, transaction *mo
func (s *TransactionService) isTagsValid(sess *xorm.Session, transaction *models.Transaction, transactionTagIndexs []*models.TransactionTagIndex, tagIds []int64) error {
if len(transactionTagIndexs) > 0 {
var tags []*models.TransactionTag
err := sess.Where("uid=?", transaction.Uid).In("tag_id", tagIds).Find(&tags)
err := sess.Where("uid=? AND deleted=?", transaction.Uid, false).In("tag_id", tagIds).Find(&tags)
if err != nil {
return err
+1
View File
@@ -11,4 +11,5 @@ const (
UUID_TYPE_TRANSACTION UuidType = 3
UUID_TYPE_CATEGORY UuidType = 4
UUID_TYPE_TAG UuidType = 5
UUID_TYPE_TAG_INDEX UuidType = 6
)