@@ -3,7 +3,91 @@ export copySession!
3
3
# Please be careful with these
4
4
# With great power comes great "Oh crap, I deleted everything..."
5
5
export clearSession!!, clearRobot!!, clearUser!!
6
+ export createSession, createRobot, createUser
7
+ export existsSession, existsRobot, existsUser
8
+ export getSession, getRobot, getUser
9
+ export updateSession, updateRobot, updateUser
10
+ export listSessions, listRobots, listUsers
6
11
12
+ function _isValid (abstractNode:: N ):: Bool where N <: AbstractCGNode
13
+ invalidIds = [" USER" , " ROBOT" , " SESSION" , " VARIABLE" , " FACTOR" , " ENVIRONMENT" ]
14
+ return all (t -> t != uppercase (String (abstractNode. id)), invalidIds)
15
+ end
16
+
17
+ # Fastest way I can think to convert the data into a dict
18
+ # TODO : Probably should be made more efficient...definitely should be made more efficient
19
+ function _convertNodeToDict (abstractNode:: N ):: Dict{String, Any} where N <: AbstractCGNode
20
+ cp = deepcopy (abstractNode)
21
+ data = length (cp. data) != 0 ? JSON2. write (cp. data) : " {}"
22
+ ser = JSON2. read (JSON2. write (abstractNode), Dict{String, Any})
23
+ ser[" data" ] = data
24
+ return ser
25
+ end
26
+
27
+ # TODO : Refactor, #HACK :D (but it works!)
28
+ function _convertDictToSession (dict:: Dict{String, Any} ):: Session
29
+ sessionData = JSON2. read (dict[" data" ], Dict{Symbol, String})
30
+ session = Session (
31
+ Symbol (dict[" id" ]),
32
+ Symbol (dict[" robotId" ]),
33
+ Symbol (dict[" userId" ]),
34
+ dict[" name" ],
35
+ dict[" description" ],
36
+ sessionData)
37
+ return session
38
+ end
39
+
40
+ function createUser (dfg:: CloudGraphsDFG , user:: User ):: User
41
+ Symbol (dfg. userId) != user. id && error (" DFG user ID must match user's ID" )
42
+ ! _isValid (user) && error (" Node cannot have an ID '$(user. id) '." )
43
+
44
+ props = _convertNodeToDict (user)
45
+ retNode = _createNode (dfg. neo4jInstance, [" USER" , String (user. id)], props, nothing )
46
+ return user
47
+ end
48
+
49
+ function createRobot (dfg:: CloudGraphsDFG , robot:: Robot ):: Robot
50
+ Symbol (dfg. robotId) != robot. id && error (" DFG robot ID must match robot's ID" )
51
+ Symbol (dfg. userId) != robot. userId && error (" DFG user ID must match robot's user ID" )
52
+ ! _isValid (robot) && error (" Node cannot have an ID '$(robot. id) '." )
53
+
54
+ # Find the parent
55
+ parents = _getNeoNodesFromCyphonQuery (dfg. neo4jInstance, " (node:USER:$(dfg. userId) )" )
56
+ length (parents) == 0 && error (" Cannot find user '$(dfg. userId) '" )
57
+ length (parents) > 1 && error (" Found multiple users '$(dfg. userId) '" )
58
+
59
+ # Already exists?
60
+ length (_getNeoNodesFromCyphonQuery (dfg. neo4jInstance, " (node:ROBOT:$(dfg. userId) :$(robot. id) )" )) != 0 &&
61
+ error (" Robot '$(robot. id) ' already exists for user '$(robot. userId) '" )
62
+
63
+ props = _convertNodeToDict (robot)
64
+ retNode = _createNode (dfg. neo4jInstance, [" ROBOT" , String (robot. userId), String (robot. id)], props, parents[1 ], :ROBOT )
65
+ return robot
66
+ end
67
+
68
+ function createSession (dfg:: CloudGraphsDFG , session:: Session ):: Session
69
+ Symbol (dfg. robotId) != session. robotId && error (" DFG robot ID must match session's robot ID" )
70
+ Symbol (dfg. userId) != session. userId && error (" DFG user ID must match session's->robot's->user ID" )
71
+ ! _isValid (session) && error (" Node cannot have an ID '$(session. id) '." )
72
+
73
+ # Find the parent
74
+ parents = _getNeoNodesFromCyphonQuery (dfg. neo4jInstance, " (node:ROBOT:$(dfg. robotId) :$(dfg. userId) )" )
75
+ length (parents) == 0 && error (" Cannot find robot '$(dfg. robotId) ' for user '$(dfg. userId) '" )
76
+ length (parents) > 1 && error (" Found multiple robots '$(dfg. robotId) ' for user '$(dfg. userId) '" )
77
+
78
+ # Already exists?
79
+ length (_getNeoNodesFromCyphonQuery (dfg. neo4jInstance, " (node:SESSION:$(session. userId) :$(session. robotId) :$(session. id) )" )) != 0 &&
80
+ error (" Session '$(session. id) ' already exists for robot '$(session. robotId) ' and user '$(session. userId) '" )
81
+
82
+ props = _convertNodeToDict (session)
83
+ retNode = _createNode (dfg. neo4jInstance, [" SESSION" , String (session. userId), String (session. robotId), String (session. id)], props, parents[1 ], :SESSION )
84
+ return session
85
+ end
86
+
87
+ function listSessions (dfg:: CloudGraphsDFG ):: Vector{Session}
88
+ sessionNodes = _getNeoNodesFromCyphonQuery (dfg. neo4jInstance, " (node:SESSION:$(dfg. robotId) :$(dfg. userId) )" )
89
+ return map (s -> _convertDictToSession (Neo4j. getnodeproperties (s)), sessionNodes)
90
+ end
7
91
8
92
"""
9
93
$(SIGNATURES)
0 commit comments