// Copyright © 2023 OpenIM. All rights reserved. // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. // You may obtain a copy of the License at // // http://www.apache.org/licenses/LICENSE-2.0 // // Unless required by applicable law or agreed to in writing, software // distributed under the License is distributed on an "AS IS" BASIS, // WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. // See the License for the specific language governing permissions and // limitations under the License. package apistruct import ( "encoding/json" "fmt" "strconv" pbmsg "git.imall.cloud/openim/protocol/msg" "git.imall.cloud/openim/protocol/sdkws" ) // SendMsg defines the structure for sending messages with various metadata. type SendMsg struct { // SendID uniquely identifies the sender. SendID string `json:"sendID" binding:"required"` // GroupID is the identifier for the group, required if SessionType is 2 or 3. GroupID string `json:"groupID" binding:"required_if=SessionType 2|required_if=SessionType 3"` // SenderNickname is the nickname of the sender. SenderNickname string `json:"senderNickname"` // SenderFaceURL is the URL to the sender's avatar. SenderFaceURL string `json:"senderFaceURL"` // SenderPlatformID is an integer identifier for the sender's platform. SenderPlatformID int32 `json:"senderPlatformID"` // Content is the actual content of the message, required and excluded from Swagger documentation. Content map[string]any `json:"content" binding:"required" swaggerignore:"true"` // ContentType is an integer that represents the type of the content. ContentType int32 `json:"contentType" binding:"required"` // SessionType is an integer that represents the type of session for the message. SessionType int32 `json:"sessionType" binding:"required"` // IsOnlineOnly specifies if the message is only sent when the receiver is online. IsOnlineOnly bool `json:"isOnlineOnly"` // NotOfflinePush specifies if the message should not trigger offline push notifications. NotOfflinePush bool `json:"notOfflinePush"` // SendTime is a timestamp indicating when the message was sent. SendTime int64 `json:"sendTime"` // OfflinePushInfo contains information for offline push notifications. OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"` // Ex stores extended fields Ex string `json:"ex"` } // SendMsgReq extends SendMsg with the requirement of RecvID when SessionType indicates a one-on-one or notification chat. type SendMsgReq struct { // RecvID uniquely identifies the receiver and is required for one-on-one or notification chat types. RecvID string `json:"recvID" binding:"required_if" message:"recvID is required if sessionType is SingleChatType or NotificationChatType"` SendMsg } type GetConversationListReq struct { // userID uniquely identifies the user. UserID string `protobuf:"bytes,1,opt,name=userID,proto3" json:"userID,omitempty" binding:"required"` // ConversationIDs contains a list of unique identifiers for conversations. ConversationIDs []string `protobuf:"bytes,2,rep,name=conversationIDs,proto3" json:"conversationIDs,omitempty"` } type GetConversationListResp struct { // ConversationElems is a map that associates conversation IDs with their respective details. ConversationElems map[string]*ConversationElem `protobuf:"bytes,1,rep,name=conversationElems,proto3" json:"conversationElems,omitempty" protobuf_key:"bytes,1,opt,name=key,proto3" protobuf_val:"bytes,2,opt,name=value,proto3"` } type ConversationElem struct { // MaxSeq represents the maximum sequence number within the conversation. MaxSeq int64 `protobuf:"varint,1,opt,name=maxSeq,proto3" json:"maxSeq,omitempty"` // UnreadSeq represents the number of unread messages in the conversation. UnreadSeq int64 `protobuf:"varint,2,opt,name=unreadSeq,proto3" json:"unreadSeq,omitempty"` // LastSeqTime represents the timestamp of the last sequence in the conversation. LastSeqTime int64 `protobuf:"varint,3,opt,name=LastSeqTime,proto3" json:"LastSeqTime,omitempty"` } // BatchSendMsgReq defines the structure for sending a message to multiple recipients. type BatchSendMsgReq struct { SendMsg // IsSendAll indicates whether the message should be sent to all users. IsSendAll bool `json:"isSendAll"` // RecvIDs is a slice of receiver identifiers to whom the message will be sent, required field. RecvIDs []string `json:"recvIDs" binding:"required"` } // BatchSendMsgResp contains the results of a batch message send operation. type BatchSendMsgResp struct { // Results is a slice of SingleReturnResult, representing the outcome of each message sent. Results []*SingleReturnResult `json:"results"` // FailedIDs is a slice of user IDs for whom the message send failed. FailedIDs []string `json:"failedUserIDs"` } // SendRedPacketReq 发送红包请求 type SendRedPacketReq struct { GroupID string `json:"groupID" binding:"required"` // 群ID RedPacketType int32 `json:"redPacketType" binding:"required"` // 红包类型:1-普通红包,2-拼手气红包 TotalAmount int64 `json:"totalAmount" binding:"required"` // 总金额(分) TotalCount int32 `json:"totalCount" binding:"required"` // 总个数 Blessing string `json:"blessing"` // 祝福语 } // SendRedPacketResp 发送红包响应 type SendRedPacketResp struct { RedPacketID string `json:"redPacketID"` // 红包ID ServerMsgID string `json:"serverMsgID"` // 消息ID ClientMsgID string `json:"clientMsgID"` // 客户端消息ID SendTime int64 `json:"sendTime"` // 发送时间 } // ReceiveRedPacketReq 领取红包请求 type ReceiveRedPacketReq struct { RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID } // ReceiveRedPacketResp 领取红包响应 type ReceiveRedPacketResp struct { RedPacketID string `json:"redPacketID"` // 红包ID Amount int64 `json:"amount"` // 领取金额(分) IsLucky bool `json:"isLucky"` // 是否为手气最佳(仅拼手气红包有效) } // GetRedPacketsByGroupReq 根据群ID查询红包列表请求(群ID为选填,不填则查询所有红包) type GetRedPacketsByGroupReq struct { GroupID string `json:"groupID"` // 群ID(选填,不填则查询所有红包) Pagination Pagination `json:"pagination"` // 分页参数 } // Pagination 分页参数 type Pagination struct { PageNumber int32 `json:"pageNumber"` // 页码,从1开始 ShowNumber int32 `json:"showNumber"` // 每页数量 } // GetRedPacketsByGroupResp 根据群ID查询红包列表响应 type GetRedPacketsByGroupResp struct { Total int64 `json:"total"` // 总数 RedPackets []*RedPacketInfo `json:"redPackets"` // 红包列表 } // RedPacketInfo 红包信息 type RedPacketInfo struct { RedPacketID string `json:"redPacketID"` // 红包ID SendUserID string `json:"sendUserID"` // 发送者ID GroupID string `json:"groupID"` // 群ID GroupName string `json:"groupName"` // 群名称 RedPacketType int32 `json:"redPacketType"` // 红包类型:1-普通红包,2-拼手气红包 TotalAmount int64 `json:"totalAmount"` // 总金额(分) TotalCount int32 `json:"totalCount"` // 总个数 RemainAmount int64 `json:"remainAmount"` // 剩余金额(分) RemainCount int32 `json:"remainCount"` // 剩余个数 Blessing string `json:"blessing"` // 祝福语 Status int32 `json:"status"` // 状态:0-进行中,1-已领完,2-已过期 ExpireTime int64 `json:"expireTime"` // 过期时间戳(毫秒) CreateTime int64 `json:"createTime"` // 创建时间戳(毫秒) } // GetRedPacketReceiveInfoReq 查询红包领取情况请求 type GetRedPacketReceiveInfoReq struct { RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID } // GetRedPacketReceiveInfoResp 查询红包领取情况响应 type GetRedPacketReceiveInfoResp struct { RedPacketID string `json:"redPacketID"` // 红包ID TotalAmount int64 `json:"totalAmount"` // 总金额(分) TotalCount int32 `json:"totalCount"` // 总个数 RemainAmount int64 `json:"remainAmount"` // 剩余金额(分) RemainCount int32 `json:"remainCount"` // 剩余个数 Status int32 `json:"status"` // 状态:0-进行中,1-已领完,2-已过期 Receives []*RedPacketReceiveDetail `json:"receives"` // 领取记录列表 } // RedPacketReceiveDetail 红包领取详情(后台管理接口使用) type RedPacketReceiveDetail struct { ReceiveID string `json:"receiveID"` // 领取记录ID ReceiveUserID string `json:"receiveUserID"` // 领取者ID Amount int64 `json:"amount"` // 领取金额(分) ReceiveTime int64 `json:"receiveTime"` // 领取时间戳(毫秒) IsLucky bool `json:"isLucky"` // 是否为手气最佳(仅拼手气红包有效) } // PauseRedPacketReq 暂停红包请求 type PauseRedPacketReq struct { RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID } // PauseRedPacketResp 暂停红包响应 type PauseRedPacketResp struct { RedPacketID string `json:"redPacketID"` // 红包ID } // GetRedPacketDetailReq 查询红包详情请求(用户端) type GetRedPacketDetailReq struct { RedPacketID string `json:"redPacketID" binding:"required"` // 红包ID(必填) } // GetRedPacketDetailResp 查询红包详情响应(用户端) type GetRedPacketDetailResp struct { RedPacketID string `json:"redPacketID"` // 红包ID GroupID string `json:"groupID"` // 群ID RedPacketType int32 `json:"redPacketType"` // 红包类型:1-普通红包,2-拼手气红包 TotalAmount int64 `json:"totalAmount"` // 总金额(分) TotalCount int32 `json:"totalCount"` // 总个数 RemainAmount int64 `json:"remainAmount"` // 剩余金额(分) RemainCount int32 `json:"remainCount"` // 剩余个数 Blessing string `json:"blessing"` // 祝福语 Status int32 `json:"status"` // 状态:0-进行中,1-已领完,2-已过期 IsExpired bool `json:"isExpired"` // 是否过期(超过一周) MyReceive *RedPacketMyReceiveDetail `json:"myReceive"` // 当前用户的领取信息(如果已领取) Receives []*RedPacketUserReceiveDetail `json:"receives"` // 领取记录列表(仅群主/管理员可见) } // RedPacketMyReceiveDetail 当前用户自己的领取详情(不包含用户ID、昵称、头像) type RedPacketMyReceiveDetail struct { ReceiveID string `json:"receiveID"` // 领取记录ID Amount int64 `json:"amount"` // 领取金额(分) ReceiveTime int64 `json:"receiveTime"` // 领取时间戳(毫秒) IsLucky bool `json:"isLucky"` // 是否为手气最佳(仅拼手气红包有效) } // RedPacketUserReceiveDetail 红包用户领取详情(用户端,包含用户信息) type RedPacketUserReceiveDetail struct { ReceiveID string `json:"receiveID"` // 领取记录ID ReceiveUserID string `json:"receiveUserID"` // 领取者ID Nickname string `json:"nickname"` // 领取者昵称 FaceURL string `json:"faceURL"` // 领取者头像 Amount int64 `json:"amount"` // 领取金额(分) ReceiveTime int64 `json:"receiveTime"` // 领取时间戳(毫秒) IsLucky bool `json:"isLucky"` // 是否为手气最佳(仅拼手气红包有效) } // GetWalletsReq 查询用户钱包列表请求(后台管理接口) type GetWalletsReq struct { UserID string `json:"userID"` // 用户ID(选填,支持通过ID、手机号、账号查询) PhoneNumber string `json:"phoneNumber"` // 手机号(选填,支持通过ID、手机号、账号查询) Account string `json:"account"` // 账号(选填,支持通过ID、手机号、账号查询) Pagination Pagination `json:"pagination"` // 分页参数 } // GetWalletsResp 查询用户钱包列表响应 type GetWalletsResp struct { Total int64 `json:"total"` // 总数 Wallets []*WalletInfo `json:"wallets"` // 钱包列表 } // WalletInfo 钱包信息 type WalletInfo struct { UserID string `json:"userID"` // 用户ID Nickname string `json:"nickname"` // 用户昵称 FaceURL string `json:"faceURL"` // 用户头像 Balance int64 `json:"balance"` // 余额(分) CreateTime int64 `json:"createTime"` // 创建时间戳(毫秒) UpdateTime int64 `json:"updateTime"` // 更新时间戳(毫秒) } // BatchUpdateWalletBalanceReq 批量修改用户余额请求(后台管理接口) type BatchUpdateWalletBalanceReq struct { Users []WalletUserIdentifier `json:"users" binding:"required"` // 用户标识列表(支持用户ID、手机号、账号) Amount int64 `json:"amount"` // 默认金额(分),如果用户没有指定金额则使用此值 Operation string `json:"operation"` // 默认操作类型:set(设置为指定金额)、add(增加金额)、subtract(减少金额),默认为add } // WalletUserIdentifier 钱包用户标识(支持用户ID、手机号、账号) type WalletUserIdentifier struct { UserID FlexibleString `json:"userID"` // 用户ID(选填,支持数字和字符串) PhoneNumber string `json:"phoneNumber"` // 手机号(选填) Account string `json:"account"` // 账号(选填) Amount int64 `json:"amount"` // 金额(分),如果未指定则使用请求中的默认金额 Operation string `json:"operation"` // 操作类型:set(设置为指定金额)、add(增加金额)、subtract(减少金额),如果未指定则使用请求中的默认操作类型 Remark string `json:"remark"` // 备注(选填),每条修改记录对应的备注信息 } // FlexibleString 灵活的字符串类型,可以接受数字和字符串 type FlexibleString string // UnmarshalJSON 自定义JSON反序列化,支持数字和字符串 func (f *FlexibleString) UnmarshalJSON(data []byte) error { // 尝试解析为字符串 var s string if err := json.Unmarshal(data, &s); err == nil { *f = FlexibleString(s) return nil } // 尝试解析为数字 var num json.Number if err := json.Unmarshal(data, &num); err == nil { *f = FlexibleString(num.String()) return nil } // 尝试解析为整数 var i int64 if err := json.Unmarshal(data, &i); err == nil { *f = FlexibleString(strconv.FormatInt(i, 10)) return nil } // 尝试解析为浮点数 var f64 float64 if err := json.Unmarshal(data, &f64); err == nil { *f = FlexibleString(strconv.FormatFloat(f64, 'f', -1, 64)) return nil } return fmt.Errorf("cannot unmarshal %s into FlexibleString", string(data)) } // String 返回字符串值 func (f FlexibleString) String() string { return string(f) } // BatchUpdateWalletBalanceResp 批量修改用户余额响应 type BatchUpdateWalletBalanceResp struct { Total int32 `json:"total"` // 总处理数量 Success int32 `json:"success"` // 成功数量 Failed int32 `json:"failed"` // 失败数量 Results []WalletUpdateResult `json:"results"` // 处理结果列表 } // WalletUpdateResult 钱包更新结果 type WalletUpdateResult struct { UserID string `json:"userID"` // 用户ID PhoneNumber string `json:"phoneNumber"` // 手机号 Account string `json:"account"` // 账号 Success bool `json:"success"` // 是否成功 Message string `json:"message"` // 结果消息 OldBalance int64 `json:"oldBalance"` // 修改前余额 NewBalance int64 `json:"newBalance"` // 修改后余额 Remark string `json:"remark"` // 备注信息 } // SendSingleMsgReq defines the structure for sending a message to multiple recipients. type SendSingleMsgReq struct { // groupMsg should appoint sendID SendID string `json:"sendID"` Content string `json:"content" binding:"required"` OfflinePushInfo *sdkws.OfflinePushInfo `json:"offlinePushInfo"` Ex string `json:"ex"` } type KeyMsgData struct { SendID string `json:"sendID"` RecvID string `json:"recvID"` GroupID string `json:"groupID"` } // SingleReturnResult encapsulates the result of a single message send attempt. type SingleReturnResult struct { // ServerMsgID is the message identifier on the server-side. ServerMsgID string `json:"serverMsgID"` // ClientMsgID is the message identifier on the client-side. ClientMsgID string `json:"clientMsgID"` // SendTime is the timestamp of when the message was sent. SendTime int64 `json:"sendTime"` // RecvID uniquely identifies the receiver of the message. RecvID string `json:"recvID"` // Modify fields modified via webhook. Modify map[string]any `json:"modify,omitempty"` } type SendMsgResp struct { // SendMsgResp original response. *pbmsg.SendMsgResp // Modify fields modified via webhook. Modify map[string]any `json:"modify,omitempty"` } // CreateMeetingReq 创建会议请求 type CreateMeetingReq struct { MeetingID string `json:"meetingID"` // 会议ID(选填,不填则自动生成) Subject string `json:"subject" binding:"required"` // 会议主题(必填) CoverURL string `json:"coverURL"` // 封面URL ScheduledTime int64 `json:"scheduledTime" binding:"required"` // 预约时间戳(毫秒,必填) Description string `json:"description"` // 会议描述 Duration int32 `json:"duration"` // 会议时长(分钟) EstimatedCount int32 `json:"estimatedCount"` // 会议预估人数 EnableMic bool `json:"enableMic"` // 是否开启连麦 EnableComment bool `json:"enableComment"` // 是否开启评论 AnchorUserIDs []string `json:"anchorUserIDs"` // 主播用户ID列表(多选) Password string `json:"password"` // 会议密码(6位数字,选填,不填则自动生成) Ex string `json:"ex"` // 扩展字段 } // CreateMeetingResp 创建会议响应 type CreateMeetingResp struct { MeetingInfo *MeetingInfo `json:"meetingInfo"` // 会议信息 GroupID string `json:"groupID"` // 创建的群聊ID } // UpdateMeetingReq 更新会议请求 type UpdateMeetingReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) Subject string `json:"subject"` // 会议主题 CoverURL string `json:"coverURL"` // 封面URL ScheduledTime int64 `json:"scheduledTime"` // 预约时间戳(毫秒) Status int32 `json:"status"` // 会议状态:1-已预约,2-进行中,3-已结束,4-已取消 Description string `json:"description"` // 会议描述 Duration int32 `json:"duration"` // 会议时长(分钟) EstimatedCount int32 `json:"estimatedCount"` // 会议预估人数 EnableMic *bool `json:"enableMic"` // 是否开启连麦(使用指针以区分是否设置) EnableComment *bool `json:"enableComment"` // 是否开启评论(使用指针以区分是否设置) AnchorUserIDs []string `json:"anchorUserIDs"` // 主播用户ID列表(多选) Password *string `json:"password"` // 会议密码(6位数字,使用指针以区分是否设置) Ex string `json:"ex"` // 扩展字段 } // UpdateMeetingResp 更新会议响应 type UpdateMeetingResp struct { MeetingInfo *MeetingInfo `json:"meetingInfo"` // 会议信息 } // GetMeetingsReq 获取会议列表请求 type GetMeetingsReq struct { CreatorUserID string `json:"creatorUserID"` // 创建者用户ID(选填) Status int32 `json:"status"` // 会议状态(选填):1-已预约,2-进行中,3-已结束,4-已取消 Keyword string `json:"keyword"` // 搜索关键词(选填,搜索主题和描述) StartTime int64 `json:"startTime"` // 开始时间戳(毫秒,选填) EndTime int64 `json:"endTime"` // 结束时间戳(毫秒,选填) Pagination Pagination `json:"pagination"` // 分页参数 } // GetMeetingsResp 获取会议列表响应 type GetMeetingsResp struct { Total int64 `json:"total"` // 总数 Meetings []*MeetingInfo `json:"meetings"` // 会议列表 } // DeleteMeetingReq 删除会议请求 type DeleteMeetingReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) } // DeleteMeetingResp 删除会议响应 type DeleteMeetingResp struct { } // MeetingInfo 会议信息 type MeetingInfo struct { MeetingID string `json:"meetingID"` // 会议ID Subject string `json:"subject"` // 会议主题 CoverURL string `json:"coverURL"` // 封面URL ScheduledTime int64 `json:"scheduledTime"` // 预约时间戳(毫秒) Status int32 `json:"status"` // 会议状态:1-已预约,2-进行中,3-已结束,4-已取消 CreatorUserID string `json:"creatorUserID"` // 创建者用户ID Description string `json:"description"` // 会议描述 Duration int32 `json:"duration"` // 会议时长(分钟) EstimatedCount int32 `json:"estimatedCount"` // 会议预估人数 EnableMic bool `json:"enableMic"` // 是否开启连麦 EnableComment bool `json:"enableComment"` // 是否开启评论 AnchorUserIDs []string `json:"anchorUserIDs"` // 主播用户ID列表(多选) AnchorUsers []*sdkws.UserInfo `json:"anchorUsers"` // 主播用户信息列表 CreateTime int64 `json:"createTime"` // 创建时间戳(毫秒) UpdateTime int64 `json:"updateTime"` // 更新时间戳(毫秒) Ex string `json:"ex"` // 扩展字段 GroupID string `json:"groupID"` // 关联的群聊ID CheckInCount int32 `json:"checkInCount"` // 签到人数统计 Password string `json:"password"` // 会议密码(6位数字) } // GetMeetingReq 获取会议请求(用户端) type GetMeetingReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) } // GetMeetingResp 获取会议响应(用户端) type GetMeetingResp struct { MeetingInfo *MeetingPublicInfo `json:"meetingInfo"` // 会议信息 } // GetMeetingsPublicReq 获取会议列表请求(用户端) type GetMeetingsPublicReq struct { Status int32 `json:"status"` // 会议状态(选填):1-已预约,2-进行中,3-已结束,4-已取消 Keyword string `json:"keyword"` // 搜索关键词(选填,搜索主题和描述) StartTime int64 `json:"startTime"` // 开始时间戳(毫秒,选填) EndTime int64 `json:"endTime"` // 结束时间戳(毫秒,选填) Pagination Pagination `json:"pagination"` // 分页参数 } // GetMeetingsPublicResp 获取会议列表响应(用户端) type GetMeetingsPublicResp struct { Total int64 `json:"total"` // 总数 Meetings []*MeetingPublicInfo `json:"meetings"` // 会议列表 } // MeetingPublicInfo 会议公开信息(用户端,过滤了管理字段) type MeetingPublicInfo struct { MeetingID string `json:"meetingID"` // 会议ID Subject string `json:"subject"` // 会议主题 CoverURL string `json:"coverURL"` // 封面URL ScheduledTime int64 `json:"scheduledTime"` // 预约时间戳(毫秒) Status int32 `json:"status"` // 会议状态:1-已预约,2-进行中,3-已结束,4-已取消 Description string `json:"description"` // 会议描述 Duration int32 `json:"duration"` // 会议时长(分钟) EstimatedCount int32 `json:"estimatedCount"` // 会议预估人数 EnableMic bool `json:"enableMic"` // 是否开启连麦 EnableComment bool `json:"enableComment"` // 是否开启评论 AnchorUsers []*sdkws.UserInfo `json:"anchorUsers"` // 主播用户信息列表 GroupID string `json:"groupID"` // 关联的群聊ID CheckInCount int32 `json:"checkInCount"` // 签到人数统计 Password string `json:"password"` // 会议密码(6位数字) } // CheckInMeetingReq 会议签到请求 type CheckInMeetingReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) } // CheckInMeetingResp 会议签到响应 type CheckInMeetingResp struct { CheckInID string `json:"checkInID"` // 签到ID CheckInTime int64 `json:"checkInTime"` // 签到时间戳(毫秒) } // GetMeetingCheckInsReq 获取会议签到列表请求 type GetMeetingCheckInsReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) Pagination Pagination `json:"pagination"` // 分页参数 } // GetMeetingCheckInsResp 获取会议签到列表响应 type GetMeetingCheckInsResp struct { Total int64 `json:"total"` // 总数 CheckIns []*MeetingCheckInInfo `json:"checkIns"` // 签到列表 } // MeetingCheckInInfo 会议签到信息 type MeetingCheckInInfo struct { CheckInID string `json:"checkInID"` // 签到ID MeetingID string `json:"meetingID"` // 会议ID UserID string `json:"userID"` // 用户ID CheckInTime int64 `json:"checkInTime"` // 签到时间戳(毫秒) UserInfo *sdkws.UserInfo `json:"userInfo"` // 用户信息 } // GetMeetingCheckInStatsReq 获取会议签到统计请求 type GetMeetingCheckInStatsReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) } // GetMeetingCheckInStatsResp 获取会议签到统计响应 type GetMeetingCheckInStatsResp struct { MeetingID string `json:"meetingID"` // 会议ID CheckInCount int64 `json:"checkInCount"` // 签到人数 } // CheckUserCheckInReq 检查用户是否已签到请求 type CheckUserCheckInReq struct { MeetingID string `json:"meetingID" binding:"required"` // 会议ID(必填) } // CheckUserCheckInResp 检查用户是否已签到响应 type CheckUserCheckInResp struct { IsCheckedIn bool `json:"isCheckedIn"` // 是否已签到 CheckInInfo *MeetingCheckInInfo `json:"checkInInfo,omitempty"` // 签到信息(如果已签到) }