-
Notifications
You must be signed in to change notification settings - Fork 0
/
main.go
113 lines (95 loc) · 3.12 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
package main
import (
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/swagger"
"github.com/joho/godotenv"
"log"
"os"
_ "split-the-bill-server/docs"
"split-the-bill-server/domain/service/impl"
"split-the-bill-server/domain/util"
"split-the-bill-server/presentation/handler"
"split-the-bill-server/presentation/middleware"
"split-the-bill-server/presentation/router"
"split-the-bill-server/storage"
"split-the-bill-server/storage/database"
"split-the-bill-server/storage/database/db_storages"
"split-the-bill-server/storage/ephemeral"
"split-the-bill-server/storage/ephemeral/eph_storages"
)
// @title Split The Bill API
// @version 1.0
// @host localhost:8080
// @BasePath /
func main() {
// load environment variables
err := godotenv.Load(".env")
if err != nil {
log.Fatal(err)
}
// create storage directory for uploaded images
if err = os.MkdirAll("./uploads/profileImages", os.ModePerm); err != nil {
log.Fatal(err)
}
// configure webserver
app := fiber.New(fiber.Config{
BodyLimit: 4 * 1024 * 1024, // 4MB
})
// setup storage
userStorage, groupStorage, cookieStorage, billStorage := setupStorage()
// services
userService := impl.NewUserService(&userStorage, &cookieStorage)
groupService := impl.NewGroupService(&groupStorage)
billService := impl.NewBillService(&billStorage, &groupStorage)
// password validator
passwordValidator, err := util.NewPasswordValidator()
if err != nil {
log.Fatal(err)
}
// handlers
userHandler := handler.NewUserHandler(&userService, passwordValidator)
groupHandler := handler.NewGroupHandler(&groupService)
billHandler := handler.NewBillHandler(&billService, &groupService)
// setup logger
app.Use(logger.New())
// authenticator
authenticator := middleware.NewAuthenticator(&cookieStorage)
// routing
router.SetupRoutes(app, *userHandler, *groupHandler, *billHandler, *authenticator)
// setup swagger
app.Get("/swagger/*", swagger.HandlerDefault) // default
// setup CORS
app.Use(cors.New())
// handle unavailable route
app.Use(func(c *fiber.Ctx) error {
return c.SendStatus(404) // => 404 "Not Found"
})
err = app.Listen(":8080")
if err != nil {
log.Fatal(err)
}
}
// setupStorage initializes and configures the storage components based on the STORAGE_TYPE environment variable.
func setupStorage() (storage.IUserStorage, storage.IGroupStorage, storage.ICookieStorage, storage.IBillStorage) {
storageType := os.Getenv("STORAGE_TYPE")
switch storageType {
case "postgres":
db, err := database.NewDatabase()
if err != nil {
log.Fatal(err)
}
return db_storages.NewUserStorage(db), db_storages.NewGroupStorage(db), db_storages.NewCookieStorage(db), db_storages.NewBillStorage(db)
case "ephemeral":
db, err := ephemeral.NewEphemeral()
if err != nil {
log.Fatal(err)
}
// TODO: add invitation storage in ephemeral
return eph_storages.NewUserStorage(db), eph_storages.NewGroupStorage(db), eph_storages.NewCookieStorage(db), eph_storages.NewBillStorage(db)
default:
log.Fatalf("Unsupported storage type: %s", storageType)
return nil, nil, nil, nil
}
}