77 "strconv"
88 "time"
99
10+ cloudtasks "cloud.google.com/go/cloudtasks/apiv2"
11+
1012 "go.opentelemetry.io/otel"
1113 "go.opentelemetry.io/otel/attribute"
1214 "go.opentelemetry.io/otel/propagation"
@@ -75,6 +77,8 @@ func NewContainer(projectID string) (container *Container) {
7577
7678 container .RegisterPhoneRoutes ()
7779
80+ container .RegisterEventRoutes ()
81+
7882 container .RegisterNotificationListeners ()
7983
8084 // this has to be last since it registers the /* route
@@ -188,6 +192,10 @@ func (container *Container) DB() (db *gorm.DB) {
188192 container .logger .Fatal (stacktrace .Propagate (err , fmt .Sprintf ("cannot migrate %T" , & entities.Phone {})))
189193 }
190194
195+ if err = db .AutoMigrate (& entities.PhoneNotification {}); err != nil {
196+ container .logger .Fatal (stacktrace .Propagate (err , fmt .Sprintf ("cannot migrate %T" , & entities.PhoneNotification {})))
197+ }
198+
191199 return container .db
192200}
193201
@@ -213,6 +221,42 @@ func (container *Container) FirebaseAuthClient() (client *auth.Client) {
213221 return authClient
214222}
215223
224+ // CloudTasksClient creates a new instance of cloudtasks.Client
225+ func (container * Container ) CloudTasksClient () (client * cloudtasks.Client ) {
226+ container .logger .Debug (fmt .Sprintf ("creating %T" , client ))
227+
228+ client , err := cloudtasks .NewClient (context .Background (), option .WithCredentialsJSON (container .FirebaseCredentials ()))
229+ if err != nil {
230+ container .logger .Fatal (stacktrace .Propagate (err , "cannot initialize cloud tasks client" ))
231+ }
232+
233+ return client
234+ }
235+
236+ // EventsQueueConfiguration creates a new instance of services.PushQueueConfig
237+ func (container * Container ) EventsQueueConfiguration () (config services.PushQueueConfig ) {
238+ container .logger .Debug (fmt .Sprintf ("creating %T" , config ))
239+
240+ return services.PushQueueConfig {
241+ UserAPIKey : os .Getenv ("EVENTS_QUEUE_USER_API_KEY" ),
242+ Name : os .Getenv ("EVENTS_QUEUE_NAME" ),
243+ UserID : entities .UserID (os .Getenv ("EVENTS_QUEUE_USER_ID" )),
244+ ConsumerEndpoint : os .Getenv ("EVENTS_QUEUE_ENDPOINT" ),
245+ }
246+ }
247+
248+ // EventsQueue creates a new instance of services.PushQueue
249+ func (container * Container ) EventsQueue () (queue services.PushQueue ) {
250+ container .logger .Debug ("creating events services.PushQueue" )
251+
252+ return services .NewGooglePushQueue (
253+ container .Logger (),
254+ container .Tracer (),
255+ container .CloudTasksClient (),
256+ container .EventsQueueConfiguration (),
257+ )
258+ }
259+
216260// FirebaseMessagingClient creates a new instance of messaging.Client
217261func (container * Container ) FirebaseMessagingClient () (client * messaging.Client ) {
218262 container .logger .Debug (fmt .Sprintf ("creating %T" , client ))
@@ -317,6 +361,8 @@ func (container *Container) EventDispatcher() (dispatcher *services.EventDispatc
317361 container .Logger (),
318362 container .Tracer (),
319363 container .EventRepository (),
364+ container .EventsQueue (),
365+ container .EventsQueueConfiguration (),
320366 )
321367
322368 container .eventDispatcher = dispatcher
@@ -343,6 +389,16 @@ func (container *Container) PhoneRepository() (repository repositories.PhoneRepo
343389 )
344390}
345391
392+ // PhoneNotificationRepository creates a new instance of repositories.PhoneNotificationRepository
393+ func (container * Container ) PhoneNotificationRepository () (repository repositories.PhoneNotificationRepository ) {
394+ container .logger .Debug ("creating GORM repositories.PhoneNotificationRepository" )
395+ return repositories .NewGormPhoneNotificationRepository (
396+ container .Logger (),
397+ container .Tracer (),
398+ container .DB (),
399+ )
400+ }
401+
346402// MessageThreadRepository creates a new instance of repositories.MessageThreadRepository
347403func (container * Container ) MessageThreadRepository () (repository repositories.MessageThreadRepository ) {
348404 container .logger .Debug ("creating GORM repositories.MessageThreadRepository" )
@@ -446,6 +502,18 @@ func (container *Container) PhoneHandler() (handler *handlers.PhoneHandler) {
446502 )
447503}
448504
505+ // EventsHandler creates a new instance of handlers.EventsHandler
506+ func (container * Container ) EventsHandler () (handler * handlers.EventsHandler ) {
507+ container .logger .Debug (fmt .Sprintf ("creating %T" , handler ))
508+
509+ return handlers .NewEventsHandler (
510+ container .Logger (),
511+ container .Tracer (),
512+ container .EventsQueueConfiguration (),
513+ container .EventDispatcher (),
514+ )
515+ }
516+
449517// RegisterMessageListeners registers event listeners for listeners.MessageListener
450518func (container * Container ) RegisterMessageListeners () {
451519 container .logger .Debug (fmt .Sprintf ("registering listners for %T" , listeners.MessageListener {}))
@@ -523,6 +591,8 @@ func (container *Container) NotificationService() (service *services.Notificatio
523591 container .Tracer (),
524592 container .FirebaseMessagingClient (),
525593 container .PhoneRepository (),
594+ container .PhoneNotificationRepository (),
595+ container .EventDispatcher (),
526596 )
527597}
528598
@@ -556,6 +626,12 @@ func (container *Container) RegisterUserRoutes() {
556626 container .UserHandler ().RegisterRoutes (container .AuthRouter ())
557627}
558628
629+ // RegisterEventRoutes registers routes for the /events prefix
630+ func (container * Container ) RegisterEventRoutes () {
631+ container .logger .Debug (fmt .Sprintf ("registering %T routes" , & handlers.EventsHandler {}))
632+ container .EventsHandler ().RegisterRoutes (container .AuthRouter ())
633+ }
634+
559635// RegisterSwaggerRoutes registers routes for swagger
560636func (container * Container ) RegisterSwaggerRoutes () {
561637 container .logger .Debug (fmt .Sprintf ("registering %T routes" , & handlers.MessageHandler {}))
0 commit comments