api-qobiltu-dev / main.go
lifedebugger's picture
Deploy files from GitHub repository
decc167
package main
import (
"log/slog"
"net"
"strconv"
"api.qobiltu.id/config"
academy_controller "api.qobiltu.id/controller/academy"
cv_controller "api.qobiltu.id/controller/cv"
email_controller "api.qobiltu.id/controller/email"
marriage_readiness_profile_controller "api.qobiltu.id/controller/marriage_readiness_profile"
options_controller "api.qobiltu.id/controller/options"
partner_criteria_controller "api.qobiltu.id/controller/partner_criteria"
quiz_controller "api.qobiltu.id/controller/quiz"
region_controller "api.qobiltu.id/controller/region"
"api.qobiltu.id/pkg/mail"
"api.qobiltu.id/pkg/storage"
"api.qobiltu.id/pkg/validation"
"api.qobiltu.id/pkg/worker"
"api.qobiltu.id/repositories"
"api.qobiltu.id/router"
"api.qobiltu.id/services"
"api.qobiltu.id/utils"
"github.com/hibiken/asynq"
)
func main() {
// load config
err := config.LoadConfig()
utils.FatalIfErr("failed to load config", err)
// setup validator for validation request
validator, err := validation.New(config.DB)
utils.FatalIfErr("failed to setup validator", err)
// setup storage for saving files
localStorage := storage.NewLocalStorage("uploads", config.GlobalConfig.App.AppURL+"/storage/")
// setup smtp for sending email
emailSender, err := mail.New(&mail.Config{
Host: config.GlobalConfig.SMTP.Host,
Port: config.GlobalConfig.SMTP.Port,
From: config.GlobalConfig.SMTP.SenderEmail,
Username: config.GlobalConfig.SMTP.SenderEmail,
Password: config.GlobalConfig.SMTP.Password,
})
utils.FatalIfErr("failed to setup email sender", err)
mail.EmailSender = emailSender
// setup task distributor and processor for async task
asynqRedisOpt := asynq.RedisClientOpt{
Addr: net.JoinHostPort(config.GlobalConfig.Redis.Host, strconv.Itoa(config.GlobalConfig.Redis.Port)),
Password: config.GlobalConfig.Redis.Password,
DB: config.GlobalConfig.Redis.DB,
}
taskDistributor := worker.NewRedisTaskDistributor(asynqRedisOpt)
taskProcessor := worker.NewRedisTaskProcessor(asynqRedisOpt, emailSender)
worker.AsyncTaskDistributor = taskDistributor
// setup repo, service, and controller
regionRepository := repositories.NewRegionRepository(config.DB)
regionService := services.NewRegionService(regionRepository)
regionController := region_controller.NewRegionController(regionService)
optionRepository := repositories.NewOptionRepository(config.DB)
optionService := services.NewOptionsService(optionRepository)
optionController := options_controller.NewOptionsController(optionService)
emailRepository := repositories.NewEmailRepository(config.DB)
emailService := services.NewEmailService(emailRepository, taskDistributor)
emailController := email_controller.NewEmailController(emailService)
academyRepository := repositories.NewAcademyRepository(config.DB)
academyService := services.NewAcademyService(academyRepository, validator)
academyController := academy_controller.NewAcademyController(academyService)
quizRepository := repositories.NewQuizRepository()
quizService := services.NewQuizService(config.DB, quizRepository, academyRepository, validator)
quizController := quiz_controller.NewQuizController(quizService)
cvRepository := repositories.NewCVRepository(config.DB)
cvService := services.NewCVService(cvRepository, localStorage, validator)
cvController := cv_controller.NewCVController(cvService)
marriageReadinessProfileRepository := repositories.NewMarriageReadinessProfileRepository(config.DB)
marriageReadinessProfileService := services.NewMarriageReadinessProfileService(marriageReadinessProfileRepository, validator)
marriageReadinessProfileController := marriage_readiness_profile_controller.NewMarriageReadinessProfileController(marriageReadinessProfileService)
partnerCriteriaRepository := repositories.NewPartnerCriteriaRepository(config.DB)
partnerCriteriaService := services.NewPartnerCriteriaService(partnerCriteriaRepository, validator)
partnerCriteriaController := partner_criteria_controller.NewPartnerCriteriaController(partnerCriteriaService)
// start task processor
err = taskProcessor.Start()
utils.FatalIfErr("failed to start task processor", err)
slog.Info("Task processor started")
// create server
s, err := router.NewServer(
regionController,
optionController,
emailController,
academyController,
quizController,
cvController,
marriageReadinessProfileController,
partnerCriteriaController,
)
utils.FatalIfErr("failed to create server", err)
// run server
slog.Info("Starting server", "address", config.GlobalConfig.App.HostAddress, "port", config.GlobalConfig.App.HostPort)
err = s.Start(config.GlobalConfig.App.TCPAddress)
utils.FatalIfErr("failed to start server", err)
}