diff --git a/repository/Repository.go b/repository/Repository.go index bac25e0..a77c0e5 100644 --- a/repository/Repository.go +++ b/repository/Repository.go @@ -1,6 +1,7 @@ package repository import ( + "errors" "fmt" "net/http" "strconv" @@ -24,6 +25,7 @@ type Repository interface { GetAllUnscopedForTenant(uow *UnitOfWork, out interface{}, tenantID uuid.UUID, queryProcessors []QueryProcessor) microappError.DatabaseError GetCount(uow *UnitOfWork, out *int64, entity interface{}, queryProcessors []QueryProcessor) microappError.DatabaseError GetCountForTenant(uow *UnitOfWork, out *int64, tenantID uuid.UUID, entity interface{}, queryProcessors []QueryProcessor) microappError.DatabaseError + CheckVersionandUpdate(uow *UnitOfWork, entity interface{}, queryProcessors []QueryProcessor) microappError.DatabaseError Add(uow *UnitOfWork, out interface{}) microappError.DatabaseError Update(uow *UnitOfWork, out interface{}) microappError.DatabaseError @@ -377,6 +379,21 @@ func (repository *GormRepository) Update(uow *UnitOfWork, entity interface{}) mi return nil } +// CheckVersionandUpdate specified Entity after checking for version change +func (repository *GormRepository) CheckVersionandUpdate(uow *UnitOfWork, entity interface{}, queryProcessors []QueryProcessor) microappError.DatabaseError { + var count int64 + if err := repository.GetCount(uow, &count, entity, queryProcessors); err != nil { + return microappError.NewDatabaseError(err) + } + if count == 0 { + return microappError.NewDatabaseError(errors.New("row data modified")) + } + if err := uow.DB.Model(entity).Updates(entity).Error; err != nil { + return microappError.NewDatabaseError(err) + } + return nil +} + // Delete specified Entity func (repository *GormRepository) Delete(uow *UnitOfWork, entity interface{}, where ...interface{}) microappError.DatabaseError { if err := uow.DB.Delete(entity, where...).Error; err != nil {