package dependencies import ( "cybertron/configs" "cybertron/internal/client/aws" "cybertron/internal/client/document" "cybertron/internal/database" "cybertron/internal/transport/handler" "cybertron/pkg/db" httpclient "cybertron/pkg/httpClient" "cybertron/pkg/kafka/producer" "cybertron/pkg/log" "cybertron/service" "go.uber.org/zap" "gorm.io/gorm" ) type Dependencies struct { Service *Service DBClient *gorm.DB Logger *zap.Logger Handler *Handler Repositories *Repositories } type Service struct { DocumentService *document.HttpClient ProjectService *service.ProjectCreator S3Client *aws.Actions // Add your service here } type Handler struct { ProjectHandler *handler.ProjectHandler } type Repositories struct { ProjectRepository *gorm.DB } func InitDependencies() *Dependencies { dbClient := db.NewDBClient() repositories := initRepositories(dbClient) logger := log.Log httpClient := httpclient.NewHttpClient(*configs.GetHttpConfig()) s3Client := aws.NewS3client(*configs.GetAWSConfig()) kafkaProducer := initKafkaProducer() documentServiceClient := document.NewDocumentServiceHttpClient(httpClient, logger, configs.GetDocumentServiceHttpClientConfigs()) projectServiceClient := service.NewProjectCreator(logger, dbClient, s3Client, kafkaProducer) services := initServices(documentServiceClient, projectServiceClient) handlers := initHandlers(projectServiceClient) return &Dependencies{ Service: services, DBClient: dbClient, Logger: logger.GetLog(), Handler: handlers, Repositories: repositories, } } func initServices(documentService *document.HttpClient, projectService *service.ProjectCreator) *Service { return &Service{ DocumentService: documentService, ProjectService: projectService, } } func initRepositories(dbClient *gorm.DB) *Repositories { return &Repositories{ ProjectRepository: database.InitProjectRepository(dbClient), } } func initHandlers(projectService *service.ProjectCreator) *Handler { projectHandler := handler.NewProjectHandler(projectService) return &Handler{ ProjectHandler: projectHandler, } } func initKafkaProducer() producer.KProducer { kafkaProducer := producer.NewKProducer(configs.GetEnv(), configs.GetKafkaConfig()) return kafkaProducer }