(ctx context.Context, model Model, isForAuxDB bool)
| 108 | } |
| 109 | |
| 110 | func (app *BaseApp) delete(ctx context.Context, model Model, isForAuxDB bool) error { |
| 111 | event := new(ModelEvent) |
| 112 | event.App = app |
| 113 | event.Type = ModelEventTypeDelete |
| 114 | event.Context = ctx |
| 115 | event.Model = model |
| 116 | |
| 117 | deleteErr := app.OnModelDelete().Trigger(event, func(e *ModelEvent) error { |
| 118 | pk := cast.ToString(e.Model.LastSavedPK()) |
| 119 | if pk == "" { |
| 120 | return errors.New("the model can be deleted only if it is existing and has a non-empty primary key") |
| 121 | } |
| 122 | |
| 123 | // db write |
| 124 | return e.App.OnModelDeleteExecute().Trigger(event, func(e *ModelEvent) error { |
| 125 | var db dbx.Builder |
| 126 | if isForAuxDB { |
| 127 | db = e.App.AuxNonconcurrentDB() |
| 128 | } else { |
| 129 | db = e.App.NonconcurrentDB() |
| 130 | } |
| 131 | |
| 132 | return baseLockRetry(func(attempt int) error { |
| 133 | _, err := db.Delete(e.Model.TableName(), dbx.HashExp{ |
| 134 | idColumn: pk, |
| 135 | }).WithContext(e.Context).Execute() |
| 136 | |
| 137 | return err |
| 138 | }, defaultMaxLockRetries) |
| 139 | }) |
| 140 | }) |
| 141 | if deleteErr != nil { |
| 142 | errEvent := &ModelErrorEvent{ModelEvent: *event, Error: deleteErr} |
| 143 | errEvent.App = app // replace with the initial app in case it was changed by the hook |
| 144 | hookErr := app.OnModelAfterDeleteError().Trigger(errEvent) |
| 145 | if hookErr != nil { |
| 146 | return errors.Join(deleteErr, hookErr) |
| 147 | } |
| 148 | |
| 149 | return deleteErr |
| 150 | } |
| 151 | |
| 152 | if app.txInfo != nil { |
| 153 | // execute later after the transaction has completed |
| 154 | app.txInfo.OnComplete(func(txErr error) error { |
| 155 | if app.txInfo != nil && app.txInfo.parent != nil { |
| 156 | event.App = app.txInfo.parent |
| 157 | } |
| 158 | |
| 159 | if txErr != nil { |
| 160 | return app.OnModelAfterDeleteError().Trigger(&ModelErrorEvent{ |
| 161 | ModelEvent: *event, |
| 162 | Error: txErr, |
| 163 | }) |
| 164 | } |
| 165 | |
| 166 | return app.OnModelAfterDeleteSuccess().Trigger(event) |
| 167 | }) |
no test coverage detected