diff --git a/g_controllers.go b/g_controllers.go index d782bdf..30bc86c 100644 --- a/g_controllers.go +++ b/g_controllers.go @@ -44,7 +44,16 @@ func generateController(cname, crupath string) { fpath := path.Join(fp, strings.ToLower(controllerName)+".go") if f, err := os.OpenFile(fpath, os.O_CREATE|os.O_EXCL|os.O_RDWR, 0666); err == nil { defer f.Close() - content := strings.Replace(controllerTpl, "{{packageName}}", packageName, -1) + modelPath := path.Join(crupath, "models", strings.ToLower(controllerName)+".go") + var content string + if _, err := os.Stat(modelPath); err == nil { + ColorLog("[INFO] Using matching model '%s'\n", controllerName) + content = strings.Replace(controllerModelTpl, "{{packageName}}", packageName, -1) + pkgPath := getPackagePath(crupath) + content = strings.Replace(content, "{{pkgPath}}", pkgPath, -1) + } else { + content = strings.Replace(controllerTpl, "{{packageName}}", packageName, -1) + } content = strings.Replace(content, "{{controllerName}}", controllerName, -1) f.WriteString(content) // gofmt generated source code @@ -132,3 +141,163 @@ func (c *{{controllerName}}Controller) Delete() { } ` + +var controllerModelTpl = `package {{packageName}} + +import ( + "{{pkgPath}}/models" + "encoding/json" + "errors" + "strconv" + "strings" + + "github.com/astaxie/beego" +) + +// oprations for {{controllerName}} +type {{controllerName}}Controller struct { + beego.Controller +} + +func (c *{{controllerName}}Controller) URLMapping() { + c.Mapping("Post", c.Post) + c.Mapping("GetOne", c.GetOne) + c.Mapping("GetAll", c.GetAll) + c.Mapping("Put", c.Put) + c.Mapping("Delete", c.Delete) +} + +// @Title Post +// @Description create {{controllerName}} +// @Param body body models.{{controllerName}} true "body for {{controllerName}} content" +// @Success 200 {int} models.{{controllerName}}.Id +// @Failure 403 body is empty +// @router / [post] +func (c *{{controllerName}}Controller) Post() { + var v models.{{controllerName}} + json.Unmarshal(c.Ctx.Input.RequestBody, &v) + if id, err := models.Add{{controllerName}}(&v); err == nil { + c.Data["json"] = map[string]int64{"id": id} + } else { + c.Data["json"] = err.Error() + } + c.ServeJson() +} + +// @Title Get +// @Description get {{controllerName}} by id +// @Param id path string true "The key for staticblock" +// @Success 200 {object} models.{{controllerName}} +// @Failure 403 :id is empty +// @router /:id [get] +func (c *{{controllerName}}Controller) GetOne() { + idStr := c.Ctx.Input.Params[":id"] + id, _ := strconv.ParseInt(idStr, 0, 64) + v, err := models.Get{{controllerName}}ById(id) + if err != nil { + c.Data["json"] = err.Error() + } else { + c.Data["json"] = v + } + c.ServeJson() +} + +// @Title Get All +// @Description get {{controllerName}} +// @Param query query string false "Filter. e.g. col1:v1,col2:v2 ..." +// @Param fields query string false "Fields returned. e.g. col1,col2 ..." +// @Param sortby query string false "Sorted-by fields. e.g. col1,col2 ..." +// @Param order query string false "Order corresponding to each sortby field, if single value, apply to all sortby fields. e.g. desc,asc ..." +// @Param limit query string false "Limit the size of result set. Must be an integer" +// @Param offset query string false "Start position of result set. Must be an integer" +// @Success 200 {object} models.{{controllerName}} +// @Failure 403 +// @router / [get] +func (c *{{controllerName}}Controller) GetAll() { + var fields []string + var sortby []string + var order []string + var query map[string]string = make(map[string]string) + var limit int64 = 10 + var offset int64 = 0 + + // fields: col1,col2,entity.col3 + if v := c.GetString("fields"); v != "" { + fields = strings.Split(v, ",") + } + // limit: 10 (default is 10) + if v, err := c.GetInt64("limit"); err == nil { + limit = v + } + // offset: 0 (default is 0) + if v, err := c.GetInt64("offset"); err == nil { + offset = v + } + // sortby: col1,col2 + if v := c.GetString("sortby"); v != "" { + sortby = strings.Split(v, ",") + } + // order: desc,asc + if v := c.GetString("order"); v != "" { + order = strings.Split(v, ",") + } + // query: k:v,k:v + if v := c.GetString("query"); v != "" { + for _, cond := range strings.Split(v, ",") { + kv := strings.Split(cond, ":") + if len(kv) != 2 { + c.Data["json"] = errors.New("Error: invalid query key/value pair") + c.ServeJson() + return + } + k, v := kv[0], kv[1] + query[k] = v + } + } + + l, err := models.GetAll{{controllerName}}(query, fields, sortby, order, offset, limit) + if err != nil { + c.Data["json"] = err.Error() + } else { + c.Data["json"] = l + } + c.ServeJson() +} + +// @Title Update +// @Description update the {{controllerName}} +// @Param id path string true "The id you want to update" +// @Param body body models.{{controllerName}} true "body for {{controllerName}} content" +// @Success 200 {object} models.{{controllerName}} +// @Failure 403 :id is not int +// @router /:id [put] +func (c *{{controllerName}}Controller) Put() { + idStr := c.Ctx.Input.Params[":id"] + id, _ := strconv.ParseInt(idStr, 0, 64) + v := models.{{controllerName}}{Id: id} + json.Unmarshal(c.Ctx.Input.RequestBody, &v) + if err := models.Update{{controllerName}}ById(&v); err == nil { + c.Data["json"] = "OK" + } else { + c.Data["json"] = err.Error() + } + c.ServeJson() +} + +// @Title Delete +// @Description delete the {{controllerName}} +// @Param id path string true "The id you want to delete" +// @Success 200 {string} delete success! +// @Failure 403 id is empty +// @router /:id [delete] +func (c *{{controllerName}}Controller) Delete() { + idStr := c.Ctx.Input.Params[":id"] + id, _ := strconv.ParseInt(idStr, 0, 64) + if err := models.Delete{{controllerName}}(id); err == nil { + c.Data["json"] = "OK" + } else { + c.Data["json"] = err.Error() + } + c.ServeJson() +} +` diff --git a/g_model.go b/g_model.go index 403c208..859164f 100644 --- a/g_model.go +++ b/g_model.go @@ -140,7 +140,7 @@ func Add{{modelName}}(m *{{modelName}}) (id int64, err error) { // Get{{modelName}}ById retrieves {{modelName}} by Id. Returns error if // Id doesn't exist -func Get{{modelName}}ById(id int) (v *{{modelName}}, err error) { +func Get{{modelName}}ById(id int64) (v *{{modelName}}, err error) { o := orm.NewOrm() v = &{{modelName}}{Id: id} if err = o.Read(v); err == nil { @@ -240,7 +240,7 @@ func Update{{modelName}}ById(m *{{modelName}}) (err error) { // Delete{{modelName}} deletes {{modelName}} by Id and returns error if // the record to be deleted doesn't exist -func Delete{{modelName}}(id int) (err error) { +func Delete{{modelName}}(id int64) (err error) { o := orm.NewOrm() v := {{modelName}}{Id: id} // ascertain id exists in the database