mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-20 17:54:30 +08:00
transaction tag index supports soft delete
This commit is contained in:
@@ -2,10 +2,13 @@ package models
|
|||||||
|
|
||||||
// TransactionTagIndex represents transaction and transaction tag relation stored in database
|
// TransactionTagIndex represents transaction and transaction tag relation stored in database
|
||||||
type TransactionTagIndex struct {
|
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)"`
|
TagIndexId int64 `xorm:"PK"`
|
||||||
TagId int64 `xorm:"PK INDEX(IDX_transaction_tag_index_uid_tag_id_transaction_time)"`
|
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)"`
|
||||||
TransactionId int64 `xorm:"PK INDEX(IDX_transaction_tag_index_uid_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"`
|
||||||
TransactionTime int64 `xorm:"INDEX(IDX_transaction_tag_index_uid_tag_id_transaction_time) 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
|
CreatedUnixTime int64
|
||||||
UpdatedUnixTime int64
|
UpdatedUnixTime int64
|
||||||
|
DeletedUnixTime int64
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -90,7 +90,7 @@ func (s *TransactionTagService) GetAllTagIdsOfAllTransactions(uid int64) (map[in
|
|||||||
}
|
}
|
||||||
|
|
||||||
var tagIndexs []*models.TransactionTagIndex
|
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)
|
allTransactionTagIds := s.getGroupedTransactionTagIds(tagIndexs)
|
||||||
|
|
||||||
@@ -104,7 +104,7 @@ func (s *TransactionTagService) GetAllTagIdsOfTransactions(uid int64, transactio
|
|||||||
}
|
}
|
||||||
|
|
||||||
var tagIndexs []*models.TransactionTagIndex
|
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)
|
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 {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -259,7 +259,9 @@ func (s *TransactionService) CreateTransaction(transaction *models.Transaction,
|
|||||||
|
|
||||||
for i := 0; i < len(tagIds); i++ {
|
for i := 0; i < len(tagIds); i++ {
|
||||||
transactionTagIndexs[i] = &models.TransactionTagIndex{
|
transactionTagIndexs[i] = &models.TransactionTagIndex{
|
||||||
|
TagIndexId: s.GenerateUuid(uuid.UUID_TYPE_TAG_INDEX),
|
||||||
Uid: transaction.Uid,
|
Uid: transaction.Uid,
|
||||||
|
Deleted: false,
|
||||||
TagId: tagIds[i],
|
TagId: tagIds[i],
|
||||||
TransactionId: transaction.TransactionId,
|
TransactionId: transaction.TransactionId,
|
||||||
CreatedUnixTime: now,
|
CreatedUnixTime: now,
|
||||||
@@ -452,7 +454,9 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction,
|
|||||||
|
|
||||||
for i := 0; i < len(addTagIds); i++ {
|
for i := 0; i < len(addTagIds); i++ {
|
||||||
transactionTagIndexs[i] = &models.TransactionTagIndex{
|
transactionTagIndexs[i] = &models.TransactionTagIndex{
|
||||||
|
TagIndexId: s.GenerateUuid(uuid.UUID_TYPE_TAG_INDEX),
|
||||||
Uid: transaction.Uid,
|
Uid: transaction.Uid,
|
||||||
|
Deleted: false,
|
||||||
TagId: addTagIds[i],
|
TagId: addTagIds[i],
|
||||||
TransactionId: transaction.TransactionId,
|
TransactionId: transaction.TransactionId,
|
||||||
CreatedUnixTime: now,
|
CreatedUnixTime: now,
|
||||||
@@ -605,7 +609,12 @@ func (s *TransactionService) ModifyTransaction(transaction *models.Transaction,
|
|||||||
|
|
||||||
// Update transaction tag index
|
// Update transaction tag index
|
||||||
if len(removeTagIds) > 0 {
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
@@ -792,6 +801,11 @@ func (s *TransactionService) DeleteTransaction(uid int64, transactionId int64) e
|
|||||||
DeletedUnixTime: now,
|
DeletedUnixTime: now,
|
||||||
}
|
}
|
||||||
|
|
||||||
|
tagIndexUpdateModel := &models.TransactionTagIndex{
|
||||||
|
Deleted: true,
|
||||||
|
DeletedUnixTime: now,
|
||||||
|
}
|
||||||
|
|
||||||
return s.UserDataDB(uid).DoTransaction(func(sess *xorm.Session) error {
|
return s.UserDataDB(uid).DoTransaction(func(sess *xorm.Session) error {
|
||||||
// Get and verify current transaction
|
// Get and verify current transaction
|
||||||
oldTransaction := &models.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
|
// Update account table
|
||||||
if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
|
if oldTransaction.Type == models.TRANSACTION_DB_TYPE_MODIFY_BALANCE {
|
||||||
sourceAccount.UpdatedUnixTime = time.Now().Unix()
|
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 {
|
func (s *TransactionService) isTagsValid(sess *xorm.Session, transaction *models.Transaction, transactionTagIndexs []*models.TransactionTagIndex, tagIds []int64) error {
|
||||||
if len(transactionTagIndexs) > 0 {
|
if len(transactionTagIndexs) > 0 {
|
||||||
var tags []*models.TransactionTag
|
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 {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
|
|||||||
@@ -11,4 +11,5 @@ const (
|
|||||||
UUID_TYPE_TRANSACTION UuidType = 3
|
UUID_TYPE_TRANSACTION UuidType = 3
|
||||||
UUID_TYPE_CATEGORY UuidType = 4
|
UUID_TYPE_CATEGORY UuidType = 4
|
||||||
UUID_TYPE_TAG UuidType = 5
|
UUID_TYPE_TAG UuidType = 5
|
||||||
|
UUID_TYPE_TAG_INDEX UuidType = 6
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user