forked from
tangled.org/core
fork
Configure Feed
Select the types of activity you want to include in your feed.
Monorepo for Tangled
fork
Configure Feed
Select the types of activity you want to include in your feed.
1package db
2
3import (
4 "strconv"
5 "time"
6
7 "tangled.sh/tangled.sh/core/api/tangled"
8)
9
10type PublicKey struct {
11 Did string
12 tangled.PublicKey
13}
14
15func (d *DB) AddPublicKeyFromRecord(did string, recordIface map[string]interface{}) error {
16 record := make(map[string]string)
17 for k, v := range recordIface {
18 if str, ok := v.(string); ok {
19 record[k] = str
20 }
21 }
22
23 pk := PublicKey{
24 Did: did,
25 }
26 pk.Key = record["key"]
27 pk.CreatedAt = record["createdAt"]
28
29 return d.AddPublicKey(pk)
30}
31
32func (d *DB) AddPublicKey(pk PublicKey) error {
33 if pk.CreatedAt == "" {
34 pk.CreatedAt = time.Now().Format(time.RFC3339)
35 }
36
37 query := `insert or ignore into public_keys (did, key, created) values (?, ?, ?)`
38 _, err := d.db.Exec(query, pk.Did, pk.Key, pk.CreatedAt)
39 return err
40}
41
42func (d *DB) RemovePublicKey(did string) error {
43 query := `delete from public_keys where did = ?`
44 _, err := d.db.Exec(query, did)
45 return err
46}
47
48func (pk *PublicKey) JSON() map[string]any {
49 return map[string]any{
50 "did": pk.Did,
51 "key": pk.Key,
52 "createdAt": pk.CreatedAt,
53 }
54}
55
56func (d *DB) GetAllPublicKeys() ([]PublicKey, error) {
57 var keys []PublicKey
58
59 rows, err := d.db.Query(`select key, did, created from public_keys`)
60 if err != nil {
61 return nil, err
62 }
63 defer rows.Close()
64
65 for rows.Next() {
66 var publicKey PublicKey
67 if err := rows.Scan(&publicKey.Key, &publicKey.Did, &publicKey.CreatedAt); err != nil {
68 return nil, err
69 }
70 keys = append(keys, publicKey)
71 }
72
73 if err := rows.Err(); err != nil {
74 return nil, err
75 }
76
77 return keys, nil
78}
79
80func (d *DB) GetPublicKeys(did string) ([]PublicKey, error) {
81 var keys []PublicKey
82
83 rows, err := d.db.Query(`select did, key, created from public_keys where did = ?`, did)
84 if err != nil {
85 return nil, err
86 }
87 defer rows.Close()
88
89 for rows.Next() {
90 var publicKey PublicKey
91 if err := rows.Scan(&publicKey.Did, &publicKey.Key, &publicKey.CreatedAt); err != nil {
92 return nil, err
93 }
94 keys = append(keys, publicKey)
95 }
96
97 if err := rows.Err(); err != nil {
98 return nil, err
99 }
100
101 return keys, nil
102}
103
104func (d *DB) GetPublicKeysPaginated(limit int, cursor string) ([]PublicKey, string, error) {
105 var keys []PublicKey
106
107 offset := 0
108 if cursor != "" {
109 if o, err := strconv.Atoi(cursor); err == nil && o >= 0 {
110 offset = o
111 }
112 }
113
114 query := `select key, did, created from public_keys order by created desc limit ? offset ?`
115 rows, err := d.db.Query(query, limit+1, offset) // +1 to check if there are more results
116 if err != nil {
117 return nil, "", err
118 }
119 defer rows.Close()
120
121 for rows.Next() {
122 var publicKey PublicKey
123 if err := rows.Scan(&publicKey.Key, &publicKey.Did, &publicKey.CreatedAt); err != nil {
124 return nil, "", err
125 }
126 keys = append(keys, publicKey)
127 }
128
129 if err := rows.Err(); err != nil {
130 return nil, "", err
131 }
132
133 // check if there are more results for pagination
134 var nextCursor string
135 if len(keys) > limit {
136 keys = keys[:limit] // remove the extra item
137 nextCursor = strconv.Itoa(offset + limit)
138 }
139
140 return keys, nextCursor, nil
141}