Set up project files and add .gitignore to exclude local build/runtime artifacts. Made-with: Cursor
820 lines
28 KiB
Go
820 lines
28 KiB
Go
package dto
|
||
|
||
import (
|
||
"carrot_bbs/internal/model"
|
||
"time"
|
||
)
|
||
|
||
// ==================== User DTOs ====================
|
||
|
||
// UserResponse 用户信息响应
|
||
type UserResponse struct {
|
||
ID string `json:"id"`
|
||
Username string `json:"username"`
|
||
Nickname string `json:"nickname"`
|
||
Email *string `json:"email,omitempty"`
|
||
Phone *string `json:"phone,omitempty"`
|
||
EmailVerified bool `json:"email_verified"`
|
||
Avatar string `json:"avatar"`
|
||
CoverURL string `json:"cover_url"` // 头图URL
|
||
Bio string `json:"bio"`
|
||
Website string `json:"website"`
|
||
Location string `json:"location"`
|
||
PostsCount int `json:"posts_count"`
|
||
FollowersCount int `json:"followers_count"`
|
||
FollowingCount int `json:"following_count"`
|
||
IsFollowing bool `json:"is_following"` // 当前用户是否关注了该用户
|
||
IsFollowingMe bool `json:"is_following_me"` // 该用户是否关注了当前用户
|
||
CreatedAt string `json:"created_at"`
|
||
}
|
||
|
||
// UserDetailResponse 用户详情响应
|
||
type UserDetailResponse struct {
|
||
ID string `json:"id"`
|
||
Username string `json:"username"`
|
||
Nickname string `json:"nickname"`
|
||
Email *string `json:"email"`
|
||
EmailVerified bool `json:"email_verified"`
|
||
Phone *string `json:"phone,omitempty"` // 仅当前用户自己可见
|
||
Avatar string `json:"avatar"`
|
||
CoverURL string `json:"cover_url"` // 头图URL
|
||
Bio string `json:"bio"`
|
||
Website string `json:"website"`
|
||
Location string `json:"location"`
|
||
PostsCount int `json:"posts_count"`
|
||
FollowersCount int `json:"followers_count"`
|
||
FollowingCount int `json:"following_count"`
|
||
IsVerified bool `json:"is_verified"`
|
||
IsFollowing bool `json:"is_following"` // 当前用户是否关注了该用户
|
||
IsFollowingMe bool `json:"is_following_me"` // 该用户是否关注了当前用户
|
||
CreatedAt string `json:"created_at"`
|
||
}
|
||
|
||
// ==================== Post DTOs ====================
|
||
|
||
// PostImageResponse 帖子图片响应
|
||
type PostImageResponse struct {
|
||
ID string `json:"id"`
|
||
URL string `json:"url"`
|
||
ThumbnailURL string `json:"thumbnail_url"`
|
||
Width int `json:"width"`
|
||
Height int `json:"height"`
|
||
}
|
||
|
||
// PostResponse 帖子响应(列表用)
|
||
type PostResponse struct {
|
||
ID string `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
Title string `json:"title"`
|
||
Content string `json:"content"`
|
||
Images []PostImageResponse `json:"images"`
|
||
LikesCount int `json:"likes_count"`
|
||
CommentsCount int `json:"comments_count"`
|
||
FavoritesCount int `json:"favorites_count"`
|
||
SharesCount int `json:"shares_count"`
|
||
ViewsCount int `json:"views_count"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
IsLocked bool `json:"is_locked"`
|
||
IsVote bool `json:"is_vote"`
|
||
CreatedAt string `json:"created_at"`
|
||
Author *UserResponse `json:"author"`
|
||
IsLiked bool `json:"is_liked"`
|
||
IsFavorited bool `json:"is_favorited"`
|
||
}
|
||
|
||
// PostDetailResponse 帖子详情响应
|
||
type PostDetailResponse struct {
|
||
ID string `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
Title string `json:"title"`
|
||
Content string `json:"content"`
|
||
Images []PostImageResponse `json:"images"`
|
||
Status string `json:"status"`
|
||
LikesCount int `json:"likes_count"`
|
||
CommentsCount int `json:"comments_count"`
|
||
FavoritesCount int `json:"favorites_count"`
|
||
SharesCount int `json:"shares_count"`
|
||
ViewsCount int `json:"views_count"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
IsLocked bool `json:"is_locked"`
|
||
IsVote bool `json:"is_vote"`
|
||
CreatedAt string `json:"created_at"`
|
||
UpdatedAt string `json:"updated_at"`
|
||
Author *UserResponse `json:"author"`
|
||
IsLiked bool `json:"is_liked"`
|
||
IsFavorited bool `json:"is_favorited"`
|
||
}
|
||
|
||
// ==================== Comment DTOs ====================
|
||
|
||
// CommentImageResponse 评论图片响应
|
||
type CommentImageResponse struct {
|
||
URL string `json:"url"`
|
||
}
|
||
|
||
// CommentResponse 评论响应(扁平化结构,类似B站/抖音)
|
||
// 第一层级正常展示,第二三四五层级在第一层级的评论区扁平展示
|
||
type CommentResponse struct {
|
||
ID string `json:"id"`
|
||
PostID string `json:"post_id"`
|
||
UserID string `json:"user_id"`
|
||
ParentID *string `json:"parent_id"`
|
||
RootID *string `json:"root_id"`
|
||
Content string `json:"content"`
|
||
Images []CommentImageResponse `json:"images"`
|
||
LikesCount int `json:"likes_count"`
|
||
RepliesCount int `json:"replies_count"`
|
||
CreatedAt string `json:"created_at"`
|
||
Author *UserResponse `json:"author"`
|
||
IsLiked bool `json:"is_liked"`
|
||
TargetID *string `json:"target_id,omitempty"` // 被回复的评论ID,前端根据此ID找到被回复用户的昵称
|
||
Replies []*CommentResponse `json:"replies,omitempty"` // 子回复列表(扁平化,所有层级都在这里)
|
||
}
|
||
|
||
// ==================== Notification DTOs ====================
|
||
|
||
// NotificationResponse 通知响应
|
||
type NotificationResponse struct {
|
||
ID string `json:"id"`
|
||
UserID string `json:"user_id"`
|
||
Type string `json:"type"`
|
||
Title string `json:"title"`
|
||
Content string `json:"content"`
|
||
Data string `json:"data"`
|
||
IsRead bool `json:"is_read"`
|
||
CreatedAt string `json:"created_at"`
|
||
}
|
||
|
||
// ==================== Message Segment DTOs ====================
|
||
|
||
// SegmentType Segment类型
|
||
type SegmentType string
|
||
|
||
const (
|
||
SegmentTypeText SegmentType = "text"
|
||
SegmentTypeImage SegmentType = "image"
|
||
SegmentTypeVoice SegmentType = "voice"
|
||
SegmentTypeVideo SegmentType = "video"
|
||
SegmentTypeFile SegmentType = "file"
|
||
SegmentTypeAt SegmentType = "at"
|
||
SegmentTypeReply SegmentType = "reply"
|
||
SegmentTypeFace SegmentType = "face"
|
||
SegmentTypeLink SegmentType = "link"
|
||
)
|
||
|
||
// TextSegmentData 文本数据
|
||
type TextSegmentData struct {
|
||
Text string `json:"text"`
|
||
}
|
||
|
||
// ImageSegmentData 图片数据
|
||
type ImageSegmentData struct {
|
||
URL string `json:"url"`
|
||
Width int `json:"width,omitempty"`
|
||
Height int `json:"height,omitempty"`
|
||
ThumbnailURL string `json:"thumbnail_url,omitempty"`
|
||
FileSize int64 `json:"file_size,omitempty"`
|
||
}
|
||
|
||
// VoiceSegmentData 语音数据
|
||
type VoiceSegmentData struct {
|
||
URL string `json:"url"`
|
||
Duration int `json:"duration,omitempty"` // 秒
|
||
FileSize int64 `json:"file_size,omitempty"`
|
||
}
|
||
|
||
// VideoSegmentData 视频数据
|
||
type VideoSegmentData struct {
|
||
URL string `json:"url"`
|
||
Width int `json:"width,omitempty"`
|
||
Height int `json:"height,omitempty"`
|
||
Duration int `json:"duration,omitempty"` // 秒
|
||
ThumbnailURL string `json:"thumbnail_url,omitempty"`
|
||
FileSize int64 `json:"file_size,omitempty"`
|
||
}
|
||
|
||
// FileSegmentData 文件数据
|
||
type FileSegmentData struct {
|
||
URL string `json:"url"`
|
||
Name string `json:"name"`
|
||
Size int64 `json:"size,omitempty"`
|
||
MimeType string `json:"mime_type,omitempty"`
|
||
}
|
||
|
||
// AtSegmentData @数据
|
||
type AtSegmentData struct {
|
||
UserID string `json:"user_id"` // "all" 表示@所有人
|
||
Nickname string `json:"nickname,omitempty"`
|
||
}
|
||
|
||
// ReplySegmentData 回复数据
|
||
type ReplySegmentData struct {
|
||
ID string `json:"id"` // 被回复消息的ID
|
||
}
|
||
|
||
// FaceSegmentData 表情数据
|
||
type FaceSegmentData struct {
|
||
ID int `json:"id"`
|
||
Name string `json:"name,omitempty"`
|
||
URL string `json:"url,omitempty"`
|
||
}
|
||
|
||
// LinkSegmentData 链接数据
|
||
type LinkSegmentData struct {
|
||
URL string `json:"url"`
|
||
Title string `json:"title,omitempty"`
|
||
Description string `json:"description,omitempty"`
|
||
Image string `json:"image,omitempty"`
|
||
}
|
||
|
||
// ==================== Message DTOs ====================
|
||
|
||
// MessageResponse 消息响应
|
||
type MessageResponse struct {
|
||
ID string `json:"id"`
|
||
ConversationID string `json:"conversation_id"`
|
||
SenderID string `json:"sender_id"`
|
||
Seq int64 `json:"seq"`
|
||
Segments model.MessageSegments `json:"segments"` // 消息链(必须)
|
||
ReplyToID *string `json:"reply_to_id,omitempty"` // 被回复消息的ID(用于关联查找)
|
||
Status string `json:"status"`
|
||
Category string `json:"category,omitempty"` // 消息类别:chat, notification, announcement
|
||
CreatedAt string `json:"created_at"`
|
||
Sender *UserResponse `json:"sender"`
|
||
}
|
||
|
||
// ConversationResponse 会话响应
|
||
type ConversationResponse struct {
|
||
ID string `json:"id"`
|
||
Type string `json:"type"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
Group *GroupResponse `json:"group,omitempty"`
|
||
LastSeq int64 `json:"last_seq"`
|
||
LastMessage *MessageResponse `json:"last_message"`
|
||
LastMessageAt string `json:"last_message_at"`
|
||
UnreadCount int `json:"unread_count"`
|
||
Participants []*UserResponse `json:"participants,omitempty"` // 私聊时使用
|
||
MemberCount int `json:"member_count,omitempty"` // 群聊时使用
|
||
CreatedAt string `json:"created_at"`
|
||
UpdatedAt string `json:"updated_at"`
|
||
}
|
||
|
||
// ConversationParticipantResponse 会话参与者响应
|
||
type ConversationParticipantResponse struct {
|
||
UserID string `json:"user_id"`
|
||
LastReadSeq int64 `json:"last_read_seq"`
|
||
Muted bool `json:"muted"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
}
|
||
|
||
// ==================== Auth DTOs ====================
|
||
|
||
// LoginResponse 登录响应
|
||
type LoginResponse struct {
|
||
User *UserResponse `json:"user"`
|
||
AccessToken string `json:"access_token"`
|
||
RefreshToken string `json:"refresh_token"`
|
||
}
|
||
|
||
// RegisterResponse 注册响应
|
||
type RegisterResponse struct {
|
||
User *UserResponse `json:"user"`
|
||
AccessToken string `json:"access_token"`
|
||
RefreshToken string `json:"refresh_token"`
|
||
}
|
||
|
||
// RefreshTokenResponse 刷新Token响应
|
||
type RefreshTokenResponse struct {
|
||
AccessToken string `json:"access_token"`
|
||
RefreshToken string `json:"refresh_token"`
|
||
}
|
||
|
||
// ==================== Common DTOs ====================
|
||
|
||
// SuccessResponse 通用成功响应
|
||
type SuccessResponse struct {
|
||
Success bool `json:"success"`
|
||
Message string `json:"message"`
|
||
}
|
||
|
||
// AvailableResponse 可用性检查响应
|
||
type AvailableResponse struct {
|
||
Available bool `json:"available"`
|
||
}
|
||
|
||
// CountResponse 数量响应
|
||
type CountResponse struct {
|
||
Count int `json:"count"`
|
||
}
|
||
|
||
// URLResponse URL响应
|
||
type URLResponse struct {
|
||
URL string `json:"url"`
|
||
}
|
||
|
||
// ==================== Chat Request DTOs ====================
|
||
|
||
// CreateConversationRequest 创建会话请求
|
||
type CreateConversationRequest struct {
|
||
UserID string `json:"user_id" binding:"required"` // 目标用户ID (UUID格式)
|
||
}
|
||
|
||
// SendMessageRequest 发送消息请求
|
||
type SendMessageRequest struct {
|
||
Segments model.MessageSegments `json:"segments" binding:"required"` // 消息链(必须)
|
||
ReplyToID *string `json:"reply_to_id,omitempty"` // 回复的消息ID (string类型)
|
||
}
|
||
|
||
// MarkReadRequest 标记已读请求
|
||
type MarkReadRequest struct {
|
||
LastReadSeq int64 `json:"last_read_seq" binding:"required"` // 已读到的seq位置
|
||
}
|
||
|
||
// SetConversationPinnedRequest 设置会话置顶请求
|
||
type SetConversationPinnedRequest struct {
|
||
ConversationID string `json:"conversation_id" binding:"required"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
}
|
||
|
||
// ==================== Chat Response DTOs ====================
|
||
|
||
// ConversationListResponse 会话列表响应
|
||
type ConversationListResponse struct {
|
||
Conversations []*ConversationResponse `json:"list"`
|
||
Total int64 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"page_size"`
|
||
}
|
||
|
||
// ConversationDetailResponse 会话详情响应
|
||
type ConversationDetailResponse struct {
|
||
ID string `json:"id"`
|
||
Type string `json:"type"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
LastSeq int64 `json:"last_seq"`
|
||
LastMessage *MessageResponse `json:"last_message"`
|
||
LastMessageAt string `json:"last_message_at"`
|
||
UnreadCount int64 `json:"unread_count"`
|
||
Participants []*UserResponse `json:"participants"`
|
||
MyLastReadSeq int64 `json:"my_last_read_seq"` // 当前用户的已读位置
|
||
OtherLastReadSeq int64 `json:"other_last_read_seq"` // 对方用户的已读位置
|
||
CreatedAt string `json:"created_at"`
|
||
UpdatedAt string `json:"updated_at"`
|
||
}
|
||
|
||
// UnreadCountResponse 未读数响应
|
||
type UnreadCountResponse struct {
|
||
TotalUnreadCount int64 `json:"total_unread_count"` // 所有会话的未读总数
|
||
}
|
||
|
||
// ConversationUnreadCountResponse 单个会话未读数响应
|
||
type ConversationUnreadCountResponse struct {
|
||
ConversationID string `json:"conversation_id"`
|
||
UnreadCount int64 `json:"unread_count"`
|
||
}
|
||
|
||
// MessageListResponse 消息列表响应
|
||
type MessageListResponse struct {
|
||
Messages []*MessageResponse `json:"messages"`
|
||
Total int64 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"page_size"`
|
||
}
|
||
|
||
// MessageSyncResponse 消息同步响应(增量同步)
|
||
type MessageSyncResponse struct {
|
||
Messages []*MessageResponse `json:"messages"`
|
||
HasMore bool `json:"has_more"`
|
||
}
|
||
|
||
// ==================== 设备Token DTOs ====================
|
||
|
||
// RegisterDeviceRequest 注册设备请求
|
||
type RegisterDeviceRequest struct {
|
||
DeviceID string `json:"device_id" binding:"required"`
|
||
DeviceType string `json:"device_type" binding:"required,oneof=ios android web"`
|
||
PushToken string `json:"push_token"`
|
||
DeviceName string `json:"device_name"`
|
||
}
|
||
|
||
// DeviceTokenResponse 设备Token响应
|
||
type DeviceTokenResponse struct {
|
||
ID int64 `json:"id"`
|
||
DeviceID string `json:"device_id"`
|
||
DeviceType string `json:"device_type"`
|
||
IsActive bool `json:"is_active"`
|
||
DeviceName string `json:"device_name"`
|
||
LastUsedAt time.Time `json:"last_used_at,omitempty"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
}
|
||
|
||
// ==================== 推送记录 DTOs ====================
|
||
|
||
// PushRecordResponse 推送记录响应
|
||
type PushRecordResponse struct {
|
||
ID int64 `json:"id"`
|
||
MessageID string `json:"message_id"`
|
||
PushChannel string `json:"push_channel"`
|
||
PushStatus string `json:"push_status"`
|
||
RetryCount int `json:"retry_count"`
|
||
PushedAt time.Time `json:"pushed_at,omitempty"`
|
||
DeliveredAt time.Time `json:"delivered_at,omitempty"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
}
|
||
|
||
// PushRecordListResponse 推送记录列表响应
|
||
type PushRecordListResponse struct {
|
||
Records []*PushRecordResponse `json:"records"`
|
||
Total int64 `json:"total"`
|
||
}
|
||
|
||
// ==================== 系统消息 DTOs ====================
|
||
|
||
// SystemMessageResponse 系统消息响应
|
||
type SystemMessageResponse struct {
|
||
ID string `json:"id"`
|
||
SenderID string `json:"sender_id"`
|
||
ReceiverID string `json:"receiver_id"`
|
||
Content string `json:"content"`
|
||
Category string `json:"category"`
|
||
SystemType string `json:"system_type"`
|
||
ExtraData map[string]interface{} `json:"extra_data,omitempty"`
|
||
IsRead bool `json:"is_read"`
|
||
CreatedAt time.Time `json:"created_at"`
|
||
}
|
||
|
||
// SystemMessageListResponse 系统消息列表响应
|
||
type SystemMessageListResponse struct {
|
||
Messages []*SystemMessageResponse `json:"messages"`
|
||
Total int64 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"page_size"`
|
||
}
|
||
|
||
// SystemUnreadCountResponse 系统消息未读数响应
|
||
type SystemUnreadCountResponse struct {
|
||
UnreadCount int64 `json:"unread_count"`
|
||
}
|
||
|
||
// ==================== 时间格式化 ====================
|
||
|
||
// FormatTime 格式化时间
|
||
func FormatTime(t time.Time) string {
|
||
if t.IsZero() {
|
||
return ""
|
||
}
|
||
return t.Format("2006-01-02T15:04:05Z07:00")
|
||
}
|
||
|
||
// FormatTimePointer 格式化时间指针
|
||
func FormatTimePointer(t *time.Time) string {
|
||
if t == nil {
|
||
return ""
|
||
}
|
||
return FormatTime(*t)
|
||
}
|
||
|
||
// ==================== Group DTOs ====================
|
||
|
||
// CreateGroupRequest 创建群组请求
|
||
type CreateGroupRequest struct {
|
||
Name string `json:"name" binding:"required,max=50"`
|
||
Description string `json:"description" binding:"max=500"`
|
||
MemberIDs []string `json:"member_ids"`
|
||
}
|
||
|
||
// UpdateGroupRequest 更新群组请求
|
||
type UpdateGroupRequest struct {
|
||
Name string `json:"name" binding:"omitempty,max=50"`
|
||
Description string `json:"description" binding:"omitempty,max=500"`
|
||
Avatar string `json:"avatar" binding:"omitempty,url"`
|
||
}
|
||
|
||
// InviteMembersRequest 邀请成员请求
|
||
type InviteMembersRequest struct {
|
||
MemberIDs []string `json:"member_ids" binding:"required,min=1"`
|
||
}
|
||
|
||
// TransferOwnerRequest 转让群主请求
|
||
type TransferOwnerRequest struct {
|
||
NewOwnerID string `json:"new_owner_id" binding:"required"`
|
||
}
|
||
|
||
// SetRoleRequest 设置角色请求
|
||
type SetRoleRequest struct {
|
||
Role string `json:"role" binding:"required,oneof=admin member"`
|
||
}
|
||
|
||
// SetNicknameRequest 设置昵称请求
|
||
type SetNicknameRequest struct {
|
||
Nickname string `json:"nickname" binding:"max=50"`
|
||
}
|
||
|
||
// MuteMemberRequest 禁言成员请求
|
||
type MuteMemberRequest struct {
|
||
Muted bool `json:"muted"`
|
||
}
|
||
|
||
// SetMuteAllRequest 设置全员禁言请求
|
||
type SetMuteAllRequest struct {
|
||
MuteAll bool `json:"mute_all"`
|
||
}
|
||
|
||
// SetJoinTypeRequest 设置加群方式请求
|
||
type SetJoinTypeRequest struct {
|
||
JoinType int `json:"join_type" binding:"min=0,max=2"`
|
||
}
|
||
|
||
// CreateAnnouncementRequest 创建群公告请求
|
||
type CreateAnnouncementRequest struct {
|
||
Content string `json:"content" binding:"required,max=2000"`
|
||
}
|
||
|
||
// GroupResponse 群组响应
|
||
type GroupResponse struct {
|
||
ID string `json:"id"`
|
||
Name string `json:"name"`
|
||
Avatar string `json:"avatar"`
|
||
Description string `json:"description"`
|
||
OwnerID string `json:"owner_id"`
|
||
MemberCount int `json:"member_count"`
|
||
MaxMembers int `json:"max_members"`
|
||
JoinType int `json:"join_type"`
|
||
MuteAll bool `json:"mute_all"`
|
||
CreatedAt string `json:"created_at"`
|
||
}
|
||
|
||
// GroupMemberResponse 群成员响应
|
||
type GroupMemberResponse struct {
|
||
ID string `json:"id"`
|
||
GroupID string `json:"group_id"`
|
||
UserID string `json:"user_id"`
|
||
Role string `json:"role"`
|
||
Nickname string `json:"nickname"`
|
||
Muted bool `json:"muted"`
|
||
JoinTime string `json:"join_time"`
|
||
User *UserResponse `json:"user,omitempty"`
|
||
}
|
||
|
||
// GroupAnnouncementResponse 群公告响应
|
||
type GroupAnnouncementResponse struct {
|
||
ID string `json:"id"`
|
||
GroupID string `json:"group_id"`
|
||
Content string `json:"content"`
|
||
AuthorID string `json:"author_id"`
|
||
IsPinned bool `json:"is_pinned"`
|
||
CreatedAt string `json:"created_at"`
|
||
}
|
||
|
||
// GroupListResponse 群组列表响应
|
||
type GroupListResponse struct {
|
||
List []*GroupResponse `json:"list"`
|
||
Total int64 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"page_size"`
|
||
}
|
||
|
||
// GroupMemberListResponse 群成员列表响应
|
||
type GroupMemberListResponse struct {
|
||
List []*GroupMemberResponse `json:"list"`
|
||
Total int64 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"page_size"`
|
||
}
|
||
|
||
// GroupAnnouncementListResponse 群公告列表响应
|
||
type GroupAnnouncementListResponse struct {
|
||
List []*GroupAnnouncementResponse `json:"list"`
|
||
Total int64 `json:"total"`
|
||
Page int `json:"page"`
|
||
PageSize int `json:"page_size"`
|
||
}
|
||
|
||
// ==================== WebSocket Event DTOs ====================
|
||
|
||
// WSEventResponse WebSocket事件响应结构体
|
||
// 用于后端推送消息给前端的标准格式
|
||
type WSEventResponse struct {
|
||
ID string `json:"id"` // 事件唯一ID (UUID)
|
||
Time int64 `json:"time"` // 时间戳 (毫秒)
|
||
Type string `json:"type"` // 事件类型 (message, notification, system等)
|
||
DetailType string `json:"detail_type"` // 详细类型 (private, group, like, comment等)
|
||
Seq string `json:"seq"` // 消息序列号
|
||
Segments model.MessageSegments `json:"segments"` // 消息段数组
|
||
SenderID string `json:"sender_id"` // 发送者用户ID
|
||
}
|
||
|
||
// ==================== WebSocket Request DTOs ====================
|
||
|
||
// SendMessageParams 发送消息参数(用于 REST API)
|
||
type SendMessageParams struct {
|
||
DetailType string `json:"detail_type"` // 消息类型: private, group
|
||
ConversationID string `json:"conversation_id"` // 会话ID
|
||
Segments model.MessageSegments `json:"segments"` // 消息内容(消息段数组)
|
||
ReplyToID *string `json:"reply_to_id,omitempty"` // 回复的消息ID
|
||
}
|
||
|
||
// DeleteMsgParams 撤回消息参数
|
||
type DeleteMsgParams struct {
|
||
MessageID string `json:"message_id"` // 消息ID
|
||
}
|
||
|
||
// ==================== Group Action Params ====================
|
||
|
||
// SetGroupKickParams 群组踢人参数
|
||
type SetGroupKickParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
UserID string `json:"user_id"` // 被踢用户ID
|
||
RejectAddRequest bool `json:"reject_add_request"` // 是否拒绝再次加群
|
||
}
|
||
|
||
// SetGroupBanParams 群组单人禁言参数
|
||
type SetGroupBanParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
UserID string `json:"user_id"` // 被禁言用户ID
|
||
Duration int64 `json:"duration"` // 禁言时长(秒),0表示解除禁言
|
||
}
|
||
|
||
// SetGroupWholeBanParams 群组全员禁言参数
|
||
type SetGroupWholeBanParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
Enable bool `json:"enable"` // 是否开启全员禁言
|
||
}
|
||
|
||
// SetGroupAdminParams 群组设置管理员参数
|
||
type SetGroupAdminParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
UserID string `json:"user_id"` // 被设置的用户ID
|
||
Enable bool `json:"enable"` // 是否设置为管理员
|
||
}
|
||
|
||
// SetGroupNameParams 设置群名参数
|
||
type SetGroupNameParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
GroupName string `json:"group_name"` // 新群名
|
||
}
|
||
|
||
// SetGroupAvatarParams 设置群头像参数
|
||
type SetGroupAvatarParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
Avatar string `json:"avatar"` // 头像URL
|
||
}
|
||
|
||
// SetGroupLeaveParams 退出群组参数
|
||
type SetGroupLeaveParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
}
|
||
|
||
// SetGroupAddRequestParams 处理加群请求参数
|
||
type SetGroupAddRequestParams struct {
|
||
Flag string `json:"flag"` // 加群请求的flag标识
|
||
Approve bool `json:"approve"` // 是否同意
|
||
Reason string `json:"reason"` // 拒绝理由(当approve为false时)
|
||
}
|
||
|
||
// GetConversationListParams 获取会话列表参数
|
||
type GetConversationListParams struct {
|
||
Page int `json:"page"` // 页码
|
||
PageSize int `json:"page_size"` // 每页数量
|
||
}
|
||
|
||
// GetGroupInfoParams 获取群信息参数
|
||
type GetGroupInfoParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
}
|
||
|
||
// GetGroupMemberListParams 获取群成员列表参数
|
||
type GetGroupMemberListParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
Page int `json:"page"` // 页码
|
||
PageSize int `json:"page_size"` // 每页数量
|
||
}
|
||
|
||
// ==================== Conversation Action Params ====================
|
||
|
||
// CreateConversationParams 创建会话参数
|
||
type CreateConversationParams struct {
|
||
UserID string `json:"user_id"` // 目标用户ID(私聊)
|
||
}
|
||
|
||
// MarkReadParams 标记已读参数
|
||
type MarkReadParams struct {
|
||
ConversationID string `json:"conversation_id"` // 会话ID
|
||
LastReadSeq int64 `json:"last_read_seq"` // 最后已读消息序号
|
||
}
|
||
|
||
// SetConversationPinnedParams 设置会话置顶参数
|
||
type SetConversationPinnedParams struct {
|
||
ConversationID string `json:"conversation_id"` // 会话ID
|
||
IsPinned bool `json:"is_pinned"` // 是否置顶
|
||
}
|
||
|
||
// ==================== Group Action Params (Additional) ====================
|
||
|
||
// CreateGroupParams 创建群组参数
|
||
type CreateGroupParams struct {
|
||
Name string `json:"name"` // 群名
|
||
Description string `json:"description,omitempty"` // 群描述
|
||
MemberIDs []string `json:"member_ids,omitempty"` // 初始成员ID列表
|
||
}
|
||
|
||
// GetUserGroupsParams 获取用户群组列表参数
|
||
type GetUserGroupsParams struct {
|
||
Page int `json:"page"` // 页码
|
||
PageSize int `json:"page_size"` // 每页数量
|
||
}
|
||
|
||
// TransferOwnerParams 转让群主参数
|
||
type TransferOwnerParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
NewOwnerID string `json:"new_owner_id"` // 新群主ID
|
||
}
|
||
|
||
// InviteMembersParams 邀请成员参数
|
||
type InviteMembersParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
MemberIDs []string `json:"member_ids"` // 被邀请的用户ID列表
|
||
}
|
||
|
||
// JoinGroupParams 加入群组参数
|
||
type JoinGroupParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
}
|
||
|
||
// SetNicknameParams 设置群内昵称参数
|
||
type SetNicknameParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
Nickname string `json:"nickname"` // 群内昵称
|
||
}
|
||
|
||
// SetJoinTypeParams 设置加群方式参数
|
||
type SetJoinTypeParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
JoinType int `json:"join_type"` // 加群方式:0-允许任何人加入,1-需要审批,2-不允许加入
|
||
}
|
||
|
||
// CreateAnnouncementParams 创建群公告参数
|
||
type CreateAnnouncementParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
Content string `json:"content"` // 公告内容
|
||
}
|
||
|
||
// GetAnnouncementsParams 获取群公告列表参数
|
||
type GetAnnouncementsParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
Page int `json:"page"` // 页码
|
||
PageSize int `json:"page_size"` // 每页数量
|
||
}
|
||
|
||
// DeleteAnnouncementParams 删除群公告参数
|
||
type DeleteAnnouncementParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
AnnouncementID string `json:"announcement_id"` // 公告ID
|
||
}
|
||
|
||
// DissolveGroupParams 解散群组参数
|
||
type DissolveGroupParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
}
|
||
|
||
// GetMyMemberInfoParams 获取我在群组中的成员信息参数
|
||
type GetMyMemberInfoParams struct {
|
||
GroupID string `json:"group_id"` // 群组ID
|
||
}
|
||
|
||
// ==================== Vote DTOs ====================
|
||
|
||
// CreateVotePostRequest 创建投票帖子请求
|
||
type CreateVotePostRequest struct {
|
||
Title string `json:"title" binding:"required,max=200"`
|
||
Content string `json:"content" binding:"max=2000"`
|
||
CommunityID string `json:"community_id"`
|
||
Images []string `json:"images"`
|
||
VoteOptions []string `json:"vote_options" binding:"required,min=2,max=10"` // 投票选项,至少2个最多10个
|
||
}
|
||
|
||
// VoteOptionDTO 投票选项DTO
|
||
type VoteOptionDTO struct {
|
||
ID string `json:"id"`
|
||
Content string `json:"content"`
|
||
VotesCount int `json:"votes_count"`
|
||
}
|
||
|
||
// VoteResultDTO 投票结果DTO
|
||
type VoteResultDTO struct {
|
||
Options []VoteOptionDTO `json:"options"`
|
||
TotalVotes int `json:"total_votes"`
|
||
HasVoted bool `json:"has_voted"`
|
||
VotedOptionID string `json:"voted_option_id,omitempty"`
|
||
}
|
||
|
||
// ==================== WebSocket Response DTOs ====================
|
||
|
||
// WSResponse WebSocket响应结构体
|
||
type WSResponse struct {
|
||
Success bool `json:"success"` // 是否成功
|
||
Action string `json:"action"` // 响应原action
|
||
Data interface{} `json:"data,omitempty"` // 响应数据
|
||
Error string `json:"error,omitempty"` // 错误信息
|
||
}
|