Skip to content

Commit

Permalink
Refactor (#15)
Browse files Browse the repository at this point in the history
* 🚚 chore: rename controller to handler

* 👽️ chore: update references after renaming controller to handler

* 🚚 chore: rename function for simplicity

* 👽️ chore: update references after renaming function

* 🚚 refactor: move mapper function call

* 🚚 refactor: move requestid helper

* 🔇 chore: remove logging from handlers

* 🔊 chore: add logging to error handler

* ➖ chore: run go mod tidy

* 🥅 fix: update error handling in use-cases

* 🔊 fix: update logging to use built-in GORM logger

* ✏️ chore: update function parameter name

* 🩹 fix: update logic in `buildResponse` function

* 🔊 feat: add logging helper
  • Loading branch information
aikuci authored Sep 4, 2024
1 parent a3013f3 commit 4bdbac4
Show file tree
Hide file tree
Showing 34 changed files with 442 additions and 457 deletions.
2 changes: 1 addition & 1 deletion cmd/web/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ import (
func main() {
viperConfig := config.NewViper()
zapLog := config.NewZapLog(viperConfig)
db := config.NewDatabase(viperConfig, zapLog)
db := config.NewDatabase(viperConfig)
validate := config.NewValidator(viperConfig)

file, err := os.OpenFile("storage/log/fiber.log", os.O_RDWR|os.O_CREATE|os.O_APPEND, 0666)
Expand Down
1 change: 0 additions & 1 deletion go.mod
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ require (
github.com/gobeam/stringy v0.0.7
github.com/gofiber/fiber/v2 v2.52.5
github.com/gofiber/storage/sqlite3/v2 v2.1.1
github.com/gofiber/utils/v2 v2.0.0-beta.6
github.com/google/uuid v1.6.0
github.com/lib/pq v1.10.9
github.com/spf13/viper v1.19.0
Expand Down
2 changes: 0 additions & 2 deletions go.sum
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,6 @@ github.com/gofiber/fiber/v2 v2.52.5 h1:tWoP1MJQjGEe4GB5TUGOi7P2E0ZMMRx5ZTG4rT+yG
github.com/gofiber/fiber/v2 v2.52.5/go.mod h1:KEOE+cXMhXG0zHc9d8+E38hoX+ZN7bhOtgeF2oT6jrQ=
github.com/gofiber/storage/sqlite3/v2 v2.1.1 h1:drmm7ghsnZINzmdpN12l3IUHd3xRu964hu1+47uekbw=
github.com/gofiber/storage/sqlite3/v2 v2.1.1/go.mod h1:1Rx3S+pGR6NUDz6TLn1hrtTEUllD9AcZNrU3rxm+pkc=
github.com/gofiber/utils/v2 v2.0.0-beta.6 h1:ED62bOmpRXdgviPlfTmf0Q+AXzhaTUAFtdWjgx+XkYI=
github.com/gofiber/utils/v2 v2.0.0-beta.6/go.mod h1:3Kz8Px3jInKFvqxDzDeoSygwEOO+3uyubTmUa6PqY+0=
github.com/google/go-cmp v0.5.9 h1:O2Tfq5qg4qc4AmwVlvv0oLiVAGB7enBSJ2x2DqQFi38=
github.com/google/go-cmp v0.5.9/go.mod h1:17dUlkBOakJ0+DkrSSNjCkIjxS6bF9zb3elmeNGIjoY=
github.com/google/uuid v1.6.0 h1:NIvaJDMOsjHA8n1jAhLSgzrAzy1Hgr+hNrb57e+94F0=
Expand Down
46 changes: 22 additions & 24 deletions internal/config/app.go
Original file line number Diff line number Diff line change
@@ -1,13 +1,11 @@
package config

import (
"github.com/aikuci/go-subdivisions-id/internal/delivery/http"
"github.com/aikuci/go-subdivisions-id/internal/delivery/http/handler"
"github.com/aikuci/go-subdivisions-id/internal/delivery/http/route"
"github.com/aikuci/go-subdivisions-id/internal/entity"
"github.com/aikuci/go-subdivisions-id/internal/model/mapper"
"github.com/aikuci/go-subdivisions-id/internal/repository"
"github.com/aikuci/go-subdivisions-id/internal/usecase"
apphttp "github.com/aikuci/go-subdivisions-id/pkg/delivery/http"
apprepository "github.com/aikuci/go-subdivisions-id/pkg/repository"
appusecase "github.com/aikuci/go-subdivisions-id/pkg/usecase"

Expand All @@ -27,31 +25,31 @@ type BootstrapConfig struct {
}

func Bootstrap(config *BootstrapConfig) {
// setup repositories
provinceRepository := apprepository.NewCrudRepository[entity.Province, int, []int]()
cityRepository := repository.NewCityRepository[int, []int]()
districtRepository := repository.NewDistrictRepository[int, []int]()
villageRepository := repository.NewVillageRepository[int, []int]()
// Repositories
provinceRepository := apprepository.NewCrud[entity.Province, int, []int]()
cityRepository := repository.NewCity[int, []int]()
districtRepository := repository.NewDistrict[int, []int]()
villageRepository := repository.NewVillage[int, []int]()

// setup use cases
provinceUseCase := appusecase.NewCrudUseCase(config.Log, config.DB, provinceRepository)
cityUseCase := usecase.NewCityUseCase(config.Log, config.DB, cityRepository)
districtUseCase := usecase.NewDistrictUseCase(config.Log, config.DB, districtRepository)
villageUseCase := usecase.NewVillageUseCase(config.Log, config.DB, villageRepository)
// UseCases
provinceUseCase := appusecase.NewCrud(config.Log, config.DB, provinceRepository)
cityUseCase := usecase.NewCity(config.Log, config.DB, cityRepository)
districtUseCase := usecase.NewDistrict(config.Log, config.DB, districtRepository)
villageUseCase := usecase.NewVillage(config.Log, config.DB, villageRepository)

// setup controllers
provinceController := apphttp.NewCrudController(config.Log, provinceUseCase, mapper.NewProvinceMapper())
cityController := http.NewCityController(config.Log, cityUseCase, mapper.NewCityMapper())
districtController := http.NewDistrictController(config.Log, districtUseCase, mapper.NewDistrictMapper())
villageController := http.NewVillageController(config.Log, villageUseCase, mapper.NewVillageMapper())
// Handlers
provinceHandler := handler.NewProvince(provinceUseCase)
cityHandler := handler.NewCity(cityUseCase)
districtHandler := handler.NewDistrict(districtUseCase)
villageHandler := handler.NewVillage(villageUseCase)

routeConfig := route.RouteConfig{
App: config.App,
DB: config.DB,
ProvinceController: provinceController,
CityController: cityController,
DistrictController: districtController,
VillageController: villageController,
App: config.App,
DB: config.DB,
ProvinceHandler: provinceHandler,
CityHandler: cityHandler,
DistrictHandler: districtHandler,
VillageHandler: villageHandler,
}
routeConfig.Setup()
}
27 changes: 15 additions & 12 deletions internal/config/fiber.go
Original file line number Diff line number Diff line change
Expand Up @@ -8,27 +8,28 @@ import (
"time"

apperror "github.com/aikuci/go-subdivisions-id/pkg/util/error"
applog "github.com/aikuci/go-subdivisions-id/pkg/util/log"

"github.com/gofiber/fiber/v2"
"github.com/gofiber/fiber/v2/middleware/cache"
"github.com/gofiber/fiber/v2/middleware/limiter"
"github.com/gofiber/fiber/v2/middleware/logger"
"github.com/gofiber/fiber/v2/middleware/recover"
"github.com/gofiber/fiber/v2/middleware/requestid"
"github.com/gofiber/fiber/v2/utils"
"github.com/gofiber/storage/sqlite3/v2"
"github.com/gofiber/utils/v2"
"github.com/spf13/viper"
)

type AppOptions struct {
LogWriter io.Writer
}

func NewFiber(config *viper.Viper, options *AppOptions) *fiber.App {
func NewFiber(viper *viper.Viper, options *AppOptions) *fiber.App {
var app = fiber.New(fiber.Config{
AppName: config.GetString("app.name"),
ErrorHandler: NewErrorHandler(),
Prefork: config.GetBool("web.prefork"),
AppName: viper.GetString("app.name"),
ErrorHandler: NewErrorHandler(viper),
Prefork: viper.GetBool("web.prefork"),
EnableSplittingOnParsers: true,
})

Expand All @@ -42,7 +43,7 @@ func NewFiber(config *viper.Viper, options *AppOptions) *fiber.App {
return utils.CopyString(c.Path()) + utils.CopyString(string(c.Request().URI().QueryString()))
},
}))
app.Use(newLimiterConfig(config))
app.Use(newLimiterConfig(viper))
app.Use(recover.New(recover.Config{
StackTraceHandler: func(c *fiber.Ctx, e interface{}) {
fmt.Println(c.Request().URI())
Expand All @@ -55,24 +56,26 @@ func NewFiber(config *viper.Viper, options *AppOptions) *fiber.App {
return app
}

func NewErrorHandler() fiber.ErrorHandler {
func NewErrorHandler(viper *viper.Viper) fiber.ErrorHandler {
return func(ctx *fiber.Ctx, err error) error {
code := fiber.StatusInternalServerError

if e, ok := err.(*fiber.Error); ok {
switch e := err.(type) {
case *fiber.Error:
code = e.Code
}
if e, ok := err.(*apperror.CustomErrorResponse); ok {
case *apperror.CustomErrorResponse:
code = e.HTTPCode
}

applog.Write(NewZapLog(viper), ctx.UserContext(), "[fiber]: ", err)

return ctx.Status(code).JSON(fiber.Map{
"errors": err.Error(),
})
}
}

func newLimiterConfig(config *viper.Viper) fiber.Handler {
func newLimiterConfig(viper *viper.Viper) fiber.Handler {
storage := sqlite3.New(sqlite3.Config{
Database: "./storage/log/fiber-limiter.sqlite3",
Table: "fiber_storage",
Expand All @@ -84,7 +87,7 @@ func newLimiterConfig(config *viper.Viper) fiber.Handler {
})

limiterConfig := func() limiter.Config {
if config.GetString("app.mode") == "production" {
if viper.GetString("app.mode") == "production" {
return newProductionLimiterConfig(storage)
}

Expand Down
30 changes: 14 additions & 16 deletions internal/config/gorm.go
Original file line number Diff line number Diff line change
@@ -1,26 +1,26 @@
package config

import (
"fmt"
"log"
"os"
"time"

"github.com/spf13/viper"
"go.uber.org/zap"
"gorm.io/driver/postgres"
"gorm.io/driver/sqlite"
"gorm.io/gorm"
"gorm.io/gorm/logger"
)

func NewDatabase(viper *viper.Viper, zapLog *zap.Logger) *gorm.DB {
func NewDatabase(viper *viper.Viper) *gorm.DB {
var (
db *gorm.DB
err error
)

gormConfig := &gorm.Config{
Logger: logger.New(&zapLogWriter{Logger: zapLog}, logger.Config{
SlowThreshold: time.Second * 5,
Logger: logger.New(log.New(os.Stdout, "\r\n", log.LstdFlags), logger.Config{
SlowThreshold: 5 * time.Second,
Colorful: false,
IgnoreRecordNotFoundError: true,
ParameterizedQueries: true,
Expand All @@ -36,35 +36,33 @@ func NewDatabase(viper *viper.Viper, zapLog *zap.Logger) *gorm.DB {
dbDsn = "postgresql://postgres:postgres@localhost:5432"
}
db, err = gorm.Open(postgres.Open(dbDsn), gormConfig)
default:
case "sqlite":
if dbDsn == "" {
dbDsn = "db/gorm.db"
}
db, err = gorm.Open(sqlite.Open(dbDsn), gormConfig)
default:
log.Fatalf("unsupported database dialect: %s", dbDialect)
}

if err != nil {
zapLog.Fatal("failed to connect database:", zap.Error(err))
log.Fatalf("failed to initialize database: %v", err)
}

connection, err := db.DB()
if err != nil {
zapLog.Fatal("failed to connect database:", zap.Error(err))
log.Fatalf("failed to get database connection: %v", err)
}

idleConnection := viper.GetInt("database.pool.idle")
maxConnection := viper.GetInt("database.pool.max")
maxLifeTimeConnection := viper.GetInt("database.pool.lifetime")
if maxLifeTimeConnection <= 0 {
maxLifeTimeConnection = 3600 // default to 1 hour if not configured
}
connection.SetMaxIdleConns(idleConnection)
connection.SetMaxOpenConns(maxConnection)
connection.SetConnMaxLifetime(time.Second * time.Duration(maxLifeTimeConnection))

return db
}

type zapLogWriter struct {
Logger *zap.Logger
}

func (l *zapLogWriter) Printf(message string, args ...interface{}) {
l.Logger.Debug(fmt.Sprintf(fmt.Sprintf("%v", message[3:]), args[1:]...))
}
4 changes: 2 additions & 2 deletions internal/config/log.go
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,9 @@ import (
"go.uber.org/zap/zapcore"
)

func NewZapLog(config *viper.Viper) *zap.Logger {
func NewZapLog(viper *viper.Viper) *zap.Logger {
logger, err := func() (*zap.Logger, error) {
if config.GetString("app.mode") == "production" {
if viper.GetString("app.mode") == "production" {
return NewProductionLogger()
}
return NewDevelopmentLogger()
Expand Down
53 changes: 0 additions & 53 deletions internal/delivery/http/city_controller.go

This file was deleted.

53 changes: 0 additions & 53 deletions internal/delivery/http/district_controller.go

This file was deleted.

Loading

0 comments on commit 4bdbac4

Please sign in to comment.