update-userdata-devtool #58
| @ -4,6 +4,7 @@ import ( | |||||||
| 	"context" | 	"context" | ||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"regexp" | 	"regexp" | ||||||
|  | 	"strings" | ||||||
| 
 | 
 | ||||||
| 	"git.defalsify.org/vise.git/db" | 	"git.defalsify.org/vise.git/db" | ||||||
| 	"git.defalsify.org/vise.git/engine" | 	"git.defalsify.org/vise.git/engine" | ||||||
| @ -13,12 +14,15 @@ import ( | |||||||
| 	"git.defalsify.org/vise.git/state" | 	"git.defalsify.org/vise.git/state" | ||||||
| 	"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" | 	"git.grassecon.net/grassrootseconomics/sarafu-vise/handlers/application" | ||||||
| 	"git.grassecon.net/grassrootseconomics/visedriver/storage" | 	"git.grassecon.net/grassrootseconomics/visedriver/storage" | ||||||
|  | 
 | ||||||
|  | 	storedb "git.grassecon.net/grassrootseconomics/sarafu-vise/store/db" | ||||||
| ) | ) | ||||||
| 
 | 
 | ||||||
| var argc map[string]int = map[string]int{ | var argc map[string]int = map[string]int{ | ||||||
| 	"reset": 0, | 	"reset":     0, | ||||||
| 	"admin": 1, | 	"admin":     1, | ||||||
| 	"clone": 1, | 	"clone":     1, | ||||||
|  | 	"overwrite": 2, | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| var ( | var ( | ||||||
| @ -36,6 +40,8 @@ type Cmd struct { | |||||||
| 	exec         func(ctx context.Context, ss storage.StorageService) error | 	exec         func(ctx context.Context, ss storage.StorageService) error | ||||||
| 	engineConfig *engine.Config | 	engineConfig *engine.Config | ||||||
| 	st           *state.State | 	st           *state.State | ||||||
|  | 	key          string | ||||||
|  | 	value        string | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
| func NewCmd(sessionId string, flagParser *application.FlagManager) *Cmd { | func NewCmd(sessionId string, flagParser *application.FlagManager) *Cmd { | ||||||
| @ -184,6 +190,50 @@ func (c *Cmd) execAdmin(ctx context.Context, ss storage.StorageService) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Cmd) execOverwrite(ctx context.Context, ss storage.StorageService) error { | ||||||
|  | 	store, err := ss.GetUserdataDb(ctx) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("failed to get userdata store: %v", err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Map of symbolic keys to their DataTyp constants
 | ||||||
|  | 	symbolicKeys := map[string]storedb.DataTyp{ | ||||||
|  | 		"first_name":  storedb.DATA_FIRST_NAME, | ||||||
|  | 		"family_name": storedb.DATA_FAMILY_NAME, | ||||||
|  | 		"yob":         storedb.DATA_YOB, | ||||||
|  | 		"location":    storedb.DATA_LOCATION, | ||||||
|  | 		"gender":      storedb.DATA_GENDER, | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	// Lookup symbolic key
 | ||||||
|  | 	dtype, ok := symbolicKeys[strings.ToLower(c.key)] | ||||||
|  | 	if !ok { | ||||||
|  | 		return fmt.Errorf("unknown key '%s'. Available keys: %v", c.key, keysOf(symbolicKeys)) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	k := storedb.ToBytes(dtype) | ||||||
|  | 
 | ||||||
|  | 	store.SetPrefix(db.DATATYPE_USERDATA) | ||||||
|  | 	store.SetSession(c.sessionId) | ||||||
|  | 
 | ||||||
|  | 	err = store.Put(ctx, k, []byte(c.value)) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return fmt.Errorf("failed to overwrite entry for key %s: %v", c.key, err) | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
|  | 	logg.InfoCtxf(ctx, "overwrote data", "sessionId", c.sessionId, "key", c.key, "value", c.value) | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | // keysOf returns a list of keys from the symbolic map for error messages
 | ||||||
|  | func keysOf(m map[string]storedb.DataTyp) []string { | ||||||
|  | 	keys := make([]string, 0, len(m)) | ||||||
|  | 	for k := range m { | ||||||
|  | 		keys = append(keys, k) | ||||||
|  | 	} | ||||||
|  | 	return keys | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Cmd) parseCmdAdmin(cmd string, param string, more []string) (bool, error) { | func (c *Cmd) parseCmdAdmin(cmd string, param string, more []string) (bool, error) { | ||||||
| 	if cmd == "admin" { | 	if cmd == "admin" { | ||||||
| 		if param == "1" { | 		if param == "1" { | ||||||
| @ -216,6 +266,19 @@ func (c *Cmd) parseCmdClone(cmd string, param string, more []string) (bool, erro | |||||||
| 	return false, nil | 	return false, nil | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | func (c *Cmd) parseCmdOverwrite(cmd string, param string, more []string) (bool, error) { | ||||||
|  | 	if cmd == "overwrite" { | ||||||
|  | 		if len(more) < 1 { | ||||||
|  | 			return false, fmt.Errorf("overwrite requires key and value") | ||||||
|  | 		} | ||||||
|  | 		c.key = param | ||||||
|  | 		c.value = more[0] | ||||||
|  | 		c.exec = c.execOverwrite | ||||||
|  | 		return true, nil | ||||||
|  | 	} | ||||||
|  | 	return false, nil | ||||||
|  | } | ||||||
|  | 
 | ||||||
| func (c *Cmd) Parse(args []string) error { | func (c *Cmd) Parse(args []string) error { | ||||||
| 	var param string | 	var param string | ||||||
| 	if len(args) < 1 { | 	if len(args) < 1 { | ||||||
| @ -259,5 +322,13 @@ func (c *Cmd) Parse(args []string) error { | |||||||
| 		return nil | 		return nil | ||||||
| 	} | 	} | ||||||
| 
 | 
 | ||||||
|  | 	r, err = c.parseCmdOverwrite(cmd, param, args) | ||||||
|  | 	if err != nil { | ||||||
|  | 		return err | ||||||
|  | 	} | ||||||
|  | 	if r { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 
 | ||||||
| 	return fmt.Errorf("unknown subcommand: %s", cmd) | 	return fmt.Errorf("unknown subcommand: %s", cmd) | ||||||
| } | } | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user