package main import ( "flag" "fmt" "github.com/go-openapi/loads" "src.dualinventive.com/go/authentication-service/config" "src.dualinventive.com/go/authentication-service/internal/authtokens" "src.dualinventive.com/go/authentication-service/internal/pwreset" "src.dualinventive.com/go/authentication-service/internal/storage/gorm" "src.dualinventive.com/go/authentication-service/internal/storage/redis" apiServer "src.dualinventive.com/go/authentication-service/rest/server" "src.dualinventive.com/go/authentication-service/rest/server/operations" diConfig "src.dualinventive.com/go/lib/config" "src.dualinventive.com/go/lib/dilog" ) var ( // ApplicationName is the name of the application ApplicationName = "authentication-service-rest" //nolint: gochecknoglobals // ApplicationVersion is the version of the application ApplicationVersion = "0.0.0-dev" //nolint: gochecknoglobals c = config.New() //nolint: gochecknoglobals ) func main() { var confFile string flag.StringVar(&confFile, "config", ApplicationName, "Configuration-file name") flag.Parse() logger, err := diConfig.Load(confFile, &c) if err != nil { fmt.Println("logger initialization failed") return } logger.WithFields(dilog.Fields{ "app-name": ApplicationName, "app-version": ApplicationVersion, }).Info("starting") credentialsRepo, err := gorm.NewDatabaseCredentialsRepository( c.DatabaseConfig.Host, c.DatabaseConfig.Port, c.DatabaseConfig.Name, c.DatabaseConfig.User, c.DatabaseConfig.Password, ) if err != nil { logger.WithError(err).Fatal("error creating CredentialsRepository") } tokenRepo, err := redis.NewTokenRepository( c.RedisConfig.Host, c.RedisConfig.Port, c.JWTConfig.PrivateKey, c.JWTConfig.PublicKey, logger, ) if err != nil { logger.WithError(err).Fatal("error creating TokenRepository") } resetCodeRepo, err := redis.NewResetCodeRepository( c.RedisConfig.Host, c.RedisConfig.Port, ) if err != nil { logger.WithError(err).Fatal("error creating ResetCodeRepository") } templateRepo := pwreset.NewFSTemplateRepository(c.TemplateConfig.TemplateFilePath) emailSender := pwreset.NewEmailSender( c.EmailConfig.Host, c.EmailConfig.Port, c.EmailConfig.Username, c.EmailConfig.Password, c.EmailConfig.SenderAddr, ) tokenservice := authtokens.NewService( logger, credentialsRepo, tokenRepo, resetCodeRepo, templateRepo, emailSender, ) server, err := initRESTAPI( c.RestConfig.Port, tokenservice, ) if err != nil { logger.Fatal(err) } defer server.Shutdown() //nolint:errcheck if err := server.Serve(); err != nil { logger.Fatal(err) } } func initRESTAPI( port int, tokenService *authtokens.Service, ) (*apiServer.Server, error) { swaggerSpec, err := loads.Analyzed(apiServer.SwaggerJSON, "") if err != nil { return nil, err } api := operations.NewAuthenticationAPI(swaggerSpec) server := apiServer.NewServer(api) initHandlers(api, tokenService) server.ConfigureAPI() server.Port = port server.EnabledListeners = []string{"http"} // overwrite setting in swagger file return server, nil }