diff --git a/HISTORY.md b/HISTORY.md index 04f896c3e..9a106c2f6 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -21,4 +21,4 @@ Developers are not forced to upgrade if they don't really need it. Upgrade whene **How to upgrade**: Open your command-line and execute this command: `go get github.com/kataras/iris@v11.2.0`. -# Mo, 22 July 2019 | v11.2.0 +# Tu, 23 July 2019 | v11.2.0 diff --git a/VERSION b/VERSION index ccea1b399..fc36dc0ee 100644 --- a/VERSION +++ b/VERSION @@ -1 +1 @@ -11.2.0:https://github.com/kataras/iris/blob/master/HISTORY.md#soon \ No newline at end of file +11.2.0:THE_DEV_LINK \ No newline at end of file diff --git a/_examples/orm/gorm/REAMDE.md b/_examples/orm/gorm/REAMDE.md new file mode 100644 index 000000000..7e684d63c --- /dev/null +++ b/_examples/orm/gorm/REAMDE.md @@ -0,0 +1,5 @@ +# GORM + +This example is pull by [#1275 PR](https://github.com/kataras/iris/pull/1275) by [@wuxiaoxiaoshen](https://github.com/wuxiaoxiaoshen). + +A more complete and real-world example can be found at the project created by [@snowlyg](https://github.com/snowlyg). diff --git a/_examples/orm/gorm/main.go b/_examples/orm/gorm/main.go new file mode 100644 index 000000000..3199b9967 --- /dev/null +++ b/_examples/orm/gorm/main.go @@ -0,0 +1,176 @@ +package main + +import ( + "net/http" + "os" + "time" + + "github.com/jinzhu/gorm" + "github.com/kataras/iris" + _ "github.com/mattn/go-sqlite3" +) + +type User struct { + gorm.Model + Salt string `gorm:"type:varchar(255)" json:"salt"` + Username string `gorm:"type:varchar(32)" json:"username"` + Password string `gorm:"type:varchar(200);column:password" json:"-"` + Languages string `gorm:"type:varchar(200);column:languages" json:"languages"` +} + +func (u User) TableName() string { + return "gorm_user" +} + +type UserSerializer struct { + ID uint `json:"id"` + CreatedAt time.Time `json:"created_at"` + UpdatedAt time.Time `json:"updated_at"` + Salt string `json:"salt"` + UserName string `json:"user_name"` + Password string `json:"-"` + Languages string `json:"languages"` +} + +func (self User) Serializer() UserSerializer { + return UserSerializer{ + ID: self.ID, + CreatedAt: self.CreatedAt.Truncate(time.Second), + UpdatedAt: self.UpdatedAt.Truncate(time.Second), + Salt: self.Salt, + Password: self.Password, + Languages: self.Languages, + UserName: self.Username, + } +} + +func main() { + app := iris.Default() + db, err := gorm.Open("sqlite3", "test.db") + db.LogMode(true) // show SQL logger + if err != nil { + app.Logger().Fatalf("connect to sqlite3 failed") + return + } + iris.RegisterOnInterrupt(func() { + defer db.Close() + }) + + if os.Getenv("ENV") != "" { + db.DropTableIfExists(&User{}) // drop table + } + db.AutoMigrate(&User{}) // create table: // AutoMigrate run auto migration for given models, will only add missing fields, won't delete/change current data + + app.Post("/post_user", func(context iris.Context) { + var user User + user = User{ + Username: "gorm", + Salt: "hash---", + Password: "admin", + Languages: "gorm", + } + if err := db.FirstOrCreate(&user); err == nil { + app.Logger().Fatalf("created one record failed: %s", err.Error) + context.JSON(iris.Map{ + "code": http.StatusBadRequest, + "error": err.Error, + }) + return + } + context.JSON( + iris.Map{ + "code": http.StatusOK, + "data": user.Serializer(), + }) + }) + + app.Get("/get_user/{id:uint}", func(context iris.Context) { + var user User + id, _ := context.Params().GetUint("id") + app.Logger().Println(id) + if err := db.Where("id = ?", int(id)).First(&user).Error; err != nil { + app.Logger().Fatalf("find one record failed: %t", err == nil) + context.JSON(iris.Map{ + "code": http.StatusBadRequest, + "error": err.Error, + }) + return + } + context.JSON(iris.Map{ + "code": http.StatusOK, + "data": user.Serializer(), + }) + }) + + app.Delete("/delete_user/{id:uint}", func(context iris.Context) { + id, _ := context.Params().GetUint("id") + if id == 0 { + context.JSON(iris.Map{ + "code": http.StatusOK, + "detail": "query param id should not be nil", + }) + return + } + var user User + if err := db.Where("id = ?", id).First(&user).Error; err != nil { + app.Logger().Fatalf("record not found") + context.JSON(iris.Map{ + "code": http.StatusOK, + "detail": err.Error, + }) + return + } + db.Delete(&user) + context.JSON(iris.Map{ + "code": http.StatusOK, + "data": user.Serializer(), + }) + }) + + app.Patch("/patch_user/{id:uint}", func(context iris.Context) { + id, _ := context.Params().GetUint("id") + if id == 0 { + context.JSON(iris.Map{ + "code": http.StatusOK, + "detail": "query param id should not be nil", + }) + return + } + var user User + tx := db.Begin() + if err := tx.Where("id = ?", id).First(&user).Error; err != nil { + app.Logger().Fatalf("record not found") + context.JSON(iris.Map{ + "code": http.StatusOK, + "detail": err.Error, + }) + return + } + + var body patchParam + context.ReadJSON(&body) + app.Logger().Println(body) + if err := tx.Model(&user).Updates(map[string]interface{}{"username": body.Data.UserName, "password": body.Data.Password}).Error; err != nil { + app.Logger().Fatalf("update record failed") + tx.Rollback() + context.JSON(iris.Map{ + "code": http.StatusBadRequest, + "error": err.Error, + }) + return + } + tx.Commit() + context.JSON(iris.Map{ + "code": http.StatusOK, + "data": user.Serializer(), + }) + }) + app.Run(iris.Addr(":8080"), iris.WithoutServerError(iris.ErrServerClosed)) +} + +type patchParam struct { + Data struct { + UserName string `json:"user_name" form:"user_name"` + Password string `json:"password" form:"password"` + } `json:"data"` +}