fix version 1

This commit is contained in:
2026-09-22 21:15:34 +08:00
parent 9f86366638
commit d63d7e8b3a
277 changed files with 9959 additions and 1514 deletions

View File

@@ -12,6 +12,7 @@ import (
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"git.apinb.com/bsm-sdk/core/utils"
"gorm.io/gorm"
)
// 新增地址
@@ -38,11 +39,15 @@ func Create(ctx context.Context, in *pb.AddressCreateRequest) (reply *pb.StatusR
address.OwnerIdentity = auth.Identity
address.Status = int8(in.Status)
if address.Status == 2 {
impl.DBService.Model(&models.AddressLibrary{}).Where("owner_id = ? and status=2", auth.ID).UpdateColumn("status", "1")
}
err = impl.DBService.Create(address).Error
// 取消旧默认与写入新默认放在同一事务,保证任一时刻只有一个默认地址
err = impl.DBService.Transaction(func(tx *gorm.DB) error {
if address.Status == 2 {
if err := tx.Model(&models.AddressLibrary{}).Where("owner_id = ? and status = 2", auth.ID).UpdateColumn("status", 1).Error; err != nil {
return err
}
}
return tx.Create(address).Error
})
if err != nil {
printer.Error(err.Error())

View File

@@ -16,12 +16,13 @@ import (
// 删除一个地址
func Delete(ctx context.Context, in *pb.AddressDeleteRequest) (reply *pb.StatusReply, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
auth, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
err = impl.DBService.Delete(&models.AddressLibrary{}, "id in ?", in.Id).Error
// 删除必须限定归属,避免越权删除他人地址
err = impl.DBService.Where("id in ? and owner_identity = ?", in.Id, auth.Identity).Delete(&models.AddressLibrary{}).Error
if err != nil {
printer.Error(err.Error())
return nil, errcode.ErrDB

View File

@@ -35,9 +35,7 @@ func Fetch(ctx context.Context, in *pb.IdentRequest) (reply *pb.AddressListReply
result = append(result, ReflectProtoAddress(item))
}
// TODO: add your logic code & delete this line.
return
return &pb.AddressListReply{Data: result}, nil
}
func ReflectProtoAddress(v *models.AddressLibrary) *pb.AddressItem {

View File

@@ -16,7 +16,7 @@ import (
// 获取一条地址
func Get(ctx context.Context, in *pb.IdentRequest) (reply *pb.AddressItem, err error) {
// parse authorization meta.
_, err = service.ParseMetaCtx(ctx, nil)
auth, err := service.ParseMetaCtx(ctx, nil)
if err != nil {
return nil, err
}
@@ -26,7 +26,8 @@ func Get(ctx context.Context, in *pb.IdentRequest) (reply *pb.AddressItem, err e
}
address := new(models.AddressLibrary)
err = impl.DBService.Where("id=?", in.Id).First(&address).Error
// 查询必须限定归属,避免越权读取他人地址
err = impl.DBService.Where("id=? and owner_identity=?", in.Id, auth.Identity).First(&address).Error
if err != nil {
if errors.Is(err, models.ErrNotFound) {

View File

@@ -2,6 +2,7 @@ package library
import (
"context"
"errors"
"time"
"bsm/full/module/ec/address/internal/impl"
@@ -11,6 +12,7 @@ import (
"git.apinb.com/bsm-sdk/core/errcode"
"git.apinb.com/bsm-sdk/core/printer"
"git.apinb.com/bsm-sdk/core/service"
"gorm.io/gorm"
)
// 修改地址
@@ -32,12 +34,24 @@ func Modify(ctx context.Context, in *pb.AddressItem) (reply *pb.StatusReply, err
}
address.Status = int8(in.Status)
if address.Status == 2 {
impl.DBService.Model(&models.AddressLibrary{}).Where("owner_id = ? and status=2", auth.ID).UpdateColumn("status", "1")
}
err = impl.DBService.Where("id=?", in.Id).Updates(&address).Error
// 归属校验与默认地址重置放入同一事务:先按 id + owner 更新目标行,再取消该用户其它默认地址
err = impl.DBService.Transaction(func(tx *gorm.DB) error {
res := tx.Model(&models.AddressLibrary{}).Where("id=? and owner_identity=?", in.Id, auth.Identity).Updates(&address)
if res.Error != nil {
return res.Error
}
if res.RowsAffected == 0 {
return models.ErrNotFound
}
if address.Status == 2 {
return tx.Model(&models.AddressLibrary{}).Where("owner_id = ? and status = 2 and id <> ?", auth.ID, in.Id).UpdateColumn("status", 1).Error
}
return nil
})
if err != nil {
if errors.Is(err, models.ErrNotFound) {
return nil, errcode.ErrRecordNotFound
}
printer.Error(err.Error())
return nil, errcode.ErrDB
}

View File

@@ -5,11 +5,25 @@ import (
pb "bsm/full/module/ec/address/pb"
"context"
"git.apinb.com/bsm-sdk/core/printer"
gwRuntime "github.com/grpc-ecosystem/grpc-gateway/v2/runtime"
"google.golang.org/grpc"
"google.golang.org/grpc/codes"
"google.golang.org/grpc/reflection"
"google.golang.org/grpc/status"
)
// recoverUnaryInterceptor 捕获处理过程中的 panic转为 Internal 错误返回,避免进程崩溃。
func recoverUnaryInterceptor(ctx context.Context, req any, info *grpc.UnaryServerInfo, handler grpc.UnaryHandler) (resp any, err error) {
defer func() {
if r := recover(); r != nil {
printer.Error("grpc panic recovered: %v", r)
err = status.Error(codes.Internal, "internal server error")
}
}()
return handler(ctx, req)
}
type Server struct {
Grpc *grpc.Server
Ctx context.Context
@@ -20,7 +34,7 @@ type Server struct {
func New(grpcServ *grpc.Server) *Server {
standalone := grpcServ == nil
if standalone {
grpcServ = grpc.NewServer()
grpcServ = grpc.NewServer(grpc.UnaryInterceptor(recoverUnaryInterceptor))
}
srv := &Server{