refactor to improve database operability in hwsauth

This commit is contained in:
2026-01-11 23:00:50 +11:00
parent ae4094d426
commit 4c5af63ea2
17 changed files with 582 additions and 96 deletions

View File

@@ -1,18 +1,16 @@
package hwsauth
import (
"database/sql"
"git.haelnorr.com/h/golib/hws"
"git.haelnorr.com/h/golib/jwt"
"github.com/pkg/errors"
"github.com/rs/zerolog"
)
type Authenticator[T Model] struct {
type Authenticator[T Model, TX DBTransaction] struct {
tokenGenerator *jwt.TokenGenerator
load LoadFunc[T]
conn DBConnection
load LoadFunc[T, TX]
beginTx BeginTX
ignoredPaths []string
logger *zerolog.Logger
server *hws.Server
@@ -25,22 +23,22 @@ type Authenticator[T Model] struct {
// If cfg is nil or any required fields are not set, default values will be used or an error returned.
// Required fields: SecretKey (no default)
// If SSL is true, TrustedHost is also required.
func NewAuthenticator[T Model](
func NewAuthenticator[T Model, TX DBTransaction](
cfg *Config,
load LoadFunc[T],
load LoadFunc[T, TX],
server *hws.Server,
conn DBConnection,
beginTx BeginTX,
logger *zerolog.Logger,
errorPage hws.ErrorPageFunc,
) (*Authenticator[T], error) {
) (*Authenticator[T, TX], error) {
if load == nil {
return nil, errors.New("No function to load model supplied")
}
if server == nil {
return nil, errors.New("No hws.Server provided")
}
if conn == nil {
return nil, errors.New("No database connection supplied")
if beginTx == nil {
return nil, errors.New("No beginTx function provided")
}
if logger == nil {
return nil, errors.New("No logger provided")
@@ -72,13 +70,6 @@ func NewAuthenticator[T Model](
cfg.LandingPage = "/profile"
}
// Cast DBConnection to *sql.DB
// DBConnection is satisfied by *sql.DB, so this cast should be safe for standard usage
sqlDB, ok := conn.(*sql.DB)
if !ok {
return nil, errors.New("DBConnection must be *sql.DB for JWT token generation")
}
// Configure JWT table
tableConfig := jwt.DefaultTableConfig()
if cfg.JWTTableName != "" {
@@ -92,22 +83,21 @@ func NewAuthenticator[T Model](
FreshExpireAfter: cfg.TokenFreshTime,
TrustedHost: cfg.TrustedHost,
SecretKey: cfg.SecretKey,
DBConn: sqlDB,
DBType: jwt.DatabaseType{
Type: cfg.DatabaseType,
Version: cfg.DatabaseVersion,
},
TableConfig: tableConfig,
})
}, beginTx)
if err != nil {
return nil, errors.Wrap(err, "jwt.CreateGenerator")
}
auth := Authenticator[T]{
auth := Authenticator[T, TX]{
tokenGenerator: tokenGen,
load: load,
server: server,
conn: conn,
beginTx: beginTx,
logger: logger,
errorPage: errorPage,
SSL: cfg.SSL,