Skip to content

Commit 3ff608c

Browse files
authored
Allow to add any route (#29)
1 parent b12dd4c commit 3ff608c

File tree

3 files changed

+69
-5
lines changed

3 files changed

+69
-5
lines changed

completion.go

Lines changed: 17 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package sqlds
33
import (
44
"context"
55
"encoding/json"
6+
"fmt"
67
"net/http"
78

89
"github.com/grafana/grafana-plugin-sdk-go/backend"
@@ -95,8 +96,20 @@ func (ds *sqldatasource) getColumns(rw http.ResponseWriter, req *http.Request) {
9596
sendResourceResponse(rw, res)
9697
}
9798

98-
func (ds *sqldatasource) registerRoutes(mux *http.ServeMux) {
99-
mux.HandleFunc("/tables", ds.getTables)
100-
mux.HandleFunc("/schemas", ds.getSchemas)
101-
mux.HandleFunc("/columns", ds.getColumns)
99+
func (ds *sqldatasource) registerRoutes(mux *http.ServeMux) error {
100+
defaultRoutes := map[string]func(http.ResponseWriter, *http.Request){
101+
"/tables": ds.getTables,
102+
"/schemas": ds.getSchemas,
103+
"/columns": ds.getColumns,
104+
}
105+
for route, handler := range defaultRoutes {
106+
mux.HandleFunc(route, handler)
107+
}
108+
for route, handler := range ds.CustomRoutes {
109+
if _, ok := defaultRoutes[route]; ok {
110+
return fmt.Errorf("unable to redefine %s, use the Completable interface instead", route)
111+
}
112+
mux.HandleFunc(route, handler)
113+
}
114+
return nil
102115
}

completion_test.go

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -134,3 +134,50 @@ func TestCompletable(t *testing.T) {
134134
})
135135
}
136136
}
137+
138+
func Test_registerRoutes(t *testing.T) {
139+
t.Run("it should add a new route", func(t *testing.T) {
140+
sqlds := &sqldatasource{}
141+
sqlds.CustomRoutes = map[string]func(http.ResponseWriter, *http.Request){
142+
"/foo": func(w http.ResponseWriter, r *http.Request) {
143+
_, err := w.Write([]byte("bar"))
144+
if err != nil {
145+
t.Fatal((err))
146+
}
147+
},
148+
}
149+
150+
mux := http.NewServeMux()
151+
err := sqlds.registerRoutes(mux)
152+
if err != nil {
153+
t.Fatalf("unexpected error %v", err)
154+
}
155+
resp := httptest.NewRecorder()
156+
req, err := http.NewRequest("GET", "/foo", nil)
157+
if err != nil {
158+
t.Fatalf("unexpected error %v", err)
159+
}
160+
mux.ServeHTTP(resp, req)
161+
162+
respByte, err := ioutil.ReadAll(resp.Body)
163+
if err != nil {
164+
t.Fatalf("unexpected error %v", err)
165+
}
166+
if string(respByte) != "bar" {
167+
t.Errorf("unexpected response %s", string(respByte))
168+
}
169+
})
170+
171+
t.Run("it error if tried to add an existing route", func(t *testing.T) {
172+
sqlds := &sqldatasource{}
173+
sqlds.CustomRoutes = map[string]func(http.ResponseWriter, *http.Request){
174+
"/tables": func(w http.ResponseWriter, r *http.Request) {},
175+
}
176+
177+
mux := http.NewServeMux()
178+
err := sqlds.registerRoutes(mux)
179+
if err == nil || err.Error() != "unable to redefine /tables, use the Completable interface instead" {
180+
t.Errorf("unexpected error %v", err)
181+
}
182+
})
183+
}

datasource.go

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,7 @@ type sqldatasource struct {
2020

2121
backend.CallResourceHandler
2222
Completable
23+
CustomRoutes map[string]func(http.ResponseWriter, *http.Request)
2324
}
2425

2526
// NewDatasource creates a new `sqldatasource`.
@@ -32,7 +33,10 @@ func (ds *sqldatasource) NewDatasource(settings backend.DataSourceInstanceSettin
3233
ds.db = db
3334
ds.settings = settings
3435
mux := http.NewServeMux()
35-
ds.registerRoutes(mux)
36+
err = ds.registerRoutes(mux)
37+
if err != nil {
38+
return nil, err
39+
}
3640
ds.CallResourceHandler = httpadapter.New(mux)
3741

3842
return ds, nil

0 commit comments

Comments
 (0)