File size: 4,714 Bytes
98c95a0
 
 
1301478
 
 
 
98c95a0
1f7dd45
1301478
cabfcc4
1301478
a020582
54de00c
57e875f
a020582
3ccc959
7beb700
 
 
48471f7
98c95a0
a3e77a9
98c95a0
 
 
 
 
 
5a84566
 
 
158bb31
5a84566
 
 
98c95a0
5a84566
 
 
 
 
 
 
 
 
 
 
98c95a0
 
 
5a84566
98c95a0
5a84566
 
 
98c95a0
 
 
 
 
 
48471f7
a020582
 
 
 
 
 
 
 
cabfcc4
 
 
 
1f7dd45
 
 
 
5a84566
 
57e875f
 
9adc91d
1cea019
9adc91d
 
1301478
1cea019
1301478
 
54de00c
1cea019
54de00c
 
48471f7
98c95a0
 
 
 
48471f7
9adc91d
a020582
 
cabfcc4
1f7dd45
57e875f
9adc91d
1301478
54de00c
9adc91d
48471f7
 
 
5a84566
 
48471f7
98c95a0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
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)
}