spark-server/internal/module/moment/model/purge.go
2026-09-23 17:11:56 +08:00

106 lines
3.2 KiB
Go

package model
import (
"context"
"gorm.io/gorm"
"spark-server/internal/module/moment/entity"
"spark-server/internal/pkg/errs"
)
func (m *Repo) ListAllByAuthor(ctx context.Context, authorID int64) ([]*entity.Post, error) {
if authorID <= 0 {
return nil, errs.ErrInvalidArgument
}
db, err := m.session(ctx)
if err != nil {
return nil, err
}
var rows []Post
if err := db.Where("user_id = ?", authorID).Find(&rows).Error; err != nil {
return nil, mapDBErr(err)
}
return collectPosts(rows), nil
}
func (m *Repo) PurgeUser(ctx context.Context, userID int64) error {
if userID <= 0 {
return errs.ErrInvalidArgument
}
db, err := m.session(ctx)
if err != nil {
return err
}
return db.Transaction(func(tx *gorm.DB) error {
return purgeMomentUser(tx, userID)
})
}
func purgeMomentUser(tx *gorm.DB, userID int64) error {
if err := bumpOffUserLikes(tx, userID); err != nil {
return err
}
if err := bumpOffUserComments(tx, userID); err != nil {
return err
}
if err := mapDBErr(tx.Where("user_id = ?", userID).Delete(&Like{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("user_id = ?", userID).Delete(&Comment{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("to_user_id = ? OR from_user_id = ?", userID, userID).Delete(&Notice{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("user_id = ? OR peer_id = ?", userID, userID).Delete(&Hide{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("peer_id = ?", userID).Delete(&Audience{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("user_id = ?", userID).Delete(&Setting{}).Error); err != nil {
return err
}
return deleteAuthoredPosts(tx, userID)
}
func bumpOffUserLikes(tx *gorm.DB, userID int64) error {
sql := `UPDATE t_moment_posts p
INNER JOIN (SELECT post_id, COUNT(*) AS n FROM t_moment_likes WHERE user_id = ? GROUP BY post_id) x ON p.id = x.post_id
SET p.like_count = CASE WHEN p.like_count < x.n THEN 0 ELSE p.like_count - x.n END
WHERE p.user_id <> ?`
return mapDBErr(tx.Exec(sql, userID, userID).Error)
}
func bumpOffUserComments(tx *gorm.DB, userID int64) error {
sql := `UPDATE t_moment_posts p
INNER JOIN (SELECT post_id, COUNT(*) AS n FROM t_moment_comments WHERE user_id = ? AND status = ? GROUP BY post_id) x ON p.id = x.post_id
SET p.comment_count = CASE WHEN p.comment_count < x.n THEN 0 ELSE p.comment_count - x.n END
WHERE p.user_id <> ?`
return mapDBErr(tx.Exec(sql, userID, entity.StatusNormal, userID).Error)
}
func deleteAuthoredPosts(tx *gorm.DB, userID int64) error {
var ids []int64
if err := tx.Model(&Post{}).Where("user_id = ?", userID).Pluck("id", &ids).Error; err != nil {
return mapDBErr(err)
}
if len(ids) == 0 {
return nil
}
if err := mapDBErr(tx.Where("post_id IN ?", ids).Delete(&Audience{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("post_id IN ?", ids).Delete(&Like{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("post_id IN ?", ids).Delete(&Comment{}).Error); err != nil {
return err
}
if err := mapDBErr(tx.Where("post_id IN ?", ids).Delete(&Notice{}).Error); err != nil {
return err
}
return mapDBErr(tx.Where("id IN ?", ids).Delete(&Post{}).Error)
}