|  | 
|  | 1 | +package main | 
|  | 2 | + | 
|  | 3 | +import ( | 
|  | 4 | +	"context" | 
|  | 5 | +	"flag" | 
|  | 6 | +	"fmt" | 
|  | 7 | +	"log" | 
|  | 8 | +	"net/http" | 
|  | 9 | +	"os" | 
|  | 10 | +	"time" | 
|  | 11 | + | 
|  | 12 | +	"github.com/mikebellcoder/microservices-docker-go-mongodb/movies/pkg/models/mongodb" | 
|  | 13 | +	"go.mongodb.org/mongo-driver/mongo" | 
|  | 14 | +	"go.mongodb.org/mongo-driver/mongo/options" | 
|  | 15 | +) | 
|  | 16 | + | 
|  | 17 | +type application struct { | 
|  | 18 | +	erroLog *log.Logger | 
|  | 19 | +	infoLog *log.Logger | 
|  | 20 | +	movies  *mongodb.MovieModel | 
|  | 21 | +} | 
|  | 22 | + | 
|  | 23 | +func main() { | 
|  | 24 | + | 
|  | 25 | +	// Define command-line flags | 
|  | 26 | +	serverAddr := flag.String("serverAddr", "", "HTTP server network address") | 
|  | 27 | +	serverPort := flag.Int("serverPort", 4000, "HTTP server network port") | 
|  | 28 | +	mongoURI := flag.String("mongoURI", "mongodb://localhost:27017", "Database hostname url") | 
|  | 29 | +	mongoDatabase := flag.String("mongoDatabase", "movies", "Database name") | 
|  | 30 | +	enableCredentials := flag.Bool("enableCredentials", false, "Enable the use of for mongodb connection") | 
|  | 31 | +	flag.Parse() | 
|  | 32 | + | 
|  | 33 | +	// Create logger for writing information and error messages | 
|  | 34 | +	infoLog := log.New(os.Stdout, "INFO\t", log.Ldate|log.Ltime) | 
|  | 35 | +	errLog := log.New(os.Stderr, "ERROR\t", log.Ldate|log.Ltime|log.Lshortfile) | 
|  | 36 | + | 
|  | 37 | +	// Create mongo client config | 
|  | 38 | +	co := options.Client().ApplyURI(*mongoURI) | 
|  | 39 | +	if *enableCredentials { | 
|  | 40 | +		co.Auth = &options.Credential{ | 
|  | 41 | +			Username: os.Getenv("MONGODB_USERNAME"), | 
|  | 42 | +			Password: os.Getenv("MONGODB_PASSWORD"), | 
|  | 43 | +		} | 
|  | 44 | +	} | 
|  | 45 | + | 
|  | 46 | +	// Establish database connection | 
|  | 47 | +	ctx, cancel := context.WithTimeout(context.Background(), 20*time.Second) | 
|  | 48 | +	defer cancel() | 
|  | 49 | +	client, err := mongo.Connect(ctx, co) | 
|  | 50 | +	if err != nil { | 
|  | 51 | +		errLog.Fatal(err) | 
|  | 52 | +	} | 
|  | 53 | + | 
|  | 54 | +	defer func() { | 
|  | 55 | +		if err = client.Disconnect(ctx); err != nil { | 
|  | 56 | +			panic(err) | 
|  | 57 | +		} | 
|  | 58 | +	}() | 
|  | 59 | + | 
|  | 60 | +	infoLog.Printf("Database connection established\n") | 
|  | 61 | + | 
|  | 62 | +	// Initialize a new instance of a app containing the dependencies | 
|  | 63 | +	app := &application{ | 
|  | 64 | +		infoLog: infoLog, | 
|  | 65 | +		erroLog: errLog, | 
|  | 66 | +		movies: &mongodb.MovieModel{ | 
|  | 67 | +			C: client.Database(*mongoDatabase).Collection("movies"), | 
|  | 68 | +		}, | 
|  | 69 | +	} | 
|  | 70 | + | 
|  | 71 | +	// Initialize a new http.Server struct. | 
|  | 72 | +	serverURI := fmt.Sprintf("%s:%d", *serverAddr, *serverPort) | 
|  | 73 | +	srv := &http.Server{ | 
|  | 74 | +		Addr:         serverURI, | 
|  | 75 | +		ErrorLog:     errLog, | 
|  | 76 | +		Handler:      app.routes(), | 
|  | 77 | +		IdleTimeout:  time.Minute, | 
|  | 78 | +		ReadTimeout:  5 * time.Second, | 
|  | 79 | +		WriteTimeout: 10 * time.Second, | 
|  | 80 | +	} | 
|  | 81 | + | 
|  | 82 | +	infoLog.Printf("Starting server on %s\n", serverURI) | 
|  | 83 | +	err = srv.ListenAndServe() | 
|  | 84 | +	errLog.Fatal(err) | 
|  | 85 | +} | 
0 commit comments