package main import ( "context" "fmt" "log" "net/http" "forgejo.merr.is/annika/isl-api/Controllers" routes "forgejo.merr.is/annika/isl-api/Routes" "forgejo.merr.is/annika/isl-api/Services" "forgejo.merr.is/annika/isl-api/sql/powerItem" "github.com/go-chi/chi/v5" "github.com/go-chi/cors" "github.com/jackc/pgx/v4/pgxpool" "github.com/spf13/viper" ) var conf *EnvConfigs func init() { setupConfig() } func main() { deps := dependencies{} deps.initializeDependencies() fmt.Printf("Preparing to listen on `:%v`\n", conf.HttpPort) err := http.ListenAndServe(fmt.Sprintf(":%v", conf.HttpPort), deps.router) log.Fatal(err) } func setupConfig() { viper.AddConfigPath(".") viper.SetConfigName(".env") viper.SetConfigType("env") viper.SetEnvPrefix("isl_api") viper.AutomaticEnv() if err := viper.ReadInConfig(); err != nil { fmt.Printf("Error reading env file: %v\n", err) } if err := viper.Unmarshal(&conf); err != nil { log.Fatal(err) } } type dependencies struct { router *chi.Mux postgresConnection *pgxpool.Pool context context.Context powerItemQuerier *powerItem.DBQuerier powerItemService *Services.PowerItemService powerItemController *Controllers.PowerItemController } func (d *dependencies) initializeDependencies() error { var err error d.router = chi.NewRouter() d.router.Use(cors.Handler(cors.Options{ AllowedOrigins: []string{"*"}, AllowedMethods: []string{"GET", "POST", "PUT", "DELETE", "OPTIONS"}, AllowedHeaders: []string{"Cache-Control", "Expires", "Pragma"}, })) d.context = context.Background() d.postgresConnection, err = pgxpool.Connect(d.context, conf.ConnectionString) if err != nil { return err } d.powerItemQuerier = powerItem.NewQuerier(d.postgresConnection) d.powerItemService = Services.NewPowerItemService(d.powerItemQuerier) d.powerItemController = Controllers.NewPowerItemController(d.powerItemService) d.router.Mount("/powerItems", routes.SetupPowerItemRoutes(*d.powerItemController)) return nil }