mirror of
https://github.com/infiniflow/ragflow.git
synced 2026-07-11 14:15:40 +08:00
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:
@@ -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
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
|
||||
@@ -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
|
||||
}
|
||||
|
||||
@@ -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{}
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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,
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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")
|
||||
}
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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 {
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user