package main import ( "context" "embed" "fmt" "log" "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/calendar" "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() // init sentry 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) } // init database db, err := gorm.Open(postgres.Open(getEnv("DATABASE_URL")), &gorm.Config{}) if err != nil { return fmt.Errorf("error connecting to the database %s", err) } // build booking service err = db.AutoMigrate(&booking.Booking{}, &booking.BookingRequest{}, &booking.Item{}) if err != nil { return fmt.Errorf("error migrating the database %s", err) } // build pdf service 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) } // build authentication service as, err := auth.NewService( getEnv("SESSION_SECRET"), getEnv("ADMIN"), getEnv("ADMIN_SECRET"), getEnv("API_KEY"), ) if err != nil { return fmt.Errorf("error starting auth service %s", err) } // build calendar service cs, err := calendar.NewService( ctx, getEnv("CALENDAR_CREDENTIALS"), calendar.WithCalendar("T2", getEnv("CALENDAR_ID_T2")), calendar.WithCalendar("T3", getEnv("CALENDAR_ID_T3")), ) if err != nil { log.Fatalf("error starting calendar service %s", err) } // starting server 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), // TODO: should validate the booking service building as, ps, cs, config.NewHost(), // TODO: move to the database at some point server.WithPort(port), server.WithFileSystem(static), server.WithDebug(strings.ToLower(getEnv("DEBUG")) == "true"), server.WithSecretKey(getEnv("SECRET_KEY")), server.WithOrigins(origins), ) if err != nil { return fmt.Errorf("error starting server %s", err) } srv.Start(ctx) return nil }