Work in progress . This commit adds the core registry service implementation with methods to: - Retrieve all registry entries - List entries with cursor-based pagination - Fetch specific server details by ID
83 lines
2.3 KiB
Go
83 lines
2.3 KiB
Go
package service
|
|
|
|
import (
|
|
"context"
|
|
"time"
|
|
|
|
"github.com/modelcontextprotocol/registry/internal/database"
|
|
"github.com/modelcontextprotocol/registry/internal/model"
|
|
)
|
|
|
|
// registryServiceImpl implements the RegistryService interface using our Database
|
|
type registryServiceImpl struct {
|
|
db database.Database
|
|
}
|
|
|
|
// NewRegistryServiceWithDB creates a new registry service with the provided database
|
|
func NewRegistryServiceWithDB(db database.Database) RegistryService {
|
|
return ®istryServiceImpl{
|
|
db: db,
|
|
}
|
|
}
|
|
|
|
// GetAll returns all registry entries
|
|
func (s *registryServiceImpl) GetAll() ([]model.Entry, error) {
|
|
// Create a timeout context for the database operation
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
// Use the database's List method with no filters to get all entries
|
|
entries, _, err := s.db.List(ctx, nil, "", 30)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
// Convert from []*model.Entry to []model.Entry
|
|
result := make([]model.Entry, len(entries))
|
|
for i, entry := range entries {
|
|
result[i] = *entry
|
|
}
|
|
|
|
return result, nil
|
|
}
|
|
|
|
// List returns registry entries with cursor-based pagination
|
|
func (s *registryServiceImpl) List(cursor string, limit int) ([]model.Entry, string, error) {
|
|
// Create a timeout context for the database operation
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
// If limit is not set or negative, use a default limit
|
|
if limit <= 0 {
|
|
limit = 30
|
|
}
|
|
|
|
// Use the database's List method with pagination
|
|
entries, nextCursor, err := s.db.List(ctx, nil, cursor, limit)
|
|
if err != nil {
|
|
return nil, "", err
|
|
}
|
|
|
|
// Convert from []*model.MCPRegistry to []model.MCPRegistry
|
|
result := make([]model.Entry, len(entries))
|
|
for i, entry := range entries {
|
|
result[i] = *entry
|
|
}
|
|
|
|
return result, nextCursor, nil
|
|
}
|
|
|
|
// GetByID retrieves a specific server detail by its ID
|
|
func (s *registryServiceImpl) GetByID(id string) (*model.ServerDetail, error) {
|
|
// Create a timeout context for the database operation
|
|
ctx, cancel := context.WithTimeout(context.Background(), 5*time.Second)
|
|
defer cancel()
|
|
|
|
// Use the database's GetByID method to retrieve the server detail
|
|
serverDetail, err := s.db.GetByID(ctx, id)
|
|
if err != nil {
|
|
return nil, err
|
|
}
|
|
|
|
return serverDetail, nil
|
|
}
|