-
Notifications
You must be signed in to change notification settings - Fork 0
/
routes.go
115 lines (97 loc) · 3.61 KB
/
routes.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
package api
import (
"net/http"
"github.com/borosr/qa-site/pkg/answers"
answerRepository "github.com/borosr/qa-site/pkg/answers/repository"
"github.com/borosr/qa-site/pkg/auth"
authRepository "github.com/borosr/qa-site/pkg/auth/repository"
"github.com/borosr/qa-site/pkg/db"
"github.com/borosr/qa-site/pkg/healthcheck"
"github.com/borosr/qa-site/pkg/questions"
questionRepository "github.com/borosr/qa-site/pkg/questions/repository"
"github.com/borosr/qa-site/pkg/ratings"
rateRepository "github.com/borosr/qa-site/pkg/ratings/repository"
"github.com/borosr/qa-site/pkg/settings"
"github.com/borosr/qa-site/pkg/users"
userRepository "github.com/borosr/qa-site/pkg/users/repository"
logger "github.com/chi-middleware/logrus-logger"
"github.com/go-chi/chi"
"github.com/go-chi/chi/middleware"
log "github.com/sirupsen/logrus"
)
func Init() error {
r := chi.NewRouter()
r.Use(middleware.RequestID)
r.Use(middleware.RealIP)
r.Use(logger.Logger("router", log.New()))
r.Use(middleware.Recoverer)
r.Use(healthcheck.Middleware)
ur := userRepository.NewRepository(db.Get())
aur := authRepository.NewRepository(db.GetBDB(), db.Get())
qr := questionRepository.NewRepository(db.Get())
anr := answerRepository.NewRepository(db.Get())
rr := rateRepository.NewRepository(db.Get())
uc := users.NewController(ur)
auc := auth.NewController(ur, aur)
qc := questions.NewController(qr)
anc := answers.NewController(anr, qr)
rc := ratings.NewController(rr)
hcc := healthcheck.NewController()
r.Route("/api", func(r chi.Router) {
loggedIn := r.With(auc.Middleware)
r.Get("/status", hcc.Route)
r.Get("/info", hcc.Info)
initAuth(r, loggedIn, auc)
initUsers(r, loggedIn, uc)
initQuestions(r, loggedIn, qc)
initAnswers(r, loggedIn, anc)
initRatings(loggedIn, rc)
})
config := settings.Get()
log.Infof("Running the API on port: %s", config.Port)
if hchk := healthcheck.Instance(); hchk.Healthy() {
hchk.Ok()
}
return http.ListenAndServe(":"+config.Port, r)
}
func initRatings(loggedIn chi.Router, rc ratings.RateController) {
loggedIn.Put("/{kind:(answers|questions)}/{id}/rate", rc.Rate)
loggedIn.Put("/{kind:(answers|questions)}/{id}/unrate", rc.Unrate)
loggedIn.Put("/{kind:(answers|questions)}/{id}/rate/dismiss", rc.Dismiss)
}
func initAnswers(r, loggedIn chi.Router, anc answers.AnswerController) {
readRouter := loggedIn
if settings.Get().Visibility == settings.VisibilityPublic {
readRouter = r
}
readRouter.Get("/questions/{questionID}/answers", anc.GetQuestionsAnswers)
loggedIn.Put("/questions/{questionID}/answers/{answerID}/answered", anc.SetAnswered)
loggedIn.Get("/answers", anc.GetMyAnswers)
loggedIn.Post("/answers", anc.Create)
loggedIn.Put("/answers/{id}", anc.Update)
}
func initQuestions(r, loggedIn chi.Router, qc questions.QuestionController) {
readRouter := loggedIn
if settings.Get().Visibility == settings.VisibilityPublic {
readRouter = r
}
readRouter.Get("/questions", qc.GetAll)
readRouter.Get("/questions/{id}", qc.Get)
loggedIn.Delete("/questions/{id}", qc.Delete)
loggedIn.Post("/questions", qc.Create)
loggedIn.Put("/questions/{id}", qc.Update)
}
func initAuth(r, loggedIn chi.Router, ac auth.Controller) {
r.Post("/login", ac.DefaultLogin)
r.Get("/login/{media:(github)}", ac.SocialMediaRedirect)
r.Get("/login/{media:(github)}/callback", ac.SocialMediaCallback)
loggedIn.Delete("/logout", ac.Logout)
r.Post("/revoke", ac.Revoke)
}
func initUsers(r, loggedIn chi.Router, uc users.UserController) {
r.Post("/users", uc.Create)
loggedIn.Get("/users", uc.GetAll)
loggedIn.Get("/users/{id}", uc.Get)
loggedIn.Put("/users/{id}", uc.Update)
loggedIn.Delete("/users/{id}", uc.Delete)
}