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) }