DB interface

master
bel 2023-04-04 19:09:08 -06:00
parent 40cdf27198
commit 9e265bb8ca
2 changed files with 19 additions and 11 deletions

BIN
anki.d

Binary file not shown.

30
main.go
View File

@ -14,7 +14,15 @@ import (
) )
type ( type (
DB struct { DB interface {
HistoryOf(string) map[string][]History
Next(string, string) time.Time
Question(string) Question
LastAnswer(string, string) Answer
Answer(string) Answer
PushAnswer(string, string, string, bool) error
}
db struct {
Knowledge Knowledge Knowledge Knowledge
Users map[string]User Users map[string]User
Cadence []Duration Cadence []Duration
@ -88,28 +96,28 @@ func readline() string {
} }
func NewDB() (DB, error) { func NewDB() (DB, error) {
var db DB var db db
if b, err := os.ReadFile(os.Getenv("DB")); err != nil { if b, err := os.ReadFile(os.Getenv("DB")); err != nil {
return DB{}, err return nil, err
} else if err := yaml.Unmarshal(b, &db); err != nil { } else if err := yaml.Unmarshal(b, &db); err != nil {
return DB{}, err return nil, err
} }
return db, nil return db, nil
} }
func (db DB) HistoryOf(user string) map[string][]History { func (db db) HistoryOf(user string) map[string][]History {
return db.Users[user].History return db.Users[user].History
} }
func (db DB) Question(q string) Question { func (db db) Question(q string) Question {
return db.Knowledge.Questions[q] return db.Knowledge.Questions[q]
} }
func (db DB) Answer(a string) Answer { func (db db) Answer(a string) Answer {
return db.Knowledge.Answers[a] return db.Knowledge.Answers[a]
} }
func (db DB) LastAnswer(user, q string) Answer { func (db db) LastAnswer(user, q string) Answer {
for _, v := range db.Knowledge.Answers { for _, v := range db.Knowledge.Answers {
if v.Q == q && v.Author == user { if v.Q == q && v.Author == user {
return v return v
@ -118,7 +126,7 @@ func (db DB) LastAnswer(user, q string) Answer {
return Answer{} return Answer{}
} }
func (db DB) PushAnswer(user, q, a string, pass bool) error { func (db db) PushAnswer(user, q, a string, pass bool) error {
uuid := uuid.New().String() uuid := uuid.New().String()
db.Knowledge.Answers[uuid] = Answer{ db.Knowledge.Answers[uuid] = Answer{
Q: q, Q: q,
@ -133,7 +141,7 @@ func (db DB) PushAnswer(user, q, a string, pass bool) error {
return nil return nil
} }
func (db DB) Next(user, q string) time.Time { func (db db) Next(user, q string) time.Time {
history := db.Users[user].History[q] history := db.Users[user].History[q]
progress := 0 progress := 0
for i := range history { for i := range history {
@ -151,7 +159,7 @@ func (db DB) Next(user, q string) time.Time {
return db.LastTS(user, q).Add(time.Duration(db.Cadence[progress])) return db.LastTS(user, q).Add(time.Duration(db.Cadence[progress]))
} }
func (db DB) LastTS(user, q string) time.Time { func (db db) LastTS(user, q string) time.Time {
max := int64(0) max := int64(0)
for _, v := range db.Users[user].History[q] { for _, v := range db.Users[user].History[q] {
if v.TS > max { if v.TS > max {