in api/internal/handler/upstream/upstream.go [223:300]
func (h *Handler) BatchDelete(c droplet.Context) (interface{}, error) {
input := c.Input().(*BatchDelete)
ids := strings.Split(input.IDs, ",")
mp := make(map[string]struct{})
for _, id := range ids {
mp[id] = struct{}{}
}
ret, err := h.routeStore.List(c.Context(), store.ListInput{
Predicate: func(obj interface{}) bool {
route := obj.(*entity.Route)
if _, exist := mp[utils.InterfaceToString(route.UpstreamID)]; exist {
return true
}
return false
},
PageSize: 0,
PageNumber: 0,
})
if err != nil {
return handler.SpecCodeResponse(err), err
}
if ret.TotalSize > 0 {
return &data.SpecCodeResponse{StatusCode: http.StatusBadRequest},
fmt.Errorf("route: %s is using this upstream", ret.Rows[0].(*entity.Route).Name)
}
ret, err = h.serviceStore.List(c.Context(), store.ListInput{
Predicate: func(obj interface{}) bool {
service := obj.(*entity.Service)
if _, exist := mp[utils.InterfaceToString(service.UpstreamID)]; exist {
return true
}
return false
},
PageSize: 0,
PageNumber: 0,
})
if err != nil {
return handler.SpecCodeResponse(err), err
}
if ret.TotalSize > 0 {
return &data.SpecCodeResponse{StatusCode: http.StatusBadRequest},
fmt.Errorf("service: %s is using this upstream", ret.Rows[0].(*entity.Service).Name)
}
ret, err = h.streamRouteStore.List(c.Context(), store.ListInput{
Predicate: func(obj interface{}) bool {
streamRoute := obj.(*entity.StreamRoute)
if _, exist := mp[utils.InterfaceToString(streamRoute.UpstreamID)]; exist {
return true
}
return false
},
PageSize: 0,
PageNumber: 0,
})
if err != nil {
return handler.SpecCodeResponse(err), err
}
if ret.TotalSize > 0 {
return &data.SpecCodeResponse{StatusCode: http.StatusBadRequest},
fmt.Errorf("stream route: %s is using this upstream", ret.Rows[0].(*entity.StreamRoute).ID)
}
if err = h.upstreamStore.BatchDelete(c.Context(), ids); err != nil {
return handler.SpecCodeResponse(err), err
}
return nil, nil
}