rhoconnect 3.4.5 → 4.0.0.beta.10

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 (337) hide show
  1. data/CHANGELOG.md +57 -3
  2. data/Gemfile +9 -7
  3. data/Gemfile.lock +37 -37
  4. data/Rakefile +18 -7
  5. data/bench/benchapp/Gemfile +1 -1
  6. data/bench/benchapp/config.ru +0 -3
  7. data/bench/benchapp/controllers/ruby/application.rb +17 -0
  8. data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
  9. data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
  10. data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
  11. data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
  12. data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
  13. data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
  14. data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
  15. data/bench/benchapp/spec/spec_helper.rb +2 -2
  16. data/bench/blobapp/Gemfile +1 -1
  17. data/bench/blobapp/config.ru +0 -3
  18. data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
  19. data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
  20. data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
  21. data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
  22. data/bench/blobapp/spec/spec_helper.rb +1 -1
  23. data/bench/lib/bench/cli.rb +1 -1
  24. data/bench/scripts/blob_cud_script.rb +1 -1
  25. data/bench/scripts/query_md_script.rb +1 -1
  26. data/bench/scripts/query_only_script.rb +1 -1
  27. data/bench/scripts/query_script.rb +1 -1
  28. data/bench/scripts/test_query_script.rb +7 -1
  29. data/bench/spec/mock_adapter_spec.rb +1 -1
  30. data/bench/spec/result_spec.rb +3 -3
  31. data/bin/rhoconnect +5 -3
  32. data/commands/dtach/dtach_install.rb +2 -2
  33. data/commands/execute.rb +8 -3
  34. data/commands/generators/app.rb +3 -3
  35. data/commands/generators/controller.rb +6 -0
  36. data/commands/generators/model.rb +6 -0
  37. data/commands/generators/source.rb +3 -3
  38. data/commands/generators/update.rb +1 -1
  39. data/commands/redis/redis_about.rb +2 -2
  40. data/commands/redis/redis_download.rb +1 -1
  41. data/commands/redis/redis_install.rb +4 -3
  42. data/commands/redis/redis_restart.rb +4 -4
  43. data/commands/redis/redis_start.rb +5 -4
  44. data/commands/redis/redis_startbg.rb +5 -4
  45. data/commands/redis/redis_status.rb +13 -0
  46. data/commands/redis/redis_stop.rb +3 -3
  47. data/commands/rhoconnect/config.rb +28 -16
  48. data/commands/rhoconnect/flushdb.rb +1 -2
  49. data/commands/rhoconnect/get_token.rb +15 -11
  50. data/commands/rhoconnect/restart.rb +13 -5
  51. data/commands/rhoconnect/set_admin_password.rb +8 -8
  52. data/commands/rhoconnect/start.rb +74 -16
  53. data/commands/rhoconnect/startbg.rb +1 -1
  54. data/commands/rhoconnect/startdebug.rb +1 -1
  55. data/commands/rhoconnect/stop.rb +13 -1
  56. data/commands/rhoconnect/web.rb +5 -5
  57. data/commands/rhoconnect_console/console.rb +7 -5
  58. data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
  59. data/commands/rhoconnect_war/war.rb +9 -9
  60. data/commands/utilities/blank_app.ru +56 -0
  61. data/commands/utilities/redis_runner.rb +54 -19
  62. data/doc/authentication.txt +80 -6
  63. data/doc/blob-sync.txt +104 -97
  64. data/doc/bulk-sync.txt +1 -1
  65. data/doc/client-java.txt +3 -3
  66. data/doc/client-objc.txt +2 -2
  67. data/doc/client.txt +4 -4
  68. data/doc/command-line.txt +105 -200
  69. data/doc/data-partitioning.txt +40 -0
  70. data/doc/deploying.txt +249 -77
  71. data/doc/extending-rhoconnect-server.txt +40 -57
  72. data/doc/heroku-addon.txt +2 -0
  73. data/doc/install.txt +45 -95
  74. data/doc/introduction.txt +1 -1
  75. data/doc/java-plugin.txt +365 -190
  76. data/doc/metadata.txt +1 -1
  77. data/doc/migration.txt +108 -142
  78. data/doc/preparing-production.txt +1 -1
  79. data/doc/push-backend-setup.txt +2 -0
  80. data/doc/push-client-setup-android.txt +78 -0
  81. data/doc/push-client-setup-bb.txt +81 -0
  82. data/doc/push-client-setup-ios.txt +70 -0
  83. data/doc/push-client-setup-rps.txt +200 -0
  84. data/doc/push-client-setup.txt +63 -66
  85. data/doc/push-server-setup.txt +67 -40
  86. data/doc/push-testing.txt +29 -0
  87. data/doc/push.txt +21 -6
  88. data/doc/rest-api.txt +128 -55
  89. data/doc/rhoconnect-redis-stack.txt +120 -0
  90. data/doc/settings.txt +4 -12
  91. data/doc/source-adapters-intro.txt +28 -0
  92. data/doc/source-adapters.txt +235 -272
  93. data/doc/stats-middleware.txt +9 -29
  94. data/doc/supported-platforms.txt +21 -30
  95. data/doc/testing.txt +40 -42
  96. data/doc/tutorial.txt +72 -57
  97. data/examples/simple/Gemfile +1 -1
  98. data/examples/simple/application.rb +4 -5
  99. data/examples/simple/my_server.rb +2 -2
  100. data/examples/simple/settings/settings.yml +1 -1
  101. data/generators/rhoconnect.rb +151 -50
  102. data/generators/templates/application/Gemfile +1 -1
  103. data/generators/templates/application/Rakefile +3 -3
  104. data/generators/templates/application/config.ru +1 -4
  105. data/generators/templates/application/controllers/application_controller.rb +17 -0
  106. data/generators/templates/application/controllers/js/application_controller.js +14 -0
  107. data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
  108. data/generators/templates/application/package.json +8 -0
  109. data/generators/templates/application/rcgemfile +2 -5
  110. data/generators/templates/application/settings/settings.yml +3 -3
  111. data/generators/templates/application/spec/application_controller_spec.rb +23 -0
  112. data/generators/templates/application/spec/js_spec.rb +25 -0
  113. data/generators/templates/application/spec/spec_helper.rb +21 -7
  114. data/generators/templates/source/controllers/js/controller.js +7 -0
  115. data/generators/templates/source/controllers/ruby/controller.rb +8 -0
  116. data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
  117. data/generators/templates/source/models/js/model.js +46 -0
  118. data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
  119. data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
  120. data/install.sh +5 -5
  121. data/installer/unix-like/create_texts.rb +2 -2
  122. data/installer/unix-like/rho_connect_install_constants.rb +2 -2
  123. data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
  124. data/installer/utils/constants.rb +4 -4
  125. data/js-adapters/ballroom.js +216 -0
  126. data/js-adapters/node.rb +52 -0
  127. data/js-adapters/node_channel.rb +181 -0
  128. data/js-adapters/request.js +27 -0
  129. data/js-adapters/response.js +57 -0
  130. data/js-adapters/rhoconnect_helpers.js +60 -0
  131. data/js-adapters/router.js +60 -0
  132. data/js-adapters/server.js +5 -0
  133. data/lib/rhoconnect/api/app/ans_login.rb +3 -3
  134. data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
  135. data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
  136. data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
  137. data/lib/rhoconnect/api/app/fast_update.rb +11 -10
  138. data/lib/rhoconnect/api/app/login.rb +5 -5
  139. data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
  140. data/lib/rhoconnect/api/app/push_objects.rb +12 -11
  141. data/lib/rhoconnect/api/app/query.rb +8 -7
  142. data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
  143. data/lib/rhoconnect/api/app/search.rb +8 -7
  144. data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
  145. data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
  146. data/lib/rhoconnect/api/client/create.rb +7 -7
  147. data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
  148. data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
  149. data/lib/rhoconnect/api/client/register.rb +12 -12
  150. data/lib/rhoconnect/api/client/reset.rb +5 -5
  151. data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
  152. data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
  153. data/lib/rhoconnect/api/source/list_sources.rb +16 -16
  154. data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
  155. data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
  156. data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
  157. data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
  158. data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
  159. data/lib/rhoconnect/api/system/login.rb +15 -15
  160. data/lib/rhoconnect/api/system/reset.rb +11 -11
  161. data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
  162. data/lib/rhoconnect/api/system/stats.rb +22 -22
  163. data/lib/rhoconnect/api/user/create_user.rb +7 -7
  164. data/lib/rhoconnect/api/user/delete_client.rb +6 -6
  165. data/lib/rhoconnect/api/user/delete_user.rb +11 -10
  166. data/lib/rhoconnect/api/user/list_clients.rb +4 -4
  167. data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
  168. data/lib/rhoconnect/api/user/list_users.rb +3 -3
  169. data/lib/rhoconnect/api/user/ping.rb +3 -3
  170. data/lib/rhoconnect/api/user/show_user.rb +3 -3
  171. data/lib/rhoconnect/api/user/update_user.rb +5 -5
  172. data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
  173. data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
  174. data/lib/rhoconnect/api_token.rb +5 -6
  175. data/lib/rhoconnect/app.rb +6 -46
  176. data/lib/rhoconnect/application/init.rb +5 -2
  177. data/lib/rhoconnect/async.rb +76 -39
  178. data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
  179. data/lib/rhoconnect/client.rb +59 -9
  180. data/lib/rhoconnect/condition/admin_required.rb +27 -0
  181. data/lib/rhoconnect/condition/client_required.rb +50 -0
  182. data/lib/rhoconnect/condition/login_required.rb +22 -0
  183. data/lib/rhoconnect/condition/source_required.rb +49 -0
  184. data/lib/rhoconnect/condition/verbs.rb +17 -0
  185. data/lib/rhoconnect/condition/verify_success.rb +19 -0
  186. data/lib/rhoconnect/controller/app_base.rb +74 -0
  187. data/lib/rhoconnect/controller/base.rb +68 -0
  188. data/lib/rhoconnect/controller/clients_controller.rb +79 -0
  189. data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
  190. data/lib/rhoconnect/controller/js_base.rb +124 -0
  191. data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
  192. data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
  193. data/lib/rhoconnect/controller/sources_controller.rb +44 -0
  194. data/lib/rhoconnect/controller/store_controller.rb +25 -0
  195. data/lib/rhoconnect/controller/system_controller.rb +67 -0
  196. data/lib/rhoconnect/controller/users_controller.rb +99 -0
  197. data/lib/rhoconnect/db_adapter.rb +1 -3
  198. data/lib/rhoconnect/document.rb +159 -50
  199. data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
  200. data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
  201. data/lib/rhoconnect/handler/authenticate.rb +3 -0
  202. data/lib/rhoconnect/handler/bulk_data.rb +28 -0
  203. data/lib/rhoconnect/handler/changes/engine.rb +271 -0
  204. data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
  205. data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
  206. data/lib/rhoconnect/handler/changes/runner.rb +53 -0
  207. data/lib/rhoconnect/handler/changes.rb +31 -0
  208. data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
  209. data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
  210. data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
  211. data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
  212. data/lib/rhoconnect/handler/helpers.rb +4 -0
  213. data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
  214. data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
  215. data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
  216. data/lib/rhoconnect/handler/query/engine.rb +93 -0
  217. data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
  218. data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
  219. data/lib/rhoconnect/handler/query/runner.rb +270 -0
  220. data/lib/rhoconnect/handler/query.rb +19 -0
  221. data/lib/rhoconnect/handler/search/engine.rb +60 -0
  222. data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
  223. data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
  224. data/lib/rhoconnect/handler/search/runner.rb +104 -0
  225. data/lib/rhoconnect/handler/search.rb +26 -0
  226. data/lib/rhoconnect/handler/sync.rb +29 -0
  227. data/lib/rhoconnect/jobs/source_job.rb +13 -4
  228. data/lib/rhoconnect/js_adapter.rb +79 -0
  229. data/lib/rhoconnect/license.rb +10 -2
  230. data/lib/rhoconnect/middleware/current_user.rb +14 -1
  231. data/lib/rhoconnect/middleware/helpers.rb +10 -93
  232. data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
  233. data/lib/rhoconnect/model/base.rb +229 -0
  234. data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
  235. data/lib/rhoconnect/model/js_base.rb +121 -0
  236. data/lib/rhoconnect/ping/android.rb +1 -1
  237. data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
  238. data/lib/rhoconnect/read_state.rb +3 -3
  239. data/lib/rhoconnect/server.rb +159 -190
  240. data/lib/rhoconnect/source.rb +100 -11
  241. data/lib/rhoconnect/stats/record.rb +10 -10
  242. data/lib/rhoconnect/store.rb +905 -591
  243. data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
  244. data/lib/rhoconnect/tasks.rb +18 -4
  245. data/lib/rhoconnect/test_methods.rb +30 -17
  246. data/lib/rhoconnect/user.rb +35 -17
  247. data/lib/rhoconnect/utilities.rb +1 -1
  248. data/lib/rhoconnect/version.rb +2 -2
  249. data/lib/rhoconnect/web-console/server.rb +29 -14
  250. data/lib/rhoconnect/web-console/views/home.js +10 -10
  251. data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
  252. data/lib/rhoconnect.rb +120 -51
  253. data/rhoconnect.gemspec +4 -3
  254. data/spec/api/api_helper.rb +1 -6
  255. data/spec/api/app/fast_delete_spec.rb +4 -4
  256. data/spec/api/app/fast_insert_spec.rb +4 -4
  257. data/spec/api/app/fast_update_spec.rb +8 -8
  258. data/spec/api/app/push_deletes_spec.rb +2 -2
  259. data/spec/api/app/push_objects_spec.rb +5 -5
  260. data/spec/api/client/client_get_db_doc_spec.rb +6 -4
  261. data/spec/api/client/client_set_db_doc_spec.rb +3 -2
  262. data/spec/api/client/get_client_params_spec.rb +14 -0
  263. data/spec/api/client/list_client_docs_spec.rb +30 -20
  264. data/spec/api/client/reset_spec.rb +36 -0
  265. data/spec/api/source/get_source_params_spec.rb +23 -17
  266. data/spec/api/system/get_license_info_spec.rb +0 -20
  267. data/spec/api/system/login_spec.rb +8 -0
  268. data/spec/api/system/reset_spec.rb +0 -1
  269. data/spec/api/system/stats_spec.rb +5 -5
  270. data/spec/api/user/create_user_spec.rb +14 -6
  271. data/spec/api/user/delete_user_spec.rb +20 -18
  272. data/spec/api/user/list_users_spec.rb +5 -6
  273. data/spec/api/user/update_user_spec.rb +5 -4
  274. data/spec/apps/rhotestapp/config.ru +16 -1
  275. data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
  276. data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
  277. data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
  278. data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
  279. data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
  280. data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
  281. data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
  282. data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
  283. data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
  284. data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
  285. data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
  286. data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
  287. data/spec/apps/rhotestapp/settings/settings.yml +0 -1
  288. data/spec/bulk_data/bulk_data_spec.rb +20 -5
  289. data/spec/cli/cli_spec.rb +83 -0
  290. data/spec/client_spec.rb +20 -17
  291. data/spec/client_sync_spec.rb +244 -406
  292. data/spec/controllers/js_base_spec.rb +89 -0
  293. data/spec/doc/doc_spec.rb +18 -18
  294. data/spec/document_spec.rb +29 -13
  295. data/spec/dynamic_adapter_spec.rb +6 -6
  296. data/spec/generator/generator_spec.rb +7 -4
  297. data/spec/jobs/bulk_data_job_spec.rb +14 -10
  298. data/spec/jobs/source_job_spec.rb +8 -8
  299. data/spec/license_spec.rb +5 -2
  300. data/spec/models/js_model_spec.rb +39 -0
  301. data/spec/node_spec.rb +42 -0
  302. data/spec/perf/store_perf_spec.rb +67 -12
  303. data/spec/ping/android_spec.rb +1 -1
  304. data/spec/read_state_spec.rb +1 -1
  305. data/spec/rhoconnect_spec.rb +1 -1
  306. data/spec/server/cors_spec.rb +14 -18
  307. data/spec/server/server_spec.rb +265 -88
  308. data/spec/server/stats_spec.rb +1 -1
  309. data/spec/source_adapter_spec.rb +54 -27
  310. data/spec/source_spec.rb +8 -3
  311. data/spec/source_sync_spec.rb +538 -468
  312. data/spec/spec_helper.rb +35 -4
  313. data/spec/stats/record_spec.rb +10 -10
  314. data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
  315. data/spec/store_spec.rb +159 -179
  316. data/spec/support/shared_examples.rb +36 -27
  317. data/spec/sync_states_spec.rb +40 -33
  318. data/spec/test_methods_spec.rb +18 -14
  319. data/spec/user_spec.rb +17 -30
  320. metadata +156 -52
  321. data/bench/benchapp/application.rb +0 -39
  322. data/bench/blobapp/application.rb +0 -44
  323. data/commands/rhoconnect/clean_start.rb +0 -9
  324. data/commands/rhoconnect/create_user.rb +0 -18
  325. data/commands/rhoconnect/delete_device.rb +0 -9
  326. data/commands/rhoconnect/delete_user.rb +0 -8
  327. data/commands/rhoconnect/reset.rb +0 -16
  328. data/commands/rhoconnect/reset_refresh.rb +0 -11
  329. data/generators/templates/application/application.rb +0 -43
  330. data/lib/rhoconnect/client_sync.rb +0 -434
  331. data/lib/rhoconnect/dynamic_adapter.rb +0 -91
  332. data/lib/rhoconnect/middleware/admin_user.rb +0 -23
  333. data/lib/rhoconnect/middleware/current_request.rb +0 -16
  334. data/lib/rhoconnect/middleware/login_required.rb +0 -22
  335. data/lib/rhoconnect/source_adapter.rb +0 -132
  336. data/lib/rhoconnect/source_sync.rb +0 -464
  337. data/spec/apps/rhotestapp/application.rb +0 -23
@@ -0,0 +1,79 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class ClientsController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ post "/", :admin_required => false, :login_required => true, \
12
+ :deprecated_route => {:verb => :get, :url => ['/application/clientcreate', '/api/application/clientcreate']} do
13
+ content_type :json
14
+ client = Client.create(:user_id => current_user.id,:app_id => current_app.id)
15
+ client.update_fields(params)
16
+ { "client" => { "client_id" => client.id.to_s } }.to_json
17
+ end
18
+
19
+ post "/:client_id/register", :admin_required => false, :login_required => true, \
20
+ :deprecated_route => {:verb => :post, :url => ['/application/clientregister', '/api/application/clientregister'] } do
21
+ cur_client = extract_current_client
22
+ if cur_client.nil? and current_user and current_app
23
+ fields = {:user_id => current_user.id}
24
+ fields[:id] = params[:client_id].to_s
25
+ fields[:app_id] = current_app.id
26
+ cur_client = Client.create(fields)
27
+ end
28
+ cur_client.update_fields(params)
29
+ status 200
30
+ end
31
+
32
+ post "/:client_id/reset", :admin_required => false, :login_required => true, :client_required => true, \
33
+ :deprecated_route => {:verb => :get, :url => ['/application/clientreset', '/api/application/clientreset']} do
34
+ # Resets the store for a given app,client
35
+ if params == nil or params[:sources] == nil
36
+ current_client.flush_all_documents
37
+ else
38
+ params[:sources].each do |source|
39
+ current_client.flush_source_documents(source['name'])
40
+ end
41
+ end
42
+ status 200
43
+ end
44
+
45
+ get "/:client_id/sources/:source_id/docs/:doc" do
46
+ c = Client.load(params[:client_id],{:source_name => params[:source_id]})
47
+ c.get_db_doc(params[:doc])
48
+ end
49
+
50
+ post "/:client_id/sources/:source_id/docs/:doc" do
51
+ c = Client.load(params[:client_id],{:source_name => params[:source_id]})
52
+ append_to_doc = params[:append]
53
+ append_to_doc ||= false
54
+ c.set_db_doc(params[:doc], params[:data],append_to_doc)
55
+ ''
56
+ end
57
+
58
+ get "/:client_id", \
59
+ :deprecated_route => {:verb => :post, :url => ['/api/get_client_params', '/api/client/get_client_params']} do
60
+ Client.load(params[:client_id],{:source_name => '*'}).to_array.to_json
61
+ end
62
+
63
+ get "/:client_id/sources/:source_id/docnames", \
64
+ :deprecated_route => {:verb => :post, :url => ['/api/list_client_docs', '/api/client/list_client_docs']} do
65
+ result = ""
66
+ Rhoconnect::Stats::Record.update('clientdocs') do
67
+ c = Client.load(params[:client_id],{:source_name => params[:source_id]})
68
+ res = {}
69
+ Client.valid_doctypes.each do |doc|
70
+ db_key = c.docname(doc)
71
+ res.merge!(doc => db_key)
72
+ end
73
+ result = res.to_json
74
+ end
75
+ result
76
+ end
77
+ end
78
+ end
79
+ end
@@ -0,0 +1,93 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class DynamicAdapterController < Rhoconnect::Controller::Base
4
+ set_default :admin_required, false
5
+ set_default :login_required, true
6
+ set_default :source_required, true
7
+ set_default :client_required, true
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ # QUERY
12
+ get "/:source_name", :rc_handler => :query do
13
+ @model.query(params[:query])
14
+ end
15
+
16
+ # CUD
17
+ post "/:source_name", :rc_handler => :cud do
18
+ operation = params[:operation]
19
+ @model.send operation.to_sym, params["#{operation}_object".to_sym]
20
+ end
21
+
22
+ put "/:source_name/:id", :rc_handler => :update do
23
+ @model.update(params[:update_object])
24
+ end
25
+
26
+ delete "/:source_name/:id", :rc_handler => :delete do
27
+ @model.delete(params[:delete_object])
28
+ end
29
+
30
+ # push objects
31
+ post "/:source_id/push_objects", \
32
+ { :rc_handler => :push_objects,
33
+ :admin_required => true,
34
+ :login_required => false,
35
+ :source_required => false,
36
+ :client_required => false,
37
+ :deprecated_route => {:verb => :post, :url => ['/api/push_objects', '/api/source/push_objects']}
38
+ } do
39
+ @model.push_objects(params)
40
+ end
41
+
42
+ # push_deletes
43
+ post "/:source_id/push_deletes", \
44
+ { :rc_handler => :push_deletes,
45
+ :admin_required => true,
46
+ :login_required => false,
47
+ :source_required => false,
48
+ :client_required => false,
49
+ :deprecated_route => {:verb => :post, :url => ['/api/push_deletes', '/api/source/push_deletes']}
50
+ } do
51
+ @model.push_deletes(params)
52
+ end
53
+
54
+ # fast insert
55
+ post "/:source_id/fast_insert", \
56
+ { :admin_required => true,
57
+ :login_required => false,
58
+ :source_required => false,
59
+ :client_required => false,
60
+ :deprecated_route => {:verb => :post, :url => ['/api/fast_insert', '/api/source/fast_insert']}
61
+ } do
62
+ do_fast_insert
63
+ end
64
+
65
+ # fast update
66
+ post "/:source_id/fast_update", \
67
+ { :admin_required => true,
68
+ :login_required => false,
69
+ :source_required => false,
70
+ :client_required => false,
71
+ :deprecated_route => {:verb => :post, :url => ['/api/fast_update', '/api/source/fast_update']}
72
+ } do
73
+ do_fast_update
74
+ end
75
+
76
+ # fast object delete
77
+ post "/:source_id/fast_delete", \
78
+ { :admin_required => true,
79
+ :login_required => false,
80
+ :source_required => false,
81
+ :client_required => false,
82
+ :deprecated_route => {:verb => :post, :url => ['/api/fast_delete', '/api/source/fast_delete']}
83
+ } do
84
+ do_fast_delete
85
+ end
86
+
87
+ private
88
+ def self.rest_path
89
+ "/app/#{Rhoconnect::API_VERSION}"
90
+ end
91
+ end
92
+ end
93
+ end
@@ -0,0 +1,124 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ module JsBaseHelpers
4
+ def query_finish(return_value)
5
+ @model.result = return_value
6
+ end
7
+ end
8
+
9
+ class JsBase < Rhoconnect::Controller::Base
10
+
11
+ # Add helpers for deprecated routes
12
+ Rhoconnect::DefaultServer.helpers Rhoconnect::Controller::JsBaseHelpers
13
+
14
+ helpers Rhoconnect::Controller::JsBaseHelpers
15
+
16
+ # source name is available inherently from controller
17
+ before do
18
+ params[:source_name] = self.class._rest_name
19
+ params[:source_id] = self.class._rest_name
20
+ end
21
+
22
+ def self.register_routes(json)
23
+ Rhoconnect::Model::JsBase.register_models(json['models'])
24
+ json['result'].each do |key,val|
25
+ controller_name = "#{key}Controller"
26
+ next if Object.const_defined?(controller_name)
27
+ if controller_name == 'ApplicationController'
28
+ klass = Object.const_set(controller_name, Class.new(Rhoconnect::Controller::JsAppBase))
29
+ else
30
+ klass = Object.const_set(controller_name, Class.new(Rhoconnect::Controller::JsBase))
31
+ end
32
+ Rhoconnect.add_to_url_map(klass)
33
+ process_defaults(klass,val['defaults'])
34
+ process_routes(klass,val['routes'])
35
+ end
36
+ end
37
+
38
+ private
39
+
40
+ def self.process_defaults(klass,defaults)
41
+ defaults.each do |default|
42
+ default.each do |key,val|
43
+ klass.send(:set_default,key,val)
44
+ end
45
+ end
46
+ end
47
+
48
+ def self.process_routes(klass,routes)
49
+ routes.each do |r|
50
+ opts = {}
51
+ s_route = r.split('_rjs_')
52
+ verb = s_route[0]
53
+ action = s_route[2]
54
+ opts = hshify(s_route[3]) if s_route[3]
55
+ block = js_block(r)
56
+ case opts[:rc_handler]
57
+ when 'query'
58
+ block = js_block(r,:query_finish)
59
+ end
60
+ klass.send(verb,action,opts,&block)
61
+ end
62
+ end
63
+
64
+ def self.hshify(str)
65
+ result = JSON.parse(str, :symbolize_names => true)
66
+ # result = str.split(",").inject({}) do |res,element|
67
+ # items = element.split(":")
68
+ # res[items[0].to_sym] = items[1]
69
+ # res
70
+ # end
71
+ result
72
+ end
73
+
74
+ def self.js_block(key,finish_block=nil)
75
+ Proc.new do
76
+ json = {
77
+ :url => key,
78
+ :args => params,
79
+ :model => under_score(params[:source_name]),
80
+ :route => 'request'
81
+ }
82
+ return_value = NodeChannel.publish_channel_and_wait(json,@model)
83
+ if finish_block
84
+ self.send(finish_block, return_value)
85
+ else
86
+ return_value
87
+ end
88
+ end
89
+ end
90
+
91
+ def self._prefix
92
+ "app/#{Rhoconnect::API_VERSION}"
93
+ end
94
+
95
+ end
96
+ class JsAppBase < Rhoconnect::Controller::JsBase
97
+ set_default :admin_required, false
98
+ set_default :login_required, false
99
+ set_default :source_required, false
100
+ set_default :client_required, false
101
+
102
+ def self.inherited(subclass)
103
+ subclass.set_default :admin_required, false
104
+ subclass.set_default :login_required, false
105
+ subclass.set_default :source_required, false
106
+ subclass.set_default :client_required, false
107
+ super
108
+ end
109
+
110
+ register Rhoconnect::Handler::Search
111
+ register Rhoconnect::Handler::BulkData
112
+
113
+ # main app controller
114
+ def self._rest_name
115
+ "app"
116
+ end
117
+
118
+ private
119
+ def self._prefix
120
+ "rc/#{Rhoconnect::API_VERSION}"
121
+ end
122
+ end
123
+ end
124
+ end
@@ -0,0 +1,22 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class ReadStateController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ put "/users/:user_name/sources/:source_name", \
12
+ :deprecated_route => {:verb => :post, :url => ['/api/set_refresh_time', '/api/source/set_refresh_time']} do
13
+ source = Source.load(params[:source_name],
14
+ {:app_id => APP_NAME, :user_id => params[:user_name]})
15
+ source.poll_interval = params[:poll_interval] if params[:poll_interval]
16
+ params[:refresh_time] ||= 0
17
+ source.read_state.refresh_time = Time.now.to_i + params[:refresh_time].to_i
18
+ ''
19
+ end
20
+ end
21
+ end
22
+ end
@@ -0,0 +1,14 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class SourceAdapterBase < Rhoconnect::Controller::Base
4
+ # create SourceAdapterController class for every source
5
+ def self.register_controller(source_name)
6
+ return if Object.const_defined?("#{source_name}Controller")
7
+ # klass will be added automatically to the URL map
8
+ klass = Object.const_set("#{source_name}Controller", Class.new(Rhoconnect::Controller::SourceAdapterBase))
9
+ klass.register Rhoconnect::EndPoint
10
+ klass.register Rhoconnect::Handler::Sync
11
+ end
12
+ end
13
+ end
14
+ end
@@ -0,0 +1,44 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class SourcesController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ # get source's params
12
+ get "/:source_id", \
13
+ :deprecated_route => {:verb => :post, :url => ['/api/get_source_params', '/api/source/get_source_params']} do
14
+ Source.load(params[:source_id],{:app_id => APP_NAME,:user_id => '*'}).to_array.to_json
15
+ end
16
+
17
+ # get all sources with particular partition type
18
+ get "/type/:partition_type", \
19
+ :deprecated_route => {:verb => :post, :url => ['/api/list_sources', '/api/source/list_sources']} do
20
+ sources = App.load(APP_NAME).sources
21
+ if params['partition_type'].nil? or params['partition_type'] == 'all'
22
+ sources.to_json
23
+ else
24
+ res = []
25
+ sources.each do |name|
26
+ s = Source.load(name,{:app_id => APP_NAME,:user_id => '*'})
27
+ if s and s.partition_type and s.partition_type == params['partition_type'].to_sym
28
+ res << name
29
+ end
30
+ end
31
+ res.to_json
32
+ end
33
+ end
34
+
35
+ # update source's params
36
+ put "/:source_id" do
37
+ source = Source.load(params[:source_id],
38
+ {:app_id => APP_NAME, :user_id => '*'})
39
+ source.update_fields(params[:data])
40
+ ''
41
+ end
42
+ end
43
+ end
44
+ end
@@ -0,0 +1,25 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class StoreController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ get "/:doc", \
12
+ :deprecated_route => {:verb => :post, :url => ['/api/get_db_doc', '/api/source/get_db_doc']} do
13
+ Store.get_db_doc(params[:doc])
14
+ end
15
+
16
+ post "/:doc", \
17
+ :deprecated_route => {:verb => :post, :url => ['/api/set_db_doc', '/api/source/set_db_doc'] } do
18
+ append_to_doc = params[:append]
19
+ append_to_doc ||= false
20
+ Store.set_db_doc(params[:doc],params[:data],append_to_doc)
21
+ ''
22
+ end
23
+ end
24
+ end
25
+ end
@@ -0,0 +1,67 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class SystemController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ get "/appserver", \
12
+ :deprecated_route => {:verb => :post, :url => ['/api/get_adapter', '/api/source/get_adapter']} do
13
+ {:adapter_url => Rhoconnect.appserver}.to_json
14
+ end
15
+
16
+ post "/appserver", \
17
+ :deprecated_route => {:verb => :post, :url => ['/api/save_adapter', '/api/source/save_adapter']} do
18
+ Rhoconnect.appserver = params['adapter_url'] || params[:attributes]['adapter_url']
19
+ end
20
+
21
+ get "/license", \
22
+ :deprecated_route => {:verb => :post, :url => ['/api/get_license_info', '/api/admin/get_license_info']} do
23
+ {:rhoconnect_version => Rhoconnect.license.rhoconnect_version,
24
+ :licensee => Rhoconnect.license.licensee,
25
+ :seats => Rhoconnect.license.seats,
26
+ :issued => Rhoconnect.license.issued,
27
+ :available => Rhoconnect.license.available }.to_json
28
+ end
29
+
30
+ post "/login", :rc_handler => :admin_authenticate, :admin_required => false, :deprecated_route => {:verb => :post, :url => ['/login', '/api/admin/login']} do
31
+ user = User.authenticate(params[:login], params[:password])
32
+ end
33
+
34
+ post "/reset", :deprecated_route => {:verb => :post, :url => ['/api/reset', '/api/admin/reset']} do
35
+ keep_token = current_user.token.value
36
+ Store.flush_all
37
+ Rhoconnect.bootstrap(Rhoconnect.base_directory)
38
+ # restoring previous token value after flushdb
39
+ current_user.token = keep_token
40
+ "DB reset"
41
+ end
42
+
43
+ get "/stats", \
44
+ :deprecated_route => {:verb => :post, :url => ['/api/stats', '/api/admin/stats']} do
45
+ if Rhoconnect.stats == true
46
+ names = params[:names]
47
+ if names
48
+ Rhoconnect::Stats::Record.keys(names).to_json
49
+ else
50
+ metric = params[:metric]
51
+ rtype = Rhoconnect::Stats::Record.rtype(metric)
52
+ if rtype == 'zset'
53
+ # returns [] if no results
54
+ Rhoconnect::Stats::Record.range(metric,params[:start],params[:finish]).to_json
55
+ elsif rtype == 'string'
56
+ Rhoconnect::Stats::Record.get_value(metric) || ''
57
+ else
58
+ raise ApiException.new(404, "Unknown metric")
59
+ end
60
+ end
61
+ else
62
+ raise ApiException.new(500, "Stats not enabled")
63
+ end
64
+ end
65
+ end
66
+ end
67
+ end
@@ -0,0 +1,99 @@
1
+ module Rhoconnect
2
+ module Controller
3
+ class UsersController < Rhoconnect::Controller::APIBase
4
+ set_default :admin_required, true
5
+ set_default :login_required, false
6
+ set_default :source_required, false
7
+ set_default :client_required, false
8
+
9
+ register Rhoconnect::EndPoint
10
+
11
+ # show users
12
+ get "/", :admin_required => true, :deprecated_route => {:verb => :post, :url => ['/api/list_users', '/api/user/list_users']} do
13
+ current_app.users.members.to_json
14
+ end
15
+
16
+ # show user
17
+ get "/:user_id" do
18
+ User.load(params[:user_id]).to_array.to_json
19
+ end
20
+
21
+ # create user
22
+ post "/", :deprecated_route => { :url => "/api/create_user", :verb => :post } do
23
+ app = current_app
24
+ u = User.create({:login => params[:attributes][:login]})
25
+ u.password = params[:attributes]['password']
26
+ app.users << u.login
27
+ "User created"
28
+ end
29
+
30
+ # update user
31
+ put "/:user_id", :deprecated_route => {:verb => :post, :url => ["/api/update_user", '/api/user/update_user']} do
32
+ User.load(params[:user_id]).update(params[:attributes])
33
+ "User updated"
34
+ end
35
+
36
+ # delete user
37
+ delete "/:user_id", :deprecated_route => {:verb => :post, :url => ['/api/delete_user', '/api/user/delete_user']} do
38
+ app = current_app
39
+ User.load(params[:user_id]).delete
40
+ app.users.delete(params[:user_id])
41
+ s_params = {:app_id => APP_NAME,:user_id => params[:user_id]}
42
+ app.sources.each{ |source|
43
+ Source.load(source, s_params).flush_store_data
44
+ }
45
+ "User deleted"
46
+ end
47
+
48
+ # get user's clients
49
+ get "/:user_id/clients", :admin_required => true, \
50
+ :deprecated_route => {:verb => :post, :url => ['/api/list_clients', '/api/client/list_clients']} do
51
+ User.load(params[:user_id]).clients.members.to_json
52
+ end
53
+
54
+ # delete user's client
55
+ delete "/:user_id/clients/:client_id", :admin_required => true, \
56
+ :deprecated_route => {:verb => :post, :url => ['/api/delete_client', '/api/client/delete_client']} do
57
+ Client.load(params[:client_id],{:source_name => '*'}).delete
58
+ User.load(params[:user_id]).clients.delete(params[:client_id])
59
+ "Client deleted"
60
+ end
61
+
62
+ # get user's docnames
63
+ get "/:user_id/sources/:source_id/docnames", :admin_required => true, \
64
+ :deprecated_route => {:verb => :post, :url => ['/api/list_source_docs', '/api/source/list_source_docs']} do
65
+ res = {}
66
+ s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
67
+ [:md,:md_size,:md_copy,:errors].each do |doc|
68
+ db_key = s.docname(doc)
69
+ res.merge!(doc => db_key)
70
+ end
71
+ res.to_json
72
+ end
73
+
74
+ # get user's DB document
75
+ get "/:user_id/sources/:source_id/docs/:doc", :admin_required => true do
76
+ s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
77
+ db_key = s.docname(params[:doc])
78
+ Store.get_db_doc(db_key)
79
+ end
80
+
81
+ # set user's DB document
82
+ post "/:user_id/sources/:source_id/docs/:doc", :admin_required => true do
83
+ throw :halt, [500, "Unknown user '#{params[:user_id]}'"] unless User.is_exist?(params[:user_id])
84
+
85
+ s = Source.load(params[:source_id], {:app_id => APP_NAME,:user_id => params[:user_id]})
86
+ db_key = s.docname(params[:doc])
87
+ append_to_doc = params[:append]
88
+ append_to_doc ||= false
89
+ Store.set_db_doc(db_key,params[:data],append_to_doc)
90
+ ''
91
+ end
92
+
93
+ # ping user's client
94
+ post "/ping", :admin_required => true, :deprecated_route => {:verb => :post, :url => ['/api/ping', '/api/client/ping']} do
95
+ User.ping(params)
96
+ end
97
+ end
98
+ end
99
+ end
@@ -9,9 +9,7 @@ class DBAdapter
9
9
  def get_connection(dbfile)
10
10
  if defined?(JRUBY_VERSION) # JRuby
11
11
  require 'dbi'
12
- require 'dbd/Jdbc'
13
- require 'jdbc/sqlite3'
14
-
12
+
15
13
  db = DBI.connect("DBI:Jdbc:SQLite:#{dbfile}", nil, nil, 'driver' => 'org.sqlite.JDBC')
16
14
  class << db
17
15
  # jdbc/sqlite3 has no Database#execute_batch method