package service import ( "context" "errors" "google.golang.org/grpc/codes" "google.golang.org/grpc/status" "gorm.io/gorm" "log/slog" "protocol-server/common" "protocol-server/models" ) import ( pb "protocol-server/rpc_idl/dr_protocol_pb" ) type AprServer struct { pb.UnimplementedAprServer } func (s *AprServer) GetApr(ctx context.Context, in *pb.AprRequest) (*pb.AprReply, error) { slog.Info("[rpc]GetApr...", "view_id", in.GetViewId(), "apr_id", in.GetAprId()) product, _, _, err := common.GetHeader(ctx) if err != nil { return nil, err } aprId := in.GetAprId() var view models.View if in.GetViewId() != "" { if err := models.DB.Where("view_id = ?", in.GetViewId()).First(&view).Error; err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, status.Errorf(codes.NotFound, "view %s not found", in.GetViewId()) } return nil, status.Errorf(codes.Internal, "view find err %v", err) } aprId = view.AprId } var apr models.Apr err = models.DB.Scopes( models.String("apr_id = ?", aprId), models.String("product = ?", product.ToString()), models.Bool("is_enabled = ?", in.IsEnabled), ).Order("sort").First(&apr).Error if err != nil { if errors.Is(err, gorm.ErrRecordNotFound) { return nil, status.Errorf(codes.NotFound, "apr %s%s not found", in.GetViewId(), in.GetAprId()) } return nil, status.Errorf(codes.Internal, "apr find err %v", err) } var subs []*models.AprSub err = models.DB.Scopes( models.String("apr_id = ?", aprId), models.String("product = ?", product.ToString()), models.Bool("is_enabled = ?", in.IsEnabled), ).Order("sort").Find(&subs).Error if err != nil { return nil, status.Errorf(codes.Internal, "apr_sub find err %v", err) } res := apr2pb(&apr) for i := range subs { res.Sub = append(res.Sub, aprSub2pb(subs[i])) } return res, nil }