2023-01-16 20:14:26 +08:00
package mysql
2023-01-04 21:56:42 +08:00
import (
"Open_IM/pkg/common/constant"
"Open_IM/pkg/common/trace_log"
"Open_IM/pkg/utils"
"context"
"fmt"
2023-01-11 11:15:46 +08:00
"gorm.io/gorm"
2023-01-04 21:56:42 +08:00
"time"
)
2023-01-11 11:15:46 +08:00
var GroupMemberDB * gorm . DB
2023-01-04 21:56:42 +08:00
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" `
2023-01-11 11:15:46 +08:00
DB * gorm . DB
2023-01-04 21:56:42 +08:00
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) Create ( ctx context . Context , groupMemberList [ ] * GroupMember ) ( err error ) {
2023-01-04 21:56:42 +08:00
defer func ( ) {
2023-01-12 15:55:44 +08:00
trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMemberList" , groupMemberList )
2023-01-04 21:56:42 +08:00
} ( )
2023-01-11 16:23:16 +08:00
return utils . Wrap ( GroupMemberDB . Create ( & groupMemberList ) . Error , "" )
2023-01-04 21:56:42 +08:00
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) Delete ( ctx context . Context , groupMembers [ ] * GroupMember ) ( err error ) {
2023-01-04 21:56:42 +08:00
defer func ( ) {
2023-01-12 15:55:44 +08:00
trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMembers" , groupMembers )
2023-01-04 21:56:42 +08:00
} ( )
2023-01-11 16:23:16 +08:00
return utils . Wrap ( GroupMemberDB . Delete ( groupMembers ) . Error , "" )
2023-01-04 21:56:42 +08:00
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) UpdateByMap ( ctx context . Context , groupID string , userID string , args map [ string ] interface { } ) ( err error ) {
2023-01-04 21:56:42 +08:00
defer func ( ) {
2023-01-12 15:55:44 +08:00
trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupID" , groupID , "userID" , userID , "args" , args )
2023-01-04 21:56:42 +08:00
} ( )
2023-01-11 16:23:16 +08:00
return utils . Wrap ( GroupMemberDB . Model ( & GroupMember { } ) . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Updates ( args ) . Error , "" )
2023-01-04 21:56:42 +08:00
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) Update ( ctx context . Context , groupMembers [ ] * GroupMember ) ( err error ) {
2023-01-12 15:55:44 +08:00
defer func ( ) { trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMembers" , groupMembers ) } ( )
2023-01-11 16:23:16 +08:00
return utils . Wrap ( GroupMemberDB . Updates ( & groupMembers ) . Error , "" )
2023-01-04 21:56:42 +08:00
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) Find ( ctx context . Context , groupMembers [ ] * GroupMember ) ( groupList [ ] * GroupMember , err error ) {
2023-01-04 21:56:42 +08:00
defer func ( ) {
2023-01-12 15:55:44 +08:00
trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupMembers" , groupMembers , "groupList" , groupList )
2023-01-04 21:56:42 +08:00
} ( )
var where [ ] [ ] interface { }
for _ , groupMember := range groupMembers {
where = append ( where , [ ] interface { } { groupMember . GroupID , groupMember . UserID } )
}
2023-01-11 16:23:16 +08:00
err = utils . Wrap ( GroupMemberDB . Where ( "(group_id, user_id) in ?" , where ) . Find ( & groupList ) . Error , "" )
2023-01-04 21:56:42 +08:00
return groupList , err
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) Take ( ctx context . Context , groupID string , userID string ) ( groupMember * GroupMember , err error ) {
2023-01-04 21:56:42 +08:00
defer func ( ) {
2023-01-12 15:55:44 +08:00
trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupID" , groupID , "userID" , userID , "groupMember" , * groupMember )
2023-01-04 21:56:42 +08:00
} ( )
groupMember = & GroupMember { }
2023-01-11 16:23:16 +08:00
return groupMember , utils . Wrap ( GroupMemberDB . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Take ( groupMember ) . Error , "" )
2023-01-04 21:56:42 +08:00
}
2023-01-11 11:15:46 +08:00
func ( g * GroupMember ) TakeOwnerInfo ( ctx context . Context , groupID string ) ( groupMember * GroupMember , err error ) {
2023-01-09 14:29:53 +08:00
defer func ( ) {
2023-01-12 15:55:44 +08:00
trace_log . SetCtxDebug ( ctx , utils . GetFuncName ( 1 ) , err , "groupID" , groupID , "groupMember" , * groupMember )
2023-01-09 14:29:53 +08:00
} ( )
groupMember = & GroupMember { }
2023-01-11 16:23:16 +08:00
err = GroupMemberDB . Where ( "group_id = ? and role_level = ?" , groupID , constant . GroupOwner ) . Take ( groupMember ) . Error
2023-01-09 14:29:53 +08:00
return groupMember , utils . Wrap ( err , "" )
}
2023-01-04 21:56:42 +08:00
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 )
2023-01-11 11:15:46 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Create ( toInsertInfo ) . Error
2023-01-04 21:56:42 +08:00
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 )
}
2023-01-11 11:15:46 +08:00
return GroupMemberDB . Create ( toInsertInfoList ) . Error
2023-01-04 21:56:42 +08:00
}
func GetGroupMemberListByUserID ( userID string ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
2023-01-11 11:15:46 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "user_id=?" , userID ) . Find ( & groupMemberList ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberListByGroupID ( groupID string ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
2023-01-11 11:15:46 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Find ( & groupMemberList ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberIDListByGroupID ( groupID string ) ( [ ] string , error ) {
var groupMemberIDList [ ] string
2023-01-11 11:15:46 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Pluck ( "user_id" , & groupMemberIDList ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return groupMemberIDList , nil
}
func GetGroupMemberListByGroupIDAndRoleLevel ( groupID string , roleLevel int32 ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
2023-01-11 11:15:46 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and role_level=?" , groupID , roleLevel ) . Find ( & groupMemberList ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberInfoByGroupIDAndUserID ( groupID , userID string ) ( * GroupMember , error ) {
var groupMember GroupMember
2023-01-11 11:15:46 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=? " , groupID , userID ) . Limit ( 1 ) . Take ( & groupMember ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return & groupMember , nil
}
func DeleteGroupMemberByGroupIDAndUserID ( groupID , userID string ) error {
2023-01-11 11:15:46 +08:00
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=? " , groupID , userID ) . Delete ( GroupMember { } ) . Error
2023-01-04 21:56:42 +08:00
}
func DeleteGroupMemberByGroupID ( groupID string ) error {
2023-01-11 11:15:46 +08:00
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? " , groupID ) . Delete ( GroupMember { } ) . Error
2023-01-04 21:56:42 +08:00
}
func UpdateGroupMemberInfo ( groupMemberInfo GroupMember ) error {
2023-01-11 11:15:46 +08:00
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=?" , groupMemberInfo . GroupID , groupMemberInfo . UserID ) . Updates ( & groupMemberInfo ) . Error
2023-01-04 21:56:42 +08:00
}
func UpdateGroupMemberInfoByMap ( groupMemberInfo GroupMember , m map [ string ] interface { } ) error {
2023-01-11 11:15:46 +08:00
return GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and user_id=?" , groupMemberInfo . GroupID , groupMemberInfo . UserID ) . Updates ( m ) . Error
2023-01-04 21:56:42 +08:00
}
func GetOwnerManagerByGroupID ( groupID string ) ( [ ] GroupMember , error ) {
var groupMemberList [ ] GroupMember
2023-01-11 16:23:16 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=? and role_level>?" , groupID , constant . GroupOrdinaryUsers ) . Find ( & groupMemberList ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return groupMemberList , nil
}
func GetGroupMemberNumByGroupID ( groupID string ) ( int64 , error ) {
var number int64
2023-01-11 16:23:16 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Count ( & number ) . Error
2023-01-04 21:56:42 +08:00
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
}
}
2023-01-11 16:23:16 +08:00
return nil , utils . Wrap ( constant . ErrGroupNoOwner , "" )
2023-01-04 21:56:42 +08:00
}
func IsExistGroupMember ( groupID , userID string ) bool {
var number int64
2023-01-11 16:23:16 +08:00
err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id = ? and user_id = ?" , groupID , userID ) . Count ( & number ) . Error
2023-01-04 21:56:42 +08:00
if err != nil {
return false
}
if number != 1 {
return false
}
return true
}
2023-01-12 18:03:07 +08:00
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
}
2023-01-04 21:56:42 +08:00
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
2023-01-11 16:23:16 +08:00
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
2023-01-04 21:56:42 +08:00
if err != nil {
return nil , err
}
return groupMembers , nil
}
func GetGroupMembersCount ( groupID , userName string ) ( int64 , error ) {
var count int64
2023-01-11 16:23:16 +08:00
if err := GroupMemberDB . Table ( "group_members" ) . Where ( "group_id=?" , groupID ) . Where ( fmt . Sprintf ( " nickname like '%%%s%%' " , userName ) ) . Count ( & count ) . Error ; err != nil {
2023-01-04 21:56:42 +08:00
return count , err
}
return count , nil
}
func UpdateGroupMemberInfoDefaultZero ( groupMemberInfo GroupMember , args map [ string ] interface { } ) error {
2023-01-11 16:23:16 +08:00
return GroupMemberDB . Model ( groupMemberInfo ) . Updates ( args ) . Error
2023-01-04 21:56:42 +08:00
}