2023-01-28 13:19:36 +08:00
package relation
2021-05-26 19:32:30 +08:00
import (
2023-02-16 17:20:08 +08:00
"context"
2023-06-20 17:03:20 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/errs"
"time"
2023-03-23 19:02:20 +08:00
2023-03-16 10:46:06 +08:00
"github.com/OpenIMSDK/Open-IM-Server/pkg/common/db/table/relation"
"github.com/OpenIMSDK/Open-IM-Server/pkg/utils"
2023-01-13 14:35:58 +08:00
"gorm.io/gorm"
2021-05-26 19:32:30 +08:00
)
2023-02-16 17:20:08 +08:00
type UserGorm struct {
2023-03-15 18:35:06 +08:00
* MetaDB
2023-01-13 14:35:58 +08:00
}
2023-03-15 16:29:04 +08:00
func NewUserGorm ( db * gorm . DB ) relation . UserModelInterface {
2023-03-15 18:35:06 +08:00
return & UserGorm { NewMetaDB ( db , & relation . UserModel { } ) }
2021-05-26 19:32:30 +08:00
}
2023-02-16 17:20:08 +08:00
// 插入多条
2023-02-21 12:59:44 +08:00
func ( u * UserGorm ) Create ( ctx context . Context , users [ ] * relation . UserModel ) ( err error ) {
2023-03-15 18:35:06 +08:00
return utils . Wrap ( u . db ( ctx ) . Create ( & users ) . Error , "" )
2022-04-28 10:46:21 +08:00
}
2023-02-16 17:20:08 +08:00
// 更新用户信息 零值
2023-02-21 12:59:44 +08:00
func ( u * UserGorm ) UpdateByMap ( ctx context . Context , userID string , args map [ string ] interface { } ) ( err error ) {
2023-03-15 18:35:06 +08:00
return utils . Wrap ( u . db ( ctx ) . Where ( "user_id = ?" , userID ) . Updates ( args ) . Error , "" )
2021-05-26 19:32:30 +08:00
}
2023-02-16 17:20:08 +08:00
// 更新多个用户信息 非零值
2023-03-16 12:07:21 +08:00
func ( u * UserGorm ) Update ( ctx context . Context , user * relation . UserModel ) ( err error ) {
2023-03-16 12:32:25 +08:00
return utils . Wrap ( u . db ( ctx ) . Model ( user ) . Updates ( user ) . Error , "" )
2022-08-12 18:37:51 +08:00
}
2023-02-16 17:20:08 +08:00
// 获取指定用户信息 不存在,也不返回错误
2023-02-21 12:59:44 +08:00
func ( u * UserGorm ) Find ( ctx context . Context , userIDs [ ] string ) ( users [ ] * relation . UserModel , err error ) {
2023-03-15 18:35:06 +08:00
err = utils . Wrap ( u . db ( ctx ) . Where ( "user_id in (?)" , userIDs ) . Find ( & users ) . Error , "" )
2023-02-16 17:20:08 +08:00
return users , err
2021-05-26 19:32:30 +08:00
}
2021-12-17 14:28:43 +08:00
2023-02-16 17:20:08 +08:00
// 获取某个用户信息 不存在,则返回错误
2023-02-21 12:59:44 +08:00
func ( u * UserGorm ) Take ( ctx context . Context , userID string ) ( user * relation . UserModel , err error ) {
2023-02-16 17:20:08 +08:00
user = & relation . UserModel { }
2023-03-15 18:35:06 +08:00
err = utils . Wrap ( u . db ( ctx ) . Where ( "user_id = ?" , userID ) . Take ( & user ) . Error , "" )
2023-02-16 17:20:08 +08:00
return user , err
2021-12-17 14:28:43 +08:00
}
2021-09-26 14:26:45 +08:00
2023-02-16 17:20:08 +08:00
// 获取用户信息 不存在,不返回错误
2023-02-21 12:59:44 +08:00
func ( u * UserGorm ) Page ( ctx context . Context , pageNumber , showNumber int32 ) ( users [ ] * relation . UserModel , count int64 , err error ) {
2023-03-15 18:35:06 +08:00
err = utils . Wrap ( u . db ( ctx ) . Count ( & count ) . Error , "" )
2022-10-28 15:42:37 +08:00
if err != nil {
2023-02-16 17:20:08 +08:00
return
2022-01-25 19:18:04 +08:00
}
2023-04-21 19:26:07 +08:00
err = utils . Wrap ( u . db ( ctx ) . Limit ( int ( showNumber ) ) . Offset ( int ( ( pageNumber - 1 ) * showNumber ) ) . Find ( & users ) . Order ( "create_time DESC" ) . Error , "" )
2023-02-16 17:20:08 +08:00
return
2022-01-26 18:43:01 +08:00
}
2023-02-16 17:20:08 +08:00
// 获取所有用户ID
2023-03-10 11:42:06 +08:00
func ( u * UserGorm ) GetAllUserID ( ctx context . Context ) ( userIDs [ ] string , err error ) {
2023-03-15 18:35:06 +08:00
err = u . db ( ctx ) . Pluck ( "user_id" , & userIDs ) . Error
2023-03-10 11:42:06 +08:00
return userIDs , err
2022-01-27 01:08:02 +08:00
}
2023-03-23 19:02:20 +08:00
func ( u * UserGorm ) GetUserGlobalRecvMsgOpt ( ctx context . Context , userID string ) ( opt int , err error ) {
err = u . db ( ctx ) . Model ( & relation . UserModel { } ) . Where ( "user_id = ?" , userID ) . Pluck ( "global_recv_msg_opt" , & opt ) . Error
return opt , err
}
2023-06-20 17:03:20 +08:00
func ( u * UserGorm ) CountTotal ( ctx context . Context ) ( count int64 , err error ) {
err = u . db ( ctx ) . Model ( & relation . UserModel { } ) . Count ( & count ) . Error
return count , errs . Wrap ( err )
}
func ( u * UserGorm ) CountRangeEverydayTotal ( ctx context . Context , start time . Time , end time . Time ) ( map [ string ] int64 , error ) {
var res [ ] struct {
Date string ` gorm:"column:date" `
Count int64 ` gorm:"column:count" `
}
err := u . db ( ctx ) . Model ( & relation . UserModel { } ) . Select ( "DATE(create_time) AS date, count(1) AS count" ) . Where ( "create_time >= ? and create_time < ?" , start , end ) . Group ( "date" ) . Find ( & res ) . Error
if err != nil {
return nil , errs . Wrap ( err )
}
v := make ( map [ string ] int64 )
for _ , r := range res {
v [ r . Date ] = r . Count
}
return v , nil
}