Fixes #228 ## Motivation and Context See #19 ## How Has This Been Tested? - Run locally - Run in docker compose - Run infra in minikube - Unit and integration tests all passing :) ## Breaking Changes Yes: users will not be able to access any data they used to have in custom mongodb. We are accepting this breaking change, given the registry is in experimental development status. ## Types of changes <!-- What types of changes does your code introduce? Put an `x` in all the boxes that apply: --> - [ ] Bug fix (non-breaking change which fixes an issue) - [ ] New feature (non-breaking change which adds functionality) - [x] Breaking change (fix or feature that would cause existing functionality to change) - [ ] Documentation update ## Checklist <!-- Go over all the following points, and put an `x` in all the boxes that apply. --> - [x] I have read the [MCP Documentation](https://modelcontextprotocol.io) - [x] My code follows the repository's style guidelines - [x] New and existing tests pass locally - [x] I have added appropriate error handling - [x] I have added or updated documentation as needed ## Additional context I have not implemented connection pooling support for simplicity, and because cloudnative-pg already provides built-in connection pooling with pgBouncer so if we want it later we can switch to this endpoint easily.
53 lines
1.9 KiB
Go
53 lines
1.9 KiB
Go
package database
|
|
|
|
import (
|
|
"context"
|
|
"errors"
|
|
|
|
"github.com/modelcontextprotocol/registry/internal/model"
|
|
)
|
|
|
|
// Common database errors
|
|
var (
|
|
ErrNotFound = errors.New("record not found")
|
|
ErrAlreadyExists = errors.New("record already exists")
|
|
ErrInvalidInput = errors.New("invalid input")
|
|
ErrDatabase = errors.New("database error")
|
|
ErrInvalidVersion = errors.New("invalid version: cannot publish older version after newer version")
|
|
)
|
|
|
|
// Database defines the interface for database operations on MCPRegistry entries
|
|
type Database interface {
|
|
// List retrieves all MCPRegistry entries with optional filtering
|
|
List(ctx context.Context, filter map[string]any, cursor string, limit int) ([]*model.Server, string, error)
|
|
// GetByID retrieves a single ServerDetail by it's ID
|
|
GetByID(ctx context.Context, id string) (*model.ServerDetail, error)
|
|
// Publish adds a new ServerDetail to the database
|
|
Publish(ctx context.Context, serverDetail *model.ServerDetail) error
|
|
// ImportSeed imports initial data from a seed file
|
|
ImportSeed(ctx context.Context, seedFilePath string) error
|
|
// Close closes the database connection
|
|
Close() error
|
|
}
|
|
|
|
// ConnectionType represents the type of database connection
|
|
type ConnectionType string
|
|
|
|
const (
|
|
// ConnectionTypeMemory represents an in-memory database connection
|
|
ConnectionTypeMemory ConnectionType = "memory"
|
|
// ConnectionTypePostgreSQL represents a PostgreSQL database connection
|
|
ConnectionTypePostgreSQL ConnectionType = "postgresql"
|
|
)
|
|
|
|
// ConnectionInfo provides information about the database connection
|
|
type ConnectionInfo struct {
|
|
// Type indicates the type of database connection
|
|
Type ConnectionType
|
|
// IsConnected indicates whether the database is currently connected
|
|
IsConnected bool
|
|
// Raw provides access to the underlying connection object, which will vary by implementation
|
|
// For PostgreSQL, this will be *pgx.Conn
|
|
// For MemoryDB, this will be map[string]*model.MCPRegistry
|
|
Raw any
|
|
}
|