130 lines
3.8 KiB
Go

package user
import (
"context"
"bindbox-game/internal/repository/mysql/model"
)
type AddAddressInput struct {
Name string
Mobile string
Province string
City string
District string
Address string
IsDefault bool
}
func (s *service) AddAddress(ctx context.Context, userID int64, in AddAddressInput) (*model.UserAddresses, error) {
addr := &model.UserAddresses{
UserID: userID,
Name: in.Name,
Mobile: in.Mobile,
Province: in.Province,
City: in.City,
District: in.District,
Address: in.Address,
IsDefault: 0,
}
if in.IsDefault {
addr.IsDefault = 1
}
tx := s.writeDB.Begin()
if in.IsDefault {
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID)).UpdateSimple(tx.UserAddresses.IsDefault.Value(0)); err != nil {
_ = tx.Rollback()
return nil, err
}
}
if err := tx.UserAddresses.WithContext(ctx).Omit(tx.UserAddresses.DefaultUserUnique).Create(addr); err != nil {
_ = tx.Rollback()
return nil, err
}
if err := tx.Commit(); err != nil {
return nil, err
}
return addr, nil
}
func (s *service) ListAddresses(ctx context.Context, userID int64, page, pageSize int) (items []*model.UserAddresses, total int64, err error) {
q := s.readDB.UserAddresses.WithContext(ctx).ReadDB().Where(s.readDB.UserAddresses.UserID.Eq(userID))
total, err = q.Count()
if err != nil {
return nil, 0, err
}
if page <= 0 {
page = 1
}
if pageSize <= 0 {
pageSize = 20
}
if pageSize > 100 {
pageSize = 100
}
items, err = q.Order(s.readDB.UserAddresses.IsDefault.Desc(), s.readDB.UserAddresses.ID.Desc()).Offset((page - 1) * pageSize).Limit(pageSize).Find()
if err != nil {
return nil, 0, err
}
return items, total, nil
}
func (s *service) SetDefaultAddress(ctx context.Context, userID int64, addressID int64) error {
tx := s.writeDB.Begin()
// 先将用户所有地址的 is_default 设为 0
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID)).UpdateSimple(tx.UserAddresses.IsDefault.Value(0)); err != nil {
_ = tx.Rollback()
return err
}
// 再将指定地址设为默认
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID), tx.UserAddresses.ID.Eq(addressID)).UpdateSimple(tx.UserAddresses.IsDefault.Value(1)); err != nil {
_ = tx.Rollback()
return err
}
return tx.Commit()
}
func (s *service) DeleteAddress(ctx context.Context, userID int64, addressID int64) error {
_, err := s.writeDB.UserAddresses.WithContext(ctx).Where(s.writeDB.UserAddresses.UserID.Eq(userID), s.writeDB.UserAddresses.ID.Eq(addressID)).Delete(&model.UserAddresses{})
return err
}
type UpdateAddressInput struct {
Name string
Mobile string
Province string
City string
District string
Address string
IsDefault bool
}
func (s *service) UpdateAddress(ctx context.Context, userID int64, addressID int64, in UpdateAddressInput) error {
tx := s.writeDB.Begin()
if in.IsDefault {
// 先将用户所有地址设为非默认
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID)).UpdateSimple(tx.UserAddresses.IsDefault.Value(0)); err != nil {
_ = tx.Rollback()
return err
}
}
// 更新指定地址的信息
isDefaultVal := int32(0)
if in.IsDefault {
isDefaultVal = 1
}
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID), tx.UserAddresses.ID.Eq(addressID)).UpdateSimple(
tx.UserAddresses.Name.Value(in.Name),
tx.UserAddresses.Mobile.Value(in.Mobile),
tx.UserAddresses.Province.Value(in.Province),
tx.UserAddresses.City.Value(in.City),
tx.UserAddresses.District.Value(in.District),
tx.UserAddresses.Address.Value(in.Address),
tx.UserAddresses.IsDefault.Value(isDefaultVal),
); err != nil {
_ = tx.Rollback()
return err
}
return tx.Commit()
}