diff --git a/internal/server/api/apis.go b/internal/server/api/apis.go new file mode 100644 index 0000000..b1cc193 --- /dev/null +++ b/internal/server/api/apis.go @@ -0,0 +1,56 @@ +package api + +import ( + "github.com/gin-gonic/gin" + + "ruben/inventory2/internal/domains/accounts" + etsy_platform "ruben/inventory2/internal/domains/platforms/etsy" + "ruben/inventory2/internal/domains/raw_events" + "ruben/inventory2/internal/logging" + accounts_api "ruben/inventory2/internal/server/api/accounts" + auth_api "ruben/inventory2/internal/server/api/auth" + sse_api "ruben/inventory2/internal/server/api/sse" + "ruben/inventory2/internal/server/api/webhooks" + etsy_webhooks "ruben/inventory2/internal/server/api/webhooks/etsy" + "ruben/inventory2/internal/server/middleware" + "ruben/inventory2/internal/server/sse" +) + +func Routes( + r *gin.RouterGroup, + logger *logging.Logger, + auth *middleware.Auth, + sq *sse.Queue, + accts *accounts.Store, + unp *middleware.UpdateNotificationPublisher, + rawEvents *raw_events.Store, + etsy *etsy_platform.Platform, +) { + auth_api.Routes( + r.Group("/auth"), + logger.WithGroup("/auth"), + auth.GetAuthenticator(), + ) + sse_api.Routes( + r.Group("/events", auth.Authenticate()), + logger.WithGroup("/events"), + sq, + ) + accounts_api.Routes( + r.Group("/accounts", auth.Authenticate()), + logger.WithGroup("/accounts"), + accts, + unp.Group("/accounts"), + ) + webhooks.Routes( + r.Group("/webhooks"), + logger.WithGroup("/webhooks"), + rawEvents, + etsy, + webhooks.Config{ + Etsy: etsy_webhooks.Config{ + OAuthRedirectURIWithAcctIDParam: "/oauth/accounts/:acctID/auth_code", + }, + }, + ) +} diff --git a/internal/server/middleware/auth.go b/internal/server/middleware/auth.go index 9efed80..911af10 100644 --- a/internal/server/middleware/auth.go +++ b/internal/server/middleware/auth.go @@ -49,6 +49,10 @@ func NewAuth( } } +func (a *Auth) GetAuthenticator() *authentication.Authenticator { + return a.auth +} + // Identify will add an Identity to the context that can then be retrieved via GetIdentity. func (a *Auth) Identify(c *gin.Context) { if err := a.addIdentity(c); err != nil { diff --git a/internal/server/middleware/events.go b/internal/server/middleware/events.go index 5940742..1007e2f 100644 --- a/internal/server/middleware/events.go +++ b/internal/server/middleware/events.go @@ -29,12 +29,17 @@ func NewUpdateNotificationPublisher( } } +// Trim produces an *UpdateNotificationPublisher with the pathPattern +// trimmed from events otherwise published by p. func (p *UpdateNotificationPublisher) Trim(pathPattern string) *UpdateNotificationPublisher { p2 := *p p2.trimBasePath = path.Join(p2.trimBasePath, pathPattern) return &p2 } +// Group produces an *UpdateNotificationPublisher with the pathPattern +// appended to the base path used by p, if any, in publishing events. +// If no base path was set to p, then pathPattern becomes the base path. func (p *UpdateNotificationPublisher) Group(pathPattern string) *UpdateNotificationPublisher { p2 := *p p2.basePathPattern = path.Join(p2.basePathPattern, pathPattern) diff --git a/internal/server/server.go b/internal/server/server.go index d435638..9d643d9 100644 --- a/internal/server/server.go +++ b/internal/server/server.go @@ -13,19 +13,13 @@ import ( etsy_platform "ruben/inventory2/internal/domains/platforms/etsy" "ruben/inventory2/internal/domains/raw_events" "ruben/inventory2/internal/logging" - accounts_api "ruben/inventory2/internal/server/api/accounts" - auth_api "ruben/inventory2/internal/server/api/auth" - sse_api "ruben/inventory2/internal/server/api/sse" + "ruben/inventory2/internal/server/api" templates_api "ruben/inventory2/internal/server/api/templates" - "ruben/inventory2/internal/server/api/webhooks" - etsy_webhooks "ruben/inventory2/internal/server/api/webhooks/etsy" "ruben/inventory2/internal/server/middleware" "ruben/inventory2/internal/server/response" "ruben/inventory2/internal/server/sse" ) -// r gin.IRouter, // TODO: use this everywhere - type Router struct { *gin.Engine sse *sse.Queue @@ -84,9 +78,6 @@ func NewRouter( // api endpoints - api := r.Group("/api") - apiLogger := logger.WithGroup("/api") - // sse setup sq := sse.NewQueue() unp := middleware.NewUpdateNotificationPublisher( @@ -94,33 +85,15 @@ func NewRouter( sq, ).Trim("/api") - // TODO: group these into a single unifieds 'apis' object/package? - auth_api.Routes( - api.Group("/auth"), - apiLogger.WithGroup("/auth"), - auth, - ) - sse_api.Routes( - api.Group("/events", authM.Authenticate()), - apiLogger.WithGroup("/events"), + api.Routes( + r.Group("/api"), + logger.WithGroup("/api"), + authM, sq, - ) - accounts_api.Routes( - api.Group("/accounts", authM.Authenticate()), - apiLogger.WithGroup("/accounts"), accts, - unp.Group("/accounts"), - ) - webhooks.Routes( - api.Group("/webhooks"), - apiLogger.WithGroup("/webhooks"), + unp, rawEvents, etsy, - webhooks.Config{ - Etsy: etsy_webhooks.Config{ - OAuthRedirectURIWithAcctIDParam: "/oauth/accounts/:acctID/auth_code", - }, - }, ) return &Router{