607 lines
18 KiB
Go
607 lines
18 KiB
Go
|
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
|
|||
|
}
|