/
query_del.go
121 lines (100 loc) · 2.47 KB
/
query_del.go
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
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
package dao
import (
"github.com/ArtalkJS/Artalk/internal/entity"
)
func (dao *Dao) DelComment(comment *entity.Comment) error {
// 清除 notify
if err := dao.DB().Unscoped().Where("comment_id = ?", comment.ID).Delete(&entity.Notify{}).Error; err != nil {
return err
}
// 清除 vote
if err := dao.DB().Unscoped().Where(
"target_id = ? AND (type = ? OR type = ?)",
comment.ID,
string(entity.VoteTypeCommentUp),
string(entity.VoteTypeCommentDown),
).Delete(&entity.Vote{}).Error; err != nil {
return err
}
// 删除 comment
err := dao.DB().Unscoped().Delete(comment).Error
if err != nil {
return err
}
// 删除缓存
dao.CacheAction(func(cache *DaoCache) {
cache.CommentCacheDel(comment)
})
return nil
}
// 删除所有子评论
func (dao *Dao) DelCommentChildren(parentID uint) error {
var rErr error
children := dao.FindCommentChildren(parentID)
for _, c := range children {
err := dao.DelComment(&c)
if err != nil {
rErr = err
}
}
return rErr
}
func (dao *Dao) DelPage(page *entity.Page) error {
err := dao.DB().Unscoped().Delete(page).Error
if err != nil {
return err
}
// 删除所有相关内容
var comments []entity.Comment
dao.DB().Where("page_key = ? AND site_name = ?", page.Key, page.SiteName).Find(&comments)
for _, c := range comments {
dao.DelComment(&c)
}
// 删除 vote
dao.DB().Unscoped().Where(
"target_id = ? AND (type = ? OR type = ?)",
page.ID,
string(entity.VoteTypePageUp),
string(entity.VoteTypePageDown),
).Delete(&entity.Vote{})
// 删除缓存
dao.CacheAction(func(cache *DaoCache) {
cache.PageCacheDel(page)
})
return nil
}
func (dao *Dao) DelSite(site *entity.Site) error {
err := dao.DB().Unscoped().Delete(&site).Error
if err != nil {
return err
}
// 删除所有相关内容
var pages []entity.Page
dao.DB().Where("site_name = ?", site.Name).Find(&pages)
for _, p := range pages {
dao.DelPage(&p)
}
// 删除缓存
dao.CacheAction(func(cache *DaoCache) {
cache.SiteCacheDel(site)
})
return nil
}
func (dao *Dao) DelUser(user *entity.User) error {
err := dao.DB().Unscoped().Delete(&user).Error
if err != nil {
return err
}
// 删除所有相关内容
var comments []entity.Comment
dao.DB().Where("user_id = ?", user.ID).Find(&comments)
for _, c := range comments {
dao.DelComment(&c) // 删除主评论
dao.DelCommentChildren(c.ID) // 删除子评论
}
// 删除缓存
dao.CacheAction(func(cache *DaoCache) {
cache.UserCacheDel(user)
})
return nil
}