package main import ( "context" "fmt" "log" "logger/data" "net/http" "time" "go.mongodb.org/mongo-driver/bson" "go.mongodb.org/mongo-driver/mongo" "go.mongodb.org/mongo-driver/mongo/options" ) const ( webPort = "80" rpcPort = "5001" mongoURL = "mongodb://mongo:27017" gRpcPort = "50001" ) var client *mongo.Client type Config struct { Models data.Models } func main() { // connect to mongo mongoClient, err := connectToMongo() if err != nil { log.Panic(err) } // create a context in order to disconnect ctx, cancel := context.WithTimeout(context.Background(), 15*time.Second) defer cancel() // close connection defer func() { if err = mongoClient.Disconnect(ctx); err != nil { panic(err) } }() client = mongoClient app := Config{ Models: data.New(client), } // start web server log.Println("Starting service on port", webPort) app.serve() } func (app *Config) serve() { srv := &http.Server{ Addr: fmt.Sprintf(":%s", webPort), Handler: app.routes(), } err := srv.ListenAndServe() if err != nil { log.Panic(err) } } func connectToMongo() (*mongo.Client, error) { clientOptions := options.Client().ApplyURI(mongoURL) clientOptions.SetAuth(options.Credential{ Username: "admin", Password: "password", }) client, err := mongo.Connect(context.TODO(), clientOptions) if err != nil { log.Println("Error connecting:", err) return nil, err } var result bson.M if err = client.Database("admin").RunCommand(context.TODO(), bson.D{{Key: "ping", Value: 1}}).Decode(&result); err != nil { log.Println("Error ping:", err) return nil, err } log.Println("Connected to Mongo") return client, nil }