Skip to content

Commit

Permalink
add support for insert_one mutation (#22)
Browse files Browse the repository at this point in the history
  • Loading branch information
imperfect-fourth authored Sep 18, 2024
1 parent 2f7a3a6 commit 6b3cc7d
Show file tree
Hide file tree
Showing 3 changed files with 132 additions and 0 deletions.
29 changes: 29 additions & 0 deletions cmd/eywagen/eywatest/eywa_test.go
Original file line number Diff line number Diff line change
@@ -1,9 +1,11 @@
package eywatest

import (
"fmt"
"os"
"testing"

"github.com/google/uuid"
"github.com/imperfect-fourth/eywa"
"github.com/stretchr/testify/assert"
)
Expand Down Expand Up @@ -125,3 +127,30 @@ name
assert.Equal(t, []testTable{{ID: n, Name: "updatetest"}}, resp)
}
}

func TestInsertOneQuery(t *testing.T) {
id := uuid.New()
q := eywa.InsertOne(
testTable2_IDField(id),
).Select(
testTable2_ID,
)
expected := fmt.Sprintf(`mutation insert_test_table2_one {
insert_test_table2_one(object: {id: "%s"}) {
id
}
}`, id.String())

if assert.Equal(t, expected, q.Query()) {
accessKey := os.Getenv("TEST_HGE_ACCESS_KEY")
c := eywa.NewClient("https://aware-cowbird-80.hasura.app/v1/graphql", &eywa.ClientOpts{
Headers: map[string]string{
"x-hasura-access-key": accessKey,
},
})

resp, err := q.Exec(c)
assert.NoError(t, err)
assert.Equal(t, &testTable2{ID: id}, resp)
}
}
89 changes: 89 additions & 0 deletions insert_one.go
Original file line number Diff line number Diff line change
@@ -0,0 +1,89 @@
package eywa

import (
"encoding/json"
"fmt"
)

func InsertOne[M Model, MP ModelPtr[M]](field ModelField[M], fields ...ModelField[M]) InsertOneQueryBuilder[M, ModelFieldName[M], ModelField[M]] {
arr := fieldArr[M, ModelField[M]](fields)
arr = append(arr, field)
return InsertOneQueryBuilder[M, ModelFieldName[M], ModelField[M]]{
QuerySkeleton: QuerySkeleton[M, ModelFieldName[M], ModelField[M]]{
ModelName: (*new(M)).ModelName(),
// fields: append(fields, field),
queryArgs: queryArgs[M, ModelFieldName[M], ModelField[M]]{
object: &object[M, ModelField[M]]{arr},
},
},
}
}

type InsertOneQueryBuilder[M Model, FN FieldName[M], F Field[M]] struct {
QuerySkeleton[M, FN, F]
}

func (iq *InsertOneQueryBuilder[M, FN, F]) MarshalGQL() string {
return fmt.Sprintf(
"insert_%s_one%s",
iq.QuerySkeleton.ModelName,
iq.queryArgs.MarshalGQL(),
)
}

func (iq InsertOneQueryBuilder[M, FN, F]) Select(field FN, fields ...FN) InsertOneQuery[M, FN, F] {
return InsertOneQuery[M, FN, F]{
iq: &iq,
fields: append(fields, field),
}
}

type InsertOneQuery[M Model, FN FieldName[M], F Field[M]] struct {
iq *InsertOneQueryBuilder[M, FN, F]
fields []FN
}

func (iq InsertOneQuery[M, FN, F]) MarshalGQL() string {
return fmt.Sprintf(
"%s {\n%s\n}",
iq.iq.MarshalGQL(),
FieldNameArr[M, FN](iq.fields).MarshalGQL(),
)
}

func (iq InsertOneQuery[M, FN, F]) Query() string {
return fmt.Sprintf(
"mutation insert_%s_one%s {\n%s\n}",
iq.iq.ModelName,
iq.iq.queryVars.MarshalGQL(),
iq.MarshalGQL(),
)
}

func (iq InsertOneQuery[M, FN, F]) Variables() map[string]interface{} {
vars := map[string]interface{}{}
for _, var_ := range iq.iq.queryVars {
vars[var_.name] = var_.value.Value()
}
return vars
}

func (iq InsertOneQuery[M, FN, F]) Exec(client *Client) (*M, error) {
respBytes, err := client.Do(iq)
if err != nil {
return nil, err
}

type graphqlResponse struct {
Data map[string]*M `json:"data"`
Errors []GraphQLError `json:"errors"`
}

respObj := graphqlResponse{}

err = json.NewDecoder(respBytes).Decode(&respObj)
if err != nil {
return nil, err
}
return respObj.Data[fmt.Sprintf("insert_%s_one", iq.iq.ModelName)], nil
}
14 changes: 14 additions & 0 deletions query_arg.go
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@ type queryArgs[M Model, FN FieldName[M], F Field[M]] struct {
where *where
orderBy *orderBy
set *set[M, F]
object *object[M, F]
}

func (qa queryArgs[M, FN, F]) MarshalGQL() string {
Expand All @@ -23,6 +24,7 @@ func (qa queryArgs[M, FN, F]) MarshalGQL() string {
args = appendArg(args, qa.where)
args = appendArg(args, qa.orderBy)
args = appendArg(args, qa.set)
args = appendArg(args, qa.object)

return fmt.Sprintf("(%s)", strings.Join(args, ", "))
}
Expand Down Expand Up @@ -254,3 +256,15 @@ func (oba orderBy) MarshalGQL() string {
}
return fmt.Sprintf("%s: {%s}", oba.queryArgName(), strings.Join(stringArr, ", "))
}

type object[M Model, F Field[M]] struct {
fields fieldArr[M, F]
}

func (o object[M, F]) queryArgName() string {
return "object"
}

func (o object[M, F]) MarshalGQL() string {
return fmt.Sprintf("%s: {%s}", o.queryArgName(), o.fields.MarshalGQL())
}

0 comments on commit 6b3cc7d

Please sign in to comment.