Added new feature - on soft delete, update additional fields from model/struct in the same update operation by using "updateOnSoftDelete" field tag

This commit is contained in:
Tabuci Octavian 2023-04-11 13:07:54 +03:00
parent e9637024d3
commit 13338381ca
2 changed files with 26 additions and 1 deletions

View File

@ -62,6 +62,7 @@ type Field struct {
Creatable bool
Updatable bool
Readable bool
UpdateOnSoftDelete bool
AutoCreateTime TimeType
AutoUpdateTime TimeType
HasDefaultValue bool
@ -113,6 +114,7 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
Creatable: true,
Updatable: true,
Readable: true,
UpdateOnSoftDelete: false,
PrimaryKey: utils.CheckTruth(tagSetting["PRIMARYKEY"], tagSetting["PRIMARY_KEY"]),
AutoIncrement: utils.CheckTruth(tagSetting["AUTOINCREMENT"]),
HasDefaultValue: utils.CheckTruth(tagSetting["AUTOINCREMENT"]),
@ -329,6 +331,10 @@ func (schema *Schema) ParseField(fieldStruct reflect.StructField) *Field {
}
}
if _, ok := field.TagSettings["UPDATEONSOFTDELETE"]; ok {
field.UpdateOnSoftDelete = true
}
// setup permission
if val, ok := field.TagSettings["-"]; ok {
val = strings.ToLower(strings.TrimSpace(val))

View File

@ -142,9 +142,28 @@ func (sd SoftDeleteDeleteClause) MergeClause(*clause.Clause) {
func (sd SoftDeleteDeleteClause) ModifyStatement(stmt *Statement) {
if stmt.SQL.Len() == 0 && !stmt.Statement.Unscoped {
curTime := stmt.DB.NowFunc()
stmt.AddClause(clause.Set{{Column: clause.Column{Name: sd.Field.DBName}, Value: curTime}})
var setColumns clause.Set = clause.Set{{Column: clause.Column{Name: sd.Field.DBName}, Value: curTime}}
stmt.SetColumn(sd.Field.DBName, curTime, true)
modelRefVal := reflect.ValueOf(stmt.Model)
if modelRefVal.Kind() == reflect.Ptr {
modelRefVal = reflect.Indirect(modelRefVal)
}
if stmt.Model != nil && stmt.Schema != nil {
// Add additional fields to update in the same operation!
for _, field := range stmt.Schema.Fields {
if field.UpdateOnSoftDelete {
fieldVal := modelRefVal.FieldByName(field.Name).Interface()
setColumns = append(setColumns, clause.Assignment{Column: clause.Column{Name: field.DBName}, Value: fieldVal})
stmt.SetColumn(field.DBName, fieldVal)
}
}
}
stmt.AddClause(setColumns)
if stmt.Schema != nil {
_, queryValues := schema.GetIdentityFieldValuesMap(stmt.Context, stmt.ReflectValue, stmt.Schema.PrimaryFields)
column, values := schema.ToQueryValues(stmt.Table, stmt.Schema.PrimaryFieldDBNames, queryValues)