p2p-llm / db /repositories.go
arpinfidel's picture
temp
48511d8
package db
import "time"
// APIKeyRepository defines operations for API key management
type APIKeyRepository interface {
CreateKey(hash, name string, expiresAt *time.Time) error
GetActiveKeyHash() (string, error)
DeactivateKey(id int) error
}
// SQLiteAPIKeyRepository implements APIKeyRepository for SQLite
type SQLiteAPIKeyRepository struct {
db Database
}
// NewSQLiteAPIKeyRepository creates a new SQLite API key repository
func NewSQLiteAPIKeyRepository(db Database) *SQLiteAPIKeyRepository {
return &SQLiteAPIKeyRepository{db: db}
}
func (r *SQLiteAPIKeyRepository) CreateKey(hash, name string, expiresAt *time.Time) error {
_, err := r.db.Exec(`
INSERT INTO api_keys (key_hash, name, expires_at)
VALUES (?, ?, ?)
`, hash, name, expiresAt)
return err
}
func (r *SQLiteAPIKeyRepository) GetActiveKeyHash() (string, error) {
var hash string
err := r.db.QueryRow(`
SELECT key_hash FROM api_keys
WHERE is_active = TRUE
AND (expires_at IS NULL OR expires_at > CURRENT_TIMESTAMP)
`).Scan(&hash)
return hash, err
}
func (r *SQLiteAPIKeyRepository) DeactivateKey(id int) error {
_, err := r.db.Exec(`
UPDATE api_keys
SET is_active = FALSE
WHERE id = ?
`, id)
return err
}
// PeerRepository defines operations for peer management
type PeerRepository interface {
AddPeer(url, publicKeyPEM string) error
ListTrustedPeers() ([]struct {
URL string
PublicKey string
}, error)
}
// SQLitePeerRepository implements PeerRepository for SQLite
type SQLitePeerRepository struct {
db Database
}
// NewSQLitePeerRepository creates a new SQLite peer repository
func NewSQLitePeerRepository(db Database) *SQLitePeerRepository {
return &SQLitePeerRepository{db: db}
}
func (r *SQLitePeerRepository) AddPeer(url, publicKeyPEM string) error {
_, err := r.db.Exec(`
INSERT INTO peers (url, public_key_pem)
VALUES (?, ?)
`, url, publicKeyPEM)
return err
}
func (r *SQLitePeerRepository) ListTrustedPeers() ([]struct {
URL string
PublicKey string
}, error) {
rows, err := r.db.Query(`
SELECT url, public_key_pem FROM peers
`)
if err != nil {
return nil, err
}
defer rows.Close()
var peers []struct {
URL string
PublicKey string
}
for rows.Next() {
var peer struct {
URL string
PublicKey string
}
if err := rows.Scan(&peer.URL, &peer.PublicKey); err != nil {
return nil, err
}
peers = append(peers, peer)
}
return peers, nil
}
// CreateTables creates the necessary database tables
func CreateTables(db Database) error {
_, err := db.Exec(`
CREATE TABLE IF NOT EXISTS api_keys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
key_hash TEXT NOT NULL UNIQUE,
name TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP,
expires_at TIMESTAMP,
is_active BOOLEAN DEFAULT TRUE
);
CREATE TABLE IF NOT EXISTS peers (
id INTEGER PRIMARY KEY AUTOINCREMENT,
url TEXT NOT NULL UNIQUE,
public_key_pem TEXT NOT NULL,
created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP
);
`)
return err
}