Compare commits
No commits in common. "cfa30e270b13be276bfc8ee1cbdf6a2e33e20b85" and "284157cc25441a40cb8ca49c4302ba7bedaec33e" have entirely different histories.
cfa30e270b
...
284157cc25
@ -51,7 +51,6 @@ func (s *Service) Unfollow(ctx context.Context, userID, targetID int64) (*Follow
|
||||
return nil, err
|
||||
}
|
||||
if mutual {
|
||||
// DeleteFriend removes both directed edges. Messages stay.
|
||||
if err := s.repo.DeleteFriend(ctx, userID, targetID); err != nil && !errors.Is(err, errs.ErrNotFound) {
|
||||
return nil, err
|
||||
}
|
||||
|
||||
@ -93,45 +93,13 @@ func TestUnfollowMutualDropsFriendsKeepsMessage(t *testing.T) {
|
||||
if err != nil || view.Following || view.Mutual || view.Friend || !view.FollowedBy {
|
||||
t.Fatalf("%+v %v", view, err)
|
||||
}
|
||||
peer, err := svc.GetFollow(ctx, b.ID, a.ID)
|
||||
if err != nil || peer.Friend || peer.Mutual {
|
||||
t.Fatalf("peer %+v %v", peer, err)
|
||||
}
|
||||
if _, err := svc.Relation(ctx, a.ID, b.ID); !errors.Is(err, errs.ErrNotFound) {
|
||||
t.Fatalf("edge a->b %v", err)
|
||||
}
|
||||
if _, err := svc.Relation(ctx, b.ID, a.ID); !errors.Is(err, errs.ErrNotFound) {
|
||||
t.Fatalf("edge b->a %v", err)
|
||||
}
|
||||
after, err := msgs.ListByConversation(ctx, conv.ID, a.ID, 0, 20)
|
||||
if err != nil || len(after) != 1 || after[0].ID != before[0].ID {
|
||||
t.Fatalf("after %d %v", len(after), err)
|
||||
}
|
||||
}
|
||||
|
||||
func TestOtherSideUnfollowRemovesBothEdges(t *testing.T) {
|
||||
svc, users, _ := testFriends(t)
|
||||
ctx := t.Context()
|
||||
a, b := twoUsers(t, users)
|
||||
if _, err := svc.Follow(ctx, a.ID, b.ID); err != nil {
|
||||
t.Fatal(err)
|
||||
}
|
||||
if view, err := svc.Follow(ctx, b.ID, a.ID); err != nil || !view.Friend {
|
||||
t.Fatalf("mutual %+v %v", view, err)
|
||||
}
|
||||
view, err := svc.Unfollow(ctx, b.ID, a.ID)
|
||||
if err != nil || view.Friend || view.Mutual {
|
||||
t.Fatalf("unfollow %+v %v", view, err)
|
||||
}
|
||||
if _, err := svc.Relation(ctx, a.ID, b.ID); !errors.Is(err, errs.ErrNotFound) {
|
||||
t.Fatalf("edge a->b %v", err)
|
||||
}
|
||||
if _, err := svc.Relation(ctx, b.ID, a.ID); !errors.Is(err, errs.ErrNotFound) {
|
||||
t.Fatalf("edge b->a %v", err)
|
||||
}
|
||||
left, err := svc.GetFollow(ctx, a.ID, b.ID)
|
||||
if err != nil || left.Friend || !left.Following {
|
||||
t.Fatalf("remaining follow %+v %v", left, err)
|
||||
ok, err := svc.AreFriends(ctx, a.ID, b.ID)
|
||||
if err != nil || ok {
|
||||
t.Fatalf("still friends %v %v", ok, err)
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -1278,6 +1278,56 @@ paths:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Envelope"
|
||||
/v1/follows/{uid}:
|
||||
get:
|
||||
tags: [friends]
|
||||
summary: 查看关注状态
|
||||
description: |
|
||||
当前用户是否关注对方。无请求体。`data` 含 `uid`、`following`、`followed_by`、`mutual`、`friend`。
|
||||
这是关注关系,不是新的消息接口。
|
||||
operationId: getFollow
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/FriendUID"
|
||||
responses:
|
||||
"200":
|
||||
description: 统一 envelope
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Envelope"
|
||||
put:
|
||||
tags: [friends]
|
||||
summary: 关注
|
||||
description: |
|
||||
无请求体。只增加一条单向关注。只有一方关注时 `mutual` 与 `friend` 都为 false,不会成为好友。
|
||||
若对方已经关注自己,这次关注使双方互相关注,则自动写入已有双向好友边(来源 `4`),并沿用成为好友的系统消息。已经是好友时不重复写这条系统消息。
|
||||
operationId: followUser
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/FriendUID"
|
||||
responses:
|
||||
"200":
|
||||
description: |
|
||||
统一 envelope。`data.following` 为 true。仅一方关注时 `mutual=false`、`friend=false`。互关成功时 `mutual=true`、`friend=true`。
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Envelope"
|
||||
delete:
|
||||
tags: [friends]
|
||||
summary: 取消关注
|
||||
description: |
|
||||
只删除自己这一条关注。若因此不再互相关注,删除双方好友边。不删除历史消息。
|
||||
只有一方关注时取消关注,不改动已经存在的好友关系。
|
||||
operationId: unfollowUser
|
||||
parameters:
|
||||
- $ref: "#/components/parameters/FriendUID"
|
||||
responses:
|
||||
"200":
|
||||
description: 统一 envelope。`data.following` 为 false。不再互关时 `friend` 为 false。
|
||||
content:
|
||||
application/json:
|
||||
schema:
|
||||
$ref: "#/components/schemas/Envelope"
|
||||
/v1/follows/{uid}:
|
||||
get:
|
||||
tags: [friends]
|
||||
|
||||
Loading…
Reference in New Issue
Block a user