101 lines
2.4 KiB
Go
101 lines
2.4 KiB
Go
package usecase
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"github.com/google/uuid"
|
|
|
|
v1 "github.com/chaitin/panda-wiki/api/nav/v1"
|
|
"github.com/chaitin/panda-wiki/domain"
|
|
"github.com/chaitin/panda-wiki/log"
|
|
"github.com/chaitin/panda-wiki/repo/mq"
|
|
"github.com/chaitin/panda-wiki/repo/pg"
|
|
)
|
|
|
|
type NavUsecase struct {
|
|
navRepo *pg.NavRepository
|
|
nodeRepo *pg.NodeRepository
|
|
ragRepo *mq.RAGRepository
|
|
logger *log.Logger
|
|
}
|
|
|
|
func NewNavUsecase(
|
|
navRepo *pg.NavRepository,
|
|
nodeRepo *pg.NodeRepository,
|
|
ragRepo *mq.RAGRepository,
|
|
logger *log.Logger,
|
|
) *NavUsecase {
|
|
return &NavUsecase{
|
|
navRepo: navRepo,
|
|
nodeRepo: nodeRepo,
|
|
ragRepo: ragRepo,
|
|
logger: logger.WithModule("usecase.nav"),
|
|
}
|
|
}
|
|
|
|
func (u *NavUsecase) GetList(ctx context.Context, kbID string) ([]v1.NavListResp, error) {
|
|
navs, err := u.navRepo.GetList(ctx, kbID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return navs, nil
|
|
}
|
|
|
|
func (u *NavUsecase) GetReleaseList(ctx context.Context, kbID string) ([]v1.NavListResp, error) {
|
|
navs, err := u.navRepo.GetReleaseList(ctx, kbID)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
return navs, nil
|
|
}
|
|
|
|
func (u *NavUsecase) Add(ctx context.Context, req *v1.NavAddReq) error {
|
|
if req.Position != nil && (*req.Position > domain.MaxPosition || *req.Position < 0) {
|
|
return errors.New("specified position is out of range")
|
|
}
|
|
|
|
nav := &domain.Nav{
|
|
ID: uuid.New().String(),
|
|
KbID: req.KbId,
|
|
Name: req.Name,
|
|
}
|
|
|
|
return u.navRepo.Create(ctx, nav, req.Position)
|
|
}
|
|
|
|
func (u *NavUsecase) Move(ctx context.Context, req *v1.NavMoveReq) error {
|
|
return u.navRepo.Move(ctx, req.KbId, req.ID, req.PrevID, req.NextID)
|
|
}
|
|
|
|
func (u *NavUsecase) Delete(ctx context.Context, req *v1.NavDeleteReq) error {
|
|
nodeIDs, err := u.nodeRepo.GetNodeIDsByNavId(ctx, req.KbId, req.ID)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
|
|
if len(nodeIDs) > 0 {
|
|
docIDs, err := u.nodeRepo.Delete(ctx, req.KbId, nodeIDs)
|
|
if err != nil {
|
|
return err
|
|
}
|
|
nodeVectorContentRequests := make([]*domain.NodeReleaseVectorRequest, 0)
|
|
for _, docID := range docIDs {
|
|
nodeVectorContentRequests = append(nodeVectorContentRequests, &domain.NodeReleaseVectorRequest{
|
|
KBID: req.KbId,
|
|
DocID: docID,
|
|
Action: "delete",
|
|
})
|
|
}
|
|
if err := u.ragRepo.AsyncUpdateNodeReleaseVector(ctx, nodeVectorContentRequests); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return u.navRepo.Delete(ctx, req.KbId, req.ID)
|
|
}
|
|
|
|
func (u *NavUsecase) Update(ctx context.Context, req *v1.NavUpdateReq) error {
|
|
return u.navRepo.Update(ctx, req.KbId, req.ID, req.Name)
|
|
}
|