diff --git a/app/repository/method_delete.go b/app/repository/method_delete.go new file mode 100644 index 0000000..c2d8a78 --- /dev/null +++ b/app/repository/method_delete.go @@ -0,0 +1,31 @@ +package repository + +import ( + "repo-pattern/app/repository/smartfilter" + + "gorm.io/gorm/schema" +) + +type DeleteMethod[T schema.Tabler] struct { + repo *RepoBase[T] +} + +func (m *DeleteMethod[T]) Init(repo *RepoBase[T]) { + m.repo = repo +} + +func (m DeleteMethod[T]) Delete(filter interface{}) (int64, error) { + var ( + model T + ) + + query, err := smartfilter.ToQuery(model, filter, m.repo.dbConn) + if err != nil { + return 0, err + } + result := query.Delete(&model) + if result.Error != nil { + return 0, result.Error + } + return result.RowsAffected, nil +} diff --git a/app/repository/repository.go b/app/repository/repository.go index c2ac08b..3088cba 100644 --- a/app/repository/repository.go +++ b/app/repository/repository.go @@ -5,6 +5,8 @@ import ( "gorm.io/gorm/schema" ) +const DEFAULT_ID_FIELD = "id" + type MethodInitInterface[T schema.Tabler] interface { Init(repo *RepoBase[T]) } @@ -22,6 +24,7 @@ type RepoBase[T schema.Tabler] struct { ExistsMethod[T] CountMethod[T] SaveMethod[T] + DeleteMethod[T] } func (repo *RepoBase[T]) InitMethods(methods []MethodInitInterface[T]) { @@ -35,7 +38,7 @@ func (m *RepoBase[T]) Init(dbConn *gorm.DB, options *RepoOptions) { if options == nil { // no options provided? set defaults - m.IdField = "id" + m.IdField = DEFAULT_ID_FIELD } else { if len(options.IdField) > 0 { m.IdField = options.IdField @@ -48,6 +51,7 @@ func (m *RepoBase[T]) Init(dbConn *gorm.DB, options *RepoOptions) { &m.ExistsMethod, &m.CountMethod, &m.SaveMethod, + &m.DeleteMethod, } m.InitMethods(methods) }