Monorepo for Tangled
at push-zpskmntwpyxz 92 lines 1.8 kB view raw
1package db 2 3import ( 4 "encoding/json" 5 "fmt" 6 "time" 7 8 "github.com/bluesky-social/indigo/atproto/syntax" 9 "tangled.org/core/notifier" 10) 11 12var tidClock = syntax.NewTIDClock(0) 13 14type Event struct { 15 Rkey string `json:"rkey"` 16 Nsid string `json:"nsid"` 17 EventJson string `json:"event"` 18 Created int64 `json:"created"` 19} 20 21func (d *DB) InsertEvent(event Event, notifier *notifier.Notifier) error { 22 23 _, err := d.db.Exec( 24 `insert into events (rkey, nsid, event, created) values (?, ?, ?, ?)`, 25 event.Rkey, 26 event.Nsid, 27 event.EventJson, 28 time.Now().UnixNano(), 29 ) 30 31 notifier.NotifyAll() 32 33 return err 34} 35 36func (d *DB) EmitDIDAssign(n *notifier.Notifier, ownerDid, repoName, repoDid, oldRepoAt string) error { 37 payload := RepoDIDAssign{ 38 OwnerDid: ownerDid, 39 RepoName: repoName, 40 RepoDid: repoDid, 41 OldRepoAt: oldRepoAt, 42 } 43 44 eventJson, err := json.Marshal(payload) 45 if err != nil { 46 return fmt.Errorf("marshal didAssign event: %w", err) 47 } 48 49 return d.InsertEvent(Event{ 50 Rkey: tidClock.Next().String(), 51 Nsid: RepoDIDAssignNSID, 52 EventJson: string(eventJson), 53 }, n) 54} 55 56func (d *DB) GetEvents(cursor int64) ([]Event, error) { 57 whereClause := "" 58 args := []any{} 59 if cursor > 0 { 60 whereClause = "where created > ?" 61 args = append(args, cursor) 62 } 63 64 query := fmt.Sprintf(` 65 select rkey, nsid, event, created 66 from events 67 %s 68 order by created asc 69 limit 100 70 `, whereClause) 71 72 rows, err := d.db.Query(query, args...) 73 if err != nil { 74 return nil, err 75 } 76 defer rows.Close() 77 78 var evts []Event 79 for rows.Next() { 80 var ev Event 81 if err := rows.Scan(&ev.Rkey, &ev.Nsid, &ev.EventJson, &ev.Created); err != nil { 82 return nil, err 83 } 84 evts = append(evts, ev) 85 } 86 87 if err := rows.Err(); err != nil { 88 return nil, err 89 } 90 91 return evts, nil 92}