first commit
This commit is contained in:
92
backend/internal/infrastructure/database/database.go
Normal file
92
backend/internal/infrastructure/database/database.go
Normal file
@@ -0,0 +1,92 @@
|
||||
package database
|
||||
|
||||
import (
|
||||
"context"
|
||||
|
||||
"go.mongodb.org/mongo-driver/v2/mongo"
|
||||
"go.mongodb.org/mongo-driver/v2/mongo/options"
|
||||
)
|
||||
|
||||
// Database holds all repository instances
|
||||
type Database struct {
|
||||
Client *mongo.Client
|
||||
DB *mongo.Database
|
||||
UserRepo *UserRepository
|
||||
SpaceRepo *SpaceRepository
|
||||
MembershipRepo *MembershipRepository
|
||||
NoteRepo *NoteRepository
|
||||
CategoryRepo *CategoryRepository
|
||||
RevisionRepo *NoteRevisionRepository
|
||||
GroupRepo *PermissionGroupRepository
|
||||
ProviderRepo *AuthProviderRepository
|
||||
LinkRepo *UserProviderLinkRepository
|
||||
RecoveryRepo *AccountRecoveryRepository
|
||||
FeatureFlagRepo *FeatureFlagRepository
|
||||
}
|
||||
|
||||
// NewDatabase initializes a new database connection and repositories
|
||||
func NewDatabase(ctx context.Context, mongoURL string) (*Database, error) {
|
||||
client, err := mongo.Connect(options.Client().ApplyURI(mongoURL))
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
// Verify connection
|
||||
if err = client.Ping(ctx, nil); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
db := client.Database("noteapp")
|
||||
|
||||
// Create repositories
|
||||
database := &Database{
|
||||
Client: client,
|
||||
DB: db,
|
||||
UserRepo: NewUserRepository(db),
|
||||
SpaceRepo: NewSpaceRepository(db),
|
||||
MembershipRepo: NewMembershipRepository(db),
|
||||
NoteRepo: NewNoteRepository(db),
|
||||
CategoryRepo: NewCategoryRepository(db),
|
||||
RevisionRepo: NewNoteRevisionRepository(db),
|
||||
GroupRepo: NewPermissionGroupRepository(db),
|
||||
ProviderRepo: NewAuthProviderRepository(db),
|
||||
LinkRepo: NewUserProviderLinkRepository(db),
|
||||
RecoveryRepo: NewAccountRecoveryRepository(db),
|
||||
FeatureFlagRepo: NewFeatureFlagRepository(db),
|
||||
}
|
||||
|
||||
// Ensure all indexes are created
|
||||
if err := database.EnsureIndexes(ctx); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
return database, nil
|
||||
}
|
||||
|
||||
// EnsureIndexes ensures all necessary indexes are created
|
||||
func (d *Database) EnsureIndexes(ctx context.Context) error {
|
||||
if err := d.UserRepo.EnsureIndexes(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := d.SpaceRepo.EnsureIndexes(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := d.MembershipRepo.EnsureIndexes(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := d.NoteRepo.EnsureIndexes(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := d.CategoryRepo.EnsureIndexes(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
if err := d.GroupRepo.EnsureIndexes(ctx); err != nil {
|
||||
return err
|
||||
}
|
||||
return nil
|
||||
}
|
||||
|
||||
// Close closes the database connection
|
||||
func (d *Database) Close(ctx context.Context) error {
|
||||
return d.Client.Disconnect(ctx)
|
||||
}
|
||||
Reference in New Issue
Block a user