Monorepo for Tangled
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}