- echo をベースに作っていく
- echo 自体が薄いラッパーなので、それにもう一枚プロジェクト用のラッピングをする
- 機能毎にコードは分けてしまってイイ
- データベースをどう扱うべきかは後で考える
- model は共通化、アプリは分けるでもいいのかも
- データベースの状態は model に押し込める
- model は struct で生やして、そこにメソッドを生成していく
- struct User つくって User.GetUserById(id) みたいな感じで取得できるようにする
- ミドルウェアを上手く使う
- user/session ここに色々押し込めていく
とりあえず echo-web というサンプルをベースに考えてみたが、これが正しいかはわからない
- middleware
- auth
- auth.go
- session
- session.go
- auth
- model
- model.go
- db.go
- user.go
- router
api/
api.go
- router.go
- template
- template.go
- conf.go
- echo.go
package main
import (
"net/http"
"github.com/go-pg/pg"
"github.com/go-pg/pg/orm"
"github.com/labstack/echo"
"github.com/labstack/echo/middleware"
)
type User struct {
Id int64
Name string
Emails []string
}
func index(db *pg.DB) echo.HandlerFunc {
return func(c echo.Context) error {
var users []User
err := db.Model(&users).Select()
if err != nil {
panic(err)
}
return c.JSON(http.StatusOK, users)
}
}
func main() {
db := pg.Connect(&pg.Options{
User: "postgres",
})
err := createSchema(db)
if err != nil {
panic(err)
}
err = db.Insert(&User{
Name: "admin",
Emails: []string{"admin1@admin", "admin2@admin"},
})
if err != nil {
panic(err)
}
err = db.Insert(&User{
Name: "root",
Emails: []string{"root1@root", "root2@root"},
})
if err != nil {
panic(err)
}
e := echo.New()
e.Use(middleware.Recover())
e.Use(middleware.Logger())
e.Use(middleware.Gzip())
e.GET("/", index(db))
e.Logger.Fatal(e.Start(":5000"))
}
func createSchema(db *pg.DB) error {
err := db.CreateTable(&User{}, &orm.CreateTableOptions{
Temp: true,
})
if err != nil {
return err
}
}