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  }