|
|
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 |
|
|
}
|
|
|
|