github.com/onflow/flow-go@v0.35.7-crescendo-preview.23-atree-inlining/admin/commands/state_synchronization/read_execution_data.go (about) 1 package state_synchronization 2 3 import ( 4 "context" 5 "encoding/hex" 6 "fmt" 7 8 "github.com/onflow/flow-go/admin" 9 "github.com/onflow/flow-go/admin/commands" 10 "github.com/onflow/flow-go/model/flow" 11 "github.com/onflow/flow-go/module/executiondatasync/execution_data" 12 ) 13 14 var _ commands.AdminCommand = (*ReadExecutionDataCommand)(nil) 15 16 type requestData struct { 17 rootID flow.Identifier 18 } 19 20 type ReadExecutionDataCommand struct { 21 executionDataStore execution_data.ExecutionDataStore 22 } 23 24 func (r *ReadExecutionDataCommand) Handler(ctx context.Context, req *admin.CommandRequest) (interface{}, error) { 25 data := req.ValidatorData.(*requestData) 26 27 ed, err := r.executionDataStore.Get(ctx, data.rootID) 28 29 if err != nil { 30 return nil, fmt.Errorf("failed to get execution data: %w", err) 31 } 32 33 return commands.ConvertToMap(ed) 34 } 35 36 // Validator validates the request. 37 // Returns admin.InvalidAdminReqError for invalid/malformed requests. 38 func (r *ReadExecutionDataCommand) Validator(req *admin.CommandRequest) error { 39 input, ok := req.Data.(map[string]interface{}) 40 if !ok { 41 return admin.NewInvalidAdminReqFormatError("expected map[string]any") 42 } 43 44 id, ok := input["execution_data_id"] 45 if !ok { 46 return admin.NewInvalidAdminReqErrorf("missing required field 'execution_data_id") 47 } 48 49 data := &requestData{} 50 51 idStr, ok := id.(string) 52 if !ok { 53 return admin.NewInvalidAdminReqParameterError("execution_data_id", "must be a string", id) 54 } 55 56 if len(idStr) == 2*flow.IdentifierLen { 57 b, err := hex.DecodeString(idStr) 58 if err != nil { 59 return admin.NewInvalidAdminReqParameterError("execution_data_id", "must be 64-char hex string", id) 60 } 61 data.rootID = flow.HashToID(b) 62 } else { 63 return admin.NewInvalidAdminReqParameterError("execution_data_id", "must be 64-char hex string", id) 64 } 65 66 req.ValidatorData = data 67 68 return nil 69 } 70 71 func NewReadExecutionDataCommand(store execution_data.ExecutionDataStore) commands.AdminCommand { 72 return &ReadExecutionDataCommand{ 73 store, 74 } 75 }