package main import ( "database/sql" "fmt" "net/http" "os" "screenmark/screenmark/agents/client" "screenmark/screenmark/auth" "screenmark/screenmark/images" "screenmark/screenmark/models" "screenmark/screenmark/stacks" ourmiddleware "screenmark/screenmark/middleware" "github.com/go-chi/chi/v5" "github.com/go-chi/chi/v5/middleware" "github.com/joho/godotenv" ) type TestAiClient struct { ImageInfo client.ImageMessageContent } func (client TestAiClient) GetImageInfo(imageName string, imageData []byte) (client.ImageMessageContent, error) { return client.ImageInfo, nil } func setupRouter(db *sql.DB) chi.Router { imageModel := models.NewImageModel(db) stackModel := models.NewListModel(db) stackHandler := stacks.CreateStackHandler(db) authHandler := auth.CreateAuthHandler(db) imageHandler := images.CreateImageHandler(db) notifier := NewNotifier[Notification](10) // Only start event listeners if not in test environment if os.Getenv("GO_TEST_ENVIRONMENT") != "true" { // TODO: should extract these into a notification manager // And actually make them the same code. // The events are basically the same. go ListenNewImageEvents(db) go ListenProcessingImageStatus(db, imageModel, ¬ifier) go ListenNewStackEvents(db) go ListenProcessingStackStatus(db, stackModel, ¬ifier) } r := chi.NewRouter() r.Use(middleware.Logger) r.Use(ourmiddleware.CorsMiddleware) r.Route("/stacks", stackHandler.CreateRoutes) r.Route("/auth", authHandler.CreateRoutes) r.Route("/images", imageHandler.CreateRoutes) r.Route("/notifications", func(r chi.Router) { r.Use(ourmiddleware.GetUserIdFromUrl) r.Get("/", CreateEventsHandler(¬ifier)) }) logWriter := DatabaseWriter{ dbPool: db, } r.Route("/logs", createLogHandler(&logWriter)) return r } func main() { err := godotenv.Load() if err != nil { panic(err) } db, err := models.InitDatabase() if err != nil { panic(err) } router := setupRouter(db) port, exists := os.LookupEnv("PORT") if !exists { panic("no port can be found") } portWithColon := fmt.Sprintf(":%s", port) logger := createLogger("Main", os.Stdout) logger.Info("Serving router", "port", portWithColon) err = http.ListenAndServe(portWithColon, router) if err != nil { panic(err) } }