-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathAPI_Create.go
57 lines (44 loc) · 1.15 KB
/
API_Create.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
package api
import (
"fmt"
"net/http"
"reflect"
"strings"
"github.com/aerogo/aero"
)
// Create ...
func (api *API) Create(collection string) (string, aero.Handler) {
objType := api.Type(collection)
objTypeName := objType.Name()
creatableInDBInterface := reflect.TypeOf((*Newable)(nil)).Elem()
if !reflect.PtrTo(objType).Implements(creatableInDBInterface) {
return "", nil
}
route := api.root + "new/" + strings.ToLower(objTypeName)
handler := func(ctx aero.Context) (err error) {
// Recover from panics
defer func() {
if r := recover(); r != nil {
err = r.(error)
fmt.Println("Recovered panic in", ctx.Path())
err = ctx.Error(http.StatusInternalServerError, "Server error", err)
}
}()
obj := reflect.New(objType).Interface()
creatable := obj.(Newable)
// Authorize
err = creatable.Authorize(ctx, "create")
if err != nil {
return ctx.Error(http.StatusForbidden, "Not authorized", err)
}
// Create
err = creatable.Create(ctx)
if err != nil {
return ctx.Error(http.StatusBadRequest, objTypeName+" could not be created", err)
}
// Save
creatable.Save()
return ctx.JSON(obj)
}
return route, handler
}