-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathserver.go
139 lines (111 loc) · 3.66 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
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
128
129
130
131
132
133
134
135
136
137
138
139
package main
import (
"log"
"github.com/DeepAung/gofiber-library/handlers"
"github.com/DeepAung/gofiber-library/pkg/configs"
"github.com/DeepAung/gofiber-library/pkg/middlewares"
"github.com/DeepAung/gofiber-library/pkg/storer"
"github.com/DeepAung/gofiber-library/services"
"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cors"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/fiber/v2/middleware/recover"
"gorm.io/gorm"
)
type server struct {
App *fiber.App
Mid *middlewares.Middleware
Cfg *configs.Config
DB *gorm.DB
}
func NewServer(
app *fiber.App,
mid *middlewares.Middleware,
cfg *configs.Config,
db *gorm.DB,
) *server {
return &server{
App: app,
Mid: mid,
Cfg: cfg,
DB: db,
}
}
func (s *server) Start() {
s.App.Use(logger.New())
s.App.Use(recover.New())
s.App.Use(cors.New(cors.Config{}))
s.App.Static("/static", "./static")
s.initRoutes()
log.Fatal(s.App.Listen(s.Cfg.App.Port))
}
func (s *server) initRoutes() {
storer := storer.NewGCPStorer(s.Cfg)
usersSvc := services.NewUsersService(s.DB, s.Cfg)
booksSvc := services.NewBooksService(s.DB, s.Cfg)
filesSvc := services.NewFilesService(s.DB, storer)
api := s.App.Group("/api")
s.UsersRouter(api, usersSvc)
s.BooksRouter(api, booksSvc, usersSvc)
s.FilesRouter(api, filesSvc, usersSvc)
s.ViewsRouter(s.App, usersSvc, booksSvc)
s.App.Use(s.Mid.PageNotFound(usersSvc))
}
func (s *server) UsersRouter(r fiber.Router, usersSvc *services.UsersService) {
handler := handlers.NewUsersHandler(usersSvc, s.Mid)
onlyAuthorized := s.Mid.JwtAccessTokenAuth(usersSvc)
onlyUnauthorized := s.Mid.OnlyUnauthorizedAuth(usersSvc)
r.Post("/login", onlyUnauthorized, handler.Login)
r.Post("/register", onlyUnauthorized, handler.Register)
r.Post("/logout", onlyAuthorized, handler.Logout)
r.Post("/refresh", onlyAuthorized, handler.UpdateTokens)
}
func (s *server) BooksRouter(
r fiber.Router,
booksSvc *services.BooksService,
usersSvc *services.UsersService,
) {
handler := handlers.NewBooksHandler(booksSvc, s.Mid)
onlyAuthorized := s.Mid.JwtAccessTokenAuth(usersSvc)
onlyAdmin := s.Mid.OnlyAdmin(usersSvc)
book := r.Group("/books", onlyAuthorized)
book.Post("/", onlyAdmin, handler.CreateBook)
book.Put("/:id", onlyAdmin, handler.UpdateBook)
book.Delete("/:id", onlyAdmin, handler.DeleteBook)
book.Post("/:id/favorite", handler.ToggleFavoriteBook)
}
func (s *server) FilesRouter(
r fiber.Router,
filesSvc *services.FilesService,
usersSvc *services.UsersService,
) {
handler := handlers.NewFilesHandler(filesSvc)
onlyAuthorized := s.Mid.JwtAccessTokenAuth(usersSvc)
onlyAdmin := s.Mid.OnlyAdmin(usersSvc)
file := r.Group("/files", onlyAuthorized, onlyAdmin)
file.Post("/upload/:bookId", handler.UploadFiles)
file.Post("/delete", handler.DeleteFile)
}
func (s *server) ViewsRouter(
r fiber.Router,
usersSvc *services.UsersService,
booksSvc *services.BooksService,
) {
handler := handlers.NewViewsHandler(booksSvc, s.Mid, s.Cfg)
onlyAuthorized := s.Mid.JwtAccessTokenAuth(usersSvc)
onlyUnauthorized := s.Mid.OnlyUnauthorizedAuth(usersSvc)
onlyAdmin := s.Mid.OnlyAdmin(usersSvc)
setIsAdmin := s.Mid.SetIsAdmin(usersSvc)
setOnAdminPage := func(c *fiber.Ctx) error {
c.Locals("onAdminPage", true)
return c.Next()
}
r.Get("/login", onlyUnauthorized, handler.LoginView)
r.Get("/register", onlyUnauthorized, handler.RegisterView)
r.Get("/", onlyAuthorized, setIsAdmin, handler.IndexView)
r.Get("/books/:id", onlyAuthorized, setIsAdmin, handler.DetailView)
admin := r.Group("/admin", onlyAuthorized, onlyAdmin, setOnAdminPage)
admin.Get("/", handler.IndexView)
admin.Get("/books/:id", handler.DetailView)
admin.Get("/create", handler.CreateView)
}