diff --git a/apiapp.go b/apiapp.go new file mode 100644 index 0000000..af78fc3 --- /dev/null +++ b/apiapp.go @@ -0,0 +1,224 @@ +package main + +import ( + "fmt" + "os" + path "path/filepath" + "strings" +) + +var cmdApiapp = &Command{ + // CustomFlags: true, + UsageLine: "api [appname]", + Short: "create an api application base on beego framework", + Long: ` +create an api application base on beego framework + +In the current path, will create a folder named [appname] + +In the appname folder has the follow struct: + + ├── conf + │   └── app.conf + ├── controllers + │   └── default.go + ├── main.go + └── models + └── default.go + +`, +} + +var apiconf = ` +appname = {{.Appname}} +httpport = 8080 +runmode = dev +autorender = false +` +var apiMaingo = `package main + +import ( + "{{.Appname}}/controllers" + "github.com/astaxie/beego" +) + +func main() { + beego.Router("/{{.Version}}/users/:objectId", &controllers.UserController{}) + beego.Router("/{{.Version}}/users", &controllers.UserController{}) + beego.Run() +} +` +var apiModels = `package models + +type User struct { + Id interface{} + Name string + Email string +} + +func (this *User) One(id interface{}) (user User, err error) { + // get user from DB + // user, err = query(id) + user = User{id, "astaxie", "astaxie@gmail.com"} + return +} + +func (this *User) All() (users []User, err error) { + // get all users from DB + // users, err = queryAll() + users = append([]User{}, User{1, "astaxie", "astaxie@gmail.com"}) + users = append(users, User{2, "someone", "someone@gmail.com"}) + return +} + +func (this *User) Update(id interface{}) (err error) { + // user, err = update(id, this) + return +} + +` + +var apiControllers = `package controllers + +import ( + "encoding/json" + "{{.Appname}}/models" + "github.com/astaxie/beego" + "io/ioutil" +) + +type UserController struct { + beego.Controller +} + +func (this *UserController) Get() { + var user models.User + objectId := this.Ctx.Params[":objectId"] + if objectId != "" { + user, err := user.One(objectId) + if err != nil { + this.Data["json"] = err + } else { + this.Data["json"] = user + } + } else { + users, err := user.All() + if err != nil { + this.Data["json"] = err + } else { + this.Data["json"] = users + } + } + this.ServeJson() +} + +func (this *UserController) Put() { + defer this.ServeJson() + var user models.User + objectId := this.Ctx.Params[":objectId"] + + body, err := ioutil.ReadAll(this.Ctx.Request.Body) + if err != nil { + this.Data["json"] = err + return + } + this.Ctx.Request.Body.Close() + + if err = json.Unmarshal(body, &user); err != nil { + this.Data["json"] = err + return + } + + err = user.Update(objectId) + if err != nil { + this.Data["json"] = err + } else { + this.Data["json"] = "update success!" + } +} + +` + +func init() { + cmdApiapp.Run = createapi +} + +func createapi(cmd *Command, args []string) { + version := "1" + if len(args) == 2 { + version = args[1] + } else if len(args) != 1 { + fmt.Println("error args") + os.Exit(2) + } + apppath, packpath, err := checkEnv(args[0]) + if err != nil { + fmt.Println(err) + os.Exit(2) + } + os.MkdirAll(apppath, 0755) + fmt.Println("create app folder:", apppath) + os.Mkdir(path.Join(apppath, "conf"), 0755) + fmt.Println("create conf:", path.Join(apppath, "conf")) + os.Mkdir(path.Join(apppath, "controllers"), 0755) + fmt.Println("create controllers:", path.Join(apppath, "controllers")) + os.Mkdir(path.Join(apppath, "models"), 0755) + fmt.Println("create models:", path.Join(apppath, "models")) + + fmt.Println("create conf app.conf:", path.Join(apppath, "conf", "app.conf")) + writetofile(path.Join(apppath, "conf", "app.conf"), + strings.Replace(apiconf, "{{.Appname}}", args[0], -1)) + + fmt.Println("create controllers default.go:", path.Join(apppath, "controllers", "default.go")) + writetofile(path.Join(apppath, "controllers", "default.go"), + strings.Replace(apiControllers, "{{.Appname}}", packpath, -1)) + + fmt.Println("create models default.go:", path.Join(apppath, "models", "default.go")) + writetofile(path.Join(apppath, "models", "default.go"), apiModels) + + fmt.Println("create main.go:", path.Join(apppath, "main.go")) + apiMaingo = strings.Replace(apiMaingo, "{{.Version}}", version, -1) + writetofile(path.Join(apppath, "main.go"), + strings.Replace(apiMaingo, "{{.Appname}}", packpath, -1)) +} + +func checkEnv(appname string) (apppath, packpath string, err error) { + curpath, err := os.Getwd() + if err != nil { + return + } + + gopath := os.Getenv("GOPATH") + Debugf("gopath:%s", gopath) + if gopath == "" { + err = fmt.Errorf("you should set GOPATH in the env") + return + } + + appsrcpath := "" + haspath := false + wgopath := path.SplitList(gopath) + for _, wg := range wgopath { + wg = path.Join(wg, "src") + + if path.HasPrefix(strings.ToLower(curpath), strings.ToLower(wg)) { + haspath = true + appsrcpath = wg + break + } + } + + if !haspath { + err = fmt.Errorf("can't create application outside of GOPATH `%s`\n"+ + "you first should `cd $GOPATH%ssrc` then use create\n", gopath, string(path.Separator)) + return + } + apppath = path.Join(curpath, appname) + + if _, e := os.Stat(apppath); os.IsNotExist(e) == false { + err = fmt.Errorf("path `%s` exists, can not create app without remove it\n", apppath) + return + } + packpath = strings.Join(strings.Split(apppath[len(appsrcpath)+1:], string(path.Separator)), "/") + return +} diff --git a/main.go b/main.go index 3749707..6a479f6 100644 --- a/main.go +++ b/main.go @@ -59,6 +59,7 @@ var commands = []*Command{ cmdCreate, cmdStart, cmdPack, + cmdApiapp, //cmdReStart, }