mirror of
https://github.com/seriousm4x/UpSnap.git
synced 2026-04-05 08:53:55 -04:00
fix: remove global app variable
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user