feat: use dig for controllers

This commit is contained in:
Stavros
2026-06-14 00:20:06 +03:00
parent 7cd3719734
commit f8b85e3bc7
14 changed files with 351 additions and 139 deletions
+5 -1
View File
@@ -229,7 +229,7 @@ func (app *BootstrapApp) Setup() error {
Queries repository.Store Queries repository.Store
} }
app.dig.Provide(func() utilityProvider { err = app.dig.Provide(func() utilityProvider {
return utilityProvider{ return utilityProvider{
Log: app.log, Log: app.log,
Config: &app.config, Config: &app.config,
@@ -240,6 +240,10 @@ func (app *BootstrapApp) Setup() error {
} }
}) })
if err != nil {
return fmt.Errorf("failed to provide utilities to container: %w", err)
}
// services // services
err = app.setupServices() err = app.setupServices()
+106 -17
View File
@@ -13,6 +13,7 @@ import (
"github.com/tinyauthapp/tinyauth/internal/controller" "github.com/tinyauthapp/tinyauth/internal/controller"
"github.com/tinyauthapp/tinyauth/internal/middleware" "github.com/tinyauthapp/tinyauth/internal/middleware"
"github.com/tinyauthapp/tinyauth/internal/model" "github.com/tinyauthapp/tinyauth/internal/model"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -40,31 +41,119 @@ func (app *BootstrapApp) setupRouter() error {
} }
} }
contextMiddleware := middleware.NewContextMiddleware(app.log, app.runtime, app.services.authService, app.services.oauthBrokerService, app.services.tailscaleService) err := app.dig.Provide(middleware.NewContextMiddleware)
engine.Use(contextMiddleware.Middleware())
uiMiddleware, err := middleware.NewUIMiddleware()
if err != nil { if err != nil {
return fmt.Errorf("failed to initialize UI middleware: %w", err) return fmt.Errorf("failed to provide context middleware: %w", err)
} }
engine.Use(uiMiddleware.Middleware()) err = app.dig.Provide(middleware.NewUIMiddleware)
zerologMiddleware := middleware.NewZerologMiddleware(app.log) if err != nil {
return fmt.Errorf("failed to provide ui middleware: %w", err)
}
engine.Use(zerologMiddleware.Middleware()) err = app.dig.Provide(middleware.NewZerologMiddleware)
apiRouter := engine.Group("/api") if err != nil {
return fmt.Errorf("failed to provide zerolog middleware: %w", err)
}
controller.NewContextController(app.log, app.config, app.runtime, apiRouter) type middlewareInput struct {
controller.NewOAuthController(app.log, app.config, app.runtime, apiRouter, app.services.authService) dig.In
controller.NewOIDCController(app.log, app.services.oidcService, app.runtime, apiRouter, &engine.RouterGroup)
controller.NewProxyController(app.log, app.runtime, apiRouter, app.services.accessControlService, app.services.authService, app.services.policyEngine) ContextMiddleware *middleware.ContextMiddleware
controller.NewUserController(app.log, app.runtime, apiRouter, app.services.authService) UIMiddleware *middleware.UIMiddleware
controller.NewResourcesController(app.config, &engine.RouterGroup) ZerologMiddleware *middleware.ZerologMiddleware
controller.NewHealthController(apiRouter) }
controller.NewWellKnownController(app.services.oidcService, &engine.RouterGroup)
err = app.dig.Invoke(func(mi middlewareInput) {
engine.Use(mi.ContextMiddleware.Middleware())
engine.Use(mi.UIMiddleware.Middleware())
engine.Use(mi.ZerologMiddleware.Middleware())
})
if err != nil {
return fmt.Errorf("failed to invoke middleware: %w", err)
}
err = app.dig.Provide(func() *gin.RouterGroup {
return &engine.RouterGroup
}, dig.Name("mainRouterGroup"))
if err != nil {
return fmt.Errorf("failed to provide main router group: %w", err)
}
err = app.dig.Provide(func() *gin.RouterGroup {
return engine.Group("/api")
}, dig.Name("apiRouterGroup"))
if err != nil {
return fmt.Errorf("failed to provide api router group: %w", err)
}
err = app.dig.Provide(controller.NewContextController)
if err != nil {
return fmt.Errorf("failed to provide context controller: %w", err)
}
err = app.dig.Provide(controller.NewOAuthController)
if err != nil {
return fmt.Errorf("failed to provide oauth controller: %w", err)
}
err = app.dig.Provide(controller.NewOIDCController)
if err != nil {
return fmt.Errorf("failed to provide oidc controller: %w", err)
}
err = app.dig.Provide(controller.NewProxyController)
if err != nil {
return fmt.Errorf("failed to provide proxy controller: %w", err)
}
err = app.dig.Provide(controller.NewUserController)
if err != nil {
return fmt.Errorf("failed to provide user controller: %w", err)
}
err = app.dig.Provide(controller.NewResourcesController)
if err != nil {
return fmt.Errorf("failed to provide resources controller: %w", err)
}
err = app.dig.Provide(controller.NewHealthController)
if err != nil {
return fmt.Errorf("failed to provide health controller: %w", err)
}
err = app.dig.Provide(controller.NewWellKnownController)
if err != nil {
return fmt.Errorf("failed to provide well-known controller: %w", err)
}
type controllerInput struct {
dig.In
ContextController *controller.ContextController
OAuthController *controller.OAuthController
OIDCController *controller.OIDCController
ProxyController *controller.ProxyController
UserController *controller.UserController
ResourcesController *controller.ResourcesController
HealthController *controller.HealthController
WellKnownController *controller.WellKnownController
}
// force dig to build all controllers and register their routes
err = app.dig.Invoke(func(ci controllerInput) error {
return nil
})
if err != nil {
return fmt.Errorf("failed to invoke controllers: %w", err)
}
app.router = engine app.router = engine
return nil return nil
+73 -20
View File
@@ -9,19 +9,46 @@ import (
) )
func (app *BootstrapApp) setupServices() error { func (app *BootstrapApp) setupServices() error {
app.setupPolicyEngine() err := app.setupPolicyEngine()
app.dig.Provide(func() *service.PolicyEngine { if err != nil {
return app.services.policyEngine return fmt.Errorf("failed to setup policy engine: %w", err)
}) }
app.dig.Provide(app.getLabelProvider) err = app.dig.Provide(app.getLabelProvider)
app.dig.Provide(service.NewLdapService) if err != nil {
app.dig.Provide(service.NewTailscaleService) return fmt.Errorf("failed to provide label provider: %w", err)
app.dig.Provide(service.NewAccessControlsService) }
app.dig.Provide(service.NewOAuthBrokerService)
app.dig.Provide(service.NewAuthService) err = app.dig.Provide(service.NewLdapService)
app.dig.Provide(service.NewOIDCService) if err != nil {
return fmt.Errorf("failed to provide ldap service: %w", err)
}
err = app.dig.Provide(service.NewTailscaleService)
if err != nil {
return fmt.Errorf("failed to provide tailscale service: %w", err)
}
err = app.dig.Provide(service.NewAccessControlsService)
if err != nil {
return fmt.Errorf("failed to provide access controls service: %w", err)
}
err = app.dig.Provide(service.NewOAuthBrokerService)
if err != nil {
return fmt.Errorf("failed to provide oauth broker service: %w", err)
}
err = app.dig.Provide(service.NewAuthService)
if err != nil {
return fmt.Errorf("failed to provide auth service: %w", err)
}
err = app.dig.Provide(service.NewOIDCService)
if err != nil {
return fmt.Errorf("failed to provide oidc service: %w", err)
}
type svcInput struct { type svcInput struct {
dig.In dig.In
@@ -34,7 +61,7 @@ func (app *BootstrapApp) setupServices() error {
TailscaleService *service.TailscaleService TailscaleService *service.TailscaleService
} }
err := app.dig.Invoke(func(i svcInput) error { err = app.dig.Invoke(func(i svcInput) error {
app.services = Services{ app.services = Services{
accessControlService: i.AccessControlService, accessControlService: i.AccessControlService,
authService: i.AuthService, authService: i.AuthService,
@@ -45,7 +72,11 @@ func (app *BootstrapApp) setupServices() error {
return nil return nil
}) })
return err if err != nil {
return fmt.Errorf("failed to invoke services: %w", err)
}
return nil
} }
func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) { func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
@@ -61,25 +92,41 @@ func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
if useKubernetes { if useKubernetes {
app.log.App.Debug().Msg("Using Kubernetes label provider") app.log.App.Debug().Msg("Using Kubernetes label provider")
app.dig.Provide(service.NewKubernetesService) err := app.dig.Provide(service.NewKubernetesService)
app.dig.Invoke(func(k *service.KubernetesService) error { if err != nil {
return nil, fmt.Errorf("failed to provide kubernetes service: %w", err)
}
err = app.dig.Invoke(func(k *service.KubernetesService) error {
app.services.kubernetesService = k app.services.kubernetesService = k
return nil return nil
}) })
if err != nil {
return nil, fmt.Errorf("failed to invoke kubernetes service: %w", err)
}
return app.services.kubernetesService, nil return app.services.kubernetesService, nil
} }
app.log.App.Debug().Msg("Using Docker label provider") app.log.App.Debug().Msg("Using Docker label provider")
app.dig.Provide(service.NewDockerService) err := app.dig.Provide(service.NewDockerService)
app.dig.Invoke(func(d *service.DockerService) error { if err != nil {
return nil, fmt.Errorf("failed to provide docker service: %w", err)
}
err = app.dig.Invoke(func(d *service.DockerService) error {
app.services.dockerService = d app.services.dockerService = d
return nil return nil
}) })
if err != nil {
return nil, fmt.Errorf("failed to invoke docker service: %w", err)
}
if app.services.dockerService == nil { if app.services.dockerService == nil {
if app.config.LabelProvider == "docker" { if app.config.LabelProvider == "docker" {
app.log.App.Warn().Msg("Docker label provider selected but Docker is not available, will continue without it") app.log.App.Warn().Msg("Docker label provider selected but Docker is not available, will continue without it")
@@ -93,10 +140,14 @@ func (app *BootstrapApp) getLabelProvider() (service.LabelProvider, error) {
} }
} }
func (app *BootstrapApp) setupPolicyEngine() { func (app *BootstrapApp) setupPolicyEngine() error {
app.dig.Provide(service.NewPolicyEngine) err := app.dig.Provide(service.NewPolicyEngine)
app.dig.Invoke(func(policyEngine *service.PolicyEngine) error { if err != nil {
return fmt.Errorf("failed to create policy engine: %w", err)
}
err = app.dig.Invoke(func(policyEngine *service.PolicyEngine) error {
policyEngine.RegisterRule(service.RuleUserAllowed, &service.UserAllowedRule{ policyEngine.RegisterRule(service.RuleUserAllowed, &service.UserAllowedRule{
Log: app.log, Log: app.log,
}) })
@@ -119,4 +170,6 @@ func (app *BootstrapApp) setupPolicyEngine() {
}) })
return nil return nil
}) })
return err
} }
+21 -16
View File
@@ -3,6 +3,7 @@ package controller
import ( import (
"github.com/tinyauthapp/tinyauth/internal/model" "github.com/tinyauthapp/tinyauth/internal/model"
"github.com/tinyauthapp/tinyauth/internal/utils/logger" "github.com/tinyauthapp/tinyauth/internal/utils/logger"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -71,29 +72,33 @@ type AppContextResponse struct {
App ACRApp `json:"app"` App ACRApp `json:"app"`
} }
type ContextController struct { type ContextControllerInput struct {
log *logger.Logger dig.In
config model.Config
runtime model.RuntimeConfig Log *logger.Logger
Config *model.Config
Runtime *model.RuntimeConfig
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
} }
func NewContextController( type ContextController struct {
log *logger.Logger, log *logger.Logger
config model.Config, config *model.Config
runtimeConfig model.RuntimeConfig, runtime *model.RuntimeConfig
router *gin.RouterGroup, }
) *ContextController {
func NewContextController(i ContextControllerInput) *ContextController {
controller := &ContextController{ controller := &ContextController{
log: log, log: i.Log,
config: config, config: i.Config,
runtime: runtimeConfig, runtime: i.Runtime,
} }
if !config.UI.WarningsEnabled { if !i.Config.UI.WarningsEnabled {
log.App.Warn().Msg("UI warnings are disabled. This may lead to security issues if you are not careful. Make sure to enable warnings in production environments.") i.Log.App.Warn().Msg("UI warnings are disabled. This may lead to security issues if you are not careful. Make sure to enable warnings in production environments.")
} }
contextGroup := router.Group("/context") contextGroup := i.RouterGroup.Group("/context")
contextGroup.GET("/user", controller.userContextHandler) contextGroup.GET("/user", controller.userContextHandler)
contextGroup.GET("/app", controller.appContextHandler) contextGroup.GET("/app", controller.appContextHandler)
+13 -4
View File
@@ -1,15 +1,24 @@
package controller package controller
import "github.com/gin-gonic/gin" import (
"github.com/gin-gonic/gin"
"go.uber.org/dig"
)
type HealthController struct { type HealthController struct {
} }
func NewHealthController(router *gin.RouterGroup) *HealthController { type HealthControllerInput struct {
dig.In
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
}
func NewHealthController(i HealthControllerInput) *HealthController {
controller := &HealthController{} controller := &HealthController{}
router.GET("/healthz", controller.healthHandler) i.RouterGroup.GET("/healthz", controller.healthHandler)
router.HEAD("/healthz", controller.healthHandler) i.RouterGroup.HEAD("/healthz", controller.healthHandler)
return controller return controller
} }
+19 -14
View File
@@ -11,6 +11,7 @@ import (
"github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/service"
"github.com/tinyauthapp/tinyauth/internal/utils" "github.com/tinyauthapp/tinyauth/internal/utils"
"github.com/tinyauthapp/tinyauth/internal/utils/logger" "github.com/tinyauthapp/tinyauth/internal/utils/logger"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/google/go-querystring/query" "github.com/google/go-querystring/query"
@@ -22,26 +23,30 @@ type OAuthRequest struct {
type OAuthController struct { type OAuthController struct {
log *logger.Logger log *logger.Logger
config model.Config config *model.Config
runtime model.RuntimeConfig runtime *model.RuntimeConfig
auth *service.AuthService auth *service.AuthService
} }
func NewOAuthController( type OAuthControllerInput struct {
log *logger.Logger, dig.In
config model.Config,
runtimeConfig model.RuntimeConfig, Log *logger.Logger
router *gin.RouterGroup, Config *model.Config
auth *service.AuthService, RuntimeConfig *model.RuntimeConfig
) *OAuthController { RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
AuthService *service.AuthService
}
func NewOAuthController(i OAuthControllerInput) *OAuthController {
controller := &OAuthController{ controller := &OAuthController{
log: log, log: i.Log,
config: config, config: i.Config,
runtime: runtimeConfig, runtime: i.RuntimeConfig,
auth: auth, auth: i.AuthService,
} }
oauthGroup := router.Group("/oauth") oauthGroup := i.RouterGroup.Group("/oauth")
oauthGroup.GET("/url/:provider", controller.oauthURLHandler) oauthGroup.GET("/url/:provider", controller.oauthURLHandler)
oauthGroup.GET("/callback/:provider", controller.oauthCallbackHandler) oauthGroup.GET("/callback/:provider", controller.oauthCallbackHandler)
+19 -13
View File
@@ -11,6 +11,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding" "github.com/gin-gonic/gin/binding"
"github.com/google/go-querystring/query" "github.com/google/go-querystring/query"
"go.uber.org/dig"
"github.com/tinyauthapp/tinyauth/internal/model" "github.com/tinyauthapp/tinyauth/internal/model"
"github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/service"
@@ -30,7 +31,7 @@ type authorizeErrorParams struct {
type OIDCController struct { type OIDCController struct {
log *logger.Logger log *logger.Logger
oidc *service.OIDCService oidc *service.OIDCService
runtime model.RuntimeConfig runtime *model.RuntimeConfig
} }
type AuthorizeCallback struct { type AuthorizeCallback struct {
@@ -78,22 +79,27 @@ type AuthorizeCompleteRequest struct {
Ticket string `json:"ticket" binding:"required"` Ticket string `json:"ticket" binding:"required"`
} }
func NewOIDCController( type OIDCControllerInput struct {
log *logger.Logger, dig.In
oidcService *service.OIDCService,
runtimeConfig model.RuntimeConfig, Log *logger.Logger
router *gin.RouterGroup, OIDCService *service.OIDCService
mainRouter *gin.RouterGroup) *OIDCController { RuntimeConfig *model.RuntimeConfig
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
MainRouter *gin.RouterGroup `name:"mainRouterGroup"`
}
func NewOIDCController(i OIDCControllerInput) *OIDCController {
controller := &OIDCController{ controller := &OIDCController{
log: log, log: i.Log,
oidc: oidcService, oidc: i.OIDCService,
runtime: runtimeConfig, runtime: i.RuntimeConfig,
} }
mainRouter.POST("/authorize", controller.authorize) i.MainRouter.POST("/authorize", controller.authorize)
mainRouter.GET("/authorize", controller.authorize) i.MainRouter.GET("/authorize", controller.authorize)
oidcGroup := router.Group("/oidc") oidcGroup := i.RouterGroup.Group("/oidc")
oidcGroup.POST("/authorize-complete", controller.authorizeComplete) oidcGroup.POST("/authorize-complete", controller.authorizeComplete)
oidcGroup.POST("/token", controller.Token) oidcGroup.POST("/token", controller.Token)
oidcGroup.GET("/userinfo", controller.Userinfo) oidcGroup.GET("/userinfo", controller.Userinfo)
+20 -15
View File
@@ -13,6 +13,7 @@ import (
"github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/service"
"github.com/tinyauthapp/tinyauth/internal/utils" "github.com/tinyauthapp/tinyauth/internal/utils"
"github.com/tinyauthapp/tinyauth/internal/utils/logger" "github.com/tinyauthapp/tinyauth/internal/utils/logger"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/google/go-querystring/query" "github.com/google/go-querystring/query"
@@ -53,29 +54,33 @@ type ProxyContext struct {
type ProxyController struct { type ProxyController struct {
log *logger.Logger log *logger.Logger
runtime model.RuntimeConfig runtime *model.RuntimeConfig
acls *service.AccessControlsService acls *service.AccessControlsService
auth *service.AuthService auth *service.AuthService
policyEngine *service.PolicyEngine policyEngine *service.PolicyEngine
} }
func NewProxyController( type ProxyControllerInput struct {
log *logger.Logger, dig.In
runtime model.RuntimeConfig,
router *gin.RouterGroup, Log *logger.Logger
acls *service.AccessControlsService, RuntimeConfig *model.RuntimeConfig
auth *service.AuthService, RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
policyEngine *service.PolicyEngine, ACLsService *service.AccessControlsService
) *ProxyController { AuthService *service.AuthService
PolicyEngine *service.PolicyEngine
}
func NewProxyController(i ProxyControllerInput) *ProxyController {
controller := &ProxyController{ controller := &ProxyController{
log: log, log: i.Log,
runtime: runtime, runtime: i.RuntimeConfig,
acls: acls, acls: i.ACLsService,
auth: auth, auth: i.AuthService,
policyEngine: policyEngine, policyEngine: i.PolicyEngine,
} }
proxyGroup := router.Group("/auth") proxyGroup := i.RouterGroup.Group("/auth")
proxyGroup.Any("/:proxy", controller.proxyHandler) proxyGroup.Any("/:proxy", controller.proxyHandler)
return controller return controller
+13 -8
View File
@@ -5,25 +5,30 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/tinyauthapp/tinyauth/internal/model" "github.com/tinyauthapp/tinyauth/internal/model"
"go.uber.org/dig"
) )
type ResourcesController struct { type ResourcesController struct {
config model.Config config *model.Config
fileServer http.Handler fileServer http.Handler
} }
func NewResourcesController( type ResourcesControllerInput struct {
config model.Config, dig.In
router *gin.RouterGroup,
) *ResourcesController { RouterGroup *gin.RouterGroup `name:"mainRouterGroup"`
fileServer := http.StripPrefix("/resources", http.FileServer(http.Dir(config.Resources.Path))) Config *model.Config
}
func NewResourcesController(i ResourcesControllerInput) *ResourcesController {
fileServer := http.StripPrefix("/resources", http.FileServer(http.Dir(i.Config.Resources.Path)))
controller := &ResourcesController{ controller := &ResourcesController{
config: config, config: i.Config,
fileServer: fileServer, fileServer: fileServer,
} }
router.GET("/resources/*resource", controller.resourcesHandler) i.RouterGroup.GET("/resources/*resource", controller.resourcesHandler)
return controller return controller
} }
+16 -11
View File
@@ -11,6 +11,7 @@ import (
"github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/service"
"github.com/tinyauthapp/tinyauth/internal/utils" "github.com/tinyauthapp/tinyauth/internal/utils"
"github.com/tinyauthapp/tinyauth/internal/utils/logger" "github.com/tinyauthapp/tinyauth/internal/utils/logger"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/pquerna/otp/totp" "github.com/pquerna/otp/totp"
@@ -27,23 +28,27 @@ type TotpRequest struct {
type UserController struct { type UserController struct {
log *logger.Logger log *logger.Logger
runtime model.RuntimeConfig runtime *model.RuntimeConfig
auth *service.AuthService auth *service.AuthService
} }
func NewUserController( type UserControllerInput struct {
log *logger.Logger, dig.In
runtimeConfig model.RuntimeConfig,
router *gin.RouterGroup, Log *logger.Logger
auth *service.AuthService, RuntimeConfig *model.RuntimeConfig
) *UserController { RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
AuthService *service.AuthService
}
func NewUserController(i UserControllerInput) *UserController {
controller := &UserController{ controller := &UserController{
log: log, log: i.Log,
runtime: runtimeConfig, runtime: i.RuntimeConfig,
auth: auth, auth: i.AuthService,
} }
userGroup := router.Group("/user") userGroup := i.RouterGroup.Group("/user")
userGroup.POST("/login", controller.loginHandler) userGroup.POST("/login", controller.loginHandler)
userGroup.POST("/logout", controller.logoutHandler) userGroup.POST("/logout", controller.logoutHandler)
userGroup.POST("/totp", controller.totpHandler) userGroup.POST("/totp", controller.totpHandler)
+12 -4
View File
@@ -6,6 +6,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/service"
"go.uber.org/dig"
) )
type OpenIDConnectConfiguration struct { type OpenIDConnectConfiguration struct {
@@ -30,13 +31,20 @@ type WellKnownController struct {
oidc *service.OIDCService oidc *service.OIDCService
} }
func NewWellKnownController(oidc *service.OIDCService, router *gin.RouterGroup) *WellKnownController { type WellKnownControllerInput struct {
dig.In
OIDCService *service.OIDCService
RouterGroup *gin.RouterGroup `name:"apiRouterGroup"`
}
func NewWellKnownController(i WellKnownControllerInput) *WellKnownController {
controller := &WellKnownController{ controller := &WellKnownController{
oidc: oidc, oidc: i.OIDCService,
} }
router.GET("/.well-known/openid-configuration", controller.OpenIDConnectConfiguration) i.RouterGroup.GET("/.well-known/openid-configuration", controller.OpenIDConnectConfiguration)
router.GET("/.well-known/jwks.json", controller.JWKS) i.RouterGroup.GET("/.well-known/jwks.json", controller.JWKS)
return controller return controller
} }
+18 -13
View File
@@ -11,6 +11,7 @@ import (
"github.com/tinyauthapp/tinyauth/internal/service" "github.com/tinyauthapp/tinyauth/internal/service"
"github.com/tinyauthapp/tinyauth/internal/utils" "github.com/tinyauthapp/tinyauth/internal/utils"
"github.com/tinyauthapp/tinyauth/internal/utils/logger" "github.com/tinyauthapp/tinyauth/internal/utils/logger"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -37,25 +38,29 @@ var (
type ContextMiddleware struct { type ContextMiddleware struct {
log *logger.Logger log *logger.Logger
runtime model.RuntimeConfig runtime *model.RuntimeConfig
auth *service.AuthService auth *service.AuthService
broker *service.OAuthBrokerService broker *service.OAuthBrokerService
tailscale *service.TailscaleService tailscale *service.TailscaleService
} }
func NewContextMiddleware( type ContextMiddlewareInput struct {
log *logger.Logger, dig.In
runtime model.RuntimeConfig,
auth *service.AuthService, Log *logger.Logger
broker *service.OAuthBrokerService, RuntimeConfig *model.RuntimeConfig
tailscale *service.TailscaleService, AuthService *service.AuthService
) *ContextMiddleware { BrokerService *service.OAuthBrokerService
TailscaleService *service.TailscaleService
}
func NewContextMiddleware(i ContextMiddlewareInput) *ContextMiddleware {
return &ContextMiddleware{ return &ContextMiddleware{
log: log, log: i.Log,
runtime: runtime, runtime: i.RuntimeConfig,
auth: auth, auth: i.AuthService,
broker: broker, broker: i.BrokerService,
tailscale: tailscale, tailscale: i.TailscaleService,
} }
} }
+7 -1
View File
@@ -9,6 +9,7 @@ import (
"time" "time"
"github.com/tinyauthapp/tinyauth/internal/assets" "github.com/tinyauthapp/tinyauth/internal/assets"
"go.uber.org/dig"
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
) )
@@ -18,7 +19,12 @@ type UIMiddleware struct {
uiFileServer http.Handler uiFileServer http.Handler
} }
func NewUIMiddleware() (*UIMiddleware, error) { // for future use if we need to inject dependencies into the middleware
type UIMiddlewareInput struct {
dig.In
}
func NewUIMiddleware(_ UIMiddlewareInput) (*UIMiddleware, error) {
m := &UIMiddleware{} m := &UIMiddleware{}
ui, err := fs.Sub(assets.FrontendAssets, "dist") ui, err := fs.Sub(assets.FrontendAssets, "dist")
+9 -2
View File
@@ -6,6 +6,7 @@ import (
"github.com/gin-gonic/gin" "github.com/gin-gonic/gin"
"github.com/tinyauthapp/tinyauth/internal/utils/logger" "github.com/tinyauthapp/tinyauth/internal/utils/logger"
"go.uber.org/dig"
) )
// See context middleware for explanation of why we have to do this // See context middleware for explanation of why we have to do this
@@ -21,9 +22,15 @@ type ZerologMiddleware struct {
log *logger.Logger log *logger.Logger
} }
func NewZerologMiddleware(log *logger.Logger) *ZerologMiddleware { type ZerologMiddlewareInput struct {
dig.In
Log *logger.Logger
}
func NewZerologMiddleware(i ZerologMiddlewareInput) *ZerologMiddleware {
return &ZerologMiddleware{ return &ZerologMiddleware{
log: log, log: i.Log,
} }
} }