spark-server/internal/module/square/model/memory_purge.go
DESKTOP-L8OUL9F\gfl0034 53426af122 feat: 多广场 channel、音乐公开 API 与订阅 package_name
支持 square/squarenovel/squaresteps/squarehealth 实例与 category 筛选;音乐增加免登录 grouped/track;订阅套餐按 package_name 区分;补 migration 0030/0031 与 OpenAPI。

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-09-30 09:02:28 +08:00

92 lines
1.9 KiB
Go

package model
import (
"context"
"spark-server/internal/module/square/entity"
"spark-server/internal/pkg/errs"
)
func (m *MemoryRepo) ListAllByAuthor(_ context.Context, authorID int64) ([]*entity.Post, error) {
if authorID <= 0 {
return nil, errs.ErrInvalidArgument
}
m.mu.Lock()
defer m.mu.Unlock()
out := make([]*entity.Post, 0)
for _, row := range m.posts {
if row.UserID == authorID {
out = append(out, clonePost(row))
}
}
return out, nil
}
func (m *MemoryRepo) PurgeUser(_ context.Context, userID int64) error {
if userID <= 0 {
return errs.ErrInvalidArgument
}
m.mu.Lock()
defer m.mu.Unlock()
owned := map[int64]bool{}
for id, post := range m.posts {
if post.UserID == userID {
owned[id] = true
}
}
for _, like := range m.likes {
if like.UserID != userID || owned[like.PostID] {
continue
}
if post, ok := m.posts[like.PostID]; ok && post.LikeCount > 0 {
post.LikeCount--
}
}
for _, c := range m.comments {
if c.UserID != userID || owned[c.PostID] || c.Status == entity.StatusDeleted {
continue
}
if post, ok := m.posts[c.PostID]; ok && post.CommentCount > 0 {
post.CommentCount--
}
}
for key, like := range m.likes {
if like.UserID == userID || owned[like.PostID] {
delete(m.likes, key)
}
}
for id, c := range m.comments {
if c.UserID == userID || owned[c.PostID] {
delete(m.comments, id)
}
}
for id, n := range m.notices {
if n.ToUserID == userID || n.FromUserID == userID || owned[n.PostID] {
delete(m.notices, id)
}
}
for postID, peers := range m.audience {
if owned[postID] {
delete(m.audience, postID)
continue
}
kept := peers[:0]
for _, peer := range peers {
if peer != userID {
kept = append(kept, peer)
}
}
m.audience[postID] = kept
}
for key := range m.noticeState {
if key.UserID == userID {
delete(m.noticeState, key)
}
}
for id := range owned {
delete(m.posts, id)
delete(m.audience, id)
}
return nil
}