package store import "context" type Endpoint struct { ID string `json:"id"` URL string `json:"url"` CreatedAt string `json:"created_at"` UpdatedAt string `json:"updated_at"` } type Request struct { ID string `json:"id"` EndpointID string `json:"endpoint_id"` Method string `json:"method"` Path string `json:"path"` Headers string `json:"headers"` Query string `json:"query"` Body []byte `json:"body"` CreatedAt string `json:"created_at"` } // MockConfig holds the mock response configuration for an endpoint. type MockConfig struct { EndpointID string `json:"endpoint_id"` Status int `json:"status"` Headers map[string]string `json:"headers"` Body []byte `json:"body"` } // Space represents a public or private demo space type Space struct { ID string `json:"id"` Slug string `json:"slug"` Name string `json:"name"` Description string `json:"description"` IsPublic bool `json:"isPublic"` CreatedAt string `json:"createdAt"` UpdatedAt string `json:"updatedAt"` } // Photo represents a photo in a space gallery type Photo struct { ID string `json:"id"` SpaceID string `json:"spaceId"` URL string `json:"url"` ThumbnailURL string `json:"thumbnailUrl"` FaceCount int `json:"faceCount"` Metadata string `json:"metadata"` CreatedAt string `json:"createdAt"` } // FaceEmbedding stores face embeddings for search type FaceEmbedding struct { ID string `json:"id"` PhotoID string `json:"photoId"` SpaceID string `json:"spaceId"` Embedding []float32 `json:"embedding"` BoundingBox string `json:"boundingBox"` CreatedAt string `json:"createdAt"` } // RateLimit tracks rate limiting for guest face search type RateLimit struct { ID string `json:"id"` IPAddress string `json:"ipAddress"` SpaceID string `json:"spaceId"` RequestCount int `json:"requestCount"` WindowStart string `json:"windowStart"` CreatedAt string `json:"createdAt"` } type Repository interface { // Endpoint operations CreateEndpoint(ctx context.Context, url string) (*Endpoint, error) GetEndpoint(ctx context.Context, id string) (*Endpoint, error) AppendRequest(ctx context.Context, endpointID string, req *Request) error GetRequest(ctx context.Context, id string) (*Request, error) ListRequests(ctx context.Context, endpointID string, limit int) ([]*Request, error) SearchRequests(ctx context.Context, endpointID string, query string, limit int) ([]*Request, error) GetMock(ctx context.Context, endpointID string) (*MockConfig, error) SetMock(ctx context.Context, mock *MockConfig) error // Space operations CreateSpace(ctx context.Context, space *Space) (*Space, error) GetSpaceBySlug(ctx context.Context, slug string) (*Space, error) UpdateSpace(ctx context.Context, space *Space) (*Space, error) DeleteSpace(ctx context.Context, id string) error ListPublicSpaces(ctx context.Context) ([]*Space, error) // Photo operations CreatePhoto(ctx context.Context, photo *Photo) (*Photo, error) GetPhoto(ctx context.Context, id string) (*Photo, error) ListPhotosBySpace(ctx context.Context, spaceID string, limit int) ([]*Photo, error) DeletePhoto(ctx context.Context, id string) error // Face embedding operations CreateFaceEmbedding(ctx context.Context, embedding *FaceEmbedding) (*FaceEmbedding, error) ListFaceEmbeddingsBySpace(ctx context.Context, spaceID string) ([]*FaceEmbedding, error) SearchFaceEmbeddings(ctx context.Context, spaceID string, embedding []float32, limit int) ([]*FaceEmbedding, error) // Rate limiting operations CheckRateLimit(ctx context.Context, ipAddress, spaceID string, limit, windowMinutes int) (bool, error) IncrementRateLimit(ctx context.Context, ipAddress, spaceID string, windowMinutes int) error Close() error Ping(ctx context.Context) error } var _ Repository = (*sqliteRepo)(nil)