Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

refactor:interaction #24

Merged
merged 1 commit into from
Apr 27, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
11 changes: 6 additions & 5 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ IDL_PATH = $(DIR)/idl
RPC = $(DIR)/cmd
API_PATH= $(DIR)/cmd/api
SHELL=/bin/bash
KITEX_GEN_PATH=$(DIR)/kitex_gen
MODULE= bibi

.PHONY: init
Expand All @@ -21,7 +22,7 @@ env-down:

SERVICES := api user video interaction
service = $(word 1, $@)
.PHONY: $(SERVICES)
.PHONY: ${SERVICES}
$(SERVICES):
go run $(RPC)/$(service)

Expand All @@ -36,11 +37,11 @@ KSERVICES := user video interaction
.PHONY: kgen
kgen:
@for kservice in $(KSERVICES); do \
# sh kitex_update.sh $$kservice; \
kitex -module ${MODULE} idl/$$kservice.thrift; \
cd ${RPC};cd $$kservice;kitex -module ${MODULE} -service $$kservice -use bibi/kitex_gen ../../idl/$$kservice.thrift; \
kitex -module ${MODULE} ${IDL_PATH}/$$kservice.thrift; \
cd ${RPC};cd $$kservice;kitex -module ${MODULE} -service $$kservice -use ${KITEX_GEN_PATH} ${IDL_PATH}/$$kservice.thrift; \
cd ../../; \
done \
echo "done"


.PHONY: hzgen
hzgen:
Expand Down
3 changes: 1 addition & 2 deletions cmd/api/biz/handler/api/interaction_handler.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

12 changes: 6 additions & 6 deletions cmd/api/biz/model/api/api.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

30 changes: 12 additions & 18 deletions cmd/interaction/handler.go
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import (
"bibi/pkg/errno"
"bibi/pkg/pack"
"context"
"fmt"
)

// InteractionHandlerImpl implements the last service interface defined in the IDL.
Expand Down Expand Up @@ -35,28 +36,15 @@ func (s *InteractionHandlerImpl) LikeAction(ctx context.Context, req *interactio
// LikeList implements the InteractionHandlerImpl interface.
func (s *InteractionHandlerImpl) LikeList(ctx context.Context, req *interaction.LikeListRequest) (resp *interaction.LikeListResponse, err error) {
resp = new(interaction.LikeListResponse)
allLikeResp, err := service.NewInteractionService(ctx).LikeVideoList(req, req.UserId)
videoResp, count, err := service.NewInteractionService(ctx).LikeVideoList(req, req.UserId)
resp.Base = pack.BuildBaseResp(err)
if err != nil {
resp.Base = pack.BuildBaseResp(err)
return resp, nil
}
count := int64(len(allLikeResp))
resp.VideoList = videoResp
resp.VideoCount = &count

//var likeResp []int64
//if len(allLikeResp) <= int(req.PageNum-1)*constants.PageSize || int(req.PageNum-1)*constants.PageSize < 0 {
// resp.Base = pack.BuildBaseResp(nil)
// return resp, nil
//} else {
// fst := int(req.PageNum-1) * constants.PageSize
// for i := fst; i < fst+constants.PageSize && i < len(allLikeResp); i++ {
// likeResp = append(likeResp, allLikeResp[i])
// }
//}
//todo:
//videosResp:=make([]*video.Video,constants.PageSize)
//GetLikeVideoList

fmt.Println(*videoResp[1])
return resp, nil
}

Expand Down Expand Up @@ -93,7 +81,13 @@ func (s *InteractionHandlerImpl) GetLikesCountByVideoIdList(ctx context.Context,
// GetIsLikeByVideoIdList implements the InteractionHandlerImpl interface.
func (s *InteractionHandlerImpl) GetIsLikeByVideoIdList(ctx context.Context, req *interaction.GetIsLikeByVideoIdListRequest) (resp *interaction.GetIsLikeByVideoIdListResponse, err error) {
resp = new(interaction.GetIsLikeByVideoIdListResponse)
return
isLikeResp, err := service.NewInteractionService(ctx).GetIsLikeByVideoIdList(req)
resp.Base = pack.BuildBaseResp(err)
if err != nil {
return resp, nil
}
resp.IsLikeList = isLikeResp
return resp, nil
}

// CommentList implements the InteractionHandlerImpl interface.
Expand Down
52 changes: 49 additions & 3 deletions cmd/interaction/main.go
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,42 @@ package main

import (
"bibi/cmd/interaction/dal"
"bibi/cmd/interaction/rpc"
"bibi/config"
interaction "bibi/kitex_gen/interaction/interactionhandler"
"bibi/pkg/constants"
"bibi/pkg/utils"
"bibi/pkg/utils/eslogrus"
"crypto/tls"
"fmt"
"github.com/cloudwego/kitex/pkg/klog"
"github.com/cloudwego/kitex/pkg/limit"
"github.com/cloudwego/kitex/pkg/rpcinfo"
"github.com/cloudwego/kitex/server"
"github.com/cloudwego/netpoll"
elastic "github.com/elastic/go-elasticsearch/v8"
kitexlogrus "github.com/kitex-contrib/obs-opentelemetry/logging/logrus"
etcd "github.com/kitex-contrib/registry-etcd"
"log"
"github.com/sirupsen/logrus"
"net"
"net/http"
"time"
)

var listenAddr string
var (
listenAddr string
EsClient *elastic.Client
)

func Init() {
config.Init(constants.InteractionServiceName)
dal.Init()

InitEs()
klog.SetLevel(klog.LevelDebug)
klog.SetLogger(kitexlogrus.NewLogger(kitexlogrus.WithHook(EsHookLog())))

rpc.InitVideoRPC()
}

func main() {
Expand All @@ -46,7 +63,7 @@ func main() {
interactionHandlerImpl := new(InteractionHandlerImpl)
serviceAddr, err := netpoll.ResolveTCPAddr("tcp", listenAddr)
if err != nil {
log.Fatal(err)
klog.Fatal(err)
}

svr := interaction.NewServer(interactionHandlerImpl, // 指定 Registry 与服务基本信息
Expand All @@ -67,3 +84,32 @@ func main() {
klog.Error(err.Error())
}
}

func EsHookLog() *eslogrus.ElasticHook {
hook, err := eslogrus.NewElasticHook(EsClient, config.ElasticSearch.Host, logrus.DebugLevel, constants.ElasticSearchIndexName)
if err != nil {
klog.Warn(err)
}

return hook
}

func InitEs() {
esConn := fmt.Sprintf("http://%s", config.ElasticSearch.Addr)
cfg := elastic.Config{
Addresses: []string{esConn},
Transport: &http.Transport{
MaxIdleConnsPerHost: 10,
ResponseHeaderTimeout: time.Second,
DialContext: (&net.Dialer{Timeout: time.Second}).DialContext,
TLSClientConfig: &tls.Config{
MinVersion: tls.VersionTLS12,
},
},
}
client, err := elastic.NewClient(cfg)
if err != nil {
klog.Fatal(err)
}
EsClient = client
}
48 changes: 48 additions & 0 deletions cmd/interaction/rpc/video.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package rpc

import (
"bibi/config"
"bibi/kitex_gen/video"
"bibi/kitex_gen/video/videohandler"
"bibi/pkg/constants"
"context"
"github.com/cloudwego/kitex/client"
"github.com/cloudwego/kitex/pkg/loadbalance"
"github.com/cloudwego/kitex/pkg/retry"
etcd "github.com/kitex-contrib/registry-etcd"
)

var videoClient videohandler.Client

func InitVideoRPC() {
r, err := etcd.NewEtcdResolver([]string{config.Etcd.Addr})

if err != nil {
panic(err)
}

c, err := videohandler.NewClient(
constants.VideoServiceName,
client.WithMuxConnection(constants.MuxConnection),
client.WithRPCTimeout(constants.RPCTimeout),
client.WithConnectTimeout(constants.ConnectTimeout),
client.WithFailureRetry(retry.NewFailurePolicy()),
client.WithResolver(r),
client.WithLoadBalancer(loadbalance.NewWeightedRoundRobinBalancer()),
)

if err != nil {
panic(err)
}

videoClient = c
}

func VideoGetByIdList(ctx context.Context, req *video.GetVideoByIdListRequest) (*video.GetVideoByIdListResponse, error) {
resp, err := videoClient.GetVideoByIdList(ctx, req)
if err != nil {
return nil, err
}
return resp, nil

}
70 changes: 70 additions & 0 deletions cmd/interaction/service/dislike_action.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
package service

import (
"bibi/cmd/interaction/dal/cache"
"bibi/cmd/interaction/dal/db"
"bibi/kitex_gen/interaction"
"bibi/pkg/constants"
"bibi/pkg/errno"
"errors"
"gorm.io/gorm"
)

func (s *InteractionService) DisLike(req *interaction.LikeActionRequest, uid int64) error {
lkType := new(likeType)
if req.VideoId != nil {
lkType.suffix = constants.VideoLikeSuffix
lkType.targetId = *req.VideoId
lkType.zset = constants.VideoLikeZset
lkType.dbType = true
} else {
lkType.suffix = constants.CommentLikeSuffix
lkType.targetId = *req.CommentId
lkType.zset = constants.CommentLikeZset
lkType.dbType = false
}

exist, err := cache.IsLikeExist(s.ctx, lkType.targetId, uid, lkType.suffix)
if err != nil {
return err
}
if !exist {
if lkType.dbType {
err = db.IsVideoLikeExist(s.ctx, uid, lkType.targetId)
if errors.Is(err, gorm.ErrRecordNotFound) {
return errno.LikeNotExistError
}
if err != nil {
return err
}

if err = db.CheckVideoLikeStatus(s.ctx, uid, lkType.targetId, 0); err == nil {
return errno.LikeNotExistError
}
} else {
err = db.IsCommentLikeExist(s.ctx, uid, lkType.targetId)
if errors.Is(err, gorm.ErrRecordNotFound) {
return errno.LikeNotExistError
}
if err != nil {
return err
}

if err = db.CheckCommentLikeStatus(s.ctx, uid, lkType.targetId, 0); err == nil {
return errno.LikeNotExistError
}
}

}
if exist {
if err = cache.DelVideoLikeCount(s.ctx, lkType.zset, lkType.targetId, uid, lkType.suffix); err != nil {
return err
}
}

if lkType.dbType {
return db.VideoLikeStatusUpdate(s.ctx, uid, lkType.targetId, 0)
} else {
return db.CommentLikeStatusUpdate(s.ctx, uid, lkType.targetId, 0)
}
}
38 changes: 38 additions & 0 deletions cmd/interaction/service/is_like.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,38 @@
package service

import (
"bibi/cmd/interaction/dal/cache"
"bibi/cmd/interaction/dal/db"
"bibi/kitex_gen/interaction"
"bibi/pkg/constants"
"errors"
"github.com/redis/go-redis/v9"
"gorm.io/gorm"
)

func (s *InteractionService) GetIsLikeByVideoIdList(req *interaction.GetIsLikeByVideoIdListRequest) ([]int64, error) {
//缓存未过期
allVideoIdList, err := cache.GetUserLikeVideos(s.ctx, req.UserId, constants.VideoLikeSuffix)

Check failure on line 15 in cmd/interaction/service/is_like.go

View workflow job for this annotation

GitHub Actions / golangci-lint

ineffectual assignment to allVideoIdList (ineffassign)
if err != nil && !errors.Is(err, redis.Nil) {
return nil, err
}

//缓存过期
allVideoIdList, err = db.GetVideoByUid(s.ctx, req.UserId)
if err != nil && !errors.Is(err, gorm.ErrRecordNotFound) {
return nil, err
}

isLikeResp := make([]int64, len(req.VideoId))
for i, v := range req.VideoId {
//也可以用二分,但麻烦点,所以懒了
isLikeResp[i] = 0
for j := 0; j < len(allVideoIdList); j++ {
if allVideoIdList[j] == v {
isLikeResp[i] = 1
break
}
}
}
return isLikeResp, nil
}
Loading
Loading