forked from
tangled.org/core
Monorepo for Tangled
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, oldRepoAt string) error {
35 payload := RepoDIDAssign{
36 OwnerDid: ownerDid,
37 RepoName: repoName,
38 RepoDid: repoDid,
39 OldRepoAt: oldRepoAt,
40 }
41
42 eventJson, err := json.Marshal(payload)
43 if err != nil {
44 return fmt.Errorf("marshal didAssign event: %w", err)
45 }
46
47 return d.InsertEvent(Event{
48 Rkey: tid.TID(),
49 Nsid: RepoDIDAssignNSID,
50 EventJson: string(eventJson),
51 }, n)
52}
53
54func (d *DB) GetEvents(cursor int64) ([]Event, error) {
55 whereClause := ""
56 args := []any{}
57 if cursor > 0 {
58 whereClause = "where created > ?"
59 args = append(args, cursor)
60 }
61
62 query := fmt.Sprintf(`
63 select rkey, nsid, event, created
64 from events
65 %s
66 order by created asc
67 limit 100
68 `, whereClause)
69
70 rows, err := d.db.Query(query, args...)
71 if err != nil {
72 return nil, err
73 }
74 defer rows.Close()
75
76 var evts []Event
77 for rows.Next() {
78 var ev Event
79 if err := rows.Scan(&ev.Rkey, &ev.Nsid, &ev.EventJson, &ev.Created); err != nil {
80 return nil, err
81 }
82 evts = append(evts, ev)
83 }
84
85 if err := rows.Err(); err != nil {
86 return nil, err
87 }
88
89 return evts, nil
90}