rentease/main.go
2024-09-11 11:04:34 +02:00

119 lines
2.8 KiB
Go

package main
import (
"context"
"embed"
"fmt"
"os"
"os/signal"
"strconv"
"strings"
"github.com/getsentry/sentry-go"
"github.com/rjNemo/rentease/internal/auth"
"github.com/rjNemo/rentease/internal/booking"
"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"
)
//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 service %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
}