|
1 | 1 | package simplapi |
2 | 2 |
|
3 | 3 | import ( |
| 4 | + "net/http" |
| 5 | + |
4 | 6 | "github.com/go-simpl/simplapi/pkg/framework" |
5 | 7 | "github.com/go-simpl/simplapi/pkg/handler" |
6 | | - "github.com/go-simpl/simplapi/pkg/swagger" |
| 8 | + "github.com/go-simpl/simplapi/pkg/spec" |
7 | 9 | ) |
8 | 10 |
|
9 | 11 | type App struct { |
10 | | - framework framework.Framework |
11 | | - swaggerJson map[string]interface{} |
| 12 | + framework framework.Framework |
| 13 | + spec *spec.Spec |
| 14 | + |
| 15 | + endpoints []*Endpoint |
12 | 16 | } |
13 | 17 |
|
14 | 18 | func New(frameworkName ...string) *App { |
15 | 19 | frameworkName = append(frameworkName, "fiber") |
16 | 20 |
|
17 | 21 | s := &App{ |
18 | 22 | framework: framework.GetFramework(frameworkName[0]), |
19 | | - swaggerJson: map[string]interface{}{ |
20 | | - "openapi": "3.0.0", |
21 | | - "info": map[string]interface{}{ |
22 | | - "title": "SimpleAPI", |
23 | | - "version": "1.0.0", |
24 | | - }, |
25 | | - "paths": map[string]interface{}{}, |
26 | | - }, |
| 23 | + spec: spec.New(), |
| 24 | + endpoints: []*Endpoint{}, |
27 | 25 | } |
28 | | - addSwaggerRoutes(s) |
| 26 | + addOpenAPIRoutes(s) |
29 | 27 | return s |
30 | 28 | } |
31 | 29 |
|
32 | 30 | func (s *App) GetApp() framework.Framework { |
33 | 31 | return s.framework |
34 | 32 | } |
35 | 33 |
|
36 | | -func (s *App) ListenAndServe(addr string) error { |
37 | | - return s.framework.ListenAndServe(addr) |
| 34 | +func (s *App) GET(path string, handlers ...interface{}) *Endpoint { |
| 35 | + endpoint := newEndpoint(http.MethodGet, path, handlers...) |
| 36 | + s.addEndpoint(endpoint) |
| 37 | + return endpoint |
38 | 38 | } |
39 | 39 |
|
40 | | -func (s *App) createHandler(handlers ...interface{}) framework.FrameworkHandler { |
41 | | - // Reverse the handlers slice |
42 | | - for i, j := 0, len(handlers)-1; i < j; i, j = i+1, j-1 { |
43 | | - handlers[i], handlers[j] = handlers[j], handlers[i] |
44 | | - } |
45 | | - |
46 | | - var nextHandler framework.FrameworkHandler = nil |
47 | | - for _, h := range handlers { |
48 | | - nextHandler = handler.WrapHandler(h, nextHandler) |
49 | | - } |
50 | | - |
51 | | - return nextHandler |
52 | | -} |
53 | | - |
54 | | -func (s *App) GET(path string, tags []string, handlers ...interface{}) { |
55 | | - s.framework.GET(path, s.createHandler(handlers...)) |
56 | | - s.addToSwagger(path, "get", handlers, tags) |
| 40 | +func (s *App) POST(path string, handlers ...interface{}) *Endpoint { |
| 41 | + endpoint := newEndpoint(http.MethodPost, path, handlers...) |
| 42 | + s.addEndpoint(endpoint) |
| 43 | + return endpoint |
57 | 44 | } |
58 | 45 |
|
59 | | -func (s *App) POST(path string, tags []string, handlers ...interface{}) { |
60 | | - s.framework.POST(path, s.createHandler(handlers...)) |
61 | | - s.addToSwagger(path, "post", handlers, tags) |
| 46 | +func (s *App) PUT(path string, handlers ...interface{}) *Endpoint { |
| 47 | + endpoint := newEndpoint(http.MethodPut, path, handlers...) |
| 48 | + s.addEndpoint(endpoint) |
| 49 | + return endpoint |
62 | 50 | } |
63 | 51 |
|
64 | | -func (s *App) PUT(path string, tags []string, handlers ...interface{}) { |
65 | | - s.framework.PUT(path, s.createHandler(handlers...)) |
66 | | - s.addToSwagger(path, "put", handlers, tags) |
| 52 | +func (s *App) DELETE(path string, handlers ...interface{}) *Endpoint { |
| 53 | + endpoint := newEndpoint(http.MethodDelete, path, handlers...) |
| 54 | + s.addEndpoint(endpoint) |
| 55 | + return endpoint |
67 | 56 | } |
68 | 57 |
|
69 | | -func (s *App) PATCH(path string, tags []string, handlers ...interface{}) { |
70 | | - s.framework.PATCH(path, s.createHandler(handlers...)) |
71 | | - s.addToSwagger(path, "patch", handlers, tags) |
| 58 | +func (s *App) PATCH(path string, handlers ...interface{}) *Endpoint { |
| 59 | + endpoint := newEndpoint(http.MethodPatch, path, handlers...) |
| 60 | + s.addEndpoint(endpoint) |
| 61 | + return endpoint |
72 | 62 | } |
73 | 63 |
|
74 | | -func (s *App) DELETE(path string, tags []string, handlers ...interface{}) { |
75 | | - s.framework.DELETE(path, s.createHandler(handlers...)) |
76 | | - s.addToSwagger(path, "delete", handlers, tags) |
77 | | -} |
78 | | - |
79 | | -func (s *App) addToSwagger(path string, method string, handlers []interface{}, tags []string) { |
80 | | - if path == "/try" || path == "/openapi.json" { |
81 | | - return |
| 64 | +func (s *App) Sync() { |
| 65 | + for _, e := range s.endpoints { |
| 66 | + s.framework.Register(e.path, e.method, s.createHandler(e.handlers...)) |
| 67 | + if e.addToSpec { |
| 68 | + s.spec.Register(e.path, e.method, e.handlers...) |
| 69 | + } |
82 | 70 | } |
| 71 | +} |
83 | 72 |
|
84 | | - definition := map[string]interface{}{ |
85 | | - "parameters": []interface{}{}, |
86 | | - "responses": map[string]interface{}{}, |
87 | | - "tags": tags, |
88 | | - } |
| 73 | +func (s *App) ListenAndServe(addr string) error { |
| 74 | + // Actual registration of endpoints happen here |
| 75 | + s.Sync() |
89 | 76 |
|
90 | | - if method != "get" { |
91 | | - definition["requestBody"] = map[string]interface{}{} |
92 | | - } |
| 77 | + return s.framework.ListenAndServe(addr) |
| 78 | +} |
93 | 79 |
|
94 | | - for _, handler := range handlers { |
95 | | - swagger.UpdateDefinitionUsingHandler(definition, handler) |
96 | | - } |
| 80 | +func (s *App) addEndpoint(endpoint *Endpoint) { |
| 81 | + s.endpoints = append(s.endpoints, endpoint) |
| 82 | +} |
97 | 83 |
|
98 | | - if _, ok := s.swaggerJson["paths"].(map[string]interface{})[path]; !ok { |
99 | | - s.swaggerJson["paths"].(map[string]interface{})[path] = map[string]interface{}{} |
| 84 | +func (s *App) createHandler(handlers ...interface{}) framework.FrameworkHandler { |
| 85 | + // Reverse the handlers slice |
| 86 | + for i, j := 0, len(handlers)-1; i < j; i, j = i+1, j-1 { |
| 87 | + handlers[i], handlers[j] = handlers[j], handlers[i] |
100 | 88 | } |
101 | 89 |
|
102 | | - if _, ok := s.swaggerJson["paths"].(map[string]interface{})[path].(map[string]interface{})[method]; !ok { |
103 | | - s.swaggerJson["paths"].(map[string]interface{})[path].(map[string]interface{})[method] = definition |
| 90 | + var nextHandler framework.FrameworkHandler = nil |
| 91 | + for _, h := range handlers { |
| 92 | + nextHandler = handler.WrapHandler(h, nextHandler) |
104 | 93 | } |
105 | 94 |
|
106 | | - responses := definition["responses"].(map[string]interface{}) |
107 | | - for _, handler := range handlers { |
108 | | - swagger.UpdateResponseDefinitionUsingHandler(responses, handler) |
109 | | - } |
| 95 | + return nextHandler |
110 | 96 | } |
0 commit comments