Skip to content

Commit

Permalink
refact: implement single instance
Browse files Browse the repository at this point in the history
  • Loading branch information
AfandyW committed Aug 10, 2024
1 parent 0515487 commit a8def56
Show file tree
Hide file tree
Showing 12 changed files with 196 additions and 98 deletions.
42 changes: 42 additions & 0 deletions app/app.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
package app

import (
"github.com/hammer-code/lms-be/app/middlewares"
users "github.com/hammer-code/lms-be/app/users"
"github.com/hammer-code/lms-be/config"
"github.com/hammer-code/lms-be/domain"
pkgDB "github.com/hammer-code/lms-be/pkg/db"
"github.com/hammer-code/lms-be/pkg/jwt"
"gorm.io/driver/postgres"
)

type App struct {
UserHandler domain.UserHandler
Middleware domain.Middleware
}

func InitApp(
cfg config.Config,
) App {

db := config.GetDatabase(postgres.Dialector{
Config: &postgres.Config{
DSN: cfg.DB_POSTGRES_DSN,
}})

dbTx := pkgDB.NewDBTransaction(db)
jwtInstance := jwt.NewJwt(cfg.JWT_SECRET_KEY)

// repository
userRepo := users.InitRepository(dbTx)

// Middlewares
middleware := middlewares.InitMiddleware(jwtInstance, userRepo)

userHandler := users.InitHandler(dbTx, jwtInstance)

return App{
UserHandler: userHandler,
Middleware: middleware,
}
}
11 changes: 9 additions & 2 deletions app/middlewares/middleware.go
Original file line number Diff line number Diff line change
@@ -1,11 +1,18 @@
package middlewares

import (
"github.com/hammer-code/lms-be/app/users"
"github.com/hammer-code/lms-be/domain"
"github.com/hammer-code/lms-be/pkg/jwt"
)

type Middleware struct {
Jwt jwt.JWT
UserRepo users.UserRepository
UserRepo domain.UserRepository
}

func InitMiddleware(jwt jwt.JWT, userRepo domain.UserRepository) domain.Middleware {
return &Middleware{
Jwt: jwt,
UserRepo: userRepo,
}
}
21 changes: 13 additions & 8 deletions app/users/delivery/http/http.go
Original file line number Diff line number Diff line change
@@ -1,18 +1,23 @@
package http

import (
"github.com/hammer-code/lms-be/app/middlewares"
"github.com/hammer-code/lms-be/app/users"
"github.com/hammer-code/lms-be/domain"
)

type Handler struct {
usecase users.UserUsecase
Middleware middlewares.Middleware
usecase domain.UserUsecase
}

func NewHandler(userUsecase users.UserUsecase, middleware *middlewares.Middleware) Handler {
return Handler{
usecase: userUsecase,
Middleware: *middleware,
var (
handlr *Handler
)

func NewHandler(userUsecase domain.UserUsecase) domain.UserHandler {
if handlr == nil {
handlr = &Handler{
usecase: userUsecase,
}
}

return *handlr
}
19 changes: 13 additions & 6 deletions app/users/repository/repository.go
Original file line number Diff line number Diff line change
@@ -1,7 +1,7 @@
package repository

import (
"github.com/hammer-code/lms-be/app/users"
"github.com/hammer-code/lms-be/domain"
pkgDB "github.com/hammer-code/lms-be/pkg/db"
)

Expand All @@ -11,9 +11,16 @@ type (
}
)

// injek magang
func NewRepository(db pkgDB.DatabaseTransaction) users.UserRepository {
return &repository{
db,
var (
repo *repository
)

func NewRepository(db pkgDB.DatabaseTransaction) domain.UserRepository {
if repo == nil {
repo = &repository{
db,
}
}
}

return repo
}
23 changes: 15 additions & 8 deletions app/users/usecase/usecase.go
Original file line number Diff line number Diff line change
@@ -1,21 +1,28 @@
package usecase

import (
"github.com/hammer-code/lms-be/app/users"
"github.com/hammer-code/lms-be/domain"
"github.com/hammer-code/lms-be/pkg/db"
"github.com/hammer-code/lms-be/pkg/jwt"
)

type usecase struct {
userRepo users.UserRepository
userRepo domain.UserRepository
dbTX db.DatabaseTransaction
jwt jwt.JWT
jwt jwt.JWT
}

func NewUsecase( userRepo users.UserRepository, dbTX db.DatabaseTransaction, jwt jwt.JWT) users.UserUsecase {
return &usecase{
userRepo: userRepo,
dbTX: dbTX,
jwt: jwt,
var (
usec *usecase
)

func NewUsecase(userRepo domain.UserRepository, dbTX db.DatabaseTransaction, jwt jwt.JWT) domain.UserUsecase {
if usec == nil {
usec = &usecase{
userRepo: userRepo,
dbTX: dbTX,
jwt: jwt,
}
}
return usec
}
42 changes: 17 additions & 25 deletions app/users/users.go
Original file line number Diff line number Diff line change
@@ -1,31 +1,23 @@
package users

import (
"context"
"time"

users_handler "github.com/hammer-code/lms-be/app/users/delivery/http"
users_repo "github.com/hammer-code/lms-be/app/users/repository"
users_usecase "github.com/hammer-code/lms-be/app/users/usecase"
"github.com/hammer-code/lms-be/domain"
"github.com/hammer-code/lms-be/pkg/db"
"github.com/hammer-code/lms-be/pkg/jwt"
)

type (
UserRepository interface {
GetUsers(ctx context.Context) (users []domain.User, err error)
CreateUser(ctx context.Context, userReq domain.User) (user domain.User, err error)
FindById(ctx context.Context, id int8) (user domain.User, err error)
FindByEmail(ctx context.Context, email string) (user domain.User, err error)
UpdateProfileUser(ctx context.Context, userReq domain.UserUpdateProfile, id int) error
DeleteUser(ctx context.Context, id int8) error
LogoutUser(ctx context.Context, token string, expiredAt time.Time) error
ExpiredToken(ctx context.Context, token string) error
GetUsersGenericConditions(ctx context.Context, filter domain.GetUserBy) (users []domain.User, err error)
}
UserUsecase interface {
GetUsers(ctx context.Context) (users []domain.User, err error)
GetUserById(ctx context.Context, id int8) (users domain.User, err error)
Register(ctx context.Context, userReq domain.User) (user domain.User, err error)
Login(ctx context.Context, userReq domain.Login) (user domain.User, token string, err error)
UpdateProfileUser(ctx context.Context, userReq domain.UserUpdateProfile, id int) error
DeleteUser(ctx context.Context, id int8) error
Logout(ctx context.Context, token string) error
}
)
// alias
func InitRepository(db db.DatabaseTransaction) domain.UserRepository {
return users_repo.NewRepository(db)
}

func InitUsecase(dbTX db.DatabaseTransaction, jwt jwt.JWT) domain.UserUsecase {
return users_usecase.NewUsecase(InitRepository(dbTX), dbTX, jwt)
}

func InitHandler(dbTX db.DatabaseTransaction, jwt jwt.JWT) domain.UserHandler {
return users_handler.NewHandler(InitUsecase(dbTX, jwt))
}
60 changes: 14 additions & 46 deletions cmd/serve_http.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,23 +8,17 @@ import (
"os/signal"
"syscall"

"github.com/hammer-code/lms-be/app/middlewares"

muxHandlers "github.com/gorilla/handlers"
"github.com/gorilla/mux"
users_handler "github.com/hammer-code/lms-be/app/users/delivery/http"
users_repo "github.com/hammer-code/lms-be/app/users/repository"
users_usecase "github.com/hammer-code/lms-be/app/users/usecase"

"github.com/hammer-code/lms-be/app"
"github.com/hammer-code/lms-be/config"
"github.com/hammer-code/lms-be/domain"
pkgDB "github.com/hammer-code/lms-be/pkg/db"
"github.com/hammer-code/lms-be/pkg/jwt"
"github.com/hammer-code/lms-be/utils"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
httpSwagger "github.com/swaggo/http-swagger"
"github.com/swaggo/swag"
"gorm.io/driver/postgres"
)

var serveHttpCmd = &cobra.Command{
Expand All @@ -37,32 +31,10 @@ var serveHttpCmd = &cobra.Command{

cfg := config.GetConfig()

db := config.GetDatabase(postgres.Dialector{
Config: &postgres.Config{
DSN: cfg.DB_POSTGRES_DSN,
}})

dbTx := pkgDB.NewDBTransaction(db)
jwtInstance := jwt.NewJwt(cfg.JWT_SECRET_KEY)

// repository
userRepo := users_repo.NewRepository(dbTx)
// usecase
userUsecase := users_usecase.NewUsecase(userRepo, dbTx, jwt.NewJwt(cfg.JWT_SECRET_KEY))

// Middlewares
middleware := middlewares.Middleware{
Jwt: jwtInstance,
UserRepo: userRepo,
}

// handler
userHandler := users_handler.NewHandler(userUsecase, &middleware)
app := app.InitApp(cfg)

// route
router := registerHandler(handler{
userHandler: userHandler,
})
router := registerHandler(app)

// build cors
muxCorsWithRouter := muxHandlers.CORS(
Expand Down Expand Up @@ -141,11 +113,7 @@ func health(w http.ResponseWriter, _ *http.Request) {
}, w)
}

type handler struct {
userHandler users_handler.Handler
}

func registerHandler(h handler) *mux.Router {
func registerHandler(app app.App) *mux.Router {

router := mux.NewRouter()

Expand All @@ -156,18 +124,18 @@ func registerHandler(h handler) *mux.Router {

v1 := router.PathPrefix("/api/v1").Subrouter()
protectedV1Route := v1.NewRoute().Subrouter()
protectedV1Route.Use(h.userHandler.Middleware.AuthMiddleware)
protectedV1Route.Use(app.Middleware.AuthMiddleware)

v1.HandleFunc("/register", h.userHandler.Register).Methods(http.MethodPost)
v1.HandleFunc("/login", h.userHandler.Login).Methods(http.MethodPost)
v1.HandleFunc("/register", app.UserHandler.Register).Methods(http.MethodPost)
v1.HandleFunc("/login", app.UserHandler.Login).Methods(http.MethodPost)

protectedV1Route.HandleFunc("/users", h.userHandler.GetUsers).Methods(http.MethodGet)
protectedV1Route.HandleFunc("/user", h.userHandler.GetUserProfile).Methods(http.MethodGet)
protectedV1Route.HandleFunc("/logout", h.userHandler.Logout).Methods(http.MethodPost)
protectedV1Route.HandleFunc("/users", app.UserHandler.GetUsers).Methods(http.MethodGet)
protectedV1Route.HandleFunc("/user", app.UserHandler.GetUserProfile).Methods(http.MethodGet)
protectedV1Route.HandleFunc("/logout", app.UserHandler.Logout).Methods(http.MethodPost)

protectedV1Route.HandleFunc("/", h.userHandler.GetUserById).Methods(http.MethodGet)
protectedV1Route.HandleFunc("/update", h.userHandler.UpdateProfileUser).Methods(http.MethodPut)
protectedV1Route.HandleFunc("/delete", h.userHandler.DeleteUser).Methods(http.MethodDelete)
protectedV1Route.HandleFunc("/", app.UserHandler.GetUserById).Methods(http.MethodGet)
protectedV1Route.HandleFunc("/update", app.UserHandler.UpdateProfileUser).Methods(http.MethodPut)
protectedV1Route.HandleFunc("/delete", app.UserHandler.DeleteUser).Methods(http.MethodDelete)

return router
}
27 changes: 27 additions & 0 deletions domain/event.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
package domain

import (
"time"

"gopkg.in/guregu/null.v4"
)

type Event struct {
ID int `json:"id"`
Title string `json:"id"`
Description string `json:"description"`
Author string `json:"author"`
ImageEvent string `json:"image_event"`
DateEvent null.Time `json:"date_event"`
Type string `json:"type"`
Location string `json:"location"`
Duration string `json:"duration"`
Capacity int `json:"capacity"`
RegistrationLink string `json:"registration_link"`
CreatedAt time.Time `json:"created_at"`
UpdatedAt null.Time `json:"updated_at"`
}

func (Event) TableName() string {
return "events"
}
7 changes: 7 additions & 0 deletions domain/middleware.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
package domain

import "net/http"

type Middleware interface {
AuthMiddleware(next http.Handler) http.Handler
}
37 changes: 36 additions & 1 deletion domain/user.go
Original file line number Diff line number Diff line change
@@ -1,8 +1,43 @@
package domain

import "time"
import (
"context"
"net/http"
"time"
)

type (
UserRepository interface {
GetUsers(ctx context.Context) (users []User, err error)
CreateUser(ctx context.Context, userReq User) (user User, err error)
FindById(ctx context.Context, id int8) (user User, err error)
FindByEmail(ctx context.Context, email string) (user User, err error)
UpdateProfileUser(ctx context.Context, userReq UserUpdateProfile, id int) error
DeleteUser(ctx context.Context, id int8) error
LogoutUser(ctx context.Context, token string, expiredAt time.Time) error
ExpiredToken(ctx context.Context, token string) error
GetUsersGenericConditions(ctx context.Context, filter GetUserBy) (users []User, err error)
}
UserUsecase interface {
GetUsers(ctx context.Context) (users []User, err error)
GetUserById(ctx context.Context, id int8) (users User, err error)
Register(ctx context.Context, userReq User) (user User, err error)
Login(ctx context.Context, userReq Login) (user User, token string, err error)
UpdateProfileUser(ctx context.Context, userReq UserUpdateProfile, id int) error
DeleteUser(ctx context.Context, id int8) error
Logout(ctx context.Context, token string) error
}

UserHandler interface {
Login(w http.ResponseWriter, r *http.Request)
UpdateProfileUser(w http.ResponseWriter, r *http.Request)
DeleteUser(w http.ResponseWriter, r *http.Request)
GetUsers(w http.ResponseWriter, r *http.Request)
Logout(w http.ResponseWriter, r *http.Request)
Register(w http.ResponseWriter, r *http.Request)
GetUserById(w http.ResponseWriter, r *http.Request)
GetUserProfile(w http.ResponseWriter, r *http.Request)
}
User struct {
ID int `gorm:"primaryKey" json:"id"`
Username string `json:"username" gorm:"type:varchar(255);not null;unique"`
Expand Down
Loading

0 comments on commit a8def56

Please sign in to comment.