package main import ( "context" "embed" "fmt" "os" "os/signal" "strconv" "strings" "github.com/getsentry/sentry-go" "github.com/joho/godotenv" "gorm.io/driver/postgres" "gorm.io/gorm" "github.com/rjNemo/rentease/config" "github.com/rjNemo/rentease/internal/auth" "github.com/rjNemo/rentease/internal/booking" "github.com/rjNemo/rentease/internal/pdf" "github.com/rjNemo/rentease/internal/server" ) //go:embed assets var static embed.FS func main() { ctx := context.Background() godotenv.Load() if err := run(ctx, os.Getenv); err != nil { fmt.Fprintf(os.Stderr, "%s\n", err) os.Exit(1) } } func run(c context.Context, getEnv func(string) string) error { ctx, cancel := signal.NotifyContext(c, os.Interrupt) defer cancel() if err := sentry.Init(sentry.ClientOptions{ Dsn: getEnv("SENTRY_DSN"), EnableTracing: true, TracesSampleRate: 1.0, ProfilesSampleRate: 1.0, }); err != nil { return fmt.Errorf("error initializing sentry: %s", err) } db, err := gorm.Open(postgres.Open(getEnv("DATABASE_URL")), &gorm.Config{}) if err != nil { return fmt.Errorf("error connecting to the database %s", err) } err = db.AutoMigrate(&booking.Booking{}, &booking.BookingRequest{}, &booking.Item{}) if err != nil { return fmt.Errorf("error migrating the database %s", err) } ps, err := pdf.NewPdfService( getEnv("HTMLDOCS_PROJECT_ID"), getEnv("HTMLDOCS_REPORT_PROJECT_ID"), getEnv("HTMLDOCS_URL"), getEnv("HTMLDOCS_KEY"), ) if err != nil { return fmt.Errorf("error starting pdf service %s", err) } as, err := auth.NewService(getEnv("SESSION_SECRET"), getEnv("ADMIN"), getEnv("ADMIN_SECRET")) if err != nil { return fmt.Errorf("error starting auth service %s", err) } p := getEnv("PORT") port, err := strconv.Atoi(p) if err != nil { return fmt.Errorf("error parsing PORT env %s", err) } ogs := getEnv("ORIGINS") origins := strings.Split(ogs, ",") srv, err := server.New( booking.NewService(db), as, ps, config.NewHost(), server.WithPort(port), server.WithFileSystem(static), server.WithDebug(strings.ToLower(getEnv("DEBUG")) == "true"), server.WithSecretKey(getEnv("SECRET_KEY")), server.WithApiKey(getEnv("API_KEY")), server.WithOrigins(origins), ) if err != nil { return fmt.Errorf("error starting server %s", err) } srv.Start() return nil }