-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
88 lines (82 loc) · 2.15 KB
/
main.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
package main
import (
"errors"
"log"
"net/http"
"os"
"github.com/go-playground/validator/v10"
"github.com/labstack/echo/v4"
"github.com/labstack/echo/v4/middleware"
"github.com/my-cooking-codex/api/config"
"github.com/my-cooking-codex/api/db"
"github.com/my-cooking-codex/api/routes"
"gorm.io/gorm"
)
type Validator struct {
validator *validator.Validate
}
func (cv *Validator) Validate(i interface{}) error {
if err := cv.validator.Struct(i); err != nil {
return echo.NewHTTPError(http.StatusBadRequest, err.Error())
}
return nil
}
// HTTP error handler, to handle unexpected errors
func errorHandler(err error, ctx echo.Context) {
if e, ok := err.(*echo.HTTPError); ok {
// normal HTTP error
ctx.JSON(e.Code, e.Message)
return
}
ctx.Logger().Error(err)
if errors.Is(err, gorm.ErrRecordNotFound) {
ctx.NoContent(http.StatusNotFound)
} else {
ctx.NoContent(http.StatusInternalServerError)
}
}
func main() {
// Parse config
var appConfig config.AppConfig
if err := appConfig.ParseConfig(); err != nil {
log.Fatalln(err)
}
if err := os.MkdirAll(appConfig.Data.RecipeOriginalsPath(), os.ModePerm); err != nil {
log.Fatalln(err)
}
// Connect to database
if err := db.InitDB(appConfig.DB); err != nil {
log.Fatalln(err)
}
// Create & setup server
e := echo.New()
e.HTTPErrorHandler = errorHandler
e.Use(middleware.Recover())
e.Use(middleware.Logger())
corsConfig := middleware.DefaultCORSConfig
{
corsConfig.AllowOrigins = appConfig.CORSOrigins
}
e.Use(middleware.CORSWithConfig(corsConfig))
e.Validator = &Validator{validator: validator.New()}
e.Use(func(next echo.HandlerFunc) echo.HandlerFunc {
return func(ctx echo.Context) error {
ctx.Set("AppConfig", appConfig)
return next(ctx)
}
})
routes.InitRoutes(e, appConfig)
if appConfig.StaticPath != nil {
log.Println("Serving static files from", *appConfig.StaticPath)
e.Use(middleware.StaticWithConfig(middleware.StaticConfig{
Root: *appConfig.StaticPath,
HTML5: true,
}))
} else {
e.GET("/", func(ctx echo.Context) error {
return ctx.HTML(200, "<h1>API Backend Operational</h1>")
})
}
// Start server
e.Logger.Fatal(e.Start(appConfig.Bind.AsAddress()))
}