11package di
22
33import (
4+ "context"
45 "fmt"
6+ "io"
57 "log"
68 "os"
79 "time"
@@ -21,6 +23,7 @@ import (
2123 "github.com/NdoleStudio/http-sms-manager/pkg/handlers"
2224 "github.com/NdoleStudio/http-sms-manager/pkg/telemetry"
2325 "github.com/NdoleStudio/http-sms-manager/pkg/validators"
26+ zlg "github.com/mark-ignacio/zerolog-gcp"
2427 "github.com/rs/zerolog"
2528 "gorm.io/driver/postgres"
2629 gormLogger "gorm.io/gorm/logger"
@@ -48,6 +51,10 @@ func NewContainer(projectID string) (container *Container) {
4851 container .RegisterMessageThreadRoutes ()
4952 container .RegisterMessageThreadListeners ()
5053
54+ container .RegisterHeartbeatRoutes ()
55+ container .RegisterHeartbeatListeners ()
56+
57+ // this has to be last since it registers the /* route
5158 container .RegisterSwaggerRoutes ()
5259
5360 return container
@@ -139,6 +146,26 @@ func (container *Container) MessageHandlerValidator() (validator *validators.Mes
139146 )
140147}
141148
149+ // HeartbeatHandler creates a new instance of handlers.HeartbeatHandler
150+ func (container * Container ) HeartbeatHandler () (h * handlers.HeartbeatHandler ) {
151+ container .logger .Debug (fmt .Sprintf ("creating %T" , h ))
152+ return handlers .NewHeartbeatHandler (
153+ container .Logger (),
154+ container .Tracer (),
155+ container .HeartbeatHandlerValidator (),
156+ container .HeartbeatService (),
157+ )
158+ }
159+
160+ // HeartbeatHandlerValidator creates a new instance of validators.HeartbeatHandlerValidator
161+ func (container * Container ) HeartbeatHandlerValidator () (validator * validators.HeartbeatHandlerValidator ) {
162+ container .logger .Debug (fmt .Sprintf ("creating %T" , validator ))
163+ return validators .NewHeartbeatHandlerValidator (
164+ container .Logger (),
165+ container .Tracer (),
166+ )
167+ }
168+
142169// MessageThreadHandler creates a new instance of handlers.MessageThreadHandler
143170func (container * Container ) MessageThreadHandler () (h * handlers.MessageThreadHandler ) {
144171 container .logger .Debug (fmt .Sprintf ("creating %T" , h ))
@@ -216,6 +243,16 @@ func (container *Container) EventListenerLogRepository() (repository repositorie
216243 )
217244}
218245
246+ // HeartbeatService creates a new instance of services.HeartbeatService
247+ func (container * Container ) HeartbeatService () (service * services.HeartbeatService ) {
248+ container .logger .Debug (fmt .Sprintf ("creating %T" , service ))
249+ return services .NewHeartbeatService (
250+ container .Logger (),
251+ container .Tracer (),
252+ container .HeartbeatRepository (),
253+ )
254+ }
255+
219256// MessageThreadService creates a new instance of services.MessageService
220257func (container * Container ) MessageThreadService () (service * services.MessageThreadService ) {
221258 container .logger .Debug (fmt .Sprintf ("creating %T" , service ))
@@ -267,6 +304,20 @@ func (container *Container) RegisterMessageThreadListeners() {
267304 }
268305}
269306
307+ // RegisterHeartbeatListeners registers event listeners for listeners.HeartbeatListener
308+ func (container * Container ) RegisterHeartbeatListeners () {
309+ container .logger .Debug (fmt .Sprintf ("registering listners for %T" , listeners.HeartbeatListener {}))
310+ _ , routes := listeners .NewHeartbeatListener (
311+ container .Logger (),
312+ container .Tracer (),
313+ container .HeartbeatService (),
314+ )
315+
316+ for event , handler := range routes {
317+ container .EventDispatcher ().Subscribe (event , handler )
318+ }
319+ }
320+
270321// MessageService creates a new instance of services.MessageService
271322func (container * Container ) MessageService () (service * services.MessageService ) {
272323 container .logger .Debug (fmt .Sprintf ("creating %T" , service ))
@@ -290,23 +341,52 @@ func (container *Container) RegisterMessageThreadRoutes() {
290341 container .MessageThreadHandler ().RegisterRoutes (container .App ().Group ("v1" ))
291342}
292343
344+ // RegisterHeartbeatRoutes registers routes for the /heartbeats prefix
345+ func (container * Container ) RegisterHeartbeatRoutes () {
346+ container .logger .Debug (fmt .Sprintf ("registering %T routes" , & handlers.HeartbeatHandler {}))
347+ container .HeartbeatHandler ().RegisterRoutes (container .App ().Group ("v1" ))
348+ }
349+
293350// RegisterSwaggerRoutes registers routes for swagger
294351func (container * Container ) RegisterSwaggerRoutes () {
295352 container .logger .Debug (fmt .Sprintf ("registering %T routes" , & handlers.MessageHandler {}))
296353 container .App ().Get ("/*" , swagger .HandlerDefault )
297354}
298355
356+ // HeartbeatRepository registers a new instance of repositories.HeartbeatRepository
357+ func (container * Container ) HeartbeatRepository () repositories.HeartbeatRepository {
358+ container .logger .Debug ("creating GORM repositories.HeartbeatRepository" )
359+ return repositories .NewGormHeartbeatRepository (
360+ container .Logger (),
361+ container .Tracer (),
362+ container .DB (),
363+ )
364+ }
365+
299366func logger () telemetry.Logger {
300367 hostname , _ := os .Hostname ()
301368 fields := fiber.Map {
302369 "pid" : os .Getpid (),
303370 "hostname" : hostname ,
304371 }
305- return telemetry .NewZerologLogger (
306- zerolog .New (
307- zerolog.ConsoleWriter {
308- Out : os .Stderr ,
309- },
310- ).With ().Fields (fields ).Timestamp ().CallerWithSkipFrameCount (3 ),
311- )
372+
373+ var writer io.Writer = zerolog.ConsoleWriter {Out : os .Stderr }
374+ if ! isLocal () {
375+ gcpWriter , err := zlg .NewCloudLoggingWriter (
376+ context .Background (),
377+ os .Getenv ("GCP_PROJECT_ID" ),
378+ fmt .Sprintf ("projects/%s/logs/run.googleapis.com%%2Fstderr" , os .Getenv ("GCP_PROJECT_ID" )),
379+ zlg.CloudLoggingOptions {},
380+ )
381+ if err != nil {
382+ log .Fatal ("could not create a CloudLoggingWriter" )
383+ }
384+ writer = gcpWriter
385+ }
386+
387+ return telemetry .NewZerologLogger (zerolog .New (writer ).With ().Fields (fields ).Timestamp ().CallerWithSkipFrameCount (3 ))
388+ }
389+
390+ func isLocal () bool {
391+ return os .Getenv ("ENV" ) == "local"
312392}
0 commit comments