package service import ( "fmt" "github.com/pkg/errors" "gorm.io/gorm" "net/http" "sghgogs.com/micro/common/errorcode" req "sghgogs.com/micro/shopping-service/domain/model/request" pb "sghgogs.com/micro/shopping-service/proto" "sghgogs.com/micro/shopping-service/utils" "sghgogs.com/micro/shopping-service/utils/authutil" "time" ) func (svc *Service) CreateAddress(add *pb.CreateAddressRequest) error { if err := svc.Repository.CreateAddress(&req.Address{ UserID: add.UserId, Country: add.Country, Province: add.Province, City: add.City, District: add.District, Street: add.Street, Remark: add.Remark, Location: req.Location{ Lon: add.Location.Lon, Lat: add.Location.Lat, }, IsDefault: add.IsDefault, }); err != nil { return errorcode.New(svc.Namespace, err.Error(), http.StatusBadRequest) } return nil } func (svc *Service) GetAddressList(query *pb.GetAddressListRequest) ([]*pb.Address, int64, error) { list, i, err := svc.Repository.GetAddressList(query) addresses := make([]*pb.Address, 0) if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return addresses, 0, nil } return addresses, 0, errorcode.New(svc.Namespace, err.Error(), 500) } for _, item := range list { addresses = append(addresses, svc.getAddressRes(item)) } return addresses, i, nil } func (svc *Service) getAddressRes(item req.Address) *pb.Address { fmt.Println("item", item.CreatedAt) address := pb.Address{ Id: item.ID, UserId: item.UserID, Country: item.Country, Province: item.Province, City: item.City, District: item.District, Street: item.Street, Remark: item.Remark, IsDefault: item.IsDefault, } address.CreatedAt = utils.ConvertTimeToInt64(item.CreatedAt) if item.UpdatedAt != nil { address.UpdatedAt = utils.ConvertTimeToInt64(*item.UpdatedAt) } return &address } func (svc *Service) GetAddress(query *pb.GetAddressRequest) (*pb.Address, error) { address, err := svc.Repository.GetAddress(query.AddressId) if err != nil { return &pb.Address{}, errorcode.New(svc.Namespace, err.Error(), http.StatusBadRequest) } res := svc.getAddressRes(address) res.Location = &pb.Location{ Lon: address.Location.Lon, Lat: address.Location.Lat, } return res, nil } func (svc *Service) UpdateAddress(query *pb.UpdateAddressRequest) error { // 获取权限ID作为锁的键 lockKey := fmt.Sprintf("update_shopping_Address_%d", query.AddressId) lock := authutil.JWTAuthService.Mu.NewMutex(lockKey) // 获取锁,保证原子性 if err := lock.Lock(); err != nil { return err } defer lock.Unlock() now := time.Now() if err := svc.Repository.UpdateAddress(query.AddressId, &req.Address{ Country: query.Country, Province: query.Province, City: query.City, District: query.District, Street: query.Street, Remark: query.Remark, Location: req.Location{ Lon: query.Location.Lon, Lat: query.Location.Lat, }, IsDefault: query.IsDefault, UpdatedAt: &now, }); err != nil { return errorcode.New(svc.Namespace, err.Error(), 500) } return nil } func (svc *Service) DeleteAddress(query *pb.DeleteAddressRequest) error { if err := svc.Repository.DeleteProduct(query.AddressId); err != nil { return errorcode.New(svc.Namespace, err.Error(), http.StatusBadRequest) } return nil }