This commit is contained in:
2024-07-19 17:04:42 +02:00
commit 5e0d0ec69f
71 changed files with 3316 additions and 0 deletions

View File

@@ -0,0 +1,106 @@
package cmd
import (
"fmt"
"mangezmieux-backend/configuration"
"mangezmieux-backend/internal/logger"
"os"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
const (
// Log.
parameterLogLevel = "loglevel"
parameterLogFormat = "logformat"
defaultLogLevel = "debug"
defaultLogFormat = "text"
// Mock.
parameterMock = "mock"
defaultMock = true
// Router.
parameterPort = "port"
defaultPort = "8080"
// DATABASE.
parameterPostgresDBName = "postgresdbname"
defaultPostgresDBName = "mangezmieux"
parameterPostgresDBSchema = "postgresdbschema"
defaultPostgresDBSchema = "mangezmieux"
parameterPostgresHost = "postgreshost"
defaultPostgresHost = "localhost"
parameterPostgresUser = "postgresuser"
defaultPostgresUser = "postgres"
parameterPostgresPwd = "postgrespwd"
defaultPostgresPwd = "mysecretpassword"
)
var (
config = &configuration.Config{}
cfgFile string
// GITHASH : Stores the git revision to be displayed.
GITHASH string
// VERSION : Stores the binary version to be displayed.
VERSION string
// rootCmd represents the base command when called without any subcommands.
rootCmd = &cobra.Command{
Use: "mangezmieux",
Short: "mangezmieux",
Version: fmt.Sprintf("%s (%s)", VERSION, GITHASH),
}
)
// Execute adds all child commands to the root command and sets flags appropriately.
// This is called by main.main(). It only needs to happen once to the rootCmd.
func Execute() {
if err := rootCmd.Execute(); err != nil {
logger.GetLogger().Error(err)
os.Exit(1)
}
}
func init() {
rootCmd.AddCommand(serveCmd)
// Here you will define your flags and configuration settings.
// Cobra supports persistent flags, which, if defined here,
// will be global for your application.
rootCmd.PersistentFlags().StringVar(&cfgFile, "config", "", "config file (default is $HOME/.mangezmieux.yaml)")
}
// initConfig reads in config file and ENV variables if set.
func initConfig() {
if cfgFile != "" {
// Use config file from the flag.
viper.SetConfigFile(cfgFile)
}
viper.AutomaticEnv() // read in environment variables that match
// If a config file is found, read it in.
if err := viper.ReadInConfig(); err == nil {
logger.GetLogger().Info("Using config file:", viper.ConfigFileUsed())
}
config.Mock = viper.GetBool(parameterMock)
config.Port = viper.GetString(parameterPort)
config.LogLevel = viper.GetString(parameterLogLevel)
config.LogFormat = viper.GetString(parameterLogFormat)
config.PostgresDBName = viper.GetString(parameterPostgresDBName)
config.PostgresDBSchema = viper.GetString(parameterPostgresDBSchema)
config.PostgresHost = viper.GetString(parameterPostgresHost)
config.PostgresUser = viper.GetString(parameterPostgresUser)
config.PostgresPwd = viper.GetString(parameterPostgresPwd)
config.Version = VERSION
}

View File

@@ -0,0 +1,91 @@
package cmd
import (
"fmt"
"mangezmieux-backend/internal/acl"
aclKey "mangezmieux-backend/internal/acl/key"
"mangezmieux-backend/internal/acl/service"
"mangezmieux-backend/internal/ginserver"
"mangezmieux-backend/internal/health"
"mangezmieux-backend/internal/injector"
"mangezmieux-backend/internal/jwt"
"mangezmieux-backend/internal/logger"
"mangezmieux-backend/internal/postgres"
"mangezmieux-backend/internal/users"
service2 "mangezmieux-backend/internal/users/service"
coreValidator "mangezmieux-backend/internal/validator"
"github.com/sirupsen/logrus"
"github.com/spf13/cobra"
"github.com/spf13/viper"
)
// serveCmd represents the serve command.
var serveCmd = &cobra.Command{
Use: "serve",
Short: "Serve endpoints",
PreRun: initServeBindingsFlags,
Run: func(cmd *cobra.Command, args []string) {
serve()
},
}
func serve() {
initConfig()
logger.InitLogger(config.LogLevel, config.LogFormat)
logrus.
WithField(parameterLogLevel, config.LogLevel).
WithField(parameterLogFormat, config.LogFormat).
WithField(parameterPort, config.Port).
WithField(parameterPostgresHost, config.PostgresHost).
Warn("Configuration")
inj := &injector.Injector{}
authMiddleware := users.AuthMiddleware // <= its not configured yet
jwt.Setup(inj)
jwtService := injector.Get[*jwt.Service](inj, jwt.JWTKey)
inj.Set("AuthenticationMiddleware", authMiddleware.GinMiddleware(jwtService))
ginserver.Setup(inj)
coreValidator.Setup(inj)
psqlInfo := fmt.Sprintf("host=localhost port=5432 user=%s "+
"password=mysecretpassword dbname=%s sslmode=disable",
config.PostgresUser, config.PostgresDBName)
postgres.Setup(inj, psqlInfo)
health.Setup(inj)
acl.SetupDao(inj)
users.Setup(inj)
acl.Setup(inj)
authMiddleware.Service = injector.Get[*service2.Service](inj, users.ServiceKey)
authMiddleware.RoleService = injector.Get[service.Service](inj, aclKey.ServiceKey)
ginserver.Start(inj, config.Port)
}
func init() {
serveCmd.Flags().String(parameterLogLevel, defaultLogLevel, "Use this flag to set the logging level")
serveCmd.Flags().String(parameterLogFormat, defaultLogFormat, "Use this flag to set the logging format")
serveCmd.Flags().Bool(parameterMock, defaultMock, "Use this flag to mock external services")
serveCmd.Flags().String(parameterPort, defaultPort, "Use this flag to set the listening port of the api")
serveCmd.Flags().String(parameterPostgresDBName, defaultPostgresDBName, "Use this flag to set database name")
serveCmd.Flags().String(parameterPostgresDBSchema, defaultPostgresDBSchema, "Use this flag to set database schema name")
serveCmd.Flags().String(parameterPostgresHost, defaultPostgresHost, "Use this flag to set database host")
serveCmd.Flags().String(parameterPostgresUser, defaultPostgresUser, "Use this flag to set database user name")
serveCmd.Flags().String(parameterPostgresPwd, defaultPostgresPwd, "Use this flag to set database user password")
}
func initServeBindingsFlags(cmd *cobra.Command, args []string) {
_ = viper.BindPFlag(parameterLogLevel, cmd.Flags().Lookup(parameterLogLevel))
_ = viper.BindPFlag(parameterLogFormat, cmd.Flags().Lookup(parameterLogFormat))
_ = viper.BindPFlag(parameterMock, cmd.Flags().Lookup(parameterMock))
_ = viper.BindPFlag(parameterPort, cmd.Flags().Lookup(parameterPort))
_ = viper.BindPFlag(parameterPostgresDBName, cmd.Flags().Lookup(parameterPostgresDBName))
_ = viper.BindPFlag(parameterPostgresDBSchema, cmd.Flags().Lookup(parameterPostgresDBSchema))
_ = viper.BindPFlag(parameterPostgresHost, cmd.Flags().Lookup(parameterPostgresHost))
_ = viper.BindPFlag(parameterPostgresUser, cmd.Flags().Lookup(parameterPostgresUser))
_ = viper.BindPFlag(parameterPostgresPwd, cmd.Flags().Lookup(parameterPostgresPwd))
}