GO: align time units with Python and centralize timestamp injection in BaseModel (#14875)

### What problem does this PR solve?

align time units with Python and centralize timestamp injection in
BaseModel

### Type of change

- [x] Refactoring
This commit is contained in:
buua436
2026-05-14 13:46:46 +08:00
committed by GitHub
parent 82e06db8c3
commit f0122179dd
20 changed files with 135 additions and 243 deletions

View File

@@ -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

View File

@@ -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
}

View File

@@ -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)

View File

@@ -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: &timestamp,
}
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
}

View File

@@ -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
}

View File

@@ -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
}

View File

@@ -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 = &timestamp
}
if m.CreateDate == nil {
m.CreateDate = &dateTime
}
if m.UpdateTime == nil {
m.UpdateTime = &timestamp
}
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 = &timestamp
}
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{}

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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

View File

@@ -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 {

View File

@@ -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)
}

View File

@@ -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

View File

@@ -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,

View File

@@ -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)

View File

@@ -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 = &timestamp
memory.UpdateTime = &timestamp
if err := s.memoryDAO.Create(memory); err != nil {
return nil, errors.New("could not create new memory")
}

View File

@@ -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 {

View File

@@ -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: &timestamp,
UpdateTime: &now,
}
if err := s.spaceDAO.Create(space); err != nil {

View File

@@ -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)
}