123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606 |
- package service
- import (
- "context"
- "errors"
- "fmt"
- "net"
- "time"
- "go-common/app/admin/main/activity/model"
- tagmdl "go-common/app/interface/main/tag/model"
- artmdl "go-common/app/interface/openplatform/article/model"
- acccli "go-common/app/service/main/account/api"
- arcmdl "go-common/app/service/main/archive/api"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "go-common/library/sync/errgroup"
- xtime "go-common/library/time"
- "go-common/library/xstr"
- "github.com/jinzhu/gorm"
- )
- const (
- _approved = 1
- _pending = 0
- _tagArcType = 3
- )
- // LikesList .
- func (s *Service) LikesList(c context.Context, arg *model.LikesParam) (outRes *model.LikesRes, err error) {
- var (
- likeSubject *model.ActSubject
- list []*model.Like
- likeList map[int64]*model.Like
- ids, wids, mids []int64
- count int64
- offset int
- )
- if likeSubject, err = s.dao.ActSubject(c, arg.Sid); err != nil {
- return
- }
- db := s.DB
- db = db.Where("sid = ?", likeSubject.ID)
- if len(arg.States) > 0 {
- db = db.Where("state in (?)", arg.States)
- }
- if arg.Mid > 0 {
- db = db.Where("mid = ?", arg.Mid)
- }
- if arg.Wid > 0 {
- db = db.Where("wid = ?", arg.Wid)
- }
- if err = db.Model(model.Like{}).Count(&count).Error; err != nil {
- log.Error("db.Model(model.Like{}).Count() arg(%v) error(%v) ", arg, err)
- return
- }
- offset = (arg.Page - 1) * arg.PageSize
- if err = db.Offset(offset).Limit(arg.PageSize).Order("id asc").Find(&list).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("db.Model(model.Like{}).Find() arg(%v) error(%v)", arg, err)
- return
- }
- likeList = make(map[int64]*model.Like, len(list))
- ids = make([]int64, 0, len(list))
- wids = make([]int64, 0, len(list))
- mids = make([]int64, 0, len(list))
- for _, val := range list {
- ids = append(ids, val.ID)
- wids = append(wids, val.Wid)
- mids = append(mids, val.Mid)
- likeList[val.ID] = val
- //like 根据最新的逻辑获取,现在无法获取 todo
- likeList[val.ID].Like = 0
- }
- if len(list) > 0 {
- if err = s.GetContent(c, likeSubject.Type, likeList, ids, wids, mids); err != nil {
- log.Error("s.GetContent(%d,%v,%v,%v,%v) error(%v)", likeSubject.Type, likeList, ids, mids, wids, err)
- return
- }
- }
- outRes = &model.LikesRes{
- Likes: likeList,
- }
- outRes.Size = arg.PageSize
- outRes.Num = arg.Page
- outRes.Total = count
- return
- }
- // Likes .
- func (s *Service) Likes(c context.Context, Sid int64, lids []int64) (likeList map[int64]*model.Like, err error) {
- var (
- likeSubject *model.ActSubject
- like []*model.Like
- ids, wids, mids []int64
- )
- if likeSubject, err = s.dao.ActSubject(c, Sid); err != nil {
- return
- }
- if err = s.DB.Where("id in (?)", lids).Find(&like).Error; err != nil {
- log.Error("s.DB.Where(id in (%v)).Find() error(%v)", lids, err)
- return
- }
- likeList = make(map[int64]*model.Like, len(like))
- ids = make([]int64, 0, len(like))
- wids = make([]int64, 0, len(like))
- mids = make([]int64, 0, len(like))
- for _, val := range like {
- ids = append(ids, val.ID)
- wids = append(wids, val.Wid)
- mids = append(mids, val.Mid)
- likeList[val.ID] = val
- //like 根据最新的逻辑获取,现在无法获取 todo
- likeList[val.ID].Like = 0
- }
- if len(like) > 0 {
- if err = s.GetContent(c, likeSubject.Type, likeList, ids, wids, mids); err != nil {
- log.Error("s.GetContent( %d, %v, %v, %v, %v) error(%v)", likeSubject.Type, likeList, ids, mids, wids, err)
- }
- }
- return
- }
- // archiveWithTag get archives and tags.
- func (s *Service) archiveWithTag(c context.Context, aids []int64, likes map[int64]*model.Like) (err error) {
- var (
- archives *arcmdl.ArcsReply
- arcErr, tagErr error
- tags map[int64][]*tagmdl.Tag
- ip = metadata.String(c, metadata.RemoteIP)
- )
- group, errCtx := errgroup.WithContext(c)
- group.Go(func() error {
- if archives, arcErr = s.arcClient.Arcs(errCtx, &arcmdl.ArcsRequest{Aids: aids}); err != nil {
- log.Error("s.arcClient.Arcs(%v, %s) error(%v)", aids, ip, err)
- return arcErr
- }
- return nil
- })
- group.Go(func() error {
- arg := &tagmdl.ArgResTags{Oids: aids, Type: _tagArcType, RealIP: ip}
- if tags, tagErr = s.tagRPC.ResTags(errCtx, arg); tagErr != nil {
- log.Error("ResTags接口错误 s.tag.ResTag(%+v) error(%v)", arg, tagErr)
- return tagErr
- }
- return nil
- })
- if err = group.Wait(); err != nil {
- return
- }
- for _, val := range likes {
- if val.Wid != 0 {
- tem := make(map[string]interface{}, 2)
- if arch, ok := archives.Arcs[val.Wid]; ok && arch.IsNormal() {
- tem["archives"] = arch
- }
- if tag, ok := tags[val.Wid]; ok {
- temps := make([]string, 0, len(tag))
- for _, val := range tag {
- temps = append(temps, val.Name)
- }
- tem["tags"] = temps
- }
- val.Object = tem
- }
- }
- return
- }
- // accountAndContent get likecontent and accountinfo .
- func (s *Service) accountAndContent(c context.Context, ids []int64, mids []int64, likes map[int64]*model.Like) (err error) {
- var (
- contents map[int64]*model.LikeContent
- accRly *acccli.CardsReply
- )
- if contents, err = s.dao.GetLikeContent(c, ids); err != nil {
- log.Error(" s.dao.GetLikeContent(%v) error(%v)", ids, err)
- return
- }
- if accRly, err = s.accClient.Cards3(c, &acccli.MidsReq{Mids: mids}); err != nil {
- log.Error("s.AccountsInfo(%v) error(%v)", mids, err)
- return
- }
- for _, val := range likes {
- temp := make(map[string]interface{}, 2)
- if cont, ok := contents[val.ID]; ok {
- temp["content"] = cont
- }
- if val.Mid != 0 && accRly != nil {
- if acct, ok := accRly.Cards[val.Mid]; ok {
- temp["owner"] = map[string]interface{}{
- "mid": acct.Mid,
- "name": acct.Name,
- "face": acct.Face,
- "sex": acct.Sex,
- "level": acct.Level,
- }
- }
- }
- val.Object = temp
- }
- return
- }
- // articles .
- func (s *Service) articles(c context.Context, wids []int64, likes map[int64]*model.Like) (err error) {
- var artiRes map[int64]*artmdl.Meta
- if artiRes, err = s.artRPC.ArticleMetas(c, &artmdl.ArgAids{Aids: wids}); err != nil {
- log.Error("s.ArticleMetas(%v) error(%v)", wids, err)
- return
- }
- for _, val := range likes {
- if val.Wid != 0 {
- if v, ok := artiRes[val.Wid]; ok {
- val.Object = map[string]interface{}{
- "article": v,
- }
- }
- }
- }
- return
- }
- // musicsAndAct .
- func (s *Service) musicsAndAct(c context.Context, wids, mids []int64, likes map[int64]*model.Like) (err error) {
- var (
- musics *model.MusicRes
- accRly *acccli.CardsReply
- ip = metadata.String(c, metadata.RemoteIP)
- )
- if musics, err = s.dao.Musics(c, wids, ip); err != nil {
- log.Error("s.dao.Musics(%v) error(%+v)", wids, err)
- return
- }
- if accRly, err = s.accClient.Cards3(c, &acccli.MidsReq{Mids: mids}); err != nil {
- log.Error("s.AccountsInfo(%v) error(%v)", mids, err)
- return
- }
- for _, val := range likes {
- temp := make(map[string]interface{}, 2)
- if v, ok := musics.Data[val.Wid]; ok {
- temp["music"] = v
- }
- if val.Mid != 0 && accRly != nil {
- if acct, ok := accRly.Cards[val.Mid]; ok {
- temp["owner"] = map[string]interface{}{
- "mid": acct.Mid,
- "name": acct.Name,
- "face": acct.Face,
- "sex": acct.Sex,
- "level": acct.Level,
- }
- }
- }
- val.Object = temp
- }
- return
- }
- // GetContent get act_subjet extensions .
- func (s *Service) GetContent(c context.Context, likeSubType int, likes map[int64]*model.Like, ids []int64, wids []int64, mids []int64) (err error) {
- switch likeSubType {
- case model.PICTURE, model.PICTURELIKE, model.DRAWYOO, model.DRAWYOOLIKE, model.TEXT, model.TEXTLIKE, model.QUESTION:
- err = s.accountAndContent(c, ids, mids, likes)
- case model.VIDEO, model.VIDEOLIKE, model.ONLINEVOTE, model.VIDEO2, model.PHONEVIDEO, model.SMALLVIDEO:
- err = s.archiveWithTag(c, wids, likes)
- case model.ARTICLE:
- err = s.articles(c, wids, likes)
- case model.MUSIC:
- err = s.musicsAndAct(c, wids, mids, likes)
- default:
- err = ecode.RequestErr
- }
- return
- }
- // ItemUp .
- func (s *Service) ItemUp(c context.Context, sid, wid int64, state int) (likeList *model.Like, err error) {
- var likeSubject *model.ActSubject
- if likeSubject, err = s.dao.ActSubject(c, sid); err != nil {
- log.Error("s.GetLikesSubjectByID(%d) error(%v)", sid, err)
- return
- }
- likeList = new(model.Like)
- if err = s.DB.Where("sid =?", likeSubject.ID).Where("wid = ?", wid).Last(likeList).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("s.DB.Model(model.Like{}).Where(sid =? %d).Where(wid = ?, %d).Last(),error(%v)", likeSubject.ID, wid, err)
- return
- }
- if likeList.ID == 0 {
- err = nil
- return
- }
- likeList.State = state
- likeList.Mtime = xtime.Time(time.Now().Unix())
- if err = s.DB.Model(&model.Like{}).Where("id =?", likeList.ID).Update(map[string]interface{}{"state": state, "mtime": likeList.Mtime.Time().Format("2006-01-02 15:04:05")}).Error; err != nil {
- log.Error("s.DB.Model(&model.Like{}).Where(id =?, %d).Update() error(%v) ", likeList.ID, err)
- }
- return
- }
- // ItemAdd .
- func (s *Service) ItemAdd(c context.Context, args *model.AddLikes) (likeList *model.Like, err error) {
- var (
- likeSubject *model.ActSubject
- ip = metadata.String(c, metadata.RemoteIP)
- )
- if likeSubject, err = s.dao.ActSubject(c, args.Sid); err != nil {
- log.Error(" s.GetLikesSubjectByID(%d) error(%v) ", args.Sid, err)
- return
- }
- //怀疑原代码这里是个bug?? todo
- if args.Type != likeSubject.Type {
- err = errors.New("ItemAdd params liketype error")
- return
- }
- likeList = new(model.Like)
- if err = s.DB.Where("sid =?", likeSubject.ID).Where("wid = ?", args.Wid).Last(likeList).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("s.DB.Model(model.Like{}).Where(sid =?, %d).Where(wid = ?, %d).Last() error(%v)", likeSubject.ID, args.Wid, err)
- return
- }
- if err == gorm.ErrRecordNotFound {
- addLike := &model.Like{
- Type: args.Type,
- Wid: args.Wid,
- Sid: likeSubject.ID,
- Mid: args.Mid,
- State: args.State,
- }
- ipv6 := net.ParseIP(ip)
- if ipv6 == nil {
- ipv6 = []byte{}
- }
- addLikeContent := &model.LikeContent{
- Plat: args.Plat,
- Device: args.Device,
- Message: "no",
- Image: "no",
- IPv6: ipv6,
- }
- tx := s.DB.Begin()
- if err = tx.Create(addLike).Error; err != nil {
- log.Error("db.Model(&model.Like{}).Create(%v) error(%v)", addLike, err)
- tx.Rollback()
- return
- }
- addLikeContent.ID = addLike.ID
- if err = tx.Create(addLikeContent).Error; err != nil {
- log.Error("db.Model(&model.LikeContent{}).Create(%v) error(%v)\n", addLikeContent, err)
- tx.Rollback()
- return
- }
- tx.Commit()
- likeList = addLike
- } else {
- likeList.State = args.State
- likeList.Mtime = xtime.Time(time.Now().Unix())
- if err = s.DB.Model(&model.Like{}).Where("id =?", likeList.ID).Update(map[string]interface{}{"state": args.State, "mtime": likeList.Mtime.Time().Format("2006-01-02 15:04:05")}).Error; err != nil {
- log.Error("s.DB.Model(&model.Like{}).Where(id =?, %d).Update() error(%v) ", likeList.ID, err)
- }
- }
- return
- }
- // AddPicContent .
- func (s *Service) AddPicContent(c context.Context, args *model.AddPic) (likeID int64, err error) {
- var (
- likeSubject *model.ActSubject
- ip = metadata.String(c, metadata.RemoteIP)
- )
- if likeSubject, err = s.dao.ActSubject(c, args.Sid); err != nil {
- log.Error(" s.GetLikesSubjectByID(%d) error(%v) ", args.Sid, err)
- return
- }
- likes := &model.Like{
- Sid: likeSubject.ID,
- Wid: args.Wid,
- Type: args.Type,
- Mid: args.Mid,
- State: _pending,
- }
- ipv6 := net.ParseIP(ip)
- if ipv6 == nil {
- ipv6 = []byte{}
- }
- likeContent := &model.LikeContent{
- IPv6: ipv6,
- Plat: args.Plat,
- Device: args.Device,
- Message: args.Message,
- Link: args.Link,
- Image: args.Image, //只支持传image串(需要支持传文件)todo
- }
- tx := s.DB.Begin()
- if err = tx.Create(likes).Error; err != nil {
- log.Error("db.Model(&model.Like{}).Create(%v) error(%v)", likes, err)
- tx.Rollback()
- return
- }
- likeContent.ID = likes.ID
- if err = tx.Create(likeContent).Error; err != nil {
- log.Error("db.Model(&model.LikeContent{}).Create(%v) error(%v)\n", likeContent, err)
- tx.Rollback()
- return
- }
- tx.Commit()
- likeID = likes.ID // need to update todo
- return
- }
- // BatchLikes .
- func (s *Service) BatchLikes(c context.Context, args *model.BatchLike) (err error) {
- var (
- likes []*model.Like
- likeMap map[int64]*model.Like
- addWid []int64
- ipv6 = net.ParseIP(metadata.String(c, metadata.RemoteIP))
- )
- if ipv6 == nil {
- ipv6 = []byte{}
- }
- if err = s.DB.Where(fmt.Sprintf("sid = ? and wid in (%s)", xstr.JoinInts(args.Wid)), args.Sid).Find(&likes).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("s.DB.Where(%d,%v) error(%v)", args.Sid, args.Wid, err)
- return
- }
- if err == gorm.ErrRecordNotFound {
- addWid = args.Wid
- } else {
- likeMap = make(map[int64]*model.Like, len(likes))
- for _, v := range likes {
- likeMap[v.Wid] = v
- }
- addWid = make([]int64, 0, len(args.Wid))
- for _, v := range args.Wid {
- if _, ok := likeMap[v]; !ok {
- addWid = append(addWid, v)
- }
- }
- }
- if len(addWid) == 0 {
- return
- }
- item := &model.Like{
- Sid: args.Sid,
- Mid: args.Mid,
- Type: args.Type,
- State: _pending,
- }
- if err = s.dao.BatchLike(c, item, addWid, ipv6); err != nil {
- log.Error("s.dao.BatchLike(%v) error(%+v)", addWid, err)
- }
- return
- }
- // VideoAdd .
- func (s *Service) VideoAdd(c context.Context, args *model.AddLikes) (likeList *model.Like, err error) {
- var (
- likeSubject *model.ActSubject
- ip = metadata.String(c, metadata.RemoteIP)
- )
- if likeSubject, err = s.dao.ActSubject(c, args.Sid); err != nil {
- log.Error("s.dao.ActSubject(%d) error(%v) ", args.Sid, err)
- return
- }
- if likeSubject.Type != model.VIDEO && likeSubject.Type != model.VIDEOLIKE && likeSubject.Type != model.VIDEO2 {
- err = errors.New("VideoAdd params liketype error")
- return
- }
- likeList = new(model.Like)
- if err = s.DB.Where("sid =?", likeSubject.ID).Where("wid = ?", args.Wid).Last(likeList).Error; err != nil && err != gorm.ErrRecordNotFound {
- log.Error("s.DB.Model(&model.Like{}).Where(sid =?, %d).Where(wid = ?, %d).Last() error(%v)", likeSubject.ID, args.Wid, err)
- return
- }
- if err == gorm.ErrRecordNotFound {
- addLike := &model.Like{
- Type: args.Type,
- Wid: args.Wid,
- Sid: likeSubject.ID,
- Mid: args.Mid,
- State: _approved,
- }
- ipv6 := net.ParseIP(ip)
- if ipv6 == nil {
- ipv6 = []byte{}
- }
- addLikeContent := &model.LikeContent{
- IPv6: ipv6,
- Plat: args.Plat,
- Device: args.Device,
- Message: "no",
- Image: "no",
- }
- tx := s.DB.Begin()
- if err = tx.Create(addLike).Error; err != nil {
- log.Error("db.Model(&model.Like{}).Create(%v) error(%v)", addLike, err)
- tx.Rollback()
- return
- }
- addLikeContent.ID = addLike.ID
- if err = tx.Create(addLikeContent).Error; err != nil {
- log.Error("tx.Model(&model.LikeContent{}).Create(%v) error(%v)", addLikeContent, err)
- tx.Rollback()
- return
- }
- tx.Commit()
- likeList = addLike
- } else {
- likeList.State = _approved
- likeList.Mtime = xtime.Time(time.Now().Unix())
- if err = s.DB.Model(&model.Like{}).Where("id =?", likeList.ID).Update(map[string]interface{}{"state": _approved, "mtime": likeList.Mtime.Time().Format("2006-01-02 15:04:05")}).Error; err != nil {
- log.Error("ls.DB.Model(&model.Like{}).Where(id =?, %d).Update() error(%v) ", likeList.ID, err)
- }
- }
- return
- }
- // UpLikesState .
- func (s *Service) UpLikesState(c context.Context, IDs []int64, state int, reply string, username string) (err error) {
- if err = s.DB.Model(&model.Like{}).Where("id in (?)", xstr.JoinInts(IDs)).Update(map[string]interface{}{"state": state}).Error; err != nil {
- log.Info("s.DB.Model(&model.Like{}).Where(id = ?,%d).Update() error(%v)", IDs, err)
- return
- }
- if reply != "" {
- s.DB.Model(&model.LikeContent{}).Where("id in (?)", xstr.JoinInts(IDs)).Update(map[string]interface{}{"reply": reply})
- }
- if state != 0 {
- for _, v := range IDs {
- likeLog := &model.ActLikeLog{
- Lid: v,
- User: username,
- State: int64(state),
- }
- s.DB.Create(likeLog)
- }
- }
- return
- }
- // UpLike .
- func (s *Service) UpLike(c context.Context, args *model.UpLike, username string) (res int64, err error) {
- likes := map[string]interface{}{
- "Type": args.Type,
- "Mid": args.Mid,
- "Wid": args.Wid,
- "State": args.State,
- "StickTop": args.StickTop,
- }
- if err = s.DB.Model(model.Like{}).Where("id = ?", args.Lid).Update(likes).Error; err != nil {
- log.Error("s.DB.Model(model.Like{}).Where(id = ?, %d).Update() error(%v)", args.Lid, err)
- return
- }
- likeContent := map[string]interface{}{
- "Message": args.Message,
- "Reply": args.Reply,
- "Link": args.Link,
- "Image": args.Image,
- }
- if err = s.DB.Model(model.LikeContent{}).Where("id = ?", args.Lid).Update(likeContent).Error; err != nil {
- log.Error("s.DB.Model(model.LikeContent{}).Where(id = ?,%d).Update() error(%v)", args.Lid, err)
- return
- }
- if args.State != 0 {
- likeLog := &model.ActLikeLog{
- Lid: args.Lid,
- User: username,
- State: int64(args.State),
- }
- s.DB.Create(likeLog)
- }
- res = args.Lid
- return
- }
- // AddLike .
- func (s *Service) AddLike(c context.Context, args *model.AddLikes) (likesRes *model.Like, err error) {
- switch args.DealType {
- case "itemUp":
- likesRes, err = s.ItemUp(c, args.Sid, args.Wid, args.State)
- case "itemAdd":
- likesRes, err = s.ItemAdd(c, args)
- case "videoAdd":
- likesRes, err = s.VideoAdd(c, args)
- default:
- err = errors.New("type error")
- }
- return
- }
- // UpWid .
- func (s *Service) UpWid(c context.Context, args *model.UpWid) (err error) {
- var (
- subject *model.ActSubject
- )
- if subject, err = s.dao.ActSubject(c, args.Sid); err != nil {
- return
- }
- like := map[string]interface{}{
- "state": args.State,
- "mtime": xtime.Time(time.Now().Unix()),
- }
- if err := s.DB.Model(&model.Like{}).Where("sid = ? and wid = ?", subject.ID, args.Wid).Update(like).Limit(1).Error; err != nil {
- log.Error("actSrv.DB.Where(sid = %d and wid = %d).Update().Limit(1) error(%v)", subject.ID, args.Wid, err)
- }
- return
- }
|