/
server.go
84 lines (65 loc) 路 1.84 KB
/
server.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
package server
import (
"context"
"fmt"
"html/template"
"net/http"
"time"
"github.com/exler/nurli/internal"
"github.com/exler/nurli/internal/core"
"github.com/go-chi/chi"
"gorm.io/gorm"
)
type ServerConfig struct {
ServerPort int
BasicAuthUsername string
BasicAuthPassword string
}
type ServerHandler struct {
DB *gorm.DB
Logger *core.ZerologGORMLogger
templates *template.Template
}
func ServeApp(config ServerConfig, db *gorm.DB, logger *core.ZerologGORMLogger) error {
ctx := context.Background()
sh := ServerHandler{
DB: db,
Logger: logger,
}
err := sh.prepareTemplates()
if err != nil {
logger.Fatal(ctx, "Error preparing templates")
}
fs := http.FileServer(http.FS(internal.StaticFS))
router := chi.NewRouter()
if config.BasicAuthUsername != "" && config.BasicAuthPassword != "" {
router.Use(BasicAuthMiddleware("Nurli", config.BasicAuthUsername, config.BasicAuthPassword))
}
router.Handle("/static/*", fs)
// UI routes
router.Route("/", func(r chi.Router) {
r.Get("/", sh.IndexHandler)
r.Get("/add", sh.AddBookmarkHandler)
r.Post("/add", sh.AddBookmarkHandler)
r.Get("/edit/{id}", sh.EditBookmarkHandler)
r.Post("/edit/{id}", sh.EditBookmarkHandler)
r.Get("/delete/{id}", sh.DeleteBookmarkHandler)
r.Post("/delete/{id}", sh.DeleteBookmarkHandler)
})
// API routes
router.Route("/api", func(r chi.Router) {
r.Get("/health", sh.HealthAPIHandler)
r.Get("/url", sh.URLDetailAPIHandler)
r.Put("/bookmark", sh.SaveBookmarkAPIHandler)
r.Delete("/bookmark", sh.DeleteBookmarkAPIHandler)
})
srv := &http.Server{
Addr: fmt.Sprintf(":%d", config.ServerPort),
WriteTimeout: time.Second * 15,
ReadTimeout: time.Second * 15,
IdleTimeout: time.Second * 60,
Handler: router,
}
logger.Info(ctx, "Listening on port %d", config.ServerPort)
return srv.ListenAndServe()
}