Skip to content

Commit d187f37

Browse files
committed
Remove sqlite
1 parent d7aa243 commit d187f37

7 files changed

Lines changed: 45 additions & 107 deletions

File tree

api/go.mod

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,6 @@ require (
4343
github.com/stretchr/testify v1.11.1
4444
github.com/swaggo/swag v1.16.6
4545
github.com/thedevsaddam/govalidator v1.9.10
46-
github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc
4746
github.com/uptrace/uptrace-go v1.41.1
4847
github.com/xuri/excelize/v2 v2.10.1
4948
go.opentelemetry.io/otel v1.43.0
@@ -55,7 +54,6 @@ require (
5554
google.golang.org/api v0.274.0
5655
google.golang.org/protobuf v1.36.11
5756
gorm.io/driver/postgres v1.6.0
58-
gorm.io/driver/sqlite v1.6.0
5957
gorm.io/gorm v1.31.1
6058
gorm.io/plugin/opentelemetry v0.1.16
6159
)
@@ -94,13 +92,11 @@ require (
9492
github.com/PuerkitoBio/goquery v1.12.0 // indirect
9593
github.com/andybalholm/brotli v1.2.1 // indirect
9694
github.com/andybalholm/cascadia v1.3.3 // indirect
97-
github.com/antlr4-go/antlr/v4 v4.13.1 // indirect
9895
github.com/cenkalti/backoff/v5 v5.0.3 // indirect
9996
github.com/cespare/xxhash/v2 v2.3.0 // indirect
10097
github.com/clipperhouse/displaywidth v0.11.0 // indirect
10198
github.com/clipperhouse/uax29/v2 v2.7.0 // indirect
10299
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 // indirect
103-
github.com/coder/websocket v1.8.14 // indirect
104100
github.com/dgryski/go-rendezvous v0.0.0-20200823014737-9f7001d12a5f // indirect
105101
github.com/envoyproxy/go-control-plane/envoy v1.37.0 // indirect
106102
github.com/envoyproxy/protoc-gen-validate v1.3.3 // indirect
@@ -187,7 +183,6 @@ require (
187183
go.uber.org/zap v1.27.1 // indirect
188184
go.yaml.in/yaml/v3 v3.0.4 // indirect
189185
golang.org/x/crypto v0.49.0 // indirect
190-
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 // indirect
191186
golang.org/x/mod v0.34.0 // indirect
192187
golang.org/x/net v0.52.0 // indirect
193188
golang.org/x/oauth2 v0.36.0 // indirect

api/go.sum

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -66,8 +66,6 @@ github.com/andybalholm/brotli v1.2.1 h1:R+f5xP285VArJDRgowrfb9DqL18yVK0gKAW/F+eT
6666
github.com/andybalholm/brotli v1.2.1/go.mod h1:rzTDkvFWvIrjDXZHkuS16NPggd91W3kUSvPlQ1pLaKY=
6767
github.com/andybalholm/cascadia v1.3.3 h1:AG2YHrzJIm4BZ19iwJ/DAua6Btl3IwJX+VI4kktS1LM=
6868
github.com/andybalholm/cascadia v1.3.3/go.mod h1:xNd9bqTn98Ln4DwST8/nG+H0yuB8Hmgu1YHNnWw0GeA=
69-
github.com/antlr4-go/antlr/v4 v4.13.1 h1:SqQKkuVZ+zWkMMNkjy5FZe5mr5WURWnlpmOuzYWrPrQ=
70-
github.com/antlr4-go/antlr/v4 v4.13.1/go.mod h1:GKmUxMtwp6ZgGwZSva4eWPC5mS6vUAmOABFgjdkM7Nw=
7169
github.com/avast/retry-go/v5 v5.0.0 h1:kf1Qc2UsTZ4qq8elDymqfbISvkyMuhgRxuJqX2NHP7k=
7270
github.com/avast/retry-go/v5 v5.0.0/go.mod h1://d+usmKWio1agtZfS1H/ltTqwtIfBnRq9zEwjc3eH8=
7371
github.com/bsm/ginkgo/v2 v2.12.0 h1:Ny8MWAHyOepLGlLKYmXG4IEkioBysk6GpaRTLC8zwWs=
@@ -90,8 +88,6 @@ github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2 h1:aBangftG7EVZoUb69Os
9088
github.com/cncf/xds/go v0.0.0-20260202195803-dba9d589def2/go.mod h1:qwXFYgsP6T7XnJtbKlf1HP8AjxZZyzxMmc+Lq5GjlU4=
9189
github.com/cockroachdb/cockroach-go/v2 v2.4.3 h1:LJO3K3jC5WXvMePRQSJE1NsIGoFGcEx1LW83W6RAlhw=
9290
github.com/cockroachdb/cockroach-go/v2 v2.4.3/go.mod h1:9U179XbCx4qFWtNhc7BiWLPfuyMVQ7qdAhfrwLz1vH0=
93-
github.com/coder/websocket v1.8.14 h1:9L0p0iKiNOibykf283eHkKUHHrpG7f65OE3BhhO7v9g=
94-
github.com/coder/websocket v1.8.14/go.mod h1:NX3SzP+inril6yawo5CQXx8+fk145lPDC6pumgx0mVg=
9591
github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9692
github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38=
9793
github.com/davecgh/go-spew v1.1.2-0.20180830191138-d8f796af33cc h1:U9qPSI2PIWSS1VwoXQT9A3Wy9MM3WgvqSxFWenqJduM=
@@ -324,8 +320,6 @@ github.com/thedevsaddam/govalidator v1.9.10 h1:m3dLRbSZ5Hts3VUWYe+vxLMG+FdyQuWOj
324320
github.com/thedevsaddam/govalidator v1.9.10/go.mod h1:Ilx8u7cg5g3LXbSS943cx5kczyNuUn7LH/cK5MYuE90=
325321
github.com/tiendc/go-deepcopy v1.7.2 h1:Ut2yYR7W9tWjTQitganoIue4UGxZwCcJy3orjrrIj44=
326322
github.com/tiendc/go-deepcopy v1.7.2/go.mod h1:4bKjNC2r7boYOkD2IOuZpYjmlDdzjbpTRyCx+goBCJQ=
327-
github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc h1:lzi/5fg2EfinRlh3v//YyIhnc4tY7BTqazQGwb1ar+0=
328-
github.com/tursodatabase/libsql-client-go v0.0.0-20251219100830-236aa1ff8acc/go.mod h1:08inkKyguB6CGGssc/JzhmQWwBgFQBgjlYFjxjRh7nU=
329323
github.com/uptrace/uptrace-go v1.41.1 h1:EtWkkdOQqtuJMZyzeU0zT5VH6ppVY12yOouQK3VRccw=
330324
github.com/uptrace/uptrace-go v1.41.1/go.mod h1:gdn1eRLG3KCtTyiw+L8tG+tb/wnpiyIfLfTH2qh/5Mw=
331325
github.com/valyala/bytebufferpool v1.0.0 h1:GqA5TC/0021Y/b9FG4Oi9Mr3q7XYx6KllzawFIhcdPw=
@@ -416,8 +410,6 @@ golang.org/x/crypto v0.23.0/go.mod h1:CKFgDieR+mRhux2Lsu27y0fO304Db0wZe70UKqHu0v
416410
golang.org/x/crypto v0.31.0/go.mod h1:kDsLvtWBEx7MV9tJOj9bnXsPbxwJQ6csT/x4KIN4Ssk=
417411
golang.org/x/crypto v0.49.0 h1:+Ng2ULVvLHnJ/ZFEq4KdcDd/cfjrrjjNSXNzxg0Y4U4=
418412
golang.org/x/crypto v0.49.0/go.mod h1:ErX4dUh2UM+CFYiXZRTcMpEcN8b/1gxEuv3nODoYtCA=
419-
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90 h1:jiDhWWeC7jfWqR9c/uplMOqJ0sbNlNWv0UkzE0vX1MA=
420-
golang.org/x/exp v0.0.0-20260312153236-7ab1446f8b90/go.mod h1:xE1HEv6b+1SCZ5/uscMRjUBKtIxworgEcEi+/n9NQDQ=
421413
golang.org/x/image v0.25.0 h1:Y6uW6rH1y5y/LK1J8BPWZtr6yZ7hrsy6hFrXjgsc2fQ=
422414
golang.org/x/image v0.25.0/go.mod h1:tCAmOEGthTtkalusGp1g3xa2gke8J6c2N565dTyl9Rs=
423415
golang.org/x/mod v0.6.0-dev.0.20220419223038-86c51ed26bb4/go.mod h1:jJ57K6gSWd91VN4djpZkiMVwK6gcyfeH4XE8wZrZaV4=

api/main.go

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import (
77

88
"github.com/NdoleStudio/httpsms/docs"
99
"github.com/NdoleStudio/httpsms/pkg/di"
10-
_ "github.com/tursodatabase/libsql-client-go/libsql"
1110
)
1211

1312
// Version is injected at runtime

api/pkg/di/container.go

Lines changed: 1 addition & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,11 +10,9 @@ import (
1010
"strings"
1111
"time"
1212

13+
"github.com/NdoleStudio/httpsms/docs"
1314
plunk "github.com/NdoleStudio/plunk-go"
1415
"github.com/pusher/pusher-http-go/v5"
15-
"gorm.io/driver/sqlite"
16-
17-
"github.com/NdoleStudio/httpsms/docs"
1816

1917
otelMetric "go.opentelemetry.io/otel/metric"
2018

@@ -236,12 +234,6 @@ func (container *Container) GormLogger() gormLogger.Interface {
236234
}
237235

238236
func (container *Container) connect(dsn string, config *gorm.Config) (db *gorm.DB, err error) {
239-
if strings.HasPrefix(dsn, "libsql://") {
240-
return gorm.Open(sqlite.New(sqlite.Config{
241-
DriverName: "libsql",
242-
DSN: dsn,
243-
}), config)
244-
}
245237
return gorm.Open(postgres.Open(dsn), config)
246238
}
247239

api/pkg/repositories/gorm_heartbeat_monitor_repository.go

Lines changed: 36 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -39,13 +39,11 @@ func (repository *gormHeartbeatMonitorRepository) DeleteAllForUser(ctx context.C
3939
ctx, span := repository.tracer.Start(ctx)
4040
defer span.End()
4141

42-
return executeWithRetry(func() error {
43-
if err := repository.db.WithContext(ctx).Where("user_id = ?", userID).Delete(&entities.HeartbeatMonitor{}).Error; err != nil {
44-
msg := fmt.Sprintf("cannot delete all [%T] for user with ID [%s]", &entities.HeartbeatMonitor{}, userID)
45-
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
46-
}
47-
return nil
48-
})
42+
if err := repository.db.WithContext(ctx).Where("user_id = ?", userID).Delete(&entities.HeartbeatMonitor{}).Error; err != nil {
43+
msg := fmt.Sprintf("cannot delete all [%T] for user with ID [%s]", &entities.HeartbeatMonitor{}, userID)
44+
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
45+
}
46+
return nil
4947
}
5048

5149
// UpdatePhoneOnline updates the online status of a phone
@@ -56,16 +54,14 @@ func (repository *gormHeartbeatMonitorRepository) UpdatePhoneOnline(ctx context.
5654
ctx, cancel := context.WithTimeout(ctx, dbOperationDuration)
5755
defer cancel()
5856

59-
err := executeWithRetry(func() error {
60-
return repository.db.
61-
Model(&entities.HeartbeatMonitor{}).
62-
Where("id = ?", monitorID).
63-
Where("user_id = ?", userID).
64-
Updates(map[string]any{
65-
"phone_online": isOnline,
66-
"updated_at": time.Now().UTC(),
67-
}).Error
68-
})
57+
err := repository.db.
58+
Model(&entities.HeartbeatMonitor{}).
59+
Where("id = ?", monitorID).
60+
Where("user_id = ?", userID).
61+
Updates(map[string]any{
62+
"phone_online": isOnline,
63+
"updated_at": time.Now().UTC(),
64+
}).Error
6965
if err != nil {
7066
msg := fmt.Sprintf("cannot update heartbeat monitor ID [%s] for user [%s]", monitorID, userID)
7167
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -81,15 +77,13 @@ func (repository *gormHeartbeatMonitorRepository) UpdateQueueID(ctx context.Cont
8177
ctx, cancel := context.WithTimeout(ctx, dbOperationDuration)
8278
defer cancel()
8379

84-
err := executeWithRetry(func() error {
85-
return repository.db.
86-
Model(&entities.HeartbeatMonitor{}).
87-
Where("id = ?", monitorID).
88-
Updates(map[string]any{
89-
"queue_id": queueID,
90-
"updated_at": time.Now().UTC(),
91-
}).Error
92-
})
80+
err := repository.db.
81+
Model(&entities.HeartbeatMonitor{}).
82+
Where("id = ?", monitorID).
83+
Updates(map[string]any{
84+
"queue_id": queueID,
85+
"updated_at": time.Now().UTC(),
86+
}).Error
9387
if err != nil {
9488
msg := fmt.Sprintf("cannot update heartbeat monitor ID [%s]", monitorID)
9589
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -104,12 +98,10 @@ func (repository *gormHeartbeatMonitorRepository) Delete(ctx context.Context, us
10498
ctx, cancel := context.WithTimeout(ctx, dbOperationDuration)
10599
defer cancel()
106100

107-
err := executeWithRetry(func() error {
108-
return repository.db.WithContext(ctx).
109-
Where("user_id = ?", userID).
110-
Where("owner = ?", owner).
111-
Delete(&entities.HeartbeatMonitor{}).Error
112-
})
101+
err := repository.db.WithContext(ctx).
102+
Where("user_id = ?", userID).
103+
Where("owner = ?", owner).
104+
Delete(&entities.HeartbeatMonitor{}).Error
113105
if err != nil {
114106
msg := fmt.Sprintf("cannot delete heartbeat monitor with owner [%s] and userID [%s]", owner, userID)
115107
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -128,9 +120,7 @@ func (repository *gormHeartbeatMonitorRepository) Index(ctx context.Context, use
128120

129121
query := repository.db.WithContext(ctx).Where("user_id = ?", userID).Where("owner = ?", owner)
130122
heartbeats := new([]entities.Heartbeat)
131-
if err := executeWithRetry(func() error {
132-
return query.Order("timestamp DESC").Limit(params.Limit).Offset(params.Skip).Find(&heartbeats).Error
133-
}); err != nil {
123+
if err := query.Order("timestamp DESC").Limit(params.Limit).Offset(params.Skip).Find(&heartbeats).Error; err != nil {
134124
msg := fmt.Sprintf("cannot fetch heartbeats with owner [%s] and params [%+#v]", owner, params)
135125
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
136126
}
@@ -146,7 +136,7 @@ func (repository *gormHeartbeatMonitorRepository) Store(ctx context.Context, hea
146136
ctx, cancel := context.WithTimeout(ctx, dbOperationDuration)
147137
defer cancel()
148138

149-
if err := executeWithRetry(func() error { return repository.db.WithContext(ctx).Create(heartbeatMonitor).Error }); err != nil {
139+
if err := repository.db.WithContext(ctx).Create(heartbeatMonitor).Error; err != nil {
150140
msg := fmt.Sprintf("cannot save heartbeatMonitor monitor with ID [%s]", heartbeatMonitor.ID)
151141
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
152142
}
@@ -163,12 +153,10 @@ func (repository *gormHeartbeatMonitorRepository) Load(ctx context.Context, user
163153
defer cancel()
164154

165155
phone := new(entities.HeartbeatMonitor)
166-
err := executeWithRetry(func() error {
167-
return repository.db.WithContext(ctx).
168-
Where("user_id = ?", userID).
169-
Where("owner = ?", owner).
170-
First(&phone).Error
171-
})
156+
err := repository.db.WithContext(ctx).
157+
Where("user_id = ?", userID).
158+
Where("owner = ?", owner).
159+
First(&phone).Error
172160
if errors.Is(err, gorm.ErrRecordNotFound) {
173161
msg := fmt.Sprintf("heartbeat monitor with userID [%s] and owner [%s] does not exist", userID, owner)
174162
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
@@ -191,14 +179,12 @@ func (repository *gormHeartbeatMonitorRepository) Exists(ctx context.Context, us
191179
defer cancel()
192180

193181
var exists bool
194-
err := executeWithRetry(func() error {
195-
return repository.db.WithContext(ctx).
196-
Model(&entities.HeartbeatMonitor{}).
197-
Select("count(*) > 0").
198-
Where("user_id = ?", userID).
199-
Where("id = ?", monitorID).
200-
Find(&exists).Error
201-
})
182+
err := repository.db.WithContext(ctx).
183+
Model(&entities.HeartbeatMonitor{}).
184+
Select("count(*) > 0").
185+
Where("user_id = ?", userID).
186+
Where("id = ?", monitorID).
187+
Find(&exists).Error
202188
if err != nil {
203189
msg := fmt.Sprintf("cannot check if heartbeat monitor exists with userID [%s] and montior ID [%s]", userID, monitorID)
204190
return exists, repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))

api/pkg/repositories/gorm_heartbeat_repository.go

Lines changed: 8 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -36,9 +36,7 @@ func (repository *gormHeartbeatRepository) DeleteAllForUser(ctx context.Context,
3636
ctx, span := repository.tracer.Start(ctx)
3737
defer span.End()
3838

39-
err := executeWithRetry(func() error {
40-
return repository.db.WithContext(ctx).Where("user_id = ?", userID).Delete(&entities.Heartbeat{}).Error
41-
})
39+
err := repository.db.WithContext(ctx).Where("user_id = ?", userID).Delete(&entities.Heartbeat{}).Error
4240
if err != nil {
4341
msg := fmt.Sprintf("cannot delete all [%T] for user with ID [%s]", &entities.Heartbeat{}, userID)
4442
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -55,13 +53,11 @@ func (repository *gormHeartbeatRepository) Last(ctx context.Context, userID enti
5553
defer cancel()
5654

5755
heartbeat := new(entities.Heartbeat)
58-
err := executeWithRetry(func() error {
59-
return repository.db.WithContext(ctx).
60-
Where("user_id = ?", userID).
61-
Where("owner = ?", owner).
62-
Order("timestamp DESC").
63-
First(&heartbeat).Error
64-
})
56+
err := repository.db.WithContext(ctx).
57+
Where("user_id = ?", userID).
58+
Where("owner = ?", owner).
59+
Order("timestamp DESC").
60+
First(&heartbeat).Error
6561
if errors.Is(err, gorm.ErrRecordNotFound) {
6662
msg := fmt.Sprintf("heartbeat with userID [%s] and owner [%s] does not exist", userID, owner)
6763
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.PropagateWithCode(err, ErrCodeNotFound, msg))
@@ -90,9 +86,7 @@ func (repository *gormHeartbeatRepository) Index(ctx context.Context, userID ent
9086
}
9187

9288
heartbeats := new([]entities.Heartbeat)
93-
err := executeWithRetry(func() error {
94-
return query.Order("timestamp DESC").Limit(params.Limit).Offset(params.Skip).Find(&heartbeats).Error
95-
})
89+
err := query.Order("timestamp DESC").Limit(params.Limit).Offset(params.Skip).Find(&heartbeats).Error
9690
if err != nil {
9791
msg := fmt.Sprintf("cannot fetch heartbeats with owner [%s] and params [%+#v]", owner, params)
9892
return nil, repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
@@ -109,7 +103,7 @@ func (repository *gormHeartbeatRepository) Store(ctx context.Context, heartbeat
109103
ctx, cancel := context.WithTimeout(ctx, dbOperationDuration)
110104
defer cancel()
111105

112-
if err := executeWithRetry(func() error { return repository.db.WithContext(ctx).Create(heartbeat).Error }); err != nil {
106+
if err := repository.db.WithContext(ctx).Create(heartbeat).Error; err != nil {
113107
msg := fmt.Sprintf("cannot save heartbeat with ID [%s]", heartbeat.ID)
114108
return repository.tracer.WrapErrorSpan(span, stacktrace.Propagate(err, msg))
115109
}

api/pkg/repositories/repository.go

Lines changed: 0 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,8 @@
11
package repositories
22

33
import (
4-
"strings"
54
"time"
65

7-
"github.com/avast/retry-go/v5"
86
"github.com/palantir/stacktrace"
97
)
108

@@ -23,21 +21,3 @@ const (
2321

2422
dbOperationDuration = 5 * time.Second
2523
)
26-
27-
// isRetryableError checks if the error is a retryable connection error
28-
func isRetryableError(err error) bool {
29-
msg := err.Error()
30-
return strings.Contains(msg, "bad connection") ||
31-
strings.Contains(msg, "stream is closed") ||
32-
strings.Contains(msg, "driver: bad connection")
33-
}
34-
35-
// executeWithRetry executes a GORM query with retry logic for transient connection errors
36-
func executeWithRetry(fn func() error) (err error) {
37-
return retry.New(
38-
retry.LastErrorOnly(true),
39-
retry.Attempts(5),
40-
retry.Delay(100*time.Millisecond),
41-
retry.RetryIf(isRetryableError),
42-
).Do(fn)
43-
}

0 commit comments

Comments
 (0)