// Copyright 2022 ROC. All rights reserved. // Use of this source code is governed by a MIT style // license that can be found in the LICENSE file. package web import ( "github.com/alimy/mir/v4" "github.com/gin-gonic/gin" api "github.com/rocboss/paopao-ce/auto/api/v1" "github.com/rocboss/paopao-ce/internal/dao/cache" "github.com/rocboss/paopao-ce/internal/model/web" "github.com/rocboss/paopao-ce/internal/servants/base" "github.com/rocboss/paopao-ce/internal/servants/chain" "github.com/rocboss/paopao-ce/pkg/xerror" "github.com/sirupsen/logrus" ) var ( _ api.Followship = (*followshipSrv)(nil) ) type followshipSrv struct { api.UnimplementedFollowshipServant *base.DaoServant } func (s *followshipSrv) Chain() gin.HandlersChain { return gin.HandlersChain{chain.JwtLoose()} } func (s *followshipSrv) ListFollowings(r *web.ListFollowingsReq) (*web.ListFollowingsResp, mir.Error) { he, err := s.Ds.GetUserByUsername(r.Username) if err != nil { logrus.Errorf("Ds.GetUserByUsername err: %s", err) return nil, web.ErrNoExistUsername } res, err := s.Ds.ListFollowings(he.ID, r.PageSize, (r.Page-1)*r.PageSize) if err != nil { logrus.Errorf("Ds.ListFollowings err: %s", err) return nil, web.ErrListFollowingsFailed } if r.BaseInfo.User != nil { for i, contact := range res.Contacts { res.Contacts[i].IsFollowing = s.Ds.IsFollow(r.User.ID, contact.UserId) } } resp := base.PageRespFrom(res.Contacts, r.Page, r.PageSize, res.Total) return (*web.ListFollowingsResp)(resp), nil } func (s *followshipSrv) ListFollows(r *web.ListFollowsReq) (*web.ListFollowsResp, mir.Error) { he, err := s.Ds.GetUserByUsername(r.Username) if err != nil { logrus.Errorf("Ds.GetUserByUsername err: %s", err) return nil, web.ErrNoExistUsername } res, err := s.Ds.ListFollows(he.ID, r.PageSize, (r.Page-1)*r.PageSize) if err != nil { logrus.Errorf("Ds.ListFollows err: %s", err) return nil, web.ErrListFollowsFailed } if r.BaseInfo.User != nil { if r.User.Username == r.Username { for i := range res.Contacts { res.Contacts[i].IsFollowing = true } } else { for i, contact := range res.Contacts { res.Contacts[i].IsFollowing = s.Ds.IsFollow(r.User.ID, contact.UserId) } } } resp := base.PageRespFrom(res.Contacts, r.Page, r.PageSize, res.Total) return (*web.ListFollowsResp)(resp), nil } func (s *followshipSrv) UnfollowUser(r *web.UnfollowUserReq) mir.Error { if r.User == nil { return xerror.UnauthorizedTokenError } else if r.User.ID == r.UserId { return web.ErrNotAllowUnfollowSelf } if err := s.Ds.UnfollowUser(r.User.ID, r.UserId); err != nil { logrus.Errorf("Ds.UnfollowUser err: %s userId: %d followId: %d", err, r.User.ID, r.UserId) return web.ErrUnfollowUserFailed } // 触发缓存更新事件 // TODO: 合并成一个事件 cache.OnCacheMyFollowIdsEvent(s.Ds, r.User.ID) cache.OnExpireIndexTweetEvent(r.User.ID) onMessageActionEvent(_messageActionFollow, r.User.ID) onTrendsActionEvent(_trendsActionUnfollowUser, r.User.ID) return nil } func (s *followshipSrv) FollowUser(r *web.FollowUserReq) mir.Error { if r.User == nil { return xerror.UnauthorizedTokenError } else if r.User.ID == r.UserId { return web.ErrNotAllowFollowSelf } if err := s.Ds.FollowUser(r.User.ID, r.UserId); err != nil { logrus.Errorf("Ds.FollowUser err: %s userId: %d followId: %d", err, r.User.ID, r.UserId) return web.ErrUnfollowUserFailed } // 触发缓存更新事件 // TODO: 合并成一个事件 cache.OnCacheMyFollowIdsEvent(s.Ds, r.User.ID) cache.OnExpireIndexTweetEvent(r.User.ID) onMessageActionEvent(_messageActionFollow, r.User.ID) onTrendsActionEvent(_trendsActionFollowUser, r.User.ID) return nil } func newFollowshipSrv(s *base.DaoServant) api.Followship { return &followshipSrv{ DaoServant: s, } }