Skip to content

Commit 6a92f6c

Browse files
AchoArnoldCopilot
andcommitted
refactor: derive MongoDB database name from URI appName parameter
- Remove hardcoded mongoDBName constant - Parse appName query parameter from MONGODB_URI as the database name - NewMongoDB now returns (client, dbName, error) - Repository constructors accept dbName parameter - DI container caches and passes the DB name to repositories - Update test .env to include appName=httpsms in URI Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent 24f1fc2 commit 6a92f6c

5 files changed

Lines changed: 51 additions & 16 deletions

File tree

api/pkg/di/container.go

Lines changed: 15 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -84,6 +84,7 @@ type Container struct {
8484
db *gorm.DB
8585
dedicatedDB *gorm.DB
8686
mongoClient *mongoDriver.Client
87+
mongoDBName string
8788
version string
8889
app *fiber.App
8990
eventDispatcher *services.EventDispatcher
@@ -301,15 +302,24 @@ func (container *Container) MongoDB() *mongoDriver.Client {
301302

302303
container.logger.Debug("creating MongoDB *mongo.Client connection")
303304

304-
client, err := repositories.NewMongoDB(os.Getenv("MONGODB_URI"))
305+
client, dbName, err := repositories.NewMongoDB(os.Getenv("MONGODB_URI"))
305306
if err != nil {
306307
container.logger.Fatal(err)
307308
}
308309

309310
container.mongoClient = client
311+
container.mongoDBName = dbName
310312
return container.mongoClient
311313
}
312314

315+
// MongoDBName returns the MongoDB database name derived from the connection URI appName
316+
func (container *Container) MongoDBName() string {
317+
if container.mongoClient == nil {
318+
container.MongoDB()
319+
}
320+
return container.mongoDBName
321+
}
322+
313323
// HedgingFailureCounter creates an OTel counter for hedging secondary write failures
314324
func (container *Container) HedgingFailureCounter() otelMetric.Int64Counter {
315325
meter := otel.GetMeterProvider().Meter(
@@ -928,14 +938,15 @@ func (container *Container) HeartbeatMonitorRepository() (repository repositorie
928938
container.Logger(),
929939
container.Tracer(),
930940
container.MongoDB(),
941+
container.MongoDBName(),
931942
)
932943
case "hedging":
933944
container.logger.Debug("creating hedging repositories.HeartbeatMonitorRepository")
934945
return repositories.NewHedgingHeartbeatMonitorRepository(
935946
container.Logger(),
936947
container.Tracer(),
937948
repositories.NewGormHeartbeatMonitorRepository(container.Logger(), container.Tracer(), container.DedicatedDB()),
938-
repositories.NewMongoHeartbeatMonitorRepository(container.Logger(), container.Tracer(), container.MongoDB()),
949+
repositories.NewMongoHeartbeatMonitorRepository(container.Logger(), container.Tracer(), container.MongoDB(), container.MongoDBName()),
939950
container.HedgingFailureCounter(),
940951
)
941952
default:
@@ -1766,14 +1777,15 @@ func (container *Container) HeartbeatRepository() repositories.HeartbeatReposito
17661777
container.Logger(),
17671778
container.Tracer(),
17681779
container.MongoDB(),
1780+
container.MongoDBName(),
17691781
)
17701782
case "hedging":
17711783
container.logger.Debug("creating hedging repositories.HeartbeatRepository")
17721784
return repositories.NewHedgingHeartbeatRepository(
17731785
container.Logger(),
17741786
container.Tracer(),
17751787
repositories.NewGormHeartbeatRepository(container.Logger(), container.Tracer(), container.DedicatedDB()),
1776-
repositories.NewMongoHeartbeatRepository(container.Logger(), container.Tracer(), container.MongoDB()),
1788+
repositories.NewMongoHeartbeatRepository(container.Logger(), container.Tracer(), container.MongoDB(), container.MongoDBName()),
17771789
container.HedgingFailureCounter(),
17781790
)
17791791
default:

api/pkg/repositories/mongo_heartbeat_monitor_repository.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,11 +26,12 @@ func NewMongoHeartbeatMonitorRepository(
2626
logger telemetry.Logger,
2727
tracer telemetry.Tracer,
2828
client *mongo.Client,
29+
dbName string,
2930
) HeartbeatMonitorRepository {
3031
return &mongoHeartbeatMonitorRepository{
3132
logger: logger.WithService(fmt.Sprintf("%T", &mongoHeartbeatMonitorRepository{})),
3233
tracer: tracer,
33-
collection: client.Database(mongoDBName).Collection(collectionHeartbeatMonitors),
34+
collection: client.Database(dbName).Collection(collectionHeartbeatMonitors),
3435
}
3536
}
3637

api/pkg/repositories/mongo_heartbeat_repository.go

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,11 +25,12 @@ func NewMongoHeartbeatRepository(
2525
logger telemetry.Logger,
2626
tracer telemetry.Tracer,
2727
client *mongo.Client,
28+
dbName string,
2829
) HeartbeatRepository {
2930
return &mongoHeartbeatRepository{
3031
logger: logger.WithService(fmt.Sprintf("%T", &mongoHeartbeatRepository{})),
3132
tracer: tracer,
32-
collection: client.Database(mongoDBName).Collection(collectionHeartbeats),
33+
collection: client.Database(dbName).Collection(collectionHeartbeats),
3334
}
3435
}
3536

api/pkg/repositories/mongodb.go

Lines changed: 31 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,7 @@ package repositories
33
import (
44
"context"
55
"fmt"
6+
"net/url"
67
"reflect"
78
"time"
89

@@ -15,7 +16,6 @@ import (
1516
)
1617

1718
const (
18-
mongoDBName = "httpsms"
1919
collectionHeartbeats = "heartbeats"
2020
collectionHeartbeatMonitors = "heartbeat_monitors"
2121
)
@@ -48,8 +48,14 @@ func newMongoRegistry() *bson.Registry {
4848
return rb
4949
}
5050

51-
// NewMongoDB creates a new *mongo.Client connection to MongoDB Atlas and ensures indexes
52-
func NewMongoDB(uri string) (*mongo.Client, error) {
51+
// NewMongoDB creates a new *mongo.Client connection to MongoDB Atlas and ensures indexes.
52+
// The database name is derived from the appName query parameter in the URI.
53+
func NewMongoDB(uri string) (*mongo.Client, string, error) {
54+
dbName, err := parseMongoDBName(uri)
55+
if err != nil {
56+
return nil, "", stacktrace.Propagate(err, "cannot parse database name from MongoDB URI")
57+
}
58+
5359
ctx, cancel := context.WithTimeout(context.Background(), 10*time.Second)
5460
defer cancel()
5561

@@ -59,22 +65,37 @@ func NewMongoDB(uri string) (*mongo.Client, error) {
5965

6066
client, err := mongo.Connect(opts)
6167
if err != nil {
62-
return nil, stacktrace.Propagate(err, "cannot connect to MongoDB Atlas")
68+
return nil, "", stacktrace.Propagate(err, "cannot connect to MongoDB Atlas")
6369
}
6470

6571
if err = client.Ping(ctx, nil); err != nil {
66-
return nil, stacktrace.Propagate(err, fmt.Sprintf("cannot ping MongoDB with URI [%s]", uri))
72+
return nil, "", stacktrace.Propagate(err, fmt.Sprintf("cannot ping MongoDB with URI [%s]", uri))
73+
}
74+
75+
if err = createMongoIndexes(ctx, client, dbName); err != nil {
76+
return nil, "", stacktrace.Propagate(err, "cannot create MongoDB indexes")
77+
}
78+
79+
return client, dbName, nil
80+
}
81+
82+
// parseMongoDBName extracts the appName query parameter from the MongoDB URI to use as the database name
83+
func parseMongoDBName(uri string) (string, error) {
84+
parsed, err := url.Parse(uri)
85+
if err != nil {
86+
return "", stacktrace.Propagate(err, fmt.Sprintf("cannot parse MongoDB URI [%s]", uri))
6787
}
6888

69-
if err = createMongoIndexes(ctx, client); err != nil {
70-
return nil, stacktrace.Propagate(err, "cannot create MongoDB indexes")
89+
appName := parsed.Query().Get("appName")
90+
if appName == "" {
91+
return "", stacktrace.NewError("MongoDB URI is missing the 'appName' query parameter which is used as the database name")
7192
}
7293

73-
return client, nil
94+
return appName, nil
7495
}
7596

76-
func createMongoIndexes(ctx context.Context, client *mongo.Client) error {
77-
db := client.Database(mongoDBName)
97+
func createMongoIndexes(ctx context.Context, client *mongo.Client, dbName string) error {
98+
db := client.Database(dbName)
7899

79100
// Heartbeats indexes
80101
heartbeatsCol := db.Collection(collectionHeartbeats)

tests/.env.test

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -29,4 +29,4 @@ GCS_BUCKET_NAME=
2929
UPTRACE_DSN=
3030
CLOUDFLARE_TURNSTILE_SECRET_KEY=
3131
HEARTBEAT_DB_BACKEND=hedging
32-
MONGODB_URI=mongodb://httpsms:testpassword@mongodb:27017/?authSource=admin
32+
MONGODB_URI=mongodb://httpsms:testpassword@mongodb:27017/?authSource=admin&appName=httpsms

0 commit comments

Comments
 (0)