Skip to content

Commit 4ebe7f7

Browse files
committed
Fix server
1 parent d447d42 commit 4ebe7f7

File tree

11 files changed

+154
-11
lines changed

11 files changed

+154
-11
lines changed

api/cmd/experiments/main.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,35 @@
1+
package main
2+
3+
import (
4+
"context"
5+
"log"
6+
"os"
7+
"time"
8+
9+
"github.com/NdoleStudio/httpsms/pkg/di"
10+
"github.com/NdoleStudio/httpsms/pkg/services"
11+
"github.com/google/uuid"
12+
"github.com/joho/godotenv"
13+
)
14+
15+
func main() {
16+
err := godotenv.Load("../../.env")
17+
if err != nil {
18+
log.Fatal("Error loading .env file")
19+
}
20+
21+
container := di.NewContainer("http-sms")
22+
23+
log.Println("finished creating container")
24+
25+
err = container.UserService().SendPhoneDeadEmail(context.Background(), &services.UserSendPhoneDeadEmailParams{
26+
UserID: "XtABz6zdeFMoBLoltz6SREDvRSh2",
27+
PhoneID: uuid.MustParse("fb78a476-ae9f-48e4-b644-0e2ee7d83b26"),
28+
Owner: os.Getenv("PHONE_NUMBER"),
29+
LastHeartbeatTimestamp: time.Now().UTC().Add(-2 * time.Minute),
30+
})
31+
32+
if err != nil {
33+
log.Fatal(err)
34+
}
35+
}

api/pkg/di/container.go

Lines changed: 62 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@ import (
77
"strconv"
88
"time"
99

10+
"github.com/NdoleStudio/httpsms/pkg/emails"
11+
1012
cloudtasks "cloud.google.com/go/cloudtasks/apiv2"
1113

1214
"go.opentelemetry.io/otel"
@@ -74,6 +76,7 @@ func NewContainer(projectID string) (container *Container) {
7476
container.RegisterHeartbeatListeners()
7577

7678
container.RegisterUserRoutes()
79+
container.RegisterUserListeners()
7780

7881
container.RegisterPhoneRoutes()
7982

@@ -184,6 +187,10 @@ func (container *Container) DB() (db *gorm.DB) {
184187
container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.Heartbeat{})))
185188
}
186189

190+
if err = db.AutoMigrate(&entities.HeartbeatMonitor{}); err != nil {
191+
container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.HeartbeatMonitor{})))
192+
}
193+
187194
if err = db.AutoMigrate(&entities.User{}); err != nil {
188195
container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.User{})))
189196
}
@@ -419,6 +426,16 @@ func (container *Container) EventRepository() (repository repositories.EventRepo
419426
)
420427
}
421428

429+
// HeartbeatMonitorRepository creates a new instance of repositories.HeartbeatMonitorRepository
430+
func (container *Container) HeartbeatMonitorRepository() (repository repositories.HeartbeatMonitorRepository) {
431+
container.logger.Debug("creating GORM repositories.HeartbeatMonitorRepository")
432+
return repositories.NewGormHeartbeatMonitorRepository(
433+
container.Logger(),
434+
container.Tracer(),
435+
container.DB(),
436+
)
437+
}
438+
422439
// EventListenerLogRepository creates a new instance of repositories.EventListenerLogRepository
423440
func (container *Container) EventListenerLogRepository() (repository repositories.EventListenerLogRepository) {
424441
container.logger.Debug("creating GORM repositories.EventListenerLogRepository")
@@ -436,6 +453,8 @@ func (container *Container) HeartbeatService() (service *services.HeartbeatServi
436453
container.Logger(),
437454
container.Tracer(),
438455
container.HeartbeatRepository(),
456+
container.HeartbeatMonitorRepository(),
457+
container.EventDispatcher(),
439458
)
440459
}
441460

@@ -446,6 +465,7 @@ func (container *Container) PhoneService() (service *services.PhoneService) {
446465
container.Logger(),
447466
container.Tracer(),
448467
container.PhoneRepository(),
468+
container.EventDispatcher(),
449469
)
450470
}
451471

@@ -456,9 +476,37 @@ func (container *Container) UserService() (service *services.UserService) {
456476
container.Logger(),
457477
container.Tracer(),
458478
container.UserRepository(),
479+
container.Mailer(),
480+
container.UserEmailFactory(),
459481
)
460482
}
461483

484+
// Mailer creates a new instance of emails.Mailer
485+
func (container *Container) Mailer() (mailer emails.Mailer) {
486+
container.logger.Debug("creating emails.Mailer")
487+
return emails.NewSMTPEmailService(
488+
container.Tracer(),
489+
emails.SMTPConfig{
490+
FromName: os.Getenv("SMTP_FROM_NAME"),
491+
FromEmail: os.Getenv("SMTP_FROM_EMAIL"),
492+
Username: os.Getenv("SMTP_USERNAME"),
493+
Password: os.Getenv("SMTP_PASSWORD"),
494+
Hostname: os.Getenv("SMTP_HOST"),
495+
Port: os.Getenv("SMTP_PORT"),
496+
},
497+
)
498+
}
499+
500+
// UserEmailFactory creates a new instance of emails.UserEmailFactory
501+
func (container *Container) UserEmailFactory() (factory emails.UserEmailFactory) {
502+
container.logger.Debug("creating emails.UserEmailFactory")
503+
return emails.NewHermesUserEmailFactory(&emails.HermesGeneratorConfig{
504+
AppURL: os.Getenv("APP_URL"),
505+
AppName: os.Getenv("APP_NAME"),
506+
AppLogoURL: os.Getenv("APP_LOGO_URL"),
507+
})
508+
}
509+
462510
// MessageThreadService creates a new instance of services.MessageService
463511
func (container *Container) MessageThreadService() (service *services.MessageThreadService) {
464512
container.logger.Debug(fmt.Sprintf("creating %T", service))
@@ -572,6 +620,20 @@ func (container *Container) RegisterHeartbeatListeners() {
572620
}
573621
}
574622

623+
// RegisterUserListeners registers event listeners for listeners.UserListener
624+
func (container *Container) RegisterUserListeners() {
625+
container.logger.Debug(fmt.Sprintf("registering listners for %T", listeners.UserListener{}))
626+
_, routes := listeners.NewUserListener(
627+
container.Logger(),
628+
container.Tracer(),
629+
container.UserService(),
630+
)
631+
632+
for event, handler := range routes {
633+
container.EventDispatcher().Subscribe(event, handler)
634+
}
635+
}
636+
575637
// MessageService creates a new instance of services.MessageService
576638
func (container *Container) MessageService() (service *services.MessageService) {
577639
container.logger.Debug(fmt.Sprintf("creating %T", service))

api/pkg/emails/hermes_theme.go

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -46,7 +46,7 @@ func (dt *hermesTheme) HTMLTemplate() string {
4646
width: 100%;
4747
margin: 0;
4848
padding: 0;
49-
background-color: #283593;
49+
background-color: #1E1E1E;
5050
}
5151
.email-content {
5252
width: 100%;
@@ -89,10 +89,12 @@ func (dt *hermesTheme) HTMLTemplate() string {
8989
.email-footer {
9090
width: 570px;
9191
margin: 0 auto;
92+
font-size: 16px;
9293
padding: 0;
9394
text-align: center;
9495
}
9596
.email-footer p {
97+
font-size: 16px;
9698
color: #AEAEAE;
9799
}
98100
.body-action {
@@ -182,7 +184,7 @@ func (dt *hermesTheme) HTMLTemplate() string {
182184
line-height: 1.5em;
183185
}
184186
p.sub {
185-
font-size: 12px;
187+
font-size: 14px;
186188
}
187189
p.center {
188190
text-align: center;

api/pkg/emails/hermes_user_email_factory.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@ func (factory *hermesUserEmailFactory) PhoneDead(user *entities.User, lastHeartb
2727
email := hermes.Email{
2828
Body: hermes.Body{
2929
Intros: []string{
30-
fmt.Sprintf("We haven't received any heartbeat event from your mobile phone <b>%s</b> since %s.", owner, lastHeartbeatTimestamp.Format(time.RFC822)),
30+
fmt.Sprintf("We haven't received any heartbeat event from your mobile phone %s since %s.", owner, lastHeartbeatTimestamp.Format(time.RFC1123)),
3131
fmt.Sprintf("Check if the mobile phone is powered on and if it has stable internet connection."),
3232
},
33-
Title: "Hello 🤚",
33+
Title: "Hey,",
3434
Signature: "Cheers",
3535
Outros: []string{
3636
fmt.Sprintf("Don't hesitate to contact us by replying to this email."),

api/pkg/handlers/phone_handler.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -122,7 +122,7 @@ func (h *PhoneHandler) Upsert(c *fiber.Ctx) error {
122122
return h.responseUnprocessableEntity(c, errors, "validation errors while fetching phones")
123123
}
124124

125-
phone, err := h.service.Upsert(ctx, request.ToUpsertParams(h.userFromContext(c)))
125+
phone, err := h.service.Upsert(ctx, request.ToUpsertParams(h.userFromContext(c), c.OriginalURL()))
126126
if err != nil {
127127
msg := fmt.Sprintf("cannot update phones with params [%+#v]", request)
128128
ctxLogger.Error(stacktrace.Propagate(err, msg))

api/pkg/requests/phone_update_request.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -30,7 +30,7 @@ func (input *PhoneUpsert) Sanitize() PhoneUpsert {
3030
}
3131

3232
// ToUpsertParams converts PhoneUpsert to services.PhoneUpsertParams
33-
func (input *PhoneUpsert) ToUpsertParams(user entities.AuthUser) services.PhoneUpsertParams {
33+
func (input *PhoneUpsert) ToUpsertParams(user entities.AuthUser, source string) services.PhoneUpsertParams {
3434
phone, _ := phonenumbers.Parse(input.PhoneNumber, phonenumbers.UNKNOWN_REGION)
3535

3636
// ignore value if it's default
@@ -53,6 +53,7 @@ func (input *PhoneUpsert) ToUpsertParams(user entities.AuthUser) services.PhoneU
5353
}
5454

5555
return services.PhoneUpsertParams{
56+
Source: source,
5657
PhoneNumber: *phone,
5758
MessagesPerMinute: messagesPerMinute,
5859
MessageExpirationDuration: timeout,

api/pkg/services/heartbeat_service.go

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ type HeartbeatService struct {
2828
tracer telemetry.Tracer
2929
repository repositories.HeartbeatRepository
3030
monitorRepository repositories.HeartbeatMonitorRepository
31-
dispatcher EventDispatcher
31+
dispatcher *EventDispatcher
3232
}
3333

3434
// NewHeartbeatService creates a new HeartbeatService
@@ -37,7 +37,7 @@ func NewHeartbeatService(
3737
tracer telemetry.Tracer,
3838
repository repositories.HeartbeatRepository,
3939
monitorRepository repositories.HeartbeatMonitorRepository,
40-
dispatcher EventDispatcher,
40+
dispatcher *EventDispatcher,
4141
) (s *HeartbeatService) {
4242
return &HeartbeatService{
4343
logger: logger.WithService(fmt.Sprintf("%T", s)),

api/pkg/services/user_service.go

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -111,6 +111,7 @@ func (service *UserService) SendPhoneDeadEmail(ctx context.Context, params *User
111111
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
112112
}
113113

114+
ctxLogger.Info("sending email")
114115
if err = service.mailer.Send(ctx, email); err != nil {
115116
msg := fmt.Sprintf("canot send phone dead notification to user [%s]", params.UserID)
116117
return service.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))

web/assets/img/icon.svg

Lines changed: 38 additions & 0 deletions
Loading

web/pages/index.vue

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -11,9 +11,13 @@
1111
'text-h5': $vuetify.breakpoint.mdAndDown,
1212
}"
1313
>
14-
<v-icon :x-large="!$vuetify.breakpoint.mdAndDown">
15-
{{ mdiForum }}
16-
</v-icon>
14+
<v-avatar size="70" class="mt-4">
15+
<v-img
16+
class="mb-4"
17+
contain
18+
:src="require('assets/img/icon.svg')"
19+
></v-img>
20+
</v-avatar>
1721
Http SMS
1822
</h2>
1923
<v-spacer></v-spacer>

0 commit comments

Comments
 (0)