users dont store their own history

master
Bel LaPointe 2023-04-07 10:28:48 -06:00
parent 4d73543b17
commit 90d517d1bf
2 changed files with 24 additions and 25 deletions

View File

@ -14,7 +14,7 @@ import (
type (
DB interface {
HistoryOf(IDU) map[IDQ][]History
HistoryOf(IDU) map[IDQ][]Answer
Next(IDU, IDQ) time.Time
Question(IDQ) Question
LastAnswer(IDU, IDQ) (IDA, Answer)
@ -32,11 +32,7 @@ type (
A Renderable
TS int64
Author IDU
}
History struct {
A IDA
TS int64
Pass bool
Pass bool
}
IDA string
IDQ string

View File

@ -2,6 +2,7 @@ package main
import (
"os"
"sort"
"time"
"github.com/google/uuid"
@ -19,8 +20,7 @@ type (
Answers map[IDA]Answer
}
user struct {
Tags tags
History map[IDQ][]History
Tags tags
}
tags struct {
Assignments []IDT
@ -60,23 +60,31 @@ func (db yamlDB) Close() {
}
}
func (db yamlDB) HistoryOf(user IDU) map[IDQ][]History {
result := map[IDQ][]History{}
for k, v := range db.Users[user].History {
result[k] = append([]History{}, v...)
func (db yamlDB) HistoryOf(user IDU) map[IDQ][]Answer {
result := map[IDQ][]Answer{}
for _, v := range db.Knowledge.Answers {
if v.Author == user {
result[v.Q] = append(result[v.Q], v)
}
}
for _, tag := range db.Users[user].Tags.Assignments {
for qid, q := range db.Knowledge.Questions {
if _, ok := result[qid]; !ok && q.Tagged(tag) {
result[qid] = []History{}
result[qid] = []Answer{}
}
}
}
for _, v := range result {
sort.Slice(v, func(i, j int) bool {
return v[i].TS < v[j].TS
})
}
return result
}
func (db yamlDB) Next(user IDU, q IDQ) time.Time {
history := db.Users[user].History[q]
allHistory := db.HistoryOf(user)
history := allHistory[q]
last := db.lastTS(user, q)
log := make([]int, 0, len(history))
for i := range history {
@ -118,21 +126,16 @@ func (db yamlDB) PushAnswer(user IDU, q IDQ, a Renderable, pass bool) error {
A: a,
TS: time.Now().UnixNano(),
Author: user,
Pass: pass,
}
db.Users[user].History[q] = append(db.Users[user].History[q], History{
A: uuid,
Pass: pass,
TS: db.Knowledge.Answers[uuid].TS,
})
return nil
}
func (db yamlDB) lastTS(user IDU, q IDQ) time.Time {
max := int64(0)
for _, v := range db.Users[user].History[q] {
if v.TS > max {
max = v.TS
}
allHistory := db.HistoryOf(user)
history := allHistory[q]
if len(history) == 0 {
return time.Unix(0, 0)
}
return time.Unix(0, max)
return time.Unix(0, history[len(history)-1].TS)
}