Add HTTP /v1 MVC, TCP send path, groups with server-side member-avatar collage, object-storage upload, and friends/favorites around the architecture-v3 layout. Co-authored-by: Cursor <cursoragent@cursor.com>
65 lines
1.4 KiB
Go
65 lines
1.4 KiB
Go
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
|
|
}
|