@wxn0brp/db 0.0.5 → 0.0.6

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (226) hide show
  1. package/README.md +3 -0
  2. package/dist/cjs/CollectionManager.d.ts +43 -0
  3. package/dist/cjs/CollectionManager.js +59 -0
  4. package/dist/cjs/action.d.ts +71 -0
  5. package/dist/cjs/action.js +199 -0
  6. package/dist/cjs/database.d.ts +77 -0
  7. package/dist/cjs/database.js +118 -0
  8. package/dist/cjs/executor.d.ts +28 -0
  9. package/{executor.js → dist/cjs/executor.js} +47 -54
  10. package/dist/cjs/file/find.d.ts +11 -0
  11. package/dist/cjs/file/find.js +80 -0
  12. package/dist/cjs/file/index.d.ts +3 -0
  13. package/dist/cjs/file/index.js +25 -0
  14. package/dist/cjs/file/remove.d.ts +7 -0
  15. package/dist/cjs/file/remove.js +61 -0
  16. package/dist/cjs/file/update.d.ts +7 -0
  17. package/dist/cjs/file/update.js +68 -0
  18. package/dist/cjs/file/utils.d.ts +8 -0
  19. package/dist/cjs/file/utils.js +23 -0
  20. package/dist/cjs/format.d.ts +18 -0
  21. package/dist/cjs/format.js +36 -0
  22. package/dist/cjs/gen.d.ts +5 -0
  23. package/dist/cjs/gen.js +78 -0
  24. package/dist/cjs/graph.d.ts +47 -0
  25. package/dist/cjs/graph.js +90 -0
  26. package/{index.d.ts → dist/cjs/index.d.ts} +2 -2
  27. package/dist/cjs/index.js +18 -0
  28. package/dist/cjs/relation.d.ts +64 -0
  29. package/{relation.js → dist/cjs/relation.js} +26 -45
  30. package/dist/cjs/remote/client/database.d.ts +71 -0
  31. package/dist/cjs/remote/client/database.js +145 -0
  32. package/dist/cjs/remote/client/function.d.ts +5 -0
  33. package/dist/cjs/remote/client/function.js +32 -0
  34. package/dist/cjs/remote/client/graph.d.ts +54 -0
  35. package/dist/cjs/remote/client/graph.js +93 -0
  36. package/dist/cjs/remote/client/remote.d.ts +16 -0
  37. package/dist/cjs/remote/client/remote.js +2 -0
  38. package/dist/cjs/remote/server/auth.d.ts +31 -0
  39. package/dist/cjs/remote/server/auth.js +99 -0
  40. package/dist/cjs/remote/server/db.d.ts +2 -0
  41. package/dist/cjs/remote/server/db.js +223 -0
  42. package/dist/cjs/remote/server/function.d.ts +2 -0
  43. package/dist/cjs/remote/server/function.js +89 -0
  44. package/dist/cjs/remote/server/graph.d.ts +2 -0
  45. package/dist/cjs/remote/server/graph.js +145 -0
  46. package/dist/cjs/remote/server/index.d.ts +1 -0
  47. package/dist/cjs/remote/server/index.js +66 -0
  48. package/dist/cjs/remote/server/initDataBases.d.ts +1 -0
  49. package/dist/cjs/remote/server/initDataBases.js +25 -0
  50. package/dist/cjs/remote/server/pathUtils.d.ts +1 -0
  51. package/dist/cjs/remote/server/pathUtils.js +12 -0
  52. package/dist/cjs/remote/server/secret.d.ts +1 -0
  53. package/dist/cjs/remote/server/secret.js +25 -0
  54. package/dist/cjs/remote/serverMgmt/index.d.ts +1 -0
  55. package/dist/cjs/remote/serverMgmt/index.js +87 -0
  56. package/dist/cjs/types/Id.d.ts +3 -0
  57. package/dist/cjs/types/Id.js +2 -0
  58. package/dist/cjs/types/arg.d.ts +6 -0
  59. package/dist/cjs/types/arg.js +2 -0
  60. package/dist/cjs/types/data.d.ts +4 -0
  61. package/dist/cjs/types/data.js +2 -0
  62. package/dist/cjs/types/options.d.ts +12 -0
  63. package/dist/cjs/types/options.js +2 -0
  64. package/dist/cjs/types/searchOpts.d.ts +61 -0
  65. package/dist/cjs/types/searchOpts.js +8 -0
  66. package/dist/cjs/types/types.d.ts +6 -0
  67. package/dist/cjs/types/types.js +2 -0
  68. package/dist/cjs/utils/hasFields.d.ts +8 -0
  69. package/dist/cjs/utils/hasFields.js +22 -0
  70. package/dist/cjs/utils/hasFieldsAdvanced.d.ts +5 -0
  71. package/dist/cjs/utils/hasFieldsAdvanced.js +182 -0
  72. package/dist/cjs/utils/updateFindObject.d.ts +11 -0
  73. package/dist/cjs/utils/updateFindObject.js +32 -0
  74. package/dist/cjs/utils/updateObject.d.ts +8 -0
  75. package/dist/cjs/utils/updateObject.js +18 -0
  76. package/dist/esm/CollectionManager.d.ts +43 -0
  77. package/dist/esm/CollectionManager.js +57 -0
  78. package/dist/esm/action.d.ts +71 -0
  79. package/dist/esm/action.js +194 -0
  80. package/dist/esm/database.d.ts +77 -0
  81. package/dist/esm/database.js +113 -0
  82. package/dist/esm/executor.d.ts +28 -0
  83. package/dist/esm/executor.js +45 -0
  84. package/dist/esm/file/find.d.ts +11 -0
  85. package/dist/esm/file/find.js +73 -0
  86. package/dist/esm/file/index.d.ts +3 -0
  87. package/{file → dist/esm/file}/index.js +1 -1
  88. package/dist/esm/file/remove.d.ts +7 -0
  89. package/dist/esm/file/remove.js +56 -0
  90. package/dist/esm/file/update.d.ts +7 -0
  91. package/dist/esm/file/update.js +63 -0
  92. package/dist/esm/file/utils.d.ts +8 -0
  93. package/{file → dist/esm/file}/utils.js +3 -11
  94. package/dist/esm/format.d.ts +18 -0
  95. package/{format.js → dist/esm/format.js} +29 -29
  96. package/dist/esm/gen.d.ts +5 -0
  97. package/dist/esm/gen.js +75 -0
  98. package/dist/esm/graph.d.ts +47 -0
  99. package/dist/esm/graph.js +85 -0
  100. package/dist/esm/index.d.ts +7 -0
  101. package/{index.js → dist/esm/index.js} +1 -9
  102. package/dist/esm/relation.d.ts +64 -0
  103. package/dist/esm/relation.js +65 -0
  104. package/dist/esm/remote/client/database.d.ts +71 -0
  105. package/dist/esm/remote/client/database.js +140 -0
  106. package/dist/esm/remote/client/function.d.ts +5 -0
  107. package/dist/esm/remote/client/function.js +30 -0
  108. package/dist/esm/remote/client/graph.d.ts +54 -0
  109. package/dist/esm/remote/client/graph.js +88 -0
  110. package/dist/esm/remote/client/remote.d.ts +16 -0
  111. package/dist/esm/remote/client/remote.js +1 -0
  112. package/dist/esm/remote/server/auth.d.ts +31 -0
  113. package/{remote → dist/esm/remote}/server/auth.js +31 -44
  114. package/dist/esm/remote/server/db.d.ts +2 -0
  115. package/dist/esm/remote/server/db.js +218 -0
  116. package/dist/esm/remote/server/function.d.ts +2 -0
  117. package/dist/esm/remote/server/function.js +87 -0
  118. package/dist/esm/remote/server/graph.d.ts +2 -0
  119. package/{remote → dist/esm/remote}/server/graph.js +62 -55
  120. package/dist/esm/remote/server/gui/css/main.css +130 -0
  121. package/dist/esm/remote/server/gui/css/scrool.css +81 -0
  122. package/dist/esm/remote/server/gui/css/style.css +61 -0
  123. package/dist/esm/remote/server/gui/favicon.svg +12 -0
  124. package/dist/esm/remote/server/gui/html/data.html +15 -0
  125. package/dist/esm/remote/server/gui/html/main.html +46 -0
  126. package/dist/esm/remote/server/gui/html/nav.html +25 -0
  127. package/dist/esm/remote/server/gui/html/popup.html +51 -0
  128. package/dist/esm/remote/server/gui/index.html +49 -0
  129. package/dist/esm/remote/server/gui/js/api.js +166 -0
  130. package/dist/esm/remote/server/gui/js/index.js +17 -0
  131. package/dist/esm/remote/server/gui/js/loadHTML.js +16 -0
  132. package/dist/esm/remote/server/gui/js/popUp.js +72 -0
  133. package/dist/esm/remote/server/gui/js/queryApi.js +51 -0
  134. package/dist/esm/remote/server/gui/js/queryDb.js +79 -0
  135. package/dist/esm/remote/server/gui/js/queryGraph.js +144 -0
  136. package/dist/esm/remote/server/gui/js/render.js +64 -0
  137. package/dist/esm/remote/server/gui/js/templates.js +31 -0
  138. package/dist/esm/remote/server/gui/js/utils.js +36 -0
  139. package/dist/esm/remote/server/gui/js/vars.js +9 -0
  140. package/dist/esm/remote/server/gui/libs/core.js +176 -0
  141. package/dist/esm/remote/server/gui/libs/d3.v7.min.js +2 -0
  142. package/dist/esm/remote/server/gui/libs/handlebars.min.js +29 -0
  143. package/dist/esm/remote/server/gui/libs/json5.min.js +1 -0
  144. package/dist/esm/remote/server/index.d.ts +1 -0
  145. package/dist/esm/remote/server/index.js +61 -0
  146. package/dist/esm/remote/server/initDataBases.d.ts +1 -0
  147. package/dist/esm/remote/server/initDataBases.js +20 -0
  148. package/dist/esm/remote/server/pathUtils.d.ts +1 -0
  149. package/{remote → dist/esm/remote}/server/pathUtils.js +2 -3
  150. package/dist/esm/remote/server/secret.d.ts +1 -0
  151. package/{remote → dist/esm/remote}/server/secret.js +3 -7
  152. package/dist/esm/remote/serverMgmt/index.d.ts +1 -0
  153. package/{remote → dist/esm/remote}/serverMgmt/index.js +27 -31
  154. package/dist/esm/types/Id.d.ts +3 -0
  155. package/dist/esm/types/Id.js +1 -0
  156. package/dist/esm/types/arg.d.ts +6 -0
  157. package/dist/esm/types/arg.js +1 -0
  158. package/dist/esm/types/data.d.ts +4 -0
  159. package/dist/esm/types/data.js +1 -0
  160. package/dist/esm/types/options.d.ts +12 -0
  161. package/dist/esm/types/options.js +1 -0
  162. package/dist/esm/types/searchOpts.d.ts +61 -0
  163. package/dist/esm/types/searchOpts.js +7 -0
  164. package/dist/esm/types/types.d.ts +6 -0
  165. package/dist/esm/types/types.js +1 -0
  166. package/dist/esm/utils/hasFields.d.ts +8 -0
  167. package/{utils → dist/esm/utils}/hasFields.js +4 -4
  168. package/dist/esm/utils/hasFieldsAdvanced.d.ts +5 -0
  169. package/dist/esm/utils/hasFieldsAdvanced.js +176 -0
  170. package/dist/esm/utils/updateFindObject.d.ts +11 -0
  171. package/{utils → dist/esm/utils}/updateFindObject.js +11 -16
  172. package/dist/esm/utils/updateObject.d.ts +8 -0
  173. package/{utils → dist/esm/utils}/updateObject.js +4 -4
  174. package/package.json +55 -36
  175. package/CollectionManager.js +0 -119
  176. package/action.js +0 -258
  177. package/database.d.ts +0 -44
  178. package/database.js +0 -203
  179. package/docs/database.md +0 -140
  180. package/docs/graph.md +0 -86
  181. package/docs/relation.md +0 -51
  182. package/docs/remote.md +0 -30
  183. package/docs/remote_server.md +0 -35
  184. package/docs/search_opts.md +0 -227
  185. package/file/find.js +0 -89
  186. package/file/remove.js +0 -74
  187. package/file/update.js +0 -83
  188. package/gen.d.ts +0 -1
  189. package/gen.js +0 -97
  190. package/graph.d.ts +0 -27
  191. package/graph.js +0 -140
  192. package/relation.d.ts +0 -23
  193. package/remote/client/database.d.ts +0 -41
  194. package/remote/client/database.js +0 -228
  195. package/remote/client/graph.d.ts +0 -31
  196. package/remote/client/graph.js +0 -148
  197. package/remote/server/db.js +0 -197
  198. package/remote/server/function.js +0 -43
  199. package/remote/server/index.js +0 -63
  200. package/remote/server/initDataBases.js +0 -20
  201. package/test/hasFieldsAdvanced.test.js +0 -70
  202. package/utils/hasFieldsAdvanced.js +0 -184
  203. /package/{remote → dist/cjs/remote}/server/gui/css/main.css +0 -0
  204. /package/{remote → dist/cjs/remote}/server/gui/css/scrool.css +0 -0
  205. /package/{remote → dist/cjs/remote}/server/gui/css/style.css +0 -0
  206. /package/{remote → dist/cjs/remote}/server/gui/favicon.svg +0 -0
  207. /package/{remote → dist/cjs/remote}/server/gui/html/data.html +0 -0
  208. /package/{remote → dist/cjs/remote}/server/gui/html/main.html +0 -0
  209. /package/{remote → dist/cjs/remote}/server/gui/html/nav.html +0 -0
  210. /package/{remote → dist/cjs/remote}/server/gui/html/popup.html +0 -0
  211. /package/{remote → dist/cjs/remote}/server/gui/index.html +0 -0
  212. /package/{remote → dist/cjs/remote}/server/gui/js/api.js +0 -0
  213. /package/{remote → dist/cjs/remote}/server/gui/js/index.js +0 -0
  214. /package/{remote → dist/cjs/remote}/server/gui/js/loadHTML.js +0 -0
  215. /package/{remote → dist/cjs/remote}/server/gui/js/popUp.js +0 -0
  216. /package/{remote → dist/cjs/remote}/server/gui/js/queryApi.js +0 -0
  217. /package/{remote → dist/cjs/remote}/server/gui/js/queryDb.js +0 -0
  218. /package/{remote → dist/cjs/remote}/server/gui/js/queryGraph.js +0 -0
  219. /package/{remote → dist/cjs/remote}/server/gui/js/render.js +0 -0
  220. /package/{remote → dist/cjs/remote}/server/gui/js/templates.js +0 -0
  221. /package/{remote → dist/cjs/remote}/server/gui/js/utils.js +0 -0
  222. /package/{remote → dist/cjs/remote}/server/gui/js/vars.js +0 -0
  223. /package/{remote → dist/cjs/remote}/server/gui/libs/core.js +0 -0
  224. /package/{remote → dist/cjs/remote}/server/gui/libs/d3.v7.min.js +0 -0
  225. /package/{remote → dist/cjs/remote}/server/gui/libs/handlebars.min.js +0 -0
  226. /package/{remote → dist/cjs/remote}/server/gui/libs/json5.min.js +0 -0
@@ -1,148 +0,0 @@
1
- import got from "got";
2
-
3
- /**
4
- * A class representing a graph database.
5
- * Uses a remote database.
6
- * @class
7
- */
8
- class GraphRemote{
9
- /**
10
- * Create a new database instance.
11
- * @constructor
12
- * @param {object} remote - The remote database object.
13
- * @param {string} remote.name - The name of the database.
14
- * @param {string} remote.auth - The authentication token.
15
- * @param {string} remote.url - The URL of the remote database.
16
- */
17
- constructor(remote){
18
- this.remote = remote;
19
- }
20
-
21
- /**
22
- * Make a request to the remote database.
23
- * @async
24
- * @function
25
- * @param {string} type - The type of the request.
26
- * @param {object} data - The data to send with the request.
27
- * @returns {Promise<*>} A Promise that resolves with the result of the request.
28
- * @throws {Error} If the request failed.
29
- */
30
- async _request(type, data){
31
- data.db = this.remote.name;
32
- const res = await got.post(this.remote.url + "/db/graph/" + type, {
33
- json: data,
34
- headers: {
35
- "Authorization": this.remote.auth
36
- },
37
- responseType: "json"
38
- });
39
-
40
- if(res.body.err) throw new Error(res.body.msg);
41
- return res.body.result;
42
- }
43
-
44
- /**
45
- * Adds an edge between two nodes.
46
- * @async
47
- * @function
48
- * @param {string} collection - The name of the collection.
49
- * @param {string} nodeA - The first node.
50
- * @param {string} nodeB - The second node.
51
- * @returns {Promise<Object>} A promise that resolves with the added edge.
52
- */
53
- async add(collection, nodeA, nodeB){
54
- return await this._request("add", { collection, nodeA, nodeB });
55
- }
56
-
57
- /**
58
- * Removes an edge between two nodes.
59
- * @async
60
- * @function
61
- * @param {string} collection - The name of the collection.
62
- * @param {string} nodeA - The first node.
63
- * @param {string} nodeB - The second node.
64
- * @returns {Promise<boolean>} A promise that resolves when the edge is removed.
65
- */
66
- async remove(collection, nodeA, nodeB){
67
- return await this._request("remove", { collection, nodeA, nodeB });
68
- }
69
-
70
- /**
71
- * Finds all edges with either node equal to `node`.
72
- * @async
73
- * @function
74
- * @param {string} collection - The name of the collection.
75
- * @param {string} node - The node to search for.
76
- * @returns {Promise<Object[]>} A promise that resolves with the found edges.
77
- */
78
- async find(collection, node){
79
- return await this._request("find", { collection, node });
80
- }
81
-
82
- /**
83
- * Finds one edge with either node equal to `nodeA` and the other equal to `nodeB`.
84
- * @async
85
- * @function
86
- * @param {string} collection - The name of the collection.
87
- * @param {string} nodeA - The first node.
88
- * @param {string} nodeB - The second node.
89
- * @returns {Promise<Object|null>} A promise that resolves with the found edge or null if not found.
90
- */
91
- async findOne(collection, nodeA, nodeB){
92
- return await this._request("findOne", { collection, nodeA, nodeB });
93
- }
94
-
95
- /**
96
- * Get all edges in the collection.
97
- * @async
98
- * @function
99
- * @param {string} collection - The name of the collection.
100
- * @returns {Promise<Object[]>} A promise that resolves with the found edges.
101
- */
102
- async getAll(collection){
103
- return await this._request("getAll", { collection });
104
- }
105
-
106
- /**
107
- * Get the names of all available databases.
108
- *
109
- * @function
110
- * @returns {string[]} An array of database names.
111
- */
112
- async getCollections(){
113
- return await this._request("getCollections", {});
114
- }
115
-
116
- /**
117
- * Check and create the specified collection if it doesn't exist.
118
- *
119
- * @function
120
- * @param {string} collection - The collection to check.
121
- */
122
- async checkCollection(collection){
123
- return await this._request("checkCollection", { collection });
124
- }
125
-
126
- /**
127
- * Check if a collection exists.
128
- *
129
- * @function
130
- * @param {string} collection - The name of the collection.
131
- * @returns {boolean} True if the collection exists, false otherwise.
132
- */
133
- async issetCollection(collection){
134
- return await this._request("issetCollection", { collection });
135
- }
136
-
137
- /**
138
- * Remove the specified collection.
139
- *
140
- * @function
141
- * @param {string} collection - The name of the collection.
142
- */
143
- removeCollection(collection){
144
- return this._request("removeCollection", { collection });
145
- }
146
- }
147
-
148
- export default GraphRemote;
@@ -1,197 +0,0 @@
1
- import { Router } from "express";
2
- import parseParam from "./function.js";
3
- import { isPathSafe } from "./pathUtils.js";
4
- const router = Router();
5
-
6
- router.use((req, res, next) => {
7
- if(req.dbType == "database") return next();
8
- return res.status(400).json({ err: true, msg: "Invalid data center type." });
9
- });
10
-
11
- router.post("/getCollections", async (req, res) => {
12
- try{
13
- const db = req.dataCenter;
14
- const result = await db.getCollections();
15
- res.json({ err: false, result });
16
- }catch(err){
17
- console.error(err);
18
- res.status(500).json({ err: true, msg: err.message });
19
- }
20
- });
21
-
22
- router.post("/checkCollection", async (req, res) => {
23
- const { collection } = req.body;
24
- if(!collection) return res.status(400).json({ err: true, msg: "collection is required" });
25
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
26
-
27
- try{
28
- const db = req.dataCenter;
29
- await db.checkCollection(collection);
30
- res.json({ err: false, result: true });
31
- }catch(err){
32
- console.error(err);
33
- res.status(500).json({ err: true, msg: err.message });
34
- }
35
- });
36
-
37
- router.post("/issetCollection", async (req, res) => {
38
- const { collection } = req.body;
39
- if(!collection) return res.status(400).json({ err: true, msg: "collection is required" });
40
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
41
-
42
- try{
43
- const db = req.dataCenter;
44
- const result = await db.issetCollection(collection);
45
- res.json({ err: false, result });
46
- }catch(err){
47
- console.error(err);
48
- res.status(500).json({ err: true, msg: err.message });
49
- }
50
- });
51
-
52
- router.post("/add", async (req, res) => {
53
- const { collection, data } = req.body;
54
- if(!collection || !data) return res.status(400).json({ err: true, msg: "collection & data is required" });
55
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
56
-
57
- try{
58
- const db = req.dataCenter;
59
- const result = await db.add(collection, data, req.body.id_gen || true);
60
- res.json({ err: false, result });
61
- }catch(err){
62
- console.error(err);
63
- res.status(500).json({ err: true, msg: err.message });
64
- }
65
- });
66
-
67
- router.post("/find", async (req, res) => {
68
- const { collection, search, context, options, findOpts } = req.body;
69
- if(!collection || !search) return res.status(400).json({ err: true, msg: "collection & search is required" });
70
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
71
-
72
- try{
73
- const parsedSearch = parseParam(search);
74
- const db = req.dataCenter;
75
- const result = await db.find(collection, parsedSearch, context || {}, options || {}, findOpts || {});
76
- res.json({ err: false, result });
77
- }catch(err){
78
- console.error(err);
79
- res.status(500).json({ err: true, msg: err.message });
80
- }
81
- });
82
-
83
- router.post("/findOne", async (req, res) => {
84
- const { collection, search, context, findOpts } = req.body;
85
- if(!collection || !search) return res.status(400).json({ err: true, msg: "collection & search is required" });
86
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
87
-
88
- try{
89
- const parsedSearch = parseParam(search);
90
- const db = req.dataCenter;
91
- const result = await db.findOne(collection, parsedSearch, context || {}, findOpts || {});
92
- res.json({ err: false, result });
93
- }catch(err){
94
- console.error(err);
95
- res.status(500).json({ err: true, msg: err.message });
96
- }
97
- });
98
-
99
- router.post("/update", async (req, res) => {
100
- const { collection, search, arg, context } = req.body;
101
- if(!collection || !search || !arg) return res.status(400).json({ err: true, msg: "collection & search & arg is required" });
102
-
103
- try{
104
- const parsedSearch = parseParam(search);
105
- const parsedArg = parseParam(arg);
106
- const db = req.dataCenter;
107
- const result = await db.update(collection, parsedSearch, parsedArg, context || {});
108
- res.json({ err: false, result });
109
- }catch(err){
110
- console.error(err);
111
- res.status(500).json({ err: true, msg: err.message });
112
- }
113
- });
114
-
115
- router.post("/updateOne", async (req, res) => {
116
- const { collection, search, arg, context } = req.body;
117
- if(!collection || !search || !arg) return res.status(400).json({ err: true, msg: "collection & search & arg is required" });
118
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
119
-
120
- try{
121
- const parsedSearch = parseParam(search);
122
- const parsedArg = parseParam(arg);
123
- const db = req.dataCenter;
124
- const result = await db.updateOne(collection, parsedSearch, parsedArg, context || {});
125
- res.json({ err: false, result });
126
- }catch(err){
127
- console.error(err);
128
- res.status(500).json({ err: true, msg: err.message });
129
- }
130
- });
131
-
132
- router.post("/remove", async (req, res) => {
133
- const { collection, search, context } = req.body;
134
- if(!collection || !search) return res.status(400).json({ err: true, msg: "collection & search is required" });
135
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
136
-
137
- try{
138
- const parsedSearch = parseParam(search);
139
- const db = req.dataCenter;
140
- const result = await db.remove(collection, parsedSearch, context || {});
141
- res.json({ err: false, result });
142
- }catch(err){
143
- console.error(err);
144
- res.status(500).json({ err: true, msg: err.message });
145
- }
146
- });
147
-
148
- router.post("/removeOne", async (req, res) => {
149
- const { collection, search, context } = req.body;
150
- if(!collection || !search) return res.status(400).json({ err: true, msg: "collection & search is required" });
151
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
152
-
153
- try{
154
- const parsedSearch = parseParam(search);
155
- const db = req.dataCenter;
156
- const result = await db.removeOne(collection, parsedSearch, context || {});
157
- res.json({ err: false, result });
158
- }catch(err){
159
- console.error(err);
160
- res.status(500).json({ err: true, msg: err.message });
161
- }
162
- });
163
-
164
- router.post("/updateOneOrAdd", async (req, res) => {
165
- const { collection, search, arg, add_arg, context, id_gen } = req.body;
166
- if(!collection || !search || !arg) return res.status(400).json({ err: true, msg: "collection & search & arg is required" });
167
- if(!isPathSafe(baseDir, collection)) return res.status(400).json({ err: true, msg: "invalid collection" });
168
-
169
- try{
170
- const parsedSearch = parseParam(search);
171
- const parsedArg = parseParam(arg);
172
- const parsedAddArg = parseParam(add_arg);
173
- const db = req.dataCenter;
174
- const result = await db.updateOneOrAdd(collection, parsedSearch, parsedArg, parsedAddArg || {}, context || {}, id_gen || true);
175
- res.json({ err: false, result });
176
- }catch(err){
177
- console.error(err);
178
- res.status(500).json({ err: true, msg: err.message });
179
- }
180
- });
181
-
182
- router.post("/removeCollection", async (req, res) => {
183
- const { name } = req.body;
184
- if(!name) return res.status(400).json({ err: true, msg: "name is required" });
185
- if(!isPathSafe(baseDir, name)) return res.status(400).json({ err: true, msg: "invalid name" });
186
-
187
- try{
188
- const db = req.dataCenter;
189
- const result = await db.removeCollection(name);
190
- res.json({ err: false, result });
191
- }catch(err){
192
- console.error(err);
193
- res.status(500).json({ err: true, msg: err.message });
194
- }
195
- });
196
-
197
- export default router;
@@ -1,43 +0,0 @@
1
- import { createContext, runInContext } from "node:vm";
2
-
3
- const sandbox = {
4
- console: {
5
- log: console.log,
6
- },
7
- Math,
8
- Date,
9
- setTimeout: undefined,
10
- setInterval: undefined,
11
- setImmediate: undefined,
12
- clearTimeout: undefined,
13
- clearInterval: undefined,
14
- clearImmediate: undefined,
15
- require: undefined,
16
- module: undefined,
17
- exports: undefined,
18
- process: undefined,
19
- Buffer: undefined,
20
- };
21
-
22
- const context = createContext(sandbox);
23
-
24
- function changeStringToFunction(func){
25
- try{
26
- const userFunction = runInContext(`(${func})`, context);
27
- return userFunction;
28
- }catch(e){
29
- throw new Error("Invalid function");
30
- }
31
- }
32
-
33
- function parseParam(param){
34
- if(typeof param === "string"){
35
- const userFunction = changeStringToFunction(param);
36
- if(typeof userFunction !== "function") throw new Error("Invalid function");
37
- return userFunction;
38
- }else{
39
- return param;
40
- }
41
- }
42
-
43
- export default parseParam;
@@ -1,63 +0,0 @@
1
- import express from "express";
2
- import bodyParser from "body-parser";
3
- import { authMiddleware, loginFunction } from "./auth.js";
4
- import dbRouter from "./db.js";
5
- import graphRouter from "./graph.js";
6
- import "./initDataBases.js";
7
- import cors from "cors";
8
- import { configDotenv } from "dotenv";
9
-
10
- configDotenv({ path: ".db.env" });
11
- const port = process.env.PORT || 14785;
12
- global.baseDir = process.env.baseDir || process.cwd();
13
-
14
- console.log("baseDir", baseDir);
15
- global.app = express();
16
- app.get("/", (req, res) => res.send("Server is running."));
17
- app.use(bodyParser.urlencoded({ extended: true }));
18
- app.use(bodyParser.json());
19
- app.use(cors({
20
- origin: "*",
21
- }));
22
-
23
- const apiDbRouter = express.Router();
24
- apiDbRouter.use(authMiddleware);
25
- apiDbRouter.use(checkRequest);
26
-
27
- function checkRequest(req, res, next){
28
- const dbName = req.body.db;
29
-
30
- if(!dataCenter[dbName]){
31
- return res.status(400).json({ err: true, msg: "Invalid data center." });
32
- }
33
-
34
- req.dataCenter = dataCenter[dbName].db;
35
- req.dbType = dataCenter[dbName].type;
36
-
37
- next();
38
- }
39
-
40
- apiDbRouter.use("/database", dbRouter);
41
- apiDbRouter.use("/graph", graphRouter);
42
-
43
- app.use("/db/", apiDbRouter);
44
- app.post("/login", async (req, res) => {
45
- const { login, password } = req.body;
46
- if(!login || !password) return res.json({ err: true, msg: "Login and password are required" });
47
-
48
- const { err, token } = await loginFunction(login, password);
49
- if(err) return res.json({ err: true, msg: "Invalid login or password." });
50
- res.json({ err: false, token });
51
- });
52
-
53
- app.post("/getDbList", authMiddleware, async (req, res) => {
54
- const dbsKeys = Object.keys(dataCenter);
55
- const dbs = dbsKeys.map(dbName => ({ name: dbName, type: dataCenter[dbName].type }));
56
- res.json({ err: false, result: dbs });
57
- });
58
-
59
- if(process.env.gui){
60
- app.use("/gui", express.static(import.meta.dirname + "/gui"));
61
- }
62
-
63
- app.listen(port, () => console.log(`Server started on port ${port}`));
@@ -1,20 +0,0 @@
1
- import DataBase from "../../database.js";
2
- import Graph from "../../graph.js";
3
- global.db = new DataBase("./serverDB");
4
- global.dataCenter = {};
5
-
6
- const databases = await global.db.find("dbs", {});
7
-
8
- for(const db of databases){
9
- if(db.type === "database"){
10
- global.dataCenter[db.name] = {
11
- type: "database",
12
- db: new DataBase(db.folder, db.opts || {})
13
- }
14
- }else if(db.type === "graph"){
15
- global.dataCenter[db.name] = {
16
- type: "graph",
17
- db: new Graph(db.folder, db.opts || {})
18
- }
19
- }
20
- }
@@ -1,70 +0,0 @@
1
- import test from 'ava';
2
- import hasFieldsAdvanced from '../utils/hasFieldsAdvanced.js';
3
-
4
- test('throws error if fields is not an object', t => {
5
- const error = t.throws(() => {
6
- hasFieldsAdvanced({}, null);
7
- }, { instanceOf: Error });
8
- t.is(error.message, 'Fields must be an object');
9
- });
10
-
11
- test('returns true for empty fields', t => {
12
- const result = hasFieldsAdvanced({ a: 1, b: 2 }, {});
13
- t.true(result);
14
- });
15
-
16
- test('validates fields with $and operator', t => {
17
- const obj = { a: 5, b: 10 };
18
- const fields = { $and: [{ $gt: { a: 3 } }, { $lt: { b: 15 } }] };
19
- const result = hasFieldsAdvanced(obj, fields);
20
- t.true(result);
21
- });
22
-
23
- test('validates fields with $or operator', t => {
24
- const obj = { a: 2, b: 10 };
25
- const fields = { $or: [ { a: 5 }, { b: 15 }, { a: 2 }] };
26
- const result = hasFieldsAdvanced(obj, fields);
27
- t.true(result);
28
- });
29
-
30
- test('validates fields with $exists operator', t => {
31
- const obj = { a: 5, b: undefined };
32
- const fields = { $exists: { a: true, c: false } };
33
- const result = hasFieldsAdvanced(obj, fields);
34
- t.true(result);
35
- });
36
-
37
- test('validates comparison operators', t => {
38
- const obj = { a: 10, b: 20 };
39
- const fields = { $gt: { a: 5 }, $lt: { b: 30 } };
40
- const result = hasFieldsAdvanced(obj, fields);
41
- t.true(result);
42
- });
43
-
44
- test('returns false for invalid fields', t => {
45
- const obj = { a: 1, b: 2 };
46
- const fields = { $gt: { a: 2 } };
47
- const result = hasFieldsAdvanced(obj, fields);
48
- t.false(result);
49
- });
50
-
51
- test('validates fields with $type operator', t => {
52
- const obj = { a: 5, b: 'test' };
53
- const fields = { $type: { a: 'number', b: 'string' } };
54
- const result = hasFieldsAdvanced(obj, fields);
55
- t.true(result);
56
- });
57
-
58
- test('validates regex conditions', t => {
59
- const obj = { name: 'Alice' };
60
- const fields = { $regex: { name: /^A/ } };
61
- const result = hasFieldsAdvanced(obj, fields);
62
- t.true(result);
63
- });
64
-
65
- test('validates array conditions', t => {
66
- const obj = { tags: ['js', 'ava', 'test'] };
67
- const fields = { $arrinc: { tags: ['ava'] } };
68
- const result = hasFieldsAdvanced(obj, fields);
69
- t.true(result);
70
- });