package graph
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) {
id := uuid.NewString()
todo := rg.NodeNew(todoLabel, id,
redisProps{
"text": input.Text,
"user": input.UserID})
r.graph.AddNode(todo)
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")
}
func (r *Resolver) Mutation() generated.MutationResolver { return &mutationResolver{r} }
func (r *Resolver) Query() generated.QueryResolver { return &queryResolver{r} }
func (r *Resolver) Todo() generated.TodoResolver { return &todoResolver{r} }
type mutationResolver struct{ *Resolver }
type queryResolver struct{ *Resolver }
type todoResolver struct{ *Resolver }