181 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
			
		
		
	
	
			181 lines
		
	
	
		
			5.1 KiB
		
	
	
	
		
			Go
		
	
	
	
/*
 | 
						|
 * Copyright 2025 coze-dev Authors
 | 
						|
 *
 | 
						|
 * Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
 * you may not use this file except in compliance with the License.
 | 
						|
 * You may obtain a copy of the License at
 | 
						|
 *
 | 
						|
 *     http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
 *
 | 
						|
 * Unless required by applicable law or agreed to in writing, software
 | 
						|
 * distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
 * See the License for the specific language governing permissions and
 | 
						|
 * limitations under the License.
 | 
						|
 */
 | 
						|
 | 
						|
package dao
 | 
						|
 | 
						|
import (
 | 
						|
	"context"
 | 
						|
	"errors"
 | 
						|
	"time"
 | 
						|
 | 
						|
	"gorm.io/gorm"
 | 
						|
	"gorm.io/gorm/clause"
 | 
						|
 | 
						|
	"github.com/coze-dev/coze-studio/backend/domain/knowledge/entity"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/domain/knowledge/internal/dal/model"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/domain/knowledge/internal/dal/query"
 | 
						|
	"github.com/coze-dev/coze-studio/backend/pkg/lang/ptr"
 | 
						|
)
 | 
						|
 | 
						|
type KnowledgeDAO struct {
 | 
						|
	DB    *gorm.DB
 | 
						|
	Query *query.Query
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) Create(ctx context.Context, knowledge *model.Knowledge) error {
 | 
						|
	return dao.Query.Knowledge.WithContext(ctx).Create(knowledge)
 | 
						|
}
 | 
						|
func (dao *KnowledgeDAO) Upsert(ctx context.Context, knowledge *model.Knowledge) error {
 | 
						|
	return dao.Query.Knowledge.WithContext(ctx).Clauses(clause.OnConflict{UpdateAll: true}).Create(knowledge)
 | 
						|
}
 | 
						|
func (dao *KnowledgeDAO) Update(ctx context.Context, knowledge *model.Knowledge) error {
 | 
						|
	k := dao.Query.Knowledge
 | 
						|
	knowledge.UpdatedAt = time.Now().UnixMilli()
 | 
						|
	err := k.WithContext(ctx).Where(k.ID.Eq(knowledge.ID)).Save(knowledge)
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) Delete(ctx context.Context, id int64) error {
 | 
						|
	k := dao.Query.Knowledge
 | 
						|
	_, err := k.WithContext(ctx).Where(k.ID.Eq(id)).Delete()
 | 
						|
	return err
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) MGetByID(ctx context.Context, ids []int64) ([]*model.Knowledge, error) {
 | 
						|
	if len(ids) == 0 {
 | 
						|
		return nil, nil
 | 
						|
	}
 | 
						|
 | 
						|
	k := dao.Query.Knowledge
 | 
						|
	pos, err := k.WithContext(ctx).Where(k.ID.In(ids...)).Find()
 | 
						|
	if err != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
 | 
						|
	return pos, nil
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) FilterEnableKnowledge(ctx context.Context, knowledgeIDs []int64) ([]*model.Knowledge, error) {
 | 
						|
	if len(knowledgeIDs) == 0 {
 | 
						|
		return nil, nil
 | 
						|
	}
 | 
						|
	k := dao.Query.Knowledge
 | 
						|
	knowledgeModels, err := k.WithContext(ctx).
 | 
						|
		Select(k.ID, k.FormatType).
 | 
						|
		Where(k.ID.In(knowledgeIDs...)).
 | 
						|
		Where(k.Status.Eq(int32(entity.DocumentStatusEnable))).
 | 
						|
		Find()
 | 
						|
 | 
						|
	return knowledgeModels, err
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) InitTx() (tx *gorm.DB, err error) {
 | 
						|
	tx = dao.DB.Begin()
 | 
						|
	if tx.Error != nil {
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) UpdateWithTx(ctx context.Context, tx *gorm.DB, knowledgeID int64, updateMap map[string]interface{}) error {
 | 
						|
	return tx.WithContext(ctx).Model(&model.Knowledge{}).Where("id = ?", knowledgeID).Updates(updateMap).Error
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) FindKnowledgeByCondition(ctx context.Context, opts *entity.WhereKnowledgeOption) (knowledge []*model.Knowledge, total int64, err error) {
 | 
						|
	k := dao.Query.Knowledge
 | 
						|
	do := k.WithContext(ctx).Debug()
 | 
						|
	if opts == nil {
 | 
						|
		return nil, 0, nil
 | 
						|
	}
 | 
						|
	if opts.Query != nil && len(*opts.Query) > 0 {
 | 
						|
		do = do.Where(k.Name.Like("%" + *opts.Query + "%"))
 | 
						|
	}
 | 
						|
	if opts.Name != nil && len(*opts.Name) > 0 {
 | 
						|
		do = do.Where(k.Name.Eq(*opts.Name))
 | 
						|
	}
 | 
						|
 | 
						|
	if len(opts.KnowledgeIDs) > 0 {
 | 
						|
		do = do.Where(k.ID.In(opts.KnowledgeIDs...))
 | 
						|
	}
 | 
						|
	if ptr.From(opts.AppID) != 0 {
 | 
						|
		do = do.Where(k.AppID.Eq(ptr.From(opts.AppID)))
 | 
						|
	} else {
 | 
						|
		if len(opts.KnowledgeIDs) == 0 {
 | 
						|
			do = do.Where(k.AppID.Eq(0))
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if ptr.From(opts.SpaceID) != 0 {
 | 
						|
		do = do.Where(k.SpaceID.Eq(*opts.SpaceID))
 | 
						|
	}
 | 
						|
	if len(opts.Status) > 0 {
 | 
						|
		do = do.Where(k.Status.In(opts.Status...))
 | 
						|
	}
 | 
						|
	if opts.UserID != nil && ptr.From(opts.UserID) != 0 {
 | 
						|
		do = do.Where(k.CreatorID.Eq(*opts.UserID))
 | 
						|
	}
 | 
						|
	if opts.FormatType != nil {
 | 
						|
		do = do.Where(k.FormatType.Eq(int32(*opts.FormatType)))
 | 
						|
	}
 | 
						|
	if opts.Order != nil {
 | 
						|
		if *opts.Order == entity.OrderCreatedAt {
 | 
						|
			if opts.OrderType != nil {
 | 
						|
				if *opts.OrderType == entity.OrderTypeAsc {
 | 
						|
					do = do.Order(k.CreatedAt.Asc())
 | 
						|
				} else {
 | 
						|
					do = do.Order(k.CreatedAt.Desc())
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				do = do.Order(k.CreatedAt.Desc())
 | 
						|
			}
 | 
						|
		} else if *opts.Order == entity.OrderUpdatedAt {
 | 
						|
			if opts.OrderType != nil {
 | 
						|
				if *opts.OrderType == entity.OrderTypeAsc {
 | 
						|
					do = do.Order(k.UpdatedAt.Asc())
 | 
						|
				} else {
 | 
						|
					do = do.Order(k.UpdatedAt.Desc())
 | 
						|
				}
 | 
						|
			} else {
 | 
						|
				do = do.Order(k.UpdatedAt.Desc())
 | 
						|
			}
 | 
						|
		}
 | 
						|
	}
 | 
						|
	if opts.Page != nil && opts.PageSize != nil {
 | 
						|
		offset := (*opts.Page - 1) * (*opts.PageSize)
 | 
						|
		do = do.Limit(*opts.PageSize).Offset(offset)
 | 
						|
	}
 | 
						|
	knowledge, err = do.Find()
 | 
						|
	if err != nil {
 | 
						|
		return nil, 0, err
 | 
						|
	}
 | 
						|
	total, err = do.Limit(-1).Offset(-1).Count()
 | 
						|
	if err != nil {
 | 
						|
		return nil, 0, err
 | 
						|
	}
 | 
						|
	return knowledge, total, err
 | 
						|
}
 | 
						|
 | 
						|
func (dao *KnowledgeDAO) GetByID(ctx context.Context, id int64) (*model.Knowledge, error) {
 | 
						|
	k := dao.Query.Knowledge
 | 
						|
	knowledge, err := k.WithContext(ctx).Where(k.ID.Eq(id)).First()
 | 
						|
	if err != nil {
 | 
						|
		if errors.Is(err, gorm.ErrRecordNotFound) {
 | 
						|
			return nil, nil
 | 
						|
		}
 | 
						|
		return nil, err
 | 
						|
	}
 | 
						|
	return knowledge, nil
 | 
						|
}
 |