Skip to content

Commit be4b5a9

Browse files
committed
Add heartbeats to yugabyte repository
1 parent e6e6970 commit be4b5a9

6 files changed

Lines changed: 141 additions & 22 deletions

File tree

api/Dockerfile

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,7 @@ WORKDIR /home/http-sms
3030

3131
COPY --from=builder /usr/local/go/lib/time/zoneinfo.zip /zoneinfo.zip
3232
COPY --from=builder /bin/http-sms ./
33+
COPY --from=builder /http-sms/root.crt ./
3334

3435
ENV ZONEINFO=/zoneinfo.zip
3536

api/cmd/experiments/main.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,10 +23,15 @@ func main() {
2323
log.Fatal("Error loading .env file")
2424
}
2525

26+
container := di.NewLiteContainer()
27+
container.Logger().Info("Starting experiments")
28+
}
29+
30+
func text3CX() {
2631
container := di.NewLiteContainer()
2732
repo := container.Integration3CXRepository()
2833

29-
err = repo.Save(context.Background(), &entities.Integration3CX{
34+
err := repo.Save(context.Background(), &entities.Integration3CX{
3035
ID: uuid.MustParse("b0b1acdc-69dd-4aee-8277-ba4adc5d2e90"),
3136
UserID: "XtABz6zdeFMoBLoltz6SREDvRSh2",
3237
WebhookURL: "https://lagomtest.3cx.com.au/sms/generic/155e125bf7874f8fae5adbcaac49fdf8",

api/pkg/di/container.go

Lines changed: 35 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -71,6 +71,7 @@ import (
7171
type Container struct {
7272
projectID string
7373
db *gorm.DB
74+
yugaByteDB *gorm.DB
7475
version string
7576
app *fiber.App
7677
eventDispatcher *services.EventDispatcher
@@ -204,6 +205,39 @@ func (container *Container) GormLogger() gormLogger.Interface {
204205
)
205206
}
206207

208+
// YugaByteDB creates an instance of gorm.DB if it has not been created already
209+
func (container *Container) YugaByteDB() (db *gorm.DB) {
210+
container.logger.Debug(fmt.Sprintf("creating %T", db))
211+
if container.yugaByteDB != nil {
212+
return container.yugaByteDB
213+
}
214+
215+
config := &gorm.Config{}
216+
if isLocal() {
217+
config = &gorm.Config{Logger: container.GormLogger()}
218+
}
219+
220+
db, err := gorm.Open(postgres.Open(os.Getenv("DATABASE_URL_YUGABYTE")), config)
221+
if err != nil {
222+
container.logger.Fatal(err)
223+
}
224+
if err = db.Use(tracing.NewPlugin()); err != nil {
225+
container.logger.Fatal(stacktrace.Propagate(err, "cannot use GORM tracing plugin"))
226+
}
227+
228+
container.logger.Debug(fmt.Sprintf("Running migrations for yugabyte [%T]", db))
229+
if err = db.AutoMigrate(&entities.Heartbeat{}); err != nil {
230+
container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.Heartbeat{})))
231+
}
232+
233+
if err = db.AutoMigrate(&entities.HeartbeatMonitor{}); err != nil {
234+
container.logger.Fatal(stacktrace.Propagate(err, fmt.Sprintf("cannot migrate %T", &entities.HeartbeatMonitor{})))
235+
}
236+
237+
container.yugaByteDB = db
238+
return container.yugaByteDB
239+
}
240+
207241
// DB creates an instance of gorm.DB if it has not been created already
208242
func (container *Container) DB() (db *gorm.DB) {
209243
if container.db != nil {
@@ -1190,6 +1224,7 @@ func (container *Container) HeartbeatRepository() repositories.HeartbeatReposito
11901224
container.Logger(),
11911225
container.Tracer(),
11921226
container.DB(),
1227+
container.YugaByteDB(),
11931228
)
11941229
}
11951230

api/pkg/repositories/gorm_heartbeat_repository.go

Lines changed: 24 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -14,9 +14,25 @@ import (
1414

1515
// gormHeartbeatRepository is responsible for persisting entities.Heartbeat
1616
type gormHeartbeatRepository struct {
17-
logger telemetry.Logger
18-
tracer telemetry.Tracer
19-
db *gorm.DB
17+
logger telemetry.Logger
18+
tracer telemetry.Tracer
19+
db *gorm.DB
20+
yugaByteDB *gorm.DB
21+
}
22+
23+
// NewGormHeartbeatRepository creates the GORM version of the HeartbeatRepository
24+
func NewGormHeartbeatRepository(
25+
logger telemetry.Logger,
26+
tracer telemetry.Tracer,
27+
db *gorm.DB,
28+
yugaByteDB *gorm.DB,
29+
) HeartbeatRepository {
30+
return &gormHeartbeatRepository{
31+
logger: logger.WithService(fmt.Sprintf("%T", &gormHeartbeatRepository{})),
32+
tracer: tracer,
33+
yugaByteDB: yugaByteDB,
34+
db: db,
35+
}
2036
}
2137

2238
func (repository *gormHeartbeatRepository) Last(ctx context.Context, userID entities.UserID, owner string) (*entities.Heartbeat, error) {
@@ -42,19 +58,6 @@ func (repository *gormHeartbeatRepository) Last(ctx context.Context, userID enti
4258
return heartbeat, nil
4359
}
4460

45-
// NewGormHeartbeatRepository creates the GORM version of the HeartbeatRepository
46-
func NewGormHeartbeatRepository(
47-
logger telemetry.Logger,
48-
tracer telemetry.Tracer,
49-
db *gorm.DB,
50-
) HeartbeatRepository {
51-
return &gormHeartbeatRepository{
52-
logger: logger.WithService(fmt.Sprintf("%T", &gormHeartbeatRepository{})),
53-
tracer: tracer,
54-
db: db,
55-
}
56-
}
57-
5861
// Index entities.Message between 2 parties
5962
func (repository *gormHeartbeatRepository) Index(ctx context.Context, userID entities.UserID, owner string, params IndexParams) (*[]entities.Heartbeat, error) {
6063
ctx, span := repository.tracer.Start(ctx)
@@ -85,5 +88,10 @@ func (repository *gormHeartbeatRepository) Store(ctx context.Context, heartbeat
8588
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
8689
}
8790

91+
if err := repository.yugaByteDB.WithContext(ctx).Create(heartbeat).Error; err != nil {
92+
msg := fmt.Sprintf("cannot save heartbeat with ID [%s] in yugaByteDB", heartbeat.ID)
93+
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
94+
}
95+
8896
return nil
8997
}

api/root.crt

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
-----BEGIN CERTIFICATE-----
2+
MIIGujCCBKKgAwIBAgIUAMfrcUVOw4LUutBnhHkyK2CdcD4wDQYJKoZIhvcNAQEL
3+
BQAwgYQxCzAJBgNVBAYTAlVTMQswCQYDVQQIEwJDQTESMBAGA1UEBxMJU3Vubnl2
4+
YWxlMRUwEwYDVQQKEwxZdWdhYnl0ZSBJbmMxFzAVBgNVBAsTDll1Z2FieXRlIENs
5+
b3VkMSQwIgYDVQQDExtZdWdhYnl0ZSBDbG91ZCBSb290IENBIHByb2QwHhcNMjEw
6+
ODI1MTgxNjI3WhcNMjYwODI0MTgxNjI2WjCBizELMAkGA1UEBhMCVVMxCzAJBgNV
7+
BAgTAkNBMRIwEAYDVQQHEwlTdW5ueXZhbGUxFTATBgNVBAoTDFl1Z2FieXRlIElu
8+
YzEXMBUGA1UECxMOWXVnYWJ5dGUgQ2xvdWQxKzApBgNVBAMTIll1Z2FieXRlIENs
9+
b3VkIFN1Ym9yZGluYXRlIENBIHByb2QwggGiMA0GCSqGSIb3DQEBAQUAA4IBjwAw
10+
ggGKAoIBgQDQqVXXfB3m4eTkm5EDcjOtJxeuYdodftj31g6gEsruxNrV/hVLaIMr
11+
T9WnRfDVoArZ/a4ZszbLw8yV+YExhUpi+NcjiI76q76X9IRQ8h5GMs9Jnb/R3Ij6
12+
Wvh7xwCglfglIut9Q+rTaLilOtTvB4K5PqJSqnkjt4iuxW7+qoeqL0yXKfNt7ar0
13+
AyKxY/kVycdqN/7eiDRKeePu62/J3XYI/WGd0UukA2VCeSA1ZS0zjw3I9eZnhz16
14+
UAJQrb4j2zBn7UyYHKYZSVpwbdKR/Pf0HYb/Cd+dKDLSOMWgo0ANHQYz4RwhrhGE
15+
hKPwDSqeth4fb85w9UYjkFObdb2/S+aBZ52/+ma7CcAoFHXoho78hVW8haBtHNLu
16+
wf5hdWFp3UFsehBx4Cwg/dvTvSwNU0M0yi81Pti3JLQcIE3JdbTFUqh6mM++8VP3
17+
c9zv1ps49smYdAWYupGdJuOOGxKFU63ISsJ73Yps/ltS3rdcLVvpIZh3HYK7gN74
18+
c27YLEBi5CsCAwEAAaOCAZkwggGVMA4GA1UdDwEB/wQEAwIBBjAdBgNVHSUEFjAU
19+
BggrBgEFBQcDAQYIKwYBBQUHAwIwDwYDVR0TAQH/BAUwAwEB/zAdBgNVHQ4EFgQU
20+
tkigYkjDqEf4Jq416pWPPKQ4CjYwHwYDVR0jBBgwFoAUYI98SpWNF9y0WPeNKy/5
21+
CQH+EjswgY0GCCsGAQUFBwEBBIGAMH4wfAYIKwYBBQUHMAKGcGh0dHA6Ly9wcml2
22+
YXRlY2EtY29udGVudC02MTFlMjJmNi0wMDAwLTIwYzktYTY1MC1kNGY1NDdmN2Vl
23+
MWMuc3RvcmFnZS5nb29nbGVhcGlzLmNvbS9hYTE0MDg4M2Q0YTdhMmMwMGEwOS9j
24+
YS5jcnQwgYIGA1UdHwR7MHkwd6B1oHOGcWh0dHA6Ly9wcml2YXRlY2EtY29udGVu
25+
dC02MTFlMjJmNi0wMDAwLTIwYzktYTY1MC1kNGY1NDdmN2VlMWMuc3RvcmFnZS5n
26+
b29nbGVhcGlzLmNvbS9hYTE0MDg4M2Q0YTdhMmMwMGEwOS9jcmwuY3JsMA0GCSqG
27+
SIb3DQEBCwUAA4ICAQBtYoAQEYWi7z/f4u+4PqY0r8oDAMOwaHTESqjeWfRmv0wm
28+
rvqCeWShCiVFKt8+Otg/TpuJ4VudwtwnT462gFhDE8ODs0uxd3ALyyzVei0CP5tx
29+
hFWn13DWGWNQXZxetRxo9isnvveYgDKNJa5S7bhH0LKPtfpJpyBscifBCEii+tA8
30+
5KyCbi1GjYgL56n3mE2BkoA0MTVUSyFcX0LC9DGGxRHSONePNN3VSr3LumeXoM+G
31+
4WkhkN4c2I91ivaAEhyyg4PnfQlcFGP5FQJxIyOPe1o0knX5QNES+kxZM3Te6lPA
32+
y8XOV7rGx82AJUBejmL/bUYKd7MN6jSCRLartINpY59zFF5HgX65D0qbQZkF9F/N
33+
cmqlqiliE2IsTjAsaQNuxLlArtOXXlUjmCx6UdsG7UVTu3ioJFx9FerYu/EddvSI
34+
UrU4XOOpYF1BL8Bg+5GrdHDO3+BkWazYEm1xuGVlBcFgTkOKE3wUmmWp70uP/16M
35+
vBcCe1RzmYNJNLWUMj8e0aOLQ69zTimSdfgT/wq80boCFy4ixDf2e1J5SmOmnKNm
36+
AEHW3Oj10kzaQBiWWLqi54A8uNYRMW95p0JANZpyoQ2ejur0KfqQQt2+YVa5q51j
37+
0K1KVhGjMykz02dSXpxtyy25xskr8j7tFyN0abHrVi+KyLRe+DW55UldEQ9nbQ==
38+
-----END CERTIFICATE-----
39+
-----BEGIN CERTIFICATE-----
40+
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
72+
-----END CERTIFICATE-----

web/plugins/axios.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,18 +3,16 @@ import axios from 'axios'
33
const client = axios.create({
44
baseURL: process.env.BASE_URL || 'http://localhost:8000',
55
headers: {
6-
common: {
7-
'X-Client-Version': process.env.GITHUB_SHA || 'dev',
8-
},
6+
'X-Client-Version': process.env.GITHUB_SHA || 'dev',
97
},
108
})
119

1210
export function setAuthHeader(token: string | null) {
13-
client.defaults.headers.Authorization = 'Bearer ' + token
11+
client.defaults.headers.common.Authorization = 'Bearer ' + token
1412
}
1513

1614
export function setApiKey(apiKey: string | null) {
17-
client.defaults.headers.common['x-api-key'] = apiKey
15+
client.defaults.headers.common['x-api-key'] = apiKey ?? ''
1816
}
1917

2018
export default client

0 commit comments

Comments
 (0)