Files
sm-user-plugin/classes/user_lookup.go
Jakub Zych 2d4245681e 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
2026-09-18 18:43:31 +02:00

52 lines
1.4 KiB
Go

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
}