feat: add PostgreSQL persistence layer with Neon DB support
This commit is contained in:
53
internal/teachingassets/store_pg.go
Normal file
53
internal/teachingassets/store_pg.go
Normal file
@@ -0,0 +1,53 @@
|
||||
package teachingassets
|
||||
|
||||
import (
|
||||
"context"
|
||||
"encoding/json"
|
||||
"fmt"
|
||||
|
||||
"github.com/jackc/pgx/v5/pgxpool"
|
||||
)
|
||||
|
||||
type PostgresStore struct {
|
||||
pool *pgxpool.Pool
|
||||
}
|
||||
|
||||
func NewPostgresStore(pool *pgxpool.Pool) *PostgresStore {
|
||||
return &PostgresStore{pool: pool}
|
||||
}
|
||||
|
||||
func toJSON(v any) string {
|
||||
b, _ := json.Marshal(v)
|
||||
return string(b)
|
||||
}
|
||||
|
||||
func (s *PostgresStore) SavePrompt(prompt PromptCandidate) (PromptCandidate, error) {
|
||||
_, err := s.pool.Exec(context.Background(),
|
||||
`INSERT INTO teaching_asset_prompts (id, concept_id, asset_type, prompt, model_key, review_state, requires_model_id_verification, source_evidence, created_at)
|
||||
VALUES ($1, $2, $3, $4, $5, $6, $7, $8::jsonb, $9)`,
|
||||
prompt.ID, prompt.Concept.ID, string(prompt.AssetType), prompt.Prompt,
|
||||
prompt.ModelKey, string(prompt.ReviewState), prompt.RequiresModelIDVerification,
|
||||
toJSON(prompt.SourceEvidence), prompt.CreatedAt,
|
||||
)
|
||||
if err != nil {
|
||||
return PromptCandidate{}, fmt.Errorf("insert prompt: %w", err)
|
||||
}
|
||||
return prompt, nil
|
||||
}
|
||||
|
||||
func (s *PostgresStore) Snapshot() Snapshot {
|
||||
rows, _ := s.pool.Query(context.Background(),
|
||||
`SELECT id, concept_id, asset_type, prompt, model_key, review_state, requires_model_id_verification, source_evidence, created_at FROM teaching_asset_prompts`)
|
||||
defer rows.Close()
|
||||
|
||||
var prompts []PromptCandidate
|
||||
for rows.Next() {
|
||||
var p PromptCandidate
|
||||
var evidenceJSON string
|
||||
rows.Scan(&p.ID, &p.Concept.ID, &p.AssetType, &p.Prompt, &p.ModelKey,
|
||||
&p.ReviewState, &p.RequiresModelIDVerification, &evidenceJSON, &p.CreatedAt)
|
||||
json.Unmarshal([]byte(evidenceJSON), &p.SourceEvidence)
|
||||
prompts = append(prompts, p)
|
||||
}
|
||||
return Snapshot{Prompts: prompts}
|
||||
}
|
||||
Reference in New Issue
Block a user