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