From c468df95468ab70909f2918315c248397bb30ee9 Mon Sep 17 00:00:00 2001 From: Vladimir V Maksimov Date: Fri, 7 Nov 2025 11:25:09 +0300 Subject: [PATCH] db manager --- store/gorm.go | 29 +++++++++++++++++------------ tests/service_test.go | 18 +++++++++++++++--- tests/snapshot_test.go | 6 +++--- 3 files changed, 35 insertions(+), 18 deletions(-) diff --git a/store/gorm.go b/store/gorm.go index e72e4b8..da60628 100644 --- a/store/gorm.go +++ b/store/gorm.go @@ -6,41 +6,46 @@ import ( "gorm.io/gorm" ) -// GormStorage реализует интерфейс VersionStorage через GORM -type GormStorage struct { - open func() *gorm.DB +type IDBManager interface { + GetMaster() *gorm.DB + GetReplica() *gorm.DB } -func NewGormStorage(open func() *gorm.DB) *GormStorage { - return &GormStorage{open: open} +// GormStorage реализует интерфейс VersionStorage через GORM +type GormStorage struct { + manager IDBManager +} + +func NewGormStorage(manager IDBManager) *GormStorage { + return &GormStorage{manager: manager} } func (s *GormStorage) CreateDocument(doc *models.Document) error { - err := s.open().Create(&doc).Error + err := s.manager.GetMaster().Create(&doc).Error return err } func (s *GormStorage) GetDocument(id uuid.UUID) (*models.Document, error) { var d models.Document - if err := s.open().First(&d, "id = ?", id).Error; err != nil { + if err := s.manager.GetReplica().First(&d, "id = ?", id).Error; err != nil { return nil, err } return &d, nil } func (s *GormStorage) UpdateLatestVersion(docID, versionID uuid.UUID) error { - return s.open().Model(&models.Document{}). + return s.manager.GetMaster().Model(&models.Document{}). Where("id = ?", docID). Update("latest_version", versionID).Error } func (s *GormStorage) CreateVersion(v *models.Version) error { - return s.open().Create(v).Error + return s.manager.GetMaster().Create(v).Error } func (s *GormStorage) GetLatestVersion(docID uuid.UUID) (*models.Version, error) { var v models.Version - err := s.open(). + err := s.manager.GetReplica(). Where("document_id = ?", docID). Order("created_at desc"). First(&v).Error @@ -52,7 +57,7 @@ func (s *GormStorage) GetLatestVersion(docID uuid.UUID) (*models.Version, error) func (s *GormStorage) GetVersionByID(id uuid.UUID) (*models.Version, error) { var v models.Version - if err := s.open().First(&v, "id = ?", id).Error; err != nil { + if err := s.manager.GetReplica().First(&v, "id = ?", id).Error; err != nil { return nil, err } return &v, nil @@ -63,7 +68,7 @@ func (s *GormStorage) GetParentVersion(v *models.Version) (*models.Version, erro return nil, nil } var parent models.Version - if err := s.open().First(&parent, "id = ?", v.ParentID).Error; err != nil { + if err := s.manager.GetReplica().First(&parent, "id = ?", v.ParentID).Error; err != nil { return nil, err } return &parent, nil diff --git a/tests/service_test.go b/tests/service_test.go index 2bb7aa6..599e57f 100644 --- a/tests/service_test.go +++ b/tests/service_test.go @@ -12,6 +12,18 @@ import ( "gorm.io/gorm" ) +type dbManager struct { + db *gorm.DB +} + +func (s *dbManager) GetMaster() *gorm.DB { + return s.db +} + +func (s *dbManager) GetReplica() *gorm.DB { + return s.db +} + // helper: инициализация базы и сервиса func newTestService(t *testing.T) (*gorm.DB, *service.VersionService, *store.GormStorage) { db, err := gorm.Open(sqlite.Open(":memory:"), &gorm.Config{}) @@ -22,10 +34,10 @@ func newTestService(t *testing.T) (*gorm.DB, *service.VersionService, *store.Gor t.Fatalf("failed to migrate: %v", err) } + manager := &dbManager{db} + storage := store.NewGormStorage( - func() *gorm.DB { - return db - }, + manager, ) service := service.NewVersionService(storage, 5) return db, service, storage diff --git a/tests/snapshot_test.go b/tests/snapshot_test.go index 638e2f9..9b24342 100644 --- a/tests/snapshot_test.go +++ b/tests/snapshot_test.go @@ -22,10 +22,10 @@ func TestSnapshotInterval(t *testing.T) { t.Fatalf("failed to migrate: %v", err) } + manager := dbManager{db} + storage := store.NewGormStorage( - func() *gorm.DB { - return db - }, + &manager, ) // --- Service with snapshot interval = 3 ---