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:
Jakub Zych
2026-09-18 18:43:31 +02:00
parent 5530fa4ebf
commit 2d4245681e
7 changed files with 100 additions and 26 deletions

21
classes/registry.go Normal file
View 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
View 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
}