package relation
import (
"Open_IM/pkg/common/constant"
"Open_IM/pkg/common/tracelog"
"Open_IM/pkg/utils"
"context"
"fmt"
"gorm.io/gorm"
"time"
)
var GroupMemberDB * gorm . DB
type GroupMember struct {
GroupID string ` gorm:"column:group_id;primary_key;size:64" `
UserID string ` gorm:"column:user_id;primary_key;size:64" `
Nickname string ` gorm:"column:nickname;size:255" `
FaceURL string ` gorm:"column:user_group_face_url;size:255" `
RoleLevel int32 ` gorm:"column:role_level" `
JoinTime time . Time ` gorm:"column:join_time" `
JoinSource int32 ` gorm:"column:join_source" `
InviterUserID string ` gorm:"column:inviter_user_id;size:64" `
OperatorUserID string ` gorm:"column:operator_user_id;size:64" `
MuteEndTime time . Time ` gorm:"column:mute_end_time" `
Ex string ` gorm:"column:ex;size:1024" `
DB * gorm . DB ` gorm:"-" json:"-" `
}
func NewGroupMemberDB ( db * gorm . DB ) * GroupMember {
return & GroupMember { DB : db }
}
func ( g * GroupMember ) Create ( ctx context . Context , groupMemberList [ ] * GroupMember , tx ... * gorm . DB ) ( err error ) {
defer func ( ) {
tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMemberList" , groupMemberList )
} ( )
return utils . Wrap ( getDBConn ( g . DB , tx ) . Create ( & groupMemberList ) . Error , "" )
}
func ( g * GroupMember ) Delete ( ctx context . Context , groupMembers [ ] * GroupMember , tx ... * gorm . DB ) ( err error ) {
defer func ( ) {
tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMembers" , groupMembers )
} ( )
return utils . Wrap ( getDBConn ( g . DB , tx ) . Delete ( groupMembers ) . Error , "" )
}
func ( g * GroupMember ) UpdateByMap ( ctx context . Context , groupID string , userID string , args map [ string ] interface { } , tx ... * gorm . DB ) ( err error ) {
defer func ( ) {
tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupID" , groupID , "userID" , userID , "args" , args )
} ( )
return utils . Wrap ( getDBConn ( g . DB , tx ) . Model ( & GroupMember { } ) . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Updates ( args ) . Error , "" )
}
func ( g * GroupMember ) Update ( ctx context . Context , groupMembers [ ] * GroupMember , tx ... * gorm . DB ) ( err error ) {
defer func ( ) { tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMembers" , groupMembers ) } ( )
return utils . Wrap ( getDBConn ( g . DB , tx ) . Updates ( & groupMembers ) . Error , "" )
}
func ( g * GroupMember ) Find ( ctx context . Context , groupMembers [ ] * GroupMember , tx ... * gorm . DB ) ( groupList [ ] * GroupMember , err error ) {
defer func ( ) {
tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMembers" , groupMembers , "groupList" , groupList )
} ( )
var where [ ] [ ] interface { }
for _ , groupMember := range groupMembers {
where = append ( where , [ ] interface { } { groupMember . GroupID , groupMember . UserID } )
}
return groupList , utils . Wrap ( getDBConn ( g . DB , tx ) . Where ( "(group_id, user_id) in ?" , where ) . Find ( & groupList ) . Error , "" )
}
func ( g * GroupMember ) Take ( ctx context . Context , groupID string , userID string , tx ... * gorm . DB ) ( groupMember * GroupMember , err error ) {
defer func ( ) {
tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupID" , groupID , "userID" , userID , "groupMember" , * groupMember )
} ( )
groupMember = & GroupMember { }
return groupMember , utils . Wrap ( getDBConn ( g . DB , tx ) . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Take ( groupMember ) . Error , "" )
}
func ( g * GroupMember ) TakeOwnerInfo ( ctx context . Context , groupID string , tx ... * gorm . DB ) ( groupMember * GroupMember , err error ) {
defer func ( ) {
tracelog . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupID" , groupID , "groupMember" , * groupMember )
} ( )
groupMember = & GroupMember { }
return groupMember , utils . Wrap ( getDBConn ( g . DB , tx ) . Where ( "group_id = ? and role_level = ?" , groupID , constant . GroupOwner ) . Take ( groupMember ) . Error , "" )
}
func InsertIntoGroupMember ( toInsertInfo GroupMember ) error {
toInsertInfo . JoinTime = time . Now ( )
if toInsertInfo . RoleLevel == 0 {
toInsertInfo . RoleLevel = constant . GroupOrdinaryUsers
}
toInsertInfo . MuteEndTime = time . Unix ( int64 ( time . Now ( ) . Second ( ) ) , 0 )
err := GroupMemberDB . Table ( "group_members" ) . Create ( toInsertInfo ) . Error
if err != nil {
return err
}
return nil
}
func BatchInsertIntoGroupMember ( toInsertInfoList [ ] * GroupMember ) error {
for _ , toInsertInfo := range toInsertInfoList {
toInsertInfo . JoinTime = time . Now ( )
if toInsertInfo . RoleLevel == 0 {
toInsertInfo . RoleLevel = constant . GroupOrdinaryUsers
}
toInsertInfo . MuteEndTime = time . Unix ( int64 ( time . Now ( ) . Second ( ) ) , 0 )
}
return GroupMemberDB . Create ( toInsertInfoList ) . Error
}
func GetGroupMemberListByUserID ( userID string ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
err := GroupMemberDB . Table ( "group_members" ) . Where ( "user_id=?" , userID ) . Find ( & groupMemberList ) . Error
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberListByGroupID ( groupID string ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Find ( & groupMemberList ) . Error
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberIDListByGroupID ( groupID string ) ( [ ] string , error ) {
var groupMemberIDList [ ] string
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Pluck ( "user_id" , & groupMemberIDList ) . Error
if err != nil {
return nil , err
}
return groupMemberIDList , nil
}
func GetGroupMemberListByGroupIDAndRoleLevel ( groupID string , roleLevel int32 ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and role_level=?" , groupID , roleLevel ) . Find ( & groupMemberList ) . Error
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberInfoByGroupIDAndUserID ( groupID , userID string ) ( * GroupMember , error ) {
var groupMember GroupMember
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=? " , groupID , userID ) . Limit ( 1 ) . Take ( & groupMember ) . Error
if err != nil {
return nil , err
}
return & groupMember , nil
}
func DeleteGroupMemberByGroupIDAndUserID ( groupID , userID string ) error {
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=? " , groupID , userID ) . Delete ( GroupMember { } ) . Error
}
func DeleteGroupMemberByGroupID ( groupID string ) error {
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? " , groupID ) . Delete ( GroupMember { } ) . Error
}
func UpdateGroupMemberInfo ( groupMemberInfo GroupMember ) error {
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=?" , groupMemberInfo . GroupID , groupMemberInfo . UserID ) . Updates ( & groupMemberInfo ) . Error
}
func UpdateGroupMemberInfoByMap ( groupMemberInfo GroupMember , m map [ string ] interface { } ) error {
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=?" , groupMemberInfo . GroupID , groupMemberInfo . UserID ) . Updates ( m ) . Error
}
func GetOwnerManagerByGroupID ( groupID string ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and role_level>?" , groupID , constant . GroupOrdinaryUsers ) . Find ( & groupMemberList ) . Error
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberNumByGroupID ( groupID string ) ( int64 , error ) {
var number int64
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Count ( & number ) . Error
if err != nil {
return 0 , utils . Wrap ( err , "" )
}
return number , nil
}
func GetGroupOwnerInfoByGroupID ( groupID string ) ( * GroupMember , error ) {
omList , err := GetOwnerManagerByGroupID ( groupID )
if err != nil {
return nil , err
}
for _ , v := range omList {
if v . RoleLevel == constant . GroupOwner {
return & v , nil
}
}
return nil , utils . Wrap ( constant . ErrGroupNoOwner , "" )
}
func IsExistGroupMember ( groupID , userID string ) bool {
var number int64
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Count ( & number ) . Error
if err != nil {
return false
}
if number != 1 {
return false
}
return true
}
func CheckIsExistGroupMember ( ctx context . Context , groupID , userID string ) error {
var number int64
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Count ( & number ) . Error
if err != nil {
return constant . ErrDB . Wrap ( )
}
if number != 1 {
return constant . ErrData . Wrap ( )
}
return nil
}
func GetGroupMemberByGroupID ( groupID string , filter int32 , begin int32 , maxNumber int32 ) ( [ ] GroupMember , error ) {
var memberList [ ] GroupMember
var err error
if filter >= 0 {
memberList , err = GetGroupMemberListByGroupIDAndRoleLevel ( groupID , filter ) //sorted by join time
} else {
memberList , err = GetGroupMemberListByGroupID ( groupID )
}
if err != nil {
return nil , err
}
if begin >= int32 ( len ( memberList ) ) {
return nil , nil
}
var end int32
if begin + int32 ( maxNumber ) < int32 ( len ( memberList ) ) {
end = begin + maxNumber
} else {
end = int32 ( len ( memberList ) )
}
return memberList [ begin : end ] , nil
}
func GetJoinedGroupIDListByUserID ( userID string ) ( [ ] string , error ) {
memberList , err := GetGroupMemberListByUserID ( userID )
if err != nil {
return nil , err
}
var groupIDList [ ] string
for _ , v := range memberList {
groupIDList = append ( groupIDList , v . GroupID )
}
return groupIDList , nil
}
func IsGroupOwnerAdmin ( groupID , UserID string ) bool {
groupMemberList , err := GetOwnerManagerByGroupID ( groupID )
if err != nil {
return false
}
for _ , v := range groupMemberList {
if v . UserID == UserID && v . RoleLevel > constant . GroupOrdinaryUsers {
return true
}
}
return false
}
func GetGroupMembersByGroupIdCMS ( groupId string , userName string , showNumber , pageNumber int32 ) ( [ ] GroupMember , error ) {
var groupMembers [ ] GroupMember
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupId ) . Where ( fmt . Sprintf ( " nickname like '%%%s%%' " , userName ) ) . Limit ( int ( showNumber ) ) . Offset ( int ( showNumber * ( pageNumber - 1 ) ) ) . Find ( & groupMembers ) . Error
if err != nil {
return nil , err
}
return groupMembers , nil
}
func GetGroupMembersCount ( groupID , userName string ) ( int64 , error ) {
var count int64
if err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Where ( fmt . Sprintf ( " nickname like '%%%s%%' " , userName ) ) . Count ( & count ) . Error ; err != nil {
return count , err
}
return count , nil
}
func UpdateGroupMemberInfoDefaultZero ( groupMemberInfo GroupMember , args map [ string ] interface { } ) error {
return GroupMemberDB . Model ( groupMemberInfo ) . Updates ( args ) . Error
}