-
Notifications
You must be signed in to change notification settings - Fork 1.6k
/
nodes_controller.go
74 lines (62 loc) · 1.75 KB
/
nodes_controller.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
package web
import (
"net/http"
"github.com/gin-gonic/gin"
"github.com/manyminds/api2go/jsonapi"
"github.com/smartcontractkit/chainlink/v2/core/chains"
"github.com/smartcontractkit/chainlink/v2/core/logger/audit"
)
type NodesController interface {
// Index lists nodes, and optionally filters by chain id.
Index(c *gin.Context, size, page, offset int)
}
type nodesController[I chains.ID, N chains.Node, R jsonapi.EntityNamer] struct {
nodeSet chains.Nodes[I, N]
parseChainID func(string) (I, error)
errNotEnabled error
newResource func(N) R
auditLogger audit.AuditLogger
}
func newNodesController[I chains.ID, N chains.Node, R jsonapi.EntityNamer](
nodeSet chains.Nodes[I, N],
errNotEnabled error,
parseChainID func(string) (I, error),
newResource func(N) R,
auditLogger audit.AuditLogger,
) NodesController {
return &nodesController[I, N, R]{
nodeSet: nodeSet,
errNotEnabled: errNotEnabled,
parseChainID: parseChainID,
newResource: newResource,
auditLogger: auditLogger,
}
}
func (n *nodesController[I, N, R]) Index(c *gin.Context, size, page, offset int) {
if n.nodeSet == nil {
jsonAPIError(c, http.StatusBadRequest, n.errNotEnabled)
return
}
id := c.Param("ID")
var nodes []N
var count int
var err error
if id == "" {
// fetch all nodes
nodes, count, err = n.nodeSet.GetNodes(c, offset, size)
} else {
// fetch nodes for chain ID
chainID, err2 := n.parseChainID(id)
if err2 != nil {
jsonAPIError(c, http.StatusBadRequest, err2)
return
}
nodes, count, err = n.nodeSet.GetNodesForChain(c, chainID, offset, size)
}
var resources []R
for _, node := range nodes {
res := n.newResource(node)
resources = append(resources, res)
}
paginatedResponse(c, "node", size, page, resources, count, err)
}