cxf 0.0.1

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 (79) hide show
  1. checksums.yaml +7 -0
  2. data/Gemfile +12 -0
  3. data/README.md +395 -0
  4. data/lib/client.rb +447 -0
  5. data/lib/contact/config/config.rb +4 -0
  6. data/lib/contact/content/content.rb +4 -0
  7. data/lib/contact/ecommerce/ecommerce.rb +4 -0
  8. data/lib/contact.rb +284 -0
  9. data/lib/cxf/controllers/admin_base_controller.rb +17 -0
  10. data/lib/cxf/controllers/base_api_controller.rb +28 -0
  11. data/lib/cxf/controllers/base_controller.rb +54 -0
  12. data/lib/cxf/controllers/concerns/cxf_clients.rb +104 -0
  13. data/lib/cxf/controllers/concerns/read_config_file.rb +30 -0
  14. data/lib/cxf/controllers/contact_api_controller.rb +17 -0
  15. data/lib/cxf/controllers/public_api_controller.rb +14 -0
  16. data/lib/cxf/controllers/user_api_controller.rb +16 -0
  17. data/lib/cxf/helpers/contact_auth_helper.rb +86 -0
  18. data/lib/cxf/helpers/cxf_helper.rb +52 -0
  19. data/lib/cxf/helpers/proxy_controllers_methods.rb +144 -0
  20. data/lib/cxf/helpers/threads_helper.rb +109 -0
  21. data/lib/cxf/helpers/user_auth_helper.rb +74 -0
  22. data/lib/cxf.rb +15 -0
  23. data/lib/errors.rb +109 -0
  24. data/lib/generators/cxf_assets_controller.rb +7 -0
  25. data/lib/generators/cxf_config.yml.erb +27 -0
  26. data/lib/generators/cxf_contact_controller.rb +7 -0
  27. data/lib/generators/cxf_files_generator.rb +28 -0
  28. data/lib/generators/cxf_public_controller.rb +7 -0
  29. data/lib/generators/cxf_user_controller.rb +7 -0
  30. data/lib/pub/config/config.rb +6 -0
  31. data/lib/pub/content/assets.rb +16 -0
  32. data/lib/pub/content/content.rb +9 -0
  33. data/lib/pub/ecommerce/ecommerce.rb +6 -0
  34. data/lib/pub.rb +163 -0
  35. data/lib/user/config/attribute_groups.rb +79 -0
  36. data/lib/user/config/attributes.rb +88 -0
  37. data/lib/user/config/calendars.rb +91 -0
  38. data/lib/user/config/config.rb +23 -0
  39. data/lib/user/config/relationships.rb +141 -0
  40. data/lib/user/config/seeds.rb +55 -0
  41. data/lib/user/config/system_settings.rb +54 -0
  42. data/lib/user/config/tags.rb +61 -0
  43. data/lib/user/config/taxonomies.rb +120 -0
  44. data/lib/user/config/users.rb +77 -0
  45. data/lib/user/config/views.rb +68 -0
  46. data/lib/user/contacts/contacts.rb +22 -0
  47. data/lib/user/content/assets.rb +294 -0
  48. data/lib/user/content/block_templates.rb +72 -0
  49. data/lib/user/content/blocks.rb +109 -0
  50. data/lib/user/content/content.rb +174 -0
  51. data/lib/user/content/instances.rb +121 -0
  52. data/lib/user/content/print_versions.rb +129 -0
  53. data/lib/user/content/stories.rb +110 -0
  54. data/lib/user/content/story_templates.rb +97 -0
  55. data/lib/user/content/templates.rb +72 -0
  56. data/lib/user/crm/companies.rb +111 -0
  57. data/lib/user/crm/contacts.rb +294 -0
  58. data/lib/user/crm/crm.rb +9 -0
  59. data/lib/user/ecommerce/ecommerce.rb +29 -0
  60. data/lib/user/ecommerce/item_prices.rb +89 -0
  61. data/lib/user/ecommerce/locations.rb +171 -0
  62. data/lib/user/ecommerce/price_lists.rb +75 -0
  63. data/lib/user/ecommerce/product_templates.rb +106 -0
  64. data/lib/user/ecommerce/product_variations.rb +133 -0
  65. data/lib/user/ecommerce/product_versions.rb +107 -0
  66. data/lib/user/ecommerce/products.rb +156 -0
  67. data/lib/user/ecommerce/skus.rb +90 -0
  68. data/lib/user/ecommerce/taxes.rb +84 -0
  69. data/lib/user/ecommerce/variant_options.rb +71 -0
  70. data/lib/user/ecommerce/variant_values.rb +74 -0
  71. data/lib/user/ecommerce/vouchers.rb +90 -0
  72. data/lib/user/helpers/helpers.rb +116 -0
  73. data/lib/user/helpers/object_activities.rb +85 -0
  74. data/lib/user/helpers/object_folders.rb +84 -0
  75. data/lib/user/helpers/user_folders.rb +85 -0
  76. data/lib/user/marketing/marketing.rb +123 -0
  77. data/lib/user/profile/profile.rb +104 -0
  78. data/lib/user.rb +98 -0
  79. metadata +227 -0
checksums.yaml ADDED
@@ -0,0 +1,7 @@
1
+ ---
2
+ SHA256:
3
+ metadata.gz: 70de20a783868a1123abc60270bc196593592593e7fa8c64df844190b80b534a
4
+ data.tar.gz: b7d630be4143207435a458704e07225a38d655c9ad69a5dcd1e645591c54b70e
5
+ SHA512:
6
+ metadata.gz: ac3d86ac3f771fe039a11d8b2e16665c00d018918014acec644c91f3dc24b5368270392ab45d09e588212b49527b59b1b5610fe4f3ded7036016ac7a7b485b04
7
+ data.tar.gz: 681adb1f34a99cbee2c3bbef1bef98ce1bc6354afea6b9318a188faa4157b2d681993dce63f201cb242470923bcae315df18737168caa5753a06b6908f845ed0
data/Gemfile ADDED
@@ -0,0 +1,12 @@
1
+ source :rubygems
2
+
3
+ gem 'json'
4
+ gem 'httparty'
5
+ gem 'addressable'
6
+ gem 'rails-reverse-proxy', '~> 0.9.1'
7
+ gem 'redis'
8
+ gem 'mongo', "~> 2"
9
+ gem 'concurrent-ruby', require: 'concurrent'
10
+ gem 'rubocop', require: false
11
+ gem 'rack', '~> 2.2.0'
12
+ gem 'rack-test', '~> 1.1.0'
data/README.md ADDED
@@ -0,0 +1,395 @@
1
+ # Cxf Ruby SDK
2
+
3
+ This is a library to connect apps built on ruby to Cxf.Cloud
4
+
5
+ ## Installation
6
+
7
+ Add gem to the Gemfile
8
+
9
+ ```bash
10
+ gem 'cxf'
11
+ ```
12
+
13
+ ## Configure
14
+
15
+ Add the following configuration to the controller and include MintClients and UserAuthHelper (if you log in with a contact, you can use ContactAuthHelper)
16
+ NOTE: Proxy automatically renew the token, so you don't need to worry about it
17
+
18
+ if you haven't run the generator yet, you can use after_action to update the token
19
+
20
+ ```ruby
21
+ require 'cxf'
22
+
23
+ class ApplicationController < ActionController::Base
24
+ include CxfClients
25
+ include UserAuthHelper # if you log in with a user
26
+ include ContactAuthHelper # if you log in with a contact
27
+
28
+ after_action :update_user_tokens # if you haven't run the generator yet and you log in with a user
29
+ after_action :update_contact_tokens # if you haven't run the generator yet and you log in with a contact
30
+ end
31
+ ```
32
+
33
+ ## Usage
34
+
35
+ Using Cxf Public API
36
+
37
+ ```ruby
38
+ cxf_pub = Cxf::Pub.new(cxf_url, api_key)
39
+ cxf_pub.get_stories
40
+ ```
41
+
42
+ Using Cxf Contact API
43
+
44
+ ```ruby
45
+ cxf_contact_login(email, password)
46
+ @cxf_contact.me
47
+ ```
48
+
49
+ Using Cxf User API
50
+
51
+ ```ruby
52
+ cxf_user_login(email, password)
53
+ @cxf_user.get_contacts
54
+ ```
55
+
56
+ Using Cxf User API by Service account
57
+
58
+ ```ruby
59
+ # Usually the api_key and the session token are the same, you can go to the service accounts section
60
+ # from your Cxf instance and generate your service account api key
61
+ cxf_service_account = Cxf::User.new(cxf_url, api_key, api_key)
62
+ cxf_service_account.get_contacts
63
+ ```
64
+
65
+ ## Generate cxf files
66
+
67
+ This command will generate the cxf_config.yml.erb file, API controlles and routes to have available the cxf
68
+ endpoints
69
+
70
+ ```bash
71
+ rails generate cxf_files
72
+ ```
73
+
74
+ ## Contact tracking usage
75
+
76
+ Your app controller needs to be inherited from Cxf::BaseController
77
+
78
+ ```ruby
79
+ # application_controller.rb
80
+
81
+ class ApplicationController < Cxf::BaseController
82
+ end
83
+ ```
84
+
85
+ This heritance will make the following class variables available:
86
+
87
+ | Variable | Description |
88
+ |----------------|:------------------------------------------------------------------------------------:|
89
+ | @host | Host defined in cxf_config.yml.erb file |
90
+ | @api_key | API key defined in cxf_config.yml.erb file |
91
+ | @cxf_pub | An already instanced public client |
92
+ | @contact_token | A token used by cxf to identify the contact |
93
+ | @visit_id | An identifier of the visit registered |
94
+ | @cxf_contact | An already instanced contact client (not usable until call the contact login method) |
95
+
96
+ And the following controller methods:
97
+
98
+ | Method | Parameters | Return value | Description |
99
+ |------------------------------|:-----------------------:|:------------:|:--------------------------------------------------------------:|
100
+ | cxf_contact_signed_in? | none | boolean | Indicates if the contact has an active session |
101
+ | cxf_contact_login | email, password | void | Starts a contact session |
102
+ | cxf_contact_logout | none | void | Ends a contact session |
103
+ | cxf_contact_magic_link_login | hash, redirect_in_error | void | Starts a contact session in cxf.cloud and set a session cookie |
104
+
105
+ ## Admin controller usage
106
+
107
+ If want to have a private section where only a cxf user can acces and use the private user api is needed to inherit
108
+ from the AdminBaseController.
109
+
110
+ ```ruby
111
+ # admin_controller.rb
112
+
113
+ class AdminController < Cxf::AdminBaseController
114
+ end
115
+ ```
116
+
117
+ This heritance will make the following class variables available:
118
+
119
+ | Variable | Description |
120
+ |----------------------|:-------------------------------------------------------------------------------:|
121
+ | @host | Host defined in cxf_config.yml.erb file |
122
+ | @api_key | API key defined in cxf_config.yml.erb file |
123
+ | @cxf_user | An already instanced user client (not usable until call the user login method) |
124
+ | @cxf_service_account | An already instanced service_account client |
125
+
126
+ And the following controller methods:
127
+
128
+ | Method | Parameters | Return value | Description |
129
+ |---------------------------|:---------------:|:------------:|:-----------------------------------------------------------:|
130
+ | cxf_user_login | email, password | void | Starts a user session |
131
+ | cxf_user_logout | none | void | Ends a user session |
132
+ | cxf_user_signed_in? | none | Boolean | Indicates if the user has an active session |
133
+ | cxf_user_magic_link_login | hash | void | Starts a user session in cxf.cloud and set a session cookie |
134
+
135
+ ## Cxf config file
136
+
137
+ The cxf.config.yml file allows to set the Cxf instance to which the implementation will access, it can add the host,
138
+ api key for Cxf, in addition to setting the cache rules with redis, if you want to add a url to cache , you should add
139
+ it to the groups array and set the cache time.
140
+
141
+ ```yaml
142
+ # Cxf connection configuration
143
+ cxf:
144
+ host: http://your_host_goes_here.com
145
+ api_key: your_cxf_api_key_goes_here
146
+ cxf_slug: slug_id #save id and token in redis
147
+ redis_cache:
148
+ use_cache: boolean_value_to_enable_and_disable_cache
149
+ redis_host: your_redis_server_host
150
+ redis_port: your_redis_server_port
151
+ redis_db: your_redis_database
152
+ groups:
153
+ - urls:
154
+ - group_of_urls
155
+ time: time_that_will_be_applied_to_urls_in_seconds
156
+ sdk:
157
+ debug: false
158
+ # Timeout is specified in seconds
159
+ default_http_timeout: 30 # Allows setting a default timeout for all HTTP calls.
160
+ get_http_timeout: 30 # Allows setting a default timeout for all GET calls.
161
+ post_http_timeout: 30 # Allows setting a default timeout for all POST calls.
162
+ put_http_timeout: 30 # Allows setting a default timeout for all PUT calls.
163
+ delete_http_timeout: 30 # Allows setting a default timeout for all DELETE calls.
164
+ ```
165
+
166
+ To enable sdk debugging you can change the variable debug.
167
+ Finally, to configure the sharing of cookies between domains, you can configure the "iframe cookies", where you
168
+ establish how long the cookie will have, if it is activated and the domains to share cookies (to have this
169
+ functionality, we recommend the use of the template).
170
+
171
+ ```yaml
172
+ # Cxf connection configuration
173
+ sdk:
174
+ debug: false
175
+ cookies_iframe:
176
+ activated: boolean_value_to_enable_and_disable_cookies_iframe
177
+ expire_time: expire_time_of_cookies_iframe_in_hours
178
+ hosts:
179
+ - array_of_host_to_send_cookies
180
+ ```
181
+
182
+ ## Override default clients
183
+
184
+ If you want other clients for admin/base controller, you need to specify them with the "define_cxf_clients" method
185
+
186
+ Example:
187
+
188
+ ```ruby
189
+ # admin_controller.rb
190
+
191
+ class AdminController < Cxf::AdminBaseController
192
+ def define_cxf_clients
193
+ %w[contact user pub service_account]
194
+ end
195
+ end
196
+ ```
197
+
198
+ ## Override default timeouts
199
+
200
+ If you want specific timeouts per instance, you can define cxf_sdk_timeouts_config
201
+
202
+ Example:
203
+
204
+ ```ruby
205
+ # admin_controller.rb
206
+
207
+ class AdminController < Cxf::AdminBaseController
208
+ def cxf_sdk_timeouts_config
209
+ {
210
+ default: 30,
211
+ get: 50,
212
+ post: 40,
213
+ put: 30,
214
+ delete: 10
215
+ }
216
+ end
217
+ end
218
+ ```
219
+
220
+ ## Error catching
221
+
222
+ The SDK provides different errors that are identified according to the response provided by Cxf,
223
+ the errors can be 404, 401, 422, 500, etc.
224
+ To rescue these errors, it is done as follows:
225
+
226
+ ```ruby
227
+
228
+ # Example 1
229
+ begin
230
+ @cxf_pub.client.raw('/invalid-url')
231
+ rescue => Cxf::Errors::ResourceNotFoundException
232
+ puts "Error 404"
233
+ end
234
+
235
+ # Example 2
236
+
237
+ begin
238
+ response = @cxf_contact.register(data)
239
+ rescue Cxf::Errors::ValidationException => e
240
+ response = e.to_h
241
+ # This will return a Hash with the information needed to debug
242
+ # Example:
243
+ {
244
+ :client => sdk_instance,
245
+ # Client instance
246
+ # @host = "https://your_cxf_instance",
247
+ # @api_key = current_api_key,
248
+ # @session_token = current_session_token,
249
+ # @contact_token_id = current_contact_token_id,
250
+ # @visit_id = current_visit_id,
251
+ # @debug = current_debug_flag,
252
+ # @scope = current_scope,
253
+ # @base_url = current_base_url
254
+ :title => "Request failed with status 422",
255
+ :detail => "Unprocessable Entity",
256
+ :http_status => 422,
257
+ :response => { "email" => ["The email has already been taken."] },
258
+ :errors => ["The email has already been taken."]
259
+ }
260
+ end
261
+
262
+ ```
263
+
264
+ The current errors are:
265
+
266
+ | Error | Status | Full error name |
267
+ |---------------------------|:------:|:-----------------------------------------:|
268
+ | AccessDeniedException | 401 | Cxf::Errors::AccessDeniedException |
269
+ | ResourceNotFoundException | 404 | Cxf::Errors::ResourceNotFoundException |
270
+ | MethodNotAllowedException | 405 | Cxf::Errors::MethodNotAllowedException |
271
+ | ValidationException | 422 | Cxf::Errors::ValidationException |
272
+ | InternalServerException | 500 | Cxf::Errors::InternalServerException |
273
+
274
+ <details>
275
+ <summary> Cxf::Pub </summary>
276
+
277
+ - Cxf::Pub::Config
278
+ - [Cxf::Pub::Config::Attributes](doc/pub/config/attributes.md)
279
+ - [Cxf::Pub::Config::PublicFolders](doc/pub/config/public_folders.md)
280
+ - [Cxf::Pub::Config::Tags](doc/pub/config/tags.md)
281
+ - [Cxf::Pub::Config::Taxonomies](doc/pub/config/taxonomies.md)
282
+
283
+
284
+ - Cxf::Pub::Content
285
+ - [Cxf::Pub::Content::Assets](doc/pub/content/assets.md)
286
+ - [Cxf::Pub::Content::ContentBundles](doc/pub/content/content_bundles.md)
287
+ - [Cxf::Pub::Content::ContentInstanceVersions](doc/pub/content/content_instance_versions.md)
288
+ - [Cxf::Pub::Content::ContentInstances](doc/pub/content/content_instances.md)
289
+ - [Cxf::Pub::Content::Forms](doc/pub/content/forms.md)
290
+ - [Cxf::Pub::Content::Stories](doc/pub/content/stories.md)
291
+ - [Cxf::Pub::Content::StoryVersions](doc/pub/content/story_versions.md)
292
+
293
+ - Cxf::Pub::Ecommerce
294
+ - [Cxf::Pub::Ecommerce::Locations](doc/pub/ecommerce/locations.md)
295
+ - [Cxf::Pub::Ecommerce::Orders](doc/pub/ecommerce/orders.md)
296
+
297
+ </details>
298
+
299
+ <details>
300
+ <summary> Cxf::Contact </summary>
301
+
302
+ - Cxf::Contact::Config
303
+ - [Cxf::Contact::Config::Appointments](doc/contact/config/appointments.md)
304
+
305
+
306
+ - Cxf::Contact::Content
307
+ - [Cxf::Contact::Content::Conversations](doc/contact/content/conversations.md)
308
+
309
+ - Cxf::Contact::Ecommerce
310
+ - [Cxf::Contact::Ecommerce::OrderItemGroups](doc/contact/ecommerce/order_item_groups.md)
311
+ - [Cxf::Contact::Ecommerce::OrderItems](doc/contact/ecommerce/order_items.md)
312
+ - [Cxf::Contact::Ecommerce::Orders](doc/contact/ecommerce/orders.md)
313
+ - [Cxf::Contact::Ecommerce::Vouchers](doc/contact/ecommerce/vouchers.md)
314
+
315
+ </details>
316
+
317
+ <details>
318
+ <summary> Cxf::User </summary>
319
+
320
+ - Cxf::User::Config
321
+ - [Cxf::User::Config::ApiKey](doc/user/config/api_key.md)
322
+ - [Cxf::User::Config::Appointments](doc/user/config/appointments.md)
323
+ - [Cxf::User::Config::AttributeGroups](doc/user/config/attribute_groups.md)
324
+ - [Cxf::User::Config::Attributes](doc/user/config/attributes.md)
325
+ - [Cxf::User::Config::Calendar](doc/user/config/calendar.md)
326
+ - [Cxf::User::Config::PublicFolder](doc/user/config/public_folders.md)
327
+ - [Cxf::User::Config::Relationships](doc/user/config/relationships.md)
328
+ - [Cxf::User::Config::Roles](doc/user/config/roles.md)
329
+ - [Cxf::User::Config::Seeds](doc/user/config/seeds.md)
330
+ - [Cxf::User::Config::SystemSettings](doc/user/config/system_settings.md)
331
+ - [Cxf::User::Config::Tags](doc/user/config/tags.md)
332
+ - [Cxf::User::Config::Taxonomies](doc/user/config/taxonomies.md)
333
+ - [Cxf::User::Config::Teams](doc/user/config/teams.md)
334
+ - [Cxf::User::Config::Users](doc/user/config/users.md)
335
+
336
+ - [Cxf::User::Contacts](doc/user/contacts/contacts.md)
337
+
338
+ - [Cxf::User::Content](doc/user/content/content.md)
339
+ - [Cxf::User::Content::Assets](doc/user/content/assets.md)
340
+ - [Cxf::User::Content::ContentInstances](doc/user/content/content_instances.md)
341
+ - [Cxf::User::Content::ContentTemplates](doc/user/content/content_templates.md)
342
+ - [Cxf::User::Content::Conversations](doc/user/content/conversations.md)
343
+ - [Cxf::User::Content::Dam](doc/user/content/dam.md)
344
+ - [Cxf::User::Content::Forms](doc/user/content/forms.md)
345
+ - [Cxf::User::Content::MessageTemplates](doc/user/content/message_templates.md)
346
+ - [Cxf::User::Content::Messages](doc/user/content/messages.md)
347
+ - [Cxf::User::Content::Pages](doc/user/content/pages.md)
348
+ - [Cxf::User::Content::Stories](doc/user/content/stories.md)
349
+ - [Cxf::User::Content::StoryTemplates](doc/user/content/story_templates.md)
350
+ - [Cxf::User::Content::StoryVersions](doc/user/content/story_versions.md)
351
+
352
+ - Cxf::User::Crm
353
+ - [Cxf::User::Crm::Companies](doc/user/crm/companies.md)
354
+ - [Cxf::User::Crm::Contacts](doc/user/crm/contacts.md)
355
+ - [Cxf::User::Crm::Deals](doc/user/crm/deals.md)
356
+ - [Cxf::User::Crm::Favorites](doc/user/crm/favorites.md)
357
+ - [Cxf::User::Crm::Segments](doc/user/crm/segments.md)
358
+ - [Cxf::User::Crm::Users](doc/user/crm/users.md)
359
+ - [Cxf::User::Crm::WorkflowStepObjects](doc/user/crm/workflow_step_objects.md)
360
+ - [Cxf::User::Crm::WorkflowSteps](doc/user/crm/workflow_steps.md)
361
+ - [Cxf::User::Crm::Workflows](doc/user/crm/workflows.md)
362
+
363
+ - Cxf::User::Ecommerce
364
+ - [Cxf::User::Ecommerce::ItemPrices](doc/user/ecommerce/item_prices.md)
365
+ - [Cxf::User::Ecommerce::Locations](doc/user/ecommerce/locations.md)
366
+ - [Cxf::User::Ecommerce::OrderItemGroups](doc/user/ecommerce/order_item_groups.md)
367
+ - [Cxf::User::Ecommerce::OrderStatuses](doc/user/ecommerce/order_statuses.md)
368
+
369
+ - [Cxf::User::Ecommerce::Orders](doc/user/ecommerce/orders.md)
370
+ - [Cxf::User::Ecommerce::PriceList](doc/user/ecommerce/price_list.md)
371
+ - [Cxf::User::Ecommerce::ProductTemplates](doc/user/ecommerce/product_templates.md)
372
+ - [Cxf::User::Ecommerce::ProductVariations](doc/user/ecommerce/product_variations.md)
373
+ - [Cxf::User::Ecommerce::Products](doc/user/ecommerce/products.md)
374
+ - [Cxf::User::Ecommerce::Skus](doc/user/ecommerce/skus.md)
375
+ - [Cxf::User::Ecommerce::Taxes](doc/user/ecommerce/taxes.md)
376
+ - [Cxf::User::Ecommerce::VariantOptions](doc/user/ecommerce/variant_options.md)
377
+ - [Cxf::User::Ecommerce::VariantValues](doc/user/ecommerce/variant_values.md)
378
+ - [Cxf::User::Ecommerce::Vouchers](doc/user/ecommerce/vouchers.md)
379
+
380
+ - [Cxf::User::Helpers](doc/user/helpers/helpers.md)
381
+ - [Cxf::User::Helpers::ObjectActivities](doc/user/helpers/object_activities.md)
382
+ - [Cxf::User::Helpers::ObjectFolders](doc/user/helpers/object_folders.md)
383
+ - [Cxf::User::Helpers::UserFolders](doc/user/helpers/user_folders.md)
384
+
385
+ - [Cxf::User::Marketing](doc/user/marketing/marketing.md)
386
+
387
+ - [Cxf::User::Profile](doc/user/profile/profile.md)
388
+
389
+ </details>
390
+
391
+ <details>
392
+ <summary> Cxf::Threads </summary>
393
+
394
+ - [Cxf::MakeMultipleRequest](doc/threads/make_multiple_request.md)
395
+ </details>