作者 tangxvhui
@@ -41,10 +41,10 @@ service Core { @@ -41,10 +41,10 @@ service Core {
41 post /mini/user/department-users (MiniUserDepartmentUsersRequest)returns (MiniUserInfoResponse) 41 post /mini/user/department-users (MiniUserDepartmentUsersRequest)returns (MiniUserInfoResponse)
42 @doc "关注我的人" 42 @doc "关注我的人"
43 @handler miniUserFollower 43 @handler miniUserFollower
44 - post /mini/user/follower (UserSearchRequest)returns(UserSearchResponse) 44 + post /mini/user/follower (MiniUserFollowedSearchRequest)returns(MiniUserFollowedSearchResponse)
45 @doc "我关注的人" 45 @doc "我关注的人"
46 @handler miniUserFollowing 46 @handler miniUserFollowing
47 - post /mini/user/following (UserSearchRequest)returns(UserSearchResponse) 47 + post /mini/user/following (MiniUserFollowedSearchRequest)returns(MiniUserFollowedSearchResponse)
48 @doc "关注" 48 @doc "关注"
49 @handler miniUserFollow 49 @handler miniUserFollow
50 post /mini/user/follow (FollowRequest) 50 post /mini/user/follow (FollowRequest)
@@ -97,6 +97,14 @@ type( @@ -97,6 +97,14 @@ type(
97 Departments []*Department `json:"departments"` 97 Departments []*Department `json:"departments"`
98 Users []*UserItem `json:"users"` 98 Users []*UserItem `json:"users"`
99 } 99 }
  100 + MiniUserFollowedSearchRequest{
  101 + Page int `json:"page,optional"`
  102 + Size int `json:"size,optional"`
  103 + }
  104 + MiniUserFollowedSearchResponse{
  105 + List []*UserFollowItem `json:"users"`
  106 + Total int64 `json:"total"`
  107 + }
100 UserItem { 108 UserItem {
101 Id int64 `json:"id,omitempty"` // 用户ID 109 Id int64 `json:"id,omitempty"` // 用户ID
102 CompanyId int64 `json:"companyId,omitempty"` // 公司ID 110 CompanyId int64 `json:"companyId,omitempty"` // 公司ID
@@ -133,6 +141,15 @@ type( @@ -133,6 +141,15 @@ type(
133 FollowRequest{ 141 FollowRequest{
134 UserId int64 `json:"userId"` 142 UserId int64 `json:"userId"`
135 } 143 }
  144 + UserFollowItem struct {
  145 + Id int64 `json:"id"` // 用户ID
  146 + Name string `json:"name"` // 名称
  147 + CompanyName string `json:"companyName"` // 公司名称
  148 + Avatar string `json:"avatar"` // 头像
  149 + Position string `json:"position"` // 职位
  150 + Followed bool `json:"followed"` // 关注
  151 + MutualFollowed bool `json:"mutualFollowed"` // 互相关注标识
  152 + }
136 ) 153 )
137 154
138 155
@@ -12,7 +12,7 @@ import ( @@ -12,7 +12,7 @@ import (
12 12
13 func MiniUserFollowerHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 13 func MiniUserFollowerHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
14 return func(w http.ResponseWriter, r *http.Request) { 14 return func(w http.ResponseWriter, r *http.Request) {
15 - var req types.UserSearchRequest 15 + var req types.MiniUserFollowedSearchRequest
16 if err := httpx.Parse(r, &req); err != nil { 16 if err := httpx.Parse(r, &req); err != nil {
17 httpx.ErrorCtx(r.Context(), w, err) 17 httpx.ErrorCtx(r.Context(), w, err)
18 return 18 return
@@ -12,7 +12,7 @@ import ( @@ -12,7 +12,7 @@ import (
12 12
13 func MiniUserFollowingHandler(svcCtx *svc.ServiceContext) http.HandlerFunc { 13 func MiniUserFollowingHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
14 return func(w http.ResponseWriter, r *http.Request) { 14 return func(w http.ResponseWriter, r *http.Request) {
15 - var req types.UserSearchRequest 15 + var req types.MiniUserFollowedSearchRequest
16 if err := httpx.Parse(r, &req); err != nil { 16 if err := httpx.Parse(r, &req); err != nil {
17 httpx.ErrorCtx(r.Context(), w, err) 17 httpx.ErrorCtx(r.Context(), w, err)
18 return 18 return
@@ -27,9 +27,11 @@ func NewMiniBusinessLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Mini @@ -27,9 +27,11 @@ func NewMiniBusinessLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Mini
27 } 27 }
28 28
29 func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (resp *types.MessageBusinessResponse, err error) { 29 func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (resp *types.MessageBusinessResponse, err error) {
  30 + var userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  31 + var conn = l.svcCtx.DefaultDBConn()
30 var msgType = req.Type 32 var msgType = req.Type
31 33
32 - total, list, err := l.svcCtx.MessageBusinessRepository.Find(l.ctx, l.svcCtx.DefaultDBConn(), domain.NewQueryOptions(). 34 + total, list, err := l.svcCtx.MessageBusinessRepository.Find(l.ctx, conn, domain.NewQueryOptions().
33 WithOffsetLimit(req.Page, req.Size). 35 WithOffsetLimit(req.Page, req.Size).
34 WithKV("type", msgType)) 36 WithKV("type", msgType))
35 if err != nil { 37 if err != nil {
@@ -96,11 +98,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res @@ -96,11 +98,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res
96 98
97 // 获取公司 99 // 获取公司
98 if len(companyIds) > 0 { 100 if len(companyIds) > 0 {
99 - _, companyList, err := l.svcCtx.CompanyRepository.Find(l.ctx, l.svcCtx.DefaultDBConn(),  
100 - domain.NewQueryOptions().  
101 - WithFindOnly().  
102 - WithKV("ids", userIds).  
103 - WithKV("limit", len(userIds))) 101 + _, companyList, err := l.svcCtx.CompanyRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  102 + WithFindOnly().
  103 + WithKV("ids", userIds).
  104 + WithKV("limit", len(userIds)))
104 if err != nil { 105 if err != nil {
105 return nil, err 106 return nil, err
106 } 107 }
@@ -111,11 +112,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res @@ -111,11 +112,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res
111 112
112 // 获取用户 113 // 获取用户
113 if len(userIds) > 0 { 114 if len(userIds) > 0 {
114 - _, userList, err := l.svcCtx.UserRepository.Find(l.ctx, l.svcCtx.DefaultDBConn(),  
115 - domain.NewQueryOptions().  
116 - WithFindOnly().  
117 - WithKV("ids", userIds).  
118 - WithKV("limit", len(userIds))) 115 + _, userList, err := l.svcCtx.UserRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  116 + WithFindOnly().
  117 + WithKV("ids", userIds).
  118 + WithKV("limit", len(userIds)))
119 if err != nil { 119 if err != nil {
120 return nil, err 120 return nil, err
121 } 121 }
@@ -126,11 +126,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res @@ -126,11 +126,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res
126 126
127 // 获取评论 127 // 获取评论
128 if len(commentIds) > 0 { 128 if len(commentIds) > 0 {
129 - _, commentList, err := l.svcCtx.CommentRepository.Find(l.ctx, l.svcCtx.DefaultDBConn(),  
130 - domain.NewQueryOptions().  
131 - WithFindOnly().  
132 - WithKV("ids", commentIds).  
133 - WithKV("limit", len(commentIds))) 129 + _, commentList, err := l.svcCtx.CommentRepository.Find(l.ctx, conn, domain.NewQueryOptions().
  130 + WithFindOnly().
  131 + WithKV("ids", commentIds).
  132 + WithKV("limit", len(commentIds)))
134 if err != nil { 133 if err != nil {
135 return nil, err 134 return nil, err
136 } 135 }
@@ -141,11 +140,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res @@ -141,11 +140,10 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res
141 140
142 // 获取文章数据 141 // 获取文章数据
143 if len(articleIds) > 0 { 142 if len(articleIds) > 0 {
144 - _, articleList, err := l.svcCtx.ArticleRepository.Find(l.ctx, l.svcCtx.DefaultDBConn(), 0,  
145 - domain.NewQueryOptions().  
146 - WithFindOnly().  
147 - WithKV("ids", articleIds).  
148 - WithKV("limit", len(articleIds))) 143 + _, articleList, err := l.svcCtx.ArticleRepository.Find(l.ctx, conn, userToken.CompanyId, domain.NewQueryOptions().
  144 + WithFindOnly().
  145 + WithKV("ids", articleIds).
  146 + WithKV("limit", len(articleIds)))
149 if err != nil { 147 if err != nil {
150 return nil, err 148 return nil, err
151 } 149 }
@@ -156,18 +154,18 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res @@ -156,18 +154,18 @@ func (l *MiniBusinessLogic) MiniBusiness(req *types.MessageBusinessRequest) (res
156 154
157 for _, item := range list { 155 for _, item := range list {
158 to := types.MessageBusinessItem{ 156 to := types.MessageBusinessItem{
159 - Id: item.Id,  
160 - Type: int(item.Type),  
161 - OptType: int(item.OptType),  
162 - CompanyId: item.CompanyId,  
163 - UserId: item.UserId,  
164 - RecipientId: item.RecipientId,  
165 - ArticleId: item.ArticleId,  
166 - CommentId: item.CommentId,  
167 - DiscussionId: item.DiscussionId,  
168 - DiscussionOpinionId: item.DiscussionOpinionId,  
169 - Content: item.Content,  
170 - CreatedAt: item.CreatedAt, 157 + Id: item.Id,
  158 + Type: int(item.Type),
  159 + OptType: int(item.OptType),
  160 + CompanyId: item.CompanyId,
  161 + UserId: item.UserId,
  162 + RecipientId: item.RecipientId,
  163 + ArticleId: item.ArticleId,
  164 + CommentId: item.CommentId,
  165 + //DiscussionId: item.DiscussionId,
  166 + //DiscussionOpinionId: item.DiscussionOpinionId,
  167 + Content: item.Content,
  168 + CreatedAt: item.CreatedAt,
171 } 169 }
172 170
173 if v, ok := userIdMap[item.UserId]; ok { 171 if v, ok := userIdMap[item.UserId]; ok {
@@ -2,6 +2,10 @@ package user @@ -2,6 +2,10 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
5 9
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -23,8 +27,32 @@ func NewMiniUserFollowLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Mi @@ -23,8 +27,32 @@ func NewMiniUserFollowLogic(ctx context.Context, svcCtx *svc.ServiceContext) *Mi
23 } 27 }
24 } 28 }
25 29
26 -func (l *MiniUserFollowLogic) MiniUserFollow(req *types.FollowRequest) error {  
27 - // todo: add your logic here and delete this line  
28 - 30 +func (l *MiniUserFollowLogic) MiniUserFollow(req *types.FollowRequest) (err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.User
  34 + targetUser *domain.User
  35 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  36 + )
  37 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  38 + return xerr.NewErrMsgErr("用户不存在", err)
  39 + }
  40 + if targetUser, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.UserId); err != nil {
  41 + return xerr.NewErrMsgErr("关注的用户不存在", err)
  42 + }
  43 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  44 + if err = user.Follow(targetUser); err != nil {
  45 + return err
  46 + }
  47 + if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
  48 + return err
  49 + }
  50 + if targetUser, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, targetUser); err != nil {
  51 + return err
  52 + }
  53 + return nil
  54 + }, true); err != nil {
  55 + return xerr.NewErrMsgErr("关注用户失败", err)
  56 + }
29 return nil 57 return nil
30 } 58 }
@@ -2,6 +2,10 @@ package user @@ -2,6 +2,10 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
5 9
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -23,8 +27,42 @@ func NewMiniUserFollowerLogic(ctx context.Context, svcCtx *svc.ServiceContext) * @@ -23,8 +27,42 @@ func NewMiniUserFollowerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *
23 } 27 }
24 } 28 }
25 29
26 -func (l *MiniUserFollowerLogic) MiniUserFollower(req *types.UserSearchRequest) (resp *types.UserSearchResponse, err error) {  
27 - // todo: add your logic here and delete this line  
28 - 30 +func (l *MiniUserFollowerLogic) MiniUserFollower(req *types.MiniUserFollowedSearchRequest) (resp *types.MiniUserFollowedSearchResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.User
  34 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + companyMap = make(map[int64]*domain.Company)
  36 + )
  37 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  38 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  39 + }
  40 + var (
  41 + users = user.Follower
  42 + total = int64(len(users))
  43 + offset, limit = domain.OffsetLimit(req.Page, req.Size)
  44 + )
  45 + users = lo.Slice(users, offset, offset+limit)
  46 + resp = &types.MiniUserFollowedSearchResponse{
  47 + Total: total,
  48 + List: make([]*types.UserFollowItem, 0),
  49 + }
  50 + lo.ForEach(users, func(item int64, index int) {
  51 + if foundUser, _ := l.svcCtx.UserRepository.FindOne(l.ctx, conn, item); foundUser != nil {
  52 + var companyName = ""
  53 + if company, _ := domain.LazyLoad(companyMap, l.ctx, conn, foundUser.CompanyId, l.svcCtx.CompanyRepository.FindOne); company != nil {
  54 + companyName = company.Name
  55 + }
  56 + resp.List = append(resp.List, &types.UserFollowItem{
  57 + Id: foundUser.Id,
  58 + Name: foundUser.Name,
  59 + CompanyName: companyName,
  60 + Avatar: foundUser.Avatar,
  61 + Position: foundUser.Position,
  62 + Followed: true,
  63 + MutualFollowed: lo.Contains(user.Following, item),
  64 + })
  65 + }
  66 + })
29 return 67 return
30 } 68 }
@@ -2,6 +2,10 @@ package user @@ -2,6 +2,10 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
5 9
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -23,8 +27,42 @@ func NewMiniUserFollowingLogic(ctx context.Context, svcCtx *svc.ServiceContext) @@ -23,8 +27,42 @@ func NewMiniUserFollowingLogic(ctx context.Context, svcCtx *svc.ServiceContext)
23 } 27 }
24 } 28 }
25 29
26 -func (l *MiniUserFollowingLogic) MiniUserFollowing(req *types.UserSearchRequest) (resp *types.UserSearchResponse, err error) {  
27 - // todo: add your logic here and delete this line  
28 - 30 +func (l *MiniUserFollowingLogic) MiniUserFollowing(req *types.MiniUserFollowedSearchRequest) (resp *types.MiniUserFollowedSearchResponse, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.User
  34 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + companyMap = make(map[int64]*domain.Company)
  36 + )
  37 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  38 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  39 + }
  40 + var (
  41 + users = user.Following
  42 + total = int64(len(users))
  43 + offset, limit = domain.OffsetLimit(req.Page, req.Size)
  44 + )
  45 + users = lo.Slice(users, offset, offset+limit)
  46 + resp = &types.MiniUserFollowedSearchResponse{
  47 + Total: total,
  48 + List: make([]*types.UserFollowItem, 0),
  49 + }
  50 + lo.ForEach(users, func(item int64, index int) {
  51 + if foundUser, _ := l.svcCtx.UserRepository.FindOne(l.ctx, conn, item); foundUser != nil {
  52 + var companyName = ""
  53 + if company, _ := domain.LazyLoad(companyMap, l.ctx, conn, foundUser.CompanyId, l.svcCtx.CompanyRepository.FindOne); company != nil {
  54 + companyName = company.Name
  55 + }
  56 + resp.List = append(resp.List, &types.UserFollowItem{
  57 + Id: foundUser.Id,
  58 + Name: foundUser.Name,
  59 + CompanyName: companyName,
  60 + Avatar: foundUser.Avatar,
  61 + Position: foundUser.Position,
  62 + Followed: true,
  63 + //MutualFollowed: lo.Contains(user.Following, foundUser.Id),
  64 + })
  65 + }
  66 + })
29 return 67 return
30 } 68 }
@@ -2,6 +2,10 @@ package user @@ -2,6 +2,10 @@ package user
2 2
3 import ( 3 import (
4 "context" 4 "context"
  5 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/db/transaction"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
5 9
6 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc" 10 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
7 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types" 11 "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
@@ -23,8 +27,32 @@ func NewMiniUserUnFollowLogic(ctx context.Context, svcCtx *svc.ServiceContext) * @@ -23,8 +27,32 @@ func NewMiniUserUnFollowLogic(ctx context.Context, svcCtx *svc.ServiceContext) *
23 } 27 }
24 } 28 }
25 29
26 -func (l *MiniUserUnFollowLogic) MiniUserUnFollow(req *types.FollowRequest) error {  
27 - // todo: add your logic here and delete this line  
28 - 30 +func (l *MiniUserUnFollowLogic) MiniUserUnFollow(req *types.FollowRequest) (err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.User
  34 + targetUser *domain.User
  35 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  36 + )
  37 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  38 + return xerr.NewErrMsgErr("用户不存在", err)
  39 + }
  40 + if targetUser, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, req.UserId); err != nil {
  41 + return xerr.NewErrMsgErr("关注的用户不存在", err)
  42 + }
  43 + if err = transaction.UseTrans(l.ctx, l.svcCtx.DB, func(ctx context.Context, conn transaction.Conn) error {
  44 + if err = user.Unfollow(targetUser); err != nil {
  45 + return err
  46 + }
  47 + if user, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, user); err != nil {
  48 + return err
  49 + }
  50 + if targetUser, err = l.svcCtx.UserRepository.UpdateWithVersion(ctx, conn, targetUser); err != nil {
  51 + return err
  52 + }
  53 + return nil
  54 + }, true); err != nil {
  55 + return xerr.NewErrMsgErr("关注用户失败", err)
  56 + }
29 return nil 57 return nil
30 } 58 }
@@ -192,6 +192,16 @@ type MiniUserDepartmentUsersResponse struct { @@ -192,6 +192,16 @@ type MiniUserDepartmentUsersResponse struct {
192 Users []*UserItem `json:"users"` 192 Users []*UserItem `json:"users"`
193 } 193 }
194 194
  195 +type MiniUserFollowedSearchRequest struct {
  196 + Page int `json:"page,optional"`
  197 + Size int `json:"size,optional"`
  198 +}
  199 +
  200 +type MiniUserFollowedSearchResponse struct {
  201 + List []*UserFollowItem `json:"users"`
  202 + Total int64 `json:"total"`
  203 +}
  204 +
195 type UserItem struct { 205 type UserItem struct {
196 Id int64 `json:"id,omitempty"` // 用户ID 206 Id int64 `json:"id,omitempty"` // 用户ID
197 CompanyId int64 `json:"companyId,omitempty"` // 公司ID 207 CompanyId int64 `json:"companyId,omitempty"` // 公司ID
@@ -231,6 +241,16 @@ type FollowRequest struct { @@ -231,6 +241,16 @@ type FollowRequest struct {
231 UserId int64 `json:"userId"` 241 UserId int64 `json:"userId"`
232 } 242 }
233 243
  244 +type UserFollowItem struct {
  245 + Id int64 `json:"id"` // 用户ID
  246 + Name string `json:"name"` // 名称
  247 + CompanyName string `json:"companyName"` // 公司名称
  248 + Avatar string `json:"avatar"` // 头像
  249 + Position string `json:"position"` // 职位
  250 + Followed bool `json:"followed"` // 关注
  251 + MutualFollowed bool `json:"mutualFollowed"` // 互相关注标识
  252 +}
  253 +
234 type CompanySearchRequest struct { 254 type CompanySearchRequest struct {
235 Page int `json:"page"` 255 Page int `json:"page"`
236 Size int `json:"size"` 256 Size int `json:"size"`
@@ -10,22 +10,22 @@ import ( @@ -10,22 +10,22 @@ import (
10 10
11 // MessageBusiness 消息中心业务 11 // MessageBusiness 消息中心业务
12 type MessageBusiness struct { 12 type MessageBusiness struct {
13 - Id int64 // 唯一标识  
14 - Type int `json:"type"` // 分类 (1回复 2点赞 3被采纳)  
15 - OptType int `json:"optType"` // 操作类型(1针对文章、1针对评论、2针对圆桌)  
16 - CompanyId int64 `json:"companyId"` // 操作人公司ID  
17 - UserId int64 `json:"userId"` // 操作人用户ID  
18 - RecipientId int64 `json:"recipientId"` // 接收人用户ID  
19 - ArticleId int64 `json:"articleId"` // 文章ID  
20 - CommentId int64 `json:"commentId,omitempty"` // 评论ID  
21 - DiscussionId int64 `json:"discussionId,omitempty"` // 圆桌ID  
22 - DiscussionOpinionId int64 `json:"discussionOpinionId,omitempty"` // 观点ID  
23 - Content string `json:"content,omitempty"` // 消息内容  
24 - CreatedAt int64 `json:",omitempty"`  
25 - UpdatedAt int64 `json:",omitempty"`  
26 - DeletedAt int64 `json:",omitempty"`  
27 - Version int `json:",omitempty"`  
28 - IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"` 13 + Id int64 // 唯一标识
  14 + Type int `json:"type"` // 分类 (1回复 2点赞 3被采纳)
  15 + OptType int `json:"optType"` // 操作类型(1针对文章、1针对评论、2针对圆桌)
  16 + CompanyId int64 `json:"companyId"` // 操作人公司ID
  17 + UserId int64 `json:"userId"` // 操作人用户ID
  18 + RecipientId int64 `json:"recipientId"` // 接收人用户ID
  19 + ArticleId int64 `json:"articleId,omitempty"` // 文章ID
  20 + CommentId int64 `json:"commentId,omitempty"` // 评论ID
  21 + Content string `json:"content,omitempty"` // 消息内容
  22 + CreatedAt int64 `json:",omitempty"`
  23 + UpdatedAt int64 `json:",omitempty"`
  24 + DeletedAt int64 `json:",omitempty"`
  25 + Version int `json:",omitempty"`
  26 + IsDel soft_delete.DeletedAt `gorm:"softDelete:flag,DeletedAtField:DeletedAt"`
  27 + //DiscussionId int64 `json:"discussionId,omitempty"` // 圆桌ID
  28 + //DiscussionOpinionId int64 `json:"discussionOpinionId,omitempty"` // 观点ID
29 } 29 }
30 30
31 func (m *MessageBusiness) TableName() string { 31 func (m *MessageBusiness) TableName() string {
@@ -9,7 +9,11 @@ import ( @@ -9,7 +9,11 @@ import (
9 ) 9 )
10 10
11 type Role struct { 11 type Role struct {
12 - Id int64 // 唯一标识 12 + Id int64 // 唯一标识
  13 + Name string `json:"name"` // 角色名称
  14 + Auths []int64 `gorm:"type:jsonb;serializer:json"` // 角色权限列表
  15 + Remark string `json:"remark"` // 备注
  16 + Users []int64 `gorm:"type:jsonb;serializer:json"` // 绑定的用户
13 17
14 CreatedAt int64 18 CreatedAt int64
15 UpdatedAt int64 19 UpdatedAt int64
@@ -121,6 +121,9 @@ func (repository *MessageBusinessRepository) Find(ctx context.Context, conn tran @@ -121,6 +121,9 @@ func (repository *MessageBusinessRepository) Find(ctx context.Context, conn tran
121 ) 121 )
122 queryFunc := func() (interface{}, error) { 122 queryFunc := func() (interface{}, error) {
123 tx = tx.Model(&ms).Order("created_at desc") 123 tx = tx.Model(&ms).Order("created_at desc")
  124 + if v, ok := queryOptions["companyId"]; ok {
  125 + tx.Where("company_id = ?", v)
  126 + }
124 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil { 127 if total, tx = transaction.PaginationAndCount(ctx, tx, queryOptions, &ms); tx.Error != nil {
125 return dms, tx.Error 128 return dms, tx.Error
126 } 129 }
@@ -6,21 +6,22 @@ import ( @@ -6,21 +6,22 @@ import (
6 ) 6 )
7 7
8 type MessageBusiness struct { 8 type MessageBusiness struct {
9 - Id int64 // 唯一标识  
10 - Type MsgBusinessType `json:"type"` // 分类 (1回复 2点赞 3被采纳)  
11 - OptType MsgBusinessOpt `json:"optType"` // 操作类型(1针对文章、1针对评论、2针对圆桌)  
12 - CompanyId int64 `json:"companyId"` // 操作人公司ID  
13 - UserId int64 `json:"userId"` // 操作人用户ID  
14 - RecipientId int64 `json:"recipientId"` // 接收人用户ID  
15 - ArticleId int64 `json:"articleId"` // 文章ID  
16 - CommentId int64 `json:"commentId"` // 评论ID  
17 - DiscussionId int64 `json:"discussionId"` // 圆桌ID  
18 - DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID  
19 - Content string `json:"content"` // 消息内容  
20 - CreatedAt int64 `json:",omitempty"`  
21 - UpdatedAt int64 `json:",omitempty"`  
22 - DeletedAt int64 `json:",omitempty"`  
23 - Version int `json:",omitempty"` 9 + Id int64 // 唯一标识
  10 + Type MsgBusinessType `json:"type"` // 分类 (1回复 2点赞 3被采纳)
  11 + OptType MsgBusinessOpt `json:"optType"` // 操作类型(1针对文章、1针对评论、2针对圆桌)
  12 + CompanyId int64 `json:"companyId"` // 操作人公司ID
  13 + UserId int64 `json:"userId"` // 操作人用户ID
  14 + RecipientId int64 `json:"recipientId"` // 接收人用户ID
  15 + ArticleId int64 `json:"articleId"` // 文章ID
  16 + CommentId int64 `json:"commentId"` // 评论ID
  17 + Content string `json:"content"` // 消息内容
  18 + CreatedAt int64 `json:",omitempty"`
  19 + UpdatedAt int64 `json:",omitempty"`
  20 + DeletedAt int64 `json:",omitempty"`
  21 + Version int `json:",omitempty"`
  22 +
  23 + //DiscussionId int64 `json:"discussionId"` // 圆桌ID
  24 + //DiscussionOpinionId int64 `json:"discussionOpinionId"` // 观点ID
24 } 25 }
25 26
26 type MsgBusinessType int 27 type MsgBusinessType int
@@ -85,6 +85,23 @@ func (m *User) Audit(status int) error { @@ -85,6 +85,23 @@ func (m *User) Audit(status int) error {
85 return nil 85 return nil
86 } 86 }
87 87
  88 +func (m *User) Follow(targetUser *User) error {
  89 + if lo.Contains(m.Following, targetUser.Id) {
  90 + return fmt.Errorf("已关注用户%v", targetUser.Name)
  91 + }
  92 + m.Following = append(m.Following, targetUser.Id)
  93 + if !lo.Contains(targetUser.Follower, m.Id) {
  94 + targetUser.Follower = append(targetUser.Follower, m.Id)
  95 + }
  96 + return nil
  97 +}
  98 +
  99 +func (m *User) Unfollow(targetUser *User) error {
  100 + m.Following = lo.Without(m.Following, targetUser.Id)
  101 + targetUser.Follower = lo.Without(targetUser.Follower, m.Id)
  102 + return nil
  103 +}
  104 +
88 type ( 105 type (
89 LoginCreator interface { 106 LoginCreator interface {
90 WechatLogin(r WechatLoginRequest) (*LoginInfo, error) 107 WechatLogin(r WechatLoginRequest) (*LoginInfo, error)