154 lines
4.5 KiB
Go
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
|
|
})
|
|
}
|