232 lines
5.6 KiB
Go
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
|
|
}
|