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 "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 userRepo := postgres.NewUserRepository(db)
51 userService := users.NewUserService(userRepo)
52
53 r.Mount("/api/users", routes.UserRoutes(userService))
54
55 r.Get("/health", func(w http.ResponseWriter, r *http.Request) {
56 w.WriteHeader(http.StatusOK)
57 w.Write([]byte("OK"))
58 })
59
60 port := os.Getenv("PORT")
61 if port == "" {
62 port = "8080"
63 }
64
65 fmt.Printf("Server starting on port %s\n", port)
66 log.Fatal(http.ListenAndServe(":"+port, r))
67}