From 555a484af8a7fa930e4f0b8f2efeca0e86af7082 Mon Sep 17 00:00:00 2001 From: Vincent Boutour Date: Fri, 28 Jun 2024 12:51:40 +0200 Subject: [PATCH] refactor: Remove http logic from main Signed-off-by: Vincent Boutour --- cmd/fibr/adapters.go | 20 ++++---- cmd/fibr/background.go | 22 --------- cmd/fibr/clients.go | 6 +-- cmd/fibr/fibr.go | 13 ++---- cmd/fibr/port.go | 11 +++-- cmd/fibr/{service.go => services.go} | 69 +++++++++++++--------------- go.mod | 6 +-- go.sum | 12 ++--- 8 files changed, 66 insertions(+), 93 deletions(-) delete mode 100644 cmd/fibr/background.go rename cmd/fibr/{service.go => services.go} (52%) diff --git a/cmd/fibr/adapters.go b/cmd/fibr/adapters.go index 33c611a9..11dcca37 100644 --- a/cmd/fibr/adapters.go +++ b/cmd/fibr/adapters.go @@ -14,24 +14,22 @@ type adapters struct { } func newAdapters(config configuration, clients clients) (adapters, error) { - storageService, err := absto.New(config.absto, clients.telemetry.TracerProvider()) + var output adapters + var err error + + output.storage, err = absto.New(config.absto, clients.telemetry.TracerProvider()) if err != nil { - return adapters{}, err + return output, err } - filteredStorage, err := storage.Get(config.storage, storageService) + output.filteredStorage, err = storage.Get(config.storage, output.storage) if err != nil { - return adapters{}, err + return output, err } - var exclusiveService exclusive.Service if clients.redis.Enabled() { - exclusiveService = exclusive.New(clients.redis) + output.exclusiveService = exclusive.New(clients.redis) } - return adapters{ - storage: storageService, - filteredStorage: filteredStorage, - exclusiveService: exclusiveService, - }, nil + return output, nil } diff --git a/cmd/fibr/background.go b/cmd/fibr/background.go deleted file mode 100644 index 6f002b68..00000000 --- a/cmd/fibr/background.go +++ /dev/null @@ -1,22 +0,0 @@ -package main - -import "context" - -type Starter interface { - Start(context.Context) - Done() <-chan struct{} -} - -type Starters []Starter - -func (s Starters) Start(ctx context.Context) { - for _, starter := range s { - go starter.Start(ctx) - } -} - -func (s Starters) GracefulWait() { - for _, starter := range s { - <-starter.Done() - } -} diff --git a/cmd/fibr/clients.go b/cmd/fibr/clients.go index 83e1d0e6..e0c3b755 100644 --- a/cmd/fibr/clients.go +++ b/cmd/fibr/clients.go @@ -24,10 +24,8 @@ type clients struct { } func newClients(ctx context.Context, config configuration) (clients, error) { - var ( - output clients - err error - ) + var output clients + var err error logger.Init(ctx, config.logger) diff --git a/cmd/fibr/fibr.go b/cmd/fibr/fibr.go index ae20edb0..77500656 100644 --- a/cmd/fibr/fibr.go +++ b/cmd/fibr/fibr.go @@ -4,9 +4,7 @@ import ( "context" "github.com/ViBiOh/httputils/v4/pkg/alcotest" - "github.com/ViBiOh/httputils/v4/pkg/httputils" "github.com/ViBiOh/httputils/v4/pkg/logger" - "github.com/ViBiOh/httputils/v4/pkg/owasp" "github.com/ViBiOh/httputils/v4/pkg/server" ) @@ -25,19 +23,18 @@ func main() { adapters, err := newAdapters(config, clients) logger.FatalfOnErr(ctx, err, "adapters") - endCtx := clients.health.EndCtx() - - services, err := newServices(endCtx, config, clients, adapters) + services, err := newServices(ctx, config, clients, adapters) logger.FatalfOnErr(ctx, err, "services") + endCtx := clients.health.EndCtx() + go services.Start(adapters, clients.health.DoneCtx(), endCtx) defer services.Close() - port := newPort(config, services) + port := newPort(clients, services) - go services.server.Start(endCtx, httputils.Handler(port, clients.health, clients.telemetry.Middleware("http"), owasp.New(config.owasp).Middleware)) + go services.server.Start(endCtx, port) clients.health.WaitForTermination(services.server.Done()) - server.GracefulWait(services.server.Done()) } diff --git a/cmd/fibr/port.go b/cmd/fibr/port.go index 61b2adef..b3c61a99 100644 --- a/cmd/fibr/port.go +++ b/cmd/fibr/port.go @@ -2,12 +2,17 @@ package main import ( "net/http" + + "github.com/ViBiOh/httputils/v4/pkg/httputils" ) -func newPort(config configuration, services services) http.Handler { +func newPort(clients clients, services services) http.Handler { mux := http.NewServeMux() - mux.Handle(config.renderer.PathPrefix+"/", services.renderer.NewServeMux(services.fibr.TemplateFunc)) + services.renderer.RegisterMux(mux, services.fibr.TemplateFunc) - return mux + return httputils.Handler(mux, clients.health, + clients.telemetry.Middleware("http"), + services.owasp.Middleware, + ) } diff --git a/cmd/fibr/service.go b/cmd/fibr/services.go similarity index 52% rename from cmd/fibr/service.go rename to cmd/fibr/services.go index 5e68ff71..3a7f719c 100644 --- a/cmd/fibr/service.go +++ b/cmd/fibr/services.go @@ -19,6 +19,7 @@ import ( "github.com/ViBiOh/fibr/pkg/thumbnail" "github.com/ViBiOh/fibr/pkg/webhook" "github.com/ViBiOh/httputils/v4/pkg/amqphandler" + "github.com/ViBiOh/httputils/v4/pkg/owasp" "github.com/ViBiOh/httputils/v4/pkg/renderer" "github.com/ViBiOh/httputils/v4/pkg/server" "go.opentelemetry.io/otel/trace" @@ -28,86 +29,82 @@ import ( var content embed.FS type services struct { + server *server.Server + owasp owasp.Service + renderer *renderer.Service + fibr fibr.Service eventBus provider.EventBus webhook *webhook.Service share *share.Service - renderer *renderer.Service amqpThumbnail *amqphandler.Service amqpExif *amqphandler.Service - server *server.Server sanitizer sanitizer.Service metadata metadata.Service thumbnail thumbnail.Service } func newServices(ctx context.Context, config configuration, clients clients, adapters adapters) (services, error) { - eventBus, err := provider.NewEventBus(provider.MaxConcurrency, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider()) + var output services + var err error + + output.server = server.New(config.server) + output.owasp = owasp.New(config.owasp) + + output.eventBus, err = provider.NewEventBus(provider.MaxConcurrency, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider()) if err != nil { - return services{}, err + return output, err } - thumbnailService, err := thumbnail.New(ctx, config.thumbnail, adapters.storage, clients.redis, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), clients.amqp) + output.thumbnail, err = thumbnail.New(ctx, config.thumbnail, adapters.storage, clients.redis, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), clients.amqp) if err != nil { - return services{}, err + return output, err } - rendererService, err := renderer.New(ctx, config.renderer, content, fibr.FuncMap, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider()) + output.renderer, err = renderer.New(ctx, config.renderer, content, fibr.FuncMap, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider()) if err != nil { - return services{}, err + return output, err } - metadataService, err := metadata.New(ctx, config.metadata, adapters.storage, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), clients.amqp, clients.redis, adapters.exclusiveService) + output.metadata, err = metadata.New(ctx, config.metadata, adapters.storage, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), clients.amqp, clients.redis, adapters.exclusiveService) if err != nil { - return services{}, err + return output, err } - webhookService := webhook.New(config.webhook, adapters.storage, clients.telemetry.MeterProvider(), clients.redis, rendererService, thumbnailService, adapters.exclusiveService) + webhookService := webhook.New(config.webhook, adapters.storage, clients.telemetry.MeterProvider(), clients.redis, output.renderer, output.thumbnail, adapters.exclusiveService) - shareService, err := share.New(config.share, adapters.storage, clients.redis, adapters.exclusiveService) + output.share, err = share.New(config.share, adapters.storage, clients.redis, adapters.exclusiveService) if err != nil { - return services{}, err + return output, err } - amqpThumbnailService, err := amqphandler.New(config.amqpThumbnail, clients.amqp, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), thumbnailService.AMQPHandler) + output.amqpThumbnail, err = amqphandler.New(config.amqpThumbnail, clients.amqp, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), output.thumbnail.AMQPHandler) if err != nil { - return services{}, err + return output, err } - amqpExifService, err := amqphandler.New(config.amqpExif, clients.amqp, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), metadataService.AMQPHandler) + output.amqpExif, err = amqphandler.New(config.amqpExif, clients.amqp, clients.telemetry.MeterProvider(), clients.telemetry.TracerProvider(), output.metadata.AMQPHandler) if err != nil { - return services{}, err + return output, err } - searchService := search.New(adapters.filteredStorage, thumbnailService, metadataService, adapters.exclusiveService, clients.telemetry.TracerProvider()) + searchService := search.New(adapters.filteredStorage, output.thumbnail, output.metadata, adapters.exclusiveService, clients.telemetry.TracerProvider()) - crudService, err := crud.New(config.crud, adapters.storage, adapters.filteredStorage, rendererService, shareService, webhookService, thumbnailService, metadataService, searchService, eventBus.Push, clients.telemetry.TracerProvider()) + crudService, err := crud.New(config.crud, adapters.storage, adapters.filteredStorage, output.renderer, output.share, webhookService, output.thumbnail, output.metadata, searchService, output.eventBus.Push, clients.telemetry.TracerProvider()) if err != nil { - return services{}, err + return output, err } - sanitizerService := sanitizer.New(config.sanitizer, adapters.filteredStorage, adapters.exclusiveService, crudService, eventBus.Push) + output.sanitizer = sanitizer.New(config.sanitizer, adapters.filteredStorage, adapters.exclusiveService, crudService, output.eventBus.Push) var middlewareService provider.Auth if !config.disableAuth { middlewareService = newLoginService(clients.telemetry.TracerProvider(), config.basic) } - fibrService := fibr.New(&crudService, rendererService, shareService, webhookService, middlewareService) - - return services{ - eventBus: eventBus, - amqpThumbnail: amqpThumbnailService, - amqpExif: amqpExifService, - fibr: fibrService, - sanitizer: sanitizerService, - renderer: rendererService, - webhook: webhookService, - share: shareService, - thumbnail: thumbnailService, - metadata: metadataService, - server: server.New(config.server), - }, nil + output.fibr = fibr.New(&crudService, output.renderer, output.share, webhookService, middlewareService) + + return output, nil } func (s services) Start(adapters adapters, doneCtx, endCtx context.Context) { diff --git a/go.mod b/go.mod index eee6baec..767b102c 100644 --- a/go.mod +++ b/go.mod @@ -10,7 +10,7 @@ require ( github.com/ViBiOh/auth/v2 v2.20.1 github.com/ViBiOh/exas v0.8.1 github.com/ViBiOh/flags v1.5.0 - github.com/ViBiOh/httputils/v4 v4.77.2 + github.com/ViBiOh/httputils/v4 v4.77.3 github.com/ViBiOh/vith v0.6.0 github.com/rabbitmq/amqp091-go v1.10.0 github.com/redis/go-redis/v9 v9.5.3 @@ -56,8 +56,8 @@ require ( golang.org/x/net v0.26.0 // indirect golang.org/x/sys v0.21.0 // indirect golang.org/x/term v0.21.0 // indirect - google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 // indirect - google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 // indirect + google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d // indirect + google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d // indirect google.golang.org/grpc v1.64.0 // indirect google.golang.org/protobuf v1.34.2 // indirect gopkg.in/ini.v1 v1.67.0 // indirect diff --git a/go.sum b/go.sum index 65dbf289..77136fc7 100644 --- a/go.sum +++ b/go.sum @@ -8,8 +8,8 @@ github.com/ViBiOh/exas v0.8.1 h1:bXrWK99ze7MLMfjD+pp/NHngOSkR1eqcCVWlNNxLT/M= github.com/ViBiOh/exas v0.8.1/go.mod h1:aldybvPY4yJQlvUpq6GJluGxH+7prpaJjDQ03t3VvCw= github.com/ViBiOh/flags v1.5.0 h1:nwuFS8tAwtV6rTPpv2pCB+r12WjZYLjluW7yT+SeVpQ= github.com/ViBiOh/flags v1.5.0/go.mod h1:39UMuTnKsIp6walgD8dK99KRCb4DJt9vPtbWehHh1T0= -github.com/ViBiOh/httputils/v4 v4.77.2 h1:nRWRymsKrWhnQESVG0lDqQOlJ57atU19MKJlKkByiCs= -github.com/ViBiOh/httputils/v4 v4.77.2/go.mod h1:d+KMqLg2gLDaB4RXVDEuOZCY6EVOYEaLiMQgg7SXAWs= +github.com/ViBiOh/httputils/v4 v4.77.3 h1:XlBd+U0yF/geT68mEiBa6T8/1HG6oqXorTPkkcyaBq0= +github.com/ViBiOh/httputils/v4 v4.77.3/go.mod h1:ZtZ2sDUi2ZNDOgGyDIUQJHBGam+EgfdCzPXQYy/ipa8= github.com/ViBiOh/vith v0.6.0 h1:bdLmwgqUEWi3ivShtAhtM9gOZlWQzvZi2Z5b0BRSB1U= github.com/ViBiOh/vith v0.6.0/go.mod h1:eRqtDU2uB8g85vll4spbnCV93DHyHNAYwXCMIBH1GuQ= github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs= @@ -118,10 +118,10 @@ golang.org/x/term v0.21.0 h1:WVXCp+/EBEHOj53Rvu+7KiT/iElMrO8ACK16SMZ3jaA= golang.org/x/term v0.21.0/go.mod h1:ooXLefLobQVslOqselCNF4SxFAaoS6KujMbsGzSDmX0= golang.org/x/text v0.16.0 h1:a94ExnEXNtEwYLGJSIUxnWoxoRz/ZcCsV63ROupILh4= golang.org/x/text v0.16.0/go.mod h1:GhwF1Be+LQoKShO3cGOHzqOgRrGaYc9AvblQOmPVHnI= -google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4 h1:MuYw1wJzT+ZkybKfaOXKp5hJiZDn2iHaXRw0mRYdHSc= -google.golang.org/genproto/googleapis/api v0.0.0-20240617180043-68d350f18fd4/go.mod h1:px9SlOOZBg1wM1zdnr8jEL4CNGUBZ+ZKYtNPApNQc4c= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4 h1:Di6ANFilr+S60a4S61ZM00vLdw0IrQOSMS2/6mrnOU0= -google.golang.org/genproto/googleapis/rpc v0.0.0-20240617180043-68d350f18fd4/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= +google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d h1:Aqf0fiIdUQEj0Gn9mKFFXoQfTTEaNopWpfVyYADxiSg= +google.golang.org/genproto/googleapis/api v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Od4k8V1LQSizPRUK4OzZ7TBE/20k+jPczUDAEyvn69Y= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d h1:k3zyW3BYYR30e8v3x0bTDdE9vpYFjZHK+HcyqkrppWk= +google.golang.org/genproto/googleapis/rpc v0.0.0-20240624140628-dc46fd24d27d/go.mod h1:Ue6ibwXGpU+dqIcODieyLOcgj7z8+IcskoNIgZxtrFY= google.golang.org/grpc v1.64.0 h1:KH3VH9y/MgNQg1dE7b3XfVK0GsPSIzJwdF617gUSbvY= google.golang.org/grpc v1.64.0/go.mod h1:oxjF8E3FBnjp+/gVFYdWacaLDx9na1aqy9oovLpxQYg= google.golang.org/protobuf v1.34.2 h1:6xV6lTsCfpGD21XK49h7MhtcApnLqkfYgPcdHftf6hg=