78 lines
2.6 KiB
Go
78 lines
2.6 KiB
Go
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()
|
|
|
|
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)
|
|
}
|
|
}
|