2026-04-22 16:01:59 +08:00
|
|
|
|
package dto
|
2026-03-13 09:38:18 +08:00
|
|
|
|
|
|
|
|
|
|
import (
|
2026-04-22 16:01:59 +08:00
|
|
|
|
"with_you/internal/model"
|
2026-03-13 09:38:18 +08:00
|
|
|
|
)
|
|
|
|
|
|
|
|
|
|
|
|
// ==================== Group 转换 ====================
|
|
|
|
|
|
|
|
|
|
|
|
// GroupToResponse 将Group转换为GroupResponse
|
|
|
|
|
|
func GroupToResponse(group *model.Group) *GroupResponse {
|
|
|
|
|
|
if group == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return &GroupResponse{
|
|
|
|
|
|
ID: group.ID,
|
|
|
|
|
|
Name: group.Name,
|
|
|
|
|
|
Avatar: group.Avatar,
|
|
|
|
|
|
Description: group.Description,
|
|
|
|
|
|
OwnerID: group.OwnerID,
|
|
|
|
|
|
MemberCount: group.MemberCount,
|
|
|
|
|
|
MaxMembers: group.MaxMembers,
|
|
|
|
|
|
JoinType: int(group.JoinType),
|
|
|
|
|
|
MuteAll: group.MuteAll,
|
|
|
|
|
|
CreatedAt: FormatTime(group.CreatedAt),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GroupsToResponse 将Group列表转换为GroupResponse列表
|
|
|
|
|
|
func GroupsToResponse(groups []model.Group) []*GroupResponse {
|
|
|
|
|
|
result := make([]*GroupResponse, 0, len(groups))
|
|
|
|
|
|
for i := range groups {
|
|
|
|
|
|
result = append(result, GroupToResponse(&groups[i]))
|
|
|
|
|
|
}
|
|
|
|
|
|
return result
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GroupMemberToResponse 将GroupMember转换为GroupMemberResponse
|
|
|
|
|
|
func GroupMemberToResponse(member *model.GroupMember) *GroupMemberResponse {
|
|
|
|
|
|
if member == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return &GroupMemberResponse{
|
|
|
|
|
|
ID: member.ID,
|
|
|
|
|
|
GroupID: member.GroupID,
|
|
|
|
|
|
UserID: member.UserID,
|
|
|
|
|
|
Role: member.Role,
|
|
|
|
|
|
Nickname: member.Nickname,
|
|
|
|
|
|
Muted: member.Muted,
|
|
|
|
|
|
JoinTime: FormatTime(member.JoinTime),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// GroupAnnouncementToResponse 将GroupAnnouncement转换为GroupAnnouncementResponse
|
|
|
|
|
|
func GroupAnnouncementToResponse(announcement *model.GroupAnnouncement) *GroupAnnouncementResponse {
|
|
|
|
|
|
if announcement == nil {
|
|
|
|
|
|
return nil
|
|
|
|
|
|
}
|
|
|
|
|
|
return &GroupAnnouncementResponse{
|
|
|
|
|
|
ID: announcement.ID,
|
|
|
|
|
|
GroupID: announcement.GroupID,
|
|
|
|
|
|
Content: announcement.Content,
|
|
|
|
|
|
AuthorID: announcement.AuthorID,
|
|
|
|
|
|
IsPinned: announcement.IsPinned,
|
|
|
|
|
|
CreatedAt: FormatTime(announcement.CreatedAt),
|
|
|
|
|
|
}
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GroupAnnouncementsToResponse 将GroupAnnouncement列表转换为GroupAnnouncementResponse列表
|
|
|
|
|
|
func GroupAnnouncementsToResponse(announcements []model.GroupAnnouncement) []*GroupAnnouncementResponse {
|
|
|
|
|
|
result := make([]*GroupAnnouncementResponse, 0, len(announcements))
|
|
|
|
|
|
for i := range announcements {
|
|
|
|
|
|
result = append(result, GroupAnnouncementToResponse(&announcements[i]))
|
|
|
|
|
|
}
|
|
|
|
|
|
return result
|
|
|
|
|
|
}
|
feat(api): add cursor-based pagination for posts, comments, messages, groups, and notifications
Implement cursor-based pagination across multiple API endpoints to improve performance and enable efficient infinite scrolling. This replaces traditional offset-based pagination for high-volume data retrieval.
Changes:
- Add cursor pagination DTOs for all entity types (Post, Comment, Message, Conversation, Group, Notification, GroupMember, GroupAnnouncement)
- Implement cursor pagination methods in repositories with support for various sort orders (created_at, updated_at, join_time, seq)
- Add cursor pagination handlers that maintain backward compatibility with existing offset pagination
- Add new API routes for cursor-based endpoints (/cursor suffix)
- Add helper converter functions for pointer slice types in DTO conversions
2026-03-20 23:03:23 +08:00
|
|
|
|
|
|
|
|
|
|
// GroupsToResponseFromPtr 将Group指针切片转换为GroupResponse列表
|
|
|
|
|
|
func GroupsToResponseFromPtr(groups []*model.Group) []*GroupResponse {
|
|
|
|
|
|
result := make([]*GroupResponse, 0, len(groups))
|
|
|
|
|
|
for _, group := range groups {
|
|
|
|
|
|
result = append(result, GroupToResponse(group))
|
|
|
|
|
|
}
|
|
|
|
|
|
return result
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GroupMembersToResponseFromPtr 将GroupMember指针切片转换为GroupMemberResponse列表
|
|
|
|
|
|
func GroupMembersToResponseFromPtr(members []*model.GroupMember) []*GroupMemberResponse {
|
|
|
|
|
|
result := make([]*GroupMemberResponse, 0, len(members))
|
|
|
|
|
|
for _, member := range members {
|
|
|
|
|
|
result = append(result, GroupMemberToResponse(member))
|
|
|
|
|
|
}
|
|
|
|
|
|
return result
|
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
// GroupAnnouncementsToResponseFromPtr 将GroupAnnouncement指针切片转换为GroupAnnouncementResponse列表
|
|
|
|
|
|
func GroupAnnouncementsToResponseFromPtr(announcements []*model.GroupAnnouncement) []*GroupAnnouncementResponse {
|
|
|
|
|
|
result := make([]*GroupAnnouncementResponse, 0, len(announcements))
|
|
|
|
|
|
for _, announcement := range announcements {
|
|
|
|
|
|
result = append(result, GroupAnnouncementToResponse(announcement))
|
|
|
|
|
|
}
|
|
|
|
|
|
return result
|
|
|
|
|
|
}
|