RedisGraph with GraphQL (gqlgen) playground
package graph

// This file will be automatically regenerated based on the schema, any resolver implementations
// will be copied through when generating and any unknown code will be moved to the end.

import (
	"context"
	"fmt"

	rg "github.com/RedisGraph/redisgraph-go"
	"github.com/google/uuid"

	"git.sr.ht/~voroskoi/todo-redis/graph/generated"
	"git.sr.ht/~voroskoi/todo-redis/graph/model"
)

type redisProps map[string]interface{}

const (
	todoLabel = "TODO"
	userLabel = "USER"
)

const (
	ownerRelation = "OWNER"
)

func (r *mutationResolver) CreateTodo(ctx context.Context, input model.NewTodo) (*model.Todo, error) {
	// create todo node
	id := uuid.NewString()
	todo := rg.NodeNew(todoLabel, id,
		redisProps{
			"text": input.Text,
			"user": input.UserID})
	r.graph.AddNode(todo)

	// create edge connecting the node and owner
	owner := rg.EdgeNew(ownerRelation, todo, r.graph.Nodes[input.UserID], nil)
	r.graph.AddEdge(owner)
	if _, err := r.graph.Commit(); err != nil {
		return nil, fmt.Errorf("CreateTodo: %w", err)
	}
	return &model.Todo{
		ID: id,
		Properties: redisProps{
			"text": input.Text,
		},
		UserID: input.UserID,
	}, nil
}

func (r *queryResolver) Todos(ctx context.Context) ([]model.Todo, error) {
	res, err := r.graph.Query("(:" + todoLabel + ")")
	if err != nil {
		return nil, fmt.Errorf("Todos: %w", err)
	}
	var ret []model.Todo
	for r := res.Record(); res.Next(); r = res.Record() {
		todo, err := TodoParse(r)
		if err != nil {
			return nil, fmt.Errorf("Todos: %w", err)
		}
		ret = append(ret, *todo)
	}
	return ret, nil
}

func (r *todoResolver) User(ctx context.Context, obj *model.Todo) (*model.User, error) {
	return nil, fmt.Errorf("not implemented")
}

// Mutation returns generated.MutationResolver implementation.
func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }

// Query returns generated.QueryResolver implementation.
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }

// Todo returns generated.TodoResolver implementation.
func (r *Resolver) Todo() generated.TodoResolver { return &todoResolver{r} }

type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }
type todoResolver struct{ *Resolver }