-
Notifications
You must be signed in to change notification settings - Fork 0
/
mutation.go
69 lines (57 loc) · 1.97 KB
/
mutation.go
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
package rest
import (
"context"
"encoding/json"
"fmt"
"github.com/hasura/ndc-sdk-go/schema"
)
// Mutation executes a mutation.
func (c *RESTConnector) Mutation(ctx context.Context, configuration *Configuration, state *State, request *schema.MutationRequest) (*schema.MutationResponse, error) {
operationResults := make([]schema.MutationOperationResults, len(request.Operations))
for i, operation := range request.Operations {
switch operation.Type {
case schema.MutationOperationProcedure:
result, err := c.execProcedure(ctx, &operation)
if err != nil {
return nil, err
}
operationResults[i] = result
default:
return nil, schema.BadRequestError(fmt.Sprintf("invalid operation type: %s", operation.Type), nil)
}
}
return &schema.MutationResponse{
OperationResults: operationResults,
}, nil
}
func (c *RESTConnector) execProcedure(ctx context.Context, operation *schema.MutationOperation) (schema.MutationOperationResults, error) {
procedure, err := c.metadata.GetProcedure(operation.Name)
if err != nil {
return nil, err
}
// 1. resolve arguments, evaluate URL and query parameters
var rawArgs map[string]any
if err := json.Unmarshal(operation.Arguments, &rawArgs); err != nil {
return nil, schema.BadRequestError("failed to decode arguments", map[string]any{
"cause": err.Error(),
})
}
endpoint, headers, err := c.evalURLAndHeaderParameters(procedure.Request, procedure.Arguments, rawArgs)
if err != nil {
return nil, schema.BadRequestError("failed to evaluate URL and Headers from parameters", map[string]any{
"cause": err.Error(),
})
}
// 2. create and execute request
// 3. evaluate response selection
procedure.Request.URL = endpoint
httpRequest, err := c.createRequest(procedure.Request, headers, rawArgs)
if err != nil {
return nil, err
}
result, err := c.client.Send(ctx, httpRequest, operation.Fields, procedure.ResultType)
if err != nil {
return nil, err
}
return schema.NewProcedureResult(result).Encode(), nil
}