Compare commits
2 commits
b52d3f3f64
...
ef25da6462
| Author | SHA1 | Date | |
|---|---|---|---|
| ef25da6462 | |||
| a9fbb1f80d |
2 changed files with 41 additions and 1 deletions
|
|
@ -81,6 +81,21 @@ func TestGetForumTopicsVisibleToPublicNonMember(t *testing.T) {
|
||||||
t.Fatalf("non-member did not see the Test topic: %+v", res.Topics)
|
t.Fatalf("non-member did not see the Test topic: %+v", res.Topics)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// The forum's own channel must come back with left=true so the client still
|
||||||
|
// offers a Join button instead of treating the forum as already joined.
|
||||||
|
var forumChat *tg.Channel
|
||||||
|
for _, c := range res.Chats {
|
||||||
|
if ch, ok := c.(*tg.Channel); ok && ch.ID == channel.ID {
|
||||||
|
forumChat = ch
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if forumChat == nil {
|
||||||
|
t.Fatalf("forum channel missing from getForumTopics chats: %+v", res.Chats)
|
||||||
|
}
|
||||||
|
if !forumChat.Left {
|
||||||
|
t.Fatalf("non-member forum chat = %#v, want left=true", forumChat)
|
||||||
|
}
|
||||||
|
|
||||||
// A private forum still refuses a non-member.
|
// A private forum still refuses a non-member.
|
||||||
priv, err := r.onChannelsCreateChannel(ownerCtx, &tg.ChannelsCreateChannelRequest{Title: "Private Forum", Megagroup: true})
|
priv, err := r.onChannelsCreateChannel(ownerCtx, &tg.ChannelsCreateChannelRequest{Title: "Private Forum", Megagroup: true})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
|
|
||||||
|
|
@ -474,12 +474,37 @@ func (r *Router) forumTopicsResponse(ctx context.Context, userID int64, view dom
|
||||||
Count: count,
|
Count: count,
|
||||||
Topics: topics,
|
Topics: topics,
|
||||||
Messages: messages,
|
Messages: messages,
|
||||||
Chats: tgChannels(userID, channels),
|
Chats: r.forumTopicsChats(userID, view, channels),
|
||||||
Users: r.tgUsersForIDs(ctx, userID, userIDs),
|
Users: r.tgUsersForIDs(ctx, userID, userIDs),
|
||||||
Pts: view.Channel.Pts,
|
Pts: view.Channel.Pts,
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// forumTopicsChats projects the forum's own channel with the viewer's member
|
||||||
|
// state (so a non-member preview carries left=true and the client still shows a
|
||||||
|
// Join button) and every other referenced channel as a min chat. Rendering the
|
||||||
|
// primary as a bare min chat lets a client that has no other object for the
|
||||||
|
// channel treat the forum as already joined.
|
||||||
|
func (r *Router) forumTopicsChats(userID int64, view domain.ChannelView, channels []domain.Channel) []tg.ChatClass {
|
||||||
|
if view.Channel.ID == 0 {
|
||||||
|
return tgChannels(userID, channels)
|
||||||
|
}
|
||||||
|
chats := make([]tg.ChatClass, 0, len(channels))
|
||||||
|
chats = append(chats, tgChannelChatForView(userID, view))
|
||||||
|
seen := map[int64]struct{}{view.Channel.ID: {}}
|
||||||
|
for _, extra := range channels {
|
||||||
|
if extra.ID == 0 {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
if _, dup := seen[extra.ID]; dup {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
seen[extra.ID] = struct{}{}
|
||||||
|
chats = append(chats, tgChannelChatMin(userID, extra))
|
||||||
|
}
|
||||||
|
return chats
|
||||||
|
}
|
||||||
|
|
||||||
func tgForumGeneralTopic(viewerUserID int64, view domain.ChannelView, topic domain.ChannelForumTopic) *tg.ForumTopic {
|
func tgForumGeneralTopic(viewerUserID int64, view domain.ChannelView, topic domain.ChannelForumTopic) *tg.ForumTopic {
|
||||||
return &tg.ForumTopic{
|
return &tg.ForumTopic{
|
||||||
My: view.Channel.CreatorUserID == viewerUserID && viewerUserID != 0,
|
My: view.Channel.CreatorUserID == viewerUserID && viewerUserID != 0,
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue