forked from tangled.org/core
this repo has no description
at master 3.0 kB view raw
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}