Files
ttstd-infinite-canvas/backend/internal/app/skills_bridge.go

160 lines
5.9 KiB
Go

package app
import (
"context"
"errors"
"mime/multipart"
"infinite-canvas/backend/internal/model"
"infinite-canvas/backend/internal/skills"
)
const SkillPackageUploadMaxBytes = skills.SkillPackageUploadMaxBytes
var ErrNotBuiltinSkill = skills.ErrNotBuiltinSkill
type (
SkillShowcaseMedia = skills.SkillShowcaseMedia
SkillEffectiveUser = skills.SkillEffectiveUser
SkillItem = skills.SkillItem
AddedSkillReference = skills.AddedSkillReference
SkillCategory = skills.SkillCategory
SkillLibraryCategory = skills.SkillLibraryCategory
SkillLibraryCategoryList = skills.SkillLibraryCategoryList
SkillLibraryCategoryMutationRequest = skills.SkillLibraryCategoryMutationRequest
SkillLibraryCategoryAssignmentRequest = skills.SkillLibraryCategoryAssignmentRequest
SkillListRequest = skills.SkillListRequest
SkillList = skills.SkillList
SkillMutationRequest = skills.SkillMutationRequest
SkillInstallRequest = skills.SkillInstallRequest
SkillGitHubInstallRequest = skills.SkillGitHubInstallRequest
SkillPackageFileItem = skills.SkillPackageFileItem
SkillPackageFileContent = skills.SkillPackageFileContent
SkillPackageBundleFile = skills.SkillPackageBundleFile
SkillPackageBundle = skills.SkillPackageBundle
SkillFileSearchResult = skills.SkillFileSearchResult
SkillPreset = skills.SkillPreset
)
func (s *Service) skillDomain() *skills.Service {
if s == nil {
return skills.New(nil, "", nil)
}
if s.skills != nil {
return s.skills
}
return skills.New(s.repo, s.dataDir, s.runWorkerLoop)
}
func (s *Service) Skills(userID string, req SkillListRequest) (*SkillList, error) {
return s.skillDomain().Skills(userID, req)
}
func (s *Service) AddedSkills(userID string) ([]AddedSkillReference, error) {
return s.skillDomain().AddedSkills(userID)
}
func (s *Service) SkillLibraryCategories(userID string, scope string) (*SkillLibraryCategoryList, error) {
return s.skillDomain().SkillLibraryCategories(userID, scope)
}
func (s *Service) CreateSkillLibraryCategory(actor *model.User, req SkillLibraryCategoryMutationRequest) (*SkillLibraryCategory, error) {
return s.skillDomain().CreateSkillLibraryCategory(actor, req)
}
func (s *Service) DeleteSkillLibraryCategory(actor *model.User, id string) error {
return s.skillDomain().DeleteSkillLibraryCategory(actor, id)
}
func (s *Service) SetSkillLibraryCategory(userID string, skillID string, categoryID string) (*SkillItem, error) {
return s.skillDomain().SetSkillLibraryCategory(userID, skillID, categoryID)
}
// SkillPresets 返回场景预设目录(只读;数据随技能种子发布,无需用户上下文)。
func (s *Service) SkillPresets() ([]SkillPreset, error) {
return s.skillDomain().SkillPresets()
}
func (s *Service) SkillDetail(userID string, id string) (*SkillItem, error) {
return s.skillDomain().SkillDetail(userID, id)
}
func (s *Service) CreateSkill(userID string, req SkillMutationRequest) (*SkillItem, error) {
return s.skillDomain().CreateSkill(userID, req)
}
func (s *Service) UpdateSkill(userID string, id string, req SkillMutationRequest) (*SkillItem, error) {
return s.skillDomain().UpdateSkill(userID, id, req)
}
func (s *Service) DeleteSkill(userID string, id string) error {
return s.skillDomain().DeleteSkill(userID, id)
}
func (s *Service) DeleteBuiltinSkill(actor *model.User, id string) error {
return s.skillDomain().DeleteBuiltinSkill(actor, id)
}
func (s *Service) IsNotBuiltinSkill(err error) bool {
return errors.Is(err, skills.ErrNotBuiltinSkill)
}
func (s *Service) SetSkillAdded(userID string, id string, added bool) (*SkillItem, error) {
return s.skillDomain().SetSkillAdded(userID, id, added)
}
func (s *Service) SetSkillLiked(userID string, id string, liked bool) (*SkillItem, error) {
return s.skillDomain().SetSkillLiked(userID, id, liked)
}
func (s *Service) EnsureBuiltinSkills() error {
if err := s.skillDomain().EnsureBuiltinSkills(); err != nil {
return err
}
// 在同步文件包之后校验预设,确保预设只引用当前启用的稳定技能 ID。
if _, err := s.SkillPresets(); err != nil {
return err
}
return nil
}
func (s *Service) EnsureSkillPackages() error {
return s.skillDomain().EnsureSkillPackages()
}
func (s *Service) InstallSkillUpload(userID string, sourceType string, header *multipart.FileHeader, req SkillInstallRequest) (*SkillItem, error) {
return s.skillDomain().InstallSkillUpload(userID, sourceType, header, req)
}
func (s *Service) InstallGitHubSkill(userID string, req SkillGitHubInstallRequest) (*SkillItem, error) {
return s.skillDomain().InstallGitHubSkill(userID, req)
}
func (s *Service) SyncGitHubSkill(userID string, skillID string) (*SkillItem, error) {
return s.skillDomain().SyncGitHubSkill(userID, skillID)
}
func (s *Service) SkillPackageFiles(userID string, skillID string) ([]SkillPackageFileItem, error) {
return s.skillDomain().SkillPackageFiles(userID, skillID)
}
func (s *Service) SkillPackageFile(userID string, skillID string, filePath string) (*SkillPackageFileContent, error) {
return s.skillDomain().SkillPackageFile(userID, skillID, filePath)
}
func (s *Service) SkillPackageRawFile(userID string, skillID string, filePath string) ([]byte, string, string, error) {
return s.skillDomain().SkillPackageRawFile(userID, skillID, filePath)
}
func (s *Service) SkillPackageBundle(userID string, skillID string) (*SkillPackageBundle, error) {
return s.skillDomain().SkillPackageBundle(userID, skillID)
}
func (s *Service) SearchSkillPackage(userID string, skillID string, query string) ([]SkillFileSearchResult, error) {
return s.skillDomain().SearchSkillPackage(userID, skillID, query)
}
func (s *Service) startSkillSyncWorker(ctx context.Context) {
s.skillDomain().StartSyncWorker(ctx)
}