-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathcrudman.go
110 lines (97 loc) · 2.74 KB
/
crudman.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
// Package crudman curd api
package crudman
import (
"net/http"
"reflect"
)
type (
// Managers all managers
Managers struct {
container map[string]ManagerInterface
}
// ManagerInterface manger interface
ManagerInterface interface {
List(r *http.Request) interface{}
Post(r *http.Request) (interface{}, error)
Put(r *http.Request) (interface{}, error)
Delete(r *http.Request) error
GetRoute() string
SetRoute(route string)
SetTableTyp(typ reflect.Type)
GetTableTyp() reflect.Type
GetTable() Tabler
SetTable(table Tabler)
}
// Setup setting
Setup interface {
set(managerInterface ManagerInterface)
}
// Route router
Route struct {
route string
}
)
// Tabler any structure that uses this library needs to implement this interface,
// for example, in mysql, this is identified as the table name
type Tabler interface {
TableName() string
}
// New get a new Managers object
func New() *Managers {
return &Managers{
container: make(map[string]ManagerInterface, 0),
}
}
// SetRoute setup custom route
func SetRoute(r string) *Route { return &Route{r} }
func (r Route) set(managerInterface ManagerInterface) { managerInterface.SetRoute(r.route) }
// NotFound 404
func (managers *Managers) NotFound(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusNotFound)
_, _ = w.Write([]byte(`404 not found`))
}
// Forbidden 403
func (managers *Managers) Forbidden(w http.ResponseWriter, r *http.Request) {
w.WriteHeader(http.StatusForbidden)
_, _ = w.Write([]byte(`404 not found`))
}
// Handler http handler, support GET->list data, POST->create data, PUT->update data, DELETE->delete data
func (managers *Managers) Handler(w http.ResponseWriter, r *http.Request) (obj interface{}, err error) {
var route = r.URL.Path
var manager, ok = managers.Get(route)
if !ok {
managers.NotFound(w, r)
return
}
switch r.Method {
case http.MethodGet:
obj = manager.List(r)
case http.MethodPost:
obj, err = manager.Post(r)
case http.MethodPut:
obj, err = manager.Put(r)
case http.MethodDelete:
err = manager.Delete(r)
default:
managers.Forbidden(w, r)
return
}
return
}
// Get get exist manager
func (managers *Managers) Get(route string) (ManagerInterface, bool) {
manager, ok := managers.container[route]
return manager, ok
}
// Register register manager
// you can inherit GormManager or MongoManager and then override the method to implement custom operations
func (managers *Managers) Register(manager ManagerInterface, entity Tabler, setups ...Setup) *Managers {
manager.SetRoute("/" + entity.TableName())
manager.SetTableTyp(reflect.TypeOf(entity))
manager.SetTable(entity)
for _, set := range setups {
set.set(manager)
}
managers.container[manager.GetRoute()] = manager
return managers
}