dobo 2.0.0 → 2.2.0

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 (197) hide show
  1. package/.github/FUNDING.yml +13 -0
  2. package/.github/workflows/repo-lockdown.yml +24 -0
  3. package/.jsdoc.conf.json +45 -0
  4. package/LICENSE +1 -1
  5. package/README.md +38 -19
  6. package/docs/Dobo.html +26 -0
  7. package/docs/data/search.json +1 -0
  8. package/docs/fonts/Inconsolata-Regular.ttf +0 -0
  9. package/docs/fonts/OpenSans-Regular.ttf +0 -0
  10. package/docs/fonts/WorkSans-Bold.ttf +0 -0
  11. package/docs/global.html +7 -0
  12. package/docs/index.html +3 -0
  13. package/docs/index.js.html +578 -0
  14. package/docs/lib_collect-connections.js.html +39 -0
  15. package/docs/lib_collect-drivers.js.html +52 -0
  16. package/docs/lib_collect-features.js.html +36 -0
  17. package/docs/lib_collect-schemas.js.html +94 -0
  18. package/docs/lib_index.js.html +6 -0
  19. package/docs/method_model_create.js.html +35 -0
  20. package/docs/method_model_drop.js.html +34 -0
  21. package/docs/method_model_exists.js.html +40 -0
  22. package/docs/method_record_count.js.html +69 -0
  23. package/docs/method_record_create.js.html +114 -0
  24. package/docs/method_record_find-all.js.html +44 -0
  25. package/docs/method_record_find-one.js.html +73 -0
  26. package/docs/method_record_find.js.html +118 -0
  27. package/docs/method_record_get.js.html +92 -0
  28. package/docs/method_record_remove.js.html +75 -0
  29. package/docs/method_record_update.js.html +107 -0
  30. package/docs/method_record_upsert.js.html +54 -0
  31. package/docs/method_sanitize_body.js.html +88 -0
  32. package/docs/method_sanitize_date.js.html +30 -0
  33. package/docs/method_sanitize_id.js.html +20 -0
  34. package/docs/method_validate.js.html +249 -0
  35. package/docs/module-Lib.html +3 -0
  36. package/docs/scripts/core.js +725 -0
  37. package/docs/scripts/core.min.js +23 -0
  38. package/docs/scripts/resize.js +90 -0
  39. package/docs/scripts/search.js +265 -0
  40. package/docs/scripts/search.min.js +6 -0
  41. package/docs/scripts/third-party/Apache-License-2.0.txt +202 -0
  42. package/docs/scripts/third-party/fuse.js +9 -0
  43. package/docs/scripts/third-party/hljs-line-num-original.js +366 -0
  44. package/docs/scripts/third-party/hljs-line-num.js +1 -0
  45. package/docs/scripts/third-party/hljs-original.js +5164 -0
  46. package/docs/scripts/third-party/hljs.js +1 -0
  47. package/docs/scripts/third-party/popper.js +5 -0
  48. package/docs/scripts/third-party/tippy.js +1 -0
  49. package/docs/scripts/third-party/tocbot.js +671 -0
  50. package/docs/scripts/third-party/tocbot.min.js +1 -0
  51. package/docs/static/bitcoin.jpeg +0 -0
  52. package/docs/static/home.md +25 -0
  53. package/docs/static/logo-ecosystem.png +0 -0
  54. package/docs/static/logo.png +0 -0
  55. package/docs/styles/clean-jsdoc-theme-base.css +1159 -0
  56. package/docs/styles/clean-jsdoc-theme-dark.css +412 -0
  57. package/docs/styles/clean-jsdoc-theme-light.css +482 -0
  58. package/docs/styles/clean-jsdoc-theme-scrollbar.css +30 -0
  59. package/docs/styles/clean-jsdoc-theme-without-scrollbar.min.css +1 -0
  60. package/docs/styles/clean-jsdoc-theme.min.css +1 -0
  61. package/extend/bajo/intl/en-US.json +69 -30
  62. package/extend/bajo/intl/id.json +58 -29
  63. package/extend/bajoCli/applet/clear-record.js +22 -0
  64. package/extend/bajoCli/applet/connection.js +5 -5
  65. package/extend/bajoCli/applet/count-record.js +27 -0
  66. package/extend/bajoCli/applet/create-aggregate.js +33 -0
  67. package/extend/bajoCli/applet/create-histogram.js +33 -0
  68. package/extend/bajoCli/applet/create-record.js +39 -0
  69. package/extend/bajoCli/applet/find-record.js +27 -0
  70. package/extend/bajoCli/applet/get-record.js +27 -0
  71. package/extend/bajoCli/applet/lib/post-process.js +25 -26
  72. package/extend/bajoCli/applet/model.js +22 -0
  73. package/extend/bajoCli/applet/rebuild-model.js +91 -0
  74. package/extend/bajoCli/applet/remove-record.js +27 -0
  75. package/extend/bajoCli/applet/update-record.js +44 -0
  76. package/extend/bajoCli/applet.js +0 -0
  77. package/extend/dobo/driver/memory.js +170 -0
  78. package/extend/dobo/feature/created-at.js +10 -8
  79. package/extend/dobo/feature/dt.js +0 -0
  80. package/extend/dobo/feature/immutable.js +30 -0
  81. package/extend/dobo/feature/int-id.js +0 -0
  82. package/extend/dobo/feature/removed-at.js +35 -57
  83. package/extend/dobo/feature/updated-at.js +14 -12
  84. package/extend/waibuMpa/route/attachment/@model/@id/@field/@file.js +5 -9
  85. package/extend/waibuStatic/virtual.json +0 -0
  86. package/index.js +420 -337
  87. package/lib/collect-connections.js +60 -21
  88. package/lib/collect-drivers.js +29 -35
  89. package/lib/collect-features.js +40 -0
  90. package/lib/collect-models.js +319 -0
  91. package/lib/factory/action.js +161 -0
  92. package/lib/factory/connection.js +62 -0
  93. package/lib/factory/driver.js +358 -0
  94. package/lib/factory/feature.js +33 -0
  95. package/lib/factory/model/_util.js +402 -0
  96. package/lib/factory/model/build.js +15 -0
  97. package/lib/factory/model/clear-record.js +17 -0
  98. package/lib/factory/model/count-record.js +17 -0
  99. package/lib/factory/model/create-aggregate.js +17 -0
  100. package/lib/factory/model/create-attachment.js +29 -0
  101. package/lib/factory/model/create-histogram.js +17 -0
  102. package/lib/factory/model/create-record.js +35 -0
  103. package/lib/factory/model/drop.js +15 -0
  104. package/lib/factory/model/exists.js +21 -0
  105. package/lib/factory/model/find-all-record.js +71 -0
  106. package/lib/factory/model/find-attachment.js +29 -0
  107. package/lib/factory/model/find-one-record.js +19 -0
  108. package/lib/factory/model/find-record.js +103 -0
  109. package/lib/factory/model/get-attachment.js +15 -0
  110. package/lib/factory/model/get-record.js +79 -0
  111. package/lib/factory/model/list-attachment.js +37 -0
  112. package/lib/{add-fixtures.js → factory/model/load-fixtures.js} +69 -67
  113. package/lib/factory/model/remove-attachment.js +15 -0
  114. package/lib/factory/model/remove-record.js +59 -0
  115. package/lib/factory/model/sanitize-body.js +62 -0
  116. package/lib/factory/model/sanitize-id.js +7 -0
  117. package/lib/factory/model/sanitize-record.js +26 -0
  118. package/lib/factory/model/update-attachment.js +9 -0
  119. package/lib/factory/model/update-record.js +81 -0
  120. package/lib/factory/model/upsert-record.js +95 -0
  121. package/lib/factory/model/validate.js +232 -0
  122. package/lib/factory/model.js +150 -0
  123. package/lib/index.js +3 -0
  124. package/package.json +45 -36
  125. package/wiki/APPLETS.md +57 -0
  126. package/wiki/CHANGES.md +46 -0
  127. package/wiki/CONFIG.md +25 -0
  128. package/wiki/CONTRIBUTING.md +5 -0
  129. package/wiki/DEV-GUIDE.md +1 -0
  130. package/wiki/ECOSYSTEM.md +20 -0
  131. package/wiki/GETTING-STARTED.md +166 -0
  132. package/{docs/query-language.md → wiki/QUERY-LANGUAGE.md} +0 -0
  133. package/wiki/USER-GUIDE.md +1 -0
  134. package/extend/bajoCli/applet/model-clear.js +0 -11
  135. package/extend/bajoCli/applet/model-rebuild.js +0 -101
  136. package/extend/bajoCli/applet/record-create.js +0 -41
  137. package/extend/bajoCli/applet/record-find.js +0 -27
  138. package/extend/bajoCli/applet/record-get.js +0 -24
  139. package/extend/bajoCli/applet/record-remove.js +0 -24
  140. package/extend/bajoCli/applet/record-update.js +0 -47
  141. package/extend/bajoCli/applet/schema.js +0 -22
  142. package/extend/bajoCli/applet/stat-count.js +0 -24
  143. package/lib/build-bulk-action.js +0 -12
  144. package/lib/check-unique.js +0 -39
  145. package/lib/collect-feature.js +0 -25
  146. package/lib/collect-schemas.js +0 -83
  147. package/lib/exec-feature-hook.js +0 -13
  148. package/lib/exec-validation.js +0 -21
  149. package/lib/generic-prop-sanitizer.js +0 -31
  150. package/lib/handle-attachment-upload.js +0 -16
  151. package/lib/mem-db/conn-sanitizer.js +0 -8
  152. package/lib/mem-db/instantiate.js +0 -41
  153. package/lib/mem-db/method/model/clear.js +0 -6
  154. package/lib/mem-db/method/model/create.js +0 -5
  155. package/lib/mem-db/method/model/drop.js +0 -5
  156. package/lib/mem-db/method/model/exists.js +0 -5
  157. package/lib/mem-db/method/record/create.js +0 -12
  158. package/lib/mem-db/method/record/find.js +0 -20
  159. package/lib/mem-db/method/record/get.js +0 -9
  160. package/lib/mem-db/method/record/remove.js +0 -13
  161. package/lib/mem-db/method/record/update.js +0 -15
  162. package/lib/mem-db/method/stat/count.js +0 -11
  163. package/lib/mem-db/start.js +0 -25
  164. package/lib/merge-attachment-info.js +0 -16
  165. package/lib/multi-rel-rows.js +0 -42
  166. package/lib/resolve-method.js +0 -16
  167. package/lib/sanitize-schema.js +0 -197
  168. package/lib/single-rel-rows.js +0 -38
  169. package/method/attachment/copy-uploaded.js +0 -34
  170. package/method/attachment/create.js +0 -29
  171. package/method/attachment/find.js +0 -27
  172. package/method/attachment/get-path.js +0 -12
  173. package/method/attachment/get.js +0 -12
  174. package/method/attachment/pre-check.js +0 -9
  175. package/method/attachment/remove.js +0 -11
  176. package/method/attachment/update.js +0 -7
  177. package/method/bulk/create.js +0 -46
  178. package/method/model/clear.js +0 -22
  179. package/method/model/create.js +0 -19
  180. package/method/model/drop.js +0 -19
  181. package/method/model/exists.js +0 -24
  182. package/method/record/clear.js +0 -24
  183. package/method/record/count.js +0 -44
  184. package/method/record/create.js +0 -71
  185. package/method/record/find-all.js +0 -25
  186. package/method/record/find-one.js +0 -56
  187. package/method/record/find.js +0 -52
  188. package/method/record/get.js +0 -47
  189. package/method/record/remove.js +0 -41
  190. package/method/record/update.js +0 -63
  191. package/method/record/upsert.js +0 -35
  192. package/method/sanitize/body.js +0 -70
  193. package/method/sanitize/date.js +0 -14
  194. package/method/sanitize/id.js +0 -7
  195. package/method/stat/aggregate.js +0 -23
  196. package/method/stat/histogram.js +0 -26
  197. package/method/validate.js +0 -157
@@ -0,0 +1,13 @@
1
+ github: ardhi
2
+ patreon: bajoframework
3
+ #open_collective: # Replace with a single Open Collective username
4
+ #ko_fi: # Replace with a single Ko-fi username
5
+ #tidelift: # Replace with a single Tidelift platform-name/package-name e.g., npm/babel
6
+ #community_bridge: # Replace with a single Community Bridge project-name e.g., cloud-foundry
7
+ #liberapay: # Replace with a single Liberapay username
8
+ #issuehunt: # Replace with a single IssueHunt username
9
+ #lfx_crowdfunding: # Replace with a single LFX Crowdfunding project-name e.g., cloud-foundry
10
+ #polar: # Replace with a single Polar username
11
+ #buy_me_a_coffee: # Replace with a single Buy Me a Coffee username
12
+ #thanks_dev: # Replace with a single thanks.dev username
13
+ custom: ["https://www.paypal.com/ncp/payment/EWLERL7SCUU64"]
@@ -0,0 +1,24 @@
1
+ name: 'Repo Lockdown'
2
+
3
+ on:
4
+ #issues:
5
+ #types: opened
6
+ pull_request_target:
7
+ types: opened
8
+ #schedule:
9
+ #- cron: '* */6 * * *'
10
+
11
+ permissions:
12
+ #issues: write
13
+ pull-requests: write
14
+
15
+ jobs:
16
+ action:
17
+ runs-on: ubuntu-latest
18
+ steps:
19
+ - uses: dessant/repo-lockdown@v4
20
+ with:
21
+ pr-comment: >
22
+ This repository does not accept pull requests,
23
+ see the README.md for details.
24
+ skip-closed-pr-comment: true
@@ -0,0 +1,45 @@
1
+ {
2
+ "plugins": ["plugins/markdown", "jsdoc-plugin-intersection"],
3
+ "opts": {
4
+ "encoding": "utf8",
5
+ "recurse": true,
6
+ "verbose": true,
7
+ "destination": "./docs",
8
+ "template": "node_modules/clean-jsdoc-theme",
9
+ "readme": "./docs/static/home.md",
10
+ "theme_opts": {
11
+ "default_theme": "light",
12
+ "display-module-header": true,
13
+ "title": "Dobo API",
14
+ "homepageTitle": "Dobo API",
15
+ "sections": ["Classes", "Events", "Modules", "Global"],
16
+ "menu": [{
17
+ "title": "NPM",
18
+ "link": "https://www.npmjs.com/package/dobo"
19
+ }, {
20
+ "title": "Github",
21
+ "link": "https://github.com/ardhi/dobo"
22
+ }, {
23
+ "title": "Dobo",
24
+ "link": "https://dobo.bajo.app/"
25
+ }, {
26
+ "title": "Bajo",
27
+ "link": "https://bajo.app/"
28
+ }]
29
+ }
30
+ },
31
+ "source": {
32
+ "include": ["."],
33
+ "includePattern": ".+\\.js(doc|x)?$",
34
+ "exclude": ["node_modules", "docs", "test"]
35
+ },
36
+ "markdown": {
37
+ "hardwrap": false,
38
+ "idInHeadings": true
39
+ },
40
+ "sourceType": "module",
41
+ "templates": {
42
+ "cleverLinks": false,
43
+ "monospaceLinks": false
44
+ }
45
+ }
package/LICENSE CHANGED
@@ -1,6 +1,6 @@
1
1
  MIT License
2
2
 
3
- Copyright (c) 2024 Ardhi Lukianto
3
+ Copyright (c) 2023-2025 Ardhi Lukianto
4
4
 
5
5
  Permission is hereby granted, free of charge, to any person obtaining a copy
6
6
  of this software and associated documentation files (the "Software"), to deal
package/README.md CHANGED
@@ -1,38 +1,57 @@
1
1
  # dobo
2
2
 
3
- Plugin name: **dobo**, alias: **db**
4
-
5
3
  ![GitHub package.json version](https://img.shields.io/github/package-json/v/ardhi/dobo) ![NPM Version](https://img.shields.io/npm/v/dobo)
6
4
 
7
- > <br />**Attention**: I do NOT accept any pull request at the moment, thanks!<br /><br />
5
+ > <br />**Attention**: I do NOT accept any pull request at the moment, thanks! ([Why?](wiki/CONTRIBUTING.md))<br /><br />
6
+
7
+ <img src="docs/static/logo.png" width="300" alt="dobo">
8
8
 
9
- Database connectivity, tools, ORM/ODM support for [Bajo](https://github.com/ardhi/bajo)
9
+ ### Database Management System for [Bajo](https://github.com/ardhi/bajo)
10
10
 
11
11
  ## Installation
12
12
 
13
- Goto your ```<bajo-base-dir>``` and type:
13
+ Goto your ```{appDir}``` and type:
14
14
 
15
15
  ```bash
16
16
  $ npm install dobo
17
17
  ```
18
18
 
19
- Now open your ```<bajo-data-dir>/config/.plugins``` and put ```dobo``` in it
19
+ And enable the plugin by adding ```dobo``` to the plugin list in either the ```$dataDir/config/.plugins``` file or the ```bajo.plugins``` array within your ```package.json``` file
20
20
 
21
21
  ## Documentations
22
22
 
23
- - [Query Language](docs/query-language.md)
24
-
25
- ## Database Drivers
26
-
27
- - Memory (Built-in)
28
- - [SQL/Knex](https://github.com/ardhi/dobo-knex)
29
- - [CouchDB](https://github.com/ardhi/dobo-couchdb)
30
- - [Elasticsearch](https://github.com/ardhi/dobo-elasticsearch)
31
- - [MongoDB](https://github.com/ardhi/dobo-mongodb)
32
- - [Redis](https://github.com/ardhi/dobo-redis)
33
- - [REST Proxy](https://github.com/ardhi/dobo-restproxy)
34
-
35
- More will come soon
23
+ - [Homepage](https://dobo.bajo.app/)
24
+ - [Getting Started](wiki/GETTING-STARTED.md)
25
+ - [User Guide](wiki/USER-GUIDE.md)
26
+ - [Developer Guide](wiki/DEV-GUIDE.md)
27
+ - [Config Object](wiki/CONFIG.md)
28
+ - [Query Language](wiki/QUERY-LANGUAGE.md)
29
+ - [Applets](wiki/APPLETS.md)
30
+ - [Ecosystem](wiki/ECOSYSTEM.md)
31
+ - [API](https://ardhi.github.io/dobo)
32
+ - [Contributing](wiki/CONTRIBUTING.md)
33
+
34
+ ## Hire Me
35
+
36
+ If you have a Bajo Framework-based project and need a professional service or assistance, please <a href="https://github.com/ardhi#professional-service">click here</a>. I'd be happy to work on it at a competitive price and with fast turnaround!
37
+
38
+ ## Support Me
39
+
40
+ Please support me using the channels below. Your donation will motivate me to work faster and more diligently on future development.
41
+
42
+ <a href="https://github.com/sponsors/ardhi">
43
+ <img src="https://img.shields.io/badge/Github-slategrey?style=flat&logo=github" height="50">
44
+ </a>
45
+ <a href="https://www.patreon.com/bajoframework">
46
+ <img src="https://img.shields.io/badge/Patreon-f2c3b2?style=flat&logo=patreon" height="50">
47
+ </a>
48
+ <a href="https://www.paypal.com/ncp/payment/EWLERL7SCUU64">
49
+ <img src="https://img.shields.io/badge/Paypal-blue?style=flat&logo=paypal" height="50">
50
+ </a>
51
+
52
+ <p>
53
+ <div><img alt="bc1qwtv78cwp9ef8hnqaw84fxg5856l0pggqe32g6f" src="docs/static/bitcoin.jpeg" width="150" height="150" /><br>Bitcoin</div>
54
+ </p>
36
55
 
37
56
  ## License
38
57
 
package/docs/Dobo.html ADDED
@@ -0,0 +1,26 @@
1
+ <!DOCTYPE html><html lang="en" style="font-size:16px"><head><meta charset="utf-8"><meta name="viewport" content="width=device-width,initial-scale=1"><title>Class: Dobo</title><!--[if lt IE 9]>
2
+ <script src="//html5shiv.googlecode.com/svn/trunk/html5.js"></script>
3
+ <![endif]--><script src="scripts/third-party/hljs.js" defer="defer"></script><script src="scripts/third-party/hljs-line-num.js" defer="defer"></script><script src="scripts/third-party/popper.js" defer="defer"></script><script src="scripts/third-party/tippy.js" defer="defer"></script><script src="scripts/third-party/tocbot.min.js"></script><script>var baseURL="/",locationPathname="";baseURL=(locationPathname=document.location.pathname).substr(0,locationPathname.lastIndexOf("/")+1)</script><link rel="stylesheet" href="styles/clean-jsdoc-theme.min.css"><svg aria-hidden="true" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" style="display:none"><defs><symbol id="copy-icon" viewbox="0 0 488.3 488.3"><g><path d="M314.25,85.4h-227c-21.3,0-38.6,17.3-38.6,38.6v325.7c0,21.3,17.3,38.6,38.6,38.6h227c21.3,0,38.6-17.3,38.6-38.6V124 C352.75,102.7,335.45,85.4,314.25,85.4z M325.75,449.6c0,6.4-5.2,11.6-11.6,11.6h-227c-6.4,0-11.6-5.2-11.6-11.6V124 c0-6.4,5.2-11.6,11.6-11.6h227c6.4,0,11.6,5.2,11.6,11.6V449.6z"/><path d="M401.05,0h-227c-21.3,0-38.6,17.3-38.6,38.6c0,7.5,6,13.5,13.5,13.5s13.5-6,13.5-13.5c0-6.4,5.2-11.6,11.6-11.6h227 c6.4,0,11.6,5.2,11.6,11.6v325.7c0,6.4-5.2,11.6-11.6,11.6c-7.5,0-13.5,6-13.5,13.5s6,13.5,13.5,13.5c21.3,0,38.6-17.3,38.6-38.6 V38.6C439.65,17.3,422.35,0,401.05,0z"/></g></symbol><symbol id="search-icon" viewBox="0 0 512 512"><g><g><path d="M225.474,0C101.151,0,0,101.151,0,225.474c0,124.33,101.151,225.474,225.474,225.474 c124.33,0,225.474-101.144,225.474-225.474C450.948,101.151,349.804,0,225.474,0z M225.474,409.323 c-101.373,0-183.848-82.475-183.848-183.848S124.101,41.626,225.474,41.626s183.848,82.475,183.848,183.848 S326.847,409.323,225.474,409.323z"/></g></g><g><g><path d="M505.902,476.472L386.574,357.144c-8.131-8.131-21.299-8.131-29.43,0c-8.131,8.124-8.131,21.306,0,29.43l119.328,119.328 c4.065,4.065,9.387,6.098,14.715,6.098c5.321,0,10.649-2.033,14.715-6.098C514.033,497.778,514.033,484.596,505.902,476.472z"/></g></g></symbol><symbol id="font-size-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11.246 15H4.754l-2 5H.6L7 4h2l6.4 16h-2.154l-2-5zm-.8-2L8 6.885 5.554 13h4.892zM21 12.535V12h2v8h-2v-.535a4 4 0 1 1 0-6.93zM19 18a2 2 0 1 0 0-4 2 2 0 0 0 0 4z"/></symbol><symbol id="add-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M11 11V5h2v6h6v2h-6v6h-2v-6H5v-2z"/></symbol><symbol id="minus-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M5 11h14v2H5z"/></symbol><symbol id="dark-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M10 7a7 7 0 0 0 12 4.9v.1c0 5.523-4.477 10-10 10S2 17.523 2 12 6.477 2 12 2h.1A6.979 6.979 0 0 0 10 7zm-6 5a8 8 0 0 0 15.062 3.762A9 9 0 0 1 8.238 4.938 7.999 7.999 0 0 0 4 12z"/></symbol><symbol id="light-theme-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 18a6 6 0 1 1 0-12 6 6 0 0 1 0 12zm0-2a4 4 0 1 0 0-8 4 4 0 0 0 0 8zM11 1h2v3h-2V1zm0 19h2v3h-2v-3zM3.515 4.929l1.414-1.414L7.05 5.636 5.636 7.05 3.515 4.93zM16.95 18.364l1.414-1.414 2.121 2.121-1.414 1.414-2.121-2.121zm2.121-14.85l1.414 1.415-2.121 2.121-1.414-1.414 2.121-2.121zM5.636 16.95l1.414 1.414-2.121 2.121-1.414-1.414 2.121-2.121zM23 11v2h-3v-2h3zM4 11v2H1v-2h3z"/></symbol><symbol id="reset-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M18.537 19.567A9.961 9.961 0 0 1 12 22C6.477 22 2 17.523 2 12S6.477 2 12 2s10 4.477 10 10c0 2.136-.67 4.116-1.81 5.74L17 12h3a8 8 0 1 0-2.46 5.772l.997 1.795z"/></symbol><symbol id="down-icon" viewBox="0 0 16 16"><path fill-rule="evenodd" clip-rule="evenodd" d="M12.7803 6.21967C13.0732 6.51256 13.0732 6.98744 12.7803 7.28033L8.53033 11.5303C8.23744 11.8232 7.76256 11.8232 7.46967 11.5303L3.21967 7.28033C2.92678 6.98744 2.92678 6.51256 3.21967 6.21967C3.51256 5.92678 3.98744 5.92678 4.28033 6.21967L8 9.93934L11.7197 6.21967C12.0126 5.92678 12.4874 5.92678 12.7803 6.21967Z"></path></symbol><symbol id="codepen-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M16.5 13.202L13 15.535v3.596L19.197 15 16.5 13.202zM14.697 12L12 10.202 9.303 12 12 13.798 14.697 12zM20 10.869L18.303 12 20 13.131V10.87zM19.197 9L13 4.869v3.596l3.5 2.333L19.197 9zM7.5 10.798L11 8.465V4.869L4.803 9 7.5 10.798zM4.803 15L11 19.131v-3.596l-3.5-2.333L4.803 15zM4 13.131L5.697 12 4 10.869v2.262zM2 9a1 1 0 0 1 .445-.832l9-6a1 1 0 0 1 1.11 0l9 6A1 1 0 0 1 22 9v6a1 1 0 0 1-.445.832l-9 6a1 1 0 0 1-1.11 0l-9-6A1 1 0 0 1 2 15V9z"/></symbol><symbol id="close-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M12 10.586l4.95-4.95 1.414 1.414-4.95 4.95 4.95 4.95-1.414 1.414-4.95-4.95-4.95 4.95-1.414-1.414 4.95-4.95-4.95-4.95L7.05 5.636z"/></symbol><symbol id="menu-icon" viewBox="0 0 24 24"><path fill="none" d="M0 0h24v24H0z"/><path d="M3 4h18v2H3V4zm0 7h18v2H3v-2zm0 7h18v2H3v-2z"/></symbol></defs></svg></head><body data-theme="light"><div class="sidebar-container"><div class="sidebar" id="sidebar"><a href="/" class="sidebar-title sidebar-title-anchor">Dobo API</a><div class="sidebar-items-container"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Dobo.html">Dobo</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-Lib.html">Lib</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#TPropType">TPropType</a></div><div class="sidebar-section-children"><a href="global.html#TRecordCountOptions">TRecordCountOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordCreateOptions">TRecordCreateOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordFilter">TRecordFilter</a></div><div class="sidebar-section-children"><a href="global.html#TRecordFindOptions">TRecordFindOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordFindResult">TRecordFindResult</a></div><div class="sidebar-section-children"><a href="global.html#TRecordGetOptions">TRecordGetOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordGetResult">TRecordGetResult</a></div><div class="sidebar-section-children"><a href="global.html#TRecordPagination">TRecordPagination</a></div><div class="sidebar-section-children"><a href="global.html#TRecordRemoveOptions">TRecordRemoveOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordSort">TRecordSort</a></div><div class="sidebar-section-children"><a href="global.html#TRecordSortKey">TRecordSortKey</a></div><div class="sidebar-section-children"><a href="global.html#TRecordUpdateOptions">TRecordUpdateOptions</a></div><div class="sidebar-section-children"><a href="global.html#TValidator">TValidator</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorBoolean">TValidatorBoolean</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorDate">TValidatorDate</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorNumber">TValidatorNumber</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorString">TValidatorString</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorTimestamp">TValidatorTimestamp</a></div><div class="sidebar-section-children"><a href="global.html#factory">factory</a></div></div></div></div></div><div class="navbar-container" id="VuAckcnZhf"><nav class="navbar"><div class="navbar-left-items"><div class="navbar-item"><a id="" href="https://www.npmjs.com/package/dobo" target="">NPM</a></div><div class="navbar-item"><a id="" href="https://github.com/ardhi/dobo" target="">Github</a></div><div class="navbar-item"><a id="" href="https://dobo.bajo.app/" target="">Dobo</a></div><div class="navbar-item"><a id="" href="https://bajo.app/" target="">Bajo</a></div></div><div class="navbar-right-items"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div><nav></nav></nav></div><div class="toc-container"><div class="toc-content"><span class="bold">On this page</span><div id="eed4d2a0bfd64539bb9df78095dec881"></div></div></div><div class="body-wrapper"><div class="main-content"><div class="main-wrapper"><section><header><h1 id="Dobo-title" class="has-anchor">Dobo</h1><div class="class-description"><p>Dobo Database Framework for <a href="https://github.com/ardhi/bajo">Bajo</a>.</p><p>See ecosystem for available drivers &amp; tools</p></div></header><article><div class="container-overview"><h2 id="constructor" class="has-anchor">Constructor</h2><h3 class="name has-anchor" id="Dobo"><span class="type-signature"></span>new Dobo<span class="signature">()</span></h3><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line127">line 127</a></li></ul></dd></div></dl></div><h2 id="members" class="subsection-title has-anchor">Members</h2><h3 class="name has-anchor" id="connections"><span class="type-signature"></span>connections<span class="type-signature"> :Array.&lt;Object></span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type">Array.&lt;Object></span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line197">line 197</a></li></ul></dd></div></dl><h3 class="name has-anchor" id="drivers"><span class="type-signature"></span>drivers<span class="type-signature"> :Array.&lt;Object></span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type">Array.&lt;Object></span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line192">line 192</a></li></ul></dd></div></dl><h3 class="name has-anchor" id="features"><span class="type-signature"></span>features<span class="type-signature"> :Array.&lt;Object></span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type">Array.&lt;Object></span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line202">line 202</a></li></ul></dd></div></dl><h3 class="name has-anchor" id="schemas"><span class="type-signature"></span>schemas<span class="type-signature"> :Array.&lt;Object></span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type">Array.&lt;Object></span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line207">line 207</a></li></ul></dd></div></dl><h3 class="name has-anchor" id=".aggregateTypes"><span class="type-signature">(static, constant) </span>aggregateTypes<span class="type-signature"> :Array.&lt;string></span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type">Array.&lt;string></span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-default bold">Default Value</dt><dd class="tag-default"><ul><li data-skip-pre-process="true">['count', 'avg', 'min', 'max', 'sum']</li></ul></dd></div><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line140">line 140</a></li></ul></dd></div></dl><h3 class="name has-anchor" id=".alias"><span class="type-signature">(static, constant) </span>alias<span class="type-signature"> :string</span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type">string</span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-default bold">Default Value</dt><dd class="tag-default"><ul><li data-skip-pre-process="true">'db'</li></ul></dd></div><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line133">line 133</a></li></ul></dd></div></dl><h3 class="name has-anchor" id=".propType"><span class="type-signature">(static, constant) </span>propType<span class="type-signature"> :<a href="global.html#TPropType">TPropType</a></span></h3><div class="member-item-container flex"><strong>Type:</strong><ul><li><span class="param-type"><a href="global.html#TPropType">TPropType</a></span></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line145">line 145</a></li></ul></dd></div></dl><h2 id="methods" class="subsection-title has-anchor">Methods</h2><h3 class="name has-anchor" id="init"><span class="type-signature">(async) </span>init<span class="signature">()</span></h3><div class="description"><p>Initialize plugin and performing the following tasks:</p><ul><li><a href="module-Lib.html#.collectDrivers">Collecting all drivers</a></li><li><a href="module-Lib.html#.collectConnections">Collecting all connections</a></li><li><a href="module-Lib.html#.collectFeatures">Collecting all features</a></li><li><a href="module-Lib.html#.collectSchemas">Collecting all schemas</a></li></ul></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line219">line 219</a></li></ul></dd></div></dl><h3 class="name has-anchor" id="modelCreate"><span class="type-signature">(async) </span>modelCreate<span class="signature">(name, options<span class="signature-attributes">opt</span>)</span></h3><div class="description"><p>Create a new model:</p><ul><li>read corresponding schema</li><li>attempt to create table/database/collection accordingly</li></ul></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Options object</p></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_model_create.js.html">method/model/create.js</a>, <a href="method_model_create.js.html#line3">line 3</a></li></ul></dd></div></dl><h3 class="name has-anchor" id="modelDrop"><span class="type-signature">(async) </span>modelDrop<span class="signature">(name, options<span class="signature-attributes">opt</span>)</span></h3><div class="description"><p>Drop database model</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Options object</p></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_model_drop.js.html">method/model/drop.js</a>, <a href="method_model_drop.js.html#line3">line 3</a></li></ul></dd></div></dl><h3 class="name has-anchor" id="modelExists"><span class="type-signature">(async) </span>modelExists<span class="signature">(name, thrown<span class="signature-attributes">opt</span>, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {boolean}</span></h3><div class="description"><p>Check if model exists already</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>thrown</code></td><td class="type"><span class="param-type">boolean</span></td><td class="attributes">&lt;optional><br></td><td class="default">false</td><td class="description last"><p>If <code>true</code> throw error if not exists instead of just silent</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Options object</p></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_model_exists.js.html">method/model/exists.js</a>, <a href="method_model_exists.js.html#line5">line 5</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">boolean</span></dd></dl></div><h3 class="name has-anchor" id="pickRecord"><span class="type-signature">(async) </span>pickRecord<span class="signature">(options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h3><div class="description"><p>Pick only fields defined from a record</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Options object</p><h6>Properties</h6><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>record</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Record to pick fields from</p></td></tr><tr><td class="name"><code>fields</code></td><td class="type"><span class="param-type">Array</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Array of field names to be picked</p></td></tr><tr><td class="name"><code>schema</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Associated record's schema</p></td></tr><tr><td class="name"><code>hidden</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">[]</td><td class="description last"><p>Additional fields to be hidden in addition the one defined in schema</p></td></tr><tr><td class="name"><code>forceNoHidden</code></td><td class="type"><span class="param-type">boolean</span></td><td class="attributes">&lt;optional><br></td><td class="default"></td><td class="description last"><p>Force ALL fields to be picked, thus ignoring hidden fields</p></td></tr></tbody></table></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line279">line 279</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="prepPagination"><span class="type-signature">(async) </span>prepPagination<span class="signature">(filter<span class="signature-attributes">opt</span>, schema, options)</span><span class="type-signature"> &rarr; {<a href="global.html#TRecordPagination">TRecordPagination</a>}</span></h3><div class="description"><p>Prepare records pagination:</p><ul><li>making sure records limit is obeyed</li><li>making sure page is a positive value</li><li>if skip is given, recalculate limit to use skip instead of page number</li><li>Build sort info</li></ul></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>filter</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Filter object</p></td></tr><tr><td class="name"><code>schema</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's schema</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Options</p></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line329">line 329</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type"><a href="global.html#TRecordPagination">TRecordPagination</a></span></dd></dl></div><h3 class="name has-anchor" id="recordCount"><span class="type-signature">(async) </span>recordCount<span class="signature">(name, filter<span class="signature-attributes">opt</span>, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {TRecordCountResult|number}</span></h3><div class="description"><p>Return the number of records found by given filter</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>filter</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordFilter">TRecordFilter</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Filter object</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordCountOptions">TRecordCountOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_count.js.html">method/record/count.js</a>, <a href="method_record_count.js.html#line13">line 13</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Return <code>number</code> of records if <code>options.dataOnly</code> is set. TRecordCountResult otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">TRecordCountResult</span> |<wbr> <span class="param-type">number</span></dd></dl></div><h3 class="name has-anchor" id="recordCreate"><span class="type-signature">(async) </span>recordCreate<span class="signature">(name, body, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {TRecordCreateResult|Object}</span></h3><div class="description"><p>Create a new record</p><p>Example:</p><pre class="prettyprint source lang-javascript"><code>const { recordCreate } = this.app.dobo
4
+ const { body } = {
5
+ id: 'ID',
6
+ name: 'Indonesia',
7
+ iso3: 'IDN'
8
+ }
9
+ const result = await recordCreate('CdbCountry', body)
10
+ </code></pre></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>body</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Data to be saved</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordCreateOptions">TRecordCreateOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_create.js.html">method/record/create.js</a>, <a href="method_record_create.js.html#line25">line 25</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Returns newly created record if <code>options.dataOnly</code> is set. TRecordCreateResult otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">TRecordCreateResult</span> |<wbr> <span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="recordFind"><span class="type-signature">(async) </span>recordFind<span class="signature">(name, filter<span class="signature-attributes">opt</span>, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {<a href="global.html#TRecordFindResult">TRecordFindResult</a>|Array.&lt;Object>}</span></h3><div class="description"><p>Find records by model's name and given filter</p><p>Example: find records from model <strong>CdbCountry</strong> where its id is 'ID' or 'MY', sorted by <code>name</code> in ascending order and return only its <code>id</code>, <code>name</code> and <code>iso3</code></p><pre class="prettyprint source lang-javascript"><code>const { recordFind } = this.app.dobo
11
+ const query = { id: { $in: ['ID', 'MY'] } }
12
+ const sort = { name: 1 }
13
+ const fields = ['id', 'name', 'iso3']
14
+ const result = await recordFind('CdbCountry', { query, sort }, { fields })
15
+ </code></pre></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>filter</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Filter object</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordFindOptions">TRecordFindOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_find.js.html">method/record/find.js</a>, <a href="method_record_find.js.html#line45">line 45</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Return <code>array</code> of records if <code>options.dataOnly</code> is set. <a href="global.html#TRecordFindResult">TRecordFindResult</a> otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type"><a href="global.html#TRecordFindResult">TRecordFindResult</a></span> |<wbr> <span class="param-type">Array.&lt;Object></span></dd></dl></div><h3 class="name has-anchor" id="recordFindAll"><span class="type-signature">(async) </span>recordFindAll<span class="signature">(name, filter<span class="signature-attributes">opt</span>, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {<a href="global.html#TRecordFindResult">TRecordFindResult</a>|Array.&lt;Object>}</span></h3><div class="description"><p>Find all records by model's name and given filter.</p><p>The total number of records returned is limited by <code>hardLimit</code> value set in config file.</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>filter</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Filter object</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordFindOptions">TRecordFindOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_find-all.js.html">method/record/find-all.js</a>, <a href="method_record_find-all.js.html#line1">line 1</a></li></ul></dd></div><div class="details-item-container"><dt class="tag-see bold">See</dt><dd class="tag-see"><ul><li><a href="Dobo.html#recordFind">Dobo#recordFind</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Return <code>array</code> of records if <code>options.dataOnly</code> is set. <a href="global.html#TRecordFindResult">TRecordFindResult</a> otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type"><a href="global.html#TRecordFindResult">TRecordFindResult</a></span> |<wbr> <span class="param-type">Array.&lt;Object></span></dd></dl></div><h3 class="name has-anchor" id="recordFindOne"><span class="type-signature">(async) </span>recordFindOne<span class="signature">(name, filter<span class="signature-attributes">opt</span>, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {<a href="global.html#TRecordGetResult">TRecordGetResult</a>|Object}</span></h3><div class="description"><p>Find the first record by model's name and given filter.</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>filter</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Filter object</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordFindOptions">TRecordFindOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_find-one.js.html">method/record/find-one.js</a>, <a href="method_record_find-one.js.html#line5">line 5</a></li></ul></dd></div><div class="details-item-container"><dt class="tag-see bold">See</dt><dd class="tag-see"><ul><li><a href="Dobo.html#recordFind">Dobo#recordFind</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Return record's <code>object</code> if <code>options.dataOnly</code> is set. <a href="global.html#TRecordGetResult">TRecordGetResult</a> otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type"><a href="global.html#TRecordGetResult">TRecordGetResult</a></span> |<wbr> <span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="recordGet"><span class="type-signature">(async) </span>recordGet<span class="signature">(name, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {<a href="global.html#TRecordGetResult">TRecordGetResult</a>|Object}</span></h3><div class="description"><p>Get record by model's name and record ID</p><p>Example:</p><pre class="prettyprint source lang-javascript"><code>const { recordGet } = this.app.dobo
16
+ const fields = ['id', 'name', 'iso3']
17
+ const result = await recordGet('CdbCountry', 'ID', { fields })
18
+ </code></pre></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code></code></td><td class="type"><span class="param-type">string</span> |<wbr> <span class="param-type">number</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Record's ID</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordGetOptions">TRecordGetOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_get.js.html">method/record/get.js</a>, <a href="method_record_get.js.html#line26">line 26</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Return record's <code>object</code> if <code>options.dataOnly</code> is set. <a href="global.html#TRecordGetResult">TRecordGetResult</a> otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type"><a href="global.html#TRecordGetResult">TRecordGetResult</a></span> |<wbr> <span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="recordRemove"><span class="type-signature">(async) </span>recordRemove<span class="signature">(name, id, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {TRecordRemoveResult|Object}</span></h3><div class="description"><p>Remove existing record by it's ID. All attachments bound to this record will also be removed forever.</p><p>Example:</p><pre class="prettyprint source lang-javascript"><code>const { recordRemove } = this.app.dobo
19
+ const result = await recordRemove('CdbCountry', 'ID')
20
+ </code></pre></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>id</code></td><td class="type"><span class="param-type">string</span> |<wbr> <span class="param-type">number</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Record's ID</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordRemoveOptions">TRecordRemoveOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_remove.js.html">method/record/remove.js</a>, <a href="method_record_remove.js.html#line17">line 17</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Return the removed record if <code>options.dataOnly</code> is set. TRecordRemoveResult otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">TRecordRemoveResult</span> |<wbr> <span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="recordUpdate"><span class="type-signature">(async) </span>recordUpdate<span class="signature">(name, id, body, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {TRecordUpdateResult|Object}</span></h3><div class="description"><p>Update a record by it's ID and body payload</p><p>Example:</p><pre class="prettyprint source lang-javascript"><code>const { recordUpdate } = this.app.dobo
21
+ const { body } = {
22
+ name: 'Republic of Indonesia',
23
+ phoneCode: '+62'
24
+ }
25
+ const result = await recordUpdate('CdbCountry', 'ID', body)
26
+ </code></pre></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>id</code></td><td class="type"><span class="param-type">string</span> |<wbr> <span class="param-type">number</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Record's ID</p></td></tr><tr><td class="name"><code>body</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Body payload</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type"><a href="global.html#TRecordUpdateOptions">TRecordUpdateOptions</a></span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_update.js.html">method/record/update.js</a>, <a href="method_record_update.js.html#line25">line 25</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Returns updated record if <code>options.dataOnly</code> is set. TRecordUpdateResult otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">TRecordUpdateResult</span> |<wbr> <span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="recordUpsert"><span class="type-signature">(async) </span>recordUpsert<span class="signature">(name, body, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {TRecordUpdateResult|TRecordCreateResult|Object}</span></h3><div class="description"><p>Update a record by payload's ID. If no record is found by given ID, a new one will be created instead.</p><p>Missing ID in payload always results a new record creation.</p><pre class="prettyprint source"><code></code></pre></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>name</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Model's name</p></td></tr><tr><td class="name"><code>body</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Body payload</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">TRecordUpsertOptions</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_record_upsert.js.html">method/record/upsert.js</a>, <a href="method_record_upsert.js.html#line1">line 1</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><div class="param-desc"><p>Returns updated/newly created record if <code>options.dataOnly</code> is set. TRecordUpdateResult or TRecordCreateResult otherwise</p></div><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">TRecordUpdateResult</span> |<wbr> <span class="param-type">TRecordCreateResult</span> |<wbr> <span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id="start"><span class="type-signature">(async) </span>start<span class="signature">(conns<span class="signature-attributes">opt</span>, noRebuild<span class="signature-attributes">opt</span>)</span></h3><div class="description"><p>Start plugin</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>conns</code></td><td class="type"><span class="param-type">string</span> |<wbr> <span class="param-type">Array</span></td><td class="attributes">&lt;optional><br></td><td class="default">all</td><td class="description last"><p>Which connections should be run on start</p></td></tr><tr><td class="name"><code>noRebuild</code></td><td class="type"><span class="param-type">boolean</span></td><td class="attributes">&lt;optional><br></td><td class="default">false</td><td class="description last"><p>Set <code>true</code> to ALWAYS rebuild model on start. Yes, only set it to <code>true</code> if you REALLY know what you're doing!!!</p></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="index.js.html">index.js</a>, <a href="index.js.html#line250">line 250</a></li></ul></dd></div></dl><h3 class="name has-anchor" id=".sanitizeBody"><span class="type-signature">(async, static) </span>sanitizeBody<span class="signature">(options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h3><div class="description"><p>Sanitize payload body against schema</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><h6>Properties</h6><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>body</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr><tr><td class="name"><code>schema</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"></td></tr><tr><td class="name"><code>partial</code></td><td class="type"><span class="param-type">boolean</span></td><td class="attributes">&lt;optional><br></td><td class="default">false</td><td class="description last"></td></tr><tr><td class="name"><code>strict</code></td><td class="type"><span class="param-type">boolean</span></td><td class="attributes">&lt;optional><br></td><td class="default">false</td><td class="description last"></td></tr><tr><td class="name"><code>extFields</code></td><td class="type"><span class="param-type">Array</span></td><td class="attributes">&lt;optional><br></td><td class="default">[]</td><td class="description last"></td></tr></tbody></table></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_sanitize_body.js.html">method/sanitize/body.js</a>, <a href="method_sanitize_body.js.html#line16">line 16</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">Object</span></dd></dl></div><h3 class="name has-anchor" id=".sanitizeDate"><span class="type-signature">(static) </span>sanitizeDate<span class="signature">(value, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {string|Date}</span></h3><div class="description"><p>Sanitize value as a date/time value. Parse/format string using <a href="https://day.js.org/docs/en/display/format">dayjs format</a></p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>value</code></td><td class="type"><span class="param-type">number</span> |<wbr> <span class="param-type">string</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>Value to sanitize</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Options object</p><h6>Properties</h6><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>silent</code></td><td class="type"><span class="param-type">boolean</span></td><td class="attributes">&lt;optional><br></td><td class="default">true</td><td class="description last"><p>If <code>true</code> (default) and value isn't valid, returns empty</p></td></tr><tr><td class="name"><code>inputFormat</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes">&lt;optional><br></td><td class="default"></td><td class="description last"><p>If provided, parse value using this option</p></td></tr><tr><td class="name"><code>outputFormat</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes">&lt;optional><br></td><td class="default"></td><td class="description last"><p>If not provided or <code>native</code>, returns Javascript Date. Otherwise returns formatted date/time string</p></td></tr></tbody></table></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_sanitize_date.js.html">method/sanitize/date.js</a>, <a href="method_sanitize_date.js.html#line14">line 14</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">string</span> |<wbr> <span class="param-type">Date</span></dd></dl></div><h3 class="name has-anchor" id=".sanitizeId"><span class="type-signature">(static) </span>sanitizeId<span class="signature">(id, schema)</span><span class="type-signature"> &rarr; {number|string}</span></h3><div class="description"><p>Sanitize id according it's schema</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>id</code></td><td class="type"><span class="param-type">number</span> |<wbr> <span class="param-type">string</span></td><td class="description last"></td></tr><tr><td class="name"><code>schema</code></td><td class="type"><span class="param-type">Object</span></td><td class="description last"></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_sanitize_id.js.html">method/sanitize/id.js</a>, <a href="method_sanitize_id.js.html#line11">line 11</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">number</span> |<wbr> <span class="param-type">string</span></dd></dl></div><h3 class="name has-anchor" id=".validate"><span class="type-signature">(async, static) </span>validate<span class="signature">(value, joiSchema, options<span class="signature-attributes">opt</span>)</span><span class="type-signature"> &rarr; {Object}</span></h3><div class="description"><p>Validate value against JOI schema</p></div><div class="method-member-container flex flex-col w-100 overflow-auto mt-20"><strong>Parameters:</strong><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>value</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>value to validate</p></td></tr><tr><td class="name"><code>joiSchema</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes"></td><td class="default"></td><td class="description last"><p>JOI schema</p></td></tr><tr><td class="name"><code>options</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Options object</p><h6>Properties</h6><table class="params"><thead><tr><th>Name</th><th>Type</th><th>Attributes</th><th>Default</th><th class="last">Description</th></tr></thead><tbody><tr><td class="name"><code>ns</code></td><td class="type"><span class="param-type">string</span></td><td class="attributes">&lt;optional><br></td><td class="default">dobo</td><td class="description last"><p>Scope's namespace</p></td></tr><tr><td class="name"><code>fields</code></td><td class="type"><span class="param-type">Array</span></td><td class="attributes">&lt;optional><br></td><td class="default">[]</td><td class="description last"></td></tr><tr><td class="name"><code>extFields</code></td><td class="type"><span class="param-type">Array</span></td><td class="attributes">&lt;optional><br></td><td class="default">[]</td><td class="description last"></td></tr><tr><td class="name"><code>params</code></td><td class="type"><span class="param-type">Object</span></td><td class="attributes">&lt;optional><br></td><td class="default">{}</td><td class="description last"><p>Validation parameters. See config and <a href="https://joi.dev/api/?v=17.13.3#anyvalidateasyncvalue-options">JOI validate's options</a></p></td></tr></tbody></table></td></tr></tbody></table></div><dl class="details"><div class="details-item-container"><dt class="tag-source bold">Source</dt><dd class="tag-source"><ul><li><a href="method_validate.js.html">method/validate.js</a>, <a href="method_validate.js.html#line217">line 217</a></li></ul></dd></div></dl><div class="method-member-container mt-20"><strong>Returns:</strong><dl class="param-type"><dt>Type:&nbsp;</dt><dd><span class="param-type">Object</span></dd></dl></div></article></section></div></div></div><div class="search-container" id="PkfLWpAbet" style="display:none"><div class="wrapper" id="iCxFxjkHbP"><button class="icon-button search-close-button" id="VjLlGakifb" aria-label="close search"><svg><use xlink:href="#close-icon"></use></svg></button><div class="search-box-c"><svg><use xlink:href="#search-icon"></use></svg> <input type="text" id="vpcKVYIppa" class="search-input" placeholder="Search..." autofocus></div><div class="search-result-c" id="fWwVHRuDuN"><span class="search-result-c-text">Type anything to view search result</span></div></div></div><div class="mobile-menu-icon-container"><button class="icon-button" id="mobile-menu" data-isopen="false" aria-label="menu"><svg><use xlink:href="#menu-icon"></use></svg></button></div><div id="mobile-sidebar" class="mobile-sidebar-container"><div class="mobile-sidebar-wrapper"><a href="/" class="sidebar-title sidebar-title-anchor">Dobo API</a><div class="mobile-nav-links"><div class="navbar-item"><a id="" href="https://www.npmjs.com/package/dobo" target="">NPM</a></div><div class="navbar-item"><a id="" href="https://github.com/ardhi/dobo" target="">Github</a></div><div class="navbar-item"><a id="" href="https://dobo.bajo.app/" target="">Dobo</a></div><div class="navbar-item"><a id="" href="https://bajo.app/" target="">Bajo</a></div></div><div class="mobile-sidebar-items-c"><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-classes"><div>Classes</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="Dobo.html">Dobo</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-modules"><div>Modules</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="module-Lib.html">Lib</a></div></div><div class="sidebar-section-title with-arrow" data-isopen="false" id="sidebar-global"><div>Global</div><svg><use xlink:href="#down-icon"></use></svg></div><div class="sidebar-section-children-container"><div class="sidebar-section-children"><a href="global.html#TPropType">TPropType</a></div><div class="sidebar-section-children"><a href="global.html#TRecordCountOptions">TRecordCountOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordCreateOptions">TRecordCreateOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordFilter">TRecordFilter</a></div><div class="sidebar-section-children"><a href="global.html#TRecordFindOptions">TRecordFindOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordFindResult">TRecordFindResult</a></div><div class="sidebar-section-children"><a href="global.html#TRecordGetOptions">TRecordGetOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordGetResult">TRecordGetResult</a></div><div class="sidebar-section-children"><a href="global.html#TRecordPagination">TRecordPagination</a></div><div class="sidebar-section-children"><a href="global.html#TRecordRemoveOptions">TRecordRemoveOptions</a></div><div class="sidebar-section-children"><a href="global.html#TRecordSort">TRecordSort</a></div><div class="sidebar-section-children"><a href="global.html#TRecordSortKey">TRecordSortKey</a></div><div class="sidebar-section-children"><a href="global.html#TRecordUpdateOptions">TRecordUpdateOptions</a></div><div class="sidebar-section-children"><a href="global.html#TValidator">TValidator</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorBoolean">TValidatorBoolean</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorDate">TValidatorDate</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorNumber">TValidatorNumber</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorString">TValidatorString</a></div><div class="sidebar-section-children"><a href="global.html#TValidatorTimestamp">TValidatorTimestamp</a></div><div class="sidebar-section-children"><a href="global.html#factory">factory</a></div></div></div><div class="mobile-navbar-actions"><div class="navbar-right-item"><button class="icon-button search-button" aria-label="open-search"><svg><use xlink:href="#search-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button theme-toggle" aria-label="toggle-theme"><svg><use class="theme-svg-use" xlink:href="#dark-theme-icon"></use></svg></button></div><div class="navbar-right-item"><button class="icon-button font-size" aria-label="change-font-size"><svg><use xlink:href="#font-size-icon"></use></svg></button></div></div></div></div><script type="text/javascript" src="scripts/core.min.js"></script><script src="scripts/search.min.js" defer="defer"></script><script src="scripts/third-party/fuse.js" defer="defer"></script><script type="text/javascript">var tocbotInstance=tocbot.init({tocSelector:"#eed4d2a0bfd64539bb9df78095dec881",contentSelector:".main-content",headingSelector:"h1, h2, h3",hasInnerContainers:!0,scrollContainer:".main-content",headingsOffset:130,onClick:bringLinkToView})</script></body></html>
@@ -0,0 +1 @@
1
+ {"list":[{"title":"Dobo","link":"<a href=\"Dobo.html\">Dobo</a>"},{"title":"Dobo#connections","link":"<a href=\"Dobo.html#connections\">connections</a>"},{"title":"Dobo#drivers","link":"<a href=\"Dobo.html#drivers\">drivers</a>"},{"title":"Dobo#features","link":"<a href=\"Dobo.html#features\">features</a>"},{"title":"Dobo#init","link":"<a href=\"Dobo.html#init\">init</a>","description":"<p>Initialize plugin and performing the following tasks:</p>\n<ul>\n<li>{@link module:Lib.collectDrivers|Collecting all drivers}</li>\n<li>{@link module:Lib.collectConnections|Collecting all connections}</li>\n<li>{@link module:Lib.collectFeatures|Collecting all features}</li>\n<li>{@link module:Lib.collectSchemas|Collecting all schemas}</li>\n</ul>"},{"title":"Dobo#modelCreate","link":"<a href=\"Dobo.html#modelCreate\">modelCreate</a>","description":"<p>Create a new model:</p>\n<ul>\n<li>read corresponding schema</li>\n<li>attempt to create table/database/collection accordingly</li>\n</ul>"},{"title":"Dobo#modelDrop","link":"<a href=\"Dobo.html#modelDrop\">modelDrop</a>","description":"<p>Drop database model</p>"},{"title":"Dobo#modelExists","link":"<a href=\"Dobo.html#modelExists\">modelExists</a>","description":"<p>Check if model exists already</p>"},{"title":"Dobo#pickRecord","link":"<a href=\"Dobo.html#pickRecord\">pickRecord</a>","description":"<p>Pick only fields defined from a record</p>"},{"title":"Dobo#prepPagination","link":"<a href=\"Dobo.html#prepPagination\">prepPagination</a>","description":"<p>Prepare records pagination:</p>\n<ul>\n<li>making sure records limit is obeyed</li>\n<li>making sure page is a positive value</li>\n<li>if skip is given, recalculate limit to use skip instead of page number</li>\n<li>Build sort info</li>\n</ul>"},{"title":"Dobo#recordCount","link":"<a href=\"Dobo.html#recordCount\">recordCount</a>","description":"<p>Return the number of records found by given filter</p>"},{"title":"Dobo#recordCreate","link":"<a href=\"Dobo.html#recordCreate\">recordCreate</a>","description":"<p>Create a new record</p>\n<p>Example:</p>\n<pre class=\"prettyprint source lang-javascript\"><code>const { recordCreate } = this.app.dobo\nconst { body } = {\n id: 'ID',\n name: 'Indonesia',\n iso3: 'IDN'\n}\nconst result = await recordCreate('CdbCountry', body)\n</code></pre>"},{"title":"Dobo#recordFind","link":"<a href=\"Dobo.html#recordFind\">recordFind</a>","description":"<p>Find records by model's name and given filter</p>\n<p>Example: find records from model <strong>CdbCountry</strong> where its id is 'ID' or 'MY',\nsorted by <code>name</code> in ascending order and return only its <code>id</code>, <code>name</code> and <code>iso3</code></p>\n<pre class=\"prettyprint source lang-javascript\"><code>const { recordFind } = this.app.dobo\nconst query = { id: { $in: ['ID', 'MY'] } }\nconst sort = { name: 1 }\nconst fields = ['id', 'name', 'iso3']\nconst result = await recordFind('CdbCountry', { query, sort }, { fields })\n</code></pre>"},{"title":"Dobo#recordFindAll","link":"<a href=\"Dobo.html#recordFindAll\">recordFindAll</a>","description":"<p>Find all records by model's name and given filter.</p>\n<p>The total number of records returned is limited by <code>hardLimit</code> value set in {@tutorial config} file.</p>"},{"title":"Dobo#recordFindOne","link":"<a href=\"Dobo.html#recordFindOne\">recordFindOne</a>","description":"<p>Find the first record by model's name and given filter.</p>"},{"title":"Dobo#recordGet","link":"<a href=\"Dobo.html#recordGet\">recordGet</a>","description":"<p>Get record by model's name and record ID</p>\n<p>Example:</p>\n<pre class=\"prettyprint source lang-javascript\"><code>const { recordGet } = this.app.dobo\nconst fields = ['id', 'name', 'iso3']\nconst result = await recordGet('CdbCountry', 'ID', { fields })\n</code></pre>"},{"title":"Dobo#recordRemove","link":"<a href=\"Dobo.html#recordRemove\">recordRemove</a>","description":"<p>Remove existing record by it's ID. All attachments bound to this record will also be removed forever.</p>\n<p>Example:</p>\n<pre class=\"prettyprint source lang-javascript\"><code>const { recordRemove } = this.app.dobo\nconst result = await recordRemove('CdbCountry', 'ID')\n</code></pre>"},{"title":"Dobo#recordUpdate","link":"<a href=\"Dobo.html#recordUpdate\">recordUpdate</a>","description":"<p>Update a record by it's ID and body payload</p>\n<p>Example:</p>\n<pre class=\"prettyprint source lang-javascript\"><code>const { recordUpdate } = this.app.dobo\nconst { body } = {\n name: 'Republic of Indonesia',\n phoneCode: '+62'\n}\nconst result = await recordUpdate('CdbCountry', 'ID', body)\n</code></pre>"},{"title":"Dobo#recordUpsert","link":"<a href=\"Dobo.html#recordUpsert\">recordUpsert</a>","description":"<p>Update a record by payload's ID. If no record is found by given ID, a new one will be created instead.</p>\n<p>Missing ID in payload always results a new record creation.</p>\n<pre class=\"prettyprint source\"><code></code></pre>"},{"title":"Dobo#schemas","link":"<a href=\"Dobo.html#schemas\">schemas</a>"},{"title":"Dobo#start","link":"<a href=\"Dobo.html#start\">start</a>","description":"<p>Start plugin</p>"},{"title":"Dobo.aggregateTypes","link":"<a href=\"Dobo.html#.aggregateTypes\">aggregateTypes</a>"},{"title":"Dobo.alias","link":"<a href=\"Dobo.html#.alias\">alias</a>"},{"title":"Dobo.propType","link":"<a href=\"Dobo.html#.propType\">propType</a>"},{"title":"Dobo.sanitizeBody","link":"<a href=\"Dobo.html#.sanitizeBody\">sanitizeBody</a>","description":"<p>Sanitize payload body against schema</p>"},{"title":"Dobo.sanitizeDate","link":"<a href=\"Dobo.html#.sanitizeDate\">sanitizeDate</a>","description":"<p>Sanitize value as a date/time value. Parse/format string using {@link https://day.js.org/docs/en/display/format|dayjs format}</p>"},{"title":"Dobo.sanitizeId","link":"<a href=\"Dobo.html#.sanitizeId\">sanitizeId</a>","description":"<p>Sanitize id according it's schema</p>"},{"title":"Dobo.validate","link":"<a href=\"Dobo.html#.validate\">validate</a>","description":"<p>Validate value against JOI schema</p>"},{"title":"TPropType","link":"<a href=\"global.html#TPropType\">TPropType</a>"},{"title":"TRecordCountOptions","link":"<a href=\"global.html#TRecordCountOptions\">TRecordCountOptions</a>"},{"title":"TRecordCreateOptions","link":"<a href=\"global.html#TRecordCreateOptions\">TRecordCreateOptions</a>"},{"title":"TRecordFilter","link":"<a href=\"global.html#TRecordFilter\">TRecordFilter</a>"},{"title":"TRecordFindOptions","link":"<a href=\"global.html#TRecordFindOptions\">TRecordFindOptions</a>"},{"title":"TRecordFindResult","link":"<a href=\"global.html#TRecordFindResult\">TRecordFindResult</a>"},{"title":"TRecordGetOptions","link":"<a href=\"global.html#TRecordGetOptions\">TRecordGetOptions</a>"},{"title":"TRecordGetResult","link":"<a href=\"global.html#TRecordGetResult\">TRecordGetResult</a>"},{"title":"TRecordPagination","link":"<a href=\"global.html#TRecordPagination\">TRecordPagination</a>"},{"title":"TRecordRemoveOptions","link":"<a href=\"global.html#TRecordRemoveOptions\">TRecordRemoveOptions</a>"},{"title":"TRecordSort","link":"<a href=\"global.html#TRecordSort\">TRecordSort</a>","description":"<p>Key value pairs used as sort information:</p>\n<ul>\n<li>Key represent model's field name</li>\n<li>value represent its sort order: <code>1</code> for ascending order, and <code>-1</code> for descending order</li>\n</ul>\n<p>Example: to sort by firstName (ascending) and lastName (descending)</p>\n<pre class=\"prettyprint source lang-javascript\"><code>const sort = {\n firstName: 1,\n lastName: -1\n}\n</code></pre>"},{"title":"TRecordSortKey","link":"<a href=\"global.html#TRecordSortKey\">TRecordSortKey</a>"},{"title":"TRecordUpdateOptions","link":"<a href=\"global.html#TRecordUpdateOptions\">TRecordUpdateOptions</a>"},{"title":"TValidator","link":"<a href=\"global.html#TValidator\">TValidator</a>"},{"title":"TValidatorBoolean","link":"<a href=\"global.html#TValidatorBoolean\">TValidatorBoolean</a>"},{"title":"TValidatorDate","link":"<a href=\"global.html#TValidatorDate\">TValidatorDate</a>"},{"title":"TValidatorNumber","link":"<a href=\"global.html#TValidatorNumber\">TValidatorNumber</a>"},{"title":"TValidatorString","link":"<a href=\"global.html#TValidatorString\">TValidatorString</a>"},{"title":"TValidatorTimestamp","link":"<a href=\"global.html#TValidatorTimestamp\">TValidatorTimestamp</a>"},{"title":"factory","link":"<a href=\"global.html#factory\">factory</a>","description":"<p>Plugin factory</p>"},{"title":"module:Lib","link":"<a href=\"module-Lib.html\">Lib</a>"},{"title":"module:Lib.collectConnections","link":"<a href=\"module-Lib.html#.collectConnections\">collectConnections</a>","description":"<p>Collect all database connections from {@tutorial config}.</p>"},{"title":"module:Lib.collectDrivers","link":"<a href=\"module-Lib.html#.collectDrivers\">collectDrivers</a>","description":"<p>Collect all database drivers from loaded plugins</p>"},{"title":"module:Lib.collectFeatures","link":"<a href=\"module-Lib.html#.collectFeatures\">collectFeatures</a>","description":"<p>Collect all database features from all loaded plugins</p>"},{"title":"module:Lib.collectSchemas","link":"<a href=\"module-Lib.html#.collectSchemas\">collectSchemas</a>","description":"<p>Collect all database schemas from loaded plugins</p>"}]}
Binary file
Binary file