package logic import ( "context" "errors" "spark-server/internal/module/friend/entity" "spark-server/internal/pkg/errs" ) // LookupInput finds a user to add. Exactly one identifier. type LookupInput struct { UID int64 Email string SparkID string QRCode string } func (s *Service) Lookup(ctx context.Context, userID int64, in LookupInput) (*FriendView, error) { if !s.ready() || userID <= 0 { return nil, errs.ErrUnauthorized } target, _, err := s.resolveTarget(ctx, &ApplyInput{ UID: in.UID, Email: in.Email, SparkID: in.SparkID, QRCode: in.QRCode, }) if err != nil { return nil, err } blockedBy, err := s.repo.IsBlocked(ctx, target.ID, userID) if err != nil { return nil, err } if blockedBy { return nil, errs.ErrNotFound } friend := false if _, err := s.repo.GetRelation(ctx, userID, target.ID); err == nil { friend = true } else if !errors.Is(err, errs.ErrNotFound) { return nil, err } blockedMe, err := s.repo.IsBlocked(ctx, userID, target.ID) if err != nil { return nil, err } remark := "" if friend { remark, err = s.repo.GetRemark(ctx, userID, target.ID) if err != nil { return nil, err } } view := &FriendView{ UserCard: cardOf(target), Remark: remark, Relation: entity.ViewStatus(friend, blockedMe), } if friend { if rel, err := s.repo.GetRelation(ctx, userID, target.ID); err == nil { view.CreatedAt = entity.UnixMS(rel.CreatedAt) } } return view, nil }