fix(review round 1): daemon PAT-header auth, job pruning, session-split batches, streaming tars, seed cleanup, ping/pong, byte caps, branch switch, slug --, ctx cancel, Init:true, pagination, latest/before events; web newest-window history + load-older, offline busy gate, staleness guards, memo store, auth probe, scroll key, focus-visible, draft restore, poll dedup; 106+181 tests, coverage 96.2%/95.1%+
This commit is contained in:
+42
-1
@@ -131,6 +131,47 @@ func (s *Store) EventsAfter(sessionID string, after int64, limit int) ([]Event,
|
||||
return out, rows.Err()
|
||||
}
|
||||
|
||||
// EventsLatest returns the newest limit events for the session, ascending.
|
||||
func (s *Store) EventsLatest(sessionID string, limit int) ([]Event, error) {
|
||||
return s.eventsDesc(sessionID, ` WHERE sessionId=? ORDER BY seq DESC LIMIT ?`, limit, sessionID)
|
||||
}
|
||||
|
||||
// EventsBefore returns the newest window of at most limit events with
|
||||
// seq < before, ascending.
|
||||
func (s *Store) EventsBefore(sessionID string, before int64, limit int) ([]Event, error) {
|
||||
return s.eventsDesc(sessionID, ` WHERE sessionId=? AND seq<? ORDER BY seq DESC LIMIT ?`,
|
||||
limit, sessionID, before)
|
||||
}
|
||||
|
||||
// eventsDesc runs a newest-first query and returns the rows reversed
|
||||
// (oldest-first), for newest-window reads.
|
||||
func (s *Store) eventsDesc(sessionID, where string, limit int, args ...any) ([]Event, error) {
|
||||
rows, err := s.db.Query(
|
||||
`SELECT sessionId, seq, ts, type, payload FROM events`+where, append(args, limit)...)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
defer rows.Close()
|
||||
var desc []Event
|
||||
for rows.Next() {
|
||||
var e Event
|
||||
var payload string
|
||||
if err := rows.Scan(&e.SessionID, &e.Seq, &e.TS, &e.Type, &payload); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
e.Payload = json.RawMessage(payload)
|
||||
desc = append(desc, e)
|
||||
}
|
||||
if err := rows.Err(); err != nil {
|
||||
return nil, err
|
||||
}
|
||||
out := make([]Event, len(desc))
|
||||
for i, e := range desc {
|
||||
out[len(desc)-1-i] = e
|
||||
}
|
||||
return out, nil
|
||||
}
|
||||
|
||||
// UpsertSession inserts or refreshes the info snapshot for a session.
|
||||
func (s *Store) UpsertSession(info SessionInfo) error {
|
||||
blob, err := json.Marshal(info)
|
||||
@@ -158,7 +199,7 @@ func (s *Store) SetOnline(sessionID string, online bool) error {
|
||||
return err
|
||||
}
|
||||
|
||||
// Sessions returns every known session row ordered oldest-first.
|
||||
// Sessions returns every known session row ordered by session id.
|
||||
func (s *Store) Sessions() ([]SessionRow, error) {
|
||||
rows, err := s.db.Query(`SELECT id, info, lastSeq, lastEventAt, online FROM sessions ORDER BY id`)
|
||||
if err != nil {
|
||||
|
||||
Reference in New Issue
Block a user