A community based topic aggregation platform built on atproto
1package main 2 3import ( 4 "database/sql" 5 "fmt" 6 "log" 7 "net/http" 8 "os" 9 10 "github.com/go-chi/chi/v5" 11 "github.com/go-chi/chi/v5/middleware" 12 _ "github.com/lib/pq" 13 "github.com/pressly/goose/v3" 14 15 "Coves/internal/api/routes" 16 "Coves/internal/core/users" 17 postgresRepo "Coves/internal/db/postgres" 18) 19 20func main() { 21 dbURL := os.Getenv("DATABASE_URL") 22 if dbURL == "" { 23 dbURL = "postgres://postgres:password@localhost:5432/coves?sslmode=disable" 24 } 25 26 db, err := sql.Open("postgres", dbURL) 27 if err != nil { 28 log.Fatal("Failed to connect to database:", err) 29 } 30 defer db.Close() 31 32 if err := db.Ping(); err != nil { 33 log.Fatal("Failed to ping database:", err) 34 } 35 36 if err := goose.SetDialect("postgres"); err != nil { 37 log.Fatal("Failed to set goose dialect:", err) 38 } 39 40 if err := goose.Up(db, "internal/db/migrations"); err != nil { 41 log.Fatal("Failed to run migrations:", err) 42 } 43 44 r := chi.NewRouter() 45 46 r.Use(middleware.Logger) 47 r.Use(middleware.Recoverer) 48 r.Use(middleware.RequestID) 49 50 // Initialize repositories 51 userRepo := postgresRepo.NewUserRepository(db) 52 userService := users.NewUserService(userRepo) 53 54 // Mount routes 55 r.Mount("/api/users", routes.UserRoutes(userService)) 56 57 r.Get("/health", func(w http.ResponseWriter, r *http.Request) { 58 w.WriteHeader(http.StatusOK) 59 w.Write([]byte("OK")) 60 }) 61 62 port := os.Getenv("PORT") 63 if port == "" { 64 port = "8080" 65 } 66 67 fmt.Printf("Server starting on port %s\n", port) 68 log.Fatal(http.ListenAndServe(":"+port, r)) 69}