- Marked the Cache Implementation as complete in TODO.md, confirming all tasks are finished with comprehensive integration tests. - Updated cache.go to provide a thread-safe in-memory cache for Robot instances, improving performance and reliability. - Enhanced the Load method to include pagination and configurable model name, ensuring efficient data handling. - Added detailed comments and structured code for better readability and maintainability across the cache implementation. - Improved validation and error handling in various utility functions to ensure robustness in data processing.
99 lines
2 KiB
Go
99 lines
2 KiB
Go
package cache
|
|
|
|
import (
|
|
"sync"
|
|
|
|
"github.com/yaoapp/yao/agent/robot/types"
|
|
)
|
|
|
|
// Cache implements types.Cache interface
|
|
// Thread-safe in-memory cache for Robot instances
|
|
type Cache struct {
|
|
robots map[string]*types.Robot // memberID -> Robot
|
|
byTeam map[string][]string // teamID -> memberIDs
|
|
mu sync.RWMutex
|
|
}
|
|
|
|
// New creates a new cache instance
|
|
func New() *Cache {
|
|
return &Cache{
|
|
robots: make(map[string]*types.Robot),
|
|
byTeam: make(map[string][]string),
|
|
}
|
|
}
|
|
|
|
// Get returns a robot by member ID
|
|
// Stub: returns nil (will be implemented in Phase 3)
|
|
func (c *Cache) Get(memberID string) *types.Robot {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
return c.robots[memberID]
|
|
}
|
|
|
|
// List returns all robots for a team
|
|
func (c *Cache) List(teamID string) []*types.Robot {
|
|
c.mu.RLock()
|
|
defer c.mu.RUnlock()
|
|
|
|
memberIDs := c.byTeam[teamID]
|
|
robots := make([]*types.Robot, 0, len(memberIDs))
|
|
for _, memberID := range memberIDs {
|
|
if robot := c.robots[memberID]; robot != nil {
|
|
robots = append(robots, robot)
|
|
}
|
|
}
|
|
return robots
|
|
}
|
|
|
|
// Note: Refresh is implemented in refresh.go
|
|
|
|
// Add adds or updates a robot in cache
|
|
func (c *Cache) Add(robot *types.Robot) {
|
|
if robot == nil {
|
|
return
|
|
}
|
|
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
c.robots[robot.MemberID] = robot
|
|
|
|
// Update team index
|
|
if _, exists := c.byTeam[robot.TeamID]; !exists {
|
|
c.byTeam[robot.TeamID] = []string{}
|
|
}
|
|
|
|
// Check if member ID already in team list
|
|
found := false
|
|
for _, id := range c.byTeam[robot.TeamID] {
|
|
if id == robot.MemberID {
|
|
found = true
|
|
break
|
|
}
|
|
}
|
|
if !found {
|
|
c.byTeam[robot.TeamID] = append(c.byTeam[robot.TeamID], robot.MemberID)
|
|
}
|
|
}
|
|
|
|
// Remove removes a robot from cache
|
|
func (c *Cache) Remove(memberID string) {
|
|
c.mu.Lock()
|
|
defer c.mu.Unlock()
|
|
|
|
robot := c.robots[memberID]
|
|
if robot == nil {
|
|
return
|
|
}
|
|
|
|
delete(c.robots, memberID)
|
|
|
|
// Remove from team index
|
|
teamMembers := c.byTeam[robot.TeamID]
|
|
for i, id := range teamMembers {
|
|
if id == memberID {
|
|
c.byTeam[robot.TeamID] = append(teamMembers[:i], teamMembers[i+1:]...)
|
|
break
|
|
}
|
|
}
|
|
}
|