diff --git a/internal/admin/service.go b/internal/admin/service.go index 2b6e282eff..b857ac59aa 100644 --- a/internal/admin/service.go +++ b/internal/admin/service.go @@ -213,9 +213,6 @@ func (s *Service) CreateUser(username, password, role string) (map[string]interf loginChannel := "password" isSuperuser := role == "admin" - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) - user := &entity.User{ ID: userID, AccessToken: &accessToken, @@ -228,12 +225,6 @@ func (s *Service) CreateUser(username, password, role string) (map[string]interf IsAnonymous: "0", LoginChannel: &loginChannel, IsSuperuser: &isSuperuser, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } // Start transaction for creating user and related data @@ -288,12 +279,6 @@ func (s *Service) CreateUser(username, password, role string) (map[string]interf ParserIDs: parserIDs, Credit: 512, Status: &tenantStatus, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } if err := tx.Create(tenant).Error; err != nil { rollbackTx() @@ -309,12 +294,6 @@ func (s *Service) CreateUser(username, password, role string) (map[string]interf Role: "owner", InvitedBy: userID, Status: &userTenantStatus, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } if err := tx.Create(userTenant).Error; err != nil { rollbackTx() @@ -345,12 +324,6 @@ func (s *Service) CreateUser(username, password, role string) (map[string]interf Type: "folder", Size: 0, Location: &fileLocation, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } if err := tx.Create(file).Error; err != nil { rollbackTx() @@ -470,9 +443,6 @@ func (s *Service) getInitTenantLLM(userID string) ([]*entity.TenantLLM, error) { llmName := llm.LLMName modelType := llm.ModelType - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) - tenantLLM := &entity.TenantLLM{ TenantID: userID, LLMFactory: factoryConfig.Factory, @@ -482,12 +452,6 @@ func (s *Service) getInitTenantLLM(userID string) ([]*entity.TenantLLM, error) { APIBase: &apiBase, MaxTokens: maxTokens, Status: "1", - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } tenantLLMs = append(tenantLLMs, tenantLLM) } @@ -768,8 +732,6 @@ func (s *Service) ChangePassword(username, newPassword string) error { } user.Password = &hashedPassword - now := time.Now().Unix() - user.UpdateTime = &now if err := s.userDAO.Update(user); err != nil { return fmt.Errorf("failed to update user: %w", err) @@ -807,8 +769,6 @@ func (s *Service) UpdateUserActivateStatus(username string, isActive bool) error } user.IsActive = targetStatus - now := time.Now().Unix() - user.UpdateTime = &now if err := s.userDAO.Update(user); err != nil { return fmt.Errorf("failed to update user: %w", err) @@ -841,8 +801,6 @@ func (s *Service) GrantAdmin(username string) error { isSuperuser := true user.IsSuperuser = &isSuperuser - now := time.Now().Unix() - user.UpdateTime = &now if err := s.userDAO.Update(user); err != nil { return fmt.Errorf("failed to update user: %w", err) @@ -875,8 +833,6 @@ func (s *Service) RevokeAdmin(username string) error { isSuperuser := false user.IsSuperuser = &isSuperuser - now := time.Now().Unix() - user.UpdateTime = &now if err := s.userDAO.Update(user); err != nil { return fmt.Errorf("failed to update user: %w", err) @@ -959,16 +915,12 @@ func (s *Service) GenerateUserAPIToken(username string) (map[string]interface{}, // 3. Generate API token key := utility.GenerateAPIToken() beta := utility.GenerateBetaAPIToken(key) - now := time.Now() - nowUnix := now.Unix() apiToken := &entity.APIToken{ TenantID: tenantID, Token: key, Beta: &beta, } - apiToken.CreateTime = &nowUnix - apiToken.CreateDate = &now // 4. Save API token if err := s.apiTokenDAO.Create(apiToken); err != nil { @@ -1730,8 +1682,6 @@ func (s *Service) InitDefaultAdmin() error { } if len(users) == 0 { - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) userID := utility.GenerateToken() accessToken := utility.GenerateToken() status := "1" @@ -1758,12 +1708,6 @@ func (s *Service) InitDefaultAdmin() error { IsAnonymous: "0", LoginChannel: &loginChannel, IsSuperuser: &isSuperuser, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } if err := dao.DB.Create(user).Error; err != nil { @@ -1806,8 +1750,6 @@ func (s *Service) InitDefaultAdmin() error { // addTenantForAdmin add tenant for admin user func (s *Service) addTenantForAdmin(userID, nickname string) error { - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) status := "1" role := "owner" tenantName := nickname + "'s Kingdom" @@ -1815,12 +1757,6 @@ func (s *Service) addTenantForAdmin(userID, nickname string) error { tenant := &entity.Tenant{ ID: userID, Name: &tenantName, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } if err := dao.DB.Create(tenant).Error; err != nil { @@ -1833,12 +1769,6 @@ func (s *Service) addTenantForAdmin(userID, nickname string) error { InvitedBy: userID, Role: role, Status: &status, - BaseModel: entity.BaseModel{ - CreateTime: &now, - CreateDate: &nowDate, - UpdateTime: &now, - UpdateDate: &nowDate, - }, } return dao.DB.Create(userTenant).Error diff --git a/internal/dao/kb.go b/internal/dao/kb.go index 0da2558e67..e025b5e7ce 100644 --- a/internal/dao/kb.go +++ b/internal/dao/kb.go @@ -22,7 +22,6 @@ import ( "strconv" "strings" - "time" ) // KnowledgebaseDAO knowledge base data access object @@ -314,30 +313,22 @@ func splitNameCounter(name string) (string, int) { // AtomicIncreaseDocNumByID atomically increments the document count // This matches the Python atomic_increase_doc_num_by_id method func (dao *KnowledgebaseDAO) AtomicIncreaseDocNumByID(kbID string) error { - now := time.Now().Truncate(time.Second) - updateTime := now.UnixMilli() return DB.Model(&entity.Knowledgebase{}). Where("id = ?", kbID). Updates(map[string]interface{}{ "doc_num": DB.Raw("doc_num + 1"), - "update_time": updateTime, - "update_date": now, }).Error } // DecreaseDocumentNum decreases document, chunk, and token counts // This matches the Python decrease_document_num_in_delete method func (dao *KnowledgebaseDAO) DecreaseDocumentNum(kbID string, docNum, chunkNum, tokenNum int64) error { - now := time.Now().Truncate(time.Second) - updateTime := now.UnixMilli() return DB.Model(&entity.Knowledgebase{}). Where("id = ?", kbID). Updates(map[string]interface{}{ "doc_num": DB.Raw("doc_num - ?", docNum), "chunk_num": DB.Raw("chunk_num - ?", chunkNum), "token_num": DB.Raw("token_num - ?", tokenNum), - "update_time": updateTime, - "update_date": now, }).Error } diff --git a/internal/dao/migration.go b/internal/dao/migration.go index ca5bd3d06b..23052f6647 100644 --- a/internal/dao/migration.go +++ b/internal/dao/migration.go @@ -345,7 +345,9 @@ func migrateSkillSearchTables(db *gorm.DB) error { index_version VARCHAR(32) DEFAULT '1.0.0', status VARCHAR(1) DEFAULT '1', create_time BIGINT, - update_time DATETIME, + create_date DATETIME, + update_time BIGINT, + update_date DATETIME, INDEX idx_tenant_id (tenant_id), INDEX idx_space_id (space_id), UNIQUE INDEX idx_tenant_space_embd (tenant_id, space_id, embd_id) @@ -367,6 +369,15 @@ func migrateSkillSearchTables(db *gorm.DB) error { if err := addColumnIfNotExists(db, "skill_search_configs", "space_id", "VARCHAR(128) NOT NULL DEFAULT 'default'"); err != nil { return fmt.Errorf("failed to add space_id column to skill_search_configs: %w", err) } + if err := addColumnIfNotExists(db, "skill_search_configs", "create_date", "DATETIME"); err != nil { + return fmt.Errorf("failed to add create_date column to skill_search_configs: %w", err) + } + if err := addColumnIfNotExists(db, "skill_search_configs", "update_date", "DATETIME"); err != nil { + return fmt.Errorf("failed to add update_date column to skill_search_configs: %w", err) + } + if err := db.Exec(`ALTER TABLE skill_search_configs MODIFY COLUMN update_time BIGINT`).Error; err != nil { + common.Warn("Failed to modify skill_search_configs.update_time", zap.Error(err)) + } // Drop legacy unique index (tenant_id, embd_id) to allow per-space configs. var legacyIndexExists int64 @@ -411,7 +422,9 @@ func migrateSkillSpaceTables(db *gorm.DB) error { top_k INT DEFAULT 10, status VARCHAR(1) DEFAULT '1', create_time BIGINT, - update_time DATETIME, + create_date DATETIME, + update_time BIGINT, + update_date DATETIME, INDEX idx_tenant_id (tenant_id), UNIQUE INDEX idx_tenant_name_status (tenant_id, name, status) ) @@ -433,6 +446,15 @@ func migrateSkillSpaceTables(db *gorm.DB) error { if err := addColumnIfNotExists(db, "skill_spaces", "status", "VARCHAR(1) NOT NULL DEFAULT '1'"); err != nil { return fmt.Errorf("failed to add status column to skill_spaces: %w", err) } + if err := addColumnIfNotExists(db, "skill_spaces", "create_date", "DATETIME"); err != nil { + return fmt.Errorf("failed to add create_date column to skill_spaces: %w", err) + } + if err := addColumnIfNotExists(db, "skill_spaces", "update_date", "DATETIME"); err != nil { + return fmt.Errorf("failed to add update_date column to skill_spaces: %w", err) + } + if err := db.Exec(`ALTER TABLE skill_spaces MODIFY COLUMN update_time BIGINT`).Error; err != nil { + common.Warn("Failed to modify skill_spaces.update_time", zap.Error(err)) + } // Migrate index after status column exists if err := migrateSkillSpaceIndex(db); err != nil { return fmt.Errorf("failed to migrate skill_space index: %w", err) diff --git a/internal/dao/skill_search_config.go b/internal/dao/skill_search_config.go index 6c19964bc2..16c01d56ef 100644 --- a/internal/dao/skill_search_config.go +++ b/internal/dao/skill_search_config.go @@ -19,7 +19,6 @@ package dao import ( "ragflow/internal/entity" "strings" - "time" "github.com/google/uuid" ) @@ -109,7 +108,6 @@ func (dao *SkillSearchConfigDAO) GetOrCreate(tenantID, spaceID, embdID string) ( // CreateWithTenantSpace creates a new config for tenant+space func (dao *SkillSearchConfigDAO) CreateWithTenantSpace(tenantID, spaceID, embdID string) (*entity.SkillSearchConfig, error) { spaceID = normalizeSpaceID(spaceID) - timestamp := time.Now().UnixMilli() defaultFieldConfig := entity.DefaultFieldConfig() fieldConfigMap := entity.JSONMap{ "name": map[string]interface{}{ @@ -140,7 +138,6 @@ func (dao *SkillSearchConfigDAO) CreateWithTenantSpace(tenantID, spaceID, embdID FieldConfig: fieldConfigMap, TopK: 10, Status: "1", - CreateTime: ×tamp, } if err := dao.Create(defaultConfig); err != nil { @@ -167,20 +164,17 @@ func (dao *SkillSearchConfigDAO) DeleteAllByTenantSpaceExceptID(tenantID, spaceI // Update updates a skill search config with the given updates map func (dao *SkillSearchConfigDAO) Update(id string, updates map[string]interface{}) error { - updates["update_time"] = time.Now() return DB.Model(&entity.SkillSearchConfig{}).Where("id = ? AND status = ?", id, "1").Updates(updates).Error } // UpdateByTenantID updates config by tenant ID func (dao *SkillSearchConfigDAO) UpdateByTenantID(tenantID, spaceID string, updates map[string]interface{}) error { - updates["update_time"] = time.Now() result := DB.Model(&entity.SkillSearchConfig{}).Where("tenant_id = ? AND space_id = ? AND status = ?", tenantID, normalizeSpaceID(spaceID), "1").Updates(updates) return result.Error } // UpdateByTenantAndEmbdID updates config by tenant ID and embedding ID func (dao *SkillSearchConfigDAO) UpdateByTenantAndEmbdID(tenantID, spaceID, embdID string, updates map[string]interface{}) error { - updates["update_time"] = time.Now() result := DB.Model(&entity.SkillSearchConfig{}).Where("tenant_id = ? AND space_id = ? AND embd_id = ? AND status = ?", tenantID, normalizeSpaceID(spaceID), embdID, "1").Updates(updates) return result.Error } diff --git a/internal/dao/skill_space.go b/internal/dao/skill_space.go index 2c0596f8a3..c8557521fe 100644 --- a/internal/dao/skill_space.go +++ b/internal/dao/skill_space.go @@ -19,7 +19,6 @@ package dao import ( "ragflow/internal/entity" "strings" - "time" "github.com/google/uuid" ) @@ -101,7 +100,6 @@ func (dao *SkillSpaceDAO) Update(space *entity.SkillSpace) error { // UpdateByID updates skills space by ID func (dao *SkillSpaceDAO) UpdateByID(id string, updates map[string]interface{}) error { - updates["update_time"] = time.Now() return DB.Model(&entity.SkillSpace{}).Where("id = ?", id).Updates(updates).Error } diff --git a/internal/dao/system_settings.go b/internal/dao/system_settings.go index 2e200ac049..c224ad0fcd 100644 --- a/internal/dao/system_settings.go +++ b/internal/dao/system_settings.go @@ -19,7 +19,6 @@ package dao import ( "errors" "ragflow/internal/entity" - "time" "gorm.io/gorm" ) @@ -57,31 +56,18 @@ func (d *SystemSettingsDAO) GetByName(name string) ([]entity.SystemSettings, err // UpdateByName update system settings by name // Updates the setting with the given name using the provided data func (d *SystemSettingsDAO) UpdateByName(name string, setting *entity.SystemSettings) error { - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) - return DB.Model(&entity.SystemSettings{}). Where("name = ?", name). Updates(map[string]interface{}{ - "value": setting.Value, - "source": setting.Source, - "data_type": setting.DataType, - "update_time": now, - "update_date": nowDate, + "value": setting.Value, + "source": setting.Source, + "data_type": setting.DataType, }).Error } // Create create a new system setting // Inserts a new system setting record into database func (d *SystemSettingsDAO) Create(setting *entity.SystemSettings) error { - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) - - setting.CreateTime = &now - setting.CreateDate = &nowDate - setting.UpdateTime = &now - setting.UpdateDate = &nowDate - return DB.Create(setting).Error } @@ -96,6 +82,8 @@ func (d *SystemSettingsDAO) SaveOrCreate(name string, value string, source strin if len(settings) == 1 { setting := &settings[0] setting.Value = value + setting.Source = source + setting.DataType = dataType return d.UpdateByName(name, setting) } else if len(settings) > 1 { return errors.New("can't update more than 1 setting: " + name) @@ -159,29 +147,16 @@ func (d *SystemSettingsDAO) Transaction(fn func(tx *gorm.DB) error) error { // CreateWithTx create setting within transaction func (d *SystemSettingsDAO) CreateWithTx(tx *gorm.DB, setting *entity.SystemSettings) error { - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) - - setting.CreateTime = &now - setting.CreateDate = &nowDate - setting.UpdateTime = &now - setting.UpdateDate = &nowDate - return tx.Create(setting).Error } // UpdateByNameWithTx update setting within transaction func (d *SystemSettingsDAO) UpdateByNameWithTx(tx *gorm.DB, name string, setting *entity.SystemSettings) error { - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) - return tx.Model(&entity.SystemSettings{}). Where("name = ?", name). Updates(map[string]interface{}{ - "value": setting.Value, - "source": setting.Source, - "data_type": setting.DataType, - "update_time": now, - "update_date": nowDate, + "value": setting.Value, + "source": setting.Source, + "data_type": setting.DataType, }).Error } diff --git a/internal/entity/base.go b/internal/entity/base.go index 748fea8713..774be466f3 100644 --- a/internal/entity/base.go +++ b/internal/entity/base.go @@ -20,6 +20,8 @@ import ( "database/sql/driver" "encoding/json" "time" + + "gorm.io/gorm" ) // BaseModel base model @@ -31,6 +33,92 @@ type BaseModel struct { UpdateDate *time.Time `gorm:"column:update_date;index" json:"update_date,omitempty"` } +func autoModelTime() (int64, time.Time) { + now := time.Now().Local() + return now.UnixMilli(), now.Truncate(time.Second) +} + +func statementHasTimeField(tx *gorm.DB, fieldNames ...string) bool { + if tx == nil || tx.Statement == nil { + return false + } + + switch dest := tx.Statement.Dest.(type) { + case map[string]interface{}: + for _, fieldName := range fieldNames { + if _, ok := dest[fieldName]; ok { + return true + } + } + case []map[string]interface{}: + for _, item := range dest { + for _, fieldName := range fieldNames { + if _, ok := item[fieldName]; ok { + return true + } + } + } + } + + return false +} + +// BeforeCreate injects timestamps for models embedding BaseModel. +func (m *BaseModel) BeforeCreate(tx *gorm.DB) error { + timestamp, dateTime := autoModelTime() + + if m.CreateTime == nil { + m.CreateTime = ×tamp + } + if m.CreateDate == nil { + m.CreateDate = &dateTime + } + if m.UpdateTime == nil { + m.UpdateTime = ×tamp + } + if m.UpdateDate == nil { + m.UpdateDate = &dateTime + } + + if tx != nil && tx.Statement != nil { + if !statementHasTimeField(tx, "create_time", "CreateTime") && m.CreateTime != nil { + tx.Statement.SetColumn("CreateTime", *m.CreateTime) + } + if !statementHasTimeField(tx, "create_date", "CreateDate") && m.CreateDate != nil { + tx.Statement.SetColumn("CreateDate", *m.CreateDate) + } + if !statementHasTimeField(tx, "update_time", "UpdateTime") && m.UpdateTime != nil { + tx.Statement.SetColumn("UpdateTime", *m.UpdateTime) + } + if !statementHasTimeField(tx, "update_date", "UpdateDate") && m.UpdateDate != nil { + tx.Statement.SetColumn("UpdateDate", *m.UpdateDate) + } + } + return nil +} + +// BeforeUpdate injects update timestamps for models embedding BaseModel. +func (m *BaseModel) BeforeUpdate(tx *gorm.DB) error { + timestamp, dateTime := autoModelTime() + + if !statementHasTimeField(tx, "update_time", "UpdateTime") { + m.UpdateTime = ×tamp + } + if !statementHasTimeField(tx, "update_date", "UpdateDate") { + m.UpdateDate = &dateTime + } + + if tx != nil && tx.Statement != nil { + if !statementHasTimeField(tx, "update_time", "UpdateTime") && m.UpdateTime != nil { + tx.Statement.SetColumn("UpdateTime", *m.UpdateTime) + } + if !statementHasTimeField(tx, "update_date", "UpdateDate") && m.UpdateDate != nil { + tx.Statement.SetColumn("UpdateDate", *m.UpdateDate) + } + } + return nil +} + // JSONMap is a map type that can store JSON data type JSONMap map[string]interface{} diff --git a/internal/entity/skill_search.go b/internal/entity/skill_search.go index 3a31dfb486..011499bbcb 100644 --- a/internal/entity/skill_search.go +++ b/internal/entity/skill_search.go @@ -56,8 +56,7 @@ type SkillSearchConfig struct { TenantRerankID *int64 `gorm:"column:tenant_rerank_id" json:"tenant_rerank_id,omitempty"` TopK int64 `gorm:"column:top_k;default:10" json:"top_k"` IndexVersion string `gorm:"column:index_version;size:32;default:'1.0.0'" json:"index_version"` - CreateTime *int64 `gorm:"column:create_time" json:"create_time,omitempty"` - UpdateTime *time.Time `gorm:"column:update_time" json:"update_time,omitempty"` + BaseModel } // TableName returns the table name for SkillSearchConfig model @@ -90,7 +89,7 @@ func (s *SkillSearchConfig) ToMap() map[string]interface{} { result["create_time"] = s.CreateTime } if s.UpdateTime != nil { - result["update_time"] = s.UpdateTime.Format("2006-01-02 15:04:05") + result["update_time"] = time.UnixMilli(*s.UpdateTime).Format("2006-01-02 15:04:05") } return result diff --git a/internal/entity/skill_space.go b/internal/entity/skill_space.go index 0e90a39817..1df53a9197 100644 --- a/internal/entity/skill_space.go +++ b/internal/entity/skill_space.go @@ -36,8 +36,7 @@ type SkillSpace struct { RerankID string `gorm:"column:rerank_id;size:128" json:"rerank_id"` TopK int `gorm:"column:top_k;default:10" json:"top_k"` Status string `gorm:"column:status;size:1;default:1" json:"status"` - CreateTime *int64 `gorm:"column:create_time" json:"create_time,omitempty"` - UpdateTime *time.Time `gorm:"column:update_time" json:"update_time,omitempty"` + BaseModel } // TableName returns the table name for SkillSpace model @@ -83,7 +82,7 @@ func (s *SkillSpace) ToMap() map[string]interface{} { result["create_time"] = s.CreateTime } if s.UpdateTime != nil { - result["update_time"] = s.UpdateTime.Format("2006-01-02 15:04:05") + result["update_time"] = time.UnixMilli(*s.UpdateTime).Format("2006-01-02 15:04:05") } return result diff --git a/internal/entity/system.go b/internal/entity/system.go index 831bb7397f..49541ec3ef 100644 --- a/internal/entity/system.go +++ b/internal/entity/system.go @@ -16,18 +16,13 @@ package entity -import "time" - // SystemSettings system settings model type SystemSettings struct { - Name string `gorm:"column:name;primaryKey;size:128" json:"name"` - Source string `gorm:"column:source;size:32;not null" json:"source"` - DataType string `gorm:"column:data_type;size:32;not null" json:"data_type"` - Value string `gorm:"column:value;type:longtext;not null" json:"value"` - CreateTime *int64 `gorm:"column:create_time" json:"create_time"` - CreateDate *time.Time `gorm:"column:create_date" json:"create_date"` - UpdateTime *int64 `gorm:"column:update_time" json:"update_time"` - UpdateDate *time.Time `gorm:"column:update_date" json:"update_date"` + Name string `gorm:"column:name;primaryKey;size:128" json:"name"` + Source string `gorm:"column:source;size:32;not null" json:"source"` + DataType string `gorm:"column:data_type;size:32;not null" json:"data_type"` + Value string `gorm:"column:value;type:longtext;not null" json:"value"` + BaseModel } // TableName specify table name diff --git a/internal/service/api_token.go b/internal/service/api_token.go index 9f44d74019..667610ae1e 100644 --- a/internal/service/api_token.go +++ b/internal/service/api_token.go @@ -20,7 +20,6 @@ import ( "ragflow/internal/dao" "ragflow/internal/entity" "ragflow/internal/utility" - "time" ) // TokenResponse token response @@ -67,9 +66,6 @@ type CreateAPITokenRequest struct { func (s *SystemService) CreateAPIToken(tenantID string, req *CreateAPITokenRequest) (*TokenResponse, error) { APITokenDAO := dao.NewAPITokenDAO() - now := time.Now().Unix() - nowDate := time.Now() - // Generate token and beta values // token: "ragflow-" + secrets.token_urlsafe(32) APIToken := utility.GenerateAPIToken() @@ -81,8 +77,6 @@ func (s *SystemService) CreateAPIToken(tenantID string, req *CreateAPITokenReque Token: APIToken, Beta: &betaAPIKey, } - APITokenData.CreateDate = &nowDate - APITokenData.CreateTime = &now if err := APITokenDAO.Create(APITokenData); err != nil { return nil, err diff --git a/internal/service/chat.go b/internal/service/chat.go index f386d72799..060bd3cc56 100644 --- a/internal/service/chat.go +++ b/internal/service/chat.go @@ -21,7 +21,6 @@ import ( "fmt" "ragflow/internal/entity" "strings" - "time" "unicode/utf8" "github.com/google/uuid" @@ -453,10 +452,6 @@ func (s *ChatService) SetDialog(userID string, req *SetDialogRequest) (*SetDialo newID = newID[:32] } - // Get current time - now := time.Now().Truncate(time.Second) - createTime := now.UnixMilli() - // Set default language language := "English" @@ -480,10 +475,6 @@ func (s *ChatService) SetDialog(userID string, req *SetDialogRequest) (*SetDialo KBIDs: kbIDsJSON, Status: strPtr("1"), } - chat.CreateTime = &createTime - chat.CreateDate = &now - chat.UpdateTime = &createTime - chat.UpdateDate = &now if err := s.chatDAO.Create(chat); err != nil { return nil, errors.New("Fail to new a chat") @@ -498,9 +489,6 @@ func (s *ChatService) SetDialog(userID string, req *SetDialogRequest) (*SetDialo }, nil } - // Update existing chat - also update update_time - now := time.Now().Truncate(time.Second) - updateTime := now.UnixMilli() updateData := map[string]interface{}{ "name": name, "description": description, @@ -515,8 +503,6 @@ func (s *ChatService) SetDialog(userID string, req *SetDialogRequest) (*SetDialo "similarity_threshold": similarityThreshold, "vector_similarity_weight": vectorSimilarityWeight, "kb_ids": kbIDsJSON, - "update_time": updateTime, - "update_date": now, } if err := s.chatDAO.UpdateByID(req.DialogID, updateData); err != nil { diff --git a/internal/service/chat_session.go b/internal/service/chat_session.go index 206b6e76b4..50402f9d7c 100644 --- a/internal/service/chat_session.go +++ b/internal/service/chat_session.go @@ -79,8 +79,6 @@ func (s *ChatSessionService) SetChatSession(userID string, req *SetChatSessionRe updates := map[string]interface{}{ "name": name, "user_id": userID, - "update_time": time.Now().UnixMilli(), - "update_date": time.Now(), } if err := s.chatSessionDAO.UpdateByID(req.SessionID, updates); err != nil { @@ -118,9 +116,6 @@ func (s *ChatSessionService) SetChatSession(userID string, req *SetChatSessionRe } } - now := time.Now().Truncate(time.Second) - createTime := time.Now().UnixMilli() - // Create initial message - store as JSON object with messages array messagesObj := map[string]interface{}{ "messages": []map[string]interface{}{ @@ -144,10 +139,6 @@ func (s *ChatSessionService) SetChatSession(userID string, req *SetChatSessionRe UserID: &userID, Reference: referenceJSON, } - session.CreateTime = &createTime - session.CreateDate = &now - session.UpdateTime = &createTime - session.UpdateDate = &now if err := s.chatSessionDAO.Create(session); err != nil { return nil, errors.New("Fail to create a chat session") @@ -459,8 +450,6 @@ func (s *ChatSessionService) updateSessionMessages(session *entity.ChatSession, updates := map[string]interface{}{ "message": messagesJSON, "reference": referenceJSON, - "update_time": time.Now().UnixMilli(), - "update_date": time.Now(), } s.chatSessionDAO.UpdateByID(session.ID, updates) } diff --git a/internal/service/datasets.go b/internal/service/datasets.go index db1320e6eb..c163f891e4 100644 --- a/internal/service/datasets.go +++ b/internal/service/datasets.go @@ -22,7 +22,6 @@ import ( "fmt" "ragflow/internal/entity" "strings" - "time" "github.com/google/uuid" "gorm.io/gorm" @@ -396,8 +395,6 @@ func (s *DatasetsService) CreateDataset(req *CreateDatasetRequest, tenantID stri return nil, common.CodeServerError, errors.New("Internal server error") } - now := time.Now().Truncate(time.Second) - createTime := now.UnixMilli() status := string(entity.StatusValid) // Deduplicate name within tenant duplicateName, err := common.DuplicateName(func(n, tid string) bool { @@ -420,10 +417,6 @@ func (s *DatasetsService) CreateDataset(req *CreateDatasetRequest, tenantID stri EmbdID: embdID, Status: &status, } - kb.CreateTime = &createTime - kb.UpdateTime = &createTime - kb.CreateDate = &now - kb.UpdateDate = &now if description != nil { kb.Description = description diff --git a/internal/service/document.go b/internal/service/document.go index 9c1fa0a291..d625bef484 100644 --- a/internal/service/document.go +++ b/internal/service/document.go @@ -223,7 +223,12 @@ func (s *DocumentService) toResponse(doc *entity.Document) *DocumentResponse { } updatedAt := "" if doc.UpdateTime != nil { - updatedAt = time.Unix(*doc.UpdateTime, 0).Format("2006-01-02 15:04:05") + // Accept both historical second-based values and current millisecond-based values. + ts := *doc.UpdateTime + if ts > 1000000000000 { + ts /= 1000 + } + updatedAt = time.Unix(ts, 0).Format("2006-01-02 15:04:05") } return &DocumentResponse{ ID: doc.ID, diff --git a/internal/service/kb.go b/internal/service/kb.go index 75916413b6..9777699258 100644 --- a/internal/service/kb.go +++ b/internal/service/kb.go @@ -27,7 +27,6 @@ import ( "ragflow/internal/utility" "strings" - "time" ) // KnowledgebaseService service class for managing dataset operations @@ -213,11 +212,6 @@ func (s *KnowledgebaseService) UpdateKB(req *UpdateKBRequest, userID string) (ma updates["parser_config"] = req.ParserConfig } - now := time.Now().Truncate(time.Second) - updateTime := now.UnixMilli() - updates["update_time"] = updateTime - updates["update_date"] = now - // Update in database if err := s.kbDAO.UpdateByID(req.KBID, updates); err != nil { return nil, common.CodeServerError, fmt.Errorf("failed to update knowledge base: %w", err) diff --git a/internal/service/memory.go b/internal/service/memory.go index 2ab7272b08..882282f4cc 100644 --- a/internal/service/memory.go +++ b/internal/service/memory.go @@ -370,8 +370,6 @@ func (s *MemoryService) CreateMemory(tenantID string, req *CreateMemoryRequest) } memoryTypeInt := dao.CalculateMemoryType(uniqueMemoryTypes) - timestamp := time.Now().UnixMilli() - systemPrompt := PromptAssembler{}.AssembleSystemPrompt(uniqueMemoryTypes) newID := common.GenerateUUID() @@ -402,9 +400,6 @@ func (s *MemoryService) CreateMemory(tenantID string, req *CreateMemoryRequest) memory.TenantLLMID = &llmID } } - memory.CreateTime = ×tamp - memory.UpdateTime = ×tamp - if err := s.memoryDAO.Create(memory); err != nil { return nil, errors.New("could not create new memory") } diff --git a/internal/service/model_service.go b/internal/service/model_service.go index bd23026d72..f23f962109 100644 --- a/internal/service/model_service.go +++ b/internal/service/model_service.go @@ -25,7 +25,6 @@ import ( "ragflow/internal/entity" modelModule "ragflow/internal/entity/models" "strings" - "time" ) // parseModelName parses a composite model name in format "model@instance@provider" or "model@provider" @@ -88,17 +87,11 @@ func (m *ModelProviderService) AddModelProvider(providerName, userID string) (co return common.CodeServerError, errors.New("fail to get UUID") } - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) tenantModelProvider := &entity.TenantModelProvider{ ID: providerID, ProviderName: providerName, TenantID: tenantID, } - tenantModelProvider.CreateTime = &now - tenantModelProvider.UpdateTime = &now - tenantModelProvider.CreateDate = &nowDate - tenantModelProvider.UpdateDate = &nowDate err = m.modelProviderDAO.Create(tenantModelProvider) if err != nil { return common.CodeServerError, fmt.Errorf("fail to create model provider: %s", err.Error()) @@ -247,8 +240,6 @@ func (m *ModelProviderService) CreateProviderInstance(providerName, instanceName } extraStr := string(extraByte) - now := time.Now().Unix() - nowDate := time.Now().Truncate(time.Second) tenantModelProvider := &entity.TenantModelInstance{ ID: instanceID, InstanceName: instanceName, @@ -257,10 +248,6 @@ func (m *ModelProviderService) CreateProviderInstance(providerName, instanceName Status: "enable", Extra: extraStr, } - tenantModelProvider.CreateTime = &now - tenantModelProvider.UpdateTime = &now - tenantModelProvider.CreateDate = &nowDate - tenantModelProvider.UpdateDate = &nowDate err = m.modelInstanceDAO.Create(tenantModelProvider) if err != nil { diff --git a/internal/service/skill_space.go b/internal/service/skill_space.go index e40907fec4..99a89f3255 100644 --- a/internal/service/skill_space.go +++ b/internal/service/skill_space.go @@ -126,8 +126,6 @@ func (s *SkillSpaceService) getSkillsFolderID(tenantID string) (string, error) { // Skills folder not found, create it common.Info("Creating skills folder", zap.String("tenant_id", tenantID)) folderID := generateSpaceID() - now := time.Now() - createTime := now.UnixMilli() folder := &entity.File{ ID: folderID, ParentID: rootFolder.ID, @@ -137,12 +135,6 @@ func (s *SkillSpaceService) getSkillsFolderID(tenantID string) (string, error) { Type: "folder", Size: 0, SourceType: "system", - BaseModel: entity.BaseModel{ - CreateTime: &createTime, - UpdateTime: &createTime, - CreateDate: &now, - UpdateDate: &now, - }, } if err := s.fileDAO.Create(folder); err != nil { @@ -218,8 +210,6 @@ func (s *SkillSpaceService) CreateSpace(req *CreateSpaceRequest) (map[string]int // Generate space ID and folder ID spaceID := generateSpaceID() folderID := generateSpaceID() - timestamp := time.Now().UnixMilli() - now := time.Now() // Create folder for the space under skills folder folder := &entity.File{ @@ -249,8 +239,6 @@ func (s *SkillSpaceService) CreateSpace(req *CreateSpaceRequest) (map[string]int RerankID: req.RerankID, TopK: 10, Status: "1", - CreateTime: ×tamp, - UpdateTime: &now, } if err := s.spaceDAO.Create(space); err != nil { diff --git a/internal/service/user.go b/internal/service/user.go index 6b117697c4..3503be6e6e 100644 --- a/internal/service/user.go +++ b/internal/service/user.go @@ -150,14 +150,6 @@ func (s *UserService) Register(req *RegisterRequest) (*entity.User, common.Error IsSuperuser: &isSuperuser, } - now := time.Now().Unix() - user.CreateTime = &now - user.UpdateTime = &now - nowDate := time.Now().Truncate(time.Second) - user.CreateDate = &nowDate - user.UpdateDate = &nowDate - user.LastLoginTime = &nowDate - tenantName := req.Nickname + "'s Kingdom" llmID := cfg.UserDefaultLLM.DefaultModels.ChatModel.Name @@ -192,11 +184,6 @@ func (s *UserService) Register(req *RegisterRequest) (*entity.User, common.Error ParserIDs: "naive:General,Q&A:Q&A,manual:Manual,table:Table,paper:Research Paper,book:Book,laws:Laws,presentation:Presentation,picture:Picture,one:One,audio:Audio,email:Email,tag:Tag", Status: &status, } - tenant.CreateTime = &now - tenant.UpdateTime = &now - tenant.CreateDate = &nowDate - tenant.UpdateDate = &nowDate - userTenantID := utility.GenerateToken() userTenant := &entity.UserTenant{ ID: userTenantID, @@ -206,11 +193,6 @@ func (s *UserService) Register(req *RegisterRequest) (*entity.User, common.Error InvitedBy: userID, Status: &status, } - userTenant.CreateTime = &now - userTenant.UpdateTime = &now - userTenant.CreateDate = &nowDate - userTenant.UpdateDate = &nowDate - fileID := utility.GenerateToken() rootFile := &entity.File{ ID: fileID, @@ -221,11 +203,6 @@ func (s *UserService) Register(req *RegisterRequest) (*entity.User, common.Error Type: "folder", Size: 0, } - rootFile.CreateTime = &now - rootFile.UpdateTime = &now - rootFile.CreateDate = &nowDate - rootFile.UpdateDate = &nowDate - tenantDAO := dao.NewTenantDAO() userTenantDAO := dao.NewUserTenantDAO() fileDAO := dao.NewFileDAO() @@ -302,9 +279,6 @@ func (s *UserService) Login(req *LoginRequest) (*entity.User, common.ErrorCode, return nil, common.CodeServerError, fmt.Errorf("failed to update access token: %w", err) } - // Update timestamp - now := time.Now().Unix() - user.UpdateTime = &now if err := s.userDAO.Update(user); err != nil { return nil, common.CodeServerError, fmt.Errorf("failed to update user: %w", err) } @@ -340,10 +314,6 @@ func (s *UserService) LoginByEmail(req *EmailLoginRequest) (*entity.User, common token := utility.GenerateToken() user.AccessToken = &token - now := time.Now().Unix() - user.UpdateTime = &now - now_date := time.Now().Truncate(time.Second) - user.UpdateDate = &now_date if err := s.userDAO.Update(user); err != nil { return nil, common.CodeServerError, fmt.Errorf("failed to update user: %w", err) }