forked from
tangled.org/core
Monorepo for Tangled — https://tangled.org
1package db
2
3import (
4 "strconv"
5 "time"
6
7 "tangled.org/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}