2023-07-04 11:15:20 +08:00
// 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.
2023-06-30 11:24:37 +08:00
package tools
import (
"context"
2025-01-10 14:20:43 +08:00
2024-04-19 22:23:08 +08:00
"github.com/openimsdk/open-im-server/v3/pkg/common/config"
2024-04-28 11:47:05 +08:00
kdisc "github.com/openimsdk/open-im-server/v3/pkg/common/discoveryregister"
2024-08-01 16:12:41 +08:00
pbconversation "github.com/openimsdk/protocol/conversation"
2024-04-28 11:47:05 +08:00
"github.com/openimsdk/protocol/msg"
2024-11-29 16:59:24 +08:00
"github.com/openimsdk/protocol/third"
2024-08-01 16:12:41 +08:00
2024-04-28 11:47:05 +08:00
"github.com/openimsdk/tools/mcontext"
"github.com/openimsdk/tools/mw"
"google.golang.org/grpc"
"google.golang.org/grpc/credentials/insecure"
2023-06-30 11:24:37 +08:00
2024-04-19 22:23:08 +08:00
"github.com/openimsdk/tools/errs"
"github.com/openimsdk/tools/log"
2024-03-06 15:58:05 +08:00
"github.com/robfig/cron/v3"
2023-06-30 11:24:37 +08:00
)
2024-04-19 22:23:08 +08:00
type CronTaskConfig struct {
2024-05-14 18:21:36 +08:00
CronTask config . CronTask
Share config . Share
Discovery config . Discovery
2024-04-19 22:23:08 +08:00
}
func Start ( ctx context . Context , config * CronTaskConfig ) error {
2024-07-16 10:46:21 +08:00
log . CInfo ( ctx , "CRON-TASK server is initializing" , "chatRecordsClearTime" , config . CronTask . CronExecuteTime , "msgDestructTime" , config . CronTask . RetainChatRecords )
2024-04-28 11:47:05 +08:00
if config . CronTask . RetainChatRecords < 1 {
return errs . New ( "msg destruct time must be greater than 1" ) . Wrap ( )
2023-11-13 15:21:54 +08:00
}
2025-01-10 14:20:43 +08:00
client , err := kdisc . NewDiscoveryRegister ( & config . Discovery , & config . Share , nil )
2023-06-30 11:24:37 +08:00
if err != nil {
2024-04-28 11:47:05 +08:00
return errs . WrapMsg ( err , "failed to register discovery service" )
2023-07-12 15:31:24 +08:00
}
2024-04-28 11:47:05 +08:00
client . AddOption ( mw . GrpcClient ( ) , grpc . WithTransportCredentials ( insecure . NewCredentials ( ) ) )
ctx = mcontext . SetOpUserID ( ctx , config . Share . IMAdminUserID [ 0 ] )
2024-08-01 16:12:41 +08:00
msgConn , err := client . GetConn ( ctx , config . Share . RpcRegisterName . Msg )
2023-07-19 10:47:28 +08:00
if err != nil {
2024-04-28 11:47:05 +08:00
return err
2023-11-13 15:21:54 +08:00
}
2024-08-01 16:12:41 +08:00
2024-11-29 16:59:24 +08:00
thirdConn , err := client . GetConn ( ctx , config . Share . RpcRegisterName . Third )
if err != nil {
return err
}
2024-08-01 16:12:41 +08:00
conversationConn , err := client . GetConn ( ctx , config . Share . RpcRegisterName . Conversation )
if err != nil {
return err
}
2024-12-20 15:45:37 +08:00
srv := & cronServer {
ctx : ctx ,
config : config ,
cron : cron . New ( ) ,
msgClient : msg . NewMsgClient ( msgConn ) ,
conversationClient : pbconversation . NewConversationClient ( conversationConn ) ,
thirdClient : third . NewThirdClient ( thirdConn ) ,
2024-04-28 11:47:05 +08:00
}
2024-12-03 14:12:47 +08:00
2024-12-20 15:45:37 +08:00
if err := srv . registerClearS3 ( ) ; err != nil {
return err
2024-08-01 16:12:41 +08:00
}
2024-12-20 15:45:37 +08:00
if err := srv . registerDeleteMsg ( ) ; err != nil {
return err
2024-07-16 10:46:21 +08:00
}
2024-12-20 15:45:37 +08:00
if err := srv . registerClearUserMsg ( ) ; err != nil {
return err
}
log . ZDebug ( ctx , "start cron task" , "CronExecuteTime" , config . CronTask . CronExecuteTime )
srv . cron . Start ( )
<- ctx . Done ( )
return nil
}
2024-07-16 10:46:21 +08:00
2024-12-20 15:45:37 +08:00
type cronServer struct {
ctx context . Context
config * CronTaskConfig
cron * cron . Cron
msgClient msg . MsgClient
conversationClient pbconversation . ConversationClient
thirdClient third . ThirdClient
}
2024-11-29 16:59:24 +08:00
2024-12-20 15:45:37 +08:00
func ( c * cronServer ) registerClearS3 ( ) error {
if c . config . CronTask . FileExpireTime <= 0 || len ( c . config . CronTask . DeleteObjectType ) == 0 {
log . ZInfo ( c . ctx , "disable scheduled cleanup of s3" , "fileExpireTime" , c . config . CronTask . FileExpireTime , "deleteObjectType" , c . config . CronTask . DeleteObjectType )
return nil
2024-11-29 16:59:24 +08:00
}
2024-12-20 15:45:37 +08:00
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , c . clearS3 )
return errs . WrapMsg ( err , "failed to register clear s3 cron task" )
}
func ( c * cronServer ) registerDeleteMsg ( ) error {
if c . config . CronTask . RetainChatRecords <= 0 {
log . ZInfo ( c . ctx , "disable scheduled cleanup of chat records" , "retainChatRecords" , c . config . CronTask . RetainChatRecords )
return nil
2024-11-29 16:59:24 +08:00
}
2024-12-20 15:45:37 +08:00
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , c . deleteMsg )
return errs . WrapMsg ( err , "failed to register delete msg cron task" )
}
2024-08-01 16:12:41 +08:00
2024-12-20 15:45:37 +08:00
func ( c * cronServer ) registerClearUserMsg ( ) error {
_ , err := c . cron . AddFunc ( c . config . CronTask . CronExecuteTime , c . clearUserMsg )
return errs . WrapMsg ( err , "failed to register clear user msg cron task" )
2023-11-13 15:21:54 +08:00
}