-
Notifications
You must be signed in to change notification settings - Fork 8
/
noderesolver.go
122 lines (114 loc) · 2.52 KB
/
noderesolver.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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
package schema
import (
"context"
"errors"
"github.com/firstcontributions/backend/internal/storemanager"
"github.com/graph-gophers/graphql-go"
)
type NodeType uint8
const (
NodeTypeUnknown NodeType = iota
NodeTypeBadge
NodeTypeComment
NodeTypeIssue
NodeTypeReaction
NodeTypeStory
NodeTypeUser
)
type Node interface {
ID(context.Context) graphql.ID
}
type NodeResolver struct {
Node
}
type NodeIDInput struct {
ID graphql.ID
}
func (r *Resolver) Node(ctx context.Context, in NodeIDInput) (*NodeResolver, error) {
store := storemanager.FromContext(ctx)
id, err := ParseGraphqlID(in.ID)
if err != nil {
return nil, err
}
switch id.NodeType() {
case NodeTypeBadge:
badgeData, err := store.UsersStore.GetBadgeByID(ctx, id.ID)
if err != nil {
return nil, err
}
badgeNode := NewBadge(badgeData)
return &NodeResolver{
Node: badgeNode,
}, nil
case NodeTypeComment:
commentData, err := store.StoriesStore.GetCommentByID(ctx, id.ID)
if err != nil {
return nil, err
}
commentNode := NewComment(commentData)
return &NodeResolver{
Node: commentNode,
}, nil
case NodeTypeIssue:
issueData, err := store.IssuesStore.GetIssueByID(ctx, id.ID)
if err != nil {
return nil, err
}
issueNode := NewIssue(issueData)
return &NodeResolver{
Node: issueNode,
}, nil
case NodeTypeReaction:
reactionData, err := store.StoriesStore.GetReactionByID(ctx, id.ID)
if err != nil {
return nil, err
}
reactionNode := NewReaction(reactionData)
return &NodeResolver{
Node: reactionNode,
}, nil
case NodeTypeStory:
storyData, err := store.StoriesStore.GetStoryByID(ctx, id.ID)
if err != nil {
return nil, err
}
storyNode := NewStory(storyData)
return &NodeResolver{
Node: storyNode,
}, nil
case NodeTypeUser:
userData, err := store.UsersStore.GetUserByID(ctx, id.ID)
if err != nil {
return nil, err
}
userNode := NewUser(userData)
return &NodeResolver{
Node: userNode,
}, nil
}
return nil, errors.New("invalid ID")
}
func (n *NodeResolver) ToBadge() (*Badge, bool) {
t, ok := n.Node.(*Badge)
return t, ok
}
func (n *NodeResolver) ToComment() (*Comment, bool) {
t, ok := n.Node.(*Comment)
return t, ok
}
func (n *NodeResolver) ToIssue() (*Issue, bool) {
t, ok := n.Node.(*Issue)
return t, ok
}
func (n *NodeResolver) ToReaction() (*Reaction, bool) {
t, ok := n.Node.(*Reaction)
return t, ok
}
func (n *NodeResolver) ToStory() (*Story, bool) {
t, ok := n.Node.(*Story)
return t, ok
}
func (n *NodeResolver) ToUser() (*User, bool) {
t, ok := n.Node.(*User)
return t, ok
}