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
data/lib/rhoconnect/async.rb
CHANGED
|
@@ -9,8 +9,9 @@ module Rhoconnect
|
|
|
9
9
|
if settings.respond_to?(:fiberpool_size)
|
|
10
10
|
options[:size] = settings.fiberpool_size
|
|
11
11
|
end
|
|
12
|
-
options[:rescue_exception] = handle_exception
|
|
12
|
+
options[:rescue_exception] = handle_exception
|
|
13
13
|
builder.use Rack::FiberPool, options unless test?
|
|
14
|
+
builder.use Rhoconnect::Middleware::Async, options
|
|
14
15
|
super
|
|
15
16
|
end
|
|
16
17
|
|
|
@@ -28,56 +29,92 @@ module Rhoconnect
|
|
|
28
29
|
end
|
|
29
30
|
end
|
|
30
31
|
|
|
31
|
-
module
|
|
32
|
-
|
|
33
|
-
(
|
|
34
|
-
|
|
32
|
+
module Middleware
|
|
33
|
+
class Async
|
|
34
|
+
def initialize(app, opts={})
|
|
35
|
+
@app = app
|
|
36
|
+
yield self if block_given?
|
|
35
37
|
end
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
def catch_all
|
|
39
|
-
res = nil
|
|
40
|
-
begin
|
|
41
|
-
res = catch(:halt) { yield }
|
|
42
|
-
rescue ApiException => ae
|
|
43
|
-
res = [ae.error_code, ae.message]
|
|
44
|
-
rescue Exception => e
|
|
45
|
-
log e.message + e.backtrace.join("\n")
|
|
46
|
-
res = [500, e.message]
|
|
47
|
-
end
|
|
48
|
-
res
|
|
49
|
-
end
|
|
50
|
-
|
|
51
|
-
def execute_api_call(client_call = false)
|
|
38
|
+
|
|
39
|
+
def call(env)
|
|
52
40
|
f = Fiber.current
|
|
41
|
+
# making a copy is crucial here
|
|
42
|
+
# otherwise 'env' will not be the same
|
|
43
|
+
# in the deferred execution
|
|
44
|
+
aenv = env.dup
|
|
53
45
|
operation = proc {
|
|
54
|
-
|
|
55
|
-
|
|
46
|
+
res = nil
|
|
47
|
+
aenv['REQUEST_THREAD'] = Thread.current
|
|
48
|
+
if(aenv['RHO_ABORT_PROCESS'])
|
|
56
49
|
res = [500, 'Request is aborted']
|
|
57
50
|
else
|
|
58
|
-
|
|
59
|
-
res = yield params, current_user, self
|
|
60
|
-
if params.has_key? :warning
|
|
61
|
-
Rhoconnect.log params[:warning]
|
|
62
|
-
response.headers['Warning'] = params[:warning]
|
|
63
|
-
end
|
|
64
|
-
res
|
|
65
|
-
end
|
|
51
|
+
res = @app.call(aenv)
|
|
66
52
|
end
|
|
53
|
+
res
|
|
67
54
|
}
|
|
68
55
|
result = nil
|
|
69
56
|
callback = proc { |proc_res| result = proc_res; f.resume }
|
|
70
|
-
|
|
57
|
+
|
|
71
58
|
EventMachine.defer operation, callback
|
|
72
59
|
Fiber.yield
|
|
73
|
-
# we can not throw exceptions across threads
|
|
74
|
-
# so we analyze it in the main thread after the
|
|
75
|
-
# request has been processed and if result
|
|
76
|
-
# has error code - then we throw :halt here
|
|
77
|
-
if Array === result and Fixnum === result.first
|
|
78
|
-
throw :halt, result
|
|
79
|
-
end
|
|
80
60
|
result
|
|
61
|
+
end
|
|
81
62
|
end
|
|
82
63
|
end
|
|
64
|
+
|
|
65
|
+
# module AsyncHelpers
|
|
66
|
+
# #def self.included(klass)
|
|
67
|
+
# # (klass.instance_methods & self.instance_methods).each do |method|
|
|
68
|
+
# # klass.instance_eval{remove_method method.to_sym}
|
|
69
|
+
# # end
|
|
70
|
+
# #end
|
|
71
|
+
#
|
|
72
|
+
# def catch_all
|
|
73
|
+
# res = nil
|
|
74
|
+
# begin
|
|
75
|
+
# res = catch(:halt) { yield }
|
|
76
|
+
# rescue ApiException => ae
|
|
77
|
+
# res = [ae.error_code, ae.message]
|
|
78
|
+
# rescue Exception => e
|
|
79
|
+
# log e.message + e.backtrace.join("\n")
|
|
80
|
+
# res = [500, e.message]
|
|
81
|
+
# end
|
|
82
|
+
# res
|
|
83
|
+
# end
|
|
84
|
+
#
|
|
85
|
+
# def execute_api_call(&block)
|
|
86
|
+
# f = Fiber.current
|
|
87
|
+
# operation = proc {
|
|
88
|
+
# catch_all do
|
|
89
|
+
# puts " we are processing the route #{self.inspect}"
|
|
90
|
+
# method = self.class.send(:generate_method, "calling_method", &block)
|
|
91
|
+
# #method = instance_method "calling_method"
|
|
92
|
+
# #remove_method "calling_method"
|
|
93
|
+
#
|
|
94
|
+
# #method = Sinatra::Base.generate_method("calling_method", &block)
|
|
95
|
+
# proc = method.bind(self)
|
|
96
|
+
# res = proc.call
|
|
97
|
+
# #res = yield
|
|
98
|
+
# if params.has_key? :warning
|
|
99
|
+
# Rhoconnect.log params[:warning]
|
|
100
|
+
# response.headers['Warning'] = params[:warning]
|
|
101
|
+
# end
|
|
102
|
+
# res
|
|
103
|
+
# end
|
|
104
|
+
# }
|
|
105
|
+
# result = nil
|
|
106
|
+
# callback = proc { |proc_res| result = proc_res; f.resume }
|
|
107
|
+
#
|
|
108
|
+
# EventMachine.defer operation, callback
|
|
109
|
+
# Fiber.yield
|
|
110
|
+
# # we can not throw exceptions across threads
|
|
111
|
+
# # so we analyze it in the main thread after the
|
|
112
|
+
# # request has been processed and if result
|
|
113
|
+
# # has error code - then we throw :halt here
|
|
114
|
+
# if Array === result and Fixnum === result.first
|
|
115
|
+
# throw :halt, result
|
|
116
|
+
# end
|
|
117
|
+
# result
|
|
118
|
+
# end
|
|
119
|
+
# end
|
|
83
120
|
end
|
|
@@ -2,7 +2,7 @@ require 'resque'
|
|
|
2
2
|
require 'rhoconnect/jobs/bulk_data_job'
|
|
3
3
|
|
|
4
4
|
module Rhoconnect
|
|
5
|
-
class BulkData <
|
|
5
|
+
class BulkData < StoreOrm
|
|
6
6
|
field :name, :string
|
|
7
7
|
field :state, :string
|
|
8
8
|
field :app_id, :string
|
|
@@ -23,7 +23,7 @@ module Rhoconnect
|
|
|
23
23
|
def delete
|
|
24
24
|
sources[0, -1].each do |source|
|
|
25
25
|
s = Source.load(source,{:app_id => app_id, :user_id => user_id})
|
|
26
|
-
|
|
26
|
+
s.flush_data(:md_copy) if s
|
|
27
27
|
end
|
|
28
28
|
super
|
|
29
29
|
end
|
|
@@ -32,8 +32,10 @@ module Rhoconnect
|
|
|
32
32
|
sources[0, -1].each do |source|
|
|
33
33
|
s = Source.load(source,{:app_id => app_id, :user_id => user_id})
|
|
34
34
|
if s
|
|
35
|
-
|
|
36
|
-
|
|
35
|
+
rh = lambda { @model.query(params[:query])}
|
|
36
|
+
model = Rhoconnect::Model::Base.create(s)
|
|
37
|
+
Rhoconnect::Handler::Query::Engine.new(model, rh, {}).do_sync
|
|
38
|
+
s.clone(:md, s.docname(:md_copy)) unless s.sync_type.to_sym == :bulk_sync_only
|
|
37
39
|
end
|
|
38
40
|
end
|
|
39
41
|
end
|
data/lib/rhoconnect/client.rb
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
module Rhoconnect
|
|
2
2
|
class InvalidSourceNameError < RuntimeError; end
|
|
3
3
|
|
|
4
|
-
class Client <
|
|
4
|
+
class Client < StoreOrm
|
|
5
5
|
field :device_type, :string
|
|
6
6
|
field :device_push_type, :string
|
|
7
7
|
field :device_pin, :string
|
|
@@ -15,6 +15,32 @@ module Rhoconnect
|
|
|
15
15
|
|
|
16
16
|
include Document
|
|
17
17
|
include LockOps
|
|
18
|
+
|
|
19
|
+
define_valid_doctypes([:cd,
|
|
20
|
+
:cd_size,
|
|
21
|
+
:page,
|
|
22
|
+
:delete_page,
|
|
23
|
+
:create_links,
|
|
24
|
+
:create_links_page,
|
|
25
|
+
:metadata_page,
|
|
26
|
+
:total_count_page,
|
|
27
|
+
:page_token,
|
|
28
|
+
:schema_sha1,
|
|
29
|
+
:schema_page,
|
|
30
|
+
:metadata_sha1,
|
|
31
|
+
:metadata_page,
|
|
32
|
+
:search,
|
|
33
|
+
:search_token,
|
|
34
|
+
:search_page,
|
|
35
|
+
:search_errors,
|
|
36
|
+
:create_errors,
|
|
37
|
+
:create_errors_page,
|
|
38
|
+
:update_errors,
|
|
39
|
+
:update_errors_page,
|
|
40
|
+
:update_rollback,
|
|
41
|
+
:update_rollback_page,
|
|
42
|
+
:delete_errors,
|
|
43
|
+
:delete_errors_page])
|
|
18
44
|
|
|
19
45
|
def self.create(fields,params={})
|
|
20
46
|
Rhoconnect.license.check_and_use_seat
|
|
@@ -41,17 +67,20 @@ module Rhoconnect
|
|
|
41
67
|
|
|
42
68
|
def doc_suffix(doctype)
|
|
43
69
|
doctype = doctype.to_s
|
|
44
|
-
if
|
|
45
|
-
"#{self.user_id}:#{self.id}:*"
|
|
46
|
-
elsif self.source_name
|
|
70
|
+
if self.source_name
|
|
47
71
|
"#{self.user_id}:#{self.id}:#{self.source_name}:#{doctype}"
|
|
48
72
|
else
|
|
49
73
|
raise InvalidSourceNameError.new('Invalid Source Name For Client')
|
|
50
74
|
end
|
|
51
75
|
end
|
|
52
76
|
|
|
77
|
+
def store_index(doctype)
|
|
78
|
+
source = Source.load(self.source_name,{:app_id => app_id,:user_id => self.user_id})
|
|
79
|
+
index = compute_store_index(doctype, source, user_id)
|
|
80
|
+
end
|
|
81
|
+
|
|
53
82
|
def delete
|
|
54
|
-
|
|
83
|
+
flush_all_documents
|
|
55
84
|
Rhoconnect.license.free_seat
|
|
56
85
|
if Rhoconnect.stats
|
|
57
86
|
Rhoconnect::Stats::Record.set('clients') { Store.decr('client:count') }
|
|
@@ -60,12 +89,33 @@ module Rhoconnect
|
|
|
60
89
|
end
|
|
61
90
|
super
|
|
62
91
|
end
|
|
63
|
-
|
|
92
|
+
|
|
93
|
+
def flush_all_documents
|
|
94
|
+
app.sources.each do |sourcename|
|
|
95
|
+
flush_source_documents(sourcename)
|
|
96
|
+
end
|
|
97
|
+
end
|
|
98
|
+
|
|
99
|
+
def flush_source_documents(source_name)
|
|
100
|
+
self.class.valid_doctypes.each do |doctype|
|
|
101
|
+
flush_source_data(doctype, source_name)
|
|
102
|
+
end
|
|
103
|
+
end
|
|
104
|
+
|
|
105
|
+
def flush_source_data(doctype, from_source)
|
|
106
|
+
verify_doctype(doctype)
|
|
107
|
+
self.source_name=from_source
|
|
108
|
+
docnamestr = docname('') + doctype.to_s
|
|
109
|
+
Store.flush_data(docnamestr)
|
|
110
|
+
end
|
|
111
|
+
|
|
64
112
|
def switch_user(new_user_id)
|
|
65
|
-
|
|
113
|
+
loaded_source = self.source_name
|
|
114
|
+
flush_all_documents
|
|
66
115
|
User.load(self.user_id).clients.delete(self.id)
|
|
67
116
|
User.load(new_user_id).clients << self.id
|
|
68
117
|
self.user_id = new_user_id
|
|
118
|
+
self.source_name = loaded_source
|
|
69
119
|
end
|
|
70
120
|
|
|
71
121
|
def update_clientdoc(sources)
|
|
@@ -73,9 +123,9 @@ module Rhoconnect
|
|
|
73
123
|
# source masterdoc and source schema might have changed!
|
|
74
124
|
sources.each do |source|
|
|
75
125
|
s = Source.load(source,{:app_id => app_id,:user_id => user_id})
|
|
126
|
+
self.source_name = source
|
|
76
127
|
unless s.sync_type.to_sym == :bulk_sync_only
|
|
77
|
-
self.
|
|
78
|
-
Store.clone(s.docname(:md_copy),self.docname(:cd))
|
|
128
|
+
s.clone(:md_copy,self.docname(:cd))
|
|
79
129
|
end
|
|
80
130
|
self.put_value(:schema_sha1,s.get_value(:schema_sha1))
|
|
81
131
|
end
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
module Rhoconnect
|
|
2
|
+
module Condition
|
|
3
|
+
module AdminRequired
|
|
4
|
+
def self.extended(base)
|
|
5
|
+
base.include_admin_required_condition
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def include_admin_required_condition
|
|
9
|
+
set(:admin_required) do |value|
|
|
10
|
+
condition do
|
|
11
|
+
if value
|
|
12
|
+
begin
|
|
13
|
+
api_token = ApiToken.load(env[API_TOKEN_HEADER])
|
|
14
|
+
api_token = ApiToken.load(params[:api_token]) unless api_token
|
|
15
|
+
raise Rhoconnect::ApiException.new(422, "No API token provided") unless api_token
|
|
16
|
+
raise Rhoconnect::ApiException.new(422, "Invalid/missing API user") unless api_token.user and api_token.user.admin == 1
|
|
17
|
+
env[Rhoconnect::CURRENT_USER] = api_token.user
|
|
18
|
+
rescue Rhoconnect::ApiException => ae
|
|
19
|
+
throw :halt, [422, {'Content-Type' => 'text/plain'}, ae.message]
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
end
|
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
require 'rhoconnect/middleware/helpers'
|
|
2
|
+
|
|
3
|
+
module Rhoconnect
|
|
4
|
+
module Condition
|
|
5
|
+
# Sinatra condition
|
|
6
|
+
module ClientRequired
|
|
7
|
+
def self.extended(base)
|
|
8
|
+
base.include_client_required_condition
|
|
9
|
+
end
|
|
10
|
+
|
|
11
|
+
def include_client_required_condition
|
|
12
|
+
include ClientRequiredHelpers
|
|
13
|
+
set(:client_required) do |value|
|
|
14
|
+
condition do
|
|
15
|
+
if value
|
|
16
|
+
catch_all do
|
|
17
|
+
client = extract_current_client
|
|
18
|
+
# client should be valid here
|
|
19
|
+
raise ArgumentError.new(UNKNOWN_CLIENT) unless client
|
|
20
|
+
env[CURRENT_CLIENT] = client
|
|
21
|
+
end
|
|
22
|
+
end
|
|
23
|
+
end
|
|
24
|
+
end
|
|
25
|
+
end
|
|
26
|
+
end
|
|
27
|
+
|
|
28
|
+
module ClientRequiredHelpers
|
|
29
|
+
# helper method
|
|
30
|
+
def extract_current_client
|
|
31
|
+
client = nil
|
|
32
|
+
# TODO: This is removed when V3 is deprecated
|
|
33
|
+
if params["cud"]
|
|
34
|
+
cud_client_id = JSON.parse(params["cud"])["client_id"]
|
|
35
|
+
params.merge!(:client_id => cud_client_id) if cud_client_id
|
|
36
|
+
end
|
|
37
|
+
client_id = @env[Rhoconnect::CLIENT_ID_HEADER]
|
|
38
|
+
client_id = params[:client_id] unless client_id
|
|
39
|
+
if client_id
|
|
40
|
+
client = Client.load(client_id.to_s,
|
|
41
|
+
params[:source_name] ? {:source_name => params[:source_name]} : {:source_name => '*'})
|
|
42
|
+
if client and current_user and client.user_id != current_user.login
|
|
43
|
+
client.switch_user(current_user.login)
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
client
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
50
|
+
end
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
require 'rhoconnect/middleware/helpers'
|
|
2
|
+
|
|
3
|
+
module Rhoconnect
|
|
4
|
+
module Condition
|
|
5
|
+
module LoginRequired
|
|
6
|
+
def self.extended(base)
|
|
7
|
+
base.include_login_required_condition
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def include_login_required_condition
|
|
11
|
+
set(:login_required) do |value|
|
|
12
|
+
#puts "lgin kls is #{self.to_s}"
|
|
13
|
+
condition do
|
|
14
|
+
if value
|
|
15
|
+
throw :halt, [401, {'Content-Type' => 'text/plain'}, "Not authenticated"] if @env[Rhoconnect::CURRENT_USER].nil?
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
20
|
+
end
|
|
21
|
+
end
|
|
22
|
+
end
|
|
@@ -0,0 +1,49 @@
|
|
|
1
|
+
require 'rhoconnect/middleware/helpers'
|
|
2
|
+
|
|
3
|
+
module Rhoconnect
|
|
4
|
+
module Condition
|
|
5
|
+
module SourceRequired
|
|
6
|
+
def self.extended(base)
|
|
7
|
+
base.include_source_required_condition
|
|
8
|
+
end
|
|
9
|
+
|
|
10
|
+
def include_source_required_condition
|
|
11
|
+
set(:source_required) do |value|
|
|
12
|
+
condition do
|
|
13
|
+
if value
|
|
14
|
+
catch_all do
|
|
15
|
+
source = nil
|
|
16
|
+
user = current_user
|
|
17
|
+
# TODO - this should be removed when old routes are removed
|
|
18
|
+
if params["cud"]
|
|
19
|
+
cud_source_name = JSON.parse(params["cud"])["source_name"]
|
|
20
|
+
params.merge!({:source_name => cud_source_name}) if cud_source_name
|
|
21
|
+
end
|
|
22
|
+
# resource name is the source
|
|
23
|
+
if params[:source_name] and user
|
|
24
|
+
source = Source.load(params[:source_name],
|
|
25
|
+
{:user_id => user.login,:app_id => APP_NAME})
|
|
26
|
+
|
|
27
|
+
# if source does not exist create one for dynamic adapter
|
|
28
|
+
unless source
|
|
29
|
+
sconfig = Rhoconnect.source_config(params[:source_name])
|
|
30
|
+
source = Source.create(sconfig.merge!({:name => params[:source_name]}),{:user_id => user.login, :app_id => APP_NAME})
|
|
31
|
+
current_app.sources << source.name
|
|
32
|
+
end
|
|
33
|
+
else
|
|
34
|
+
Rhoconnect.log "ERROR: Can't load source, no source_name provided.\n"
|
|
35
|
+
raise ArgumentError.new(UNKNOWN_SOURCE)
|
|
36
|
+
end
|
|
37
|
+
#puts "loaded source: #{source.inspect}"
|
|
38
|
+
env[CURRENT_SOURCE] = source
|
|
39
|
+
# by default - all routes should have an access to the model
|
|
40
|
+
# if the route require source
|
|
41
|
+
@model = Rhoconnect::Model::Base.create(source)
|
|
42
|
+
end
|
|
43
|
+
end
|
|
44
|
+
end
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
end
|
|
48
|
+
end
|
|
49
|
+
end
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
module Rhoconnect
|
|
2
|
+
module Condition
|
|
3
|
+
module Verbs
|
|
4
|
+
def self.extended(base)
|
|
5
|
+
base.include_verbs_condition
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def include_verbs_condition
|
|
9
|
+
set(:verbs) do |*verbs|
|
|
10
|
+
condition do
|
|
11
|
+
verbs.any?{|v| v == request.request_method }
|
|
12
|
+
end
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
module Rhoconnect
|
|
2
|
+
module Condition
|
|
3
|
+
module VerifySuccess
|
|
4
|
+
def self.extended(base)
|
|
5
|
+
base.include_verify_success_condition
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def include_verify_success_condition
|
|
9
|
+
set(:verify_success) do |value|
|
|
10
|
+
condition do
|
|
11
|
+
if value
|
|
12
|
+
success?
|
|
13
|
+
end
|
|
14
|
+
end
|
|
15
|
+
end
|
|
16
|
+
end
|
|
17
|
+
end
|
|
18
|
+
end
|
|
19
|
+
end
|
|
@@ -0,0 +1,74 @@
|
|
|
1
|
+
module Rhoconnect
|
|
2
|
+
module Controller
|
|
3
|
+
class AppBase < Rhoconnect::Controller::Base
|
|
4
|
+
set_default :admin_required, false
|
|
5
|
+
set_default :login_required, false
|
|
6
|
+
set_default :source_required, false
|
|
7
|
+
set_default :client_required, false
|
|
8
|
+
|
|
9
|
+
def self.inherited(subclass)
|
|
10
|
+
subclass.set_default :admin_required, false
|
|
11
|
+
subclass.set_default :login_required, false
|
|
12
|
+
subclass.set_default :source_required, false
|
|
13
|
+
subclass.set_default :client_required, false
|
|
14
|
+
super
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
register Rhoconnect::Handler::Search
|
|
18
|
+
register Rhoconnect::Handler::BulkData
|
|
19
|
+
|
|
20
|
+
# main app controller
|
|
21
|
+
def self._rest_name
|
|
22
|
+
"app"
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
private
|
|
26
|
+
def self._prefix
|
|
27
|
+
"rc/#{Rhoconnect::API_VERSION}"
|
|
28
|
+
end
|
|
29
|
+
end
|
|
30
|
+
end
|
|
31
|
+
|
|
32
|
+
# aliasing Rhoconnect::Base class name to provide backward compatibility
|
|
33
|
+
# TODO: deprecate this class along with application.rb support
|
|
34
|
+
# and remove in 4.1
|
|
35
|
+
class Base < Rhoconnect::Controller::AppBase
|
|
36
|
+
def self.initializer(path=nil)
|
|
37
|
+
require 'rhoconnect/application/init'
|
|
38
|
+
|
|
39
|
+
# post deprecation warning !!!
|
|
40
|
+
warning_for_deprecated_application = <<_MIGRATE_TO_NEW_RHOCONNECT
|
|
41
|
+
|
|
42
|
+
***** WARNING *****
|
|
43
|
+
RhoConnect has detected that you're using deprecated Application class.
|
|
44
|
+
|
|
45
|
+
Application class support will be removed in RhoConnect 4.1.
|
|
46
|
+
Please, migrate your Application class into ApplicationController.
|
|
47
|
+
|
|
48
|
+
For more details, see RhoConnect Migration guidelines at
|
|
49
|
+
docs.rhomobile.com
|
|
50
|
+
|
|
51
|
+
_MIGRATE_TO_NEW_RHOCONNECT
|
|
52
|
+
puts warning_for_deprecated_application
|
|
53
|
+
|
|
54
|
+
# !!! Add routes here - because otherwise they will be added in all apps
|
|
55
|
+
# even those that has new style Application class
|
|
56
|
+
self.register Rhoconnect::EndPoint
|
|
57
|
+
|
|
58
|
+
# Application login
|
|
59
|
+
post "/login", { :rc_handler => :authenticate, :deprecated_route => {:verb => :post, :url => ['/application/clientlogin', '/api/application/clientlogin']},
|
|
60
|
+
:client_required => false } do
|
|
61
|
+
Application.authenticate(params[:login], params[:password], session)
|
|
62
|
+
end
|
|
63
|
+
|
|
64
|
+
# Push service login
|
|
65
|
+
get "/rps_login", :rc_handler => :rps_authenticate, :client_required => false do
|
|
66
|
+
if Application.singleton_methods.map(&:to_sym).include?(:rps_authenticate)
|
|
67
|
+
Application.rps_authenticate(params[:login], params[:password])
|
|
68
|
+
else
|
|
69
|
+
false
|
|
70
|
+
end
|
|
71
|
+
end
|
|
72
|
+
end
|
|
73
|
+
end
|
|
74
|
+
end
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
module Rhoconnect
|
|
2
|
+
module Controller
|
|
3
|
+
class Base < Rhoconnect::Server
|
|
4
|
+
def self.rest_path
|
|
5
|
+
"/#{_prefix}/#{_rest_name}"
|
|
6
|
+
end
|
|
7
|
+
|
|
8
|
+
def self._rest_name
|
|
9
|
+
ret = self.name
|
|
10
|
+
# remove the namespace
|
|
11
|
+
stripped = ret.split("::").last
|
|
12
|
+
ret = stripped unless stripped.nil?
|
|
13
|
+
|
|
14
|
+
ret.gsub!(/Controller/){}
|
|
15
|
+
end
|
|
16
|
+
|
|
17
|
+
def self._prefix
|
|
18
|
+
"app/#{Rhoconnect::API_VERSION}"
|
|
19
|
+
end
|
|
20
|
+
|
|
21
|
+
def self.get(route, params = {}, &block)
|
|
22
|
+
_add_route(route, :get, params, &block)
|
|
23
|
+
end
|
|
24
|
+
|
|
25
|
+
def self.post(route, params = {}, &block)
|
|
26
|
+
_add_route(route, :post, params, &block)
|
|
27
|
+
end
|
|
28
|
+
|
|
29
|
+
def self.put(route, params = {}, &block)
|
|
30
|
+
_add_route(route, :put, params, &block)
|
|
31
|
+
end
|
|
32
|
+
|
|
33
|
+
def self.delete(route, params = {}, &block)
|
|
34
|
+
_add_route(route, :delete, params, &block)
|
|
35
|
+
end
|
|
36
|
+
|
|
37
|
+
private
|
|
38
|
+
def self._add_route(route, verb, params, &block)
|
|
39
|
+
resource_route = route
|
|
40
|
+
@default_settings ||= {}
|
|
41
|
+
@default_settings.each do |setting, value|
|
|
42
|
+
params[setting] = value unless params.has_key?(setting)
|
|
43
|
+
end
|
|
44
|
+
api4 "#{self.rest_path}", resource_route, verb, params, &block
|
|
45
|
+
end
|
|
46
|
+
end
|
|
47
|
+
|
|
48
|
+
# the only purpose of this class is to prepend
|
|
49
|
+
# rest route with /rc/version prefix
|
|
50
|
+
# as opposed to Application-specific resources
|
|
51
|
+
class APIBase < Rhoconnect::Controller::Base
|
|
52
|
+
def self._rest_name
|
|
53
|
+
ret = self.name
|
|
54
|
+
# remove the namespace
|
|
55
|
+
stripped = ret.split("::").last
|
|
56
|
+
ret = stripped unless stripped.nil?
|
|
57
|
+
|
|
58
|
+
ret.gsub!(/Controller/){}
|
|
59
|
+
ret.downcase
|
|
60
|
+
end
|
|
61
|
+
|
|
62
|
+
private
|
|
63
|
+
def self._prefix
|
|
64
|
+
"rc/#{Rhoconnect::API_VERSION}"
|
|
65
|
+
end
|
|
66
|
+
end
|
|
67
|
+
end
|
|
68
|
+
end
|