Files
ezbookkeeping/pkg/services/user_custom_exchange_rates.go
T
2025-05-26 00:47:19 +08:00

154 lines
4.5 KiB
Go

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
})
}