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.
231 lines
5.6 KiB
231 lines
5.6 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"strconv" |
|
|
|
"go-common/app/interface/openplatform/article/model" |
|
"go-common/app/service/main/archive/api" |
|
"go-common/library/ecode" |
|
"go-common/library/sync/errgroup" |
|
) |
|
|
|
// FindCard find card from source |
|
func (s *Service) FindCard(c context.Context, idStr string) (res interface{}, err error) { |
|
var id int64 |
|
if len(idStr) < 3 { |
|
err = ecode.RequestErr |
|
return |
|
} |
|
id, _ = strconv.ParseInt(idStr[2:], 10, 64) |
|
prefix := idStr[:2] |
|
if prefix == model.CardPrefixAudio { |
|
resp, err1 := s.dao.AudioCard(c, []int64{id}) |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
if resp != nil { |
|
res = resp[id] |
|
} |
|
return res, err1 |
|
} |
|
if prefix == model.CardPrefixBangumi { |
|
resp, err1 := s.dao.BangumiCard(c, []int64{id}, nil) |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
if resp != nil { |
|
res = resp[id] |
|
} |
|
return res, err1 |
|
} |
|
if prefix == model.CardPrefixBangumiEp { |
|
resp, err1 := s.dao.BangumiCard(c, nil, []int64{id}) |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
if resp != nil { |
|
res = resp[id] |
|
} |
|
return res, err1 |
|
} |
|
if prefix == model.CardPrefixTicket { |
|
resp, err1 := s.dao.TicketCard(c, []int64{id}) |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
if resp != nil { |
|
res = resp[id] |
|
} |
|
return res, err1 |
|
} |
|
if prefix == model.CardPrefixMall { |
|
resp, err1 := s.dao.MallCard(c, []int64{id}) |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
if resp != nil { |
|
res = resp[id] |
|
} |
|
return res, err1 |
|
} |
|
if prefix == model.CardPrefixArchive { |
|
resp, err1 := s.Archives(c, []int64{id}, "") |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
if resp != nil { |
|
res = resp[id] |
|
} |
|
return res, err1 |
|
} |
|
if prefix == model.CardPrefixArticle { |
|
resp, err1 := s.ArticleMeta(c, id) |
|
if err1 != nil { |
|
return nil, err1 |
|
} |
|
return resp, err1 |
|
} |
|
err = ecode.RequestErr |
|
return |
|
} |
|
|
|
// FindCards find cards |
|
func (s *Service) FindCards(c context.Context, ids []string) (res map[string]interface{}, err error) { |
|
var ( |
|
bangumis, eps, audios, malls, tickets, archives, articles []int64 |
|
bangumiRes map[int64]*model.BangumiCard |
|
epRes map[int64]*model.BangumiCard |
|
audioRes map[int64]*model.AudioCard |
|
mallRes map[int64]*model.MallCard |
|
ticketRes map[int64]*model.TicketCard |
|
archiveRes map[int64]*api.Arc |
|
articleRes map[int64]*model.Meta |
|
) |
|
for _, idStr := range ids { |
|
if len(idStr) < 2 { |
|
continue |
|
} |
|
id, _ := strconv.ParseInt(idStr[2:], 10, 64) |
|
switch idStr[:2] { |
|
case model.CardPrefixAudio: |
|
audios = append(audios, id) |
|
case model.CardPrefixBangumi: |
|
bangumis = append(bangumis, id) |
|
case model.CardPrefixBangumiEp: |
|
eps = append(eps, id) |
|
case model.CardPrefixMall: |
|
malls = append(malls, id) |
|
case model.CardPrefixTicket: |
|
tickets = append(tickets, id) |
|
case model.CardPrefixArchive: |
|
archives = append(archives, id) |
|
case model.CardPrefixArticle: |
|
articles = append(articles, id) |
|
} |
|
} |
|
group := errgroup.Group{} |
|
group.Go(func() (err error) { |
|
if len(bangumis) < 1 { |
|
return nil |
|
} |
|
if bangumiRes, err = s.dao.BangumiCard(c, bangumis, nil); err == nil { |
|
cache.Save(func() { |
|
s.dao.AddBangumiCardsCache(context.TODO(), bangumiRes) |
|
}) |
|
} else { |
|
bangumiRes, _ = s.dao.BangumiCardsCache(c, bangumis) |
|
} |
|
return nil |
|
}) |
|
group.Go(func() (err error) { |
|
if len(eps) < 1 { |
|
return nil |
|
} |
|
if epRes, err = s.dao.BangumiCard(c, nil, eps); err == nil { |
|
cache.Save(func() { |
|
s.dao.AddBangumiEpCardsCache(context.TODO(), epRes) |
|
}) |
|
} else { |
|
epRes, _ = s.dao.BangumiEpCardsCache(c, eps) |
|
} |
|
return nil |
|
}) |
|
group.Go(func() (err error) { |
|
if len(audios) < 1 { |
|
return nil |
|
} |
|
if audioRes, err = s.dao.AudioCard(c, audios); err == nil { |
|
cache.Save(func() { |
|
s.dao.AddAudioCardsCache(context.TODO(), audioRes) |
|
}) |
|
} else { |
|
audioRes, _ = s.dao.AudioCardsCache(c, audios) |
|
} |
|
return nil |
|
}) |
|
group.Go(func() (err error) { |
|
if len(malls) < 1 { |
|
return nil |
|
} |
|
if mallRes, err = s.dao.MallCard(c, malls); err == nil { |
|
cache.Save(func() { |
|
s.dao.AddMallCardsCache(context.TODO(), mallRes) |
|
}) |
|
} else { |
|
mallRes, _ = s.dao.MallCardsCache(c, malls) |
|
} |
|
return nil |
|
}) |
|
group.Go(func() (err error) { |
|
if len(tickets) < 1 { |
|
return nil |
|
} |
|
if ticketRes, err = s.dao.TicketCard(c, tickets); err == nil { |
|
cache.Save(func() { |
|
s.dao.AddTicketCardsCache(context.TODO(), ticketRes) |
|
}) |
|
} else { |
|
ticketRes, _ = s.dao.TicketCardsCache(c, tickets) |
|
} |
|
return nil |
|
}) |
|
group.Go(func() (err error) { |
|
if len(archives) < 1 { |
|
return nil |
|
} |
|
archiveRes, _ = s.Archives(c, archives, "") |
|
return nil |
|
}) |
|
group.Go(func() (err error) { |
|
if len(articles) < 1 { |
|
return nil |
|
} |
|
articleRes, _ = s.ArticleMetas(c, articles) |
|
return nil |
|
}) |
|
group.Wait() |
|
res = make(map[string]interface{}) |
|
for id, v := range bangumiRes { |
|
res[model.CardPrefixBangumi+strconv.FormatInt(id, 10)] = v |
|
} |
|
for id, v := range epRes { |
|
res[model.CardPrefixBangumiEp+strconv.FormatInt(id, 10)] = v |
|
} |
|
for id, v := range ticketRes { |
|
res[model.CardPrefixTicket+strconv.FormatInt(id, 10)] = v |
|
} |
|
for id, v := range mallRes { |
|
res[model.CardPrefixMall+strconv.FormatInt(id, 10)] = v |
|
} |
|
for id, v := range audioRes { |
|
res[model.CardPrefixAudio+strconv.FormatInt(id, 10)] = v |
|
} |
|
for id, v := range archiveRes { |
|
res[model.CardPrefixArchive+strconv.FormatInt(id, 10)] = v |
|
} |
|
for id, v := range articleRes { |
|
res[model.CardPrefixArticle+strconv.FormatInt(id, 10)] = v |
|
} |
|
return |
|
}
|
|
|