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}