| 
									
										
										
										
											2022-08-02 21:33:59 +08:00
										 |  |  | package api | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | import ( | 
					
						
							|  |  |  | 	"errors" | 
					
						
							|  |  |  | 	"fmt" | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/api/response" | 
					
						
							|  |  |  | 	"github.com/grafana/grafana/pkg/services/datasources" | 
					
						
							|  |  |  | 	apimodels "github.com/grafana/grafana/pkg/services/ngalert/api/tooling/definitions" | 
					
						
							| 
									
										
										
										
											2023-12-02 07:42:11 +08:00
										 |  |  | 	"github.com/grafana/grafana/pkg/util/errutil" | 
					
						
							| 
									
										
										
										
											2022-08-02 21:33:59 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var ( | 
					
						
							|  |  |  | 	errUnexpectedDatasourceType = errors.New("unexpected datasource type") | 
					
						
							| 
									
										
										
										
											2023-10-02 23:47:59 +08:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// errFolderAccess is used as a wrapper to propagate folder related errors and correctly map to the response status
 | 
					
						
							|  |  |  | 	errFolderAccess = errors.New("cannot get folder") | 
					
						
							| 
									
										
										
										
											2022-08-02 21:33:59 +08:00
										 |  |  | ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func unexpectedDatasourceTypeError(actual string, expected string) error { | 
					
						
							|  |  |  | 	return fmt.Errorf("%w '%s', expected %s", errUnexpectedDatasourceType, actual, expected) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func backendTypeDoesNotMatchPayloadTypeError(backendType apimodels.Backend, payloadType string) error { | 
					
						
							|  |  |  | 	return fmt.Errorf("unexpected backend type (%s) for payload type (%s)", | 
					
						
							|  |  |  | 		backendType.String(), | 
					
						
							|  |  |  | 		payloadType, | 
					
						
							|  |  |  | 	) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | func errorToResponse(err error) response.Response { | 
					
						
							| 
									
										
										
										
											2023-12-02 07:42:11 +08:00
										 |  |  | 	if errors.As(err, &errutil.Error{}) { | 
					
						
							|  |  |  | 		return response.Err(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-08-02 21:33:59 +08:00
										 |  |  | 	if errors.Is(err, datasources.ErrDataSourceNotFound) { | 
					
						
							|  |  |  | 		return ErrResp(404, err, "") | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if errors.Is(err, errUnexpectedDatasourceType) { | 
					
						
							|  |  |  | 		return ErrResp(400, err, "") | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2023-10-02 23:47:59 +08:00
										 |  |  | 	if errors.Is(err, errFolderAccess) { | 
					
						
							|  |  |  | 		return toNamespaceErrorResponse(err) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2022-08-02 21:33:59 +08:00
										 |  |  | 	return ErrResp(500, err, "") | 
					
						
							|  |  |  | } |