Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -73,6 +73,7 @@ require (
github.com/valyala/fasthttp v1.55.0 // indirect
github.com/valyala/tcplisten v1.0.0 // indirect
go.uber.org/atomic v1.9.0 // indirect
go.uber.org/dig v1.19.0 // indirect
go.uber.org/multierr v1.9.0 // indirect
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 // indirect
golang.org/x/exp v0.0.0-20230905200255-921286631fa9 // indirect
Expand Down
2 changes: 2 additions & 0 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -152,6 +152,8 @@ github.com/valyala/tcplisten v1.0.0/go.mod h1:T0xQ8SeCZGxckz9qRXTfG43PvQ/mcWh7Fw
github.com/yuin/goldmark v1.4.13/go.mod h1:6yULJ656Px+3vBD8DxQVa3kxgyrAnzto9xy5taEt/CY=
go.uber.org/atomic v1.9.0 h1:ECmE8Bn/WFTYwEW/bpKD3M8VtR/zQVbavAoalC1PYyE=
go.uber.org/atomic v1.9.0/go.mod h1:fEN4uk6kAWBTFdckzkM89CLk9XfWZrxpCo0nPH17wJc=
go.uber.org/dig v1.19.0 h1:BACLhebsYdpQ7IROQ1AGPjrXcP5dF80U3gKoFzbaq/4=
go.uber.org/dig v1.19.0/go.mod h1:Us0rSJiThwCv2GteUN0Q7OKvU7n5J4dxZ9JKUXozFdE=
go.uber.org/multierr v1.9.0 h1:7fIwc/ZtS0q++VgcfqFDxSBZVv/Xo49/SYnDFupUwlI=
go.uber.org/multierr v1.9.0/go.mod h1:X2jQV1h+kxSjClGpnseKVIxpmcjrj7MNnI0bnlfKTVQ=
golang.org/x/arch v0.0.0-20210923205945-b76863e36670 h1:18EFjUmQOcUvxNYSkA6jO9VAiXCnxFY6NyDX0bHDmkU=
Expand Down
48 changes: 24 additions & 24 deletions src/controller/auth_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -16,21 +16,21 @@ import (
)

type AuthController struct {
AuthService service.AuthService
UserService service.UserService
TokenService service.TokenService
EmailService service.EmailService
authService *service.AuthService
userService *service.UserService
tokenService *service.TokenService
emailService *service.EmailService
}

func NewAuthController(
authService service.AuthService, userService service.UserService,
tokenService service.TokenService, emailService service.EmailService,
authService *service.AuthService, userService *service.UserService,
tokenService *service.TokenService, emailService *service.EmailService,
) *AuthController {
return &AuthController{
AuthService: authService,
UserService: userService,
TokenService: tokenService,
EmailService: emailService,
authService,
userService,
tokenService,
emailService,
}
}

Expand All @@ -49,12 +49,12 @@ func (a *AuthController) Register(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

user, err := a.AuthService.Register(c, req)
user, err := a.authService.Register(c, req)
if err != nil {
return err
}

tokens, err := a.TokenService.GenerateAuthTokens(c, user)
tokens, err := a.tokenService.GenerateAuthTokens(c, user)
if err != nil {
return err
}
Expand Down Expand Up @@ -84,12 +84,12 @@ func (a *AuthController) Login(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

user, err := a.AuthService.Login(c, req)
user, err := a.authService.Login(c, req)
if err != nil {
return err
}

tokens, err := a.TokenService.GenerateAuthTokens(c, user)
tokens, err := a.tokenService.GenerateAuthTokens(c, user)
if err != nil {
return err
}
Expand Down Expand Up @@ -119,7 +119,7 @@ func (a *AuthController) Logout(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

if err := a.AuthService.Logout(c, req); err != nil {
if err := a.authService.Logout(c, req); err != nil {
return err
}

Expand All @@ -146,7 +146,7 @@ func (a *AuthController) RefreshTokens(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

tokens, err := a.AuthService.RefreshAuth(c, req)
tokens, err := a.authService.RefreshAuth(c, req)
if err != nil {
return err
}
Expand Down Expand Up @@ -175,12 +175,12 @@ func (a *AuthController) ForgotPassword(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

resetPasswordToken, err := a.TokenService.GenerateResetPasswordToken(c, req)
resetPasswordToken, err := a.tokenService.GenerateResetPasswordToken(c, req)
if err != nil {
return err
}

if errEmail := a.EmailService.SendResetPasswordEmail(req.Email, resetPasswordToken); errEmail != nil {
if errEmail := a.emailService.SendResetPasswordEmail(req.Email, resetPasswordToken); errEmail != nil {
return errEmail
}

Expand Down Expand Up @@ -211,7 +211,7 @@ func (a *AuthController) ResetPassword(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

if err := a.AuthService.ResetPassword(c, query, req); err != nil {
if err := a.authService.ResetPassword(c, query, req); err != nil {
return err
}

Expand All @@ -234,12 +234,12 @@ func (a *AuthController) ResetPassword(c *fiber.Ctx) error {
func (a *AuthController) SendVerificationEmail(c *fiber.Ctx) error {
user, _ := c.Locals("user").(*model.User)

verifyEmailToken, err := a.TokenService.GenerateVerifyEmailToken(c, user)
verifyEmailToken, err := a.tokenService.GenerateVerifyEmailToken(c, user)
if err != nil {
return err
}

if errEmail := a.EmailService.SendVerificationEmail(user.Email, *verifyEmailToken); errEmail != nil {
if errEmail := a.emailService.SendVerificationEmail(user.Email, *verifyEmailToken); errEmail != nil {
return errEmail
}

Expand All @@ -263,7 +263,7 @@ func (a *AuthController) VerifyEmail(c *fiber.Ctx) error {
Token: c.Query("token"),
}

if err := a.AuthService.VerifyEmail(c, query); err != nil {
if err := a.authService.VerifyEmail(c, query); err != nil {
return err
}

Expand Down Expand Up @@ -336,12 +336,12 @@ func (a *AuthController) GoogleCallback(c *fiber.Ctx) error {
return errJSON
}

user, err := a.UserService.CreateGoogleUser(c, googleUser)
user, err := a.userService.CreateGoogleUser(c, googleUser)
if err != nil {
return err
}

tokens, err := a.TokenService.GenerateAuthTokens(c, user)
tokens, err := a.tokenService.GenerateAuthTokens(c, user)
if err != nil {
return err
}
Expand Down
34 changes: 15 additions & 19 deletions src/controller/health_check_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,12 +8,12 @@ import (
)

type HealthCheckController struct {
HealthCheckService service.HealthCheckService
healthCheckService *service.HealthCheckService
}

func NewHealthCheckController(healthCheckService service.HealthCheckService) *HealthCheckController {
func NewHealthCheckController(healthCheckService *service.HealthCheckService) *HealthCheckController {
return &HealthCheckController{
HealthCheckService: healthCheckService,
healthCheckService,
}
}

Expand Down Expand Up @@ -46,27 +46,23 @@ func (h *HealthCheckController) Check(c *fiber.Ctx) error {
isHealthy := true
var serviceList []response.HealthCheck

// Check the database connection
if err := h.HealthCheckService.GormCheck(); err != nil {
isHealthy = false
errMsg := err.Error()
h.addServiceStatus(&serviceList, "Postgre", false, &errMsg)
} else {
h.addServiceStatus(&serviceList, "Postgre", true, nil)
// Helper to run a health check, update status and add to list
checkStatus := func(name string, fn func() error) {
err := fn()
if err != nil {
isHealthy = false
errMsg := err.Error()
h.addServiceStatus(&serviceList, name, false, &errMsg)
} else {
h.addServiceStatus(&serviceList, name, true, nil)
}
}

if err := h.HealthCheckService.MemoryHeapCheck(); err != nil {
isHealthy = false
errMsg := err.Error()
h.addServiceStatus(&serviceList, "Memory", false, &errMsg)
} else {
h.addServiceStatus(&serviceList, "Memory", true, nil)
}
checkStatus("Postgre", h.healthCheckService.GormCheck)
checkStatus("Memory", h.healthCheckService.MemoryHeapCheck)

// Return the response based on health check result
statusCode := fiber.StatusOK
status := "success"

if !isHealthy {
statusCode = fiber.StatusInternalServerError
status = "error"
Expand Down
22 changes: 11 additions & 11 deletions src/controller/user_controller.go
Original file line number Diff line number Diff line change
Expand Up @@ -12,14 +12,14 @@ import (
)

type UserController struct {
UserService service.UserService
TokenService service.TokenService
userService *service.UserService
tokenService *service.TokenService
}

func NewUserController(userService service.UserService, tokenService service.TokenService) *UserController {
func NewUserController(userService *service.UserService, tokenService *service.TokenService) *UserController {
return &UserController{
UserService: userService,
TokenService: tokenService,
userService,
tokenService,
}
}

Expand All @@ -42,7 +42,7 @@ func (u *UserController) GetUsers(c *fiber.Ctx) error {
Search: c.Query("search", ""),
}

users, totalResults, err := u.UserService.GetUsers(c, query)
users, totalResults, err := u.userService.GetUsers(c, query)
if err != nil {
return err
}
Expand Down Expand Up @@ -78,7 +78,7 @@ func (u *UserController) GetUserByID(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid user ID")
}

user, err := u.UserService.GetUserByID(c, userID)
user, err := u.userService.GetUserByID(c, userID)
if err != nil {
return err
}
Expand Down Expand Up @@ -110,7 +110,7 @@ func (u *UserController) CreateUser(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

user, err := u.UserService.CreateUser(c, req)
user, err := u.userService.CreateUser(c, req)
if err != nil {
return err
}
Expand Down Expand Up @@ -149,7 +149,7 @@ func (u *UserController) UpdateUser(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid request body")
}

user, err := u.UserService.UpdateUser(c, req, userID)
user, err := u.userService.UpdateUser(c, req, userID)
if err != nil {
return err
}
Expand Down Expand Up @@ -181,11 +181,11 @@ func (u *UserController) DeleteUser(c *fiber.Ctx) error {
return fiber.NewError(fiber.StatusBadRequest, "Invalid user ID")
}

if err := u.TokenService.DeleteAllToken(c, userID); err != nil {
if err := u.tokenService.DeleteAllToken(c, userID); err != nil {
return err
}

if err := u.UserService.DeleteUser(c, userID); err != nil {
if err := u.userService.DeleteUser(c, userID); err != nil {
return err
}

Expand Down
2 changes: 1 addition & 1 deletion src/middleware/auth.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ import (
"github.com/gofiber/fiber/v2"
)

func Auth(userService service.UserService, requiredRights ...string) fiber.Handler {
func Auth(userService *service.UserService, requiredRights ...string) fiber.Handler {
return func(c *fiber.Ctx) error {
authHeader := c.Get("Authorization")
token := strings.TrimSpace(strings.TrimPrefix(authHeader, "Bearer "))
Expand Down
10 changes: 5 additions & 5 deletions src/router/auth_route.go
Original file line number Diff line number Diff line change
Expand Up @@ -3,17 +3,17 @@ package router
import (
"app/src/config"
"app/src/controller"
m "app/src/middleware"
"app/src/middleware"
"app/src/service"

"github.com/gofiber/fiber/v2"
)

func AuthRoutes(
v1 fiber.Router, a service.AuthService, u service.UserService,
t service.TokenService, e service.EmailService,
v1 fiber.Router, authService *service.AuthService, userService *service.UserService,
tokenService *service.TokenService, emailService *service.EmailService,
) {
authController := controller.NewAuthController(a, u, t, e)
authController := controller.NewAuthController(authService, userService, tokenService, emailService)
config.GoogleConfig()

auth := v1.Group("/auth")
Expand All @@ -24,7 +24,7 @@ func AuthRoutes(
auth.Post("/refresh-tokens", authController.RefreshTokens)
auth.Post("/forgot-password", authController.ForgotPassword)
auth.Post("/reset-password", authController.ResetPassword)
auth.Post("/send-verification-email", m.Auth(u), authController.SendVerificationEmail)
auth.Post("/send-verification-email", middleware.Auth(userService), authController.SendVerificationEmail)
auth.Post("/verify-email", authController.VerifyEmail)
auth.Get("/google", authController.GoogleLogin)
auth.Get("/google-callback", authController.GoogleCallback)
Expand Down
4 changes: 2 additions & 2 deletions src/router/health_check_route.go
Original file line number Diff line number Diff line change
Expand Up @@ -7,8 +7,8 @@ import (
"github.com/gofiber/fiber/v2"
)

func HealthCheckRoutes(v1 fiber.Router, h service.HealthCheckService) {
healthCheckController := controller.NewHealthCheckController(h)
func HealthCheckRoutes(v1 fiber.Router, healthCheckService *service.HealthCheckService) {
healthCheckController := controller.NewHealthCheckController(healthCheckService)

healthCheck := v1.Group("/health-check")
healthCheck.Get("/", healthCheckController.Check)
Expand Down
42 changes: 29 additions & 13 deletions src/router/router.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,26 +6,42 @@ import (
"app/src/validation"

"github.com/gofiber/fiber/v2"
"go.uber.org/dig"
"gorm.io/gorm"
)

func Routes(app *fiber.App, db *gorm.DB) {
validate := validation.Validator()
container := dig.New()

healthCheckService := service.NewHealthCheckService(db)
emailService := service.NewEmailService()
userService := service.NewUserService(db, validate)
tokenService := service.NewTokenService(db, validate, userService)
authService := service.NewAuthService(db, validate, userService, tokenService)
container.Provide(func() *gorm.DB { return db })
container.Provide(validation.Validator)

v1 := app.Group("/v1")
container.Provide(service.NewHealthCheckService)
container.Provide(service.NewEmailService)
container.Provide(service.NewUserService)
container.Provide(service.NewTokenService)
container.Provide(service.NewAuthService)

HealthCheckRoutes(v1, healthCheckService)
AuthRoutes(v1, authService, userService, tokenService, emailService)
UserRoutes(v1, userService, tokenService)
// TODO: add another routes here...
// Invoke route setup with auto-injected dependencies
err := container.Invoke(func(
healthCheckService *service.HealthCheckService,
emailService *service.EmailService,
userService *service.UserService,
tokenService *service.TokenService,
authService *service.AuthService,
) {
v1 := app.Group("/v1")

if !config.IsProd {
DocsRoutes(v1)
HealthCheckRoutes(v1, healthCheckService)
AuthRoutes(v1, authService, userService, tokenService, emailService)
UserRoutes(v1, userService, tokenService)

if !config.IsProd {
DocsRoutes(v1)
}
})

if err != nil {
panic(err)
}
}
Loading