93 lines
2.5 KiB
Go
93 lines
2.5 KiB
Go
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)
|
|
}
|