-
Notifications
You must be signed in to change notification settings - Fork 2
/
admin.go
114 lines (102 loc) · 3.55 KB
/
admin.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
111
112
113
114
package main
import (
"log"
// "fmt"
"reflect"
"time"
// "strings"
// "strconv"
"appengine"
"appengine/datastore"
// "appengine/urlfetch"
// "appengine/memcache"
// "html/template"
"github.com/go-martini/martini"
"github.com/martini-contrib/render"
"net/http"
// "github.com/PuerkitoBio/goquery"
)
// AdminRoute manages routing for Restful API
func AdminRoute(r martini.Router) {
r.Get("/rest/metadata", AdminGetModels)
r.Get("/rest/metadata/:modelName", AdminGetMetaData)
r.Group("/rest/:modelName", func(restRoutes martini.Router) {
restRoutes.Get("", AdminGetList)
restRoutes.Get("/:id", AdminGetEntity)
restRoutes.Post("", AdminNewEntity)
restRoutes.Put("/:id", AdminUpdateEntity)
restRoutes.Delete("/:id", AdminDeleteEntity)
})
r.Get("/", AdminIndex)
}
// ModelField is struct to return metadata of a Model
type ModelField struct {
FieldName string `json:"field_name"`
FieldType string `json:"field_type"`
VerboseName string `json:"verbose_name"`
}
//Map for Models which can be used in restful API
var models = map[string]interface{}{"AdminPage": &AdminPage{}, "Article": &Article{}}
func AdminGetModels(params martini.Params, r render.Render) {
var itemList []string
for k, _ := range models {
itemList = append(itemList, k)
}
r.JSON(200, map[string]interface{}{"models": itemList})
}
// AdminGetMetaData returns list of a kind
func AdminGetMetaData(params martini.Params, r render.Render) {
//var models = map[string]interface{}{"AdminPage": &AdminPage{}, "Article": &Article{}}
modelName := params["modelName"]
var model = models[modelName]
var itemList []ModelField
s := reflect.ValueOf(model).Elem()
typeOfT := s.Type()
for i := 0; i < s.NumField(); i++ {
modelField := ModelField{typeOfT.Field(i).Tag.Get("json"), typeOfT.Field(i).Tag.Get("datastore_type"), typeOfT.Field(i).Tag.Get("verbose_name")}
itemList = append(itemList, modelField)
}
r.JSON(200, map[string]interface{}{"model_name": modelName, "fields": itemList})
}
// AdminGetList returns list of a kind
func AdminGetList(params martini.Params, r render.Render) {
r.JSON(200, map[string]interface{}{"id": params["id"], "model_name": params["modelName"]})
}
// AdminGetEntity get a entity of a kind
func AdminGetEntity(params martini.Params, r render.Render) {
r.JSON(200, map[string]interface{}{"id": params["id"], "model_name": params["modelName"]})
}
// AdminNewEntity insert a entity to a kind
func AdminNewEntity(params martini.Params, r render.Render, req *http.Request) {
c := appengine.NewContext(req)
adminPage := &AdminPage{
DisplayPage: true,
Title: "hoge",
URL: "hogeurl",
Update: time.Now(),
Create: time.Now(),
}
key := datastore.NewIncompleteKey(c, "AdminPage", nil)
_, err := datastore.Put(c, key, adminPage)
if err != nil {
log.Println("test")
}
r.JSON(200, map[string]interface{}{"id": params["id"], "model_name": params["modelName"]})
}
// AdminUpdateEntity update a entity of a kind
func AdminUpdateEntity(params martini.Params, r render.Render) {
r.JSON(200, map[string]interface{}{"id": params["id"], "model_name": params["modelName"]})
}
// AdminDeleteEntity delete a entity of a kind
func AdminDeleteEntity(params martini.Params, r render.Render) {
r.JSON(200, map[string]interface{}{"id": params["id"], "model_name": params["modelName"]})
}
// AdminIndex renders index page for admin
func AdminIndex(r render.Render) {
data := map[string]interface{}{
"title": "admin top",
"description": "this is a starter app for GAE/Go",
"body": "admin index",
}
r.HTML(200, "index", data)
}