main.go 1.66 KB
package main

import (
	"log"
	"os"

	"github.com/gofiber/fiber/v3"
	"github.com/gofiber/fiber/v3/middleware/healthcheck"
	"github.com/gofiber/fiber/v3/middleware/logger"
	"github.com/joho/godotenv"
	"gorm.io/driver/postgres"
	"gorm.io/gorm"
	"ui.ac.id/dtd/go-webserver-boilerplate/internal/handler"
	"ui.ac.id/dtd/go-webserver-boilerplate/internal/repository/postgresql"
	"ui.ac.id/dtd/go-webserver-boilerplate/internal/service"
)

type Config struct {
	DatabaseUrl    string
	AppEnvironment string
	Port           string
}

func initConfig() Config {
	environment := os.Getenv("APP_ENVIRONMENT")

	if environment == "" {
		environment = "production"
	}

	if environment == "development" {
		err := godotenv.Load()

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

	port := os.Getenv("PORT")

	if port == "" {
		port = "8000"
	}

	log.Printf("Environment: %s", environment)

	return Config{
		DatabaseUrl:    os.Getenv("DATABASE_URL"),
		AppEnvironment: environment,
		Port:           port,
	}
}

func main() {
	config := initConfig()
	db, err := gorm.Open(postgres.Open(config.DatabaseUrl), &gorm.Config{})

	if err != nil {
		log.Fatal(err)
		os.Exit(1)
	}

	userRepository := postgresql.NewPostgresUserRepository(db)
	userService := service.NewUserService(userRepository)
	userHandler := handler.NewUserHandler(userService)

	app := fiber.New(fiber.Config{
		ErrorHandler: handler.ErrorHandler,
	})

	app.Use(logger.New())
	app.Get("/", healthcheck.NewHealthChecker())

	//api group
	api := app.Group("/api")

	//v1 api
	v1 := api.Group("/v1")

	//user group
	user := v1.Group("/user")
	user.Get("/:id", userHandler.GetUserDetail)
	user.Get("/", userHandler.GetUserList)

	app.Listen(":" + config.Port)
}