package relation
import (
"gorm.io/gorm"
)
var ConversationDB * gorm . DB
//type Conversation struct {
// OwnerUserID string `gorm:"column:owner_user_id;primary_key;type:char(128)" json:"OwnerUserID"`
// ConversationID string `gorm:"column:conversation_id;primary_key;type:char(128)" json:"conversationID"`
// ConversationType int32 `gorm:"column:conversation_type" json:"conversationType"`
// UserID string `gorm:"column:user_id;type:char(64)" json:"userID"`
// GroupID string `gorm:"column:group_id;type:char(128)" json:"groupID"`
// RecvMsgOpt int32 `gorm:"column:recv_msg_opt" json:"recvMsgOpt"`
// UnreadCount int32 `gorm:"column:unread_count" json:"unreadCount"`
// DraftTextTime int64 `gorm:"column:draft_text_time" json:"draftTextTime"`
// IsPinned bool `gorm:"column:is_pinned" json:"isPinned"`
// IsPrivateChat bool `gorm:"column:is_private_chat" json:"isPrivateChat"`
// BurnDuration int32 `gorm:"column:burn_duration;default:30" json:"burnDuration"`
// GroupAtType int32 `gorm:"column:group_at_type" json:"groupAtType"`
// IsNotInGroup bool `gorm:"column:is_not_in_group" json:"isNotInGroup"`
// UpdateUnreadCountTime int64 `gorm:"column:update_unread_count_time" json:"updateUnreadCountTime"`
// AttachedInfo string `gorm:"column:attached_info;type:varchar(1024)" json:"attachedInfo"`
// Ex string `gorm:"column:ex;type:varchar(1024)" json:"ex"`
//}
func ( Conversation ) TableName ( ) string {
return "conversations"
}
func SetConversation ( conversation Conversation ) ( bool , error ) {
var isUpdate bool
newConversation := conversation
if ConversationDB . Model ( & Conversation { } ) . Find ( & newConversation ) . RowsAffected == 0 {
return isUpdate , ConversationDB . Model ( & Conversation { } ) . Create ( & conversation ) . Error
// if exist, then update record
} else {
//force update
isUpdate = true
return isUpdate , ConversationDB . Model ( conversation ) . Where ( "owner_user_id = ? and conversation_id = ?" , conversation . OwnerUserID , conversation . ConversationID ) .
Updates ( map [ string ] interface { } { "recv_msg_opt" : conversation . RecvMsgOpt , "is_pinned" : conversation . IsPinned , "is_private_chat" : conversation . IsPrivateChat ,
"group_at_type" : conversation . GroupAtType , "is_not_in_group" : conversation . IsNotInGroup } ) . Error
}
}
func SetOneConversation ( conversation Conversation ) error {
return ConversationDB . Model ( & Conversation { } ) . Create ( & conversation ) . Error
}
func PeerUserSetConversation ( conversation Conversation ) error {
newConversation := conversation
if ConversationDB . Model ( & Conversation { } ) . Find ( & newConversation ) . RowsAffected == 0 {
return ConversationDB . Model ( & Conversation { } ) . Create ( & conversation ) . Error
// if exist, then update record
}
//force update
return ConversationDB . Model ( conversation ) . Where ( "owner_user_id = ? and conversation_id = ?" , conversation . OwnerUserID , conversation . ConversationID ) .
Updates ( map [ string ] interface { } { "is_private_chat" : conversation . IsPrivateChat } ) . Error
}
func SetRecvMsgOpt ( conversation Conversation ) ( bool , error ) {
var isUpdate bool
newConversation := conversation
if ConversationDB . Model ( & Conversation { } ) . Find ( & newConversation ) . RowsAffected == 0 {
return isUpdate , ConversationDB . Model ( & Conversation { } ) . Create ( & conversation ) . Error
// if exist, then update record
} else {
//force update
isUpdate = true
return isUpdate , ConversationDB . Model ( conversation ) . Where ( "owner_user_id = ? and conversation_id = ?" , conversation . OwnerUserID , conversation . ConversationID ) .
Updates ( map [ string ] interface { } { "recv_msg_opt" : conversation . RecvMsgOpt } ) . Error
}
}
func GetUserAllConversations ( ownerUserID string ) ( [ ] Conversation , error ) {
var conversations [ ] Conversation
err := ConversationDB . Where ( "owner_user_id=?" , ownerUserID ) . Find ( & conversations ) . Error
return conversations , err
}
func GetMultipleUserConversationByConversationID ( ownerUserIDList [ ] string , conversationID string ) ( [ ] Conversation , error ) {
var conversations [ ] Conversation
err := ConversationDB . Where ( "owner_user_id IN ? and conversation_id=?" , ownerUserIDList , conversationID ) . Find ( & conversations ) . Error
return conversations , err
}
func GetExistConversationUserIDList ( ownerUserIDList [ ] string , conversationID string ) ( [ ] string , error ) {
var resultArr [ ] string
err := ConversationDB . Table ( "conversations" ) . Where ( " owner_user_id IN (?) and conversation_id=?" , ownerUserIDList , conversationID ) . Pluck ( "owner_user_id" , & resultArr ) . Error
if err != nil {
return nil , err
}
return resultArr , nil
}
func GetConversation ( OwnerUserID , conversationID string ) ( Conversation , error ) {
var conversation Conversation
err := ConversationDB . Table ( "conversations" ) . Where ( "owner_user_id=? and conversation_id=?" , OwnerUserID , conversationID ) . Take ( & conversation ) . Error
return conversation , err
}
func GetConversations ( OwnerUserID string , conversationIDs [ ] string ) ( [ ] Conversation , error ) {
var conversations [ ] Conversation
err := ConversationDB . Model ( & Conversation { } ) . Where ( "conversation_id IN (?) and owner_user_id=?" , conversationIDs , OwnerUserID ) . Find ( & conversations ) . Error
return conversations , err
}
func GetConversationsByConversationIDMultipleOwner ( OwnerUserIDList [ ] string , conversationID string ) ( [ ] Conversation , error ) {
var conversations [ ] Conversation
err := ConversationDB . Model ( & Conversation { } ) . Where ( "owner_user_id IN (?) and conversation_id=?" , OwnerUserIDList , conversationID ) . Find ( & conversations ) . Error
return conversations , err
}
func UpdateColumnsConversations ( ownerUserIDList [ ] string , conversationID string , args map [ string ] interface { } ) error {
return ConversationDB . Model ( & Conversation { } ) . Where ( "owner_user_id IN (?) and conversation_id=?" , ownerUserIDList , conversationID ) . Updates ( args ) . Error
}
func GetConversationIDListByUserID ( userID string ) ( [ ] string , error ) {
var IDList [ ] string
err := ConversationDB . Model ( & Conversation { } ) . Where ( "owner_user_id=?" , userID ) . Pluck ( "conversation_id" , & IDList ) . Error
return IDList , err
}