fix: remove global app variable

This commit is contained in:
Maxi Quoß
2024-12-31 12:11:29 +01:00
parent abe7b446be
commit 61980c62d7
2 changed files with 49 additions and 50 deletions

View File

@@ -17,12 +17,12 @@ import (
) )
func HandlerWake(e *core.RequestEvent) error { func HandlerWake(e *core.RequestEvent) error {
record, err := App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id")) record, err := e.App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id"))
if err != nil { if err != nil {
return apis.NewNotFoundError("The device does not exist.", err) return apis.NewNotFoundError("The device does not exist.", err)
} }
record.Set("status", "pending") record.Set("status", "pending")
if err := App.Save(record); err != nil { if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
go func(r *core.Record) { go func(r *core.Record) {
@@ -32,7 +32,7 @@ func HandlerWake(e *core.RequestEvent) error {
} else { } else {
r.Set("status", "online") r.Set("status", "online")
} }
if err := App.Save(r); err != nil { if err := e.App.Save(r); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
}(record) }(record)
@@ -40,37 +40,37 @@ func HandlerWake(e *core.RequestEvent) error {
} }
func HandlerSleep(e *core.RequestEvent) error { func HandlerSleep(e *core.RequestEvent) error {
record, err := App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id")) record, err := e.App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id"))
if err != nil { if err != nil {
return apis.NewNotFoundError("The device does not exist.", err) return apis.NewNotFoundError("The device does not exist.", err)
} }
record.Set("status", "pending") record.Set("status", "pending")
if err := App.Save(record); err != nil { if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
resp, err := networking.SleepDevice(record) resp, err := networking.SleepDevice(record)
if err != nil { if err != nil {
logger.Error.Println(err) logger.Error.Println(err)
record.Set("status", "online") record.Set("status", "online")
if err := App.Save(record); err != nil { if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
return apis.NewBadRequestError(resp.Message, nil) return apis.NewBadRequestError(resp.Message, nil)
} }
record.Set("status", "offline") record.Set("status", "offline")
if err := App.Save(record); err != nil { if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
return e.JSON(http.StatusOK, nil) return e.JSON(http.StatusOK, nil)
} }
func HandlerReboot(e *core.RequestEvent) error { func HandlerReboot(e *core.RequestEvent) error {
record, err := App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id")) record, err := e.App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id"))
if err != nil { if err != nil {
return apis.NewNotFoundError("The device does not exist.", err) return apis.NewNotFoundError("The device does not exist.", err)
} }
record.Set("status", "pending") record.Set("status", "pending")
if err := App.Save(record); err != nil { if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
go func(r *core.Record) { go func(r *core.Record) {
@@ -86,7 +86,7 @@ func HandlerReboot(e *core.RequestEvent) error {
r.Set("status", "online") r.Set("status", "online")
} }
} }
if err := App.Save(r); err != nil { if err := e.App.Save(r); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
}(record) }(record)
@@ -94,12 +94,12 @@ func HandlerReboot(e *core.RequestEvent) error {
} }
func HandlerShutdown(e *core.RequestEvent) error { func HandlerShutdown(e *core.RequestEvent) error {
record, err := App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id")) record, err := e.App.FindFirstRecordByData("devices", "id", e.Request.PathValue("id"))
if err != nil { if err != nil {
return apis.NewNotFoundError("The device does not exist.", err) return apis.NewNotFoundError("The device does not exist.", err)
} }
record.Set("status", "pending") record.Set("status", "pending")
if err := App.Save(record); err != nil { if err := e.App.Save(record); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
go func(r *core.Record) { go func(r *core.Record) {
@@ -109,7 +109,7 @@ func HandlerShutdown(e *core.RequestEvent) error {
} else { } else {
r.Set("status", "offline") r.Set("status", "offline")
} }
if err := App.Save(r); err != nil { if err := e.App.Save(r); err != nil {
logger.Error.Println("Failed to save record:", err) logger.Error.Println("Failed to save record:", err)
} }
}(record) }(record)
@@ -134,7 +134,7 @@ func HandlerScan(e *core.RequestEvent) error {
} }
// check if scan range is valid // check if scan range is valid
allPrivateSettings, err := App.FindAllRecords("settings_private") allPrivateSettings, err := e.App.FindAllRecords("settings_private")
if err != nil { if err != nil {
return err return err
} }
@@ -249,7 +249,7 @@ func HandlerInitSuperuser(e *core.RequestEvent) error {
record := core.NewRecord(superusersCollection) record := core.NewRecord(superusersCollection)
record.SetEmail(data.Email) record.SetEmail(data.Email)
record.SetPassword(data.Password) record.SetPassword(data.Password)
err = App.Save(record) err = e.App.Save(record)
if err != nil { if err != nil {
return e.BadRequestError("Failed to create initial superuser", err) return e.BadRequestError("Failed to create initial superuser", err)
} }

View File

@@ -16,7 +16,6 @@ import (
_ "github.com/seriousm4x/upsnap/migrations" _ "github.com/seriousm4x/upsnap/migrations"
) )
var App *pocketbase.PocketBase
var Version = "(untracked)" var Version = "(untracked)"
func StartPocketBase(distDirFS fs.FS) { func StartPocketBase(distDirFS fs.FS) {
@@ -47,19 +46,19 @@ func StartPocketBase(distDirFS fs.FS) {
} }
// create app // create app
App = pocketbase.NewWithConfig(pocketbase.Config{ app := pocketbase.NewWithConfig(pocketbase.Config{
DefaultDataDir: dataDir, DefaultDataDir: dataDir,
}) })
App.RootCmd.Short = "UpSnap CLI" app.RootCmd.Short = "UpSnap CLI"
App.RootCmd.Version = Version app.RootCmd.Version = Version
// auto migrate db // auto migrate db
migratecmd.MustRegister(App, App.RootCmd, migratecmd.Config{ migratecmd.MustRegister(app, app.RootCmd, migratecmd.Config{
Automigrate: true, Automigrate: true,
}) })
// event hooks // event hooks
App.OnServe().BindFunc(func(se *core.ServeEvent) error { app.OnServe().BindFunc(func(se *core.ServeEvent) error {
se.Router.GET("/{path...}", apis.Static(distDirFS, true)) se.Router.GET("/{path...}", apis.Static(distDirFS, true))
se.Router.GET("/api/upsnap/wake/{id}", HandlerWake).Bind(RequireUpSnapPermission()) se.Router.GET("/api/upsnap/wake/{id}", HandlerWake).Bind(RequireUpSnapPermission())
@@ -69,25 +68,25 @@ func StartPocketBase(distDirFS fs.FS) {
se.Router.GET("/api/upsnap/scan", HandlerScan).Bind(apis.RequireSuperuserAuth()) se.Router.GET("/api/upsnap/scan", HandlerScan).Bind(apis.RequireSuperuserAuth())
se.Router.POST("/api/upsnap/init-superuser", HandlerInitSuperuser) // https://github.com/pocketbase/pocketbase/discussions/6198 se.Router.POST("/api/upsnap/init-superuser", HandlerInitSuperuser) // https://github.com/pocketbase/pocketbase/discussions/6198
if err := importSettings(); err != nil { if err := importSettings(app); err != nil {
return err return err
} }
if err := resetDeviceStates(); err != nil { if err := resetDeviceStates(app); err != nil {
return err return err
} }
cronjobs.SetPingJobs(App) cronjobs.SetPingJobs(app)
cronjobs.StartPing() cronjobs.StartPing()
cronjobs.SetWakeShutdownJobs(App) cronjobs.SetWakeShutdownJobs(app)
cronjobs.StartWakeShutdown() cronjobs.StartWakeShutdown()
// restart ping cronjobs or wake/shutdown cronjobs on model update // restart ping cronjobs or wake/shutdown cronjobs on model update
// add event hook before starting server. // add event hook before starting server.
// using this outside App.OnBeforeServe() would not work // using this outside App.OnBeforeServe() would not work
App.OnModelAfterUpdateSuccess("settings_private", "devices").BindFunc(func(e *core.ModelEvent) error { app.OnModelAfterUpdateSuccess("settings_private", "devices").BindFunc(func(e *core.ModelEvent) error {
if e.Model.TableName() == "settings_private" { if e.Model.TableName() == "settings_private" {
cronjobs.SetPingJobs(App) cronjobs.SetPingJobs(app)
} else if e.Model.TableName() == "devices" { } else if e.Model.TableName() == "devices" {
// only restart wake/shutdown cronjobs if new model's cron changed // only restart wake/shutdown cronjobs if new model's cron changed
record := e.Model.(*core.Record) record := e.Model.(*core.Record)
@@ -114,7 +113,7 @@ func StartPocketBase(distDirFS fs.FS) {
newShutdownCron != oldShutdownCron || newShutdownCron != oldShutdownCron ||
newShutdownCronEnabled != oldShutdownCronEnabled || newShutdownCronEnabled != oldShutdownCronEnabled ||
newShutdownCmd != oldShutdownCmd { newShutdownCmd != oldShutdownCmd {
cronjobs.SetWakeShutdownJobs(App) cronjobs.SetWakeShutdownJobs(app)
} }
} }
return e.Next() return e.Next()
@@ -122,7 +121,7 @@ func StartPocketBase(distDirFS fs.FS) {
return se.Next() return se.Next()
}) })
App.OnModelAfterCreateSuccess().BindFunc(func(e *core.ModelEvent) error { app.OnModelAfterCreateSuccess().BindFunc(func(e *core.ModelEvent) error {
if e.Model.TableName() == "_superusers" { if e.Model.TableName() == "_superusers" {
if err := setSetupCompleted(); err != nil { if err := setSetupCompleted(); err != nil {
logger.Error.Println(err) logger.Error.Println(err)
@@ -135,7 +134,7 @@ func StartPocketBase(distDirFS fs.FS) {
userId := deviceRec.GetString("created_by") userId := deviceRec.GetString("created_by")
var permissionRec *core.Record var permissionRec *core.Record
permissionRec, err := App.FindFirstRecordByFilter("permissions", permissionRec, err := app.FindFirstRecordByFilter("permissions",
fmt.Sprintf("user.id = '%s'", userId)) fmt.Sprintf("user.id = '%s'", userId))
if err != nil && err.Error() != "sql: no rows in result set" { if err != nil && err.Error() != "sql: no rows in result set" {
logger.Error.Println(err) logger.Error.Println(err)
@@ -145,7 +144,7 @@ func StartPocketBase(distDirFS fs.FS) {
permissionRec.Set("update", append(permissionRec.GetStringSlice("update"), deviceRec.Id)) permissionRec.Set("update", append(permissionRec.GetStringSlice("update"), deviceRec.Id))
permissionRec.Set("delete", append(permissionRec.GetStringSlice("delete"), deviceRec.Id)) permissionRec.Set("delete", append(permissionRec.GetStringSlice("delete"), deviceRec.Id))
permissionRec.Set("power", append(permissionRec.GetStringSlice("power"), deviceRec.Id)) permissionRec.Set("power", append(permissionRec.GetStringSlice("power"), deviceRec.Id))
if err := App.Save(permissionRec); err != nil { if err := app.Save(permissionRec); err != nil {
logger.Error.Println(err) logger.Error.Println(err)
return err return err
} }
@@ -154,7 +153,7 @@ func StartPocketBase(distDirFS fs.FS) {
return e.Next() return e.Next()
}) })
App.OnModelAfterDeleteSuccess().BindFunc(func(e *core.ModelEvent) error { app.OnModelAfterDeleteSuccess().BindFunc(func(e *core.ModelEvent) error {
if e.Model.TableName() == "_superusers" { if e.Model.TableName() == "_superusers" {
if err := setSetupCompleted(); err != nil { if err := setSetupCompleted(); err != nil {
logger.Error.Println(err) logger.Error.Println(err)
@@ -165,29 +164,29 @@ func StartPocketBase(distDirFS fs.FS) {
}) })
// prevent new superuser bahavior introduced in pocketbase 0.23 // prevent new superuser bahavior introduced in pocketbase 0.23
App.OnRecordCreate(core.CollectionNameSuperusers).BindFunc(func(e *core.RecordEvent) error { app.OnRecordCreate(core.CollectionNameSuperusers).BindFunc(func(e *core.RecordEvent) error {
if e.Record.Email() == core.DefaultInstallerEmail { if e.Record.Email() == core.DefaultInstallerEmail {
return errors.New("skip default PocketBase installer") return errors.New("skip default PocketBase installer")
} }
return e.Next() return e.Next()
}) })
App.OnTerminate().BindFunc(func(e *core.TerminateEvent) error { app.OnTerminate().BindFunc(func(e *core.TerminateEvent) error {
cronjobs.StopAll() cronjobs.StopAll()
return e.Next() return e.Next()
}) })
if err := App.Start(); err != nil { if err := app.Start(); err != nil {
logger.Error.Fatalln(err) logger.Error.Fatalln(err)
} }
} }
func importSettings() error { func importSettings(app *pocketbase.PocketBase) error {
settingsPrivateRecords, err := App.FindAllRecords("settings_private") settingsPrivateRecords, err := app.FindAllRecords("settings_private")
if err != nil { if err != nil {
return err return err
} }
settingsPrivateCollection, err := App.FindCollectionByNameOrId("settings_private") settingsPrivateCollection, err := app.FindCollectionByNameOrId("settings_private")
if err != nil { if err != nil {
return err return err
} }
@@ -196,11 +195,11 @@ func importSettings() error {
settingsPrivate = settingsPrivateRecords[0] settingsPrivate = settingsPrivateRecords[0]
} }
settingsPublicRecords, err := App.FindAllRecords("settings_public") settingsPublicRecords, err := app.FindAllRecords("settings_public")
if err != nil { if err != nil {
return err return err
} }
settingsPublicCollection, err := App.FindCollectionByNameOrId("settings_public") settingsPublicCollection, err := app.FindCollectionByNameOrId("settings_public")
if err != nil { if err != nil {
return err return err
} }
@@ -230,13 +229,13 @@ func importSettings() error {
settingsPublic.Set("website_title", websiteTitle) settingsPublic.Set("website_title", websiteTitle)
} }
if err := App.Save(settingsPrivate); err != nil { if err := app.Save(settingsPrivate); err != nil {
return err return err
} }
if err := App.Save(settingsPublic); err != nil { if err := app.Save(settingsPublic); err != nil {
return err return err
} }
if err := setSetupCompleted(); err != nil { if err := setSetupCompleted(app); err != nil {
logger.Error.Println(err) logger.Error.Println(err)
return err return err
} }
@@ -245,26 +244,26 @@ func importSettings() error {
return nil return nil
} }
func resetDeviceStates() error { func resetDeviceStates(app *pocketbase.PocketBase) error {
devices, err := App.FindAllRecords("devices") devices, err := app.FindAllRecords("devices")
if err != nil { if err != nil {
return err return err
} }
for _, device := range devices { for _, device := range devices {
device.Set("status", "offline") device.Set("status", "offline")
if err := App.Save(device); err != nil { if err := app.Save(device); err != nil {
return err return err
} }
} }
return nil return nil
} }
func setSetupCompleted() error { func setSetupCompleted(app *pocketbase.PocketBase) error {
totalAdmins, err := App.CountRecords(core.CollectionNameSuperusers) totalAdmins, err := app.CountRecords(core.CollectionNameSuperusers)
if err != nil { if err != nil {
return err return err
} }
settingsPublicRecords, err := App.FindAllRecords("settings_public") settingsPublicRecords, err := app.FindAllRecords("settings_public")
if err != nil { if err != nil {
return err return err
} }
@@ -273,7 +272,7 @@ func setSetupCompleted() error {
} else { } else {
settingsPublicRecords[0].Set("setup_completed", false) settingsPublicRecords[0].Set("setup_completed", false)
} }
if err := App.Save(settingsPublicRecords[0]); err != nil { if err := app.Save(settingsPublicRecords[0]); err != nil {
return err return err
} }
return nil return nil