package main import ( "context" "log" "net/http" "os" "gitea.michaelthomson.dev/mthomson/habits/internal/logging" "gitea.michaelthomson.dev/mthomson/habits/internal/middleware" "gitea.michaelthomson.dev/mthomson/habits/internal/migrate" todohandler "gitea.michaelthomson.dev/mthomson/habits/internal/todo/handler" todorepository "gitea.michaelthomson.dev/mthomson/habits/internal/todo/repository" todoservice "gitea.michaelthomson.dev/mthomson/habits/internal/todo/service" "github.com/jackc/pgx/v5" "github.com/jackc/pgx/v5/pgxpool" pgxuuid "github.com/jackc/pgx-gofrs-uuid" ) func main() { // create logger logger := logging.NewLogger() // create middlewares contextMiddleware := middleware.ContextMiddleware(logger) loggingMiddleware := middleware.LoggingMiddleware(logger) stack := []middleware.Middleware{ contextMiddleware, loggingMiddleware, } // create db pool postgresUrl := "postgres://todo:password@localhost:5432/todo" dbconfig, err := pgxpool.ParseConfig(postgresUrl) if err != nil { logger.Error(err.Error()) os.Exit(1) } dbconfig.AfterConnect = func(ctx context.Context, conn *pgx.Conn) error { pgxuuid.Register(conn.TypeMap()) return nil } db, err := pgxpool.NewWithConfig(context.Background(), dbconfig) if err != nil { logger.Error(err.Error()) os.Exit(1) } // run migrations migrate.Migrate(logger, db) // create repos todoRepository := todorepository.NewTodoRepository(logger, db) // create services todoService := todoservice.NewTodoService(logger, todoRepository) // create mux mux := http.NewServeMux() // register handlers mux.Handle("GET /todo/{id}", middleware.CompileMiddleware(todohandler.HandleTodoGet(logger, todoService), stack)) mux.Handle("POST /todo", middleware.CompileMiddleware(todohandler.HandleTodoCreate(logger, todoService), stack)) mux.Handle("DELETE /todo/{id}", middleware.CompileMiddleware(todohandler.HandleTodoDelete(logger, todoService), stack)) mux.Handle("PUT /todo/{id}", middleware.CompileMiddleware(todohandler.HandleTodoUpdate(logger, todoService), stack)) // create server server := &http.Server{ Addr: ":8080", Handler: mux, } err = server.ListenAndServe() if err != nil { log.Fatalf("Failed to start server: %v", err) } }