├── .gitignore ├── Models ├── Model.go └── Todos.go ├── Routes └── Routes.go ├── main.go ├── Config └── Database.go ├── README.MD └── Controllers └── Todo.go /.gitignore: -------------------------------------------------------------------------------- 1 | .idea 2 | .git 3 | gin-bin.exe -------------------------------------------------------------------------------- /Models/Model.go: -------------------------------------------------------------------------------- 1 | package Models 2 | 3 | type Todo struct { 4 | ID uint `json:"id"` 5 | Title string `json:"title"` 6 | Description string `json:"description"` 7 | } 8 | 9 | func (b *Todo) TableName() string { 10 | return "todo" 11 | } 12 | -------------------------------------------------------------------------------- /Routes/Routes.go: -------------------------------------------------------------------------------- 1 | package Routes 2 | 3 | import ( 4 | "github.com/ektagarg/gin-gorm-todo-app/Controllers" 5 | "github.com/gin-gonic/gin" 6 | ) 7 | 8 | func SetupRouter() *gin.Engine { 9 | r := gin.Default() 10 | 11 | v1 := r.Group("/v1") 12 | { 13 | v1.GET("todo", Controllers.GetTodos) 14 | v1.POST("todo", Controllers.CreateATodo) 15 | v1.GET("todo/:id", Controllers.GetATodo) 16 | v1.PUT("todo/:id", Controllers.UpdateATodo) 17 | v1.DELETE("todo/:id", Controllers.DeleteATodo) 18 | } 19 | 20 | return r 21 | } 22 | -------------------------------------------------------------------------------- /main.go: -------------------------------------------------------------------------------- 1 | package main 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/ektagarg/gin-gorm-todo-app/Config" 7 | "github.com/ektagarg/gin-gorm-todo-app/Models" 8 | "github.com/ektagarg/gin-gorm-todo-app/Routes" 9 | "github.com/jinzhu/gorm" 10 | ) 11 | 12 | var err error 13 | 14 | func main() { 15 | 16 | Config.DB, err = gorm.Open("mysql", Config.DbURL(Config.BuildDBConfig())) 17 | 18 | if err != nil { 19 | fmt.Println("statuse: ", err) 20 | } 21 | 22 | defer Config.DB.Close() 23 | Config.DB.AutoMigrate(&Models.Todo{}) 24 | 25 | r := Routes.SetupRouter() 26 | // running 27 | r.Run() 28 | } 29 | -------------------------------------------------------------------------------- /Config/Database.go: -------------------------------------------------------------------------------- 1 | package Config 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/jinzhu/gorm" 7 | ) 8 | 9 | var DB *gorm.DB 10 | 11 | // DBConfig represents db configuration 12 | type DBConfig struct { 13 | Host string 14 | Port int 15 | User string 16 | DBName string 17 | Password string 18 | } 19 | 20 | func BuildDBConfig() *DBConfig { 21 | dbConfig := DBConfig{ 22 | Host: "0.0.0.0", 23 | Port: 3306, 24 | User: "root", 25 | DBName: "todos", 26 | Password: "rootadmin", 27 | } 28 | return &dbConfig 29 | } 30 | 31 | func DbURL(dbConfig *DBConfig) string { 32 | return fmt.Sprintf( 33 | "%s:%s@tcp(%s:%d)/%s?charset=utf8&parseTime=True&loc=Local", 34 | dbConfig.User, 35 | dbConfig.Password, 36 | dbConfig.Host, 37 | dbConfig.Port, 38 | dbConfig.DBName, 39 | ) 40 | } 41 | -------------------------------------------------------------------------------- /README.MD: -------------------------------------------------------------------------------- 1 | # Api go simple 2 | It is a just simple REST API with Go using: 3 | 1. **Gin Framework** 4 | 2. **Gorm** 5 | 6 | ## Installation & Run 7 | ```bash 8 | # Download this project 9 | $ go get github.com/go-sql-driver/mysql 10 | 11 | # Download Gin Framework 12 | $ go get github.com/gin-gonic/gin 13 | 14 | # Download GORM 15 | $ go get github.com/jinzhu/gorm 16 | ``` 17 | 18 | ## DB Setup 19 | 1. Go to Config/Database.go 20 | 2. Update DBName, User, Password and Host, Port according to your database configuration 21 | 22 | ## API list 23 | 24 | * `GET` : Get all todos 25 | * `POST` : Create a todo 26 | * `GET` : Get a todo 27 | * `PUT` : Update a todo 28 | * `DELETE` : Delete a todo 29 | 30 | ## Post Params 31 | ``` 32 | { 33 | "name": "Groceries shopping", 34 | "description": "Biscuits, Tea, Milk, Soap, Powder", 35 | } 36 | ``` 37 | -------------------------------------------------------------------------------- /Models/Todos.go: -------------------------------------------------------------------------------- 1 | package Models 2 | 3 | import ( 4 | "fmt" 5 | 6 | "github.com/ektagarg/gin-gorm-todo-app/Config" 7 | _ "github.com/go-sql-driver/mysql" 8 | ) 9 | 10 | func GetAllTodos(todo *[]Todo) (err error) { 11 | if err = Config.DB.Find(todo).Error; err != nil { 12 | return err 13 | } 14 | return nil 15 | } 16 | 17 | func CreateATodo(todo *Todo) (err error) { 18 | if err = Config.DB.Create(todo).Error; err != nil { 19 | return err 20 | } 21 | return nil 22 | } 23 | 24 | func GetATodo(todo *Todo, id string) (err error) { 25 | if err := Config.DB.Where("id = ?", id).First(todo).Error; err != nil { 26 | return err 27 | } 28 | return nil 29 | } 30 | 31 | func UpdateATodo(todo *Todo, id string) (err error) { 32 | fmt.Println(todo) 33 | Config.DB.Save(todo) 34 | return nil 35 | } 36 | 37 | func DeleteATodo(todo *Todo, id string) (err error) { 38 | Config.DB.Where("id = ?", id).Delete(todo) 39 | return nil 40 | } 41 | -------------------------------------------------------------------------------- /Controllers/Todo.go: -------------------------------------------------------------------------------- 1 | package Controllers 2 | 3 | import ( 4 | "net/http" 5 | 6 | "github.com/ektagarg/gin-gorm-todo-app/Models" 7 | "github.com/gin-gonic/gin" 8 | ) 9 | 10 | func GetTodos(c *gin.Context) { 11 | var todo []Models.Todo 12 | err := Models.GetAllTodos(&todo) 13 | if err != nil { 14 | c.AbortWithStatus(http.StatusNotFound) 15 | } else { 16 | c.JSON(http.StatusOK, todo) 17 | } 18 | } 19 | 20 | func CreateATodo(c *gin.Context) { 21 | var todo Models.Todo 22 | c.BindJSON(&todo) 23 | err := Models.CreateATodo(&todo) 24 | if err != nil { 25 | c.AbortWithStatus(http.StatusNotFound) 26 | } else { 27 | c.JSON(http.StatusOK, todo) 28 | } 29 | } 30 | 31 | func GetATodo(c *gin.Context) { 32 | id := c.Params.ByName("id") 33 | var todo Models.Todo 34 | err := Models.GetATodo(&todo, id) 35 | if err != nil { 36 | c.AbortWithStatus(http.StatusNotFound) 37 | } else { 38 | c.JSON(http.StatusOK, todo) 39 | } 40 | } 41 | 42 | func UpdateATodo(c *gin.Context) { 43 | var todo Models.Todo 44 | id := c.Params.ByName("id") 45 | err := Models.GetATodo(&todo, id) 46 | if err != nil { 47 | c.JSON(http.StatusNotFound, todo) 48 | } 49 | c.BindJSON(&todo) 50 | err = Models.UpdateATodo(&todo, id) 51 | if err != nil { 52 | c.AbortWithStatus(http.StatusNotFound) 53 | } else { 54 | c.JSON(http.StatusOK, todo) 55 | } 56 | } 57 | 58 | func DeleteATodo(c *gin.Context) { 59 | var todo Models.Todo 60 | id := c.Params.ByName("id") 61 | err := Models.DeleteATodo(&todo, id) 62 | if err != nil { 63 | c.AbortWithStatus(http.StatusNotFound) 64 | } else { 65 | c.JSON(http.StatusOK, gin.H{"id:" + id: "deleted"}) 66 | } 67 | } 68 | --------------------------------------------------------------------------------