-
Notifications
You must be signed in to change notification settings - Fork 3
Expand file tree
/
Copy pathbatch_delete.go
More file actions
96 lines (87 loc) · 2.22 KB
/
batch_delete.go
File metadata and controls
96 lines (87 loc) · 2.22 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
package cosy
import (
"net/http"
"github.com/spf13/cast"
"github.com/uozi-tech/cosy/model"
)
type batchDeleteStruct[T any] struct {
IDs []string `json:"ids"`
}
func (c *Ctx[T]) PermanentlyBatchDelete() {
c.permanentlyDelete = true
c.BatchDestroy()
}
func (c *Ctx[T]) BatchDestroy() {
NewProcessChain(c).
SetPrepare(func(ctx *Ctx[T]) {
var batchDeleteData batchDeleteStruct[T]
if !BindAndValid(c.Context, &batchDeleteData) {
c.Abort()
return
}
c.BatchEffectedIDs = batchDeleteData.IDs
if len(c.BatchEffectedIDs) == 0 {
c.JSON(http.StatusNoContent, nil)
c.Abort()
return
}
prepareHook(ctx)
}).
SetBeforeExecute(beforeExecuteHook).
SetGormAction(func(ctx *Ctx[T]) {
if cast.ToBool(c.Query("permanent")) || c.permanentlyDelete {
ctx.Tx = ctx.Tx.Unscoped()
}
ctx.Tx = ctx.applyGormScopes(ctx.Tx)
err := ctx.Tx.Delete(&c.OriginModel, c.BatchEffectedIDs).Error
if err != nil {
ctx.AbortWithError(err)
return
}
}).
SetExecuted(executedHook).
SetResponse(func(ctx *Ctx[T]) {
ctx.JSON(http.StatusNoContent, nil)
}).
DestroyOrRecover()
}
func (c *Ctx[T]) BatchRecover() {
NewProcessChain(c).
SetPrepare(func(ctx *Ctx[T]) {
var batchDeleteData batchDeleteStruct[T]
if !BindAndValid(c.Context, &batchDeleteData) {
c.Abort()
return
}
c.BatchEffectedIDs = batchDeleteData.IDs
if len(c.BatchEffectedIDs) == 0 {
c.JSON(http.StatusNoContent, nil)
c.Abort()
return
}
prepareHook(ctx)
}).
SetBeforeExecute(beforeExecuteHook[T]).
SetGormAction(func(ctx *Ctx[T]) {
ctx.Tx = ctx.Tx.Unscoped()
ctx.Tx = ctx.applyGormScopes(ctx.Tx)
result := ctx.Tx.Where(c.itemKey+" in ?", c.BatchEffectedIDs).Model(&c.Model)
var err error
resolvedModel := model.GetResolvedModel[T]()
if deletedAt, ok := resolvedModel.Fields["DeletedAt"]; !ok ||
(deletedAt.DefaultValue == "" || deletedAt.DefaultValue == "null") {
err = result.Update("deleted_at", nil).Error
} else {
err = result.Update("deleted_at", 0).Error
}
if err != nil {
ctx.AbortWithError(err)
return
}
}).
SetExecuted(executedHook[T]).
SetResponse(func(ctx *Ctx[T]) {
ctx.JSON(http.StatusNoContent, nil)
}).
DestroyOrRecover()
}