From a7c77cf68e28747793723f5500e1cf97c0ae78ad Mon Sep 17 00:00:00 2001 From: MaysWind Date: Mon, 18 Jan 2021 00:26:51 +0800 Subject: [PATCH] transaction tag index supports soft delete --- pkg/models/transaction_tag_index.go | 11 +++++++---- pkg/services/transaction_tags.go | 6 +++--- pkg/services/transactions.go | 25 +++++++++++++++++++++++-- pkg/uuid/uuid_type.go | 1 + 4 files changed, 34 insertions(+), 9 deletions(-) diff --git a/pkg/models/transaction_tag_index.go b/pkg/models/transaction_tag_index.go index d7a48e10..23e6bc1b 100644 --- a/pkg/models/transaction_tag_index.go +++ b/pkg/models/transaction_tag_index.go @@ -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 } diff --git a/pkg/services/transaction_tags.go b/pkg/services/transaction_tags.go index 5b7c9773..90664bf4 100644 --- a/pkg/services/transaction_tags.go +++ b/pkg/services/transaction_tags.go @@ -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 diff --git a/pkg/services/transactions.go b/pkg/services/transactions.go index 66fac319..4d0dd382 100644 --- a/pkg/services/transactions.go +++ b/pkg/services/transactions.go @@ -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 diff --git a/pkg/uuid/uuid_type.go b/pkg/uuid/uuid_type.go index 4da67641..0659a176 100644 --- a/pkg/uuid/uuid_type.go +++ b/pkg/uuid/uuid_type.go @@ -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 )