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.
- data/CHANGELOG.md +57 -3
- data/Gemfile +9 -7
- data/Gemfile.lock +37 -37
- data/Rakefile +18 -7
- data/bench/benchapp/Gemfile +1 -1
- data/bench/benchapp/config.ru +0 -3
- data/bench/benchapp/controllers/ruby/application.rb +17 -0
- data/bench/benchapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/benchapp/controllers/ruby/mock_adapter_controller.rb +8 -0
- data/bench/benchapp/controllers/ruby/queue_mock_adapter_controller.rb +8 -0
- data/bench/benchapp/{sources → models/ruby}/mock_adapter.rb +1 -1
- data/bench/benchapp/{sources → models/ruby}/queue_mock_adapter.rb +0 -0
- data/bench/benchapp/spec/{sources → models/ruby}/mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/{sources → models/ruby}/queue_mock_adapter_spec.rb +1 -1
- data/bench/benchapp/spec/spec_helper.rb +2 -2
- data/bench/blobapp/Gemfile +1 -1
- data/bench/blobapp/config.ru +0 -3
- data/bench/blobapp/controllers/ruby/application_controller.rb +17 -0
- data/bench/blobapp/controllers/ruby/blob_adapter_controller.rb +8 -0
- data/bench/blobapp/{sources → models/ruby}/blob_adapter.rb +9 -2
- data/bench/blobapp/spec/{sources → models/ruby}/blob_adapter_spec.rb +1 -1
- data/bench/blobapp/spec/spec_helper.rb +1 -1
- data/bench/lib/bench/cli.rb +1 -1
- data/bench/scripts/blob_cud_script.rb +1 -1
- data/bench/scripts/query_md_script.rb +1 -1
- data/bench/scripts/query_only_script.rb +1 -1
- data/bench/scripts/query_script.rb +1 -1
- data/bench/scripts/test_query_script.rb +7 -1
- data/bench/spec/mock_adapter_spec.rb +1 -1
- data/bench/spec/result_spec.rb +3 -3
- data/bin/rhoconnect +5 -3
- data/commands/dtach/dtach_install.rb +2 -2
- data/commands/execute.rb +8 -3
- data/commands/generators/app.rb +3 -3
- data/commands/generators/controller.rb +6 -0
- data/commands/generators/model.rb +6 -0
- data/commands/generators/source.rb +3 -3
- data/commands/generators/update.rb +1 -1
- data/commands/redis/redis_about.rb +2 -2
- data/commands/redis/redis_download.rb +1 -1
- data/commands/redis/redis_install.rb +4 -3
- data/commands/redis/redis_restart.rb +4 -4
- data/commands/redis/redis_start.rb +5 -4
- data/commands/redis/redis_startbg.rb +5 -4
- data/commands/redis/redis_status.rb +13 -0
- data/commands/redis/redis_stop.rb +3 -3
- data/commands/rhoconnect/config.rb +28 -16
- data/commands/rhoconnect/flushdb.rb +1 -2
- data/commands/rhoconnect/get_token.rb +15 -11
- data/commands/rhoconnect/restart.rb +13 -5
- data/commands/rhoconnect/set_admin_password.rb +8 -8
- data/commands/rhoconnect/start.rb +74 -16
- data/commands/rhoconnect/startbg.rb +1 -1
- data/commands/rhoconnect/startdebug.rb +1 -1
- data/commands/rhoconnect/stop.rb +13 -1
- data/commands/rhoconnect/web.rb +5 -5
- data/commands/rhoconnect_console/console.rb +7 -5
- data/commands/{rhoconnect → rhoconnect_spec}/spec.rb +0 -0
- data/commands/rhoconnect_war/war.rb +9 -9
- data/commands/utilities/blank_app.ru +56 -0
- data/commands/utilities/redis_runner.rb +54 -19
- data/doc/authentication.txt +80 -6
- data/doc/blob-sync.txt +104 -97
- data/doc/bulk-sync.txt +1 -1
- data/doc/client-java.txt +3 -3
- data/doc/client-objc.txt +2 -2
- data/doc/client.txt +4 -4
- data/doc/command-line.txt +105 -200
- data/doc/data-partitioning.txt +40 -0
- data/doc/deploying.txt +249 -77
- data/doc/extending-rhoconnect-server.txt +40 -57
- data/doc/heroku-addon.txt +2 -0
- data/doc/install.txt +45 -95
- data/doc/introduction.txt +1 -1
- data/doc/java-plugin.txt +365 -190
- data/doc/metadata.txt +1 -1
- data/doc/migration.txt +108 -142
- data/doc/preparing-production.txt +1 -1
- data/doc/push-backend-setup.txt +2 -0
- data/doc/push-client-setup-android.txt +78 -0
- data/doc/push-client-setup-bb.txt +81 -0
- data/doc/push-client-setup-ios.txt +70 -0
- data/doc/push-client-setup-rps.txt +200 -0
- data/doc/push-client-setup.txt +63 -66
- data/doc/push-server-setup.txt +67 -40
- data/doc/push-testing.txt +29 -0
- data/doc/push.txt +21 -6
- data/doc/rest-api.txt +128 -55
- data/doc/rhoconnect-redis-stack.txt +120 -0
- data/doc/settings.txt +4 -12
- data/doc/source-adapters-intro.txt +28 -0
- data/doc/source-adapters.txt +235 -272
- data/doc/stats-middleware.txt +9 -29
- data/doc/supported-platforms.txt +21 -30
- data/doc/testing.txt +40 -42
- data/doc/tutorial.txt +72 -57
- data/examples/simple/Gemfile +1 -1
- data/examples/simple/application.rb +4 -5
- data/examples/simple/my_server.rb +2 -2
- data/examples/simple/settings/settings.yml +1 -1
- data/generators/rhoconnect.rb +151 -50
- data/generators/templates/application/Gemfile +1 -1
- data/generators/templates/application/Rakefile +3 -3
- data/generators/templates/application/config.ru +1 -4
- data/generators/templates/application/controllers/application_controller.rb +17 -0
- data/generators/templates/application/controllers/js/application_controller.js +14 -0
- data/generators/templates/application/controllers/ruby/application_controller.rb +17 -0
- data/generators/templates/application/package.json +8 -0
- data/generators/templates/application/rcgemfile +2 -5
- data/generators/templates/application/settings/settings.yml +3 -3
- data/generators/templates/application/spec/application_controller_spec.rb +23 -0
- data/generators/templates/application/spec/js_spec.rb +25 -0
- data/generators/templates/application/spec/spec_helper.rb +21 -7
- data/generators/templates/source/controllers/js/controller.js +7 -0
- data/generators/templates/source/controllers/ruby/controller.rb +8 -0
- data/generators/templates/source/controllers/ruby/controller_spec.rb +27 -0
- data/generators/templates/source/models/js/model.js +46 -0
- data/generators/templates/source/{source_adapter.rb → models/ruby/model.rb} +15 -10
- data/generators/templates/source/{source_spec.rb → models/ruby/model_spec.rb} +1 -1
- data/install.sh +5 -5
- data/installer/unix-like/create_texts.rb +2 -2
- data/installer/unix-like/rho_connect_install_constants.rb +2 -2
- data/installer/unix-like/rho_connect_install_utilities.rb +1 -1
- data/installer/utils/constants.rb +4 -4
- data/js-adapters/ballroom.js +216 -0
- data/js-adapters/node.rb +52 -0
- data/js-adapters/node_channel.rb +181 -0
- data/js-adapters/request.js +27 -0
- data/js-adapters/response.js +57 -0
- data/js-adapters/rhoconnect_helpers.js +60 -0
- data/js-adapters/router.js +60 -0
- data/js-adapters/server.js +5 -0
- data/lib/rhoconnect/api/app/ans_login.rb +3 -3
- data/lib/rhoconnect/api/app/bulk_data.rb +10 -10
- data/lib/rhoconnect/api/app/fast_delete.rb +11 -10
- data/lib/rhoconnect/api/app/fast_insert.rb +11 -10
- data/lib/rhoconnect/api/app/fast_update.rb +11 -10
- data/lib/rhoconnect/api/app/login.rb +5 -5
- data/lib/rhoconnect/api/app/push_deletes.rb +12 -11
- data/lib/rhoconnect/api/app/push_objects.rb +12 -11
- data/lib/rhoconnect/api/app/query.rb +8 -7
- data/lib/rhoconnect/api/app/queue_updates.rb +98 -94
- data/lib/rhoconnect/api/app/search.rb +8 -7
- data/lib/rhoconnect/api/client/client_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/client/client_set_db_doc.rb +8 -8
- data/lib/rhoconnect/api/client/create.rb +7 -7
- data/lib/rhoconnect/api/client/get_client_params.rb +4 -4
- data/lib/rhoconnect/api/client/list_client_docs.rb +17 -17
- data/lib/rhoconnect/api/client/register.rb +12 -12
- data/lib/rhoconnect/api/client/reset.rb +5 -5
- data/lib/rhoconnect/api/readstate/set_refresh_time.rb +9 -9
- data/lib/rhoconnect/api/source/get_source_params.rb +4 -4
- data/lib/rhoconnect/api/source/list_sources.rb +16 -16
- data/lib/rhoconnect/api/source/update_source_params.rb +6 -6
- data/lib/rhoconnect/api/store/get_db_doc.rb +4 -4
- data/lib/rhoconnect/api/store/set_db_doc.rb +7 -7
- data/lib/rhoconnect/api/system/get_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/get_license_info.rb +8 -8
- data/lib/rhoconnect/api/system/login.rb +15 -15
- data/lib/rhoconnect/api/system/reset.rb +11 -11
- data/lib/rhoconnect/api/system/save_adapter.rb +4 -4
- data/lib/rhoconnect/api/system/stats.rb +22 -22
- data/lib/rhoconnect/api/user/create_user.rb +7 -7
- data/lib/rhoconnect/api/user/delete_client.rb +6 -6
- data/lib/rhoconnect/api/user/delete_user.rb +11 -10
- data/lib/rhoconnect/api/user/list_clients.rb +4 -4
- data/lib/rhoconnect/api/user/list_source_docs.rb +10 -10
- data/lib/rhoconnect/api/user/list_users.rb +3 -3
- data/lib/rhoconnect/api/user/ping.rb +3 -3
- data/lib/rhoconnect/api/user/show_user.rb +3 -3
- data/lib/rhoconnect/api/user/update_user.rb +5 -5
- data/lib/rhoconnect/api/user/user_get_db_doc.rb +5 -5
- data/lib/rhoconnect/api/user/user_set_db_doc.rb +10 -10
- data/lib/rhoconnect/api_token.rb +5 -6
- data/lib/rhoconnect/app.rb +6 -46
- data/lib/rhoconnect/application/init.rb +5 -2
- data/lib/rhoconnect/async.rb +76 -39
- data/lib/rhoconnect/bulk_data/bulk_data.rb +6 -4
- data/lib/rhoconnect/client.rb +59 -9
- data/lib/rhoconnect/condition/admin_required.rb +27 -0
- data/lib/rhoconnect/condition/client_required.rb +50 -0
- data/lib/rhoconnect/condition/login_required.rb +22 -0
- data/lib/rhoconnect/condition/source_required.rb +49 -0
- data/lib/rhoconnect/condition/verbs.rb +17 -0
- data/lib/rhoconnect/condition/verify_success.rb +19 -0
- data/lib/rhoconnect/controller/app_base.rb +74 -0
- data/lib/rhoconnect/controller/base.rb +68 -0
- data/lib/rhoconnect/controller/clients_controller.rb +79 -0
- data/lib/rhoconnect/controller/dynamic_adapter_controller.rb +93 -0
- data/lib/rhoconnect/controller/js_base.rb +124 -0
- data/lib/rhoconnect/controller/read_state_controller.rb +22 -0
- data/lib/rhoconnect/controller/source_adapter_base.rb +14 -0
- data/lib/rhoconnect/controller/sources_controller.rb +44 -0
- data/lib/rhoconnect/controller/store_controller.rb +25 -0
- data/lib/rhoconnect/controller/system_controller.rb +67 -0
- data/lib/rhoconnect/controller/users_controller.rb +99 -0
- data/lib/rhoconnect/db_adapter.rb +1 -3
- data/lib/rhoconnect/document.rb +159 -50
- data/lib/rhoconnect/handler/authenticate/execute_methods.rb +77 -0
- data/lib/rhoconnect/handler/authenticate/runner.rb +49 -0
- data/lib/rhoconnect/handler/authenticate.rb +3 -0
- data/lib/rhoconnect/handler/bulk_data.rb +28 -0
- data/lib/rhoconnect/handler/changes/engine.rb +271 -0
- data/lib/rhoconnect/handler/changes/execute_methods.rb +88 -0
- data/lib/rhoconnect/handler/changes/pass_through_runner.rb +11 -0
- data/lib/rhoconnect/handler/changes/runner.rb +53 -0
- data/lib/rhoconnect/handler/changes.rb +31 -0
- data/lib/rhoconnect/handler/helpers/auth_method.rb +29 -0
- data/lib/rhoconnect/handler/helpers/binding.rb +18 -0
- data/lib/rhoconnect/handler/helpers/bulk_data.rb +53 -0
- data/lib/rhoconnect/handler/helpers/source_job.rb +14 -0
- data/lib/rhoconnect/handler/helpers.rb +4 -0
- data/lib/rhoconnect/handler/plugin_callbacks/execute_methods.rb +99 -0
- data/lib/rhoconnect/handler/plugin_callbacks/runner.rb +28 -0
- data/lib/rhoconnect/handler/plugin_callbacks.rb +67 -0
- data/lib/rhoconnect/handler/query/engine.rb +93 -0
- data/lib/rhoconnect/handler/query/execute_methods.rb +21 -0
- data/lib/rhoconnect/handler/query/pass_through_runner.rb +35 -0
- data/lib/rhoconnect/handler/query/runner.rb +270 -0
- data/lib/rhoconnect/handler/query.rb +19 -0
- data/lib/rhoconnect/handler/search/engine.rb +60 -0
- data/lib/rhoconnect/handler/search/execute_methods.rb +32 -0
- data/lib/rhoconnect/handler/search/pass_through_runner.rb +18 -0
- data/lib/rhoconnect/handler/search/runner.rb +104 -0
- data/lib/rhoconnect/handler/search.rb +26 -0
- data/lib/rhoconnect/handler/sync.rb +29 -0
- data/lib/rhoconnect/jobs/source_job.rb +13 -4
- data/lib/rhoconnect/js_adapter.rb +79 -0
- data/lib/rhoconnect/license.rb +10 -2
- data/lib/rhoconnect/middleware/current_user.rb +14 -1
- data/lib/rhoconnect/middleware/helpers.rb +10 -93
- data/lib/rhoconnect/middleware/x_domain_session_wrapper.rb +1 -1
- data/lib/rhoconnect/model/base.rb +229 -0
- data/lib/rhoconnect/model/dynamic_adapter_model.rb +90 -0
- data/lib/rhoconnect/model/js_base.rb +121 -0
- data/lib/rhoconnect/ping/android.rb +1 -1
- data/lib/rhoconnect/predefined_adapters/bench_adapter.rb +7 -4
- data/lib/rhoconnect/read_state.rb +3 -3
- data/lib/rhoconnect/server.rb +159 -190
- data/lib/rhoconnect/source.rb +100 -11
- data/lib/rhoconnect/stats/record.rb +10 -10
- data/lib/rhoconnect/store.rb +905 -591
- data/lib/rhoconnect/{model.rb → store_orm.rb} +53 -115
- data/lib/rhoconnect/tasks.rb +18 -4
- data/lib/rhoconnect/test_methods.rb +30 -17
- data/lib/rhoconnect/user.rb +35 -17
- data/lib/rhoconnect/utilities.rb +1 -1
- data/lib/rhoconnect/version.rb +2 -2
- data/lib/rhoconnect/web-console/server.rb +29 -14
- data/lib/rhoconnect/web-console/views/home.js +10 -10
- data/lib/rhoconnect/web-console/views/new_ping.js +1 -1
- data/lib/rhoconnect.rb +120 -51
- data/rhoconnect.gemspec +4 -3
- data/spec/api/api_helper.rb +1 -6
- data/spec/api/app/fast_delete_spec.rb +4 -4
- data/spec/api/app/fast_insert_spec.rb +4 -4
- data/spec/api/app/fast_update_spec.rb +8 -8
- data/spec/api/app/push_deletes_spec.rb +2 -2
- data/spec/api/app/push_objects_spec.rb +5 -5
- data/spec/api/client/client_get_db_doc_spec.rb +6 -4
- data/spec/api/client/client_set_db_doc_spec.rb +3 -2
- data/spec/api/client/get_client_params_spec.rb +14 -0
- data/spec/api/client/list_client_docs_spec.rb +30 -20
- data/spec/api/client/reset_spec.rb +36 -0
- data/spec/api/source/get_source_params_spec.rb +23 -17
- data/spec/api/system/get_license_info_spec.rb +0 -20
- data/spec/api/system/login_spec.rb +8 -0
- data/spec/api/system/reset_spec.rb +0 -1
- data/spec/api/system/stats_spec.rb +5 -5
- data/spec/api/user/create_user_spec.rb +14 -6
- data/spec/api/user/delete_user_spec.rb +20 -18
- data/spec/api/user/list_users_spec.rb +5 -6
- data/spec/api/user/update_user_spec.rb +5 -4
- data/spec/apps/rhotestapp/config.ru +16 -1
- data/spec/apps/rhotestapp/controllers/js/js_sample_controller.js +23 -0
- data/spec/apps/rhotestapp/controllers/js/sample2_controller.js +32 -0
- data/spec/apps/rhotestapp/controllers/ruby/application_controller.rb +21 -0
- data/spec/apps/rhotestapp/controllers/ruby/sample_adapter_controller.rb +8 -0
- data/spec/apps/rhotestapp/models/js/js_sample.js +55 -0
- data/spec/apps/rhotestapp/models/js/sample2.js +25 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/base_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/fixed_schema_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/other_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/sample_adapter.rb +0 -0
- data/spec/apps/rhotestapp/{sources → models/ruby}/simple_adapter.rb +2 -2
- data/spec/apps/rhotestapp/{sources → models/ruby}/sub_adapter.rb +0 -0
- data/spec/apps/rhotestapp/settings/settings.yml +0 -1
- data/spec/bulk_data/bulk_data_spec.rb +20 -5
- data/spec/cli/cli_spec.rb +83 -0
- data/spec/client_spec.rb +20 -17
- data/spec/client_sync_spec.rb +244 -406
- data/spec/controllers/js_base_spec.rb +89 -0
- data/spec/doc/doc_spec.rb +18 -18
- data/spec/document_spec.rb +29 -13
- data/spec/dynamic_adapter_spec.rb +6 -6
- data/spec/generator/generator_spec.rb +7 -4
- data/spec/jobs/bulk_data_job_spec.rb +14 -10
- data/spec/jobs/source_job_spec.rb +8 -8
- data/spec/license_spec.rb +5 -2
- data/spec/models/js_model_spec.rb +39 -0
- data/spec/node_spec.rb +42 -0
- data/spec/perf/store_perf_spec.rb +67 -12
- data/spec/ping/android_spec.rb +1 -1
- data/spec/read_state_spec.rb +1 -1
- data/spec/rhoconnect_spec.rb +1 -1
- data/spec/server/cors_spec.rb +14 -18
- data/spec/server/server_spec.rb +265 -88
- data/spec/server/stats_spec.rb +1 -1
- data/spec/source_adapter_spec.rb +54 -27
- data/spec/source_spec.rb +8 -3
- data/spec/source_sync_spec.rb +538 -468
- data/spec/spec_helper.rb +35 -4
- data/spec/stats/record_spec.rb +10 -10
- data/spec/{model_spec.rb → store_orm_spec.rb} +56 -54
- data/spec/store_spec.rb +159 -179
- data/spec/support/shared_examples.rb +36 -27
- data/spec/sync_states_spec.rb +40 -33
- data/spec/test_methods_spec.rb +18 -14
- data/spec/user_spec.rb +17 -30
- metadata +156 -52
- data/bench/benchapp/application.rb +0 -39
- data/bench/blobapp/application.rb +0 -44
- data/commands/rhoconnect/clean_start.rb +0 -9
- data/commands/rhoconnect/create_user.rb +0 -18
- data/commands/rhoconnect/delete_device.rb +0 -9
- data/commands/rhoconnect/delete_user.rb +0 -8
- data/commands/rhoconnect/reset.rb +0 -16
- data/commands/rhoconnect/reset_refresh.rb +0 -11
- data/generators/templates/application/application.rb +0 -43
- data/lib/rhoconnect/client_sync.rb +0 -434
- data/lib/rhoconnect/dynamic_adapter.rb +0 -91
- data/lib/rhoconnect/middleware/admin_user.rb +0 -23
- data/lib/rhoconnect/middleware/current_request.rb +0 -16
- data/lib/rhoconnect/middleware/login_required.rb +0 -22
- data/lib/rhoconnect/source_adapter.rb +0 -132
- data/lib/rhoconnect/source_sync.rb +0 -464
- data/spec/apps/rhotestapp/application.rb +0 -23
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
class Application < Rhoconnect::Base
|
|
2
|
-
class << self
|
|
3
|
-
def authenticate(username,password,session)
|
|
4
|
-
true # do some interesting authentication here...
|
|
5
|
-
end
|
|
6
|
-
|
|
7
|
-
def ans_authenticate(username,password)
|
|
8
|
-
true # optionally handle rhoconnect push authentication...
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
# Add hooks for application startup here
|
|
12
|
-
# Don't forget to call super at the end!
|
|
13
|
-
def initializer(path)
|
|
14
|
-
super
|
|
15
|
-
end
|
|
16
|
-
|
|
17
|
-
# Calling super here returns rack tempfile path:
|
|
18
|
-
# i.e. /var/folders/J4/J4wGJ-r6H7S313GEZ-Xx5E+++TI
|
|
19
|
-
# Note: This tempfile is removed when server stops or crashes...
|
|
20
|
-
# See http://rack.rubyforge.org/doc/Multipart.html for more info
|
|
21
|
-
#
|
|
22
|
-
# Override this by creating a copy of the file somewhere
|
|
23
|
-
# and returning the path to that file (then don't call super!):
|
|
24
|
-
# i.e. /mnt/myimages/soccer.png
|
|
25
|
-
def store_blob(object,field_name,blob)
|
|
26
|
-
super #=> returns blob[:tempfile]
|
|
27
|
-
end
|
|
28
|
-
end
|
|
29
|
-
end
|
|
30
|
-
|
|
31
|
-
Application.initializer(ROOT_PATH)
|
|
32
|
-
|
|
33
|
-
# Support passenger smart spawning/fork mode:
|
|
34
|
-
if defined?(PhusionPassenger)
|
|
35
|
-
PhusionPassenger.on_event(:starting_worker_process) do |forked|
|
|
36
|
-
if forked
|
|
37
|
-
# We're in smart spawning mode.
|
|
38
|
-
Store.db.client.reconnect
|
|
39
|
-
else
|
|
40
|
-
# We're in conservative spawning mode. We don't need to do anything.
|
|
41
|
-
end
|
|
42
|
-
end
|
|
43
|
-
end
|
|
@@ -1,434 +0,0 @@
|
|
|
1
|
-
module Rhoconnect
|
|
2
|
-
class ClientSync
|
|
3
|
-
attr_accessor :source,:client,:p_size,:source_sync
|
|
4
|
-
|
|
5
|
-
UNKNOWN_CLIENT = "Unknown client"
|
|
6
|
-
UNKNOWN_SOURCE = "Unknown source"
|
|
7
|
-
|
|
8
|
-
# TODO : Remove in Rhoconnect 4.0
|
|
9
|
-
SYNC_VERSION = 3
|
|
10
|
-
|
|
11
|
-
def initialize(source,client,p_size=nil)
|
|
12
|
-
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
|
13
|
-
raise ArgumentError.new(UNKNOWN_SOURCE) unless source
|
|
14
|
-
@source,@client,@p_size = source,client,p_size ? p_size.to_i : 500
|
|
15
|
-
@client.last_sync = Time.now if @client
|
|
16
|
-
@source_sync = SourceSync.new(@source)
|
|
17
|
-
end
|
|
18
|
-
|
|
19
|
-
def receive_cud(cud_params={},query_params=nil)
|
|
20
|
-
if @source.is_pass_through?
|
|
21
|
-
@source_sync.pass_through_cud(cud_params,query_params)
|
|
22
|
-
else
|
|
23
|
-
_process_blobs(cud_params)
|
|
24
|
-
processed = 0
|
|
25
|
-
['create','update','delete'].each do |op|
|
|
26
|
-
key,value = op,cud_params[op]
|
|
27
|
-
processed += _receive_cud(key,value) if value
|
|
28
|
-
end
|
|
29
|
-
@source_sync.process_cud
|
|
30
|
-
end
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def send_cud(token=nil,query_params=nil)
|
|
34
|
-
res = []
|
|
35
|
-
if not _ack_token(token) and not @source.is_pass_through?
|
|
36
|
-
res = resend_page(token)
|
|
37
|
-
else
|
|
38
|
-
query_result = @source_sync.process_query(query_params)
|
|
39
|
-
if @source.is_pass_through?
|
|
40
|
-
res = send_pass_through_data(query_result)
|
|
41
|
-
else
|
|
42
|
-
res = send_new_page
|
|
43
|
-
end
|
|
44
|
-
end
|
|
45
|
-
_format_result(res[0],res[1],res[2],res[3])
|
|
46
|
-
end
|
|
47
|
-
|
|
48
|
-
def search(params)
|
|
49
|
-
if params
|
|
50
|
-
return _resend_search_result if params[:token] and params[:resend]
|
|
51
|
-
if params[:token] and !_ack_search(params[:token])
|
|
52
|
-
formatted_result = _format_search_result
|
|
53
|
-
_delete_search
|
|
54
|
-
return formatted_result
|
|
55
|
-
end
|
|
56
|
-
end
|
|
57
|
-
_do_search(params)
|
|
58
|
-
end
|
|
59
|
-
|
|
60
|
-
def build_page
|
|
61
|
-
res = {}
|
|
62
|
-
yield res
|
|
63
|
-
res.reject! {|key,value| value.nil? or value.empty?}
|
|
64
|
-
res.merge!(_send_errors)
|
|
65
|
-
res
|
|
66
|
-
end
|
|
67
|
-
|
|
68
|
-
def send_new_page
|
|
69
|
-
token,progress_count,total_count,res = '',0,0,{}
|
|
70
|
-
if schema_changed?
|
|
71
|
-
_expire_bulk_data
|
|
72
|
-
token = compute_token(@client.docname(:page_token))
|
|
73
|
-
res = {'schema-changed' => 'true'}
|
|
74
|
-
else
|
|
75
|
-
compute_errors_page
|
|
76
|
-
res = build_page do |r|
|
|
77
|
-
total_count,r['insert'],r['delete'] = compute_page
|
|
78
|
-
r['links'] = compute_links_page
|
|
79
|
-
r['metadata'] = compute_metadata
|
|
80
|
-
end
|
|
81
|
-
if res['insert'] or res['delete'] or res['links']
|
|
82
|
-
token = compute_token(@client.docname(:page_token))
|
|
83
|
-
else
|
|
84
|
-
_delete_errors_page
|
|
85
|
-
end
|
|
86
|
-
end
|
|
87
|
-
# TODO: progress count can not be computed properly
|
|
88
|
-
# without comparing what has actually changes
|
|
89
|
-
# so we need to obsolete it in the future versions
|
|
90
|
-
progress_count = 0
|
|
91
|
-
[token,progress_count,total_count,res]
|
|
92
|
-
end
|
|
93
|
-
|
|
94
|
-
def send_pass_through_data(data)
|
|
95
|
-
data ||= {}
|
|
96
|
-
data.each_key do |object_id|
|
|
97
|
-
data[object_id].each { |attrib,value| data[object_id][attrib] = '' if value.nil? }
|
|
98
|
-
end
|
|
99
|
-
token = ''
|
|
100
|
-
compute_errors_page
|
|
101
|
-
res = build_page do |r|
|
|
102
|
-
r['insert'] = data
|
|
103
|
-
r['metadata'] = compute_metadata
|
|
104
|
-
end
|
|
105
|
-
if res['insert']
|
|
106
|
-
token = compute_token(@client.docname(:page_token))
|
|
107
|
-
else
|
|
108
|
-
_delete_errors_page
|
|
109
|
-
end
|
|
110
|
-
[token,0,data.size,res]
|
|
111
|
-
end
|
|
112
|
-
|
|
113
|
-
# Resend token for a client, also sends exceptions
|
|
114
|
-
def resend_page(token=nil)
|
|
115
|
-
token,progress_count,total_count,res = '',0,0,{}
|
|
116
|
-
schema_page = @client.get_value(:schema_page)
|
|
117
|
-
if schema_page
|
|
118
|
-
res = {'schema-changed' => 'true'}
|
|
119
|
-
else
|
|
120
|
-
res = build_page do |r|
|
|
121
|
-
r['insert'] = @client.get_data(:page)
|
|
122
|
-
r['delete'] = @client.get_data(:delete_page)
|
|
123
|
-
r['links'] = @client.get_data(:create_links_page)
|
|
124
|
-
r['metadata'] = @client.get_value(:metadata_page)
|
|
125
|
-
progress_count = 0
|
|
126
|
-
total_count = @client.get_value(:total_count_page).to_i
|
|
127
|
-
end
|
|
128
|
-
end
|
|
129
|
-
token = @client.get_value(:page_token)
|
|
130
|
-
[token,progress_count,total_count,res]
|
|
131
|
-
end
|
|
132
|
-
|
|
133
|
-
# Checks if schema changed
|
|
134
|
-
def schema_changed?
|
|
135
|
-
if @source_sync.adapter.respond_to?(:schema)
|
|
136
|
-
schema_sha1 = @source.get_value(:schema_sha1)
|
|
137
|
-
if @client.get_value(:schema_sha1).nil?
|
|
138
|
-
@client.put_value(:schema_sha1,schema_sha1)
|
|
139
|
-
return false
|
|
140
|
-
elsif @client.get_value(:schema_sha1) == schema_sha1
|
|
141
|
-
return false
|
|
142
|
-
end
|
|
143
|
-
@client.put_value(:schema_sha1,schema_sha1)
|
|
144
|
-
@client.put_value(:schema_page,schema_sha1)
|
|
145
|
-
return true
|
|
146
|
-
else
|
|
147
|
-
return false
|
|
148
|
-
end
|
|
149
|
-
end
|
|
150
|
-
|
|
151
|
-
# Computes the metadata sha1 and returns metadata if client's sha1 doesn't
|
|
152
|
-
# match source's sha1
|
|
153
|
-
def compute_metadata
|
|
154
|
-
metadata_sha1,metadata = @source.lock(:metadata) do |s|
|
|
155
|
-
[s.get_value(:metadata_sha1),s.get_value(:metadata)]
|
|
156
|
-
end
|
|
157
|
-
return if @client.get_value(:metadata_sha1) == metadata_sha1
|
|
158
|
-
@client.put_value(:metadata_sha1,metadata_sha1)
|
|
159
|
-
@client.put_value(:metadata_page,metadata)
|
|
160
|
-
metadata
|
|
161
|
-
end
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
# Computes diffs between master doc and client doc, trims it to page size,
|
|
165
|
-
# stores page, and returns page as hash
|
|
166
|
-
def compute_page
|
|
167
|
-
inserts_elements_map,deletes_elements_map,total_count = @source.lock(:md) do |s|
|
|
168
|
-
inserts_elements_map = Store.get_diff_data(@client.docname(:cd),s.docname(:md),@p_size)
|
|
169
|
-
total_count = s.get_value(:md_size).to_i
|
|
170
|
-
deletes_elements_map = Store.get_diff_data(s.docname(:md),@client.docname(:cd),@p_size)
|
|
171
|
-
[inserts_elements_map,deletes_elements_map,total_count]
|
|
172
|
-
end
|
|
173
|
-
# until sync is not done - set cd_size to 0
|
|
174
|
-
# once there are no changes, then, set cd_size to md_size
|
|
175
|
-
cd_size = inserts_elements_map.size > 0 ? 0 : total_count
|
|
176
|
-
@client.put_value(:cd_size, cd_size)
|
|
177
|
-
|
|
178
|
-
# now, find the exact changes
|
|
179
|
-
inserts,deletes = Store.get_inserts_deletes(inserts_elements_map,deletes_elements_map)
|
|
180
|
-
|
|
181
|
-
@client.put_data(:page,inserts)
|
|
182
|
-
@client.put_data(:delete_page,deletes,true)
|
|
183
|
-
@client.put_value(:total_count_page,total_count)
|
|
184
|
-
Store.update_elements(@client.docname(:cd),inserts_elements_map,deletes_elements_map)
|
|
185
|
-
|
|
186
|
-
[total_count,inserts,deletes]
|
|
187
|
-
end
|
|
188
|
-
|
|
189
|
-
# Computes search result, updates md for source and cd for client with the result
|
|
190
|
-
def compute_search
|
|
191
|
-
cd_inserts_elements_map = Store.get_diff_data(@client.docname(:cd),@client.docname(:search),@p_size)
|
|
192
|
-
|
|
193
|
-
Store.update_elements(@client.docname(:cd), cd_inserts_elements_map, {})
|
|
194
|
-
@client.update_count(:cd_size,cd_inserts_elements_map.size)
|
|
195
|
-
# remove previous search page and build new one
|
|
196
|
-
@client.flash_data(:search_page)
|
|
197
|
-
Store.update_elements(@client.docname(:search_page),cd_inserts_elements_map,{})
|
|
198
|
-
client_res = @client.get_data(:search_page)
|
|
199
|
-
|
|
200
|
-
@source.lock(:md) do |s|
|
|
201
|
-
md_inserts_elements_map = Store.get_diff_data(s.docname(:md),@client.docname(:cd))
|
|
202
|
-
Store.update_elements(s.docname(:md), md_inserts_elements_map, {})
|
|
203
|
-
s.update_count(:md_size,md_inserts_elements_map.size)
|
|
204
|
-
end
|
|
205
|
-
|
|
206
|
-
[client_res,client_res.size]
|
|
207
|
-
end
|
|
208
|
-
|
|
209
|
-
# Computes errors for client and stores a copy as errors page
|
|
210
|
-
def compute_errors_page
|
|
211
|
-
['create','update','delete'].each do |operation|
|
|
212
|
-
@client.lock("#{operation}_errors") do |c|
|
|
213
|
-
c.rename("#{operation}_errors","#{operation}_errors_page")
|
|
214
|
-
end
|
|
215
|
-
end
|
|
216
|
-
@client.lock("update_rollback") do |c|
|
|
217
|
-
c.rename("update_rollback","update_rollback_page")
|
|
218
|
-
end
|
|
219
|
-
end
|
|
220
|
-
|
|
221
|
-
# Computes create links for a client and stores a copy as links page
|
|
222
|
-
def compute_links_page
|
|
223
|
-
@client.lock(:create_links) do |c|
|
|
224
|
-
c.rename(:create_links,:create_links_page)
|
|
225
|
-
c.get_data(:create_links_page)
|
|
226
|
-
end
|
|
227
|
-
end
|
|
228
|
-
|
|
229
|
-
class << self
|
|
230
|
-
# Resets the store for a given app,client
|
|
231
|
-
def reset(client, params=nil)
|
|
232
|
-
return unless client
|
|
233
|
-
if params == nil or params[:sources] == nil
|
|
234
|
-
client.flash_data('*')
|
|
235
|
-
else
|
|
236
|
-
params[:sources].each do |source|
|
|
237
|
-
client.flash_source_data('*', source['name'])
|
|
238
|
-
end
|
|
239
|
-
end
|
|
240
|
-
end
|
|
241
|
-
|
|
242
|
-
def search_all(client,params=nil)
|
|
243
|
-
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
|
244
|
-
return [] unless params[:sources]
|
|
245
|
-
res = []
|
|
246
|
-
params[:sources].each do |source|
|
|
247
|
-
s = Source.load(source['name'],{:app_id => client.app_id,
|
|
248
|
-
:user_id => client.user_id})
|
|
249
|
-
client.source_name = source['name']
|
|
250
|
-
cs = ClientSync.new(s,client,params[:p_size])
|
|
251
|
-
params[:token] = source['token'] if source['token']
|
|
252
|
-
search_res = cs.search(params)
|
|
253
|
-
res << search_res if search_res
|
|
254
|
-
end
|
|
255
|
-
res
|
|
256
|
-
end
|
|
257
|
-
|
|
258
|
-
def bulk_data(partition,client,sources=nil)
|
|
259
|
-
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
|
260
|
-
name = BulkData.get_name(partition,client.user_id)
|
|
261
|
-
data = BulkData.load(name)
|
|
262
|
-
|
|
263
|
-
partition_sources = client.app.partition_sources(partition,client.user_id)
|
|
264
|
-
sources ||= partition_sources
|
|
265
|
-
return {:result => :nop} if sources.length <= 0
|
|
266
|
-
|
|
267
|
-
do_bd_sync = data.nil?
|
|
268
|
-
do_bd_sync = (data.completed? and
|
|
269
|
-
(data.refresh_time <= Time.now.to_i or !data.dbfiles_exist?)) unless do_bd_sync
|
|
270
|
-
|
|
271
|
-
if do_bd_sync
|
|
272
|
-
data.delete if data
|
|
273
|
-
data = BulkData.create(:name => name,
|
|
274
|
-
:app_id => client.app_id,
|
|
275
|
-
:user_id => client.user_id,
|
|
276
|
-
:partition_sources => partition_sources,
|
|
277
|
-
:sources => sources,
|
|
278
|
-
:refresh_time => Time.now.to_i + Rhoconnect.bulk_sync_poll_interval)
|
|
279
|
-
BulkData.enqueue("data_name" => name)
|
|
280
|
-
end
|
|
281
|
-
|
|
282
|
-
if data and data.completed? and data.dbfiles_exist?
|
|
283
|
-
client.update_clientdoc(sources)
|
|
284
|
-
sources.each do |src|
|
|
285
|
-
s = Source.load(src, {:user_id => client.user_id, :app_id => client.app_id})
|
|
286
|
-
errordoc = s.docname(:errors)
|
|
287
|
-
errors = {}
|
|
288
|
-
Store.lock(errordoc) do
|
|
289
|
-
errors = Store.get_data(errordoc)
|
|
290
|
-
end
|
|
291
|
-
unless errors.empty?
|
|
292
|
-
# FIXME: :result => :bulk_sync_error, :errors => "#{errors}"
|
|
293
|
-
log "Bulk sync errors are found in #{src}: #{errors}"
|
|
294
|
-
# Delete all related bulk files
|
|
295
|
-
data.delete_files
|
|
296
|
-
return {:result => :url, :url => ''}
|
|
297
|
-
end
|
|
298
|
-
end
|
|
299
|
-
{:result => :url, :url => data.url}
|
|
300
|
-
elsif data
|
|
301
|
-
{:result => :wait}
|
|
302
|
-
end
|
|
303
|
-
end
|
|
304
|
-
end
|
|
305
|
-
|
|
306
|
-
private
|
|
307
|
-
|
|
308
|
-
# expires the bulk data for the client
|
|
309
|
-
def _expire_bulk_data
|
|
310
|
-
[:user,:app].each do |partition|
|
|
311
|
-
Rhoconnect.expire_bulk_data(@client.user_id,partition)
|
|
312
|
-
end
|
|
313
|
-
end
|
|
314
|
-
|
|
315
|
-
def _resend_search_result
|
|
316
|
-
res = @client.get_data(:search_page)
|
|
317
|
-
_format_search_result(res,res.size)
|
|
318
|
-
end
|
|
319
|
-
|
|
320
|
-
def _ack_search(search_token)
|
|
321
|
-
if @client.get_value(:search_token) != search_token
|
|
322
|
-
_delete_search
|
|
323
|
-
@client.put_data(:search_errors,
|
|
324
|
-
{'search-error'=>{'message'=>'Search error - invalid token'}}
|
|
325
|
-
)
|
|
326
|
-
return false
|
|
327
|
-
end
|
|
328
|
-
true
|
|
329
|
-
end
|
|
330
|
-
|
|
331
|
-
def _delete_search
|
|
332
|
-
[:search, :search_page, :search_token, :search_errors].each do |search_doc|
|
|
333
|
-
@client.flash_data(search_doc)
|
|
334
|
-
end
|
|
335
|
-
end
|
|
336
|
-
|
|
337
|
-
def _do_search(params={})
|
|
338
|
-
# call source adapter search unless client is sending token for ack
|
|
339
|
-
search_params = params[:search] if params
|
|
340
|
-
res = @source_sync.search(@client.id,search_params) if params.nil? or !params[:token]
|
|
341
|
-
res,diffsize = @source.is_pass_through? ? [res,res.size] : compute_search
|
|
342
|
-
formatted_res = _format_search_result(res,diffsize)
|
|
343
|
-
_delete_search if diffsize == 0
|
|
344
|
-
formatted_res
|
|
345
|
-
end
|
|
346
|
-
|
|
347
|
-
def _format_search_result(res={},diffsize=nil)
|
|
348
|
-
error = @client.get_data(:search_errors)
|
|
349
|
-
if not error.empty?
|
|
350
|
-
[ {'version'=>SYNC_VERSION},
|
|
351
|
-
{'source'=>@source.name},
|
|
352
|
-
{'search-error'=>error} ]
|
|
353
|
-
else
|
|
354
|
-
search_token = @client.get_value(:search_token)
|
|
355
|
-
search_token ||= ''
|
|
356
|
-
return [] if res.empty?
|
|
357
|
-
[ {'version'=>SYNC_VERSION},
|
|
358
|
-
{'token' => search_token},
|
|
359
|
-
{'source'=>@source.name},
|
|
360
|
-
{'count'=>res.size},
|
|
361
|
-
{'insert'=>res} ]
|
|
362
|
-
end
|
|
363
|
-
end
|
|
364
|
-
|
|
365
|
-
def _receive_cud(operation,params)
|
|
366
|
-
return 0 if not ['create','update','delete'].include?(operation)
|
|
367
|
-
@source.lock(operation) { |s| s.put_zdata(operation,@client.id,params,true) }
|
|
368
|
-
return 1
|
|
369
|
-
end
|
|
370
|
-
|
|
371
|
-
def _process_blobs(params)
|
|
372
|
-
unless params[:blob_fields].nil?
|
|
373
|
-
[:create,:update].each do |utype|
|
|
374
|
-
objects = params[utype] || {}
|
|
375
|
-
objects.each do |id,obj|
|
|
376
|
-
params[:blob_fields].each do |field|
|
|
377
|
-
blob = params["#{field}-#{id}"]
|
|
378
|
-
obj[field] = @client.app.store_blob(obj,field,blob)
|
|
379
|
-
end
|
|
380
|
-
end
|
|
381
|
-
end
|
|
382
|
-
end
|
|
383
|
-
end
|
|
384
|
-
|
|
385
|
-
def _ack_token(token)
|
|
386
|
-
stored_token = @client.get_value(:page_token)
|
|
387
|
-
if stored_token
|
|
388
|
-
if token and stored_token == token
|
|
389
|
-
@client.put_value(:page_token,nil)
|
|
390
|
-
@client.flash_data(:schema_page)
|
|
391
|
-
@client.flash_data(:metadata_page)
|
|
392
|
-
@client.flash_data(:create_links_page)
|
|
393
|
-
@client.flash_data(:page)
|
|
394
|
-
@client.flash_data(:delete_page)
|
|
395
|
-
_delete_errors_page
|
|
396
|
-
return true
|
|
397
|
-
end
|
|
398
|
-
else
|
|
399
|
-
return true
|
|
400
|
-
end
|
|
401
|
-
false
|
|
402
|
-
end
|
|
403
|
-
|
|
404
|
-
def _delete_errors_page
|
|
405
|
-
['create','update','delete'].each do |operation|
|
|
406
|
-
@client.flash_data("#{operation}_errors_page")
|
|
407
|
-
end
|
|
408
|
-
@client.flash_data("update_rollback_page")
|
|
409
|
-
end
|
|
410
|
-
|
|
411
|
-
def _send_errors
|
|
412
|
-
res = {}
|
|
413
|
-
['create','update','delete'].each do |operation|
|
|
414
|
-
res["#{operation}-error"] = @client.get_data("#{operation}_errors_page")
|
|
415
|
-
end
|
|
416
|
-
res["source-error"] = @source.lock(:errors) { |s| s.get_data(:errors) }
|
|
417
|
-
res["update-rollback"] = @client.get_data(:update_rollback_page)
|
|
418
|
-
res.reject! {|key,value| value.nil? or value.empty?}
|
|
419
|
-
res
|
|
420
|
-
end
|
|
421
|
-
|
|
422
|
-
def _format_result(token,progress_count,total_count,res)
|
|
423
|
-
count = 0
|
|
424
|
-
count += res['insert'].length if res['insert']
|
|
425
|
-
count += res['delete'].length if res['delete']
|
|
426
|
-
[ {'version'=>SYNC_VERSION},
|
|
427
|
-
{'token'=>(token ? token : '')},
|
|
428
|
-
{'count'=>count},
|
|
429
|
-
{'progress_count'=>progress_count},
|
|
430
|
-
{'total_count'=>total_count},
|
|
431
|
-
res ]
|
|
432
|
-
end
|
|
433
|
-
end
|
|
434
|
-
end
|
|
@@ -1,91 +0,0 @@
|
|
|
1
|
-
require 'json'
|
|
2
|
-
require 'rest_client'
|
|
3
|
-
require 'uri'
|
|
4
|
-
|
|
5
|
-
module Rhoconnect
|
|
6
|
-
|
|
7
|
-
class DynamicAdapter < SourceAdapter
|
|
8
|
-
attr_accessor :uri, :partition
|
|
9
|
-
|
|
10
|
-
def initialize(source, partition=nil, uri=nil)
|
|
11
|
-
@source = source
|
|
12
|
-
@uri = uri || Rhoconnect.appserver
|
|
13
|
-
@partition = partition || @source.user_id
|
|
14
|
-
|
|
15
|
-
if @uri
|
|
16
|
-
@uri = URI.parse(@uri)
|
|
17
|
-
user = @uri.user
|
|
18
|
-
@uri.user = nil
|
|
19
|
-
@uri = @uri.to_s
|
|
20
|
-
end
|
|
21
|
-
|
|
22
|
-
@token = Rhoconnect.api_token || user
|
|
23
|
-
raise Exception.new("Please provide a :token or set it in uri") unless @token
|
|
24
|
-
super(source)
|
|
25
|
-
end
|
|
26
|
-
|
|
27
|
-
def self.authenticate(login,password)
|
|
28
|
-
hsh = {:login => login, :password => password, :api_token => Rhoconnect.api_token}.to_json
|
|
29
|
-
headers = {:content_type => :json, :accept => :json}
|
|
30
|
-
RestClient.post "#{Rhoconnect.appserver}/rhoconnect/authenticate", hsh, headers
|
|
31
|
-
end
|
|
32
|
-
|
|
33
|
-
def query(params=nil)
|
|
34
|
-
@result={}
|
|
35
|
-
@result = JSON.parse(send_objects('query',@source.name, @partition, params))
|
|
36
|
-
end
|
|
37
|
-
|
|
38
|
-
def create(create_hash)
|
|
39
|
-
send_objects('create',@source.name, @partition, create_hash)
|
|
40
|
-
end
|
|
41
|
-
|
|
42
|
-
def update(update_hash)
|
|
43
|
-
send_objects('update',@source.name, @partition, update_hash)
|
|
44
|
-
end
|
|
45
|
-
|
|
46
|
-
def delete(delete_hash)
|
|
47
|
-
send_objects('delete',@source.name, @partition, delete_hash)
|
|
48
|
-
end
|
|
49
|
-
|
|
50
|
-
#protected
|
|
51
|
-
|
|
52
|
-
def validate_args(action, source_name, partition, obj = {}) # :nodoc:
|
|
53
|
-
raise Exception.new("Please set uri in your settings or through console") unless @uri
|
|
54
|
-
raise ArgumentError.new("Missing object id for #{obj.inspect}") if ['update','delete'].include? action and not obj.has_key?('id')
|
|
55
|
-
raise ArgumentError.new("Missing source_name.") if source_name.empty?
|
|
56
|
-
#raise ArgumentError.new("Missing partition for #{model}.") unless partition or partition.blank?
|
|
57
|
-
end
|
|
58
|
-
|
|
59
|
-
def send_objects(action, source_name, partition, obj = {}) # :nodoc:
|
|
60
|
-
validate_args(action, source_name, partition, obj)
|
|
61
|
-
process(:post, "/rhoconnect/#{action}",
|
|
62
|
-
{
|
|
63
|
-
:resource => source_name,
|
|
64
|
-
:partition => partition,
|
|
65
|
-
:attributes => obj
|
|
66
|
-
}
|
|
67
|
-
)
|
|
68
|
-
end
|
|
69
|
-
|
|
70
|
-
def resource(path) # :nodoc:
|
|
71
|
-
RestClient::Resource.new(@uri)[path]
|
|
72
|
-
end
|
|
73
|
-
|
|
74
|
-
def process(method, path, payload = nil) # :nodoc:
|
|
75
|
-
headers = api_headers
|
|
76
|
-
payload = payload.merge!(:api_token => @token).to_json
|
|
77
|
-
args = [method, payload, headers].compact
|
|
78
|
-
response = resource(path).send(*args)
|
|
79
|
-
response
|
|
80
|
-
end
|
|
81
|
-
|
|
82
|
-
def api_headers # :nodoc:
|
|
83
|
-
{
|
|
84
|
-
:content_type => :json,
|
|
85
|
-
:accept => :json
|
|
86
|
-
}
|
|
87
|
-
end
|
|
88
|
-
|
|
89
|
-
end
|
|
90
|
-
|
|
91
|
-
end
|
|
@@ -1,23 +0,0 @@
|
|
|
1
|
-
require 'rhoconnect/middleware/helpers'
|
|
2
|
-
|
|
3
|
-
module Rhoconnect
|
|
4
|
-
module Middleware
|
|
5
|
-
class AdminUser
|
|
6
|
-
def initialize(app, opts={})
|
|
7
|
-
@app = app
|
|
8
|
-
yield self if block_given?
|
|
9
|
-
end
|
|
10
|
-
|
|
11
|
-
def call(env)
|
|
12
|
-
begin
|
|
13
|
-
if Rhoconnect.is_admin_route(env)
|
|
14
|
-
env[Rhoconnect::CURRENT_USER] = Rhoconnect.extract_api_user(env)
|
|
15
|
-
end
|
|
16
|
-
rescue Rhoconnect::ApiException => ae
|
|
17
|
-
return [422, {'Content-Type' => 'text/plain'}, [ae.message]]
|
|
18
|
-
end
|
|
19
|
-
@app.call(env)
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|
|
23
|
-
end
|
|
@@ -1,16 +0,0 @@
|
|
|
1
|
-
require 'rhoconnect/middleware/helpers'
|
|
2
|
-
|
|
3
|
-
module Rhoconnect
|
|
4
|
-
module Middleware
|
|
5
|
-
class CurrentRequest
|
|
6
|
-
def initialize(app)
|
|
7
|
-
@app = app
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def call(env)
|
|
11
|
-
env[Rhoconnect::CURRENT_REQUEST] = Rack::Request.new(env)
|
|
12
|
-
@app.call(env)
|
|
13
|
-
end
|
|
14
|
-
end
|
|
15
|
-
end
|
|
16
|
-
end
|
|
@@ -1,22 +0,0 @@
|
|
|
1
|
-
require 'rhoconnect/middleware/helpers'
|
|
2
|
-
|
|
3
|
-
module Rhoconnect
|
|
4
|
-
module Middleware
|
|
5
|
-
class LoginRequired
|
|
6
|
-
def initialize(app)
|
|
7
|
-
@app = app
|
|
8
|
-
end
|
|
9
|
-
|
|
10
|
-
def call(env)
|
|
11
|
-
begin
|
|
12
|
-
if Rhoconnect.is_login_required(env)
|
|
13
|
-
raise LoginException.new("Not authenticated") if env[Rhoconnect::CURRENT_USER].nil?
|
|
14
|
-
end
|
|
15
|
-
@app.call(env)
|
|
16
|
-
rescue LoginException => le
|
|
17
|
-
return [401, {'Content-Type' => 'text/plain'}, le.message]
|
|
18
|
-
end
|
|
19
|
-
end
|
|
20
|
-
end
|
|
21
|
-
end
|
|
22
|
-
end
|