diff --git a/builder/store/database/agent_skill.go b/builder/store/database/agent_skill.go index 30fe2c80..7fed96ca 100644 --- a/builder/store/database/agent_skill.go +++ b/builder/store/database/agent_skill.go @@ -95,6 +95,7 @@ func (s *agentSkillStoreImpl) ListForAgent(ctx context.Context, userUUID string, AND pin_pref.entity_id = CAST(s.id AS TEXT) `, userUUID, types.AgentUserPreferenceActionPin, types.AgentUserPreferenceEntityTypeAgentSkill). Where("r.id IS NOT NULL"). + Where("(COALESCE(r.sync_status, '') = '' OR r.sync_status = ?)", types.SyncStatusCompleted). Where("r.repository_type = ?", types.SkillRepo) // Apply filters diff --git a/builder/store/database/agent_skill_test.go b/builder/store/database/agent_skill_test.go new file mode 100644 index 00000000..a47af180 --- /dev/null +++ b/builder/store/database/agent_skill_test.go @@ -0,0 +1,86 @@ +package database_test + +import ( + "context" + "testing" + + "github.com/google/uuid" + "github.com/stretchr/testify/require" + "opencsg.com/csghub-server/builder/store/database" + "opencsg.com/csghub-server/common/tests" + "opencsg.com/csghub-server/common/types" +) + +func TestAgentSkillStore_ListForAgent_SyncStatusFilter(t *testing.T) { + db := tests.InitTestDB() + defer db.Close() + ctx := context.TODO() + + store := database.NewAgentSkillStoreWithDB(db) + userStore := database.NewUserStoreWithDB(db) + repoStore := database.NewRepoStoreWithDB(db) + skillStore := database.NewSkillStoreWithDB(db) + + userUUID := uuid.New().String() + err := userStore.Create(ctx, &database.User{ + Username: "testuser", + UUID: userUUID, + }, &database.Namespace{}) + require.NoError(t, err) + + user, err := userStore.FindByUsername(ctx, "testuser") + require.NoError(t, err) + + completedRepo, err := repoStore.CreateRepo(ctx, database.Repository{ + Name: "completed-skill", + UserID: user.ID, + GitPath: "skills_testuser/completed-skill", + Path: "testuser/completed-skill", + RepositoryType: types.SkillRepo, + SyncStatus: types.SyncStatusCompleted, + Private: false, + }) + require.NoError(t, err) + + emptyStatusRepo, err := repoStore.CreateRepo(ctx, database.Repository{ + Name: "empty-status-skill", + UserID: user.ID, + GitPath: "skills_testuser/empty-status-skill", + Path: "testuser/empty-status-skill", + RepositoryType: types.SkillRepo, + Private: false, + }) + require.NoError(t, err) + + pendingRepo, err := repoStore.CreateRepo(ctx, database.Repository{ + Name: "pending-skill", + UserID: user.ID, + GitPath: "skills_testuser/pending-skill", + Path: "testuser/pending-skill", + RepositoryType: types.SkillRepo, + SyncStatus: types.SyncStatusPending, + Private: false, + }) + require.NoError(t, err) + + _, err = skillStore.Create(ctx, database.Skill{RepositoryID: completedRepo.ID}) + require.NoError(t, err) + _, err = skillStore.Create(ctx, database.Skill{RepositoryID: emptyStatusRepo.ID}) + require.NoError(t, err) + _, err = skillStore.Create(ctx, database.Skill{RepositoryID: pendingRepo.ID}) + require.NoError(t, err) + + items, total, err := store.ListForAgent(ctx, userUUID, user.Username, database.AgentSkillFilter{}, 10, 1) + require.NoError(t, err) + require.Equal(t, 2, total) + require.Len(t, items, 2) + + paths := make([]string, 0, len(items)) + for _, item := range items { + paths = append(paths, item.Path) + } + + require.Contains(t, paths, "testuser/completed-skill") + require.Contains(t, paths, "testuser/empty-status-skill") + require.NotContains(t, paths, "testuser/pending-skill") +}