From da3606b9d0f9fe1750a60edaf6b211d5b8da051e Mon Sep 17 00:00:00 2001 From: Kanan Rahimov Date: Sun, 15 Mar 2020 05:09:52 +0100 Subject: [PATCH 1/4] goweb - gin - GET, POST, DELETE, LIST --- goweb/gowebgin/main.go | 35 +++++++++++++++++++-- goweb/gowebgin/model.go | 70 +++++++++++++++++++++++++++++++++++++++++ 2 files changed, 103 insertions(+), 2 deletions(-) create mode 100644 goweb/gowebgin/model.go diff --git a/goweb/gowebgin/main.go b/goweb/gowebgin/main.go index c08a9fb..886009a 100644 --- a/goweb/gowebgin/main.go +++ b/goweb/gowebgin/main.go @@ -1,14 +1,45 @@ package main -import "github.com/gin-gonic/gin" +import ( + "net/http" + + "github.com/gin-gonic/gin" +) func main() { + mdb := NewMemDb() + r := gin.Default() r.GET("/ping", func(c *gin.Context) { - c.JSON(200, gin.H{ + c.JSON(http.StatusOK, gin.H{ "message": "pong", }) }) + r.GET("/users", func(c *gin.Context) { + c.JSON(http.StatusOK, mdb.ListUsers()) + }) + + r.POST("/users", func(c *gin.Context) { + var user User + err := c.BindJSON(&user) + if err != nil { + c.JSON(http.StatusInternalServerError, err.Error()) + } else { + c.JSON(http.StatusCreated, mdb.AddUser(&user)) + } + }) + + r.GET("/users/:username", func(c *gin.Context) { + username := c.Param("username") + c.JSON(http.StatusOK, mdb.GetUser(username)) + }) + + r.DELETE("/users/:username", func(c *gin.Context) { + username := c.Param("username") + mdb.DeleteUser(username) + c.JSON(http.StatusOK, gin.H{}) + }) + r.Run() // listen and serve on 0.0.0.0:8080 (for windows "localhost:8080") } diff --git a/goweb/gowebgin/model.go b/goweb/gowebgin/model.go new file mode 100644 index 0000000..7114c8d --- /dev/null +++ b/goweb/gowebgin/model.go @@ -0,0 +1,70 @@ +package main + +import "log" + +// User is a in-memory user model. +type User struct { + Username string `json:"username"` + FirstName string `json:"first_name"` + LastName string `json:"last_name"` +} + +// NewMemDb creates and returns a new instance of MemDb. +func NewMemDb() *MemDb { + return &MemDb{ + users: []*User{}, + kvsUsers: map[string]int{}, + } +} + +// MemDb is a memory database. +type MemDb struct { + users []*User + kvsUsers map[string]int +} + +// AddUser stores user in in-memory database. +func (db *MemDb) AddUser(u *User) *User { + log.Println("AddUser", u) + + ind, ok := db.kvsUsers[u.Username] + if !ok { + db.kvsUsers[u.Username] = len(db.users) + db.users = append(db.users, u) + } else { + db.users[ind] = u + } + + return db.users[ind] +} + +// GetUser returns user in in-memory database. +func (db *MemDb) GetUser(username string) *User { + log.Println("GetUser", username) + + ind, ok := db.kvsUsers[username] + if ok { + return db.users[ind] + } + + return nil +} + +// DeleteUser deletes user in in-memory database. +func (db *MemDb) DeleteUser(username string) { + log.Println("DeleteUser", username) + + if ind, ok := db.kvsUsers[username]; ok { + db.users[ind] = db.users[len(db.users)-1] + db.users = db.users[:len(db.users)-1] + + delete(db.kvsUsers, username) + } +} + +// ListUsers returns all users in in-memory database. +func (db *MemDb) ListUsers() []*User { + log.Println("ListUsers") + + return db.users +} From 2eed77e9fe45d5804f6e0e202bcc7d67a284edff Mon Sep 17 00:00:00 2001 From: Kanan Rahimov Date: Sun, 15 Mar 2020 05:17:39 +0100 Subject: [PATCH 2/4] goweb - gin - fix add method --- goweb/gowebgin/model.go | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/goweb/gowebgin/model.go b/goweb/gowebgin/model.go index 7114c8d..0dfadb5 100644 --- a/goweb/gowebgin/model.go +++ b/goweb/gowebgin/model.go @@ -31,10 +31,10 @@ func (db *MemDb) AddUser(u *User) *User { if !ok { db.kvsUsers[u.Username] = len(db.users) db.users = append(db.users, u) - } else { - db.users[ind] = u + return db.users[len(db.users)-1] } + db.users[ind] = u return db.users[ind] } From b19d647314cb2b2d4fd457152137df56c4602b54 Mon Sep 17 00:00:00 2001 From: Kanan Rahimov Date: Mon, 16 Mar 2020 01:03:47 +0100 Subject: [PATCH 3/4] Main README --- README.md | 7 +++++++ 1 file changed, 7 insertions(+) create mode 100644 README.md diff --git a/README.md b/README.md new file mode 100644 index 0000000..fbdcd41 --- /dev/null +++ b/README.md @@ -0,0 +1,7 @@ +# Go Tutorials + +Go-lang related tutorials. + +## Topics + +- [Web Frameworks](https://github.com/codervlogger/go-tutorials) From b875c3f5290cc3df5af409a095122c9b12242fc9 Mon Sep 17 00:00:00 2001 From: Kanan Rahimov Date: Mon, 16 Mar 2020 01:07:50 +0100 Subject: [PATCH 4/4] Update README --- README.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/README.md b/README.md index fbdcd41..92ea1e5 100644 --- a/README.md +++ b/README.md @@ -4,4 +4,4 @@ Go-lang related tutorials. ## Topics -- [Web Frameworks](https://github.com/codervlogger/go-tutorials) +- [Web Frameworks](/goweb)