mirror of
https://github.com/status-im/status-go.git
synced 2025-01-09 22:26:30 +00:00
be9c55bc16
* WIP accounts implementation * Accounts datasore and changes to status mobile API * Add library changes and method to update config * Handle error after account selection * Add two methods to start account to backend * Use encrypted database for settings and add a service for them * Resolve linter warning * Bring back StartNode StopNode for tests * Add sub accounts and get/save api * Changes to accounts structure * Login use root address and fetch necessary info from database * Cover accounts store with tests * Refactor in progress * Initialize status keystore instance before starting ethereum node * Rework library tests * Resolve failures in private api test and send transaction test * Pass pointer to initialized config to unmarshal * Use multiaccounts/accounts naming consistently Multiaccount is used as a login identifier Account references an address and a key, if account is not watch-only. * Add login timestamp stored in the database to accounts.Account object * Add photo-path field for multiaccount struct * Add multiaccoutns rpc with updateAccount method Update to any other account that wasn't used for login will return an error * Fix linter in services/accounts * Select account before starting a node * Save list of accounts on first login * Pass account manager to accounts service to avoid selecting account before starting a node * Add logs to login with save and regualr login
40 lines
838 B
Go
40 lines
838 B
Go
package sqlite
|
|
|
|
import (
|
|
"database/sql/driver"
|
|
"encoding/json"
|
|
"errors"
|
|
"reflect"
|
|
)
|
|
|
|
// JSONBlob type for marshaling/unmarshaling inner type to json.
|
|
type JSONBlob struct {
|
|
Data interface{}
|
|
}
|
|
|
|
// Scan implements interface.
|
|
func (blob *JSONBlob) Scan(value interface{}) error {
|
|
dataVal := reflect.ValueOf(blob.Data)
|
|
if value == nil || dataVal.Kind() == reflect.Ptr && dataVal.IsNil() {
|
|
return nil
|
|
}
|
|
bytes, ok := value.([]byte)
|
|
if !ok {
|
|
return errors.New("not a byte slice")
|
|
}
|
|
if len(bytes) == 0 {
|
|
return nil
|
|
}
|
|
err := json.Unmarshal(bytes, blob.Data)
|
|
return err
|
|
}
|
|
|
|
// Value implements interface.
|
|
func (blob *JSONBlob) Value() (driver.Value, error) {
|
|
dataVal := reflect.ValueOf(blob.Data)
|
|
if blob.Data == nil || dataVal.Kind() == reflect.Ptr && dataVal.IsNil() {
|
|
return nil, nil
|
|
}
|
|
return json.Marshal(blob.Data)
|
|
}
|