123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119 |
- package service
- import (
- "context"
- model "go-common/app/interface/main/reply/model/reply"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- func (s *Service) subject(c context.Context, oid int64, tp int8) (sub *model.Subject, err error) {
- if sub, err = s.dao.Mc.GetSubject(c, oid, tp); err != nil {
- log.Error("replyCacheDao.GetSubject(%d,%d) error(%v)", oid, tp, err)
- return
- } else if sub == nil {
- if sub, err = s.dao.Subject.Get(c, oid, tp); err != nil {
- log.Error("s.subject.Get(%d,%d) error(%v)", oid, tp, err)
- return
- }
- if sub == nil {
- sub = &model.Subject{ID: -1, Oid: oid, Type: tp, State: model.SubStateForbid} // empty cache
- }
- s.cache.Do(c, func(ctx context.Context) {
- if err = s.dao.Mc.AddSubject(ctx, sub); err != nil {
- log.Error("s.dao.Mc.AddSubject(%d,%d) error(%v)", oid, tp, err)
- }
- })
- }
- return
- }
- // ReplyCount get all reply count.
- func (s *Service) ReplyCount(c context.Context, oid int64, tp int8) (count int, err error) {
- if !model.LegalSubjectType(tp) {
- err = ecode.ReplyIllegalSubType
- return
- }
- sub, err := s.subject(c, oid, tp)
- if err != nil {
- return
- }
- if sub != nil && sub.State != model.SubStateForbid {
- count = sub.ACount
- }
- return
- }
- // GetReplyCounts get reply counts.
- func (s *Service) GetReplyCounts(ctx context.Context, oids []int64, otyp int8) (map[int64]*model.Counts, error) {
- caches, missIDs, err := s.dao.Mc.GetMultiSubject(ctx, oids, otyp)
- if err != nil {
- return nil, err
- }
- if len(missIDs) > 0 {
- miss, err := s.dao.Subject.Gets(ctx, missIDs, otyp)
- if err != nil {
- log.Error("s.subject.Gets(%v,%d) error(%v)", missIDs, otyp, err)
- return nil, err
- }
- if caches == nil {
- caches = make(map[int64]*model.Subject)
- }
- var subs []*model.Subject
- for _, oid := range missIDs {
- sub, ok := miss[oid]
- if !ok {
- sub = &model.Subject{ID: -1, Oid: oid, Type: otyp, State: model.SubStateForbid}
- }
- caches[oid] = sub
- subs = append(subs, sub)
- }
- s.cache.Do(ctx, func(ctx context.Context) { s.dao.Mc.AddSubject(ctx, subs...) })
- }
- counts := make(map[int64]*model.Counts)
- for _, sub := range caches {
- counts[sub.Oid] = &model.Counts{
- SubjectState: sub.State,
- Counts: int64(sub.ACount),
- }
- }
- return counts, nil
- }
- // ReplyCounts get all reply count.
- func (s *Service) ReplyCounts(c context.Context, oids []int64, tp int8) (counts map[int64]int, err error) {
- caches, missIDs, err := s.dao.Mc.GetMultiSubject(c, oids, tp)
- if err != nil {
- return
- }
- if len(missIDs) > 0 {
- var miss map[int64]*model.Subject
- if miss, err = s.dao.Subject.Gets(c, missIDs, tp); err != nil {
- log.Error("s.subject.Gets(%v,%d) error(%v)", missIDs, tp, err)
- return
- }
- if caches == nil {
- caches = make(map[int64]*model.Subject, len(miss))
- }
- subs := make([]*model.Subject, 0, len(miss))
- for _, oid := range missIDs {
- sub, ok := miss[oid]
- if !ok {
- sub = &model.Subject{ID: -1, Oid: oid, Type: tp, State: model.SubStateForbid} // empty cache
- }
- caches[oid] = sub
- subs = append(subs, sub)
- }
- s.cache.Do(c, func(ctx context.Context) { s.dao.Mc.AddSubject(ctx, subs...) })
- }
- counts = make(map[int64]int, len(caches))
- for _, sub := range caches {
- if sub.State == model.SubStateForbid {
- counts[sub.Oid] = 0
- } else {
- counts[sub.Oid] = sub.ACount
- }
- }
- return
- }
|