mini_user_follower_logic.go 2.6 KB
package user

import (
	"context"
	"github.com/samber/lo"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
	"strings"

	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"

	"github.com/zeromicro/go-zero/core/logx"
)

type MiniUserFollowerLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewMiniUserFollowerLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniUserFollowerLogic {
	return &MiniUserFollowerLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

func (l *MiniUserFollowerLogic) MiniUserFollower(req *types.MiniUserFollowedSearchRequest) (resp *types.MiniUserFollowedSearchResponse, err error) {
	var (
		conn       = l.svcCtx.DefaultDBConn()
		user       *domain.User
		userToken  = contextdata.GetUserTokenFromCtx(l.ctx)
		companyMap = make(map[int64]*domain.Company)
	)
	if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
		return nil, xerr.NewErrMsgErr("用户不存在", err)
	}
	var (
		users         = user.Follower
		total         = int64(len(users))
		offset, limit = domain.OffsetLimit(req.Page, req.Size)
	)
	users = lo.Slice(users, offset, offset+limit)
	resp = &types.MiniUserFollowedSearchResponse{
		Total: total,
		List:  make([]*types.UserFollowItem, 0),
	}
	for {
		if offset > len(user.Follower) {
			break
		}
		users = lo.Slice(users, offset, offset+limit)
		lo.ForEach(users, func(item int64, index int) {
			if foundUser, _ := l.svcCtx.UserRepository.FindOne(l.ctx, conn, item); foundUser != nil {
				if len(req.Name) > 0 && !strings.Contains(foundUser.Name, req.Name) {
					return
				}
				var companyName = ""
				if company, _ := domain.LazyLoad(companyMap, l.ctx, conn, foundUser.CompanyId, l.svcCtx.CompanyRepository.FindOne); company != nil {
					companyName = company.Name
				}
				resp.List = append(resp.List, &types.UserFollowItem{
					Id:             foundUser.Id,
					Name:           foundUser.Name,
					CompanyName:    companyName,
					Avatar:         foundUser.Avatar,
					Position:       foundUser.Position,
					Followed:       true,
					MutualFollowed: lo.Contains(user.Following, item),
				})
			}
		})
		if len(resp.List) >= limit {
			break
		}
		req.Page += 1
		offset, limit = domain.OffsetLimit(req.Page, req.Size)
	}

	return
}