mirror of
https://github.com/mayswind/ezbookkeeping.git
synced 2026-05-16 16:07:33 +08:00
support user custom exchange rates data
This commit is contained in:
@@ -0,0 +1,153 @@
|
||||
package services
|
||||
|
||||
import (
|
||||
"time"
|
||||
"xorm.io/xorm"
|
||||
|
||||
"github.com/mayswind/ezbookkeeping/pkg/core"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/datastore"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/errs"
|
||||
"github.com/mayswind/ezbookkeeping/pkg/models"
|
||||
)
|
||||
|
||||
// UserCustomExchangeRatesService represents user custom exchange rate data service
|
||||
type UserCustomExchangeRatesService struct {
|
||||
ServiceUsingDB
|
||||
}
|
||||
|
||||
// Initialize a user custom exchange rate data service singleton instance
|
||||
var (
|
||||
UserCustomExchangeRates = &UserCustomExchangeRatesService{
|
||||
ServiceUsingDB: ServiceUsingDB{
|
||||
container: datastore.Container,
|
||||
},
|
||||
}
|
||||
)
|
||||
|
||||
// GetAllCustomExchangeRatesByUid returns all user exchange rate data models of user
|
||||
func (s *UserCustomExchangeRatesService) GetAllCustomExchangeRatesByUid(c core.Context, uid int64) ([]*models.UserCustomExchangeRate, error) {
|
||||
if uid <= 0 {
|
||||
return nil, errs.ErrUserIdInvalid
|
||||
}
|
||||
|
||||
var customExchangeRates []*models.UserCustomExchangeRate
|
||||
err := s.UserDataDB(uid).NewSession(c).Where("uid=? AND deleted_unix_time=?", uid, 0).Find(&customExchangeRates)
|
||||
|
||||
return customExchangeRates, err
|
||||
}
|
||||
|
||||
// UpdateCustomExchangeRate updates user exchange rate data model to database
|
||||
func (s *UserCustomExchangeRatesService) UpdateCustomExchangeRate(c core.Context, uid int64, currency string, rate string, defaultCurrency string) (*models.UserCustomExchangeRate, *models.UserCustomExchangeRate, error) {
|
||||
if uid <= 0 {
|
||||
return nil, nil, errs.ErrUserIdInvalid
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
newCustomExchangeRate := &models.UserCustomExchangeRate{}
|
||||
defaultCurrencyExchangeRate := &models.UserCustomExchangeRate{}
|
||||
|
||||
err := s.UserDataDB(uid).DoTransaction(c, func(sess *xorm.Session) error {
|
||||
oldCustomExchangeRate := &models.UserCustomExchangeRate{}
|
||||
has, err := sess.Where("uid=? AND deleted_unix_time=? AND currency=?", uid, 0, currency).Get(oldCustomExchangeRate)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if has {
|
||||
updateOldExchangeRateModel := &models.UserCustomExchangeRate{
|
||||
DeletedUnixTime: now,
|
||||
}
|
||||
|
||||
_, err = sess.Cols("deleted_unix_time").Where("uid=? AND deleted_unix_time=? AND currency=?", uid, 0, currency).Update(updateOldExchangeRateModel)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
|
||||
if currency != defaultCurrency {
|
||||
has, err := sess.Where("uid=? AND deleted_unix_time=? AND currency=?", uid, 0, defaultCurrency).Get(defaultCurrencyExchangeRate)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
if !has {
|
||||
defaultCurrencyExchangeRate, _ = models.CreateUserCustomExchangeRate(uid, defaultCurrency, "1", 0)
|
||||
defaultCurrencyExchangeRate.CreatedUnixTime = now
|
||||
defaultCurrencyExchangeRate.UpdatedUnixTime = now
|
||||
defaultCurrencyExchangeRate.DeletedUnixTime = 0
|
||||
_, err = sess.Insert(defaultCurrencyExchangeRate)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
} else {
|
||||
defaultCurrencyExchangeRate = oldCustomExchangeRate
|
||||
}
|
||||
|
||||
newCustomExchangeRate, err = models.CreateUserCustomExchangeRate(uid, currency, rate, defaultCurrencyExchangeRate.Rate)
|
||||
newCustomExchangeRate.CreatedUnixTime = now
|
||||
newCustomExchangeRate.UpdatedUnixTime = now
|
||||
newCustomExchangeRate.DeletedUnixTime = 0
|
||||
_, err = sess.Insert(newCustomExchangeRate)
|
||||
|
||||
return err
|
||||
})
|
||||
|
||||
if err != nil {
|
||||
return nil, nil, err
|
||||
}
|
||||
|
||||
return newCustomExchangeRate, defaultCurrencyExchangeRate, err
|
||||
}
|
||||
|
||||
// DeleteCustomExchangeRate deletes an existed user exchange rate data from database
|
||||
func (s *UserCustomExchangeRatesService) DeleteCustomExchangeRate(c core.Context, uid int64, currency string) error {
|
||||
if uid <= 0 {
|
||||
return errs.ErrUserIdInvalid
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
|
||||
updateModel := &models.UserCustomExchangeRate{
|
||||
DeletedUnixTime: now,
|
||||
}
|
||||
|
||||
return s.UserDataDB(uid).DoTransaction(c, func(sess *xorm.Session) error {
|
||||
deletedRows, err := sess.Cols("deleted_unix_time").Where("uid=? AND deleted_unix_time=? AND currency=?", uid, 0, currency).Update(updateModel)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
} else if deletedRows < 1 {
|
||||
return errs.ErrUserCustomExchangeRateNotFound
|
||||
}
|
||||
|
||||
return err
|
||||
})
|
||||
}
|
||||
|
||||
// DeleteAllCustomExchangeRates deletes all existed user exchange rate data from database
|
||||
func (s *UserCustomExchangeRatesService) DeleteAllCustomExchangeRates(c core.Context, uid int64) error {
|
||||
if uid <= 0 {
|
||||
return errs.ErrUserIdInvalid
|
||||
}
|
||||
|
||||
now := time.Now().Unix()
|
||||
|
||||
updateModel := &models.UserCustomExchangeRate{
|
||||
DeletedUnixTime: now,
|
||||
}
|
||||
|
||||
return s.UserDataDB(uid).DoTransaction(c, func(sess *xorm.Session) error {
|
||||
_, err := sess.Cols("deleted_unix_time").Where("uid=? AND deleted_unix_time=?", uid, 0).Update(updateModel)
|
||||
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
return nil
|
||||
})
|
||||
}
|
||||
Reference in New Issue
Block a user