Some checks failed
Build docker and publish / linux (1.24.5) (push) Failing after 15s
124 lines
3.6 KiB
Go
124 lines
3.6 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), tx.UserAddresses.IsDefault.Eq(1)).Updates(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()
|
|
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID), tx.UserAddresses.IsDefault.Eq(1)).Updates(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)).Updates(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()
|
|
updates := map[string]interface{}{
|
|
"name": in.Name,
|
|
"mobile": in.Mobile,
|
|
"province": in.Province,
|
|
"city": in.City,
|
|
"district": in.District,
|
|
"address": in.Address,
|
|
}
|
|
if in.IsDefault {
|
|
// 先将其他地址设为非默认
|
|
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID), tx.UserAddresses.IsDefault.Eq(1)).Updates(tx.UserAddresses.IsDefault.Value(0)); err != nil {
|
|
_ = tx.Rollback()
|
|
return err
|
|
}
|
|
updates["is_default"] = 1
|
|
}
|
|
if _, err := tx.UserAddresses.WithContext(ctx).Where(tx.UserAddresses.UserID.Eq(userID), tx.UserAddresses.ID.Eq(addressID)).Updates(updates); err != nil {
|
|
_ = tx.Rollback()
|
|
return err
|
|
}
|
|
return tx.Commit()
|
|
}
|