package main import ( "context" "embed" "fmt" "os" "os/signal" "strconv" "strings" "github.com/getsentry/sentry-go" "github.com/rjNemo/rentease/internal/config" "github.com/rjNemo/rentease/internal/driver/calendar" "github.com/rjNemo/rentease/internal/driver/database" "github.com/rjNemo/rentease/internal/driver/pdf" "github.com/rjNemo/rentease/internal/server" "github.com/rjNemo/rentease/internal/service/auth" "github.com/rjNemo/rentease/internal/service/booking" ) //go:embed assets var static embed.FS func main() { ctx := context.Background() if err := run(ctx, config.NewConfig()); 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 := database.New(getEnv("DATABASE_URL")) if err != nil { return fmt.Errorf("error connecting to the database %s", err) } if err = database.Migrate(db, &booking.Booking{}, &booking.BookingRequest{}, &booking.Item{}); err != nil { return fmt.Errorf("error connecting to the database %s", err) } // build calendar client gc, err := calendar.NewGoogleClient(ctx, getEnv("CALENDAR_CREDENTIALS")) if err != nil { return fmt.Errorf("error building calendar client %s", err) } // build pdf client pc, err := pdf.NewPdfClient( getEnv("HTMLDOCS_PROJECT_ID"), getEnv("HTMLDOCS_REPORT_PROJECT_ID"), getEnv("HTMLDOCS_URL"), getEnv("HTMLDOCS_KEY"), ) if err != nil { return fmt.Errorf("error starting pdf client %s", err) } // build booking service bs, err := booking.NewService(db, gc, pc) if err != nil { return fmt.Errorf("error starting booking 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) } // 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( bs, as, 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 }