-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
105 lines (95 loc) · 2.69 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
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
package main
import (
"errors"
"fmt"
"log/slog"
"net/http"
"os"
"github.com/Suryarpan/chat-api/internal/apiconf"
"github.com/Suryarpan/chat-api/internal/auth"
"github.com/go-chi/chi/v5"
"github.com/go-chi/chi/v5/middleware"
"github.com/go-chi/cors"
"github.com/jackc/pgx/v5/pgxpool"
)
func setUpMiddlewares(r *chi.Mux, cp *pgxpool.Pool) error {
if r == nil {
return errors.New("please provide a router")
} else if cp == nil {
return errors.New("please provide a connection pool")
}
r.Use(apiconf.Logger)
r.Use(apiconf.ApiConfigure(cp))
r.Use(middleware.Recoverer)
r.Use(middleware.CleanPath)
r.Use(middleware.AllowContentType("application/json", "text/xml"))
r.Use(middleware.ContentCharset("", "UTF-8", "Latin-1"))
r.Use(cors.Handler(cors.Options{
AllowedOrigins: []string{"https://*", "http://*"},
AllowedMethods: []string{"GET", "POST", "PUT", "PATCH", "DELETE", "OPTIONS"},
AllowedHeaders: []string{"Accept", "Authorization", "Content-Type", "X-CSRF-Token"},
ExposedHeaders: []string{"Link"},
AllowCredentials: false,
MaxAge: 300, // Maximum value not ignored by any of major browsers
}))
r.Use(middleware.StripSlashes)
return nil
}
func routeSetup(r *chi.Mux) error {
if r == nil {
return errors.New("please provide a router")
}
// auth api setup
r.Mount("/auth", AuthRouter())
// user api setup
r.Mount("/user", UserRouter())
// chat data setup
r.With(auth.Authentication).Mount("/message", MessageRouter())
// admin setup
return nil
}
func main() {
logger := slog.New(*apiconf.LoggerConfig())
slog.SetDefault(logger)
// DB Setup
connPool, err := apiconf.SetupPool()
if err != nil {
panic(fmt.Sprintf("Error: could not create connection pool: %v", err))
}
defer connPool.Close()
// Auth Setup
err = auth.SetupAuth()
if err != nil {
panic(fmt.Sprintf("Error: could not setup auth: %v", err))
}
// router setup
mainRouter := chi.NewRouter()
err = setUpMiddlewares(mainRouter, connPool)
if err != nil {
panic(fmt.Sprintf("Error: could not setup middlewares: %v", err))
}
// base api setup
apiV1router := chi.NewRouter()
apiV1router.Get("/health", func(w http.ResponseWriter, r *http.Request) {
w.Write([]byte("Hello World"))
})
err = routeSetup(apiV1router)
if err != nil {
panic(fmt.Sprintf("Error: could not mount the sub routes: %v", err))
}
// router run
mainRouter.Mount("/api/v1", apiV1router)
port, ok := os.LookupEnv("CHAT_API_PORT")
if !ok {
panic("Error: could not find CHAT_API_PORT environment variable")
}
logger.Info("starting router", "port", port)
server := &http.Server{
Handler: mainRouter,
Addr: ":" + port,
}
err = server.ListenAndServe()
if err != nil {
slog.Error(fmt.Sprintf("%v", err))
}
}