-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathmain.go
127 lines (102 loc) · 4.56 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
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
package main
import (
"log"
"net/http"
httpSwagger "github.com/swaggo/http-swagger/v2" // http-swagger middleware
_ "go-sober/docs" // swagger docs
"go-sober/internal/analytics"
"go-sober/internal/auth"
"go-sober/internal/bac"
"go-sober/internal/database"
"go-sober/internal/drinks"
"go-sober/internal/health"
"go-sober/internal/middleware"
"go-sober/internal/user"
"go-sober/platform"
)
// @title Sober API
// @version 1.0
// @description API for the Sober app
// @host localhost:8080
// @BasePath /api/v1
// @accept json
// @produce json
func main() {
// Initialize platform (config, logger, etc)
platform.InitPlatform()
config := platform.AppConfig
corsMiddleware := middleware.NewCorsMiddleware()
loggingMiddleware := middleware.NewLoggingMiddleware()
// Initialize SQLite database using config
db, err := database.NewSQLiteDB(config.Database)
if err != nil {
log.Fatal(err)
}
defer db.Close()
// Initialize repository, service, controller and middleware with config
authRepo := auth.NewRepository(db)
authService := auth.NewService(authRepo, config)
authController := auth.NewController(authService)
authMiddleware := middleware.NewAuthMiddleware(authService)
// Initialize the health components
healthController := health.NewController()
// Initialize the drinks components
drinkRepo := drinks.NewRepository(db)
drinkService := drinks.NewService(drinkRepo)
drinkController := drinks.NewController(drinkService, db)
// Initialize analytics components
drinkStatsRepo := analytics.NewRepository(db)
drinkStatsService := analytics.NewService(drinkStatsRepo)
drinkStatsController := analytics.NewController(drinkStatsService)
// Initialize realtime components
bacService := bac.NewService(drinkRepo)
bacController := bac.NewController(bacService)
// Initialize user components
userRepo := user.NewRepository(db)
userService := user.NewService(userRepo)
userController := user.NewController(userService)
// Create a new ServeMux to use with the logging middleware
mux := http.NewServeMux()
mux.HandleFunc("GET /api/v1/health", healthController.Health)
// [Public routes]
// Auth
mux.HandleFunc("POST /api/v1/auth/signup", authController.SignUp)
mux.HandleFunc("POST /api/v1/auth/login", authController.Login)
// User
mux.HandleFunc("GET /api/v1/users/profile", authMiddleware.RequireAuth(userController.GetProfile))
mux.HandleFunc("PUT /api/v1/users/profile", authMiddleware.RequireAuth(userController.UpdateProfile))
// Drink templates
mux.HandleFunc("GET /api/v1/drink-templates", drinkController.GetDrinkTemplates)
mux.HandleFunc("GET /api/v1/drink-templates/{id}", drinkController.GetDrinkTemplate)
mux.HandleFunc("PUT /api/v1/drink-templates/{id}", drinkController.UpdateDrinkTemplate)
mux.HandleFunc("DELETE /api/v1/drink-templates/{id}", drinkController.DeleteDrinkTemplate)
// [Protected routes]
// Auth
mux.HandleFunc("GET /api/v1/auth/me", authMiddleware.RequireAuth(authController.Me))
// Blood Alcohol Content (BAC)
mux.HandleFunc("GET /api/v1/bac/timeline", authMiddleware.RequireAuth(bacController.GetBAC))
mux.HandleFunc("GET /api/v1/bac/current", authMiddleware.RequireAuth(bacController.GetCurrentBAC))
// Drink logging
mux.HandleFunc("GET /api/v1/drink-logs", authMiddleware.RequireAuth(drinkController.GetDrinkLogs))
mux.HandleFunc("POST /api/v1/drink-logs", authMiddleware.RequireAuth(drinkController.CreateDrinkLog))
mux.HandleFunc("PUT /api/v1/drink-logs", authMiddleware.RequireAuth(drinkController.UpdateDrinkLog))
mux.HandleFunc("DELETE /api/v1/drink-logs/{id}", authMiddleware.RequireAuth(drinkController.DeleteDrinkLog))
mux.HandleFunc("POST /api/v1/drink-logs/parse", authMiddleware.RequireAuth(drinkController.ParseDrinkLog))
// Analytics
mux.HandleFunc("GET /api/v1/analytics/drink-stats", authMiddleware.RequireAuth(drinkStatsController.GetDrinkStats))
mux.HandleFunc("GET /api/v1/analytics/monthly-bac", authMiddleware.RequireAuth(drinkStatsController.GetMonthlyBACStats))
// Swagger documentation
mux.HandleFunc("GET /api/v1/swagger/doc.json", httpSwagger.WrapHandler)
mux.HandleFunc("GET /api/v1/swagger/", httpSwagger.Handler(
httpSwagger.URL("/api/v1/swagger/doc.json"), // Use relative URL
httpSwagger.DocExpansion("none"),
httpSwagger.DomID("swagger-ui"),
))
// Start server using config port
addr := ":" + config.Port
log.Printf("Server starting on http://localhost%s, environment: %s\n", addr, config.Environment)
log.Printf("Swagger UI: http://localhost%s/api/v1/swagger/\n", addr)
if err := http.ListenAndServe(addr, loggingMiddleware.LogRequest(corsMiddleware.EnableCors(mux))); err != nil {
log.Fatal(err)
}
}