feat(05-01): restructure fonoteka plugins into Winter directories
- Move models, classes, controllers, middleware, and updates into subpackages - Add self-registering models/updates/classes registries so later plans add files - Keep the genres route and shipped migration SQL unchanged
This commit is contained in:
21
classes/registry.go
Normal file
21
classes/registry.go
Normal file
@@ -0,0 +1,21 @@
|
||||
package classes
|
||||
|
||||
import "gorm.io/gorm"
|
||||
|
||||
var hookRegistrars []func(*gorm.DB) error
|
||||
|
||||
// RegisterHook appends a GORM-callback registrant so later plans add files
|
||||
// without editing plugin.go Boot.
|
||||
func RegisterHook(fn func(*gorm.DB) error) {
|
||||
hookRegistrars = append(hookRegistrars, fn)
|
||||
}
|
||||
|
||||
// RegisterHooks runs every registered hook against gdb.
|
||||
func RegisterHooks(gdb *gorm.DB) error {
|
||||
for _, fn := range hookRegistrars {
|
||||
if err := fn(gdb); err != nil {
|
||||
return err
|
||||
}
|
||||
}
|
||||
return nil
|
||||
}
|
||||
51
classes/user_lookup.go
Normal file
51
classes/user_lookup.go
Normal file
@@ -0,0 +1,51 @@
|
||||
package classes
|
||||
|
||||
import (
|
||||
"context"
|
||||
"errors"
|
||||
"fmt"
|
||||
"strings"
|
||||
|
||||
"git.golem15.com/golem15/fonoteka/plugins/golem15/user/models"
|
||||
"git.golem15.com/golem15/summercms/backpack"
|
||||
"git.golem15.com/golem15/summercms/bouncer"
|
||||
"gorm.io/gorm"
|
||||
)
|
||||
|
||||
var _ bouncer.UserProvider = GormUsers{}
|
||||
|
||||
// GormUsers loads JWT principals from the users table.
|
||||
type GormUsers struct {
|
||||
App *backpack.App
|
||||
}
|
||||
|
||||
func (g GormUsers) FindByID(ctx context.Context, id uint) (*bouncer.Principal, error) {
|
||||
if g.App == nil {
|
||||
return nil, fmt.Errorf("golem15.user: app is nil")
|
||||
}
|
||||
gdb, ok := g.App.Lookup[*gorm.DB]()
|
||||
if !ok || gdb == nil {
|
||||
return nil, fmt.Errorf("golem15.user: gorm handle is missing")
|
||||
}
|
||||
var row models.User
|
||||
err := gdb.WithContext(ctx).Where("id = ?", id).Take(&row).Error
|
||||
if errors.Is(err, gorm.ErrRecordNotFound) {
|
||||
return nil, nil
|
||||
}
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
return &bouncer.Principal{ID: row.ID, MustChangePassword: row.MustChangePassword}, nil
|
||||
}
|
||||
|
||||
// JWTSecret reads golem15.user.jwt.secret and fails loudly when it is empty.
|
||||
func JWTSecret(app *backpack.App) (string, error) {
|
||||
if app == nil || app.Config == nil {
|
||||
return "", fmt.Errorf("golem15.user: jwt.secret is empty (set SUMMER_GOLEM15__USER__JWT__SECRET)")
|
||||
}
|
||||
secret := strings.TrimSpace(app.Config.String("golem15.user.jwt.secret"))
|
||||
if secret == "" {
|
||||
return "", fmt.Errorf("golem15.user: jwt.secret is empty (set SUMMER_GOLEM15__USER__JWT__SECRET)")
|
||||
}
|
||||
return secret, nil
|
||||
}
|
||||
Reference in New Issue
Block a user