You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
121 lines
2.8 KiB
121 lines
2.8 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"time" |
|
|
|
"go-common/app/job/main/reply/model/reply" |
|
"go-common/library/database/sql" |
|
"go-common/library/log" |
|
) |
|
|
|
func (s *Service) folderHanlder(ctx context.Context, msg *consumerMsg) { |
|
var d struct { |
|
Op string `json:"op"` |
|
Oid int64 `json:"oid"` |
|
Tp int8 `json:"tp"` |
|
Root int64 `json:"root"` |
|
} |
|
if err := json.Unmarshal([]byte(msg.Data), &d); err != nil { |
|
log.Error("json.Unmarshal() error(%v)", err) |
|
return |
|
} |
|
switch d.Op { |
|
case "re_idx": |
|
s.recoverFolderIdx(ctx, d.Oid, d.Tp, d.Root) |
|
// case "marker": |
|
// 删除折叠评论后需要查询是否需要取消标记 |
|
// s.marker.Do(ctx, func(ctx context.Context) { |
|
// s.handleHasFoldedMark(ctx, d.Oid, d.Tp, d.Root) |
|
// }) |
|
default: |
|
return |
|
} |
|
} |
|
|
|
// handleFolded ... |
|
func (s *Service) handleFolded(ctx context.Context, rp *reply.Reply) { |
|
sub, root, err := s.handleHasFoldedMark(ctx, rp.Oid, rp.Type, rp.Root) |
|
if err != nil { |
|
return |
|
} |
|
if sub != nil { |
|
s.dao.Mc.DeleteSub(ctx, sub.Oid, sub.Type) |
|
} |
|
if root != nil { |
|
s.dao.Mc.DeleteReply(ctx, root.RpID) |
|
} |
|
s.remFoldedCache(ctx, rp) |
|
} |
|
|
|
func (s *Service) recoverFolderIdx(ctx context.Context, oid int64, tp int8, root int64) { |
|
rps, err := s.dao.Reply.FoldedReplies(ctx, oid, tp, root) |
|
if err != nil || len(rps) == 0 { |
|
return |
|
} |
|
// 折叠根评论 |
|
if root == 0 { |
|
s.dao.Redis.AddFolderBatch(ctx, reply.FolderKindSub, oid, rps) |
|
} else { |
|
s.dao.Redis.AddFolderBatch(ctx, reply.FolderKindRoot, root, rps) |
|
} |
|
} |
|
|
|
func (s *Service) handleHasFoldedMark(ctx context.Context, oid int64, tp int8, root int64) (sub *reply.Subject, reply *reply.Reply, err error) { |
|
var ( |
|
tx *sql.Tx |
|
count int |
|
) |
|
if tx, err = s.dao.BeginTran(ctx); err != nil { |
|
return |
|
} |
|
// 锁subject表 |
|
if sub, err = s.dao.Subject.GetForUpdate(tx, oid, tp); err != nil { |
|
tx.Rollback() |
|
return |
|
} |
|
if count, err = s.dao.Reply.TxCountFoldedReplies(tx, oid, tp, root); err != nil || count > 0 { |
|
tx.Rollback() |
|
return |
|
} |
|
// 折叠根评论 |
|
if root == 0 { |
|
if !sub.HasFolded() { |
|
tx.Rollback() |
|
return |
|
} |
|
sub.UnmarkHasFolded() |
|
if _, err = s.dao.Subject.TxUpAttr(tx, oid, tp, sub.Attr, time.Now()); err != nil { |
|
tx.Rollback() |
|
return |
|
} |
|
} else { |
|
if reply, err = s.dao.Reply.GetForUpdate(tx, oid, root); err != nil { |
|
tx.Rollback() |
|
return |
|
} |
|
if !reply.HasFolded() { |
|
tx.Rollback() |
|
return |
|
} |
|
reply.UnmarkHasFolded() |
|
if _, err = s.dao.Reply.TxUpAttr(tx, oid, root, reply.Attr, time.Now()); err != nil { |
|
tx.Rollback() |
|
return |
|
} |
|
} |
|
if err = tx.Commit(); err != nil { |
|
return |
|
} |
|
return |
|
} |
|
|
|
// remFoldedCache ... |
|
func (s *Service) remFoldedCache(ctx context.Context, rp *reply.Reply) { |
|
if rp.IsRoot() { |
|
s.dao.Redis.RemFolder(ctx, reply.FolderKindSub, rp.Oid, rp.RpID) |
|
} else { |
|
s.dao.Redis.RemFolder(ctx, reply.FolderKindRoot, rp.Root, rp.RpID) |
|
} |
|
}
|
|
|