github.com/sharovik/devbot@v1.0.1-0.20240308094637-4a0387c40516/internal/container/container.go (about) 1 package container 2 3 import ( 4 "crypto/tls" 5 "errors" 6 "net/http" 7 "time" 8 9 _time "github.com/sharovik/devbot/internal/service/time" 10 11 "github.com/sharovik/devbot/internal/dto/event" 12 13 "github.com/sharovik/devbot/internal/database" 14 15 "github.com/sharovik/devbot/internal/client" 16 "github.com/sharovik/devbot/internal/config" 17 "github.com/sharovik/devbot/internal/log" 18 ) 19 20 // Main container object 21 type Main struct { 22 Config config.Config 23 MessageClient client.MessageClientInterface 24 BibBucketClient client.GitClientInterface 25 Dictionary database.BaseDatabaseInterface 26 HTTPClient client.BaseHTTPClientInterface 27 MigrationService database.MigrationService 28 DefinedEvents map[string]event.DefinedEventInterface 29 } 30 31 // C container variable 32 var C Main 33 34 // Init initialise container 35 func Init() (Main, error) { 36 C = Main{} 37 cfg, err := config.Init() 38 if err != nil { 39 return Main{}, err 40 } 41 42 C.Config = cfg 43 44 err = log.Init(C.Config.LogConfig) 45 if err != nil { 46 return Main{}, err 47 } 48 49 bitBucketClient := client.BitBucketClient{} 50 51 bH := initHttpClient() 52 bH.BaseURL = client.DefaultBitBucketBaseAPIUrl 53 bH.ClientID = C.Config.BitBucketConfig.ClientID 54 bH.ClientSecret = C.Config.BitBucketConfig.ClientSecret 55 56 bitBucketClient.Init(&bH) 57 58 _time.InitNOW(C.Config.GetTimezone()) 59 60 C.BibBucketClient = &bitBucketClient 61 62 h := initHttpClient() 63 C.HTTPClient = &h 64 65 C.MessageClient = C.initMessageClient() 66 67 if err = C.loadDictionary(); err != nil { 68 panic(err) 69 } 70 71 C.MigrationService = database.MigrationService{ 72 Logger: *log.Logger(), 73 Dictionary: C.Dictionary, 74 } 75 76 return C, nil 77 } 78 79 // Terminate terminates the properly connections 80 func (c *Main) Terminate() { 81 if err := c.Dictionary.CloseDatabaseConnection(); err != nil { 82 panic(err) 83 } 84 } 85 86 func (c *Main) loadDictionary() error { 87 dictionary := new(database.Dictionary) 88 if err := dictionary.InitDatabaseConnection(c.Config.Database); err != nil { 89 return err 90 } 91 92 c.Dictionary = dictionary 93 94 return nil 95 } 96 97 func (c *Main) initMessageClient() client.MessageClientInterface { 98 switch c.Config.MessagesAPIConfig.Type { 99 case config.MessagesAPITypeSlack: 100 h := initHttpClient() 101 102 h.SetOauthToken(c.Config.MessagesAPIConfig.WebAPIOAuthToken) 103 h.SetBaseURL(c.Config.MessagesAPIConfig.BaseURL) 104 105 sc := client.SlackClient{} 106 sc.HTTPClient = &h 107 108 return sc 109 default: 110 panic(errors.New("unknown messages API type")) 111 } 112 } 113 114 func initHttpClient() client.HTTPClient { 115 netTransport := &http.Transport{ 116 TLSHandshakeTimeout: time.Duration(C.Config.HTTPClient.TLSHandshakeTimeout) * time.Second, 117 TLSClientConfig: &tls.Config{ 118 InsecureSkipVerify: C.Config.HTTPClient.InsecureSkipVerify, 119 }, 120 } 121 122 httpClient := http.Client{ 123 Timeout: time.Duration(C.Config.HTTPClient.RequestTimeout) * time.Second, 124 Transport: netTransport, 125 } 126 127 return client.HTTPClient{ 128 Client: &httpClient, 129 } 130 }