github.com/joao-fontenele/go-url-shortener@v1.3.4/pkg/api/api.go (about)

     1  package api
     2  
     3  import (
     4  	"log"
     5  
     6  	"github.com/fasthttp/router"
     7  	myRouter "github.com/joao-fontenele/go-url-shortener/pkg/api/router"
     8  	"github.com/joao-fontenele/go-url-shortener/pkg/configger"
     9  	"github.com/joao-fontenele/go-url-shortener/pkg/logger"
    10  	"github.com/joao-fontenele/go-url-shortener/pkg/metrics"
    11  	"github.com/joao-fontenele/go-url-shortener/pkg/postgres"
    12  	"github.com/joao-fontenele/go-url-shortener/pkg/redis"
    13  	"github.com/joao-fontenele/go-url-shortener/pkg/shortener"
    14  	"go.uber.org/zap"
    15  )
    16  
    17  func loadConfs() {
    18  	err := configger.Load()
    19  	if err != nil {
    20  		log.Fatalf("Failed to load configs: %v", err)
    21  	}
    22  }
    23  
    24  func connectDB(logger *zap.Logger) {
    25  	_, err := postgres.Connect()
    26  	if err != nil {
    27  		logger.Fatal("Failed to connect to database", zap.Error(err))
    28  	}
    29  }
    30  
    31  func connectCache(logger *zap.Logger) {
    32  	_, err := redis.Connect()
    33  	if err != nil {
    34  		logger.Fatal("Failed to connect to redis", zap.Error(err))
    35  	}
    36  }
    37  
    38  func newLinkService() shortener.LinkService {
    39  	dbConn := postgres.GetConnection()
    40  	dbDao := postgres.NewLinkDao(dbConn)
    41  	dbWithMetricsDao := metrics.NewLinkDao(dbDao, "db")
    42  
    43  	cacheConn := redis.GetConnection()
    44  	cacheDao := redis.NewLinkDao(cacheConn)
    45  	cacheWithMetricsDao := metrics.NewLinkDao(cacheDao, "cache")
    46  
    47  	linkRepo := shortener.NewLinkRepository(dbWithMetricsDao, cacheWithMetricsDao)
    48  
    49  	return shortener.NewLinkService(linkRepo)
    50  }
    51  
    52  func initMetrics() {
    53  	metrics.Init()
    54  }
    55  
    56  // New loads configs, sets up connection, and api routes
    57  func New() *router.Router {
    58  	loadConfs()
    59  
    60  	logger := logger.Get()
    61  
    62  	connectDB(logger)
    63  	connectCache(logger)
    64  
    65  	initMetrics()
    66  
    67  	ls := newLinkService()
    68  	r := myRouter.New(ls)
    69  
    70  	return r
    71  }