package main import ( "context" "encoding/hex" "os" "os/signal" "github.com/fasthttp/router" "github.com/sirupsen/logrus" "github.com/valyala/fasthttp" "gorm.io/driver/sqlite" "gorm.io/gorm" "git.sr.ht/~gabrielgio/img/pkg/components/auth" "git.sr.ht/~gabrielgio/img/pkg/components/filesystem" "git.sr.ht/~gabrielgio/img/pkg/components/media" "git.sr.ht/~gabrielgio/img/pkg/database/localfs" "git.sr.ht/~gabrielgio/img/pkg/database/sql" "git.sr.ht/~gabrielgio/img/pkg/ext" "git.sr.ht/~gabrielgio/img/pkg/view" "git.sr.ht/~gabrielgio/img/pkg/worker" ) const root = "/home/gabrielgio" func main() { logger := logrus.New() logger.SetLevel(logrus.ErrorLevel) d := sqlite.Open("test.db") db, err := gorm.Open(d, &gorm.Config{ Logger: ext.Wraplog(logger.WithField("context", "sql")), }) if err != nil { panic("failed to connect database: " + err.Error()) } if err = sql.Migrate(db); err != nil { panic("failed to migrate database: " + err.Error()) } // TODO: properly set this up key, _ := hex.DecodeString("6368616e676520746869732070617373") r := router.New() r.ServeFiles("/static/{filepath:*}", "./static") r.NotFound = ext.NotFoundHTML authMiddleware := ext.NewAuthMiddleware(key, logger.WithField("context", "auth")) logMiddleware := ext.NewLogMiddleare(logger.WithField("context", "http")) extRouter := ext.NewRouter(r) extRouter.AddMiddleware(logMiddleware.HTTP) extRouter.AddMiddleware(authMiddleware.LoggedIn) extRouter.AddMiddleware(ext.HTML) scheduler := worker.NewScheduler(10) // repository var ( userRepository = sql.NewUserRepository(db) settingsRepository = sql.NewSettingsRespository(db) fileSystemRepository = localfs.NewFileSystemRepository(root) mediaRepository = sql.NewMediaRepository(db) ) //TODO: remove later userRepository.EnsureAdmin(context.Background()) // controller var ( userController = auth.NewController(userRepository, key) fileSystemController = filesystem.NewController(fileSystemRepository) ) // view for _, v := range []view.View{ view.NewAuthView(userController), view.NewFileSystemView(*fileSystemController, settingsRepository), view.NewSettingsView(settingsRepository), view.NewMediaView(mediaRepository), } { v.SetMyselfIn(extRouter) } // worker var ( serverWorker = worker.NewServerWorker(&fasthttp.Server{Handler: r.Handler}) fileScanner = worker.NewFileScanner(root, mediaRepository) exifScanner = worker.NewEXIFScanner(root, mediaRepository) ) pool := worker.NewWorkerPool() pool.AddWorker("http server", serverWorker) pool.AddWorker("exif scanner", worker.NewWorkerFromListProcessor[*media.Media](exifScanner, scheduler)) pool.AddWorker("file scanner", worker.NewWorkerFromChanProcessor[string](fileScanner, scheduler)) ctx, stop := signal.NotifyContext(context.Background(), os.Interrupt) defer stop() pool.Start(ctx) pool.Wait() }