160 lines
5.9 KiB
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)
|
|
}
|