正在显示
10 个修改的文件
包含
206 行增加
和
16 行删除
| @@ -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 |
| @@ -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 | } |
| @@ -186,6 +186,16 @@ type MiniUserDepartmentUsersResponse struct { | @@ -186,6 +186,16 @@ type MiniUserDepartmentUsersResponse struct { | ||
| 186 | Users []*UserItem `json:"users"` | 186 | Users []*UserItem `json:"users"` |
| 187 | } | 187 | } |
| 188 | 188 | ||
| 189 | +type MiniUserFollowedSearchRequest struct { | ||
| 190 | + Page int `json:"page,optional"` | ||
| 191 | + Size int `json:"size,optional"` | ||
| 192 | +} | ||
| 193 | + | ||
| 194 | +type MiniUserFollowedSearchResponse struct { | ||
| 195 | + List []*UserFollowItem `json:"users"` | ||
| 196 | + Total int64 `json:"total"` | ||
| 197 | +} | ||
| 198 | + | ||
| 189 | type UserItem struct { | 199 | type UserItem struct { |
| 190 | Id int64 `json:"id,omitempty"` // 用户ID | 200 | Id int64 `json:"id,omitempty"` // 用户ID |
| 191 | CompanyId int64 `json:"companyId,omitempty"` // 公司ID | 201 | CompanyId int64 `json:"companyId,omitempty"` // 公司ID |
| @@ -225,6 +235,16 @@ type FollowRequest struct { | @@ -225,6 +235,16 @@ type FollowRequest struct { | ||
| 225 | UserId int64 `json:"userId"` | 235 | UserId int64 `json:"userId"` |
| 226 | } | 236 | } |
| 227 | 237 | ||
| 238 | +type UserFollowItem struct { | ||
| 239 | + Id int64 `json:"id"` // 用户ID | ||
| 240 | + Name string `json:"name"` // 名称 | ||
| 241 | + CompanyName string `json:"companyName"` // 公司名称 | ||
| 242 | + Avatar string `json:"avatar"` // 头像 | ||
| 243 | + Position string `json:"position"` // 职位 | ||
| 244 | + Followed bool `json:"followed"` // 关注 | ||
| 245 | + MutualFollowed bool `json:"mutualFollowed"` // 互相关注标识 | ||
| 246 | +} | ||
| 247 | + | ||
| 228 | type CompanySearchRequest struct { | 248 | type CompanySearchRequest struct { |
| 229 | Page int `json:"page"` | 249 | Page int `json:"page"` |
| 230 | Size int `json:"size"` | 250 | Size int `json:"size"` |
| @@ -10,6 +10,10 @@ import ( | @@ -10,6 +10,10 @@ import ( | ||
| 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 |
| @@ -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) |
-
请 注册 或 登录 后发表评论