go-common/app/interface/openplatform/article/service/cards.go
2019-04-22 18:49:16 +08:00

232 lines
5.6 KiB
Go

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
}