package main import ( "net/http" "os" "path/filepath" "github.com/gin-gonic/gin" "github.com/glebarez/sqlite" "gorm.io/gorm" ) func main() { dbPath := getenv("DB_PATH", "/data/downloader.db") _ = os.MkdirAll(filepath.Dir(dbPath), 0755) db, err := gorm.Open(sqlite.Open(dbPath), &gorm.Config{}) must(err) must(migrateDatabase(db)) client := &http.Client{Timeout: 2 * 60 * 1e9} cfg := loadConfig(db) a := &App{db: db, cfg: cfg, queue: make(chan uint, 100), httpClient: client} a.loadSettings() a.bootstrapAdmin() must(backfillMediaAssets(db, a.cfg.DownloadDir)) if os.Getenv("MIGRATION_CHECK") == "1" { var users, tasks, assets int64 db.Model(&User{}).Count(&users) db.Model(&Task{}).Count(&tasks) db.Model(&MediaAsset{}).Count(&assets) println("migration check ok", "users", users, "tasks", tasks, "assets", assets) return } normalizeConfig(&a.cfg) a.am = &AMAPIClient{BaseURL: a.cfg.AMAPI, HTTP: client} if a.cfg.WebDAVURL != "" { a.storage = NewWebDAVStorage(a.cfg) } a.startWorkers() a.startWebDAVResync() r := gin.Default() r.StaticFile("/", "/app/index.html") api := r.Group("/api") api.POST("/auth/login", a.login) api.POST("/auth/logout", a.requireAuth, a.logout) api.POST("/auth/password", a.requireAuth, a.changePassword) api.GET("/auth/me", a.requireAuth, a.me) auth := api.Group("", a.requireAuth) auth.GET("/search", a.requirePermission(PermDownload), a.search) auth.GET("/tasks", a.requirePermission(PermDownload), a.listTasks) auth.GET("/credits", a.creditInfo) auth.POST("/redeem", a.requirePermission(PermRedeem), a.redeem) auth.GET("/webdav/config", a.requirePermission(PermWebDAVConfig), a.getUserWebDAV) auth.PUT("/webdav/config", a.requirePermission(PermWebDAVConfig), a.putUserWebDAV) auth.POST("/webdav/test", a.requirePermission(PermWebDAVConfig), a.testUserWebDAV) auth.POST("/tasks", a.requirePermission(PermDownload), a.addTask) auth.POST("/tasks/:id/retry", a.requirePermission(PermDownload), a.retryTask) auth.DELETE("/tasks/:id", a.requirePermission(PermDownload), a.deleteTask) admin := api.Group("/admin", a.requireAuth, a.requireAdmin) admin.GET("/users", a.adminListUsers) admin.GET("/audit", a.adminAudit) admin.POST("/users", a.adminCreateUser) admin.PUT("/users/:id", a.adminUpdateUser) admin.GET("/redeem", a.adminListRedeemBatches) admin.POST("/redeem", a.adminCreateRedeemBatch) admin.POST("/redeem/:id/revoke", a.adminRevokeRedeemBatch) admin.GET("/settings", a.getSettings) admin.PUT("/settings", a.putSettings) admin.POST("/webdav/test", a.testWebDAV) must(r.Run(":" + getenv("PORT", "9540"))) } func must(err error) { if err != nil { panic(err) } }